portable manifest adapters (GRO-353) - #9
Open
teallarson wants to merge 27 commits into
Open
teallarson wants to merge 27 commits into
teallarson wants to merge 27 commits into
Conversation
Wire the Codex adapter manifest and SubagentStart hook so Codex installs load the same routing hooks as Claude Code, with install and trust docs updated. Co-authored-by: Cursor <cursoragent@cursor.com>
Expand subagent guidance to the full routing marker set, add invalid-stdin fallback parity with session-start, and enforce marker coverage in CI. Co-authored-by: Cursor <cursoragent@cursor.com>
2 tasks
teallarson
marked this pull request as ready for review
September 15, 2026 15:11
Wire skills into the Codex adapter manifest, clarify which clients run each hook event, simplify subagent-start stdin handling, and lock the broad SubagentStart matcher in tests. Co-authored-by: Cursor <cursoragent@cursor.com>
Adopt the review template from ArcadeAI/monorepo #4127 so new pull requests open with What/why, Codebase changes, and Additional notes sections. Co-authored-by: Cursor <cursoragent@cursor.com>
teallarson
marked this pull request as draft
September 15, 2026 15:32
Split Codex lifecycle hooks into clients/codex/hooks/hooks.json so Claude Code no longer loads SubagentStart, and enforce the per-client manifest pattern in check.mjs and ARCHITECTURE. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
Author
|
@BugBot review |
Codex auto-discovers hooks/hooks.json but ignores .codex-plugin hook arrays when the Agent Plugins root manifest is present. Move SubagentStart into com.openai/hooks/hooks.json with PLUGIN_ROOT, add clear to SessionStart, and drop the unreachable clients/codex adapter. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
Author
|
@BugBot review |
Declare com.openai/hooks/hooks.json alongside hooks/hooks.json in .codex-plugin so Codex registers SubagentStart without adding it to the Claude manifest. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
Author
|
@BugBot review |
Single contract file now drives all host manifests, inventory digests, and identity metadata. Generator runs in verify via generate:check; version bumps regenerate manifests instead of patching five files by hand. Co-authored-by: Cursor <cursoragent@cursor.com>
Codex plugins cannot bundle custom agent roles yet; point users at try-arcade and SubagentStart routing instead of a manual TOML install step. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
Author
|
@BugBot review |
Extend inventory.json with hook_manifests digests so generate:check catches drift on hooks/hooks.json and per-host adapter manifests. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
Author
|
@BugBot review |
Cursor-only .cursor/rules/hooks-adapters.mdc does not reach Claude Code or Codex contributors. AGENTS.md is the cross-host maintainer entry point. Co-authored-by: Cursor <cursoragent@cursor.com>
teallarson
marked this pull request as ready for review
September 15, 2026 20:41
The portable manifest generator dropped listing fields when the contract stack was removed. Codex and Cursor now show "Arcade" again, matching the Claude marketplace listing. Co-authored-by: Cursor <cursoragent@cursor.com>
* Stop agent fallback when Arcade gateway needs auth. Add gateway-auth guardrails across try-arcade, arcade-operator, routing guidance, and the Cursor rule, plus a beforeSubmitPrompt hook so Cursor gets the same per-turn reminder Claude already has. Co-authored-by: Cursor <cursoragent@cursor.com> * Use host-agnostic auth wording in shared session context. SESSION_CONTEXT is injected into both Cursor and Claude SessionStart hooks; referring to Cursor only sent Claude users to the wrong place. Co-authored-by: Cursor <cursoragent@cursor.com> * Remove Cursor beforeSubmitPrompt hook that cannot inject context. Cursor's beforeSubmitPrompt only allows or blocks prompts; additional_context is ignored. Per-turn needsAuth guidance stays on the always-apply arcade rule. Co-authored-by: Cursor <cursoragent@cursor.com> * Extend needsAuth guardrails to subagent routing context. Rebase onto GRO-353 so SUBAGENT_CONTEXT includes the same no-substitute auth block as session and prompt guidance, keeping CI marker checks green. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: distinguish auth from gateway failures --------- Co-authored-by: Cursor <cursoragent@cursor.com>
Align Codex SessionStart with fork, vendored Codex I/O schemas, adapter manifest validation, support-matrix capabilities data, and verify:codex/cursor gates so client wiring drift fails CI before review. Co-authored-by: Cursor <cursoragent@cursor.com>
Wire Claude SubagentStart, rename commands to arcade-* slugs, expose Codex listing metadata via extensions.com.openai.interface, and sync support matrix with machine-readable capabilities plus generated Cursor repository field. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
Author
|
@BugBot review |
1 similar comment
Contributor
Author
|
@BugBot review |
Contributor
Author
|
@cursor review |
Keep polling when Bugbot returns neutral due to a push race so the gate waits for a fresh review instead of failing immediately. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
Author
|
@cursor review |
Skip routing injection when agent_type is arcade-operator, wire the full local verify gate into GitHub Actions, and add hook contract coverage. Co-authored-by: Cursor <cursoragent@cursor.com>
Parse Bugbot check-run JSON with jq so multiline summaries survive, and treat neutral runs that report no issues as pass for the complete job. Co-authored-by: Cursor <cursoragent@cursor.com>
Run wired Codex, Claude, and Cursor hook commands with substituted plugin-root tokens in verify, and ignore docs/research/ so audit notes stay local. Co-authored-by: Cursor <cursoragent@cursor.com>
Document Codex plugin add and @arcade skill invocation, native Claude marketplace paths, reliable Cursor local install, and corrected VS Code and Copilot hook notes. Co-authored-by: Cursor <cursoragent@cursor.com>
…view. Align adapter schemas with parseVersion suffix support, copy extensions.com.openai.interface into the Codex fallback manifest, guard README hook counts in CI, and dedupe the verify chain. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
Author
|
@BugBot review |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 71e7b19. Configure here.
The plugins CLI (v1.3.4) rejects --target copilot. Valid slug is github-copilot. Align README and copilot install guide with measured CLI behavior. Co-authored-by: Teal Larson <LARSON.TEAL@GMAIL.COM>
Codex 0.154.0 skips plugin hooks for Agent Plugin packages (openai/codex#39895). Park the full Codex hook adapter on branch cursor/park-codex-hooks-gro-353-f8ad and merge the rest of GRO-353 now. This branch keeps manifest generation, Claude/Cursor lifecycle hooks, Copilot operator projection, and extensions.com.openai.interface listing metadata. Docs and support matrix no longer claim Codex hooks are active. Use @arcade and bundled skills for Codex routing until upstream fixes the loader gap. Co-authored-by: Teal Larson <LARSON.TEAL@GMAIL.COM>
Incorporate binary repro from Codex 0.154.0: manifest parsing works for extensions.com.openai and .codex-plugin fallback, but loader.rs discards hook_sources for AgentPlugin format. Document #37027 as the introducing change and note we do not ship the $schema-removal workaround. Co-authored-by: Teal Larson <LARSON.TEAL@GMAIL.COM>
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.

Linear ticket: GRO-353
What/why
Arcade’s plugin ships one portable core (skills, MCP gateway config, identity) and small per-host “adapter manifests” that tell each client where to find those pieces. Cursor, Claude, and Codex read different files, path styles, and hook formats, so maintaining five copies by hand caused version drift. This PR makes root
plugin.jsonandmcp.jsonthe source of truth, generates the host adapter JSON from them on release, and adds the intended Codex / ChatGPT lifecycle-hook adapter. A manual smoke test found that Codex CLI 0.154.0 does not load hooks from an Agent Plugin root, so the Codex hook path still needs a packaging decision before merge.For Codex specifically, the plugin still cannot bundle the custom
arcade-operatoragent role (an OpenAI platform limit). This branch definesSessionStart,UserPromptSubmit, andSubagentStarthooks, but current Codex does not discover them from the portable Agent Plugin package. Claude Code and Cowork get the same three lifecycle hooks fromhooks/hooks.json, includingSubagentStartfor built-in subagents whenarcade-operatoris not used. Shippingarcade-operatoritself remains available on Cursor, Claude Code, and Copilot CLI.The intended Codex smoke test is: install the branch, trust hooks via
/hooks, and confirm session routing guidance appears. The install resolves the skills, MCP config, and generated fallback manifest, but Codex 0.154.0 reports zero installed hooks forSessionStart,UserPromptSubmit, andSubagentStart. The generated adapter manifests do show the product nameArcadeinstead of the internal idarcade, and the Codex fallback manifest mirrorsextensions.com.openai.interface.Codebase changes
plugin.json,mcp.json,skills/, andVERSIONstay authoritative;scripts/generate-manifests.mjswrites Cursor, Claude, marketplace, and Codex adapter projections, andnpm run generate:checkfails CI if they drift.hooks.jsonfiles stay explicit per client (hooks/hooks.jsonfor Claude lifecycle hooks,clients/cursor/hooks/hooks.jsonfor Cursor session hooks,com.openai/hooks/hooks.jsonfor Codex lifecycle hooks).scripts/check.mjsenforces the split and rejects Codex-only wiring in the Claude manifest.plugin.jsonselectscom.openai/hooks/hooks.json;.codex-plugin/plugin.jsonmirrorsextensions.com.openai.interfaceand the hooks path for older loaders. Commands use Codex’s${PLUGIN_ROOT}variable..cursor-plugin/plugin.jsonkeeps top-leveldisplayName: "Arcade". The Codex fallback manifest copies the fullinterfaceobject fromextensions.com.openai.interface, matching the OpenAI plugin contract.extra-files, and manifest tests updated; the prior contract/hash inventory layer was removed in favor of generate + validate. README hook counts are checked againstdocs/support-matrix.capabilities.json.Additional notes
#10 is already merged into this branch. #11 remains a draft stacked on #9 and should merge after #9.
npm run verifypasses locally (61 tests), andcheck,complete, and Cursor Bugbot are green ondd58ed1. Deeper maintainer detail lives inARCHITECTURE.md(portable contract → generate → validate) andAGENTS.md(hook adapter table).Manual Codex smoke — blocked (2026-09-17, Codex CLI 0.154.0)
/hooksreports 0 installed and 0 active hooks forSessionStart,UserPromptSubmit, andSubagentStart.codex execsession with hook trust bypassed ran none of the branch's hook commands.loader.rs.Note
Medium Risk
Broad changes to agent routing, auth failure handling, and multi-client manifest generation; incorrect guidance could block legitimate fallbacks, but scope is plugin packaging and prompts rather than credentials or gateway code.
Overview
This PR makes root
plugin.jsonandmcp.jsonthe portable source of truth and addsscripts/generate-manifests.mjsso Cursor, Claude, marketplace, Codex listing fallback, client MCP adapters, andcom.github.copilot/agents/arcade-operator.agent.mdstay in sync vianpm run generate/generate:check. Rootplugin.jsongainsextensions.com.openai.interface; generated.codex-plugin/plugin.jsonmirrors it for legacy loaders—Codex lifecycle hooks are explicitly not shipped (documented upstream blocker; hook work parked on another branch).Claude gets a third lifecycle hook (
SubagentStart+subagent-start.mjs, widerSessionStartmatchers, 5s timeouts). Cursor session hooks pick up the same timeout. Shared routing guidance,arcade-operator,try-arcade, and the Cursor rule now treat gatewayneedsAuthvs missing/failing MCP separately and forbid substituting other connectors (including Cursor’splugin-arcade-arcadenamespace).CI collapses to
npm run verifywith JSON Schema contracts for host adapters, hook stdout/manifest smoke tests,docs/support-matrix.capabilities.json, and Codex/Cursor adapter checks; install docs andARCHITECTURE.md/AGENTS.mddescribe the generate→validate model.Reviewed by Cursor Bugbot for commit afd2e87. Bugbot is set up for automated code reviews on this repo. Configure here.