Skip to content

marketplace: research Cursor plugin import with no fork and no Cursor specifics #7556

Closed
0 of 3 issues completed

Description

@kyle-sexton

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-tools and plugin agents may not import.
  • Gates: the day-job rollout (dependency step 11). Tool per job's disallowed-tools use 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-tools and 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.

Activity

  1. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 16, 2026
  2. added theissue type on Oct 16, 2026
  3. github-actions commented on Oct 16, 2026

    @github-actions
    Contributor

    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 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 [...]
    [quote truncated; the full decision is at the link]

    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 to host-run. I found no likely duplicates among the open issues.

    Automated triage. A maintainer reviews it.

  4. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 16, 2026
  5. added
    needs-specNeeds a Brief or plan before anyone can build it.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 16, 2026
  6. removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 24, 2026
  7. kyle-sexton commented on Oct 24, 2026

    @kyle-sexton
    MemberAuthor

    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 (or status: needs-decision) and say why in a comment.

  8. added
    host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    on Nov 2, 2026
  9. kyle-sexton commented on Nov 2, 2026

    @kyle-sexton
    MemberAuthor

    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-agent 2026.09.28-64d2043 probe of instruction-file loading, plugins/instruction-placement/skills/migrate/reference/sources.md:198-245, which does not test plugin import; the only #7556 reference 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:

    • 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-tools and 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.

    Route: host-run

    Posted by the issue-triage session. This was generated by AI.

  10. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    priority: mediumReal value, no hard deadline; normal backlog flow.
    and removed
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 2, 2026
  11. kyle-sexton commented on Nov 2, 2026

    @kyle-sexton
    MemberAuthor

    Probe result: Cursor CLI cursor-agent 2026.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.json only (no root plugin.json, no .cursor-plugin/), skills in skills/<name>/SKILL.md, one agent in agents/, and hooks/hooks.json in Claude Code's nested format. It was loaded with cursor-agent --plugin-dir <fixture> (documented in cursor-agent --help). Every fixture name starts with probe7556 so 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 ~/.claude loaded.

    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-pass and playwright, 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. Our melodic-software marketplace 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 has marketplace add/list/update/remove but no install subcommand, and install goes through the interactive /plugin UI.

    Part Loaded Evidence
    Skills Yes t6 listing: all three fixture skills appear in Cursor's available_skills with their description. t2 /probe7556-control ran the skill body (a shell ls of the target directory).
    Hooks Partly SessionStart fired every run, from both the ${CLAUDE_PLUGIN_ROOT} command and the absolute-path command. The hook process got CLAUDE_PLUGIN_ROOT and CURSOR_PLUGIN_ROOT set to the plugin directory, and stdin carried hook_event_name: sessionStart. PreToolUse with matcher Bash fired once per shell call: 3 calls in t2, t3 and t4, the t4 call inside the subagent. UserPromptSubmit never fired in any of the 8 headless runs.
    when_to_use No t6, with the fixture as the only plugin: the probe7556-wtu entry carries only its description. The unique phrase that sits only in when_to_use is absent, and the model answered "no" when asked whether the phrase was anywhere in context.
    disallowed-tools (skill) No Paired runs. t2 control skill (no key) ran ls. t3 skill with disallowed-tools: Bash also ran ls and printed the listing. The PreToolUse Bash hook recorded both calls.
    disallowedTools (agent) No t4: the agent declares disallowedTools: "Bash", yet the subagent ran ls, which the hook recorded, and its reply includes the listing.
    Plugin agents Yes t1 listing shows probe7556-agent with its description. In t4 the main agent called Task with subagentType: {custom: {name: "probe7556-agent"}}, and the reply contains the body-only codeword AGENTBODY-8820.

    Side observations:

    • Skill name collision. Two plugins each with a skill named check were both listed with no plugin prefix (t7). /check ran plugin two's body with no warning (t8).
    • Skill descriptions dropped under a full install. With this machine's full Claude Code install visible (t5), Cursor listed 254 skills, and most entries, ours included, had no description, only a path. With the isolated HOME (t6), 17 skills were listed, all with descriptions. Why the descriptions were dropped is UNVERIFIED: it could be a listing budget, or it could be that several cached plugin versions were counted.

    Docs read today (2026-11-02):

    Run log: 8 headless turns, t1 to t8, on 2026-11-02 between 19:24 and 19:31 UTC.

  12. kyle-sexton commented on Nov 2, 2026

    @kyle-sexton
    MemberAuthor

    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_use and 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

    • Our plugin format loads unchanged. That means .claude-plugin/plugin.json, no Cursor files, loaded with --plugin-dir. Source: probe. The plugins docs (https://cursor.com/docs/plugins.md) name only root plugin.json and .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.
    • Plugins installed with Claude Code also show up in Cursor with no Cursor-side install. Source: probe, which shows audit-pass and playwright resolved 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.
    • Skills load and run. Source: probe.
    • Plugin agents load and are delegated to. Source: probe.
    • Hooks load from hooks/hooks.json and fire for mapped events. The probe saw SessionStart and PreToolUse with the Bash matcher 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

    Gaps accepted, not filed

    • Same-named skills across plugins. The probe found both check skills listed unprefixed, and /check silently ran one of them. Accepted because the existing decision already covers it: consolidation plus distinct first clauses (D82, Q179, Q186). Source: probe.
    • Skill descriptions dropped under a large install. With this machine's full Claude Code install visible, Cursor listed 254 skills, most without descriptions, while the isolated run listed 17 with descriptions. The cause is UNVERIFIED (a listing budget, or duplicate cached plugin versions). Accepted because it depends on how many plugins a user installs, and a day-job install would be a curated subset. Source: probe.
    • No CLI install from a marketplace. cursor-agent 2026.10.19 can add, list, update and remove marketplaces but has no install subcommand. Installing goes through the interactive /plugin UI, 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-dir route and the Claude Code import route were probed. Sources: cursor-agent plugin marketplace --help and 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 in mcp.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 auto with no model: key on the fixture agent.

  13. kyle-sexton commented on Nov 2, 2026

    @kyle-sexton
    MemberAuthor

    Done (2026-11-02): Cursor imports our plugins with no fork, with named gaps. Skills, plugin agents and mapped hooks work; when_to_use and tool restrictions are ignored. Probe: #7556 (comment). Decision: #7556 (comment). Gaps tracked in #12482, #12483 and #12484.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.needs-specNeeds a Brief or plan before anyone can build it.priority: mediumReal value, no hard deadline; normal backlog flow.

    Type

    Fields

    Work status

    needs-spec

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions