@amsterdamdatalabs/enact-extensions 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -0
- package/README.md +88 -0
- package/catalog/enact-context.json +9 -0
- package/catalog/enact-factory.json +7 -0
- package/catalog/enact-operator.json +7 -0
- package/catalog/enact-wiki.json +7 -0
- package/catalog/net-revenue-management.json +8 -0
- package/dist/create/claude.d.ts +3 -0
- package/dist/create/claude.d.ts.map +1 -0
- package/dist/create/claude.js +12 -0
- package/dist/create/claude.js.map +1 -0
- package/dist/create/codex.d.ts +3 -0
- package/dist/create/codex.d.ts.map +1 -0
- package/dist/create/codex.js +14 -0
- package/dist/create/codex.js.map +1 -0
- package/dist/create/cursor.d.ts +3 -0
- package/dist/create/cursor.d.ts.map +1 -0
- package/dist/create/cursor.js +20 -0
- package/dist/create/cursor.js.map +1 -0
- package/dist/create/enact.d.ts +3 -0
- package/dist/create/enact.d.ts.map +1 -0
- package/dist/create/enact.js +32 -0
- package/dist/create/enact.js.map +1 -0
- package/dist/create/index.d.ts +18 -0
- package/dist/create/index.d.ts.map +1 -0
- package/dist/create/index.js +54 -0
- package/dist/create/index.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +60 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +250 -0
- package/dist/install.js.map +1 -0
- package/dist/internal/claude.d.ts +16 -0
- package/dist/internal/claude.d.ts.map +1 -0
- package/dist/internal/claude.js +35 -0
- package/dist/internal/claude.js.map +1 -0
- package/dist/internal/codex.d.ts +43 -0
- package/dist/internal/codex.d.ts.map +1 -0
- package/dist/internal/codex.js +205 -0
- package/dist/internal/codex.js.map +1 -0
- package/dist/internal/cursor.d.ts +2 -0
- package/dist/internal/cursor.d.ts.map +1 -0
- package/dist/internal/cursor.js +6 -0
- package/dist/internal/cursor.js.map +1 -0
- package/dist/internal/io.d.ts +3 -0
- package/dist/internal/io.d.ts.map +1 -0
- package/dist/internal/io.js +11 -0
- package/dist/internal/io.js.map +1 -0
- package/dist/internal/pick.d.ts +4 -0
- package/dist/internal/pick.d.ts.map +1 -0
- package/dist/internal/pick.js +17 -0
- package/dist/internal/pick.js.map +1 -0
- package/dist/internal/platform.d.ts +21 -0
- package/dist/internal/platform.d.ts.map +1 -0
- package/dist/internal/platform.js +120 -0
- package/dist/internal/platform.js.map +1 -0
- package/dist/internal/schema.d.ts +5 -0
- package/dist/internal/schema.d.ts.map +1 -0
- package/dist/internal/schema.js +37 -0
- package/dist/internal/schema.js.map +1 -0
- package/dist/internal/types.d.ts +49 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/internal/types.js +2 -0
- package/dist/internal/types.js.map +1 -0
- package/dist/validate/claude.d.ts +3 -0
- package/dist/validate/claude.d.ts.map +1 -0
- package/dist/validate/claude.js +11 -0
- package/dist/validate/claude.js.map +1 -0
- package/dist/validate/codex.d.ts +3 -0
- package/dist/validate/codex.d.ts.map +1 -0
- package/dist/validate/codex.js +11 -0
- package/dist/validate/codex.js.map +1 -0
- package/dist/validate/cursor.d.ts +3 -0
- package/dist/validate/cursor.d.ts.map +1 -0
- package/dist/validate/cursor.js +11 -0
- package/dist/validate/cursor.js.map +1 -0
- package/dist/validate/enact.d.ts +4 -0
- package/dist/validate/enact.d.ts.map +1 -0
- package/dist/validate/enact.js +18 -0
- package/dist/validate/enact.js.map +1 -0
- package/dist/validate/index.d.ts +17 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +99 -0
- package/dist/validate/index.js.map +1 -0
- package/package.json +58 -0
- package/plugins/net-revenue-management/.codex-plugin/plugin.json +35 -0
- package/plugins/net-revenue-management/.mcp.json +9 -0
- package/plugins/net-revenue-management/skills/net-revenue-risks/SKILL.md +30 -0
- package/plugins/net-revenue-management/skills/net-revenue-scenario/SKILL.md +31 -0
- package/scripts/enact-extensions.mjs +105 -0
- package/scripts/install.sh +70 -0
- package/scripts/lib/resolve-plugin-root.mjs +9 -0
- package/scripts/lib/run-install.mjs +66 -0
- package/scripts/lib/run-sync.mjs +24 -0
- package/scripts/lib/run-validate.mjs +36 -0
- package/scripts/rename-supervisor-to-operator.pl +66 -0
- package/scripts/setup-enact-context.sh +23 -0
- package/scripts/sync-manifests.mjs +23 -0
- package/scripts/validate-catalog.mjs +37 -0
- package/scripts/validate-plugin.mjs +10 -0
- package/spec/claude.json +99 -0
- package/spec/claude.md +485 -0
- package/spec/codex.json +154 -0
- package/spec/codex.md +145 -0
- package/spec/cursor.json +88 -0
- package/spec/cursor.md +175 -0
- package/spec/enact.json +211 -0
- package/spec/enact.md +204 -0
package/spec/codex.md
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Plugins
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Plugins bundle skills, app integrations, and MCP servers into reusable
|
|
6
|
+
workflows for Codex.
|
|
7
|
+
|
|
8
|
+
Extend what Codex can do, for example:
|
|
9
|
+
|
|
10
|
+
- Install the Gmail plugin to let Codex read and manage Gmail.
|
|
11
|
+
- Install the Google Drive plugin to work across Drive, Docs, Sheets, and
|
|
12
|
+
Slides.
|
|
13
|
+
- Install the Slack plugin to summarize channels or draft replies.
|
|
14
|
+
|
|
15
|
+
A plugin can contain:
|
|
16
|
+
|
|
17
|
+
- **Skills:** reusable instructions for specific kinds of work. Codex can load
|
|
18
|
+
them when needed so it follows the right steps and uses the right references
|
|
19
|
+
or helper scripts for a task.
|
|
20
|
+
- **Apps:** connections to tools like GitHub, Slack, or Google Drive, so
|
|
21
|
+
Codex can read information from those tools and take actions in them.
|
|
22
|
+
- **MCP servers:** services that give Codex access to additional tools or
|
|
23
|
+
shared information, often from systems outside your local project.
|
|
24
|
+
|
|
25
|
+
More plugin capabilities are coming soon.
|
|
26
|
+
|
|
27
|
+
## Use and install plugins
|
|
28
|
+
|
|
29
|
+
### Plugin Directory in the Codex app
|
|
30
|
+
|
|
31
|
+
Open **Plugins** in the Codex app to browse and install curated plugins.
|
|
32
|
+
|
|
33
|
+
<CodexScreenshot
|
|
34
|
+
alt="Codex Plugins page"
|
|
35
|
+
lightSrc="/images/codex/plugins/directory.png"
|
|
36
|
+
darkSrc="/images/codex/plugins/directory_dark.png"
|
|
37
|
+
/>
|
|
38
|
+
|
|
39
|
+
### Plugin directory in the CLI
|
|
40
|
+
|
|
41
|
+
In Codex CLI, run the following command to open the plugins list:
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
codex
|
|
45
|
+
/plugins
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
<CodexScreenshot
|
|
49
|
+
alt="Plugins list in Codex CLI"
|
|
50
|
+
lightSrc="/images/codex/plugins/cli_light.png"
|
|
51
|
+
darkSrc="/images/codex/plugins/codex-plugin-cli.png"
|
|
52
|
+
/>
|
|
53
|
+
|
|
54
|
+
The CLI plugin browser groups plugins by marketplace. Use the marketplace tabs
|
|
55
|
+
to switch sources, open a plugin to inspect details, install or uninstall
|
|
56
|
+
marketplace entries, and press <kbd>Space</kbd> on an installed plugin to toggle
|
|
57
|
+
its enabled state.
|
|
58
|
+
|
|
59
|
+
### Install and use a plugin
|
|
60
|
+
|
|
61
|
+
Once you open the plugin directory:
|
|
62
|
+
|
|
63
|
+
<WorkflowSteps>
|
|
64
|
+
|
|
65
|
+
1. Search or browse for a plugin, then open its details.
|
|
66
|
+
2. Select the install button. In the app, select the plus button or
|
|
67
|
+
**Add to Codex**. In the CLI, select `Install plugin`.
|
|
68
|
+
3. If the plugin needs an external app, connect it when prompted. Some plugins
|
|
69
|
+
ask you to authenticate during install. Others wait until the first time you
|
|
70
|
+
use them.
|
|
71
|
+
4. After installation, start a new thread and ask Codex to use the plugin.
|
|
72
|
+
|
|
73
|
+
</WorkflowSteps>
|
|
74
|
+
|
|
75
|
+
After you install a plugin, you can use it directly in the prompt window:
|
|
76
|
+
|
|
77
|
+
<CodexScreenshot
|
|
78
|
+
alt="Codex Plugins page"
|
|
79
|
+
lightSrc="/images/codex/plugins/plugin-github-invoke.png"
|
|
80
|
+
darkSrc="/images/codex/plugins/plugin-github-invoke-dark.png"
|
|
81
|
+
/>
|
|
82
|
+
|
|
83
|
+
<div class="not-prose mt-4 grid gap-4 md:grid-cols-2">
|
|
84
|
+
<div class="rounded-xl border border-subtle bg-surface px-5 py-4">
|
|
85
|
+
<p class="text-sm font-semibold text-default">Describe the task directly</p>
|
|
86
|
+
<p class="mt-2 text-sm text-secondary">
|
|
87
|
+
Ask for the outcome you want, such as "Summarize unread Gmail threads
|
|
88
|
+
from today" or "Pull the latest launch notes from Google Drive."
|
|
89
|
+
</p>
|
|
90
|
+
<p class="mt-3 text-sm text-secondary">
|
|
91
|
+
Use this when you want Codex to choose the right installed tools for the
|
|
92
|
+
task.
|
|
93
|
+
</p>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div class="rounded-xl border border-subtle bg-surface px-5 py-4">
|
|
97
|
+
<p class="text-sm font-semibold text-default">Choose a specific plugin</p>
|
|
98
|
+
<p class="mt-2 text-sm text-secondary">
|
|
99
|
+
Type <code>@</code> to invoke the plugin or one of its bundled skills
|
|
100
|
+
explicitly.
|
|
101
|
+
</p>
|
|
102
|
+
<p class="mt-3 text-sm text-secondary">
|
|
103
|
+
Use this when you want to be specific about which plugin or skill Codex
|
|
104
|
+
should use. See <a href="/codex/app/commands">Codex app commands</a> and{" "}
|
|
105
|
+
<a href="/codex/skills">Skills</a>.
|
|
106
|
+
</p>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
### How permissions and data sharing work
|
|
111
|
+
|
|
112
|
+
Installing a plugin makes its workflows available in Codex, but your existing
|
|
113
|
+
[approval settings](https://developers.openai.com/codex/agent-approvals-security) still apply. Any
|
|
114
|
+
connected external services remain subject to their own authentication,
|
|
115
|
+
privacy, and data-sharing policies.
|
|
116
|
+
|
|
117
|
+
- Bundled skills are available as soon as you install the plugin.
|
|
118
|
+
- If a plugin includes apps, Codex may prompt you to install or sign in to
|
|
119
|
+
those apps in ChatGPT during setup or the first time you use them.
|
|
120
|
+
- If a plugin includes MCP servers, they may require additional setup or
|
|
121
|
+
authentication before you can use them.
|
|
122
|
+
- When Codex sends data through a bundled app, that app's terms and privacy
|
|
123
|
+
policy apply.
|
|
124
|
+
|
|
125
|
+
### Remove or turn off a plugin
|
|
126
|
+
|
|
127
|
+
To remove a plugin, reopen it from the plugin browser and select
|
|
128
|
+
**Uninstall plugin**.
|
|
129
|
+
|
|
130
|
+
Uninstalling a plugin removes the plugin bundle from Codex, but bundled apps
|
|
131
|
+
stay installed until you manage them in ChatGPT.
|
|
132
|
+
|
|
133
|
+
If you want to keep a plugin installed but turn it off, set its entry in
|
|
134
|
+
`~/.codex/config.toml` to `enabled = false`, then restart Codex:
|
|
135
|
+
|
|
136
|
+
```toml
|
|
137
|
+
[plugins."gmail@openai-curated"]
|
|
138
|
+
enabled = false
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Build your own plugin
|
|
142
|
+
|
|
143
|
+
If you want to create, test, or distribute your own plugin, see
|
|
144
|
+
[Build plugins](https://developers.openai.com/codex/plugins/build). That page covers local scaffolding,
|
|
145
|
+
manual marketplace setup, plugin manifests, and packaging guidance.
|
package/spec/cursor.json
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "cursor-plugin.json",
|
|
4
|
+
"title": "Cursor Plugin Manifest",
|
|
5
|
+
"description": "Validates .cursor-plugin/plugin.json for Cursor plugins. Components (rules/, skills/, agents/, commands/, mcp.json, hooks/) are auto-discovered from default directories.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["name"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Unique plugin identifier and skill namespace prefix.",
|
|
13
|
+
"pattern": "^[a-z][a-z0-9-]*$"
|
|
14
|
+
},
|
|
15
|
+
"version": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Semantic version (MAJOR.MINOR.PATCH).",
|
|
18
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+$"
|
|
19
|
+
},
|
|
20
|
+
"description": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "Short description shown in the Cursor Marketplace."
|
|
23
|
+
},
|
|
24
|
+
"author": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"required": ["name"],
|
|
27
|
+
"additionalProperties": false,
|
|
28
|
+
"properties": {
|
|
29
|
+
"name": { "type": "string" },
|
|
30
|
+
"email": { "type": "string", "format": "email" },
|
|
31
|
+
"url": { "type": "string", "format": "uri" }
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"homepage": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"format": "uri",
|
|
37
|
+
"description": "Plugin or developer homepage URL."
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "URL to the source repository (must be public for marketplace submission)."
|
|
42
|
+
},
|
|
43
|
+
"license": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "SPDX license identifier (must be open source for marketplace submission)."
|
|
46
|
+
},
|
|
47
|
+
"keywords": {
|
|
48
|
+
"type": "array",
|
|
49
|
+
"items": { "type": "string" },
|
|
50
|
+
"uniqueItems": true,
|
|
51
|
+
"description": "Discovery tags for the Cursor Marketplace."
|
|
52
|
+
},
|
|
53
|
+
"logo": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"description": "Relative path to logo image (PNG/SVG) or absolute URL."
|
|
56
|
+
},
|
|
57
|
+
"rules": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"description": "Custom path to rules directory (.mdc files for persistent AI guidance).",
|
|
60
|
+
"default": "./rules/"
|
|
61
|
+
},
|
|
62
|
+
"skills": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"description": "Custom path to skills directory.",
|
|
65
|
+
"default": "./skills/"
|
|
66
|
+
},
|
|
67
|
+
"agents": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"description": "Custom path to agents directory.",
|
|
70
|
+
"default": "./agents/"
|
|
71
|
+
},
|
|
72
|
+
"commands": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"description": "Custom path to commands directory.",
|
|
75
|
+
"default": "./commands/"
|
|
76
|
+
},
|
|
77
|
+
"mcpServers": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"description": "Custom path to mcp.json MCP server configuration.",
|
|
80
|
+
"default": "./mcp.json"
|
|
81
|
+
},
|
|
82
|
+
"hooks": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"description": "Custom path to hooks directory or configuration.",
|
|
85
|
+
"default": "./hooks/"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
package/spec/cursor.md
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
> **Source:** [Cursor Plugins documentation](https://cursor.com/docs/plugins)
|
|
2
|
+
> **Also available as:** [plugins.md](https://cursor.com/docs/plugins.md)
|
|
3
|
+
> **Full reference:** [Plugins reference](https://cursor.com/docs/reference/plugins.md)
|
|
4
|
+
|
|
5
|
+
# Plugins
|
|
6
|
+
|
|
7
|
+
Plugins package rules, skills, agents, commands, MCP servers, and hooks into distributable bundles. Browse official plugins in the [Cursor Marketplace](https://cursor.com/marketplace). For community plugins and MCP servers, browse [cursor.directory](https://cursor.directory/). You can also [build your own](https://cursor.com/docs/plugins#creating-plugins) to share with other developers.
|
|
8
|
+
|
|
9
|
+
## What plugins contain
|
|
10
|
+
|
|
11
|
+
A plugin can bundle any combination of these components:
|
|
12
|
+
|
|
13
|
+
| Component | Description |
|
|
14
|
+
| :-------------- | :--------------------------------------------------------- |
|
|
15
|
+
| **Rules** | Persistent AI guidance and coding standards (`.mdc` files) |
|
|
16
|
+
| **Skills** | Specialized agent capabilities for complex tasks |
|
|
17
|
+
| **Agents** | Custom agent configurations and prompts |
|
|
18
|
+
| **Commands** | Agent-executable command files |
|
|
19
|
+
| **MCP Servers** | Model Context Protocol integrations |
|
|
20
|
+
| **Hooks** | Automation scripts triggered by events |
|
|
21
|
+
|
|
22
|
+
## The marketplace
|
|
23
|
+
|
|
24
|
+
The [Cursor Marketplace](https://cursor.com/marketplace) is where you discover and install official plugins. Plugins are distributed as Git repositories and submitted through the Cursor team. Every plugin is [manually reviewed](https://cursor.com/help/security-and-privacy/marketplace-security) before it's listed. Browse official plugins at [cursor.com/marketplace](https://cursor.com/marketplace) or search by keyword in the marketplace panel. For community plugins and MCP servers, browse [cursor.directory](https://cursor.directory/).
|
|
25
|
+
|
|
26
|
+
## Team marketplaces
|
|
27
|
+
|
|
28
|
+
Team marketplaces are available on Teams and Enterprise plans.
|
|
29
|
+
|
|
30
|
+
- **Teams plan:** up to 1 team marketplace
|
|
31
|
+
- **Enterprise plan:** unlimited team marketplaces
|
|
32
|
+
|
|
33
|
+
[Contact sales](https://cursor.com/contact-sales?source=docs-plugins) for unlimited team marketplaces and Enterprise admin controls.
|
|
34
|
+
|
|
35
|
+
The **Team Marketplaces** section appears below **Plugins** in dashboard settings.
|
|
36
|
+
|
|
37
|
+
On Enterprise plans, only admins can add team marketplaces from **Dashboard → Settings → Plugins**.
|
|
38
|
+
|
|
39
|
+
### Required vs optional plugins
|
|
40
|
+
|
|
41
|
+
When you assign a plugin to a distribution group, you can set it as required or optional:
|
|
42
|
+
|
|
43
|
+
- **Required:** After you click **Save**, the plugin is installed automatically for everyone in that distribution group.
|
|
44
|
+
- **Optional:** The plugin is available to everyone in that distribution group, and each developer can choose whether to install it.
|
|
45
|
+
|
|
46
|
+
### How do distribution groups work with SCIM?
|
|
47
|
+
|
|
48
|
+
Distribution groups can be controlled with [SCIM](https://cursor.com/docs/account/teams/scim)-synced directory groups. If your organization uses SCIM, manage group membership in your identity provider, and Cursor will sync those group updates.
|
|
49
|
+
|
|
50
|
+
## Add a team marketplace
|
|
51
|
+
|
|
52
|
+
Use this flow to import a GitHub repository as a team marketplace:
|
|
53
|
+
|
|
54
|
+
1. Go to **Dashboard → Settings → Plugins**.
|
|
55
|
+
2. In **Team Marketplaces**, click **Import**.
|
|
56
|
+
3. Paste the GitHub repository URL and continue.
|
|
57
|
+
4. Review the parsed plugins. Optionally set Team Access groups, then continue.
|
|
58
|
+
5. Set the marketplace name and description, then save.
|
|
59
|
+
|
|
60
|
+
Example repository to try:
|
|
61
|
+
|
|
62
|
+
- [fieldsphere/cursor-team-marketplace-template](https://github.com/fieldsphere/cursor-team-marketplace-template)
|
|
63
|
+
|
|
64
|
+
## Where developers find team marketplaces
|
|
65
|
+
|
|
66
|
+
Developers can find team marketplaces in the marketplace panel in Cursor.
|
|
67
|
+
|
|
68
|
+
- Open the marketplace panel in Cursor.
|
|
69
|
+
- Look for plugins from your team marketplace.
|
|
70
|
+
- Install optional plugins directly from that panel.
|
|
71
|
+
- Required plugins are installed automatically when admins save the required setting for your distribution group.
|
|
72
|
+
|
|
73
|
+
## Installing plugins
|
|
74
|
+
|
|
75
|
+
Install plugins from the marketplace. Plugins can be scoped to a project or installed at the user level.
|
|
76
|
+
|
|
77
|
+
### MCP Apps deeplinks
|
|
78
|
+
|
|
79
|
+
Share MCP server configurations using install links:
|
|
80
|
+
|
|
81
|
+
```text
|
|
82
|
+
cursor://anysphere.cursor-deeplink/mcp/install?name=$NAME&config=$BASE64_ENCODED_CONFIG
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
See [MCP install links](https://cursor.com/docs/mcp/install-links) for details on generating these links.
|
|
86
|
+
|
|
87
|
+
## Managing installed plugins
|
|
88
|
+
|
|
89
|
+
### MCP servers
|
|
90
|
+
|
|
91
|
+
Toggle MCP servers on or off from Cursor Settings:
|
|
92
|
+
|
|
93
|
+
1. Open Settings (Cmd+Shift+J)
|
|
94
|
+
2. Go to **Features → Model Context Protocol**
|
|
95
|
+
3. Click the toggle next to any server
|
|
96
|
+
|
|
97
|
+
Disabled servers won't load or appear in chat.
|
|
98
|
+
|
|
99
|
+
### Rules and skills
|
|
100
|
+
|
|
101
|
+
Manage rules and skills from the Rules section of Cursor Settings. Toggle individual rules between **Always**, **Agent Decides**, and **Manual** modes. Skills appear in the **Agent Decides** section and can be invoked manually with `/skill-name` in chat.
|
|
102
|
+
|
|
103
|
+
## Using the workspaceOpen hook
|
|
104
|
+
|
|
105
|
+
A `workspaceOpen` hook can return plugin paths to load on workspace open, which is useful when the set of plugins depends on the workspace itself.
|
|
106
|
+
|
|
107
|
+
### Hooks reference
|
|
108
|
+
|
|
109
|
+
Register plugin paths from a `workspaceOpen` hook script. See the [Hooks reference](https://cursor.com/docs/reference/plugins) for hook script details.
|
|
110
|
+
|
|
111
|
+
## Creating plugins
|
|
112
|
+
|
|
113
|
+
A plugin is a directory with a `.cursor-plugin/plugin.json` manifest and your components (rules, skills, agents, commands, hooks, or MCP servers). Start from the [plugin template repository](https://github.com/cursor/plugin-template) or create one from scratch:
|
|
114
|
+
|
|
115
|
+
```text
|
|
116
|
+
my-plugin/
|
|
117
|
+
├── .cursor-plugin/
|
|
118
|
+
│ └── plugin.json
|
|
119
|
+
├── rules/
|
|
120
|
+
│ └── coding-standards.mdc
|
|
121
|
+
├── skills/
|
|
122
|
+
│ └── code-reviewer/
|
|
123
|
+
│ └── SKILL.md
|
|
124
|
+
└── mcp.json
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The manifest only requires a `name` field. Components are discovered automatically from their default directories, or you can specify custom paths in the manifest.
|
|
128
|
+
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"name": "my-plugin",
|
|
132
|
+
"description": "Custom development tools",
|
|
133
|
+
"version": "1.0.0",
|
|
134
|
+
"author": { "name": "Your Name" }
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Test plugins locally
|
|
139
|
+
|
|
140
|
+
Before you publish, load your plugin from `~/.cursor/plugins/local`:
|
|
141
|
+
|
|
142
|
+
1. Create a folder for your plugin: `~/.cursor/plugins/local/my-plugin`
|
|
143
|
+
2. Copy your plugin files into that folder. Make sure `.cursor-plugin/plugin.json` is at the plugin root.
|
|
144
|
+
3. Restart Cursor, or run **Developer: Reload Window**.
|
|
145
|
+
4. Verify your plugin components load in Cursor, such as rules, skills, or MCP servers.
|
|
146
|
+
|
|
147
|
+
For faster iteration, symlink your plugin repository:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
ln -s /path/to/my-plugin ~/.cursor/plugins/local/my-plugin
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
When your plugin is ready, submit it for review at [cursor.com/marketplace/publish](https://cursor.com/marketplace/publish). For multi-plugin repositories, add a marketplace manifest at `.cursor-plugin/marketplace.json`.
|
|
154
|
+
|
|
155
|
+
See the [Plugins reference](https://cursor.com/docs/reference/plugins) for the full manifest schema, component formats, and submission checklist.
|
|
156
|
+
|
|
157
|
+
### Team and Enterprise marketplaces
|
|
158
|
+
|
|
159
|
+
Upgrade for private team marketplaces and organization-wide plugin distribution.
|
|
160
|
+
|
|
161
|
+
## FAQ
|
|
162
|
+
|
|
163
|
+
### Are marketplace plugins reviewed for security?
|
|
164
|
+
|
|
165
|
+
Yes. Every plugin is manually reviewed before it's listed. All plugins must be open source, and we review each update before publishing. See [Marketplace security](https://cursor.com/help/security-and-privacy/marketplace-security) for details on vetting, update reviews, and how to report issues.
|
|
166
|
+
|
|
167
|
+
### How do I create a plugin?
|
|
168
|
+
|
|
169
|
+
Create a directory with a `.cursor-plugin/plugin.json` manifest file, add your rules, skills, agents, commands, or other components, and submit it to the Cursor team. See the [Plugins reference](https://cursor.com/docs/reference/plugins) for the full guide.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Related documentation
|
|
174
|
+
|
|
175
|
+
- [Overview of all docs pages](https://cursor.com/llms.txt) — documentation index for discovery
|
package/spec/enact.json
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "enact-plugin.json",
|
|
4
|
+
"title": "Enact Plugin Manifest",
|
|
5
|
+
"description": "Validates .agents/plugin.json — the canonical Enact plugin format. Superset of the Codex format with explicit component paths, slash commands, multi-platform targets, and Enact Factory integration fields.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["name"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Unique plugin identifier. Used as the skill namespace prefix across all target platforms.",
|
|
13
|
+
"pattern": "^[a-z][a-z0-9-]*$"
|
|
14
|
+
},
|
|
15
|
+
"version": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Semantic version (MAJOR.MINOR.PATCH).",
|
|
18
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+$"
|
|
19
|
+
},
|
|
20
|
+
"description": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "Short description shown in the Enact plugin registry."
|
|
23
|
+
},
|
|
24
|
+
"author": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"required": ["name"],
|
|
27
|
+
"additionalProperties": false,
|
|
28
|
+
"properties": {
|
|
29
|
+
"name": { "type": "string" },
|
|
30
|
+
"email": { "type": "string", "format": "email" },
|
|
31
|
+
"url": { "type": "string", "format": "uri" }
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"homepage": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"format": "uri",
|
|
37
|
+
"description": "Plugin or developer homepage URL."
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "URL to the source repository."
|
|
42
|
+
},
|
|
43
|
+
"license": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "SPDX license identifier or UNLICENSED."
|
|
46
|
+
},
|
|
47
|
+
"keywords": {
|
|
48
|
+
"type": "array",
|
|
49
|
+
"items": { "type": "string" },
|
|
50
|
+
"uniqueItems": true,
|
|
51
|
+
"description": "Discovery tags for the Enact plugin registry."
|
|
52
|
+
},
|
|
53
|
+
"targets": {
|
|
54
|
+
"type": "array",
|
|
55
|
+
"description": "Agent platforms this plugin is built for. Drives platform-specific manifest generation.",
|
|
56
|
+
"items": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"enum": ["claude", "codex", "cursor"]
|
|
59
|
+
},
|
|
60
|
+
"uniqueItems": true,
|
|
61
|
+
"minItems": 1
|
|
62
|
+
},
|
|
63
|
+
"skills": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"description": "Relative path to the skills directory.",
|
|
66
|
+
"default": "./skills/"
|
|
67
|
+
},
|
|
68
|
+
"agents": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"description": "Relative path to the agents directory.",
|
|
71
|
+
"default": "./agents/"
|
|
72
|
+
},
|
|
73
|
+
"commands": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"description": "Relative path to the commands directory (flat Markdown files).",
|
|
76
|
+
"default": "./commands/"
|
|
77
|
+
},
|
|
78
|
+
"hooks": {
|
|
79
|
+
"type": "string",
|
|
80
|
+
"description": "Relative path to the hooks configuration file.",
|
|
81
|
+
"default": "./hooks/hooks.json"
|
|
82
|
+
},
|
|
83
|
+
"mcpServers": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"description": "Relative path to the .mcp.json MCP server configuration file.",
|
|
86
|
+
"default": "./.mcp.json"
|
|
87
|
+
},
|
|
88
|
+
"apps": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"description": "Relative path to the .app.json app connections file (Codex target only).",
|
|
91
|
+
"default": "./.app.json"
|
|
92
|
+
},
|
|
93
|
+
"lsp": {
|
|
94
|
+
"type": "string",
|
|
95
|
+
"description": "Relative path to the .lsp.json LSP server configuration (Claude target only).",
|
|
96
|
+
"default": "./.lsp.json"
|
|
97
|
+
},
|
|
98
|
+
"monitors": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"description": "Relative path to monitors configuration file (Claude target only).",
|
|
101
|
+
"default": "./monitors/monitors.json"
|
|
102
|
+
},
|
|
103
|
+
"settings": {
|
|
104
|
+
"type": "string",
|
|
105
|
+
"description": "Relative path to default settings applied when the plugin is enabled.",
|
|
106
|
+
"default": "./settings.json"
|
|
107
|
+
},
|
|
108
|
+
"bin": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"description": "Relative path to executables added to the Bash PATH while the plugin is active.",
|
|
111
|
+
"default": "./bin/"
|
|
112
|
+
},
|
|
113
|
+
"interface": {
|
|
114
|
+
"type": "object",
|
|
115
|
+
"description": "Display metadata for the Enact plugin registry and Codex plugin directory UI.",
|
|
116
|
+
"required": ["displayName", "shortDescription"],
|
|
117
|
+
"additionalProperties": false,
|
|
118
|
+
"properties": {
|
|
119
|
+
"displayName": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"description": "Human-readable plugin name shown in the UI."
|
|
122
|
+
},
|
|
123
|
+
"shortDescription": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"description": "One-line description for plugin cards.",
|
|
126
|
+
"maxLength": 120
|
|
127
|
+
},
|
|
128
|
+
"longDescription": {
|
|
129
|
+
"type": "string",
|
|
130
|
+
"description": "Full description shown on the plugin detail page."
|
|
131
|
+
},
|
|
132
|
+
"developerName": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"description": "Developer or organization name displayed in the UI."
|
|
135
|
+
},
|
|
136
|
+
"category": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"description": "Plugin category for registry filtering.",
|
|
139
|
+
"enum": [
|
|
140
|
+
"Developer Tools",
|
|
141
|
+
"Productivity",
|
|
142
|
+
"Communication",
|
|
143
|
+
"Data",
|
|
144
|
+
"Finance",
|
|
145
|
+
"Design",
|
|
146
|
+
"Other"
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
"composerIcon": {
|
|
150
|
+
"type": "string",
|
|
151
|
+
"description": "Relative path to a small composer icon (PNG, recommended ≤256×256 px)."
|
|
152
|
+
},
|
|
153
|
+
"logo": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"description": "Relative path to the full logo image (PNG)."
|
|
156
|
+
},
|
|
157
|
+
"capabilities": {
|
|
158
|
+
"type": "array",
|
|
159
|
+
"items": { "type": "string" },
|
|
160
|
+
"description": "Human-readable list of capabilities shown in the registry."
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"factory": {
|
|
165
|
+
"type": "object",
|
|
166
|
+
"description": "Enact Factory integration settings.",
|
|
167
|
+
"additionalProperties": false,
|
|
168
|
+
"properties": {
|
|
169
|
+
"firstParty": {
|
|
170
|
+
"type": "boolean",
|
|
171
|
+
"description": "Marks this as a first-party Enact Factory plugin. Enables elevated trust in the factory runtime.",
|
|
172
|
+
"default": false
|
|
173
|
+
},
|
|
174
|
+
"bundledMcpProviders": {
|
|
175
|
+
"type": "array",
|
|
176
|
+
"items": { "type": "string" },
|
|
177
|
+
"description": "MCP provider names that this plugin delegates heavy behavior to (e.g. enact-context, enact-wiki).",
|
|
178
|
+
"uniqueItems": true
|
|
179
|
+
},
|
|
180
|
+
"operatorScope": {
|
|
181
|
+
"type": "string",
|
|
182
|
+
"description": "Factory operator scope this plugin operates within.",
|
|
183
|
+
"enum": ["global", "project", "session"]
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
"operator": {
|
|
188
|
+
"type": "object",
|
|
189
|
+
"description": "Enact Operator operator integration settings.",
|
|
190
|
+
"additionalProperties": false,
|
|
191
|
+
"properties": {
|
|
192
|
+
"firstParty": {
|
|
193
|
+
"type": "boolean",
|
|
194
|
+
"description": "Marks this as a first-party Enact Operator plugin. Enables elevated trust in the operator runtime.",
|
|
195
|
+
"default": false
|
|
196
|
+
},
|
|
197
|
+
"bundledMcpProviders": {
|
|
198
|
+
"type": "array",
|
|
199
|
+
"items": { "type": "string" },
|
|
200
|
+
"description": "MCP provider names that this plugin delegates heavy behaviour to (e.g. enact-context, enact-wiki).",
|
|
201
|
+
"uniqueItems": true
|
|
202
|
+
},
|
|
203
|
+
"operatorScope": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"description": "Operator scope this plugin operates within.",
|
|
206
|
+
"enum": ["global", "project", "session"]
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|