@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.
Files changed (111) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/README.md +88 -0
  3. package/catalog/enact-context.json +9 -0
  4. package/catalog/enact-factory.json +7 -0
  5. package/catalog/enact-operator.json +7 -0
  6. package/catalog/enact-wiki.json +7 -0
  7. package/catalog/net-revenue-management.json +8 -0
  8. package/dist/create/claude.d.ts +3 -0
  9. package/dist/create/claude.d.ts.map +1 -0
  10. package/dist/create/claude.js +12 -0
  11. package/dist/create/claude.js.map +1 -0
  12. package/dist/create/codex.d.ts +3 -0
  13. package/dist/create/codex.d.ts.map +1 -0
  14. package/dist/create/codex.js +14 -0
  15. package/dist/create/codex.js.map +1 -0
  16. package/dist/create/cursor.d.ts +3 -0
  17. package/dist/create/cursor.d.ts.map +1 -0
  18. package/dist/create/cursor.js +20 -0
  19. package/dist/create/cursor.js.map +1 -0
  20. package/dist/create/enact.d.ts +3 -0
  21. package/dist/create/enact.d.ts.map +1 -0
  22. package/dist/create/enact.js +32 -0
  23. package/dist/create/enact.js.map +1 -0
  24. package/dist/create/index.d.ts +18 -0
  25. package/dist/create/index.d.ts.map +1 -0
  26. package/dist/create/index.js +54 -0
  27. package/dist/create/index.js.map +1 -0
  28. package/dist/index.d.ts +14 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +9 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/install.d.ts +60 -0
  33. package/dist/install.d.ts.map +1 -0
  34. package/dist/install.js +250 -0
  35. package/dist/install.js.map +1 -0
  36. package/dist/internal/claude.d.ts +16 -0
  37. package/dist/internal/claude.d.ts.map +1 -0
  38. package/dist/internal/claude.js +35 -0
  39. package/dist/internal/claude.js.map +1 -0
  40. package/dist/internal/codex.d.ts +43 -0
  41. package/dist/internal/codex.d.ts.map +1 -0
  42. package/dist/internal/codex.js +205 -0
  43. package/dist/internal/codex.js.map +1 -0
  44. package/dist/internal/cursor.d.ts +2 -0
  45. package/dist/internal/cursor.d.ts.map +1 -0
  46. package/dist/internal/cursor.js +6 -0
  47. package/dist/internal/cursor.js.map +1 -0
  48. package/dist/internal/io.d.ts +3 -0
  49. package/dist/internal/io.d.ts.map +1 -0
  50. package/dist/internal/io.js +11 -0
  51. package/dist/internal/io.js.map +1 -0
  52. package/dist/internal/pick.d.ts +4 -0
  53. package/dist/internal/pick.d.ts.map +1 -0
  54. package/dist/internal/pick.js +17 -0
  55. package/dist/internal/pick.js.map +1 -0
  56. package/dist/internal/platform.d.ts +21 -0
  57. package/dist/internal/platform.d.ts.map +1 -0
  58. package/dist/internal/platform.js +120 -0
  59. package/dist/internal/platform.js.map +1 -0
  60. package/dist/internal/schema.d.ts +5 -0
  61. package/dist/internal/schema.d.ts.map +1 -0
  62. package/dist/internal/schema.js +37 -0
  63. package/dist/internal/schema.js.map +1 -0
  64. package/dist/internal/types.d.ts +49 -0
  65. package/dist/internal/types.d.ts.map +1 -0
  66. package/dist/internal/types.js +2 -0
  67. package/dist/internal/types.js.map +1 -0
  68. package/dist/validate/claude.d.ts +3 -0
  69. package/dist/validate/claude.d.ts.map +1 -0
  70. package/dist/validate/claude.js +11 -0
  71. package/dist/validate/claude.js.map +1 -0
  72. package/dist/validate/codex.d.ts +3 -0
  73. package/dist/validate/codex.d.ts.map +1 -0
  74. package/dist/validate/codex.js +11 -0
  75. package/dist/validate/codex.js.map +1 -0
  76. package/dist/validate/cursor.d.ts +3 -0
  77. package/dist/validate/cursor.d.ts.map +1 -0
  78. package/dist/validate/cursor.js +11 -0
  79. package/dist/validate/cursor.js.map +1 -0
  80. package/dist/validate/enact.d.ts +4 -0
  81. package/dist/validate/enact.d.ts.map +1 -0
  82. package/dist/validate/enact.js +18 -0
  83. package/dist/validate/enact.js.map +1 -0
  84. package/dist/validate/index.d.ts +17 -0
  85. package/dist/validate/index.d.ts.map +1 -0
  86. package/dist/validate/index.js +99 -0
  87. package/dist/validate/index.js.map +1 -0
  88. package/package.json +58 -0
  89. package/plugins/net-revenue-management/.codex-plugin/plugin.json +35 -0
  90. package/plugins/net-revenue-management/.mcp.json +9 -0
  91. package/plugins/net-revenue-management/skills/net-revenue-risks/SKILL.md +30 -0
  92. package/plugins/net-revenue-management/skills/net-revenue-scenario/SKILL.md +31 -0
  93. package/scripts/enact-extensions.mjs +105 -0
  94. package/scripts/install.sh +70 -0
  95. package/scripts/lib/resolve-plugin-root.mjs +9 -0
  96. package/scripts/lib/run-install.mjs +66 -0
  97. package/scripts/lib/run-sync.mjs +24 -0
  98. package/scripts/lib/run-validate.mjs +36 -0
  99. package/scripts/rename-supervisor-to-operator.pl +66 -0
  100. package/scripts/setup-enact-context.sh +23 -0
  101. package/scripts/sync-manifests.mjs +23 -0
  102. package/scripts/validate-catalog.mjs +37 -0
  103. package/scripts/validate-plugin.mjs +10 -0
  104. package/spec/claude.json +99 -0
  105. package/spec/claude.md +485 -0
  106. package/spec/codex.json +154 -0
  107. package/spec/codex.md +145 -0
  108. package/spec/cursor.json +88 -0
  109. package/spec/cursor.md +175 -0
  110. package/spec/enact.json +211 -0
  111. 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.
@@ -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
@@ -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
+ }