Skip to content

feat(host): emit Claude Code + Codex plugin manifests from shared skill body#1436

Merged
shaun0927 merged 3 commits into
developfrom
feat/1433-plugin-manifests
May 28, 2026
Merged

feat(host): emit Claude Code + Codex plugin manifests from shared skill body#1436
shaun0927 merged 3 commits into
developfrom
feat/1433-plugin-manifests

Conversation

@shaun0927
Copy link
Copy Markdown
Owner

Summary

  • Adds .claude-plugin/plugin.json and .codex-plugin/plugin.json at the repo root — both manifests register the same openchrome MCP server (openchrome serve --auto-launch) and point to skills/openchrome/ as the shared skill body (SSOT, no per-host duplication).
  • Adds skills/openchrome/SKILL.md as the shared skill body describing the full OpenChrome tool surface.
  • Adds skills/openchrome/commands/connect.md slash command stub (/openchrome:connect) so the layout satisfies both Claude Code and Codex plugin conventions.
  • Adds a "Host plugins" section to README.md with load instructions for both hosts.

Closes #1433

Files added / changed

File Change
.claude-plugin/plugin.json New — Claude Code plugin manifest
.codex-plugin/plugin.json New — Codex CLI plugin manifest
skills/openchrome/SKILL.md New — shared skill body (SSOT)
skills/openchrome/commands/connect.md New — /openchrome:connect slash command stub
README.md Updated — "Host plugins" section

Test plan

  • npm run build passes (TypeScript compilation clean)
  • npm test passes (13 pre-existing baseline failures unchanged — ts-jest infrastructure issue in default-registry.test.ts, unrelated to this PR; no new failures introduced)
  • .claude-plugin/plugin.json parses as valid JSON (node -e "JSON.parse(require('fs').readFileSync('.claude-plugin/plugin.json'))")
  • .codex-plugin/plugin.json parses as valid JSON (node -e "JSON.parse(require('fs').readFileSync('.codex-plugin/plugin.json'))")
  • Manual: claude --plugin-dir /path/to/openchrome loads the plugin and /openchrome:connect is available
  • Manual: codex --plugin-dir /path/to/openchrome loads the plugin

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com

@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

shaun0927 and others added 2 commits May 28, 2026 22:48
…ll body

Closes #1433. Adds .claude-plugin/plugin.json and .codex-plugin/plugin.json
at the repo root, both pointing to skills/openchrome/ as the SSOT skill body.
Registers the openchrome MCP server (openchrome serve --auto-launch) in both
manifests. Adds skills/openchrome/SKILL.md (shared body) and a connect.md
slash command stub. Adds "Host plugins" section to README.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ILL.md

The shared SKILL.md is loaded verbatim by both Claude Code and Codex
manifests, so it must use bare MCP tool names rather than Claude Code's
`mcp__openchrome__` prefix. Every other tool in the skill body already
uses the bare name; align screenshot ("computer") with that convention
so the body stays host-neutral per P1 in #1359.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@shaun0927 shaun0927 force-pushed the feat/1433-plugin-manifests branch from 440fcfc to 1e95d04 Compare May 28, 2026 13:50
@shaun0927
Copy link
Copy Markdown
Owner Author

Review summary — scoped down to stated description; awaiting CI ⏳

What changed in this revision

The previous head (`440fcfc5`) carried 9 commits of which 8 were a stale snapshot of the A2 outcome-contract-template stack (PRs #1388/#1394/#1395/#1396/#1397/#1411/#1412). Those PRs were merged into intermediate stack branches but only `#1410` reached `develop` — and `#1410` only delivered `public-web/page-meta.ts`. The branch's older `registry.ts` had also diverged from `develop`'s now-hardened version (which gained a recursive `deepFreeze`), so a straight rebase produced unresolvable add/add conflicts on `src/contracts/templates/{index,registry}.ts` and the corresponding tests.

To match the PR description ("Closes #1433 … 5 files added") I reset the branch to `origin/develop` and cherry-picked only the plugin-manifest commit, then added one nit fix:

Commit Scope
`feat(host): emit Claude Code + Codex plugin manifests from shared skill body` The 5 files the description lists + a small benchmark-fixture polish in `tests/benchmark/fixtures/auth-app/server.ts` (cookie `Max-Age` + force-close idle sockets on shutdown).
`fix(plugin): drop Claude Code MCP namespace prefix in host-neutral SKILL.md` One line: `mcp__openchrome__computer` → `computer`. SKILL.md is the SSOT loaded by both `.claude-plugin` and `.codex-plugin`; using Claude Code's host-specific MCP tool prefix would violate P1 (host-neutral) for the Codex side.

Final diff: 6 files changed, 185 insertions(+), 2 deletions(-) — matches the PR description.

SSOT alignment (#1359)

  • Pillar A (MCP portability layer) + P1 (Host-neutral MCP first): both manifests register the same `openchrome serve --auto-launch` MCP server and point to the same `skills/openchrome/` body — no per-host behavioral fork. Decision-rule 10 ("does this introduce host-specific behavior that should instead be expressed through MCP?") is answered: no.
  • The `/openchrome:connect` command stub uses portable tool names (`oc_connection_health`) with a no-arg contract that works for any unknown MCP client (P1's "useful baseline behavior without client-specific assumptions").
  • The "5–15× token-cheaper" claim in `SKILL.md` is consistent with the existing claim in `README.md` and `benchmark/EPIC-1254-STATUS.md` (`15.3×` token compression), so P5 is satisfied.

Orphaned A2 work

The 7 stale commits (default-registry singleton, spa-hydrated / link-graph / authenticated-fields templates, `extract_data` `template_id`, `oc_assert` `contract_id`, `docs/contracts/templates.md`) deserve a fresh PR rebased on develop's hardened registry. Not in scope here.

Verification

  • Local `npm ci && npm run build` clean.
  • `tests/benchmark/fixtures` suite: 14/14 pass.
  • CI: re-triggered by the force-with-lease push; was previously empty due to the conflicting state.

Pending: CI green across the matrix.

…covery

Claude Code (and Codex) auto-discover slash commands from a top-level
commands/ directory, not from skills/<name>/commands/. Relocate connect.md
so /openchrome:connect actually registers, and update the README to
describe the correct layout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@shaun0927
Copy link
Copy Markdown
Owner Author

Review & merge-readiness analysis (#1436)

Intent: Emit Claude Code + Codex plugin manifests from a single shared skill body (SSOT, no per-host duplication). Closes #1433.

Alignment with the SSOT (#1359)

This is integration sugar done host-neutrally, which #1359 explicitly permits ("host-specific setup or UX integrations are allowed, but they must not define core behavior"). The core value — the openchrome MCP server entry point (openchrome serve --auto-launch) — is identical across both manifests and both point to the same skills/openchrome/ body. This advances P1 (host-neutral MCP first) and serves host class #1 (stdio single-client hosts: Claude Code, Codex) without introducing any host-specific core behavior. No conflict with the single-CDP-owner direction (P3a).

Issue found & fixed

  • The /openchrome:connect slash command was misplaced at skills/openchrome/commands/connect.md. Claude Code (and Codex) only auto-discover slash commands from a top-level commands/ directory, so it would not have registered. Relocated to commands/connect.md and corrected the README layout description (commit f790d28e). commands/ at the repo root keeps the shared-SSOT design intact — both manifests still reference one source.

Non-blocking notes (P2, left as-is)

  • The "skills": "./skills/" manifest field is dead metadata for Claude Code (discovery is convention-based) but harmless; retained to avoid disturbing Codex behavior.
  • The tests/benchmark/fixtures/auth-app/server.ts change (cookie Max-Age, force-close idle sockets) is unrelated scope but net-positive for benchmark-runner termination and zero-risk (optional-chained against Node version).

Verdict

Specialized code review: MERGE-READY — 0 P0 / 0 P1, remaining items are cosmetic P2. Version 1.12.5 matches package.json; both manifests are valid JSON and point to a real binary + a registered, tested oc_connection_health tool.

@shaun0927 shaun0927 merged commit ef08bdb into develop May 28, 2026
26 of 27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant