Skip to content
39 changes: 39 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"name": "cursor-plugins",
"interface": { "displayName": "Cursor plugins" },
"plugins": [
{"name": "teaching", "source": "./teaching", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "continual-learning", "source": "./continual-learning", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "cursor-team-kit", "source": "./cursor-team-kit", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "thermos", "source": "./thermos", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "create-plugin", "source": "./create-plugin", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "ralph-loop", "source": "./ralph-loop", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "agent-compatibility", "source": "./agent-compatibility", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "cli-for-agent", "source": "./cli-for-agent", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "pr-review-canvas", "source": "./pr-review-canvas", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "docs-canvas", "source": "./docs-canvas", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "cursor-sdk", "source": "./cursor-sdk", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "orchestrate", "source": "./orchestrate", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "pstack", "source": "./pstack", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "gmail", "source": "./third_party/gmail", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "google-drive", "source": "./third_party/google-drive", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "google-calendar", "source": "./third_party/google-calendar", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "gong", "source": "./third_party/gong", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "salesforce", "source": "./third_party/salesforce", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "playwright", "source": "./third_party/playwright", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "github", "source": "./third_party/github", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "ashby", "source": "./third_party/ashby", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "hubspot", "source": "./third_party/hubspot", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "intercom", "source": "./third_party/intercom", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "zoom", "source": "./third_party/zoom", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "x", "source": "./third_party/x", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "clay", "source": "./third_party/clay", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "circleback", "source": "./third_party/circleback", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "docusign", "source": "./third_party/docusign", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "navan", "source": "./third_party/navan", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "profound", "source": "./third_party/profound", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "juicebox", "source": "./third_party/juicebox", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "outreach", "source": "./third_party/outreach", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"},
{"name": "amplemarket", "source": "./third_party/amplemarket", "policy": {"installation": "AVAILABLE", "authentication": "ON_INSTALL"}, "category": "Productivity"}
]
}
40 changes: 40 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"name": "cursor-plugins",
"description": "Cursor plugins.",
"owner": { "name": "Rudimar Ronsoni" },
"plugins": [
{"name": "teaching", "source": "./teaching", "strict": false},
{"name": "continual-learning", "source": "./continual-learning", "strict": false},
{"name": "cursor-team-kit", "source": "./cursor-team-kit", "strict": false},
{"name": "thermos", "source": "./thermos", "strict": false},
{"name": "create-plugin", "source": "./create-plugin", "strict": false},
{"name": "ralph-loop", "source": "./ralph-loop", "strict": false},
{"name": "agent-compatibility", "source": "./agent-compatibility", "strict": false},
{"name": "cli-for-agent", "source": "./cli-for-agent", "strict": false},
{"name": "pr-review-canvas", "source": "./pr-review-canvas", "strict": false},
{"name": "docs-canvas", "source": "./docs-canvas", "strict": false},
{"name": "cursor-sdk", "source": "./cursor-sdk", "strict": false},
{"name": "orchestrate", "source": "./orchestrate", "strict": false},
{"name": "pstack", "source": "./pstack", "strict": false},
{"name": "gmail", "source": "./third_party/gmail", "strict": false, "mcpServers": "./mcp.json"},
{"name": "google-drive", "source": "./third_party/google-drive", "strict": false, "mcpServers": "./mcp.json"},
{"name": "google-calendar", "source": "./third_party/google-calendar", "strict": false, "mcpServers": "./mcp.json"},
{"name": "gong", "source": "./third_party/gong", "strict": false, "mcpServers": "./mcp.json"},
{"name": "salesforce", "source": "./third_party/salesforce", "strict": false, "mcpServers": "./mcp.json"},
{"name": "playwright", "source": "./third_party/playwright", "strict": false, "mcpServers": "./mcp.json"},
{"name": "github", "source": "./third_party/github", "strict": false, "mcpServers": "./mcp.json"},
{"name": "ashby", "source": "./third_party/ashby", "strict": false, "mcpServers": "./mcp.json"},
{"name": "hubspot", "source": "./third_party/hubspot", "strict": false, "mcpServers": "./mcp.json"},
{"name": "intercom", "source": "./third_party/intercom", "strict": false, "mcpServers": "./mcp.json"},
{"name": "zoom", "source": "./third_party/zoom", "strict": false, "mcpServers": "./mcp.json"},
{"name": "x", "source": "./third_party/x", "strict": false, "mcpServers": "./mcp.json"},
{"name": "clay", "source": "./third_party/clay", "strict": false, "mcpServers": "./mcp.json"},
{"name": "circleback", "source": "./third_party/circleback", "strict": false, "mcpServers": "./mcp.json"},
{"name": "docusign", "source": "./third_party/docusign", "strict": false, "mcpServers": "./mcp.json"},
{"name": "navan", "source": "./third_party/navan", "strict": false, "mcpServers": "./mcp.json"},
{"name": "profound", "source": "./third_party/profound", "strict": false, "mcpServers": "./mcp.json"},
{"name": "juicebox", "source": "./third_party/juicebox", "strict": false, "mcpServers": "./mcp.json"},
{"name": "outreach", "source": "./third_party/outreach", "strict": false, "mcpServers": "./mcp.json"},
{"name": "amplemarket", "source": "./third_party/amplemarket", "strict": false, "mcpServers": "./mcp.json"}
]
}
39 changes: 39 additions & 0 deletions .github/plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"name": "cursor-plugins",
"owner": { "name": "Rudimar Ronsoni" },
"plugins": [
{"name": "teaching", "source": "./teaching"},
{"name": "continual-learning", "source": "./continual-learning"},
{"name": "cursor-team-kit", "source": "./cursor-team-kit"},
{"name": "thermos", "source": "./thermos"},
{"name": "create-plugin", "source": "./create-plugin"},
{"name": "ralph-loop", "source": "./ralph-loop"},
{"name": "agent-compatibility", "source": "./agent-compatibility"},
{"name": "cli-for-agent", "source": "./cli-for-agent"},
{"name": "pr-review-canvas", "source": "./pr-review-canvas"},
{"name": "docs-canvas", "source": "./docs-canvas"},
{"name": "cursor-sdk", "source": "./cursor-sdk"},
{"name": "orchestrate", "source": "./orchestrate"},
{"name": "pstack", "source": "./pstack"},
{"name": "gmail", "source": "./third_party/gmail"},
{"name": "google-drive", "source": "./third_party/google-drive"},
{"name": "google-calendar", "source": "./third_party/google-calendar"},
{"name": "gong", "source": "./third_party/gong"},
{"name": "salesforce", "source": "./third_party/salesforce"},
{"name": "playwright", "source": "./third_party/playwright"},
{"name": "github", "source": "./third_party/github"},
{"name": "ashby", "source": "./third_party/ashby"},
{"name": "hubspot", "source": "./third_party/hubspot"},
{"name": "intercom", "source": "./third_party/intercom"},
{"name": "zoom", "source": "./third_party/zoom"},
{"name": "x", "source": "./third_party/x"},
{"name": "clay", "source": "./third_party/clay"},
{"name": "circleback", "source": "./third_party/circleback"},
{"name": "docusign", "source": "./third_party/docusign"},
{"name": "navan", "source": "./third_party/navan"},
{"name": "profound", "source": "./third_party/profound"},
{"name": "juicebox", "source": "./third_party/juicebox"},
{"name": "outreach", "source": "./third_party/outreach"},
{"name": "amplemarket", "source": "./third_party/amplemarket"}
]
}
40 changes: 40 additions & 0 deletions .grok-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"name": "cursor-plugins",
"description": "Cursor plugins.",
"owner": { "name": "Rudimar Ronsoni" },
"plugins": [
{"name": "teaching", "source": "./teaching"},
{"name": "continual-learning", "source": "./continual-learning"},
{"name": "cursor-team-kit", "source": "./cursor-team-kit"},
{"name": "thermos", "source": "./thermos"},
{"name": "create-plugin", "source": "./create-plugin"},
{"name": "ralph-loop", "source": "./ralph-loop"},
{"name": "agent-compatibility", "source": "./agent-compatibility"},
{"name": "cli-for-agent", "source": "./cli-for-agent"},
{"name": "pr-review-canvas", "source": "./pr-review-canvas"},
{"name": "docs-canvas", "source": "./docs-canvas"},
{"name": "cursor-sdk", "source": "./cursor-sdk"},
{"name": "orchestrate", "source": "./orchestrate"},
{"name": "pstack", "source": "./pstack"},
{"name": "gmail", "source": "./third_party/gmail"},
{"name": "google-drive", "source": "./third_party/google-drive"},
{"name": "google-calendar", "source": "./third_party/google-calendar"},
{"name": "gong", "source": "./third_party/gong"},
{"name": "salesforce", "source": "./third_party/salesforce"},
{"name": "playwright", "source": "./third_party/playwright"},
{"name": "github", "source": "./third_party/github"},
{"name": "ashby", "source": "./third_party/ashby"},
{"name": "hubspot", "source": "./third_party/hubspot"},
{"name": "intercom", "source": "./third_party/intercom"},
{"name": "zoom", "source": "./third_party/zoom"},
{"name": "x", "source": "./third_party/x"},
{"name": "clay", "source": "./third_party/clay"},
{"name": "circleback", "source": "./third_party/circleback"},
{"name": "docusign", "source": "./third_party/docusign"},
{"name": "navan", "source": "./third_party/navan"},
{"name": "profound", "source": "./third_party/profound"},
{"name": "juicebox", "source": "./third_party/juicebox"},
{"name": "outreach", "source": "./third_party/outreach"},
{"name": "amplemarket", "source": "./third_party/amplemarket"}
]
}
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
# Cursor plugins

Fork of [cursor/plugins](https://github.com/cursor/plugins). Each plugin folder is installable on Claude Code, Grok, Codex, and OpenCode. Skill and MCP files stay where they are.

```sh
claude plugin marketplace add rudironsoni/cursor-plugins-for-all-harnesses
claude plugin install teaching@cursor-plugins

grok plugin marketplace add rudironsoni/cursor-plugins-for-all-harnesses
grok plugin install teaching --trust

codex plugin marketplace add rudironsoni/cursor-plugins-for-all-harnesses
codex plugin install teaching
```

OpenCode has no marketplace. Every plugin ships an `opencode.js`. After you have the plugin folder, add it in `opencode.json`:

```json
{ "plugin": ["./teaching/opencode.js"] }
```

MCP plugins (everything under `third_party/`) register their server via the `config` hook, so there is nothing else to configure. Restart OpenCode after enabling, because MCP registration happens at startup. Credentials use `{env:VAR}` interpolation, for example `GITHUB_PERSONAL_ACCESS_TOKEN` for `third_party/github`. Services that use OAuth client credentials (`docusign`, `gong`, `hubspot`, `salesforce`, `x`, `x-ads`, `zoom`) register an `oauth` block; run `opencode mcp auth <server>` to complete the flow.

Skill plugins (the first-party folders such as `teaching/`, plus `advisor`) keep their skills in `./skills/`. Copy or symlink them into `.opencode/skills`, `.claude/skills`, or `.agents/skills` for discovery.

Or use the community installer, which reads this repo's Claude catalog:

```sh
npx opencode-market add rudironsoni/cursor-plugins-for-all-harnesses
npx opencode-market install teaching@cursor-plugins --opencode
```


Official Cursor plugins for popular developer tools, frameworks, and SaaS products. Each plugin is a standalone directory at the repository root with its own `.cursor-plugin/plugin.json` manifest.

## Plugins
Expand Down
50 changes: 50 additions & 0 deletions advisor/opencode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// advisor - OpenCode adapter for Cursor plugin
// Reads existing assets (skills/, agents/, rules/, hooks/) at runtime and registers via OpenCode plugin API.

import { fileURLToPath } from "node:url";
import { join } from "node:path";
import { readFile, readdir } from "node:fs/promises";

const PLUGIN_DIR = fileURLToPath(new URL(".", import.meta.url));

export const AdvisorPlugin = async ({ directory }) => ({
config: async (config) => {
const skills = ["advisor"];
config.permission ??= { skill: {} };
for (const s of skills) config.permission.skill[s] = "allow";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Skill permission write can throw

Medium Severity · Logic Bug

config.permission ??= { skill: {} } only initializes when permission is missing. If OpenCode or the user already set permission without a skill object, assigning config.permission.skill[s] throws and the plugin config hook fails. The same pattern is in every skill-first adapter.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit c801023. Configure here.

config.agent ??= {};
const agentsDir = join(PLUGIN_DIR, "agents");
for (const agentFile of ["advisor-subagent.md"]) {
const name = agentFile.replace(/\.md$/, "");
const prompt = await readFile(join(agentsDir, agentFile), "utf-8");
config.agent[name] = { description: name, mode: "subagent", prompt, permission: { edit: "deny", bash: "ask" } };
}

},

// afterFileEdit -> tool.execute.after (filter edit tools)
"tool.execute.after": async (input, output) => {
const editTools = ["edit", "write", "patch", "replace"];
if (editTools.includes(input.tool)) {
// // Would run: mark-pending.sh
}
},
// afterAgentResponse -> chat.message
"chat.message": async (input, output) => {
// // Would run: capture-response.sh
},
// subagentStop -> event listener for subagent
event: async ({ event }) => {
if (event.type === "session.agent.stop" && event.agent === "advisor-subagent") {
// // Would run: record-consult.sh
}
},
// stop -> session.idle
"session.idle": async (input, output) => {
// // Would run: stop-hook.sh
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

OpenCode hooks never run scripts

High Severity · Logic Bug

Hook translations for advisor, ralph-loop, and continual-learning register OpenCode handlers but only contain comments. The Cursor scripts (mark-pending.sh, stop-hook.sh, and the continual-learning stop hook) never run, so pending-review nudges, the Ralph loop, and AGENTS.md updates do not happen on OpenCode.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit c801023. Configure here.

// No-op hooks for interface completeness
"tool.execute.before": async () => {},
});

export default AdvisorPlugin;
9 changes: 9 additions & 0 deletions agent-compatibility/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "agent-compatibility",
"version": "1.0.0",
"description": "CLI-backed repo compatibility scans plus agents that audit startup, validation, and docs against reality.",
"author": {
"name": "Cursor",
"email": "plugins@cursor.com"
}
}
10 changes: 10 additions & 0 deletions agent-compatibility/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "agent-compatibility",
"version": "1.0.0",
"description": "CLI-backed repo compatibility scans plus agents that audit startup, validation, and docs against reality.",
"author": {
"name": "Cursor",
"email": "plugins@cursor.com"
},
"skills": "./skills/"
}
9 changes: 9 additions & 0 deletions agent-compatibility/.grok-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "agent-compatibility",
"version": "1.0.0",
"description": "CLI-backed repo compatibility scans plus agents that audit startup, validation, and docs against reality.",
"author": {
"name": "Cursor",
"email": "plugins@cursor.com"
}
}
30 changes: 30 additions & 0 deletions agent-compatibility/opencode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// agent-compatibility - OpenCode adapter for Cursor plugin
// Reads existing assets (skills/, agents/, rules/, hooks/) at runtime and registers via OpenCode plugin API.

import { fileURLToPath } from "node:url";
import { join } from "node:path";
import { readFile, readdir } from "node:fs/promises";

const PLUGIN_DIR = fileURLToPath(new URL(".", import.meta.url));

export const AgentCompatibilityPlugin = async ({ directory }) => ({
config: async (config) => {
const skills = ["check-agent-compatibility"];
config.permission ??= { skill: {} };
for (const s of skills) config.permission.skill[s] = "allow";
config.agent ??= {};
const agentsDir = join(PLUGIN_DIR, "agents");
for (const agentFile of ["compatibility-scan-review.md","docs-reliability-review.md","startup-review.md","validation-review.md"]) {
const name = agentFile.replace(/\.md$/, "");
const prompt = await readFile(join(agentsDir, agentFile), "utf-8");
config.agent[name] = { description: name, mode: "subagent", prompt, permission: { edit: "deny", bash: "ask" } };
}

},


// No-op hooks for interface completeness
"tool.execute.before": async () => {},
});

export default AgentCompatibilityPlugin;
9 changes: 9 additions & 0 deletions cli-for-agent/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "cli-for-agent",
"version": "1.0.0",
"description": "Patterns for designing CLIs that coding agents can run reliably: non-interactive flags, layered help with examples, pipelines, actionable errors, idempotency, and dry-run.",
"author": {
"name": "Cursor",
"email": "plugins@cursor.com"
}
}
10 changes: 10 additions & 0 deletions cli-for-agent/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "cli-for-agent",
"version": "1.0.0",
"description": "Patterns for designing CLIs that coding agents can run reliably: non-interactive flags, layered help with examples, pipelines, actionable errors, idempotency, and dry-run.",
"author": {
"name": "Cursor",
"email": "plugins@cursor.com"
},
"skills": "./skills/"
}
9 changes: 9 additions & 0 deletions cli-for-agent/.grok-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "cli-for-agent",
"version": "1.0.0",
"description": "Patterns for designing CLIs that coding agents can run reliably: non-interactive flags, layered help with examples, pipelines, actionable errors, idempotency, and dry-run.",
"author": {
"name": "Cursor",
"email": "plugins@cursor.com"
}
}
Loading