chore: dual-host plugin (Claude + Codex) via Node.js MCP bridge#140
Merged
Conversation
Architecture:
- index.js (zero-npm-dep Node.js bridge) becomes the .mcp.json command.
On first MCP invocation in either host, index.js detects host
(CLAUDE_PLUGIN_ROOT vs CODEX_ACTIVE/PLUGIN_ROOT env), checks for cached
binary at ${PLUGIN_ROOT}/bin/ccteam, downloads + extracts the
per-platform tarball from the matching GitHub Release if missing or
stale (version pinned via plugin.json — SoT), chmods, symlinks to
~/.local/bin/ccteam for CLI access, then execs `ccteam mcp-serve` with
CCTEAM_HOST=claude|codex env injected.
- .codex-plugin/plugin.json added with rich Codex UI metadata (interface
block, brandColor, defaultPrompt).
- .claude-plugin/plugin.json kept slim; version drift 0.6.5 -> 0.6.6
realigned to workspace SoT (no workspace bump).
- .mcp.json `command` switches from `ccteam` (PATH-dependent) to
`node ${CLAUDE_PLUGIN_ROOT}/index.js` (sandbox-resident, no
install.sh prerequisite).
- install.sh kept as alt path for system-wide CLI; README + quickstart
lead with plugin install, install.sh demoted to "Advanced" section.
User-visible: single command install (no install.sh required) on both
Claude Code and Codex. Binary lives in plugin sandbox, PATH-independent.
tmux warning soft (not fatal). Version auto-aligned via plugin.json SoT,
no hardcoded version strings inside index.js.
No workspace version bump (workspace stays 0.6.6); only plugin manifest
drift correction 0.6.5 -> 0.6.6.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
firstintent
added a commit
that referenced
this pull request
May 24, 2026
User tested PR #140 on real macOS and found `/plugin install ccteam` cannot install the Rust binary via the Node bridge (likely ${CLAUDE_PLUGIN_ROOT} substitution / sandbox / permission issue — not investigated further per user direction). Reverting to the proven two-step install: 1. curl install.sh | sh — downloads + installs ccteam binary to ~/.local/bin 2. /plugin marketplace add + /plugin install ccteam — installs skills + .mcp.json Files reverted (to d7b4201 state): - .mcp.json (command "ccteam" on PATH, not node + index.js) - README.md (install.sh-then-plugin lead restored) - docs/quickstart.md (Step 1 binary install + Step 2 plugin install) - docs/troubleshooting.md (removed bridge-specific entries) Files removed: - index.js (Node bridge — dead path) - .codex-plugin/ (dual-host manifest — unused now) Files kept from PR #140 (good drift fix, unrelated to revert): - .claude-plugin/{plugin,marketplace}.json version 0.6.5 → 0.6.6 sync No workspace version bump. No code/test impact. Future Codex-side integration (if desired): separate finding, will not use Node bridge approach. Co-authored-by: cs <dev@cs>
firstintent
added a commit
that referenced
this pull request
May 24, 2026
…ME (#142) Codex-side manifest is useful in the two-step install model: - Step 1: install.sh → binary on $PATH - Step 2a (Claude): /plugin install reads .claude-plugin/plugin.json - Step 2b (Codex): codex plugin marketplace add reads .codex-plugin/plugin.json - Both wire .mcp.json (command "ccteam") → spawn ccteam mcp-serve on PATH Restored from PR #140 (which was reverted in PR #141): - .codex-plugin/plugin.json (rich interface metadata for Codex UI) Added to README install section: - Codex install one-liner (`codex plugin marketplace add firstintent/ccteam`) No code change, no version bump, no test impact. Co-authored-by: cs <dev@cs>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Same repo now serves as both a Claude Code plugin and a Codex plugin. A zero-npm-dep Node.js bridge (
index.js) handles binary lazy download + host detection + stdio proxy toccteam mcp-serve.Why
/plugin install ccteam(Claude) orcodex plugin marketplace add firstintent/ccteam(Codex). Noinstall.shrequired, no~/.local/bin/PATH wrangling.~/.local/bin/ccteamso terminalccteam startstill works..claude-plugin/plugin.json::version— index.js reads it at startup and re-downloads the binary wheneverccteam --versiondoes not match; no hardcoded version strings inside the bridge.Architecture
Files
index.js(218 LOC, zero npm deps — stdlib only),.codex-plugin/plugin.json(rich Codex UI metadata: interface block, brandColor, defaultPrompt)..mcp.json(command:ccteam->node ${CLAUDE_PLUGIN_ROOT}/index.js),.claude-plugin/plugin.json+.claude-plugin/marketplace.json(version drift 0.6.5 -> 0.6.6, matching workspace SoT — no workspace bump),README.md(lead with plugin install, install.sh demoted to "Advanced"),docs/quickstart.md(Step 1 rewritten: no CLI prereq; Codex sub-section added),docs/troubleshooting.md(3 new entries A3b/A3c/A3 update: bridge download failures, missing PATH symlink).Verify
node --check index.js-> clean.claude-plugin/plugin.json,.claude-plugin/marketplace.json,.codex-plugin/plugin.json,.mcp.json) -> cleancargo clippy --workspace --all-targets --locked -- -D warnings-> 0 warnings (no Rust touched)cargo fmt --all -- --check-> cleansh -n install.sh && dash -n install.sh-> cleancargo test --workspace --locked --no-fail-fast-> 1545 passed, 95 failed; all 95 failures pre-exist onorigin/main(ccteam-web SSE / SPA / webhook integration tests, env-dependent — port binding / 502 on this WSL host); zero new failures introduced (no Rust source modified).Test plan
v0.6.6release once merged so the GH Release tarballs exist (currentfirstintent/ccteamhas no release yet; bridge needs assets to download)./plugin install ccteamin a fresh Claude session, call anymcp__ccteam__*tool, confirm~/.local/bin/ccteamappears.codex plugin marketplace add firstintent/ccteam, confirm bridge picksCCTEAM_HOST=codex.${CLAUDE_PLUGIN_ROOT}env is not substituted by the host, switch.mcp.jsonto absolute path and re-test.