diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index d5f55d4387..17ccc3b0af 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "plugins": [ { "name": "rea", - "description": "Reverse engineer anything from your terminal or agent with one CLI and MCP server.", + "description": "Reverse engineer anything with agents, from app behavior down to native binaries.", "source": { "source": "npm", "package": "rea-agents", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 6f3772482e..de7b7228a1 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "rea", "version": "6.8.0", - "description": "Reverse engineer anything from your terminal or agent with one CLI and MCP server.", + "description": "Reverse engineer anything with agents, from app behavior down to native binaries.", "author": { "name": "morluto", "url": "https://github.com/morluto" @@ -24,5 +24,6 @@ "6.8.0" ] } - } + }, + "icon": "./assets/rea-plugin.png" } diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 9246cbed5f..c3207ab9ea 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "rea", "version": "6.8.0", - "description": "Reverse engineer anything from your terminal or agent with one CLI and MCP server.", + "description": "Reverse engineer anything with agents, from app behavior down to native binaries.", "author": { "name": "morluto", "url": "https://github.com/morluto" @@ -19,8 +19,8 @@ "mcpServers": "./.codex-plugin/mcp.json", "interface": { "displayName": "REA", - "shortDescription": "Reverse engineer anything with agents", - "longDescription": "Use REA to explain shipped behavior from native binaries, managed assemblies, Electron and JavaScript bundles, packages, firmware, and browser targets, with evidence that separates observations from inferences.", + "shortDescription": "Reverse engineer anything", + "longDescription": "Reverse engineer anything with agents, from app behavior down to native binaries.", "developerName": "morluto", "category": "Developer Tools", "capabilities": [ @@ -33,6 +33,8 @@ "Use REA to explain how this binary implements a feature.", "Use REA to compare two versions of this application.", "Use REA to recover the sources from this JavaScript bundle." - ] + ], + "composerIcon": "./assets/rea-plugin.png", + "logo": "./assets/rea-plugin.png" } } diff --git a/assets/README.md b/assets/README.md new file mode 100644 index 0000000000..431bc4204a --- /dev/null +++ b/assets/README.md @@ -0,0 +1,10 @@ +# Plugin icon + +`rea-plugin.png` is a square adaptation of the left panel of REA's GitHub +social preview, retrieved on 2026-10-28: + +https://repository-images.githubusercontent.com/1209966933/1a3fef9a-be4b-41f4-8830-a94c0e8288cc + +The image was adapted with imagegen, preserving the cyan REA lettering, +pixel typography, orange rule, and taglines. Both plugin manifests reference +this shared asset; only the PNG is included in the npm package. diff --git a/assets/rea-plugin.png b/assets/rea-plugin.png new file mode 100644 index 0000000000..6fcba2fc32 Binary files /dev/null and b/assets/rea-plugin.png differ diff --git a/package.json b/package.json index 540c32feb5..2d6e8b5e1e 100644 --- a/package.json +++ b/package.json @@ -100,6 +100,7 @@ "third_party/pwndbg/README.md", "third_party/pwndbg/LICENSE.md", "licenses", + "assets/rea-plugin.png", ".claude-plugin/plugin.json", ".codex-plugin/plugin.json", ".codex-plugin/mcp.json", diff --git a/scripts/verify-package-pack.mjs b/scripts/verify-package-pack.mjs index 88e7e9bd42..7009b1a81c 100644 --- a/scripts/verify-package-pack.mjs +++ b/scripts/verify-package-pack.mjs @@ -254,6 +254,15 @@ export async function verifyPackagePack({ root, workspace, commands }) { throw new Error( `Packaged plugin ${path} does not match the exact runtime and canonical skill release`, ); + const icons = path.startsWith(".codex") + ? [manifest.interface?.logo, manifest.interface?.composerIcon] + : [manifest.icon]; + for (const icon of icons) + if ( + icon !== "./assets/rea-plugin.png" || + !packedFiles.includes(`package/${icon.slice(2)}`) + ) + throw new Error(`Packaged plugin ${path} is missing its shared icon`); } if (packedFiles.includes("package/.mcp.json")) throw new Error("Plugin metadata must not register a project MCP server"); diff --git a/tests/conformance/releaseConfiguration.test.ts b/tests/conformance/releaseConfiguration.test.ts index aa9e19c2c3..df50961b44 100644 --- a/tests/conformance/releaseConfiguration.test.ts +++ b/tests/conformance/releaseConfiguration.test.ts @@ -339,8 +339,13 @@ describe("plugin release pins", () => { "longDescription", "developerName", "category", + "composerIcon", + "logo", ]) expect(manifest.interface[field]).toEqual(expect.stringMatching(/\S/u)); + expect( + String(manifest.interface.shortDescription).length, + ).toBeLessThanOrEqual(30); expect(manifest.interface.capabilities).toEqual( expect.arrayContaining([expect.stringMatching(/\S/u)]), );