Skip to content

Move the shipped plugin into plugin/ - #52

Merged
teallarson merged 3 commits into
mainfrom
cursor/plugin-subfolder-96e0
Oct 22, 2026
Merged

teallarson merged 3 commits into
mainfrom
cursor/plugin-subfolder-96e0

Conversation

@teallarson

@teallarson teallarson commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Linear ticket: none

What/why

People who install Arcade get the plugin directory only. Skills, the gateway, the operator, and client manifests still install the same way. Dev tooling, tests, and CI stay in the repository and are no longer part of the installed tree.

Cursor team import of https://github.com/ArcadeAI/arcade-plugin still works. Claude Code, Codex, Copilot CLI, and VS Code Chat: Install Plugin From Source still install from that repository URL. An individual Cursor install can clone the repository into ~/.cursor/plugins/local/arcade-plugin. The root .cursor-plugin/plugin.json points into plugin/, so the local loader reads the skills and the session hook. Copying plugin/ into ~/.cursor/plugins/local/arcade still works.

Codebase changes

Shipped files move under plugin/: manifests, skills, agents, commands, hooks, client folders, assets, VERSION, README.md, and a copy of LICENSE. The generator writes those outputs with a plugin/ prefix and keeps .claude-plugin/marketplace.json (source ./plugin) and a new .cursor-plugin/marketplace.json (source plugin) at the repository root. ChatGPT ZIP entries stay relative to the plugin root. dev/ remains the package root. The generator also writes a repo-root .cursor-plugin/plugin.json and .cursor-plugin/hooks.json so a plain clone loads in Cursor's local plugins directory; marketplace source stays plugin.

Additional notes

After release, directory listings need the new path: Claude directory plugin path plugin; Copilot external plugin path plugin on a new tag or SHA; Cursor logo URL under plugin/assets/logo.png; x.ai catalog entry path plugin.

No .agents/plugins/marketplace.json. Codex still installs from .claude-plugin/marketplace.json, and that path is what verify:codex exercises. .github/workflows/check.yml has no separate generated-file step; npm test runs generate --check.

Local checks from dev/, after npm ci: npm run generate then npm run generate -- --check (clean), npm test (205 passed, 2 skipped, 0 failed), npm run typecheck, and npm run verify (Claude validate --strict on the marketplace and on plugin/, Claude install, Cursor validator, Codex, Copilot). Cursor's validator warns that hooks/hooks.json is absent; hooks stay in the client folders. That validator follows marketplace source plugin and does not read the repo-root Cursor manifest.

Appendix: install paths after plugin/

Checked against current client docs and, where a CLI is in dev/node_modules, against this checkout. Cursor's IDE and VS Code were not launched here.

Cursor local clone loads. Test plugins locally treats each folder in ~/.cursor/plugins/local as the plugin root and looks for .cursor-plugin/plugin.json, then .claude-plugin/plugin.json, then plugin.json. The repo-root .cursor-plugin/plugin.json points skills, agents, commands, rules, and the logo into plugin/. .cursor-plugin/hooks.json runs plugin/hooks/session-start.mjs. A clone at ~/.cursor/plugins/local/arcade-plugin loads. Copying only plugin/ still loads plugin/.cursor-plugin/plugin.json. Symlinks out of plugins/local stay ignored.

Public docs in ArcadeAI/docs content/docs/get-started/agent-plugin/index.mdx can keep cloning into ~/.cursor/plugins/local/arcade-plugin, then Developer: Reload Window. To update, git pull in that clone and reload. This repo's docs/install/cursor.md says the same.

Cursor team import stays. Paste https://github.com/ArcadeAI/arcade-plugin. How resolution works: source plugin loads plugin/.cursor-plugin/plugin.json. verify:cursor passed on this tree.

VS Code Install Plugin From Source stays. Pasting https://github.com/ArcadeAI/arcade-plugin still installs Arcade. In current VS Code pluginInstallService.ts, _doInstallFromSource scans marketplace files, including .claude-plugin/marketplace.json, and installs those plugins when the scan returns any. parsePluginSource / normalizeMarketplacePath turns source ./plugin into relative path plugin. getPluginInstallUri joins that path onto the clone. The root-manifest fallback runs only when the scan returns no plugins. chat.pluginLocations still has to name the plugin directory (plugin/plugin.json). docs/install/vscode.md states both.

Claude Code, Codex, and Copilot CLI marketplace add stay. Each command adds this repository and installs arcade@arcade. Source ./plugin is the plugin directory from the repository root (Claude marketplace reference; Copilot marketplace source, where ./plugin and plugin are the same directory).

  • Claude Code 2.1.304: claude plugin marketplace add of this checkout, then claude plugin install arcade@arcade, installed arcade@arcade 0.8.1 with skills/try-arcade/SKILL.md and without repository-root AGENTS.md or dev/.
  • Codex 0.156.1: codex plugin marketplace add of this checkout, then codex plugin add arcade@arcade, loaded the arcade MCP server and both skills from the plugin directory.
  • Copilot CLI 1.0.88: copilot plugin marketplace add of this checkout, then copilot plugin install arcade@arcade. The CLI reported the plugin loaded live from plugin/ and loaded the MCP server and both skills.
  • plugins 1.3.4 discover on this checkout found one local plugin, arcade, with 2 skills, 3 commands, and 1 agent, via .claude-plugin/marketplace.json source ./plugin.
Open in Web Open in Cursor 

Note

Medium Risk
Broad layout change to install paths, generated manifests, and client verify flows; wrong marketplace or Cursor root manifests would break installs without affecting runtime auth or gateway behavior.

Reviewed by Cursor Bugbot for commit dba4ac4. Bugbot is set up for automated code reviews on this repo. Configure here.

Keep dev tooling, CI, and docs at the repository root. Marketplace catalogs
point at plugin/ so client installs resolve that directory.

Co-authored-by: Teal Larson <LARSON.TEAL@GMAIL.COM>
@teallarson
teallarson marked this pull request as ready for review October 22, 2026 20:03
@teallarson
teallarson requested a review from a team as a code owner October 22, 2026 20:03
…er-96e0

# Conflicts:
#	dev/scripts/generate-manifests.mjs
#	dev/test/generate-manifests.test.mjs

Co-authored-by: Teal Larson <LARSON.TEAL@GMAIL.COM>
arcade-plugin-bot[bot]
arcade-plugin-bot Bot previously approved these changes Oct 22, 2026

@arcade-plugin-bot arcade-plugin-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot reviewed f71c2a3 with no findings, and check passed. Approved automatically because teallarson has write access.

Cursor's local loader reads .cursor-plugin/plugin.json in the folder it was
given. Generate that manifest and its hooks file with paths into plugin/, so
a plain clone loads. Marketplace source stays plugin.

Co-authored-by: Teal Larson <LARSON.TEAL@GMAIL.COM>

@arcade-plugin-bot arcade-plugin-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot reviewed dba4ac4 with no findings, and check passed. Approved automatically because teallarson has write access.

@teallarson
teallarson enabled auto-merge (squash) October 22, 2026 21:38
@teallarson
teallarson requested a review from a team October 22, 2026 21:40
@teallarson
teallarson merged commit 9cf1f54 into main Oct 22, 2026
7 checks passed
@teallarson
teallarson deleted the cursor/plugin-subfolder-96e0 branch October 22, 2026 21:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants