Repository navigation
marketplace: research Cursor plugin import with no fork and no Cursor specifics #7556
Description
Parent
Refs #7555. Source: PLAN Phase 0, topic poteto-review. Thread: Cursor compatibility (deferred
thread, filed active per Q579).
Depends on
- none: on the frontier now
Outcome
A recorded answer to one question: can Cursor import this marketplace's plugins with no fork and no
Cursor-specific files, and which plugin parts survive the import (skills, hooks, when_to_use,
disallowed-tools, plugin agents). The answer comes from Cursor's official documentation plus a
probe that installs one consolidated plugin in Cursor and records what loads.
Decisions
- Deferred thread: Cursor plugin import with no fork and no Cursor specifics; one research item,
carried into the plan as an open item (Q579, K46). Origin: owner's (the day-job rollout uses
Cursor, D71, Q84). - No option is chosen yet; this item decides. Captured assumption 6: skills, hooks,
when_to_use,
disallowed-toolsand plugin agents may not import. - Gates: the day-job rollout (dependency step 11). Tool per job's
disallowed-toolsuse also
depends on Cursor support (Q561 research tag).
Key interfaces
From the design's variation verdicts: "Cursor as host: TAGGED-DEFERRED; no verdict recorded
(Q579)." Skill-authoring decisions that this research checks: "fix the Cursor /check collision by
consolidation plus distinct first clauses (D82, Q179, Q186)."
Done when
- A comment on this issue starting
Probe result:records the Cursor version, the plugin
installed, and for each of skills, hooks,when_to_use,disallowed-toolsand plugin agents
whether it loaded, with the date. - A closing comment records the decision (import works as-is, works with named gaps, or needs a
fork) with each claim's source: a Cursor docs URL read that day, or the probe. - Every gap the probe found is either filed as a sub-issue of this item or named in the closing
comment as accepted.
Out of scope
- Writing Cursor-specific files or forking any plugin.
- Fixing the gaps found; those become their own items.
Metadata
Metadata
Assignees
Labels
Type
Fields
Work status
Activity
github-actions commentedon Oct 16, 2026
Proposed work class: work-class: read-only
Basis: automated intake triage; a maintainer confirms or changes it.
Size: Small
Complexity: Low
Uncertainty: Knowable
Flags: none
Blocked by: none
Decision comment: #7556 (comment)
That decision settles the open questions. I understood this as a research item: record whether Cursor can import this marketplace's plugins with no fork and no Cursor-specific files, and which parts survive (skills, hooks,
when_to_use,disallowed-tools, plugin agents). The probe needs a host with Cursor installed, so it stays routed tohost-run. I found no likely duplicates among the open issues.Automated triage. A maintainer reviews it.
kyle-sexton commentedon Oct 24, 2026
Released for re-triage under the owner's 2026-10-24 rule: an issue stops for a person only for an intent or vision question, a security call, a host or attended run, or spend outside prepaid credit. The hold label came off and intake triage runs again now; it re-applies a hold, with a numbered question, when one of those applies.
To hold this issue again, add
needs-human(orstatus: needs-decision) and say why in a comment.kyle-sexton commentedon Nov 2, 2026
Decision recorded.
The Cursor import question has no recorded answer yet: no comment on this issue starts
Probe result:, and no file on origin/main records a Cursor plugin-import probe (the instruction-placement migrate references record a headless cursor-agent2026.09.28-64d2043probe of instruction-file loading,plugins/instruction-placement/skills/migrate/reference/sources.md:198-245, which does not test plugin import; the only#7556reference is a test fixture at.github/scripts/intake-triage/admit.test.mjs:2231). The probe needs a host with Cursor installed, which a lane run does not have, so this goes to a host run. The issue body sets the outcome, the options (works as-is, works with named gaps, needs a fork) and the done-when, and it raises no open intent question.Acceptance criteria:
Probe result:records the Cursor version, the plugin installed, and for each of skills, hooks,when_to_use,disallowed-toolsand plugin agents whether it loaded, with the date.Route: host-run
Posted by the issue-triage session. This was generated by AI.
kyle-sexton commentedon Nov 2, 2026
Probe result: Cursor CLI
cursor-agent2026.10.19-6bbf2c4 (2026.10.22-27dcf5f was available and was not installed), Linux (WSL) host, 2026-11-02.What was installed. No single plugin of ours has all five parts, so the probe used a throwaway fixture plugin in our own layout with no Cursor files:
.claude-plugin/plugin.jsononly (no rootplugin.json, no.cursor-plugin/), skills inskills/<name>/SKILL.md, one agent inagents/, andhooks/hooks.jsonin Claude Code's nested format. It was loaded withcursor-agent --plugin-dir <fixture>(documented incursor-agent --help). Every fixture name starts withprobe7556so a hit can only come from the fixture. Turns ran headless (-p --model auto --output-format stream-json) from an empty workspace. Runs t6 to t8 used a HOME holding only the Cursor login, so nothing from~/.claudeloaded.Second route, observed but not set up by this probe. The account's Cursor CLI already lists Claude Code plugins installed on this machine. Cursor's skill list in runs t1 and t5 included
audit-passandplaywright, resolved to paths inside Claude Code's own plugin cache (<claude plugin cache>/melodic-software/playwright/0.16.0/skills/playwright/SKILL.md). So plugins installed with Claude Code reach Cursor through its third-party import with no Cursor-side install. Ourmelodic-softwaremarketplace was also already registered in Cursor (agent plugin marketplace list, user scope, indexed at an older commit). The probe did not install from it: the CLI hasmarketplace add/list/update/removebut no install subcommand, and install goes through the interactive/pluginUI.available_skillswith theirdescription. t2/probe7556-controlran the skill body (a shelllsof the target directory).SessionStartfired every run, from both the${CLAUDE_PLUGIN_ROOT}command and the absolute-path command. The hook process gotCLAUDE_PLUGIN_ROOTandCURSOR_PLUGIN_ROOTset to the plugin directory, and stdin carriedhook_event_name: sessionStart.PreToolUsewith matcherBashfired once per shell call: 3 calls in t2, t3 and t4, the t4 call inside the subagent.UserPromptSubmitnever fired in any of the 8 headless runs.when_to_useprobe7556-wtuentry carries only itsdescription. The unique phrase that sits only inwhen_to_useis absent, and the model answered "no" when asked whether the phrase was anywhere in context.disallowed-tools(skill)ls. t3 skill withdisallowed-tools: Bashalso ranlsand printed the listing. ThePreToolUseBash hook recorded both calls.disallowedTools(agent)disallowedTools: "Bash", yet the subagent ranls, which the hook recorded, and its reply includes the listing.probe7556-agentwith its description. In t4 the main agent calledTaskwithsubagentType: {custom: {name: "probe7556-agent"}}, and the reply contains the body-only codewordAGENTBODY-8820.Side observations:
checkwere both listed with no plugin prefix (t7)./checkran plugin two's body with no warning (t8).Docs read today (2026-11-02):
plugin.json) and Cursor Plugins (.cursor-plugin/plugin.json). Rules, agents, commands and hooks are listed as Cursor Plugins only. The page does not mention.claude-plugin.skills/,agents/andhooks/hooks.json. Skill frontmatter fields arenameanddescription, and so are agent fields. Cursor expands${CLAUDE_PLUGIN_ROOT}inmcp.json.name,description,paths,disable-model-invocation,icon,colorandmetadata, with nowhen_to_useand no tool lists. Cursor also loads.claude/skills/and~/.claude/skills/.name,description,model,readonlyandis_background, with notoolsordisallowedTools. Cursor also loads.claude/agents/and~/.claude/agents/.PreToolUse,PostToolUse,Stop,SubagentStop,SessionStart,SessionEnd,PreCompact,UserPromptSubmit.NotificationandPermissionRequestare listed as not supported. Tool mapping:BashtoShell,EdittoWrite, andGlobis not supported.--plugin-dir. This is the only page read that says our format loads.cursor-agent --help,agent plugin --helpandagent plugin marketplace --help/add --help: the plugin surface is marketplace management plus--plugin-dir.Run log: 8 headless turns, t1 to t8, on 2026-11-02 between 19:24 and 19:31 UTC.
kyle-sexton commentedon Nov 2, 2026
Decision: import works, with named gaps. No fork is needed.
Cursor loads our plugins as they are. Skills and plugin agents work, and hooks work for the events Cursor maps.
when_to_useand the tool-restriction keys are ignored. Every claim below cites the probe result (Cursor CLI 2026.10.19-6bbf2c4, 2026-11-02) or a Cursor docs page read on 2026-11-02.What works
.claude-plugin/plugin.json, no Cursor files, loaded with--plugin-dir. Source: probe. The plugins docs (https://cursor.com/docs/plugins.md) name only rootplugin.jsonand.cursor-plugin/plugin.json. Only the CLI changelog (https://cursor.com/docs/cli/changelog.md, May 7, 2026: "Plugins imported from Claude Code appear alongside native ones") says this format is supported, so it rests on a changelog line, not a documented contract.audit-passandplaywrightresolved from Claude Code's plugin cache. The import setting "Include Third-Party Plugins, Skills, and Other Configs" is on by default: https://cursor.com/docs/reference/third-party-hooks.md.hooks/hooks.jsonand fire for mapped events. The probe sawSessionStartandPreToolUsewith theBashmatcher fire, with${CLAUDE_PLUGIN_ROOT}set. Sources: probe, plus the event and tool mapping in https://cursor.com/docs/reference/third-party-hooks.md.Gaps filed as sub-issues
when_to_useis ignored. Sources: probe, and https://cursor.com/docs/skills.md, which has no such field.disallowed-toolsand agentdisallowedToolsare ignored (source: probe). Agenttools:and skillallowed-toolshave no Cursor field (source: https://cursor.com/docs/subagents.md and https://cursor.com/docs/skills.md, not probed). The Q561 per-jobdisallowed-toolsplan depends on this item.PostToolBatchfor the formatters,Notification,StopFailure,PostCompact, theWorktree*events, andNotebookEdit/PowerShell/Skill/mcp__*matchers. Source: https://cursor.com/docs/reference/third-party-hooks.md crossed withplugins/*/hooks/hooks.json. The same item also coversUserPromptSubmit, which the probe saw not fire in headless runs.Gaps accepted, not filed
checkskills listed unprefixed, and/checksilently ran one of them. Accepted because the existing decision already covers it: consolidation plus distinct first clauses (D82, Q179, Q186). Source: probe.cursor-agent2026.10.19 can add, list, update and remove marketplaces but has no install subcommand. Installing goes through the interactive/pluginUI, or the IDE's Customize page (https://cursor.com/docs/plugins.md). Accepted. The probe did not install from our registered marketplace through that UI; only the--plugin-dirroute and the Claude Code import route were probed. Sources:cursor-agent plugin marketplace --helpand https://cursor.com/docs/cli/changelog.md.${PLUGIN_ROOT}and${PLUGIN_DATA}are not expanded. https://cursor.com/docs/reference/plugins.md says Cursor does not expand them inmcp.json, and does expand${CLAUDE_PLUGIN_ROOT}. Accepted, since our plugins use${CLAUDE_PLUGIN_ROOT}.Billing basis for the probe. The account is on the Free tier (
cursor-agent about), and the runs used--model autowith nomodel:key on the fixture agent.kyle-sexton commentedon Nov 2, 2026
Done (2026-11-02): Cursor imports our plugins with no fork, with named gaps. Skills, plugin agents and mapped hooks work;
when_to_useand tool restrictions are ignored. Probe: #7556 (comment). Decision: #7556 (comment). Gaps tracked in #12482, #12483 and #12484.