From 982e1821f9d908f74b9dffcecae7dbfcff252774 Mon Sep 17 00:00:00 2001 From: sherwinski Date: Mon, 12 Oct 2026 15:51:36 -0700 Subject: [PATCH 1/4] docs: promote email and SMS in the Codex listing prompts Change the second banner prompt to an email example. Add email and SMS examples to the "Try prompts like" list, and order the list as email, SMS, then push. Many users do not know that OneSignal supports email and SMS, and the listing copy now shows all 3 channels. --- .codex-plugin/plugin.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index ab1766f..9621ea3 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -21,7 +21,7 @@ "interface": { "displayName": "OneSignal", "shortDescription": "Set up and send push notifications", - "longDescription": "OneSignal is the market leading customer engagement solution for push notifications, email, SMS, in-app messaging, and Live Activities. This plugin brings OneSignal onboarding into Codex: point it at your codebase and it installs the SDK, sets up your push credentials, and verifies that a real notification reaches your device.\n\nOnce installed, describe what you want in plain language or invoke the plugin directly with @OneSignal.\n\nTry prompts like:\n@OneSignal set up push notifications in this app.\n@OneSignal upload my APNs .p8 key and Firebase service account to OneSignal.\n@OneSignal why isn't my push notification arriving on Android?\n@OneSignal send a test push to my device and confirm delivery.\n\nRequirements: A free OneSignal account. A device, simulator, or browser that can receive push notifications.", + "longDescription": "OneSignal is the market leading customer engagement solution for push notifications, email, SMS, in-app messaging, and Live Activities. This plugin brings OneSignal onboarding into Codex: point it at your codebase and it installs the SDK, sets up your push credentials, and verifies that a real notification reaches your device.\n\nOnce installed, describe what you want in plain language or invoke the plugin directly with @OneSignal.\n\nTry prompts like:\n@OneSignal send an email to promote our new product announcement.\n@OneSignal create an email template for our weekly newsletter.\n@OneSignal send an SMS to remind customers about their abandoned cart.\n@OneSignal text a discount code to my subscribers for this weekend's sale.\n@OneSignal set up push notifications in this app.\n@OneSignal upload my APNs .p8 key and Firebase service account to OneSignal.\n@OneSignal why isn't my push notification arriving on Android?\n@OneSignal send a test push to my device and confirm delivery.\n\nRequirements: A free OneSignal account. A device, simulator, or browser that can receive push notifications.", "developerName": "OneSignal", "category": "Developer Tools", "capabilities": [ @@ -33,7 +33,7 @@ "termsOfServiceURL": "https://onesignal.com/tos", "defaultPrompt": [ "Set up OneSignal in this app.", - "Upload my APNs and FCM credentials to OneSignal.", + "Send an email to promote our new product announcement.", "Send a test push to my device and confirm delivery." ], "brandColor": "#051B2C", From a5a29891468eee8f4847a1822564e568c2b02e5f Mon Sep 17 00:00:00 2001 From: sherwinski Date: Mon, 12 Oct 2026 16:08:44 -0700 Subject: [PATCH 2/4] docs: shorten the email banner prompt so it fits on one line --- .codex-plugin/plugin.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 9621ea3..859a4ed 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -21,7 +21,7 @@ "interface": { "displayName": "OneSignal", "shortDescription": "Set up and send push notifications", - "longDescription": "OneSignal is the market leading customer engagement solution for push notifications, email, SMS, in-app messaging, and Live Activities. This plugin brings OneSignal onboarding into Codex: point it at your codebase and it installs the SDK, sets up your push credentials, and verifies that a real notification reaches your device.\n\nOnce installed, describe what you want in plain language or invoke the plugin directly with @OneSignal.\n\nTry prompts like:\n@OneSignal send an email to promote our new product announcement.\n@OneSignal create an email template for our weekly newsletter.\n@OneSignal send an SMS to remind customers about their abandoned cart.\n@OneSignal text a discount code to my subscribers for this weekend's sale.\n@OneSignal set up push notifications in this app.\n@OneSignal upload my APNs .p8 key and Firebase service account to OneSignal.\n@OneSignal why isn't my push notification arriving on Android?\n@OneSignal send a test push to my device and confirm delivery.\n\nRequirements: A free OneSignal account. A device, simulator, or browser that can receive push notifications.", + "longDescription": "OneSignal is the market leading customer engagement solution for email, push notifications, SMS, in-app messaging, and Live Activities. This plugin brings OneSignal onboarding into Codex: point it at your codebase and it installs the SDK, sets up your push credentials, and verifies that a real notification reaches your device.\n\nOnce installed, describe what you want in plain language or invoke the plugin directly with @OneSignal.\n\nTry prompts like:\n@OneSignal send an email to promote our new product announcement.\n@OneSignal create an email template for our weekly newsletter.\n@OneSignal send an SMS to remind customers about their abandoned cart.\n@OneSignal text a discount code to my subscribers for this weekend's sale.\n@OneSignal set up push notifications in this app.\n@OneSignal upload my APNs .p8 key and Firebase service account to OneSignal.\n@OneSignal why isn't my push notification arriving on Android?\n@OneSignal send a test push to my device and confirm delivery.\n\nRequirements: A free OneSignal account. A device, simulator, or browser that can receive push notifications.", "developerName": "OneSignal", "category": "Developer Tools", "capabilities": [ @@ -33,7 +33,7 @@ "termsOfServiceURL": "https://onesignal.com/tos", "defaultPrompt": [ "Set up OneSignal in this app.", - "Send an email to promote our new product announcement.", + "Send an email to promote our new product.", "Send a test push to my device and confirm delivery." ], "brandColor": "#051B2C", From b179c70599031245f7ed94c677a3e17fa0aef96d Mon Sep 17 00:00:00 2001 From: sherwinski Date: Mon, 12 Oct 2026 16:17:21 -0700 Subject: [PATCH 3/4] fix: use a currentColor SVG for the Codex composer icon The Codex manifest has no dark variant of composerIcon, so Codex ignored composerIconDark and showed the dark logomark on dark cards. The composer icon now points to logomark-mono.svg, which fills with currentColor and follows the text color of the theme. Drop the unsupported field from the manifest and from the packager's optional asset list. --- .codex-plugin/plugin.json | 3 +-- AGENT.md | 6 +++--- assets/logomark-mono.svg | 3 +++ scripts/package_directory_bundle.py | 6 ++++-- 4 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 assets/logomark-mono.svg diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 859a4ed..3cdc3cc 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -38,8 +38,7 @@ ], "brandColor": "#051B2C", "brandColorDark": "#4E50D1", - "composerIcon": "./assets/logomark.png", - "composerIconDark": "./assets/logomark-white.svg", + "composerIcon": "./assets/logomark-mono.svg", "logo": "./assets/logomark.png", "logoDark": "./assets/logomark-white.svg" } diff --git a/AGENT.md b/AGENT.md index 469ea2d..43b1da6 100644 --- a/AGENT.md +++ b/AGENT.md @@ -28,7 +28,7 @@ repository. | `.claude-plugin/plugin.json` | Plugin manifest. The `version` field controls when Claude Code pulls updates. | | `.claude-plugin/marketplace.json` | Marketplace catalog. This repository is its own marketplace, named `onesignal`. | | `.codex-plugin/plugin.json` | Codex manifest. The `name` is the skill namespace in Codex (`onesignal:setup`). The `interface` block holds the listing copy, legal URLs, and brand assets. The directory bundle ships a copy without `mcpServers`. | -| `assets/` | Brand assets for the listings. The files come from the official OneSignal media kit. | +| `assets/` | Brand assets for the listings. The files come from the official OneSignal media kit. `logomark-mono.svg` is the media-kit logomark with `fill="currentColor"`, so the composer icon follows the text color of the theme. The Codex manifest has no dark variant of `composerIcon`. | | `.mcp.json` | Declares the hosted OneSignal MCP endpoint. | | `endpoint.conf` | The checkpoint ingestion endpoint. The comment block in the file explains the path. | @@ -136,8 +136,8 @@ builds that artifact from this tree at release time: - It writes `.codex-plugin/plugin.json` from the repository manifest without `mcpServers`, because a Skills-only upload rejects MCP configuration (the listing's MCP server is attached - in the portal). It copies `assets/` so `interface.logo`, `interface.composerIcon`, and - their `Dark` variants resolve. The gate rejects `interface.screenshots`, which a + in the portal). It copies `assets/` so `interface.logo`, `interface.logoDark`, and + `interface.composerIcon` resolve. The gate rejects `interface.screenshots`, which a Skills-only upload refuses. - It copies each skill folder under `skills/` (`skills/setup/`, `skills/credentials/`, `skills/verify/`), and gives each one its own `references/`, `endpoint.conf`, and the diff --git a/assets/logomark-mono.svg b/assets/logomark-mono.svg new file mode 100644 index 0000000..d974893 --- /dev/null +++ b/assets/logomark-mono.svg @@ -0,0 +1,3 @@ + + + diff --git a/scripts/package_directory_bundle.py b/scripts/package_directory_bundle.py index 792ca77..77f03ff 100755 --- a/scripts/package_directory_bundle.py +++ b/scripts/package_directory_bundle.py @@ -80,8 +80,10 @@ # single hyphens are what the submission rules accept. PLUGIN_NAME_RE = re.compile(r"^[a-z0-9]+(?:-[a-z0-9]+)*$") BRAND_ASSET_FIELDS = ("logo", "composerIcon") -# Dark-theme variants. The directory falls back to the light file when one is absent. -OPTIONAL_BRAND_ASSET_FIELDS = ("logoDark", "composerIconDark") +# Dark-theme variant of the logo. The directory falls back to the light file when it +# is absent. The manifest has no dark variant of composerIcon; that icon uses +# `currentColor` so it follows the text color of the theme. +OPTIONAL_BRAND_ASSET_FIELDS = ("logoDark",) # A Skills-only upload rejects this field (`screenshot_configuration_excluded`). EXCLUDED_INTERFACE_FIELDS = ("screenshots",) From b06f3f6b50a2adaab28ec087fb568de57054d354 Mon Sep 17 00:00:00 2001 From: sherwinski Date: Mon, 12 Oct 2026 16:28:22 -0700 Subject: [PATCH 4/4] fix: give the Codex composer icon its own background Codex shows composerIcon as an image with no container, so currentColor falls back to black and the icon stays dim on a dark card. The icon is now the logomark on a white disc, which matches the header logo and reads on both themes. --- .codex-plugin/plugin.json | 2 +- AGENT.md | 2 +- assets/{logomark-mono.svg => composer-icon.svg} | 5 ++++- scripts/package_directory_bundle.py | 4 ++-- 4 files changed, 8 insertions(+), 5 deletions(-) rename assets/{logomark-mono.svg => composer-icon.svg} (94%) diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 3cdc3cc..8e36535 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -38,7 +38,7 @@ ], "brandColor": "#051B2C", "brandColorDark": "#4E50D1", - "composerIcon": "./assets/logomark-mono.svg", + "composerIcon": "./assets/composer-icon.svg", "logo": "./assets/logomark.png", "logoDark": "./assets/logomark-white.svg" } diff --git a/AGENT.md b/AGENT.md index 43b1da6..c724604 100644 --- a/AGENT.md +++ b/AGENT.md @@ -28,7 +28,7 @@ repository. | `.claude-plugin/plugin.json` | Plugin manifest. The `version` field controls when Claude Code pulls updates. | | `.claude-plugin/marketplace.json` | Marketplace catalog. This repository is its own marketplace, named `onesignal`. | | `.codex-plugin/plugin.json` | Codex manifest. The `name` is the skill namespace in Codex (`onesignal:setup`). The `interface` block holds the listing copy, legal URLs, and brand assets. The directory bundle ships a copy without `mcpServers`. | -| `assets/` | Brand assets for the listings. The files come from the official OneSignal media kit. `logomark-mono.svg` is the media-kit logomark with `fill="currentColor"`, so the composer icon follows the text color of the theme. The Codex manifest has no dark variant of `composerIcon`. | +| `assets/` | Brand assets for the listings. The files come from the official OneSignal media kit. `composer-icon.svg` is the media-kit logomark on a white disc. The Codex manifest has no dark variant of `composerIcon`, and Codex shows that icon as an image with no container, so the icon needs its own background to read on a dark theme. | | `.mcp.json` | Declares the hosted OneSignal MCP endpoint. | | `endpoint.conf` | The checkpoint ingestion endpoint. The comment block in the file explains the path. | diff --git a/assets/logomark-mono.svg b/assets/composer-icon.svg similarity index 94% rename from assets/logomark-mono.svg rename to assets/composer-icon.svg index d974893..ff5a7e7 100644 --- a/assets/logomark-mono.svg +++ b/assets/composer-icon.svg @@ -1,3 +1,6 @@ - + + + + diff --git a/scripts/package_directory_bundle.py b/scripts/package_directory_bundle.py index 77f03ff..fcd2d3e 100755 --- a/scripts/package_directory_bundle.py +++ b/scripts/package_directory_bundle.py @@ -81,8 +81,8 @@ PLUGIN_NAME_RE = re.compile(r"^[a-z0-9]+(?:-[a-z0-9]+)*$") BRAND_ASSET_FIELDS = ("logo", "composerIcon") # Dark-theme variant of the logo. The directory falls back to the light file when it -# is absent. The manifest has no dark variant of composerIcon; that icon uses -# `currentColor` so it follows the text color of the theme. +# is absent. The manifest has no dark variant of composerIcon; that icon ships its +# own background so it reads on both themes. OPTIONAL_BRAND_ASSET_FIELDS = ("logoDark",) # A Skills-only upload rejects this field (`screenshot_configuration_excluded`). EXCLUDED_INTERFACE_FIELDS = ("screenshots",)