Conversation
…oth marketplaces (#892) Both the Claude and Codex marketplaces now install packages/claude-plugin. It carries the single bundled runtime (rn-dev-agent-core/dist with host-neutral rn-dev-agent-core metadata) plus the Codex adapters generated from the packages/codex-plugin authoring tree: .codex-plugin/plugin.json (explicit ./codex-skills/, ./codex.mcp.json, commands: [], inline empty hooks), codex.mcp.json, bin/ launchers with an ESM package boundary, codex-skills/, codex-commands/, codex-agents/, codex-templates/, AGENTS-MD-TEMPLATE.md. packages/codex-plugin keeps only authoring sources; its duplicated runtime, native helpers, helper scripts, runner manifest and generated skills are removed. The freshness, package-sync, core-dist and web-bundle guards rebuild and compare the one committed tree and every generated Codex output, and refuse a second tracked host dist. Claude's manifests clear inherited Codex root hints so the neutral runtime reports Claude's launching root. Tracked bytes: 49,965,515 -> 38,493,416.
…claude-plugin copy (#892) The finalize step, the offline validator and the public-asset check now generate, compare and commit one distributed runner-manifest.json copy under packages/claude-plugin instead of the removed packages/codex-plugin copy, and the version-bump allowlist admits the regenerated codex.mcp.json. The callable producer and sweep workflows are untouched.
|
Too many files changed for review (291 files, 100 file limit). Bypass the limit by tagging |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Local install proof for this head's layout (isolated
Device runner health, app flow and the 1.0.8 upgrade path remain for independent QA. |
There was a problem hiding this comment.
HANDOFF: needs-qa
QA requested (needs-qa).
Linux automation cannot run device QA. GetSafe Project will spawn a new local Mac session.
QA_PR: #1037
PLATFORM: all
IMAGE_WIDTH: 800
POST_COMMENT: true
Claim: GH-892 makes packages/claude-plugin the single marketplace install root for both Claude and Codex, carrying one committed rn-dev-agent-core/dist plus generated Codex manifests and adapters (.codex-plugin/plugin.json, codex.mcp.json, bin/, codex-skills/, codex-commands/, codex-agents/, codex-templates/); packages/codex-plugin is authoring-only, and both hosts must install and run from that one copy with CI gates (check-dist-fresh, package-sync, release trust-root) pointed at it.
Changed paths:
.agents/plugins/marketplace.jsonpackages/claude-plugin/.claude-plugin/plugin.jsonpackages/claude-plugin/.codex-plugin/plugin.jsonpackages/claude-plugin/bin/cdp-supervisor.jspackages/claude-plugin/codex-skills/,codex-commands/,codex-agents/packages/rn-dev-agent-core/src/session/product-version.tsscripts/build-host-runtimes.ts/scripts/check-dist-fresh.sh.github/workflows/release.yml- docs/README/AGENTS updates;
packages/codex-pluginruntime artifacts removed
Local runner must:
- New session (do not reuse an old chat; plugin ≥ 1.0.8 with /qa-pr)
- Version preflight vs GitHub main + latest release before any device work
- Own disposable git worktree (never the primary checkout)
- Own dedicated simulator/emulator named with the PR identity, e.g.
QA PR 1017 short-title - Plugin-repo PRs bind workspace test-app/
- Report back on this PR with gh --attach and
- Overall PASS or FAIL (PR/fix). Never PARTIAL.
Sent by Cursor Automation: New bug for QA
QA dogfood (needs-qa)Verdict: blocked Original problemIssue #892: both Claude and Codex plugin trees each committed a full ~10 MB What I testedNothing live. Environment gate failed before worktree / test-app / bind. Environment
Expected vs actual
Alternate paths
Evidence
Open risks / next stepReconnect Anton's Mac (Grok Bot desktop app → Agent → Execution on Local Computer not "Never allowed", full quit Cmd+Q and reopen). Re-run will dogfood this head once the Mac appears in |
|
Verdict: FAILED at exact head Phases this completion run covered: Desktop NOT RUN (supported isolation blocker) · Android NOT RUN (owned emulator exited before Acceptance remains NO-GO. Missing Android public-tool proof is not waived. CLI is not Desktop. Desktop Codex — NOT RUNTried the public product surfaces only. Did not launch the GUI and did not mutate the real Desktop home.
Missing: a first-party documented Desktop launch that isolates both Electron userData and plugin/config state. Real Android — NOT RUNRan in parallel with #1034 (that lane kept The owned qemu started, passed the emulator compatibility checks, created a window, printed SwiftShader/ANGLE GPU lines, then exited before Host at first boot: load ~41 with another qemu live; earlier in the session load spiked above 80 on a 32 GB machine. Owned AVD and worktree were removed; foreign inventories were unchanged. Upgrade — outstandingNo version bump and no reinstall workaround in this run. The recorded 1.0.8→1.0.8 Claude |
|
FAILED — QA input-correction experiment for #1037 at Binding the existing Expo Dev Client URL before the owned Android build did not produce a visible app result from the original saved action. This is evidence for the captain, not a merge gate. No approval or merge decision. No product source was patched. Twin comparison (the deliverable). The identical correction on #1034 already survived as FAILED. This independent second data point MATCHES that stage and symptom: What changed vs prior Android runs on this PR. Previous exact-head Android bound the device without a URL, then built, then pinned (pin succeeded; action then dropped to the picker). This run called Unchanged action YAML sha256 Picker-first and iOS, CLI/reporting, and Desktop were NOT RUN (preserved / out of scope). Foreign iOS simulators and the attached USB phone were not touched. Owned emulator and Metro were removed; package scripts restored to The bind-first input correction did not avoid the Android saved-action wall on this PR. No product patch is justified from this run. |






Intent
Captain (2026-09-14): "Pickup the next issue: #892" - "cleanup: one committed host dist + thin plugin manifests instead of two 10 MB copies". In the issue's words: both plugin trees each commit a full ~10 MB rn-dev-agent-core/dist copy (claude + codex), regenerated on every core PR; the committed bundle is load-bearing (marketplace installs run it, verified in PR 871 QA) so deletion is not an option, but two identical copies double every diff, review surface and drift risk. Proposed: commit one canonical host dist and make each plugin dir a thin manifest that references it (or copy it at pack/publish time); keep the dist-freshness CI check pointed at the single copy. Acceptance: one committed dist; both plugins install and run from it; check-dist-fresh covers it; the repo sheds ~10 MB of duplicated artifact per revision. The architect's accepted design: GO for one physically contained common root - packages/claude-plugin stays the distribution directory for BOTH marketplaces (Claude and Codex installers copy a real directory and skip symlinks, so links are out), carrying .claude-plugin/plugin.json and a generated .codex-plugin/plugin.json plus codex.mcp.json, bin/, codex-skills/, codex-commands/, codex-agents/, codex-templates/, one committed rn-dev-agent-core/dist with neutral rn-dev-agent-core package metadata; packages/codex-plugin becomes authoring material, not an installation directory; no npm publication, no distribution branch, no runtime downloads.
What Changed
packages/claude-pluginbecomes the single directory both marketplaces install: it now also carries the generated.codex-plugin/plugin.json,codex.mcp.json,bin/cdp-supervisor.js+bin/plugin-health.jslaunchers and thecodex-skills/,codex-commands/,codex-agents/,codex-templates/adapters, and.agents/plugins/marketplace.jsonpoints the Codex entry at it instead ofpackages/codex-plugin.packages/codex-pluginruntime — itsrn-dev-agent-core/distcopy, generatedscripts/(including the imported rn-fast-runner/rn-android-runner trees kept underpackages/claude-plugin/scripts),runner-manifest.jsonandCLAUDE-MD-TEMPLATE.md— leaving that package as authoring material only; the committed core package metadata is host-neutralrn-dev-agent-core, andproduct-version.tsdrops the per-host*-claude-runtime/*-codex-runtimepackage names and their manifest-ordering branches.build-host-runtimes.tsemits the single package,check-dist-fresh.shscopes porcelain to every generated path and fails if any secondpackages/*/rn-dev-agent-core/distis tracked or the dist is a symlink,release.ymlgenerates/validates onerunner-manifest.jsoncopy via--plugin-manifest, and.gitattributes/.gitignore/sync + check scripts, tests, READMEs and docs-site pages follow the new layout.Risk Assessment
Testing
I validated GH-892 by simulating both marketplace installs from the exact committed bytes of packages/claude-plugin and driving a real MCP session against each: the Claude manifest's supervisor.js path and the Codex codex.mcp.json launcher (discovering its root via CODEX_HOME) both start rn-dev-agent-cdp-bridge 1.0.8, expose the same 81 tools, and answer a live cdp_status call with the neutral package's product version, with the Codex health CLI and the bundled learned-actions CLI also running from those roots. Alongside that I confirmed only one host dist is tracked and codex-plugin holds no runtime artifacts, measured the 10.9 MB tracked-size drop, ran the full real check-dist-fresh gate on the repo (clean rebuild matched the committed bundle byte-for-byte, worktree stayed clean), ran the four packaging guard regression suites (60 cases, including the new "second tracked host dist fails" case), and ran the 163 core unit tests touched by the change — everything passed with no failures, flakes, or setup problems. There is no UI surface in this change, so no screenshots or rendered artifacts apply; the end-user surfaces are MCP tool responses and CLI output, which I captured as transcripts in the evidence directory. Temporary install roots were removed; the only rebuilt output is the gitignored packages/rn-dev-agent-core/dist that the gate regenerates by design.
Evidence: Both hosts install and run from the single committed dist (MCP initialize, tools/list, live cdp_status, health CLI)
Evidence: CI guard coverage for the single dist (check-dist-fresh regression suite + real gate + package sync)
Evidence: Live MCP handshake through both installed hosts
Evidence: Single committed dist + size shed + real dist-fresh gate
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
packages/shared-agent-knowledge/skills/using-rn-dev-agent/SKILL.md:28- The shippedusing-rn-dev-agentskill still documents the pre-change Codex install surface: "Codex local development points at/path/to/rn-dev-agent/packages/codex-plugin. Codex loads.codex-plugin/plugin.json, package-local shared skills inskills/, and the samecdpMCP server from.mcp.json." All three facts are now false. Concrete failure: a Claude session loads this skill (it is listed inpackages/claude-plugin/plugin.jsonand is the designated "front door" routing skill), and instructs the user to registerpackages/codex-pluginwith Codex. That directory no longer containsrn-dev-agent-core/dist/,codex-skills/,codex.mcp.json, or abin/plugin-health.js(all removed in this branch;scripts/check-agent-package-sync.sh:326-331now asserts they must NOT exist), so the registration yields a plugin with no MCP runtime and no discoverable skills. The identical sentence was correctly rewritten in the Codex adaptation (packages/codex-plugin/skills/using-rn-dev-agent/SKILL.md:20-21),README.md:269,apps/docs-site/.../getting-started.mdx:78, andtroubleshooting.mdx:92— only the canonical shared copy and its Claude byte-mirror (packages/claude-plugin/skills/using-rn-dev-agent/SKILL.md:28, byte-identical, enforced bycheck-agent-package-sync.sh) were missed. Fix both files together so the sync guard stays green: point Codex local development at/path/to/rn-dev-agent/packages/claude-plugin, and namecodex-skills/andcodex.mcp.json.packages/codex-plugin/.codex-plugin/plugin.json:25- New in this change:"hooks": {"hooks": {}}is the sole mechanism keeping Codex from discoveringpackages/claude-plugin/hooks/hooks.json, which now ships inside the very directory Codex installs (it declares SessionStart/PostToolUse/CwdChanged command hooks). Before this change the Codex install root had nohooks/directory at all, so this exposure is newly created. The assertion that the inline empty object suppresses discovery is only checked by re-reading the manifest (gh-575-codex-workflows.test.ts:52-56,check-agent-package-sync.sh:453-456), never by a real Codex load. Blast radius is bounded — every hook command is${CLAUDE_PLUGIN_ROOT}/hooks/..., which Codex does not set, so a discovered hook would resolve to an absolute/hooks/...and fail rather than execute plugin code — but it would surface as per-session hook errors in Codex. Worth one livecodex plugin add+ detail-screen check ("No plugin hooks") before release; no source change implied.packages/rn-dev-agent-core/src/session/product-version.ts:12- Renaming the packaged runtime to the neutralrn-dev-agent-core(build-host-runtimes.ts:244) leavesEXECUTING_CORE_PACKAGE_NAMESentriesrn-dev-agent-core-claude-runtime/rn-dev-agent-core-codex-runtimeand their four dedicated branches inlaunchingHostManifestCandidates()(lines 75-81) andpluginManifestCandidates()(lines 94-99) unreachable in any shipped artifact:git ls-filesnow tracks exactly onern-dev-agent-core/dist, and its sibling package.json carries the neutral name. These names cannot reappear from an older install either, since such an install runs its own bundled copy of this file. The branches survive only becausegh-1025-status-product-version.test.tsstill builds fixtures with the legacy names. Smallest honest remedy is removing the two legacy names and collapsing the three-way branch to the neutral ordering, dropping the corresponding fixtures. Kept as info because the dead code is inert and removal is optional cleanup, not a correctness fix. (The analogouscodex-launcherbranch inproof-capture.ts:452-465is NOT dead by the same argument — it resolves against an arbitrary candidate checkout, which may legitimately be an older SHA with the old layout, exactly as the reworked fixture ingh-588-proof-dual-authority.test.ts:79-91now documents.)packages/rn-dev-agent-core/test/unit/gh-590-codex-feedback.test.ts:109- After the path rewrite,codexCollectorandclaudeCollectorboth readpackages/claude-plugin/scripts/collect-feedback.sh, soassert.equal(codexCollector, canonicalCollector)andassert.equal(claudeCollector, canonicalCollector)(lines 115-116) are the same assertion made twice against the same bytes. Harmless, but it now reads as if two independent packaged copies were being verified when only one exists. Collapse to a single read/assertion.🔧 Fix: drop dead host-runtime branches, fix stale Codex install docs
2 infos still open:
packages/claude-plugin/.claude-plugin/plugin.json:22- New in this change: 28 Codex skill directories (packages/claude-plugin/codex-skills/*/SKILL.md) now ship inside the very directory Claude Code installs. Before this change the Claude install root contained no codex-skills/ at all, so this exposure is newly created. The only thing keeping them out of a Claude session is the explicit"skills": [...]array at line 22, which enumerates exactly the 11./skills/<name>paths. That is a real, source-proven control (Claude's default discovery root is./skills/, andcodex-skillsis a different directory name), and the same control correctly scopescommands/agentsaway fromcodex-commands//codex-agents/. I am NOT claiming it fails — I have no source in this repo for Claude Code's plugin loader, and the instructions forbid inferring a defect from absence. Flagging only because the blast radius would be user-visible if the loader also globbed**/SKILL.md: 28 extra entries per session whose bodies instruct$rn-dev-agent:<workflow>invocation syntax that does not exist in Claude. This is the exact mirror of the hooks-suppression tradeoff you already accepted (Codex discoveringhooks/), and the author neutralized that side explicitly viahooks: {hooks: {}}. One liveclaude --plugin-dir /path/to/rn-dev-agent+/helpskill-list check before release closes it. No source change implied.packages/rn-dev-agent-core/src/session/product-version.ts:74- After the single-distribution-root move, two of the four entries the rewrittenpluginManifestCandidates()returns can no longer be reached by any shipped or repo layout. Candidate 2 (<hostRoot>/.codex-plugin/plugin.json) is only consulted when candidate 1 (<hostRoot>/.claude-plugin/plugin.json) is absent — butcheck-agent-package-sync.sh:250-252now requires BOTH manifests to exist side by side inpackages/claude-plugin, andsync-versions.sh:31-32keeps their versions equal, so candidate 1 always hits first. Candidate 4 (<hostRoot>/codex-plugin/.codex-plugin/plugin.json) is only consulted when candidate 3 (<hostRoot>/claude-plugin/.claude-plugin/plugin.json) is absent — in the repo-source casehostRootispackages/, whereclaude-plugin/.claude-plugin/plugin.jsonis a required tracked file. An older marketplace install cannot revive either branch, since such an install executes its own bundled copy of this file. Purely inert dead code, not a correctness defect: both hosts already resolve correctly through the env candidates inlaunchingHostManifestCandidates()(Claude viaCLAUDE_PLUGIN_ROOTwith the Codex hints blanked by the newmcpServers.cdp.envblock, Codex viaRN_DEV_AGENT_CODEX_PLUGIN_ROOTset bybin/cdp-supervisor.js:52). Marked no-op rather than a cleanup request because you already scoped the dead-branch removal in this exact function last round and deliberately drew the line where you drew it; noting it only so the remaining inertness is on record.✅ **Test** - passed
✅ No issues found.
git ls-tree -r --name-only d76a9e2a|e587136a | grep rn-dev-agent-core/dist/— confirmed two tracked host dist copies collapse to onegit ls-tree -r -lbyte totals on both commits — tracked repo size 47.7 MB -> 36.7 MB (-10.9 MB)Staged both installs from the committed bytes:git archive HEAD packages/claude-plugin | tar -xthencp -Rinto a fake Claude marketplace root and a fake$CODEX_HOME/plugins/cache/<marketplace>/rn-dev-agent/1.0.8;find -type lconfirmed no symlinksLive MCP stdio session against the Claude install root using the command read from the installed.claude-plugin/plugin.json(initialize+tools/list) — rn-dev-agent-cdp-bridge 1.0.8, 81 toolsLive MCP stdio session against the Codex install root using.codex-plugin/plugin.json->codex.mcp.jsonlauncher with onlyCODEX_HOMEset andRN_DEV_AGENT_CODEX_PLUGIN_ROOTempty (forces real cache discovery) — rn-dev-agent-cdp-bridge 1.0.8, 81 toolstools/call cdp_statusthrough each installed host — both return{"product":{"coreVersion":"1.0.8"}}, exercising the reworked neutral-package product-version resolutionnode bin/plugin-health.jsfrom the Codex install root — "Disk, registration, and contract are healthy"node <root>/rn-dev-agent-core/dist/learned-actions.js --jsonfrom both install rootsResolved every path named by the corrected Codex bullet inside the install root:.codex-plugin/plugin.json,codex-skills/(28),codex.mcp.json,codex-commands/(17),codex-agents/(6)shasum -a256byte-mirror check ofpackages/shared-agent-knowledge/skills/using-rn-dev-agent/SKILL.mdvspackages/claude-plugin/skills/using-rn-dev-agent/SKILL.mdbash scripts/test/check-dist-fresh.test.sh— 17/17 including the newsecond tracked host dist failscasebash scripts/check-dist-fresh.sh(real repo gate: wipe core dist,corepack yarn build,build:web,node scripts/build-host-runtimes.ts, porcelain diff, npm pack check) — "dist fresh",git status --porcelainempty afterwardsbash scripts/check-agent-package-sync.shon the real repobash scripts/test/check-agent-package-sync.test.sh,check-core-dist-contract.test.sh,check-typescript-only.test.sh,check-web-bundle.test.sh— 43 further guard casesnode --teston the core units touched by the change:gh-575-codex-workflows,gh-590-codex-feedback,session/gh-1025-status-product-version,runtime-paths,runner-manifest-publication,gh-588-proof-dual-authority,gh-525-feedback-packaging,gh-575-build-helper,gh-575-snapshot-helper,session/process-birth— 163 pass / 0 fail✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.