Skip to content

Commit 8be4dbd

Browse files
committed
Teach the skill to submit, share and diagnose, and pin it to the MCP
1 parent 4cd81b2 commit 8be4dbd

10 files changed

Lines changed: 627 additions & 48 deletions

File tree

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
},
1010
"homepage": "https://github.com/extensiondev/skill",
1111
"repository": "https://github.com/extensiondev/skill",
12-
"license": "MIT",
12+
"license": "Apache-2.0",
1313
"keywords": [
1414
"agent-skill",
1515
"browser-extension",

.github/workflows/ci.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ jobs:
2424
repository: extension-js/extension.js
2525
path: extension.js
2626

27+
- name: Checkout the MCP server (mcp-sync source of truth)
28+
uses: actions/checkout@v5
29+
with:
30+
repository: extensiondev/mcp
31+
path: mcp
32+
2733
- name: Setup Node.js
2834
uses: actions/setup-node@v6
2935
with:
@@ -33,6 +39,7 @@ jobs:
3339
run: node --test test/*.test.mjs
3440
env:
3541
EXTENSION_JS_REPO: ${{ github.workspace }}/extension.js
42+
EXTENSION_DEV_MCP_REPO: ${{ github.workspace }}/mcp
3643

3744
- name: Validate against the Agent Skills spec
3845
run: npx -y skills-ref validate skills/extension-dev

.github/workflows/release.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ jobs:
3232
repository: extension-js/extension.js
3333
path: extension.js
3434

35+
- name: Checkout the MCP server (mcp-sync source of truth)
36+
uses: actions/checkout@v5
37+
with:
38+
repository: extensiondev/mcp
39+
path: mcp
40+
3541
- name: Setup Node.js
3642
uses: actions/setup-node@v6
3743
with:
@@ -80,6 +86,7 @@ jobs:
8086
run: node --test test/*.test.mjs
8187
env:
8288
EXTENSION_JS_REPO: ${{ github.workspace }}/extension.js
89+
EXTENSION_DEV_MCP_REPO: ${{ github.workspace }}/mcp
8390

8491
- name: Read package metadata
8592
id: meta

CHANGELOG.md

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,70 @@
22

33
## 1.0.0
44

5-
The skill moves to Apache-2.0.
5+
The skill moves to Apache-2.0, and it finally covers the tools it was
6+
missing, including store submission.
7+
8+
### Added
9+
10+
- **Store submission through extension.dev (`extension_submit`).** The
11+
publishing reference ran to 175 lines about shipping to stores and never
12+
named the tool that ships to stores. It now has a section of its own: what
13+
the tool does and does not do, why `dryRun` defaults to true, how to read
14+
the per-store preflight rows, and why `dryRun: false` is a one-way door
15+
into store review. This was the largest gap in the skill: the most
16+
consequential and least reversible action on the platform had no page.
17+
- **Reading project state (`extension_release_status`).** Read-only, and the
18+
place a valid build sha comes from. The skill previously told agents to
19+
pass a build sha to `extension_release_promote` without saying where one
20+
comes from.
21+
- **Sharing a build (`extension_preview_web`, `extension_shares`).** How to
22+
hand someone a link that opens the extension with no install, why
23+
`share: true` is required outside the extension.dev monorepo, that a share
24+
also serves the built code as a zip, and how to list or revoke a link
25+
afterwards. A share made without knowing `extension_shares` exists cannot
26+
be pulled back.
27+
- **Session diagnosis (`extension_doctor`).** A CLI command and an MCP tool
28+
that names the broken leg of a dev session in dependency order. Run it
29+
before theorizing when an act tool errors. Includes the two readings that
30+
mislead: a `skip` means blocked, and a `read-only` status is a choice, not
31+
a fault.
32+
- **Chrome theme verification (`extension_theme_verify`)**, noted in the
33+
debugging reference as the tool for themes rather than extensions.
34+
- **A drift test against the MCP server** (`test/mcp-sync.test.mjs`). It
35+
derives the live tool registry from the MCP's own sources instead of
36+
trusting prose, and fails when the skill states the wrong tool count, names
37+
a tool the server retired, promises an `extension` CLI command that is not
38+
registered, calls a tool MCP-only when a CLI command exists for it, or when
39+
a newly registered tool goes undocumented without a written reason. CI and
40+
the release workflow now check out the MCP server alongside Extension.js.
41+
42+
### Fixed
43+
44+
- **The CLI parity claim was wrong.** The skill said nearly every MCP
45+
capability had an `extension` CLI equivalent, with three exceptions. In
46+
fact 13 of the 29 tools have a CLI command, and everything that talks to
47+
extension.dev has none. An agent reading the old claim would confidently
48+
tell a user to run commands that do not exist. The skill now lists the CLI
49+
commands that exist and the tools that are MCP-only, and both lists are
50+
held to their sources by the new drift test.
51+
- **The publishing and STORE.md references pointed at a package readers
52+
cannot install.** They named a private deploy CLI as the way to mint a
53+
Chrome refresh token and to hold credentials in a local dotfile. That
54+
package publishes with restricted access, so the command answered 404 for
55+
everyone outside the company. The Chrome credential guidance now recommends
56+
the service account, which needs nothing minted, and credential storage is
57+
described on the console path it actually uses. A test now fails if any
58+
private package name reappears anywhere in this package.
59+
- **The tool count in the README** said 28; the server registers 29.
60+
- **`STORE.md` advice is now trustworthy where it was guesswork.** The MCP's
61+
`STORE.md` parser is a pinned port of the one the real submission runs,
62+
held to it by a test that replays both over the same corpus, so the skill
63+
now says a missing-notes warning means a genuinely missing field. It also
64+
records the fact that bit people: the submission reads `STORE.md` from the
65+
source repository at the built commit, not from the working directory.
66+
- **The September 6, 2026 platform hold** is described accurately. Device
67+
login works, and so does listing or revoking an existing share; five lanes
68+
answer 403 `PLATFORM_NOT_OPEN` until that date.
669

770
### Changed
871

@@ -11,7 +74,12 @@ The skill moves to Apache-2.0.
1174
those rights on those versions. From 1.0.0 forward the license is
1275
Apache-2.0, which adds an express patent grant and requires anyone
1376
shipping a modified copy to state that they changed the files. Installing
14-
this skill and using it to build extensions is unaffected.
77+
this skill and using it to build extensions is unaffected. The skill
78+
frontmatter and the plugin manifest, which still read MIT, now agree with
79+
the LICENSE file.
80+
- The workflow gained a step for sharing a build and split publish from
81+
submit, because conflating the two is how an irreversible store submission
82+
happens by accident.
1583

1684
## 0.5.1
1785

@@ -39,8 +107,8 @@ store reviewer notes, and version history, one section per store.
39107

40108
- New reference `references/store-md.md` with the template, the maintenance
41109
rules (manifest change, release, rejection, privacy shift), and the table
42-
of fields `extension-deploy` 1.4.0 submits automatically (Firefox reviewer
43-
and release notes, Edge certification notes).
110+
of fields a submission sends automatically (Firefox reviewer and release
111+
notes, Edge certification notes).
44112
- Workflow step 6 and `references/publishing.md` now direct the agent to
45113
create and maintain `STORE.md` as soon as publishing intent appears.
46114
- The Chrome section mirrors the `CHROMEWEBSTORE.md` shape other agent

README.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,20 @@ Powered by [extension.dev](https://extension.dev) and the open-source
2626
half of the extension.dev agent stack:
2727

2828
- **[@extension.dev/mcp](https://www.npmjs.com/package/@extension.dev/mcp)**
29-
gives agents *hands*: 28 MCP tools for scaffolding, building, live DOM
30-
inspection, log streaming, publishing, and headless release promotion.
29+
gives agents *hands*: 29 MCP tools for scaffolding, building, live DOM
30+
inspection, log streaming, publishing, store submission, and headless
31+
release promotion.
3132
- **@extension.dev/skill** gives agents *judgment*: when to use which tool,
3233
the cross-browser rules, the silent-failure gotchas, and the publish
3334
checklist, packaged in the open [Agent Skills](https://agentskills.io)
3435
format (SKILL.md plus progressive-disclosure references).
3536

36-
The skill works standalone: every capability documents the `extension` CLI
37-
path. It shines when the MCP server is connected, because the skill tells the
38-
agent to verify against the live browser instead of guessing, and the MCP
39-
tools make that a one-call operation.
37+
The skill works standalone: the whole local loop (scaffold, dev, build,
38+
inspect, publish) documents the `extension` CLI path, and the skill says
39+
plainly which capabilities are MCP-only so an agent never invents a command
40+
that does not exist. It shines when the MCP server is connected, because the
41+
skill tells the agent to verify against the live browser instead of guessing,
42+
and the MCP tools make that a one-call operation.
4043

4144
In the shipped benchmark, a skill-equipped agent passed **15/15** graded
4245
assertions; the no-skill baseline passed 10/15. Details and reproduction in
@@ -137,8 +140,9 @@ skills/
137140
project-structure.md Layout, entry wiring, special folders, env vars
138141
cross-browser.md chromium:/firefox: prefixes, API namespaces
139142
api-gotchas.md Service worker lifetime, gestures, messaging
140-
debugging.md --source, --logs, act tools, diagnosis playbook
141-
publishing.md Builds, zips, store checklist, extension.dev publish
143+
debugging.md --source, --logs, act tools, doctor, playbook
144+
publishing.md Builds, zips, store checklist, publish, share, submit
145+
store-md.md STORE.md convention, template, what gets submitted
142146
```
143147

144148
The SKILL.md body stays small and always loads when the skill triggers; the

skills/extension-dev/SKILL.md

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
name: extension-dev
33
description: Build, debug, and publish cross-browser extensions (Chrome, Edge, Firefox, and any Chromium- or Gecko-based browser such as Brave, Opera, Vivaldi, Yandex, Waterfox, or LibreWolf, plus Safari) with the extension.dev framework. Use this skill whenever the user mentions browser extensions, Chrome extensions, Firefox add-ons, Safari web extensions, WebExtensions, Manifest V3, manifest.json, content scripts, service workers, side panels, popups, options pages, chrome.* or browser.* APIs, or publishing to the Chrome Web Store or Firefox Add-ons, even if they never name extension.dev or Extension.js explicitly. Also use it when debugging why an extension does not load, inject, or update.
4-
license: MIT
4+
license: Apache-2.0
55
metadata:
66
author: Cezar Augusto
77
version: 0.5.1
@@ -23,11 +23,22 @@ Two companions do the heavy lifting. Prefer them over guessing:
2323
to GitHub and before `extension_auth` against the new project), and headless
2424
release promotion. If its `extension_*` tools are available in the session,
2525
use them.
26-
- **`extension` CLI**: nearly every MCP capability has a CLI equivalent
27-
(`npx extension@latest <command>`). Use it when the MCP server is not
28-
connected. The exceptions are `extension_release_promote` (also reachable
29-
as `extension-mcp release promote`, but not via the `extension` CLI) and
30-
the session tools `extension_stop`/`extension_list_extensions`.
26+
- **`extension` CLI**: the local loop has a CLI path
27+
(`npx extension@latest <command>`), and only the local loop. The commands
28+
are `create`, `dev`, `start`, `preview`, `build`, `logs`, `inspect`,
29+
`eval`, `storage`, `reload`, `open`, `doctor`, `publish`, `install` and
30+
`uninstall`. Use them when the MCP server is not connected.
31+
- **Everything else is MCP-only.** Do not invent a CLI command for a tool
32+
that has none, because the shell will not tell you it was never there. No
33+
`extension` command exists for `extension_auth`,
34+
`extension_project_create`, `extension_release_status`,
35+
`extension_release_promote`, `extension_submit`, `extension_preview_web`,
36+
`extension_shares`, `extension_stop`, `extension_list_extensions`,
37+
`extension_templates`, `extension_add_feature`,
38+
`extension_manifest_validate`, `extension_analyze`,
39+
`extension_dom_snapshot` or `extension_theme_verify`. Outside an MCP
40+
session, `extension_release_promote` is also reachable through the MCP
41+
package's own bin as `extension-mcp release promote`.
3142

3243
## Workflow
3344

@@ -58,13 +69,25 @@ Two companions do the heavy lifting. Prefer them over guessing:
5869
`npm run build --zip` throws (core rule 5). When a verification session is
5970
done, shut it down (MCP: `extension_stop`) so dev servers and browsers do
6071
not pile up.
61-
6. **Publish deliberately.** Zip with `--zip`, check the store-readiness rules,
62-
then submit (or publish to extension.dev via `extension_publish`). Track
63-
listing copy, permission justifications, and per-store reviewer notes in a
64-
root `STORE.md` from the moment publishing intent appears; deploy tooling
65-
submits the API-accepted fields from it automatically. See
66-
[references/publishing.md](references/publishing.md) and
67-
[references/store-md.md](references/store-md.md).
72+
6. **To show someone the build, send a link, not a file.**
73+
`extension_preview_web` with `share: true` uploads the build and returns a
74+
URL that opens in a web emulator with no install and no sign-in. Pass
75+
`share: true` every time unless you are working inside the extension.dev
76+
monorepo: the default lane returns a `preview://build` deep link that
77+
resolves only against a local preview.extension.dev dev server. A share
78+
also serves the build as a zip, so it hands over the built code; say so
79+
before sharing, and use `extension_shares` to list or revoke a link
80+
afterwards. See [references/publishing.md](references/publishing.md).
81+
7. **Publish and submit are different verbs.** `extension_publish` pushes a
82+
build to the extension.dev platform. `extension_submit` sends a built
83+
commit into a store's review queue, which is irreversible; it defaults to
84+
a dry run, and only `dryRun: false` dispatches. "Deploy" and "ship"
85+
almost always mean publish. Zip with `--zip` and check the store-readiness
86+
rules first, and track listing copy, permission justifications, and
87+
per-store reviewer notes in a root `STORE.md` from the moment publishing
88+
intent appears: the submission reads the API-accepted fields from it
89+
automatically. Read [references/publishing.md](references/publishing.md)
90+
and [references/store-md.md](references/store-md.md) before either verb.
6891

6992
## Core rules
7093

@@ -161,6 +184,16 @@ feedback. Close the loop instead of theorizing:
161184
| Done verifying? | MCP `extension_stop` (kills the dev server and its browser) |
162185
| What is in `chrome.storage`? | MCP `extension_storage` |
163186
| Does the popup/panel open? | `extension open action` (`--allow-control`) or MCP `extension_open` |
187+
| An act tool errored and I cannot tell why | `extension doctor` or MCP `extension_doctor`, before any theory |
188+
| Where does the project stand on extension.dev? | MCP `extension_release_status` (read-only; it is also where a valid build sha comes from) |
189+
190+
Run `extension_doctor` first whenever `extension_storage`, `extension_reload`,
191+
`extension_eval` or `extension_open` errors unexpectedly. It returns one row
192+
per leg in dependency order (ready contract, dev-server process, control port,
193+
control channel, eval token, executor, browser liveness), so it names the
194+
broken leg instead of leaving you to guess which one it was. Read a `skip` as
195+
blocked, not as a pass. With no `projectPath` it runs as a pre-flight
196+
environment check before any project exists.
164197

165198
Full flag and event reference: [references/debugging.md](references/debugging.md).
166199

skills/extension-dev/references/debugging.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,30 @@ result reports `gesture: false` (plus a warning when the manifest declares
135135
| `tab.url` undefined | Missing `tabs` permission (silent failure by design) |
136136
| Storage "not saving" | Async race; listen to `onChanged` instead of read-after-write |
137137

138+
## When the tools themselves misbehave
139+
140+
`extension doctor` (MCP: `extension_doctor`) diagnoses the session end to end
141+
instead of leaving you to bisect it: ready contract, dev-server process,
142+
control-port agreement, control channel, eval token, executor, browser
143+
liveness. It returns one `{check, status, detail, remediation}` row per leg in
144+
dependency order.
145+
146+
```bash
147+
extension doctor # diagnose the session in this project
148+
extension doctor --output json # machine-readable
149+
```
150+
151+
Run it first whenever `extension_storage`, `extension_reload`,
152+
`extension_eval` or `extension_open` errors unexpectedly. Three readings that
153+
save time:
154+
155+
- A `skip` means blocked, not passed. The row names the check that blocked it.
156+
- A session started without `allowControl` returns `ok: true` with status
157+
`read-only`. Its control channel is off by choice; that is not the bug.
158+
- With no project path it runs as a pre-flight environment check (node, the
159+
Extension.js CLI, the template cache), which is useful before any project
160+
exists.
161+
138162
## Other tools
139163

140164
- `extension_manifest_validate` (MCP): cross-browser manifest validation with
@@ -148,3 +172,11 @@ result reports `gesture: false` (plus a warning when the manifest declares
148172
- `extension_browsers` with `action: "detect"` or `action: "install"` (MCP):
149173
check what browsers exist before launching; install managed binaries in CI
150174
or containers.
175+
- `extension_theme_verify` (MCP): for Chrome *themes*, not extensions. It
176+
derives every color current Chrome would paint from a theme manifest and
177+
flags fabricated colors, parity gaps, and keys Chrome silently discards
178+
(dead legacy, incognito, unknown, out-of-range). Use it instead of reading
179+
theme colors by eye; it verifies only and never edits the manifest. The
180+
rendered and real-pixel legs need a browser, so they come back as
181+
`needsAttended` rather than passed, and a theme is not proven by this tool
182+
alone.

0 commit comments

Comments
 (0)