feat(cursor): refresh plugin contract coverage against the 2026-09-02 public docs (#189) - #375
Conversation
🦋 Changeset detectedLatest commit: 4255928 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. |
commit: |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6e3bc972a7
ℹ️ 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".
af79347 to
b3e3452
Compare
…he pinned uri format Addresses Codex review on #375: new URL() normalizes whitespace and unescaped characters that the pinned plugin schema's format: uri rejects, so the plan reported a generic cursor.schema.plugin error and kept the invalid metadata. homepage/repository now go through the schema's own uri format checker first and fail closed with cursor.manifest.<field>.invalid.
|
Re-triggering CI: the pull_request synchronize event for 429c6bd produced no workflow run; closing and reopening to fire it. |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 429c6bdfbc
ℹ️ 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".
…idate author.email with the pinned format Addresses the second Codex review round on #375: - subagentStart: parent_conversation_id, tool_call_id, subagent_model, and is_parallel_worker are required (only git_branch is documented optional) in both the route envelope validator and the generated wrapper validator. - subagentStop: task, description, summary, duration_ms, message_count, tool_call_count, modified_files, and agent_transcript_path (string|null) are required to match the documented input, which marks no field optional. - Simulation encoders carry neutral values for the mandatory fields canonical input lacks so hook simulation still passes the tightened validators. - author.email goes through the pinned schema's format: email checker so values like dev@example..com fail closed as cursor.manifest.author.email.invalid.
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e982d50eec
ℹ️ 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".
…he pinned uri format Addresses Codex review on #375: new URL() normalizes whitespace and unescaped characters that the pinned plugin schema's format: uri rejects, so the plan reported a generic cursor.schema.plugin error and kept the invalid metadata. homepage/repository now go through the schema's own uri format checker first and fail closed with cursor.manifest.<field>.invalid.
…idate author.email with the pinned format Addresses the second Codex review round on #375: - subagentStart: parent_conversation_id, tool_call_id, subagent_model, and is_parallel_worker are required (only git_branch is documented optional) in both the route envelope validator and the generated wrapper validator. - subagentStop: task, description, summary, duration_ms, message_count, tool_call_count, modified_files, and agent_transcript_path (string|null) are required to match the documented input, which marks no field optional. - Simulation encoders carry neutral values for the mandatory fields canonical input lacks so hook simulation still passes the tightened validators. - author.email goes through the pinned schema's format: email checker so values like dev@example..com fail closed as cursor.manifest.author.email.invalid.
e982d50 to
2b338a2
Compare
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2b338a23fd
ℹ️ 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".
…gnore and on reasons without deny Addresses the third and fourth Codex review rounds on #375: - projectEventDocument accepts the validated native envelope (all production callers pass it); a denied agent/stop on Cursor throws unless the subagent status is completed, since followup_message is consumed only then. The generated wrapper's encodeOutput applies the same check. - The Cursor agent/stop route branch rejects a reason without outcome deny, matching the generated wrapper validator instead of swallowing it.
|
@codex review |
|
Codex Review: Didn't find any major issues. Hooray! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
…he pinned uri format Addresses Codex review on #375: new URL() normalizes whitespace and unescaped characters that the pinned plugin schema's format: uri rejects, so the plan reported a generic cursor.schema.plugin error and kept the invalid metadata. homepage/repository now go through the schema's own uri format checker first and fail closed with cursor.manifest.<field>.invalid.
…idate author.email with the pinned format Addresses the second Codex review round on #375: - subagentStart: parent_conversation_id, tool_call_id, subagent_model, and is_parallel_worker are required (only git_branch is documented optional) in both the route envelope validator and the generated wrapper validator. - subagentStop: task, description, summary, duration_ms, message_count, tool_call_count, modified_files, and agent_transcript_path (string|null) are required to match the documented input, which marks no field optional. - Simulation encoders carry neutral values for the mandatory fields canonical input lacks so hook simulation still passes the tightened validators. - author.email goes through the pinned schema's format: email checker so values like dev@example..com fail closed as cursor.manifest.author.email.invalid.
…gnore and on reasons without deny Addresses the third and fourth Codex review rounds on #375: - projectEventDocument accepts the validated native envelope (all production callers pass it); a denied agent/stop on Cursor throws unless the subagent status is completed, since followup_message is consumed only then. The generated wrapper's encodeOutput applies the same check. - The Cursor agent/stop route branch rejects a reason without outcome deny, matching the generated wrapper validator instead of swallowing it.
d1ec84f to
0de3c4a
Compare
|
@codex review |
|
Codex Review: Didn't find any major issues. You're on a roll. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
fe257d2 to
4bb55e9
Compare
…art wrappers Addresses the fifth Codex review round on #375: parent_conversation_id is a subagent field, not a substitute for the common envelope's conversation_id, so the generated wrapper no longer accepts it in place of session_id/conversation_id and no longer falls back to it for sessionId. This matches the route envelope validator in events/projection.ts.
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4bb55e9acb
ℹ️ 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".
…subagentStart Addresses the sixth Codex review round on #375: the generated wrapper now mirrors the simulation codec (model <-> subagent_model) so handlers observe event.model for real Cursor subagentStart payloads.
…he pinned uri format Addresses Codex review on #375: new URL() normalizes whitespace and unescaped characters that the pinned plugin schema's format: uri rejects, so the plan reported a generic cursor.schema.plugin error and kept the invalid metadata. homepage/repository now go through the schema's own uri format checker first and fail closed with cursor.manifest.<field>.invalid.
…idate author.email with the pinned format Addresses the second Codex review round on #375: - subagentStart: parent_conversation_id, tool_call_id, subagent_model, and is_parallel_worker are required (only git_branch is documented optional) in both the route envelope validator and the generated wrapper validator. - subagentStop: task, description, summary, duration_ms, message_count, tool_call_count, modified_files, and agent_transcript_path (string|null) are required to match the documented input, which marks no field optional. - Simulation encoders carry neutral values for the mandatory fields canonical input lacks so hook simulation still passes the tightened validators. - author.email goes through the pinned schema's format: email checker so values like dev@example..com fail closed as cursor.manifest.author.email.invalid.
…gnore and on reasons without deny Addresses the third and fourth Codex review rounds on #375: - projectEventDocument accepts the validated native envelope (all production callers pass it); a denied agent/stop on Cursor throws unless the subagent status is completed, since followup_message is consumed only then. The generated wrapper's encodeOutput applies the same check. - The Cursor agent/stop route branch rejects a reason without outcome deny, matching the generated wrapper validator instead of swallowing it.
…art wrappers Addresses the fifth Codex review round on #375: parent_conversation_id is a subagent field, not a substitute for the common envelope's conversation_id, so the generated wrapper no longer accepts it in place of session_id/conversation_id and no longer falls back to it for sessionId. This matches the route envelope validator in events/projection.ts.
…subagentStart Addresses the sixth Codex review round on #375: the generated wrapper now mirrors the simulation codec (model <-> subagent_model) so handlers observe event.model for real Cursor subagentStart payloads.
13097de to
5cd1f89
Compare
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5cd1f898df
ℹ️ 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".
… public docs (#189) Validate and project Cursor subagentStart/subagentStop through their documented subagent_* envelopes and output channels (permission deny + user_message; followup_message) in event routes, config-hook wrappers, playground codecs, and lifecycle starters. Add the cursor.* config extension for schema-admitted manifest metadata (author, homepage, repository, license, keywords, publisher, category, tags, minClientVersions) with cursor.manifest.* diagnostics. Pin the complete 21-event Cursor hook inventory with cloud availability, hook options, plugin formats, discovery, variables, marketplace limits, distribution and local-install surfaces, canvases, and the G5-gated agents component as dated capability rows mirrored through the unified bundle. Cursor adapterRevision 1.9.0, plugin 1.22.0.
…he pinned uri format Addresses Codex review on #375: new URL() normalizes whitespace and unescaped characters that the pinned plugin schema's format: uri rejects, so the plan reported a generic cursor.schema.plugin error and kept the invalid metadata. homepage/repository now go through the schema's own uri format checker first and fail closed with cursor.manifest.<field>.invalid.
…idate author.email with the pinned format Addresses the second Codex review round on #375: - subagentStart: parent_conversation_id, tool_call_id, subagent_model, and is_parallel_worker are required (only git_branch is documented optional) in both the route envelope validator and the generated wrapper validator. - subagentStop: task, description, summary, duration_ms, message_count, tool_call_count, modified_files, and agent_transcript_path (string|null) are required to match the documented input, which marks no field optional. - Simulation encoders carry neutral values for the mandatory fields canonical input lacks so hook simulation still passes the tightened validators. - author.email goes through the pinned schema's format: email checker so values like dev@example..com fail closed as cursor.manifest.author.email.invalid.
…gnore and on reasons without deny Addresses the third and fourth Codex review rounds on #375: - projectEventDocument accepts the validated native envelope (all production callers pass it); a denied agent/stop on Cursor throws unless the subagent status is completed, since followup_message is consumed only then. The generated wrapper's encodeOutput applies the same check. - The Cursor agent/stop route branch rejects a reason without outcome deny, matching the generated wrapper validator instead of swallowing it.
…0 patch convention and PR reference
…art wrappers Addresses the fifth Codex review round on #375: parent_conversation_id is a subagent field, not a substitute for the common envelope's conversation_id, so the generated wrapper no longer accepts it in place of session_id/conversation_id and no longer falls back to it for sessionId. This matches the route envelope validator in events/projection.ts.
….0 after rebasing over #188
…subagentStart Addresses the sixth Codex review round on #375: the generated wrapper now mirrors the simulation codec (model <-> subagent_model) so handlers observe event.model for real Cursor subagentStart payloads.
5cd1f89 to
4255928
Compare
|
@codex review |
|
Codex Review: Didn't find any major issues. Bravo. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
…per in cursor adapter, bump cursor 1.10.0 / plugin 1.26.0
Summary
Closes the #189 Cursor contract-matrix umbrella against the public docs retrieved 2026-09-02 (https://cursor.com/docs/plugins, https://cursor.com/docs/reference/plugins, https://cursor.com/docs/hooks).
subagentStart/subagentStopwere advertisedsupportedwith no fixture: the config-hook wrapper would have rejected every real payload (loop_countcheck), the event-route validator checked nothing, and the projection emitted an undocumentedadditional_contextwhile refusing the documentedpermission: "deny". Now: envelope validation for the documentedsubagent_*fields (route + wrapper), projection to{ permission: "deny", user_message }/{ followup_message }only,Agent.Contextfails closed on both (no documented channel), documented-payload fixtures (tests/fixtures/events/cursor-subagent-{start,stop}.json), lifecycle starters, playground codecs, and an executed-wrapper test.cursor.*config extension. Schema-admitted manifest metadata (author{name,email},homepage,repository,license,keywords,publisher,category,tags,minClientVersions) is validated against the pinnedcursor/plugins@0701892shapes and emitted into.cursor-plugin/plugin.jsonon thecursortarget and the Cursor half ofplugin;cursor.manifest.*errors, no partial emission,author.url/unknown keys rejected.AgentBundleConfignow mergesCursorConfigExtension.hooks.nativeEventspins all 21 documented events (18 agent, 2 tab,workspaceOpen) with category, cloud availability, matcher subject, output fields, and the row that owns each; every supported route carriesavailability.{desktop,cloud}per the docs' cloud table (the stalebeforeSubmitPrompt-clouddeferral is removed — the docs list it as cloud-supported). New dated rows:hooks.cloud(config sources; plugin hooks not a documented cloud source),hooks.options(command,timeout,matchersupported;failClosed,loop_limit, prompt hooks unavailable with the fail-open consequence spelled out),plugin.formats(Cursor Plugin supported; Agent Plugin owned by portable, never mixed),componentDiscovery,rootSkill,variables,manifestMetadata,marketplaceManifest(500-entry cap, manifest-over-entry precedence),distributionPolicy(install modes, marketplace access, local plugin imports, auto refresh, review/publish, team marketplaces, symlink install),canvases, and the G5-gatedagents.component. Each row is acursoradapter capability and is mirrored through the unifiedpluginadapter (manifestMetadatanow intersects Cursor for real).ln -sfor local iteration; the loader observed 2026-08-31 rejected symlinks escaping~/.cursor/plugins/local(Cursor install instruction 'clone (or symlink)' fails: Cursor rejects local-plugin symlinks resolving outside ~/.cursor/plugins/local #127); Cursor IDE 3.18.25 loaded three physical local directories on this machine (2026-09-03 UTC). Installer/doctor keep copying, which satisfies both readings; recorded ininstall.evidence,distributionPolicy.localSymlinkInstall, andPROVENANCE.publicDocsObservation.1.8.0 → 1.9.0, unified plugin1.21.0 → 1.22.0. Changeset: minor,agent-bundle. Docs: root README (cursor.*), example README + walkthrough canvas event matrices.Evidence
cursor-agent 2026.08.31-4057e58capture forsubagentStart/subagentStopwas attempted with trusted project hooks and could not dispatch (Authentication required), so the pinned reference plus fixture replay are the evidence source (recorded inprovenance.evidence).wave/cursor-workspace-open(PR feat(cursor): support workspace/open event routes as fire-and-forget observation #298, squash69a413b) has no surviving delta: its 13-file/318-line diff is byte-present onorigin/main.Test plan
pnpm typecheckpnpm lint— 0 errors, 0 warningspnpm test:unit— 2671 passed, 5 skipped; two unrelated files (event-ipc,native-claude-contract) flaked under parallel-lane load and passed on re-runpnpm test:route-unit— 36 passedpnpm test:projection— 63 passedpnpm build && pnpm test:integration:run— running locally; CI is authoritativeCloses #189.