feat(codex): interface fields, registered MCP apps, and policy/env capability evidence (#188 S1) - #352
Conversation
🦋 Changeset detectedLatest commit: 433741c The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
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. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 433741c26a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| defaultPrompt: [`Help me use ${model.metadata.name}.`], | ||
| developerName: model.metadata.name, | ||
| }; | ||
| category: 'Productivity', | ||
| displayName: model.metadata.name, |
There was a problem hiding this comment.
Honor plugin.logo on Codex artifacts
When a project uses the existing plugin.logo option with the Codex target, this new interface builder ignores model.metadata.logo, and the Codex planner also never invokes withPluginLogoEntry; consequently neither interface.logo nor the referenced image is emitted. The normalized logo contract explicitly represents an artifact path for hosts that support logos, and Cursor already wires the same field through cursorManifest and withPluginLogoEntry, so the newly supported Codex logo surface should do likewise.
Useful? React with 👍 / 👎.
| ...(hookDocument === undefined ? [] : ['hooks']), | ||
| ...(model.skills.some((skill) => isSelected(skill.targets)) ? ['skills'] : []), | ||
| ], | ||
| defaultPrompt: [`Help me use ${model.metadata.name}.`], |
There was a problem hiding this comment.
Keep generated prompts within the schema limit
For a valid Codex plugin name longer than 115 characters, this generated string exceeds the newly pinned 128-character defaultPrompt limit, causing the adapter to report a plugin schema error even though the user did not author a prompt. The Codex name schema and source validation impose no corresponding maximum, so the generated fallback needs to be truncated or replaced with a bounded prompt.
Useful? React with 👍 / 👎.
| } else { | ||
| let valid = true; | ||
| for (const [index, item] of items.entries()) { | ||
| if (isNonemptyString(item) && item.length <= 128) continue; |
There was a problem hiding this comment.
Count prompt length in Unicode characters
When an authored starter prompt contains astral characters such as emoji, String.length counts each surrogate pair as two, while JSON Schema maxLength counts Unicode code points. A valid prompt of 65–128 emoji is therefore rejected with codex.interface.default-prompt.item.invalid and the authored interface is discarded; use a code-point count such as [...item].length so planner validation matches the pinned schema.
Useful? React with 👍 / 👎.
Summary
interfaceinstall-surface block (identity, descriptions, brand color, category/capabilities, asset paths, starter prompts, external URLs) with closedcodex.interface.*compile-time validation, plus registered-MCPappsmappings emitted as.app.jsonwithcodex.apps.*diagnostics.enabled/tools/approval modes, unavailable: host-owned), and the hook compatibility environment (PLUGIN_ROOT,PLUGIN_DATA,CLAUDE_PLUGIN_ROOT,CLAUDE_PLUGIN_DATA).plugin.schema.jsonwith the interface/apps surfaces (new pins recorded in PROVENANCE with tightening notes) and adds the pinnedapp.schema.json.plugin validatesubcommand.Part of #188 (slice 1, PR 2 of 2).
Test plan