Repository navigation
Track Codex plugin manifest, hooks, marketplace, and policy parity #188
Copy link
Copy link
Closed
Labels
enhancementNew feature or requestNew feature or requesthost-integrationAgent host capabilities, projection, discovery, and lifecycleAgent host capabilities, projection, discovery, and lifecyclemeta-frameworkAgent Bundle compiler-coupled meta-frameworkAgent Bundle compiler-coupled meta-framework
Description
Summary
Documentation-coverage follow-up for the current Codex plugin system observed on 2026-09-01. This is the Codex-specific child of #100/#107. It excludes Skill IR work already tracked by #108, canonical event-family routing on #97, schema adoption on #133, and end-user installation on #181/#101.
The current adapter emits .codex-plugin/plugin.json, .mcp.json, hooks/hooks.json, skills, and a local marketplace through packages/agent-bundle/src/adapters/codex.ts, but its pinned schema/capability record only models a subset of the now-documented surface.
Sources
Observed 2026-09-01:
- https://learn.chatgpt.com/docs/plugins
- https://learn.chatgpt.com/docs/build-plugins
- https://learn.chatgpt.com/docs/build-skills
- https://learn.chatgpt.com/docs/hooks
- https://learn.chatgpt.com/docs/enterprise/managed-configuration
- https://learn.chatgpt.com/docs/developer-commands?surface=cli
- https://developers.openai.com/plugins/concepts/plugins
- https://developers.openai.com/plugins/build/plugins
- https://developers.openai.com/plugins/build/mcp-server
- https://developers.openai.com/plugins/deploy/submission
- https://github.com/openai/codex/tree/main/codex-rs/hooks/schema/generated
Checklist
Every item must become implemented, explicitly delegated, or recorded in the Codex capability table as unavailable/deferred with a reason.
Manifest/package
- Full
.codex-plugin/plugin.jsonmetadata (authordetails, homepage, repository, license, keywords) - Complete
interfacefields: display/short/long descriptions, developer, category, capabilities, legal/site URLs, starter prompts, brand color, icons/logo/screenshots -
apps/.app.jsonregistered MCP mapping compatibility surface -
mcpServers,skills, andhooksas documented path forms; hooks allow path, path array, inline object, or inline-object array - Optional assets and submission-facing package constraints
- MCP server policy under
plugins.<plugin>.mcp_servers.<server>(enabled/tools/approval modes) -
PLUGIN_ROOT/PLUGIN_DATAplusCLAUDE_PLUGIN_ROOT/CLAUDE_PLUGIN_DATAcompatibility environment
Hook contract
- Pin the release-documented events:
SessionStart,SessionEnd,PreToolUse,PermissionRequest,PostToolUse,PreCompact,PostCompact,UserPromptSubmit,SubagentStart,SubagentStop, andStop - Credit the running SubagentStart/SubagentStop correction lane; do not reimplement it here
- Reconcile generated-schema-only
Interruptas deferred until the release behavior docs support it - Support or explicitly reject handler types:
commandandmcp_tool; keep parsed-but-skippedprompt/agenttruthful -
mcp_toolstructured input expansion, connected-server requirement, synchronous/non-recursive execution, and timeout behavior -
asynccommand hooks, eight-per-session concurrency, cancellation at session end, and non-controlling output rules -
additionalContextLimitspill behavior and configuration diagnostics -
commandWindows/command_windows,statusMessage, and per-event timeout rules - Exact matcher semantics by event, including ignored matchers,
apply_patchaliases (Edit/Write), local-function coverage, and hosted-tool exclusions - Trust-by-current-hash review,
/hookscontrol, plugin hooks skipped until trusted, managed hooks immutable - Validate event I/O against the generated schemas under
codex-rs/hooks/schema/generatedrather than the current open-ended event map
Marketplace/install/policy
- Repo/personal marketplace discovery and legacy
.claude-plugin/marketplace.jsoncompatibility - Local, Git root, git-subdir, and npm sources; path containment, ref/SHA, lifecycle-script prohibition, and unresolved-entry behavior
- Marketplace
interface, pluginpolicy.installation,policy.authentication, category, cache layout, and enable state inconfig.toml - CLI
codex pluginadd/list/remove and marketplace add/list/upgrade/remove JSON contracts -
features.plugins,features.hooks, deprecatedcodex_hooks, inline[hooks], and managedrequirements.toml -
allow_managed_hooks_onlyand marketplacerestrict_to_allowed_sourcesbehavior - Public submission/publish controls and requirements are documented as distribution policy, not claimed as local compiler behavior
Acceptance
- No documented Codex surface remains implicit: each has a four-state capability row with dated evidence.
- Requested unsupported behavior fails before publication rather than being dropped by permissive schemas.
- Compile semantic Agent event routes into native host hooks #97 owns canonical event-route expansion; this issue owns native Codex manifest/hook/lifecycle fidelity.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or requesthost-integrationAgent host capabilities, projection, discovery, and lifecycleAgent host capabilities, projection, discovery, and lifecyclemeta-frameworkAgent Bundle compiler-coupled meta-frameworkAgent Bundle compiler-coupled meta-framework
Activity
ScriptedAlchemy commentedon Sep 1, 2026
Two overview-level capabilities also need explicit status rows:
.app.jsonregistered-connection mapping remains separate and is already in this issue.Source: https://learn.chatgpt.com/docs/plugins (read 2026-09-01).
ScriptedAlchemy commentedon Sep 2, 2026
Decision (2026-09-01): systematic parity pass adopted — every stable documented surface gets implemented, host by host, Claude (#187) first. Recorded gate deferrals (e.g. G5 agents via #220) stand unless explicitly lifted. Slice 1 of #187 is in flight. Queued after #187 slices.
ScriptedAlchemy commentedon Sep 2, 2026
Codex relevance from the Agent Plugins adoption work: the
portabletarget now carries pinned Agent Plugins 1.0.0 evidence (spec repoagentplugins/agent-plugins-spec@ff8ab5e39), and Codex is on the standard's native-client roster, so the portable artifact is the natural Codex-facing package for skills+MCP. Note the known precedence hazard remains: Codex prioritizes a rootplugin.json, which is why the multi-hostplugintarget still deliberately omits one — Codex consumers should take theportableartifact (or the dedicatedcodextarget for sidecar-enriched skills), not a hybrid. The portable emission is validated against the pinned spec schemas at build time with a repeatable installer/filesystem proof in CI.ScriptedAlchemy commentedon Sep 3, 2026
Starting the systematic Codex parity pass (same slice discipline as the #187 Claude pass, which is now closed). Baseline:
codex.tsadapter revision 1.2.0, capability tablecodex-0.147.0.json, pinned schemas underschemas/codex/including the generated app-server hook schemas; localcodex-cli 0.147.0on PATH for native probes. Codex publishes noplugin validatecommand (recorded in the capability table), so native proofs take the form of CLI lifecycle probes in isolated homes,app-server generate-json-schemacomparisons, and config/cache inspection rather than validator runs.Slice plan:
.codex-plugin/plugin.jsonmetadata (authordetails, homepage, repository, license, keywords), documented component path forms (mcpServers,skills,hooksas path / path array / inline object / inline-object array), and optional assets + submission-facing package constraints.interfacefields (display/short/long descriptions, developer, category, capabilities, legal/site URLs, starter prompts, brand color, icons/logo/screenshots),apps/.app.jsonregistered-MCP compatibility surface, MCP server policy underplugins.<plugin>.mcp_servers.<server>(enabled/tools/approval modes), and thePLUGIN_ROOT/PLUGIN_DATA+CLAUDE_PLUGIN_ROOT/CLAUDE_PLUGIN_DATAcompatibility environment.Interruptas deferred; handler types (command/mcp_toolsupported,prompt/agentkept truthfully parsed-but-skipped); validate event I/O against the generated schemas undercodex-rs/hooks/schema/generatedinstead of the open-ended event map. Credits the running SubagentStart/SubagentStop correction lane without reimplementing it.mcp_toolstructured input expansion, connected-server requirement, synchronous/non-recursive execution and timeouts;asynccommand hooks (eight-per-session concurrency, session-end cancellation, non-controlling output);additionalContextLimitspill behavior;commandWindows/command_windows,statusMessage, per-event timeout rules; exact matcher semantics by event (ignored matchers,apply_patchaliases, local-function coverage, hosted-tool exclusions); trust-by-current-hash,/hookscontrol, plugin-hooks-skipped-until-trusted, managed hooks immutable..claude-plugin/marketplace.jsoncompatibility; source matrix (local, git root, git-subdir, npm; path containment, ref/SHA, lifecycle-script prohibition, unresolved-entry behavior); marketplaceinterface, pluginpolicy.installation/policy.authentication, category, cache layout, enable state inconfig.toml.codex pluginadd/list/remove and marketplace add/list/upgrade/remove JSON contracts;features.plugins,features.hooks, deprecatedcodex_hooks, inline[hooks], managedrequirements.toml;allow_managed_hooks_onlyandrestrict_to_allowed_sources; submission/publish controls recorded as distribution policy, not claimed as local compiler behavior.Conventions carried over from the Claude pass:
codex.*dotted diagnostics only; every capability row four-state with dated (retrieved) evidence citing the specific documented behavior; closed schemas pinned in PROVENANCE with byte/sha pins; honest tightenings recorded; serialadapterRevisionadjudication; all gates run locally per PR (scoped suites + native Codex probes + typecheck + lint).Progress will be checked off on the issue checklist per slice with a remaining-slice status after each.
ScriptedAlchemy commentedon Sep 3, 2026
Slice 1 (manifest/package) — merged
15a7854de): full.codex-plugin/plugin.jsonmetadata (authorobject,homepage,repository,license,keywords) with closedcodex.manifest.*compile-time validation; pinnedplugin.schema.jsonwidened to the documented component path forms formcpServers/skills/hooks(path, path array, inline object, inline-object array);manifestPackagecapability rows (manifest metadata, paths, optional assets, submission policy — submission recorded as distribution policy, not compiler behavior). First native Codex proofs: registers/installs/lists an emitted plugin with authored metadata against real codex-cli 0.147.0 (--jsoncontracts pinned; metadata not echoed byplugin list).9e941160b): completeinterfaceinstall-surface block (identity, descriptions, developer, category/capabilities, legal/site URLs, starter prompts, six-digit brand color, plugin-root-contained icons/logo,./assets/-relative PNG screenshots) viacodex.interface.*diagnostics;appsregistered-MCP mappings emitted as.app.json(pinnedapp.schema.json,codex.apps.*diagnostics); capability rows for the install-time MCP approval policy underplugins.<plugin>.mcp_servers.<server>(unavailable: enforced by the host at install, not a compile artifact) and the hook compatibility environment (PLUGIN_ROOT,PLUGIN_DATA,CLAUDE_PLUGIN_ROOT,CLAUDE_PLUGIN_DATA— supported with dated hook-doc evidence). Native proof installs and lists a full-interface plugin and pins that the 0.147.0 CLI has noplugin validatesubcommand.Revisions: codex adapter 1.3.0 → 1.5.0, unified plugin 1.18.0 → 1.20.0 (serialized over the #351 events lane, which took 1.4.0/1.19.0 mid-slice). Unified rows keep the established convention: every Codex-only surface intersects to an honest
unavailablefor the other hosts.Orchestrator interventions this slice: rebased PR #352 over #350 + #351 (both landed mid-flight) resolving 7-file conflicts; corrected the unified adapter from pass-through Codex rows to intersections; deduplicated the second
runCodexhelper onto the stdout/stderr shape; serialized both adapter revisions past the events lane.Remaining slices
Interrupt), handler types (command/mcp_tool, truthful parsed-but-skippedprompt/agent),mcp_toolexpansion/timeout,asyncconcurrency rules,additionalContextLimit,commandWindows/statusMessage/timeouts, exact matcher semantics, trust gates, generated-schema I/O validation..claude-plugin/marketplace.jsoncompat, source forms with containment/ref/lifecycle-script rules,config.tomlpolicy/cache/enable state, CLI JSON contracts, feature flags + managedrequirements.toml,allow_managed_hooks_only/restrict_to_allowed_sources, submission-as-policy.feat(codex): pin the release hook contract, handler types, and genera…
feat(codex): author marketplace policy and record distribution/instal…
fix(codex): accept any JSON tool_input/tool_response on Codex tool ho…
feat(codex): marketplace source matrix, install policy, and distribut…
feat(codex): record plugins-overview parts (MCP UI, browser extension…
ScriptedAlchemy commentedon Sep 3, 2026
Slices 2–3 + overview rows — merged; closing
All remaining checklist items are now implemented, explicitly delegated, or recorded in
packages/agent-bundle/src/adapters/capabilities/codex-0.147.0.jsonas a four-state row with dated (retrieved 2026-09-02/03) evidence. Final revisions:codexadapter 1.9.0, unifiedpluginadapter 1.24.0. Every pinned schema (hooks.schema.json,marketplace.schema.json,plugin.schema.json, 21 generatedrust-v0.147.0hook schemas) carries byte/sha pins inschemas/codex/PROVENANCE.jsonandadapter-metadata.test.ts.PRs in this lane
abf5d8cbfInterruptdeferred, handler types,mcp_tool/async/additionalContextLimit/commandWindows/statusMessage/timeout semantics, matcher rules, trust, generated-schema I/O validationc95091d14tool_input/tool_responseaccept any JSON per the generated schemas325e7f470codex.marketplacepolicy/displayName/category,NOT_AVAILABLErejection, distribution rows, livecodex plugin/codex plugin marketplaceJSON probes08549c39cplugin.overviewSurfaces: MCP UI, browser extensions, scheduled task templates) + adapter revision bumpsHook contract
hooks.contract.releaseEventssupported;hooks.schema.jsoncloses thehooksobject to exactly those keys, so an unknown event fails before publication (#378)InterruptreconciliationdeferredNativeEventswith a dated reason (documented on the hooks page, no generated schema atrust-v0.147.0); authoring it fails withcodex.native-hooks.event.deferred(#378)command/mcp_tool; truthfulprompt/agenthandlerCommandsupported;handlerMcpTooldegraded (admitted + validated in native docs, canonical hooks compile tocommand, connectivity unverifiable);handlerPromptAgentunavailable — rejected withcodex.native-hooks.handler.skippedsince 0.147.0 parses but never runs them (#378)mcp_toolinput expansion, connected-server, sync/non-recursive, timeoutmcpToolExecutionunavailable — host runtime behaviour;${field}expansion, 600 s default,statusMessagedocumented in row evidence;mcp_toolrejected underSessionEnd(#378)asynchooks, 8-per-session, session-end cancel, non-controlling outputasyncCommandHooksdegraded — authoredasyncadmitted, rejected onSessionEnd; concurrency/cancellation/output rules are host behaviour (#378)additionalContextLimitspill + diagnosticsadditionalContextLimitdegraded — authored value admitted, rejected with a diagnostic on events that cannot returnadditionalContext; spill-to-disk is host behaviour (#378)commandWindows/command_windows,statusMessage, per-event timeoutscommandWindowsdegraded (admitted; generated wrappers emit one node command per platform),statusMessagedegraded,timeoutRulessupported —SessionEndtimeouts > 3 s rejected (#378)apply_patchaliases, local-function coverage, hosted-tool exclusions)matcherSemanticssupported — per-event matcher targets pinned; matchers onUserPromptSubmit/Stopflagged as ignored; hosted tools excluded from the local function-tool path (#378)/hooks, plugin hooks skipped until trusted, managed hooks immutabletrustReviewunavailable — host-owned per-user decision; compiler cannot pre-trust (#378)generatedSchemaValidationsupported — all 21rust-v0.147.0schemas byte-pinned; wrapper +projection.tsvalidate against them; Codextool_input/tool_responseaccept any JSON andlast_assistant_messageis nullable, per the pinned schemas (#378, #404)Marketplace / install / policy
.claude-plugin/marketplace.jsonrepoMarketplaceDiscoverysupported (.agents/plugins/marketplace.json);personalMarketplaceDiscoveryunavailable (user home file);legacyClaudeMarketplaceCompatibilityunavailable — adapter never emits the Claude path (#392)marketplace.schema.jsonadmits every documented form with structural validation: contained paths (no.., control chars, or line terminators), Git URLs with valid DNS/IPv4/bracketed-IPv6 hosts, RFC 3986 userinfo, 0–65535 ports and percent-encoded paths, scp-style remotes,git check-ref-formatrefs, 7–64 hex SHAs, npm names, credential-free HTTPS registries, semver/range/dist-tag versions;marketplaceSourcesdegraded — the adapter only ever emits its own local root (#392)interface,policy.installation/authentication, category, cache layout, enable statecodex.marketplace.displayName/category/policywithcodex.marketplace.*diagnostics;installation: NOT_AVAILABLEfails the build withcodex.marketplace.policy.installation.not-installablebecause livecodex plugin addrefuses it;installCacheLayoutandpluginEnableStateunavailable (host-ownedconfig.toml) (#392)codex plugin/codex plugin marketplaceJSON contractspluginCliLifecycleandmarketplaceCliLifecycledegraded — installer drivesmarketplace add+plugin add;list/remove/upgrade--jsonshapes pinned from live 0.147.0 probes in isolatedCODEX_HOMEs (#392)features.plugins,features.hooks,codex_hooks, inline[hooks],requirements.tomlfeaturePlugins,featureHooks,inlineHooksToml,managedRequirementsunavailable — user/admin config layers outside the package (#392)allow_managed_hooks_only,restrict_to_allowed_sourcesworkspacePublishingandmanifestPackage.submissionPolicyunavailable — portal-owned, never claimed as compiler behaviour (#352, #392)Overview-level rows (comment of 2026-09-01)
plugin.overviewSurfaces.mcpUi— compiled MCP server servesui://MCP Apps resources per the open standard ChatGPT renders; Codex CLI 0.147.0 renders no components, tools remain usable (#415)plugin.overviewSurfaces.browserExtensions— no schema-backed authoring field in the pinned manifest/package contract; nothing inferred (#415)plugin.overviewSurfaces.scheduledTaskTemplates— same reason (#415)Acceptance
hooksobject,codex.native-hooks.*andcodex.marketplace.*diagnostics, tightened marketplace/plugin schemas.Automated-review thread inventory (found / fixed / replied)
tool_input/tool_response— fixed in follow-up #404NOT_AVAILABLErejection; Git/registry URL structure; line-terminator traversal; port range; IPv4 range; npm version grammar; bracketed IPv6; semver whitespace; dot-prefixed dist-tags;git check-ref-formatrefs; RFC 3986 userinfo — each with admitted/rejected fixturesminor→patch; summary ends with(#415)Each PR merged only after CI was green and the reviewer's final pass on the head commit reported no findings.
Known gap outside this issue
packed-native-smoke.test.tsfails in test support before any Codex logic runs (npm pack --jsonreturns four workspace entries instead of one); it is a harness issue independent of the Codex adapter and is not fixed here.ScriptedAlchemy commentedon Sep 3, 2026
Closing: all checklist items implemented, delegated, or recorded as dated four-state rows (evidence table above). Merged: #378, #404, #392, #415.
chore(changeset): record the unified plugin revision as 1.24.0 → 1.25…
chore(changeset): record the unified plugin revision as 1.24.0 → 1.25…
chore(changeset): record the unified plugin revision as 1.24.0 → 1.25…
feat(cursor): refresh plugin contract coverage against the 2026-09-02…