Pre-launch deep audit: a 4-dimension adversarial review (cross-framework
breakage, dependency drift, validator correctness, security/cross-platform)
that fixed 16 verified findings — including a publish-guard gap — and added CI
guardrails so each fixed class is regression-protected.
Added
- CI regression guardrails. Three jobs in
.github/workflows/validate.yml:
an adversarial validator-fixture suite (known-bad manifests must be caught,
known-good must pass), a dependency-drift check (fails if a fast-moving
package un-pins), and a WXT scaffold→install→build→validate matrix (the exact
path thewxt/sandboxbreak failed on). The drift check immediately caught a
straywxt@latestin the vanilla template README. - Agent capability matrix in the README. A table now shows each specialist
agent's tool grants, making the minimal-privilege design (no agent can
Edit/Write or publish; only the architect plans without shell) verifiable at
a glance instead of by reading three agent files. - Note that DNR rule-count limits aren't validated.
dnr-conversion.md
already documented Chrome's ~30k static / ~5k dynamic limits; it now states
explicitly that the bundled validators don't count rules, so authors track it. - Icon dimension validation.
validate-manifest.pynow reads each PNG
icon's actual pixel dimensions (stdlib only — no Pillow) and warns when they
don't match the size key the icon is declared under. Wrong-size icons used to
pass the file-existence check and only fail later at Chrome Web Store upload. - Host/match-pattern syntax validation.
validate-permissions.pynow flags
malformed match patterns inhost_permissions,optional_host_permissions,
and content-scriptmatches(e.g.**invalid**), which Chrome silently drops
at load time.
Fixed
- Windows requirements documented. The bundled helper scripts assume a
POSIX shell, andbuild-zip.shshells out tozip. README now states that
Windows users must run the plugin inside WSL or Git Bash. A cross-platform
port of the helpers is planned post-launch. - Plasmo scaffold produced a project that wouldn't install (upstream bug).
pnpm create plasmo(create-plasmo 0.90.x) pins"plasmo": "workspace:*",
so the nextpnpm installfails withERR_PNPM_WORKSPACE_PKG_NOT_FOUND. The
plasmo-frameworkskill and/chrome-ext:newPlasmo path now warn about the
upstream breakage, document thepnpm pkg set dependencies.plasmo=latest
workaround, and steer new projects to WXT. (Existing Plasmo projects are
unaffected — they never re-run the scaffold.) - Interactive WXT scaffold docs pinned to
wxt@~0.20.26.commands/new.md
and thewxt-frameworkskill usedwxt@latest init; since 0.20.x relocated
thedefineBackground/defineContentScriptexports, a floating@latest
can scaffold a project that no longer imports correctly. Also corrected a doc
line that wrongly saidscaffold-wxt.shrunswxt init(it writes files
directly and already pins~0.20.26). validate-csp.shnow honors the exit-code contract. It exited with the
raw critical count (e.g.3) instead of1; nowexit 1on any critical,
0otherwise — consistent with the other validators.- CRXJS scaffold was incomplete and failed to build. The
react-ts
template doesn't include thechrome.*types and the skill didn't create the
_localesfile its manifest references, so a clean scaffold hitTS2304: Cannot find name 'chrome'and shipped unresolved__MSG_*__placeholders.
Added@types/chrome, atsconfig.app.jsontypes: ["chrome"]step, and a
public/_locales/en/messages.jsonstep. Also moved the recommended plugin
off@crxjs/vite-plugin@beta(an old2.0.0-beta.x) to stable@^2.6.
Security
- Publish guard rewritten to block the actual live-publish commands. The
PreToolUse hook previously blocked--auto-publish, a flag that
chrome-webstore-upload-cliv4 no longer has — so the real live-publish
paths (chrome-webstore-upload publish, or a barechrome-webstore-upload
that uploads-and-publishes in one shot) bypassed the guard entirely. The
hook now allows only the explicitupload(draft) subcommand and blocks
publish/bare invocations unless prefixed withCONFIRM_PUBLISH_LIVE=1.
Changed
- Publishing docs updated to the
chrome-webstore-upload-cliv4 CLI.
v4 removed the--client-id/--client-secret/--refresh-token/--auto-publish
flags: credentials now come from theCLIENT_ID/CLIENT_SECRET/REFRESH_TOKEN
environment variables, and live publish uses a separatepublishsubcommand.
Updatedcommands/publish.md,extension-publishing/SKILL.md, the GitHub
Actions template, and the OAuth setup guide; pinned thedlxinvocations to
chrome-webstore-upload-cli@4so a future major can't break the flags again.