@amsterdamdatalabs/enact-extensions 0.1.0 → 0.1.1
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/README.md +94 -20
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +89 -0
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +219 -18
- package/dist/install.js.map +1 -1
- package/dist/validate/index.d.ts +21 -0
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +77 -0
- package/dist/validate/index.js.map +1 -1
- package/extensions/cmux/.agents/plugin.json +37 -0
- package/extensions/cmux/skills/cmux/SKILL.md +82 -0
- package/extensions/cmux/skills/cmux/agents/openai.yaml +4 -0
- package/extensions/cmux/skills/cmux/references/handles-and-identify.md +35 -0
- package/extensions/cmux/skills/cmux/references/panes-surfaces.md +37 -0
- package/extensions/cmux/skills/cmux/references/trigger-flash-and-health.md +23 -0
- package/extensions/cmux/skills/cmux/references/windows-workspaces.md +31 -0
- package/extensions/cmux/skills/cmux-vm-monitor/SKILL.md +122 -0
- package/extensions/cmux/skills/cmux-vm-monitor/agents/openai.yaml +4 -0
- package/extensions/cmux/skills/cmux-vm-monitor/references/cmux-commands.md +66 -0
- package/extensions/cmux/skills/cmux-vm-monitor/scripts/codex_vm_monitor.sh +45 -0
- package/extensions/cmux/skills/cmux-workspace/SKILL.md +93 -0
- package/extensions/dev-state/.agents/plugin.json +35 -0
- package/extensions/dev-state/skills/dev-state-plan-graduation/SKILL.md +194 -0
- package/extensions/dev-state/skills/dev-state-plan-graduation/agents/openai.yaml +4 -0
- package/extensions/dev-state/skills/dev-state-plan-graduation/references/reference.md +130 -0
- package/extensions/devops/.agents/plugin.json +36 -0
- package/extensions/devops/skills/azure-devops-cli/SKILL.md +431 -0
- package/extensions/devops/skills/azure-devops-cli/agents/openai.yaml +4 -0
- package/extensions/devops/skills/ci-pipeline-strategy/SKILL.md +217 -0
- package/extensions/devops/skills/ci-pipeline-strategy/agents/openai.yaml +4 -0
- package/{plugins/net-revenue-management/.codex-plugin → extensions/net-revenue-management/.agents}/plugin.json +10 -6
- package/extensions/plugin-dev/.agents/plugin.json +42 -0
- package/extensions/plugin-dev/.mcp.json +3 -0
- package/extensions/plugin-dev/agents/agent-creator.md +199 -0
- package/extensions/plugin-dev/agents/plugin-validator.md +91 -0
- package/extensions/plugin-dev/agents/skill-reviewer.md +212 -0
- package/extensions/plugin-dev/commands/_archive/create-marketplace.md +427 -0
- package/extensions/plugin-dev/commands/_archive/plugin-dev-guide.md +12 -0
- package/extensions/plugin-dev/commands/create-plugin.md +498 -0
- package/extensions/plugin-dev/commands/start.md +81 -0
- package/extensions/plugin-dev/hooks/hooks.json +3 -0
- package/extensions/plugin-dev/skills/agent-development/SKILL.md +641 -0
- package/extensions/plugin-dev/skills/agent-development/examples/agent-creation-prompt.md +250 -0
- package/extensions/plugin-dev/skills/agent-development/examples/complete-agent-examples.md +461 -0
- package/extensions/plugin-dev/skills/agent-development/references/advanced-agent-fields.md +246 -0
- package/extensions/plugin-dev/skills/agent-development/references/agent-creation-system-prompt.md +216 -0
- package/extensions/plugin-dev/skills/agent-development/references/permission-modes-rules.md +226 -0
- package/extensions/plugin-dev/skills/agent-development/references/system-prompt-design.md +464 -0
- package/extensions/plugin-dev/skills/agent-development/references/triggering-examples.md +474 -0
- package/extensions/plugin-dev/skills/agent-development/scripts/create-agent-skeleton.sh +176 -0
- package/extensions/plugin-dev/skills/agent-development/scripts/test-agent-trigger.sh +227 -0
- package/extensions/plugin-dev/skills/agent-development/scripts/validate-agent.sh +227 -0
- package/extensions/plugin-dev/skills/command-development/SKILL.md +763 -0
- package/extensions/plugin-dev/skills/command-development/examples/plugin-commands.md +612 -0
- package/extensions/plugin-dev/skills/command-development/examples/simple-commands.md +527 -0
- package/extensions/plugin-dev/skills/command-development/references/advanced-workflows.md +762 -0
- package/extensions/plugin-dev/skills/command-development/references/documentation-patterns.md +769 -0
- package/extensions/plugin-dev/skills/command-development/references/frontmatter-reference.md +508 -0
- package/extensions/plugin-dev/skills/command-development/references/interactive-commands.md +966 -0
- package/extensions/plugin-dev/skills/command-development/references/marketplace-considerations.md +943 -0
- package/extensions/plugin-dev/skills/command-development/references/plugin-features-reference.md +637 -0
- package/extensions/plugin-dev/skills/command-development/references/plugin-integration.md +191 -0
- package/extensions/plugin-dev/skills/command-development/references/skill-tool.md +447 -0
- package/extensions/plugin-dev/skills/command-development/references/testing-strategies.md +723 -0
- package/extensions/plugin-dev/skills/command-development/scripts/check-frontmatter.sh +234 -0
- package/extensions/plugin-dev/skills/command-development/scripts/validate-command.sh +160 -0
- package/extensions/plugin-dev/skills/hook-development/SKILL.md +861 -0
- package/extensions/plugin-dev/skills/hook-development/examples/load-context.sh +55 -0
- package/extensions/plugin-dev/skills/hook-development/examples/validate-bash.sh +57 -0
- package/extensions/plugin-dev/skills/hook-development/examples/validate-write.sh +48 -0
- package/extensions/plugin-dev/skills/hook-development/references/advanced.md +871 -0
- package/extensions/plugin-dev/skills/hook-development/references/hook-input-schemas.md +145 -0
- package/extensions/plugin-dev/skills/hook-development/references/migration.md +392 -0
- package/extensions/plugin-dev/skills/hook-development/references/patterns.md +430 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/README.md +181 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/hook-linter.sh +153 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/test-hook.sh +276 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/validate-hook-schema.sh +159 -0
- package/extensions/plugin-dev/skills/mcp-integration/SKILL.md +775 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/http-server.json +20 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/sse-server.json +19 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/stdio-server.json +38 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/ws-server.json +26 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/authentication.md +601 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/server-discovery.md +190 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/server-types.md +572 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/tool-usage.md +623 -0
- package/extensions/plugin-dev/skills/plugin-dev-guide/SKILL.md +222 -0
- package/extensions/plugin-dev/skills/plugin-structure/SKILL.md +705 -0
- package/extensions/plugin-dev/skills/plugin-structure/examples/advanced-plugin.md +774 -0
- package/extensions/plugin-dev/skills/plugin-structure/examples/minimal-plugin.md +83 -0
- package/extensions/plugin-dev/skills/plugin-structure/examples/standard-plugin.md +611 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/advanced-topics.md +289 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/component-patterns.md +592 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/github-actions.md +233 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/headless-ci-mode.md +193 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/manifest-reference.md +625 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/output-styles.md +116 -0
- package/extensions/plugin-dev/skills/skill-development/SKILL.md +564 -0
- package/extensions/plugin-dev/skills/skill-development/examples/complete-skill.md +465 -0
- package/extensions/plugin-dev/skills/skill-development/examples/frontmatter-templates.md +167 -0
- package/extensions/plugin-dev/skills/skill-development/examples/minimal-skill.md +111 -0
- package/extensions/plugin-dev/skills/skill-development/references/advanced-frontmatter.md +225 -0
- package/extensions/plugin-dev/skills/skill-development/references/commands-vs-skills.md +39 -0
- package/extensions/plugin-dev/skills/skill-development/references/skill-creation-workflow.md +379 -0
- package/extensions/plugin-dev/skills/skill-development/references/skill-creator-original.md +210 -0
- package/package.json +8 -11
- package/scripts/enact-extensions.mjs +751 -16
- package/scripts/hooks/session-start-drift-check.mjs +58 -0
- package/scripts/lib/build-index.mjs +50 -0
- package/scripts/lib/bundle-hash.mjs +137 -0
- package/scripts/lib/hooks.mjs +389 -0
- package/scripts/lib/ledger.mjs +162 -0
- package/scripts/lib/list-bundles.mjs +70 -0
- package/scripts/lib/outdated.mjs +144 -0
- package/scripts/lib/provision-mcp.mjs +369 -0
- package/scripts/lib/resolve-bundle.mjs +121 -0
- package/scripts/lib/run-install.mjs +321 -39
- package/scripts/lib/run-uninstall.mjs +220 -0
- package/scripts/lib/run-update.mjs +152 -0
- package/scripts/lib/run-validate.mjs +12 -18
- package/scripts/lib/serve.mjs +454 -0
- package/scripts/postinstall.mjs +63 -0
- package/scripts/setup-enact-context.sh +2 -2
- package/spec/index.json +59 -0
- package/web/assets/README.md +111 -0
- package/web/assets/logo-full.png +0 -0
- package/web/assets/logo-slim.png +0 -0
- package/web/assets/tokens/base.css +45 -0
- package/web/assets/tokens/colors.css +248 -0
- package/web/assets/tokens/effects.css +24 -0
- package/web/assets/tokens/fonts.css +8 -0
- package/web/assets/tokens/index.css +18 -0
- package/web/assets/tokens/spacing.css +50 -0
- package/web/index.html +1188 -0
- package/.agents/plugins/marketplace.json +0 -20
- package/catalog/enact-context.json +0 -9
- package/catalog/enact-factory.json +0 -7
- package/catalog/enact-operator.json +0 -7
- package/catalog/enact-wiki.json +0 -7
- package/catalog/net-revenue-management.json +0 -8
- package/scripts/rename-supervisor-to-operator.pl +0 -66
- package/scripts/sync-manifests.mjs +0 -23
- package/scripts/validate-catalog.mjs +0 -37
- package/scripts/validate-plugin.mjs +0 -10
- /package/{plugins → extensions}/net-revenue-management/.mcp.json +0 -0
- /package/{plugins → extensions}/net-revenue-management/skills/net-revenue-risks/SKILL.md +0 -0
- /package/{plugins → extensions}/net-revenue-management/skills/net-revenue-scenario/SKILL.md +0 -0
package/README.md
CHANGED
|
@@ -3,24 +3,24 @@
|
|
|
3
3
|
Multi-surface **plugin manifest** tooling for Enact: schemas, validation, sync, and the plugin-dev toolkit for ENACT-native bundles plus derived Claude Code, Codex, and Cursor projections.
|
|
4
4
|
|
|
5
5
|
**Repository:** https://dev.azure.com/amsterdamdatalabs/Enact/_git/enact-extensions
|
|
6
|
-
**Package:** `@enact
|
|
6
|
+
**Package:** `@amsterdamdatalabs/enact-extensions`
|
|
7
7
|
**CLI:** `enact-extensions`
|
|
8
8
|
|
|
9
9
|
## Scope
|
|
10
10
|
|
|
11
|
-
This repo is the manifest tooling package (`@enact
|
|
11
|
+
This repo is the manifest tooling package (`@amsterdamdatalabs/enact-extensions`) plus a set of self-contained plugin bundles under `extensions/`. It owns:
|
|
12
12
|
|
|
13
|
-
- `spec/` — JSON schemas (canonical: `enact.json`) + per-host schemas (`claude-plugin.json`, `codex-plugin.json`, `cursor-plugin.json`)
|
|
14
|
-
- `src/` — `create
|
|
15
|
-
- `scripts/` — CLI: `enact-extensions` (`validate` | `sync` | `install`, path defaults to cwd)
|
|
16
|
-
- `extensions
|
|
17
|
-
- `
|
|
13
|
+
- `spec/` — JSON schemas (canonical: `enact.json`) + per-host schemas (`claude-plugin.json`, `codex-plugin.json`, `cursor-plugin.json`) + `index.json` (discovery index schema)
|
|
14
|
+
- `src/` — `create/*`, `validate/*`, and `install` TypeScript library
|
|
15
|
+
- `scripts/` — CLI: `enact-extensions` (`validate` | `sync` | `install` | `uninstall` | `list` | `index` | `log` | `outdated` | `update` | `serve` | `hooks`, path defaults to cwd)
|
|
16
|
+
- `extensions/<plugin>/` — one self-contained bundle per plugin (e.g. `plugin-dev`, `cmux`, `devops`, `dev-state`, `net-revenue-management`), each with a canonical `.agents/plugin.json` + skills/agents/hooks
|
|
17
|
+
- `web/` — vendored ADL design assets (`web/assets/tokens/*.css`, `web/assets/logo-*.png`) + `web/index.html` (the management UI served by `serve`)
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Distribution is **install-only**: there is no pre-built marketplace artifact and no central registry. `enact-extensions install <bundle>` projects the per-surface manifest from `.agents/plugin.json` on the fly, copies the bundle into the target home, and enables it.
|
|
20
20
|
|
|
21
21
|
## Surface Contract
|
|
22
22
|
|
|
23
|
-
`extensions
|
|
23
|
+
Each `extensions/<plugin>/.agents/plugin.json` is the canonical source manifest. `enact-extensions sync` (and `install`) derive `.claude-plugin/`, `.codex-plugin/`, and `.cursor-plugin/` from that source — those projections are generated, never committed.
|
|
24
24
|
|
|
25
25
|
Author skills, commands, and hooks so they are valid on **all projected surfaces by default**:
|
|
26
26
|
|
|
@@ -44,21 +44,63 @@ This repo has no submodules of its own. Sibling product packages are submoduled
|
|
|
44
44
|
```bash
|
|
45
45
|
npm install
|
|
46
46
|
npm run build
|
|
47
|
-
npm run validate # validate
|
|
48
|
-
npm run sync # regenerate host manifests for
|
|
49
|
-
npm run validate:catalog
|
|
47
|
+
npm run validate # validate the plugin-dev bundle
|
|
48
|
+
npm run sync # regenerate host manifests for plugin-dev from .agents/plugin.json
|
|
50
49
|
```
|
|
51
50
|
|
|
52
|
-
To validate
|
|
51
|
+
To validate, install, list, or index any bundle:
|
|
53
52
|
|
|
54
53
|
```bash
|
|
55
54
|
npm run build
|
|
56
|
-
node scripts/enact-extensions.mjs validate
|
|
55
|
+
node scripts/enact-extensions.mjs validate extensions/net-revenue-management
|
|
56
|
+
node scripts/enact-extensions.mjs install extensions/net-revenue-management --platform enact --global
|
|
57
|
+
node scripts/enact-extensions.mjs install extensions/net-revenue-management --platform enact --local
|
|
58
|
+
|
|
59
|
+
# Install by bare name (resolves from extensions/ tree)
|
|
60
|
+
node scripts/enact-extensions.mjs install net-revenue-management --platform enact --global
|
|
61
|
+
|
|
62
|
+
# Install to multiple platforms at once
|
|
63
|
+
node scripts/enact-extensions.mjs install net-revenue-management --platform all
|
|
64
|
+
node scripts/enact-extensions.mjs install net-revenue-management --platform claude,cursor
|
|
65
|
+
|
|
66
|
+
# List available bundles
|
|
67
|
+
node scripts/enact-extensions.mjs list
|
|
68
|
+
node scripts/enact-extensions.mjs list --json
|
|
69
|
+
|
|
70
|
+
# Generate local discovery index (gitignored artifact; spec/index.json is the committed schema)
|
|
71
|
+
node scripts/enact-extensions.mjs index
|
|
72
|
+
node scripts/enact-extensions.mjs index --stdout
|
|
73
|
+
|
|
74
|
+
# Uninstall a plugin (full remove: files + marketplace entry + config.toml entry)
|
|
75
|
+
node scripts/enact-extensions.mjs uninstall net-revenue-management --platform enact
|
|
76
|
+
node scripts/enact-extensions.mjs uninstall net-revenue-management --platform all
|
|
77
|
+
|
|
78
|
+
# View the install ledger (most recent first)
|
|
79
|
+
node scripts/enact-extensions.mjs log
|
|
80
|
+
node scripts/enact-extensions.mjs log --json
|
|
81
|
+
|
|
82
|
+
# Check freshness drift (installed vs canonical source, per plugin+surface)
|
|
83
|
+
node scripts/enact-extensions.mjs outdated
|
|
84
|
+
node scripts/enact-extensions.mjs outdated --json
|
|
85
|
+
|
|
86
|
+
# Refresh outdated plugins (ledger-driven, per-surface)
|
|
87
|
+
node scripts/enact-extensions.mjs update --all
|
|
88
|
+
node scripts/enact-extensions.mjs update net-revenue-management
|
|
89
|
+
node scripts/enact-extensions.mjs update --all --dry-run
|
|
90
|
+
|
|
91
|
+
# Install the session-start drift-check hook
|
|
92
|
+
node scripts/enact-extensions.mjs hooks setup --all
|
|
93
|
+
node scripts/enact-extensions.mjs hooks setup --surfaces claude,codex
|
|
94
|
+
node scripts/enact-extensions.mjs hooks setup --all --remove
|
|
95
|
+
|
|
96
|
+
# Start the localhost management UI + API
|
|
97
|
+
node scripts/enact-extensions.mjs serve
|
|
98
|
+
node scripts/enact-extensions.mjs serve --port 43217 --open
|
|
57
99
|
```
|
|
58
100
|
|
|
59
101
|
## CLI (`enact-extensions`)
|
|
60
102
|
|
|
61
|
-
Published from `@enact
|
|
103
|
+
Published from `@amsterdamdatalabs/enact-extensions`. Path defaults to **cwd**:
|
|
62
104
|
|
|
63
105
|
```bash
|
|
64
106
|
cd ../enact-operator/extensions
|
|
@@ -66,23 +108,55 @@ enact-extensions validate
|
|
|
66
108
|
enact-extensions sync
|
|
67
109
|
```
|
|
68
110
|
|
|
111
|
+
Subcommands: `validate` | `sync` | `install` | `uninstall` | `list` | `index` | `log` | `outdated` | `update` | `serve` | `hooks`.
|
|
112
|
+
|
|
69
113
|
Link locally:
|
|
70
114
|
|
|
71
115
|
```bash
|
|
72
116
|
npm run build && npm link
|
|
73
117
|
```
|
|
74
118
|
|
|
119
|
+
## Freshness
|
|
120
|
+
|
|
121
|
+
The freshness loop keeps installed plugins in sync with their canonical source without requiring manual tracking:
|
|
122
|
+
|
|
123
|
+
1. **Install records a content hash** — `enact-extensions install` writes a sha256 hash of the canonical bundle into the ledger entry alongside the version.
|
|
124
|
+
2. **`outdated` detects drift per surface** — compares the recorded hash against the current canonical source hash for each `(plugin, surface)` pair. Status values: `fresh` / `outdated` / `orphaned`. Exit 0 always (report only).
|
|
125
|
+
3. **`update` refreshes the installed surfaces** — driven by the ledger; only the surfaces a plugin is actually installed on are updated. `--all` refreshes every outdated surface; `<name>` refreshes that plugin's outdated surfaces; `--dry-run` shows what would change without touching anything.
|
|
126
|
+
4. **Session-start hook (optional)** — `enact-extensions hooks setup` installs a fast, fail-silent hook that runs `outdated` at the start of each agent session and prints a single advisory line (the exact `enact-extensions update --all` command) when anything is stale. It never auto-updates. Interactive surface picker when run in a TTY with no flags.
|
|
127
|
+
|
|
128
|
+
**npm postinstall surface-picker:** when you `npm install @amsterdamdatalabs/enact-extensions` in an interactive terminal, a TTY-aware postinstall script prompts which surfaces should receive the drift hook. In non-interactive terminals and CI environments it prints a one-line notice (`Run enact-extensions hooks setup …`) and exits immediately — it never blocks installs or hangs pipelines.
|
|
129
|
+
|
|
130
|
+
## Web UI (`serve`)
|
|
131
|
+
|
|
132
|
+
`enact-extensions serve` starts a dependency-free localhost management UI at `http://127.0.0.1:43217` (default port). From the UI you can browse all available extensions and one-click install or uninstall them to any platform surface. Pass `--open` to launch the browser automatically.
|
|
133
|
+
|
|
134
|
+
The server binds to `127.0.0.1` only — it is never reachable from other machines. API routes: `GET /` (UI), `GET /assets/*` (static assets), `GET /api/index` (discovery index), `GET /api/installed` (current installs), `POST /api/install`, `POST /api/uninstall`.
|
|
135
|
+
|
|
136
|
+
## Install ledger
|
|
137
|
+
|
|
138
|
+
Every install and uninstall is appended to a single global JSONL file at `~/.enact/extensions/ledger.jsonl`. Each record contains `{ts, action, name, version, platform, scope, home, path, hash}`. The `hash` field is a sha256 content hash of the canonical bundle at install time — this is the drift detector used by `outdated` to catch content changes even without a version bump. The ledger is best-effort: a write failure never fails the install/uninstall operation. View it with:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
enact-extensions log # human-readable, newest first
|
|
142
|
+
enact-extensions log --json # raw JSON array
|
|
143
|
+
```
|
|
144
|
+
|
|
75
145
|
## Layout
|
|
76
146
|
|
|
77
147
|
```text
|
|
78
|
-
enact-extensions/
|
|
79
|
-
├── src/ spec/ scripts/
|
|
80
|
-
├──
|
|
81
|
-
|
|
148
|
+
enact-extensions/ # @amsterdamdatalabs/enact-extensions package root
|
|
149
|
+
├── src/ spec/ scripts/ # manifest library + CLI (validate | sync | install | uninstall | list | index | log | outdated | update | serve | hooks)
|
|
150
|
+
├── web/ # management UI — web/index.html + web/assets/tokens/*.css + web/assets/logo-*.png
|
|
151
|
+
├── generated/ # gitignored — local discovery artifacts (e.g. index.json)
|
|
152
|
+
└── extensions/ # self-contained plugin bundles
|
|
153
|
+
├── plugin-dev/ # plugin authoring toolkit
|
|
154
|
+
├── cmux/ devops/ dev-state/ # first-party skill bundles
|
|
155
|
+
└── net-revenue-management/ # product plugin (Finance)
|
|
82
156
|
```
|
|
83
157
|
|
|
84
158
|
## enact-os integration
|
|
85
159
|
|
|
86
160
|
`enact-os` submodules **this** repo at `enact-extensions/` for manifest tooling, and separately submodules the product packages (`enact-context`, `enact-factory`, `enact-operator`, `enact-wiki`) at top level. Factory and config paths in `enact-os/config.toml` target each product package by its top-level path.
|
|
87
161
|
|
|
88
|
-
Skill or manifest changes for a product plugin ship from that product's own `extensions/` bundle (e.g. `enact-operator/extensions/`); validate with `enact-extensions` from inside that bundle. `@enact
|
|
162
|
+
Skill or manifest changes for a product plugin ship from that product's own `extensions/` bundle (e.g. `enact-operator/extensions/`); validate with `enact-extensions` from inside that bundle. `@amsterdamdatalabs/enact-extensions` owns manifest tooling only; `enact-factory setup` or `enact-factory plugins delivery` persists the local install scope.
|
package/dist/index.d.ts
CHANGED
|
@@ -6,9 +6,9 @@ export { defaultCursorHome } from "./internal/cursor.js";
|
|
|
6
6
|
export { MANIFEST_BY_PLATFORM, MANIFEST_FIELDS, manifestRelPath, DEFAULT_TARGETS, DEFAULT_PATHS, } from "./internal/platform.js";
|
|
7
7
|
export { defaultCodexHome, defaultEnactHome, ensureMarketplace, ensureMcpServer, isPluginEnabled, readCodexConfig, readCodexConfigProbe, resolveCodexInstallHomes, removeMcpServer, removePluginConfig, setPluginEnabled, writeCodexConfig, } from "./internal/codex.js";
|
|
8
8
|
export { createEnactManifest, deriveClaudeManifest, deriveCodexManifest, deriveCursorManifest, deriveManifest, resolveTargets, scaffoldPlugin, syncPlatformManifests, manifestForPlatform, } from "./create/index.js";
|
|
9
|
-
export { validateEnactManifest, assertEnactManifest, validateClaudeManifest, validateCodexManifest, validateCursorManifest, validateManifest, validatePluginManifest, validatePluginBundle, checkComponentPaths, checkPluginBundleComponentPaths, readManifestFile, } from "./validate/index.js";
|
|
9
|
+
export { validateEnactManifest, assertEnactManifest, validateClaudeManifest, validateCodexManifest, validateCursorManifest, validateManifest, validatePluginManifest, validatePluginBundle, validatePluginBundleFromCanonical, checkComponentPaths, checkPluginBundleComponentPaths, checkPluginBundleComponentPathsFromCanonical, readManifestFile, } from "./validate/index.js";
|
|
10
10
|
export type { PluginValidationReport } from "./validate/index.js";
|
|
11
11
|
export type { ScaffoldOptions } from "./create/index.js";
|
|
12
|
-
export { installCodexPluginBundle, installPluginBundle, installClaudePluginBundle, installCursorPluginBundle, } from "./install.js";
|
|
13
|
-
export type { CodexPluginInstallOptions, CodexPluginInstallResult, MultiCodexPluginInstallOptions, MultiCodexPluginInstallResult, ClaudePluginInstallOptions, ClaudePluginInstallResult, CursorPluginInstallOptions, CursorPluginInstallResult, } from "./install.js";
|
|
12
|
+
export { installCodexPluginBundle, installPluginBundle, installClaudePluginBundle, installCursorPluginBundle, installSharedPluginBundle, defaultSharedHome, uninstallCodexPluginBundle, uninstallClaudePluginBundle, uninstallCursorPluginBundle, uninstallSharedPluginBundle, } from "./install.js";
|
|
13
|
+
export type { CodexPluginInstallOptions, CodexPluginInstallResult, MultiCodexPluginInstallOptions, MultiCodexPluginInstallResult, ClaudePluginInstallOptions, ClaudePluginInstallResult, CursorPluginInstallOptions, CursorPluginInstallResult, SharedPluginInstallOptions, SharedPluginInstallResult, CodexPluginUninstallOptions, CodexPluginUninstallResult, ClaudePluginUninstallOptions, ClaudePluginUninstallResult, CursorPluginUninstallOptions, CursorPluginUninstallResult, SharedPluginUninstallOptions, SharedPluginUninstallResult, } from "./install.js";
|
|
14
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,+BAA+B,EAC/B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,iCAAiC,EACjC,mBAAmB,EACnB,+BAA+B,EAC/B,4CAA4C,EAC5C,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,8BAA8B,EAC9B,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,4BAA4B,EAC5B,2BAA2B,EAC3B,4BAA4B,EAC5B,2BAA2B,EAC3B,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,6 @@ export { defaultCursorHome } from "./internal/cursor.js";
|
|
|
4
4
|
export { MANIFEST_BY_PLATFORM, MANIFEST_FIELDS, manifestRelPath, DEFAULT_TARGETS, DEFAULT_PATHS, } from "./internal/platform.js";
|
|
5
5
|
export { defaultCodexHome, defaultEnactHome, ensureMarketplace, ensureMcpServer, isPluginEnabled, readCodexConfig, readCodexConfigProbe, resolveCodexInstallHomes, removeMcpServer, removePluginConfig, setPluginEnabled, writeCodexConfig, } from "./internal/codex.js";
|
|
6
6
|
export { createEnactManifest, deriveClaudeManifest, deriveCodexManifest, deriveCursorManifest, deriveManifest, resolveTargets, scaffoldPlugin, syncPlatformManifests, manifestForPlatform, } from "./create/index.js";
|
|
7
|
-
export { validateEnactManifest, assertEnactManifest, validateClaudeManifest, validateCodexManifest, validateCursorManifest, validateManifest, validatePluginManifest, validatePluginBundle, checkComponentPaths, checkPluginBundleComponentPaths, readManifestFile, } from "./validate/index.js";
|
|
8
|
-
export { installCodexPluginBundle, installPluginBundle, installClaudePluginBundle, installCursorPluginBundle, } from "./install.js";
|
|
7
|
+
export { validateEnactManifest, assertEnactManifest, validateClaudeManifest, validateCodexManifest, validateCursorManifest, validateManifest, validatePluginManifest, validatePluginBundle, validatePluginBundleFromCanonical, checkComponentPaths, checkPluginBundleComponentPaths, checkPluginBundleComponentPathsFromCanonical, readManifestFile, } from "./validate/index.js";
|
|
8
|
+
export { installCodexPluginBundle, installPluginBundle, installClaudePluginBundle, installCursorPluginBundle, installSharedPluginBundle, defaultSharedHome, uninstallCodexPluginBundle, uninstallClaudePluginBundle, uninstallCursorPluginBundle, uninstallSharedPluginBundle, } from "./install.js";
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,+BAA+B,EAC/B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,iCAAiC,EACjC,mBAAmB,EACnB,+BAA+B,EAC/B,4CAA4C,EAC5C,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,cAAc,CAAC"}
|
package/dist/install.d.ts
CHANGED
|
@@ -57,4 +57,93 @@ export declare function installCodexPluginBundle(options: CodexPluginInstallOpti
|
|
|
57
57
|
export declare function installPluginBundle(options: MultiCodexPluginInstallOptions): MultiCodexPluginInstallResult;
|
|
58
58
|
export declare function installClaudePluginBundle(options: ClaudePluginInstallOptions): ClaudePluginInstallResult;
|
|
59
59
|
export declare function installCursorPluginBundle(options: CursorPluginInstallOptions): CursorPluginInstallResult;
|
|
60
|
+
export interface CodexPluginUninstallOptions {
|
|
61
|
+
codexHome?: string;
|
|
62
|
+
marketplaceName?: string;
|
|
63
|
+
}
|
|
64
|
+
export interface CodexPluginUninstallResult {
|
|
65
|
+
name: string;
|
|
66
|
+
marketplaceName: string;
|
|
67
|
+
removedPaths: string[];
|
|
68
|
+
/** true when nothing was installed (idempotent no-op) */
|
|
69
|
+
noop: boolean;
|
|
70
|
+
}
|
|
71
|
+
export interface ClaudePluginUninstallOptions {
|
|
72
|
+
claudeHome?: string;
|
|
73
|
+
marketplaceName?: string;
|
|
74
|
+
}
|
|
75
|
+
export interface ClaudePluginUninstallResult {
|
|
76
|
+
name: string;
|
|
77
|
+
removedPaths: string[];
|
|
78
|
+
noop: boolean;
|
|
79
|
+
}
|
|
80
|
+
export interface CursorPluginUninstallOptions {
|
|
81
|
+
cursorHome?: string;
|
|
82
|
+
}
|
|
83
|
+
export interface CursorPluginUninstallResult {
|
|
84
|
+
name: string;
|
|
85
|
+
removedPaths: string[];
|
|
86
|
+
noop: boolean;
|
|
87
|
+
}
|
|
88
|
+
export interface SharedPluginUninstallOptions {
|
|
89
|
+
sharedHome?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface SharedPluginUninstallResult {
|
|
92
|
+
name: string;
|
|
93
|
+
installedSkillsPath: string;
|
|
94
|
+
removedPaths: string[];
|
|
95
|
+
noop: boolean;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Fully uninstall a Codex/Enact plugin from the given home, reversing installCodexPluginBundle:
|
|
99
|
+
* - removes <home>/plugins/<name>/ (installed dir)
|
|
100
|
+
* - removes <home>/marketplaces/<marketplace>/plugins/<name>/ (marketplace plugin dir)
|
|
101
|
+
* - removes <home>/plugins/cache/<marketplace>/<name>/ (cache dir)
|
|
102
|
+
* - removes the plugin's entry from marketplace.json (preserves other entries + marketplace reg)
|
|
103
|
+
* - removes [plugins."<name>@<marketplace>"] from config.toml (preserves [marketplaces.*] etc.)
|
|
104
|
+
*/
|
|
105
|
+
export declare function uninstallCodexPluginBundle(name: string, options?: CodexPluginUninstallOptions): CodexPluginUninstallResult;
|
|
106
|
+
/**
|
|
107
|
+
* Fully uninstall a Claude plugin, reversing installClaudePluginBundle:
|
|
108
|
+
* - removes <claudeHome>/plugins/marketplaces/<marketplace>/plugins/<name>/
|
|
109
|
+
* Note: the marketplace registration in known_marketplaces.json is LEFT intact
|
|
110
|
+
* (the marketplace itself persists even after its last plugin is removed).
|
|
111
|
+
*/
|
|
112
|
+
export declare function uninstallClaudePluginBundle(name: string, options?: ClaudePluginUninstallOptions): ClaudePluginUninstallResult;
|
|
113
|
+
/**
|
|
114
|
+
* Fully uninstall a Cursor plugin, reversing installCursorPluginBundle:
|
|
115
|
+
* - removes <cursorHome>/plugins/local/<name>/
|
|
116
|
+
*/
|
|
117
|
+
export declare function uninstallCursorPluginBundle(name: string, options?: CursorPluginUninstallOptions): CursorPluginUninstallResult;
|
|
118
|
+
export interface SharedPluginInstallOptions {
|
|
119
|
+
pluginRoot: string;
|
|
120
|
+
/** Explicit shared home. Defaults to ~/.agents (global) or ./.agents (local). */
|
|
121
|
+
sharedHome?: string;
|
|
122
|
+
}
|
|
123
|
+
export interface SharedPluginInstallResult {
|
|
124
|
+
name: string;
|
|
125
|
+
version: string;
|
|
126
|
+
/** Absolute path to the installed skills directory: <sharedHome>/.agents/skills/<name> */
|
|
127
|
+
installedSkillsPath: string;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Default global shared home base. The convention is that skills live at
|
|
131
|
+
* `~/.agents/skills/<plugin>/`, so this returns `homedir()` and the install
|
|
132
|
+
* function appends `.agents/skills/<name>`.
|
|
133
|
+
*
|
|
134
|
+
* Pass an explicit `sharedHome` to override (useful in tests or local scope).
|
|
135
|
+
*/
|
|
136
|
+
export declare function defaultSharedHome(): string;
|
|
137
|
+
/**
|
|
138
|
+
* Install the bundle's skills tree into <sharedHome>/.agents/skills/<plugin>/.
|
|
139
|
+
* Does NOT write a marketplace entry, config.toml, or any platform-specific
|
|
140
|
+
* manifest — this is a pure host-neutral skills drop that any host reading
|
|
141
|
+
* `.agents/skills/` (Codex, Cursor, Gemini, etc.) can pick up.
|
|
142
|
+
*/
|
|
143
|
+
export declare function installSharedPluginBundle(options: SharedPluginInstallOptions): SharedPluginInstallResult;
|
|
144
|
+
/**
|
|
145
|
+
* Uninstall a shared plugin by removing its skills directory.
|
|
146
|
+
* Reverses installSharedPluginBundle.
|
|
147
|
+
*/
|
|
148
|
+
export declare function uninstallSharedPluginBundle(name: string, options?: SharedPluginUninstallOptions): SharedPluginUninstallResult;
|
|
60
149
|
//# sourceMappingURL=install.d.ts.map
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/install.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { dirname, join, resolve } from "node:path";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { defaultCodexHome, ensureMarketplace, readCodexConfig, removePluginConfig, resolveCodexInstallHomes, setPluginEnabled, writeCodexConfig, } from "./internal/codex.js";
|
|
5
|
+
import { manifestForPlatform } from "./create/index.js";
|
|
6
|
+
import { checkComponentPaths, readManifestFile, validateClaudeManifest, validateCodexManifest, validateCursorManifest, } from "./validate/index.js";
|
|
6
7
|
import { defaultClaudeHome, registerLocalMarketplace } from "./internal/claude.js";
|
|
7
8
|
import { defaultCursorHome } from "./internal/cursor.js";
|
|
8
9
|
function readJson(path, fallback) {
|
|
@@ -61,12 +62,30 @@ function projectBundle(sourceRoot, targetRoot, manifest, platformDir) {
|
|
|
61
62
|
}
|
|
62
63
|
writeJson(join(targetRoot, platformDir, "plugin.json"), manifest);
|
|
63
64
|
}
|
|
64
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Derive a per-surface plugin manifest IN MEMORY from the bundle's canonical
|
|
67
|
+
* Enact manifest. Installs must never write a `.<platform>-plugin/` projection
|
|
68
|
+
* back into the SOURCE bundle dir — the derived manifest is handed to
|
|
69
|
+
* `projectBundle`, which writes it ONLY to the install target.
|
|
70
|
+
*
|
|
71
|
+
* Backward-compat: some legacy bundles ship a pre-derived per-surface manifest
|
|
72
|
+
* (`.codex-plugin/plugin.json`) with NO canonical `.agents/plugin.json`. In that
|
|
73
|
+
* case we fall back to reading the existing per-surface manifest from source —
|
|
74
|
+
* this is a read, not a write, so the source stays clean.
|
|
75
|
+
*/
|
|
76
|
+
function deriveTargetManifest(pluginRoot, platform) {
|
|
65
77
|
const enactManifestPath = join(pluginRoot, ".agents", "plugin.json");
|
|
66
|
-
if (
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
78
|
+
if (existsSync(enactManifestPath)) {
|
|
79
|
+
const enact = readManifestFile(pluginRoot, "enact");
|
|
80
|
+
return manifestForPlatform(platform, enact);
|
|
81
|
+
}
|
|
82
|
+
// Legacy fallback: a per-surface-only bundle (no canonical Enact manifest).
|
|
83
|
+
const surfaceManifestPath = join(pluginRoot, `.${platform}-plugin`, "plugin.json");
|
|
84
|
+
if (existsSync(surfaceManifestPath)) {
|
|
85
|
+
return readManifestFile(pluginRoot, platform);
|
|
86
|
+
}
|
|
87
|
+
throw new Error(`Cannot derive ${platform} manifest: no canonical manifest at ${enactManifestPath} ` +
|
|
88
|
+
`and no ${platform} manifest at ${surfaceManifestPath}`);
|
|
70
89
|
}
|
|
71
90
|
function stringField(manifest, key) {
|
|
72
91
|
const value = manifest[key];
|
|
@@ -138,13 +157,14 @@ function upsertMarketplaceEntry(codexHome, marketplaceName, manifest, pluginName
|
|
|
138
157
|
export function installCodexPluginBundle(options) {
|
|
139
158
|
const codexHome = options.codexHome ?? defaultCodexHome();
|
|
140
159
|
const marketplaceName = options.marketplaceName ?? "enact-os-plugins";
|
|
141
|
-
|
|
142
|
-
const codexManifest =
|
|
160
|
+
// Per-surface manifests are derived IN MEMORY; install never writes to source.
|
|
161
|
+
const codexManifest = deriveTargetManifest(options.pluginRoot, "codex");
|
|
143
162
|
const validation = validateCodexManifest(codexManifest);
|
|
144
163
|
if (!validation.ok) {
|
|
145
164
|
throw new Error(`Invalid Codex plugin manifest:\n${validation.errors.join("\n")}`);
|
|
146
165
|
}
|
|
147
|
-
const componentIssues =
|
|
166
|
+
const componentIssues = checkComponentPaths(options.pluginRoot, codexManifest)
|
|
167
|
+
.map((issue) => `codex ${issue}`);
|
|
148
168
|
if (componentIssues.length > 0) {
|
|
149
169
|
throw new Error(`Plugin component paths are not installable:\n${componentIssues.join("\n")}`);
|
|
150
170
|
}
|
|
@@ -182,7 +202,7 @@ export function installCodexPluginBundle(options) {
|
|
|
182
202
|
installedPluginPath: installedPath,
|
|
183
203
|
cachePluginPath: cachePath,
|
|
184
204
|
refreshedPaths: [mktPluginPath, installedPath, cachePath],
|
|
185
|
-
syncResults,
|
|
205
|
+
syncResults: [],
|
|
186
206
|
};
|
|
187
207
|
}
|
|
188
208
|
export function installPluginBundle(options) {
|
|
@@ -199,8 +219,8 @@ export function installPluginBundle(options) {
|
|
|
199
219
|
export function installClaudePluginBundle(options) {
|
|
200
220
|
const claudeHome = options.claudeHome ?? defaultClaudeHome();
|
|
201
221
|
const marketplaceName = options.marketplaceName ?? "enact-os-plugins";
|
|
202
|
-
|
|
203
|
-
const claudeManifest =
|
|
222
|
+
// Per-surface manifest derived IN MEMORY; install never writes to source.
|
|
223
|
+
const claudeManifest = deriveTargetManifest(options.pluginRoot, "claude");
|
|
204
224
|
const validation = validateClaudeManifest(claudeManifest);
|
|
205
225
|
if (!validation.ok) {
|
|
206
226
|
throw new Error(`Invalid Claude plugin manifest:\n${validation.errors.join("\n")}`);
|
|
@@ -221,13 +241,13 @@ export function installClaudePluginBundle(options) {
|
|
|
221
241
|
marketplaceDir,
|
|
222
242
|
installedPluginPath: installedPath,
|
|
223
243
|
refreshedPaths: [installedPath],
|
|
224
|
-
syncResults,
|
|
244
|
+
syncResults: [],
|
|
225
245
|
};
|
|
226
246
|
}
|
|
227
247
|
export function installCursorPluginBundle(options) {
|
|
228
248
|
const cursorHome = options.cursorHome ?? defaultCursorHome();
|
|
229
|
-
|
|
230
|
-
const cursorManifest =
|
|
249
|
+
// Per-surface manifest derived IN MEMORY; install never writes to source.
|
|
250
|
+
const cursorManifest = deriveTargetManifest(options.pluginRoot, "cursor");
|
|
231
251
|
const validation = validateCursorManifest(cursorManifest);
|
|
232
252
|
if (!validation.ok) {
|
|
233
253
|
throw new Error(`Invalid Cursor plugin manifest:\n${validation.errors.join("\n")}`);
|
|
@@ -244,7 +264,188 @@ export function installCursorPluginBundle(options) {
|
|
|
244
264
|
version,
|
|
245
265
|
installedPluginPath: installedPath,
|
|
246
266
|
refreshedPaths: [installedPath],
|
|
247
|
-
syncResults,
|
|
267
|
+
syncResults: [],
|
|
248
268
|
};
|
|
249
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Guard: ensure the target path stays within the expected base directory
|
|
272
|
+
* to prevent accidental deletion outside a known home.
|
|
273
|
+
*/
|
|
274
|
+
function assertWithinBase(base, target) {
|
|
275
|
+
const resolvedBase = resolve(base);
|
|
276
|
+
const resolvedTarget = resolve(target);
|
|
277
|
+
if (!resolvedTarget.startsWith(resolvedBase + "/") && resolvedTarget !== resolvedBase) {
|
|
278
|
+
throw new Error(`Safety check failed: resolved path ${resolvedTarget} is not within base ${resolvedBase}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Remove a marketplace.json entry for `pluginName`.
|
|
283
|
+
* If the file doesn't exist or the entry isn't there, this is a no-op.
|
|
284
|
+
* The marketplace registration entry (top-level name/interface fields) is preserved.
|
|
285
|
+
* Other plugin entries are preserved.
|
|
286
|
+
*/
|
|
287
|
+
function removeMarketplaceEntry(codexHome, marketplaceName, pluginName) {
|
|
288
|
+
const path = marketplacePath(codexHome, marketplaceName);
|
|
289
|
+
if (!existsSync(path))
|
|
290
|
+
return;
|
|
291
|
+
const current = readJson(path, { name: marketplaceName, plugins: [] });
|
|
292
|
+
const filtered = (current.plugins ?? []).filter((p) => p.name !== pluginName);
|
|
293
|
+
writeJson(path, {
|
|
294
|
+
name: current.name || marketplaceName,
|
|
295
|
+
...(current.interface ? { interface: current.interface } : {}),
|
|
296
|
+
plugins: filtered,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Fully uninstall a Codex/Enact plugin from the given home, reversing installCodexPluginBundle:
|
|
301
|
+
* - removes <home>/plugins/<name>/ (installed dir)
|
|
302
|
+
* - removes <home>/marketplaces/<marketplace>/plugins/<name>/ (marketplace plugin dir)
|
|
303
|
+
* - removes <home>/plugins/cache/<marketplace>/<name>/ (cache dir)
|
|
304
|
+
* - removes the plugin's entry from marketplace.json (preserves other entries + marketplace reg)
|
|
305
|
+
* - removes [plugins."<name>@<marketplace>"] from config.toml (preserves [marketplaces.*] etc.)
|
|
306
|
+
*/
|
|
307
|
+
export function uninstallCodexPluginBundle(name, options = {}) {
|
|
308
|
+
const codexHome = options.codexHome ?? defaultCodexHome();
|
|
309
|
+
const mktName = options.marketplaceName ?? "enact-os-plugins";
|
|
310
|
+
const pluginConfigKey = `${name}@${mktName}`;
|
|
311
|
+
const installedPath = installedPluginPath(codexHome, name);
|
|
312
|
+
const mktPluginPath = marketplacePluginPath(codexHome, mktName, name);
|
|
313
|
+
// Cache dir is versioned; remove the entire <cache>/<marketplace>/<name>/ subtree
|
|
314
|
+
const cacheDirForPlugin = join(codexHome, "plugins", "cache", mktName, name);
|
|
315
|
+
const noop = !existsSync(installedPath) &&
|
|
316
|
+
!existsSync(mktPluginPath) &&
|
|
317
|
+
!existsSync(cacheDirForPlugin);
|
|
318
|
+
const removedPaths = [];
|
|
319
|
+
if (existsSync(installedPath)) {
|
|
320
|
+
assertWithinBase(join(codexHome, "plugins"), installedPath);
|
|
321
|
+
rmSync(installedPath, { recursive: true, force: true });
|
|
322
|
+
removedPaths.push(installedPath);
|
|
323
|
+
}
|
|
324
|
+
if (existsSync(mktPluginPath)) {
|
|
325
|
+
assertWithinBase(join(codexHome, "marketplaces"), mktPluginPath);
|
|
326
|
+
rmSync(mktPluginPath, { recursive: true, force: true });
|
|
327
|
+
removedPaths.push(mktPluginPath);
|
|
328
|
+
}
|
|
329
|
+
if (existsSync(cacheDirForPlugin)) {
|
|
330
|
+
assertWithinBase(join(codexHome, "plugins", "cache"), cacheDirForPlugin);
|
|
331
|
+
rmSync(cacheDirForPlugin, { recursive: true, force: true });
|
|
332
|
+
removedPaths.push(cacheDirForPlugin);
|
|
333
|
+
}
|
|
334
|
+
// Remove plugin entry from marketplace.json (leave file + other entries intact)
|
|
335
|
+
removeMarketplaceEntry(codexHome, mktName, name);
|
|
336
|
+
// Remove [plugins."<name>@<marketplace>"] from config.toml (leave marketplaces.* intact)
|
|
337
|
+
const config = readCodexConfig(codexHome);
|
|
338
|
+
removePluginConfig(config, pluginConfigKey);
|
|
339
|
+
if (existsSync(join(codexHome, "config.toml"))) {
|
|
340
|
+
writeCodexConfig(codexHome, config);
|
|
341
|
+
}
|
|
342
|
+
return { name, marketplaceName: mktName, removedPaths, noop };
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Fully uninstall a Claude plugin, reversing installClaudePluginBundle:
|
|
346
|
+
* - removes <claudeHome>/plugins/marketplaces/<marketplace>/plugins/<name>/
|
|
347
|
+
* Note: the marketplace registration in known_marketplaces.json is LEFT intact
|
|
348
|
+
* (the marketplace itself persists even after its last plugin is removed).
|
|
349
|
+
*/
|
|
350
|
+
export function uninstallClaudePluginBundle(name, options = {}) {
|
|
351
|
+
const claudeHome = options.claudeHome ?? defaultClaudeHome();
|
|
352
|
+
const mktName = options.marketplaceName ?? "enact-os-plugins";
|
|
353
|
+
const marketplaceDir = join(claudeHome, "plugins", "marketplaces", mktName);
|
|
354
|
+
const installedPath = join(marketplaceDir, "plugins", name);
|
|
355
|
+
const noop = !existsSync(installedPath);
|
|
356
|
+
const removedPaths = [];
|
|
357
|
+
if (existsSync(installedPath)) {
|
|
358
|
+
assertWithinBase(marketplaceDir, installedPath);
|
|
359
|
+
rmSync(installedPath, { recursive: true, force: true });
|
|
360
|
+
removedPaths.push(installedPath);
|
|
361
|
+
}
|
|
362
|
+
return { name, removedPaths, noop };
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Fully uninstall a Cursor plugin, reversing installCursorPluginBundle:
|
|
366
|
+
* - removes <cursorHome>/plugins/local/<name>/
|
|
367
|
+
*/
|
|
368
|
+
export function uninstallCursorPluginBundle(name, options = {}) {
|
|
369
|
+
const cursorHome = options.cursorHome ?? defaultCursorHome();
|
|
370
|
+
const installedPath = join(cursorHome, "plugins", "local", name);
|
|
371
|
+
const noop = !existsSync(installedPath);
|
|
372
|
+
const removedPaths = [];
|
|
373
|
+
if (existsSync(installedPath)) {
|
|
374
|
+
assertWithinBase(join(cursorHome, "plugins", "local"), installedPath);
|
|
375
|
+
rmSync(installedPath, { recursive: true, force: true });
|
|
376
|
+
removedPaths.push(installedPath);
|
|
377
|
+
}
|
|
378
|
+
return { name, removedPaths, noop };
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Default global shared home base. The convention is that skills live at
|
|
382
|
+
* `~/.agents/skills/<plugin>/`, so this returns `homedir()` and the install
|
|
383
|
+
* function appends `.agents/skills/<name>`.
|
|
384
|
+
*
|
|
385
|
+
* Pass an explicit `sharedHome` to override (useful in tests or local scope).
|
|
386
|
+
*/
|
|
387
|
+
export function defaultSharedHome() {
|
|
388
|
+
return homedir();
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Install the bundle's skills tree into <sharedHome>/.agents/skills/<plugin>/.
|
|
392
|
+
* Does NOT write a marketplace entry, config.toml, or any platform-specific
|
|
393
|
+
* manifest — this is a pure host-neutral skills drop that any host reading
|
|
394
|
+
* `.agents/skills/` (Codex, Cursor, Gemini, etc.) can pick up.
|
|
395
|
+
*/
|
|
396
|
+
export function installSharedPluginBundle(options) {
|
|
397
|
+
const sharedHome = options.sharedHome ?? defaultSharedHome();
|
|
398
|
+
// Read the enact manifest for name/version; fall back to codex if no enact manifest.
|
|
399
|
+
const enactManifestPath = join(options.pluginRoot, ".agents", "plugin.json");
|
|
400
|
+
let manifest;
|
|
401
|
+
if (existsSync(enactManifestPath)) {
|
|
402
|
+
manifest = readManifestFile(options.pluginRoot, "enact");
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
manifest = readManifestFile(options.pluginRoot, "codex");
|
|
406
|
+
}
|
|
407
|
+
const name = stringField(manifest, "name");
|
|
408
|
+
if (!name) {
|
|
409
|
+
throw new Error("Plugin manifest is missing name");
|
|
410
|
+
}
|
|
411
|
+
const version = stringField(manifest, "version") ?? "0.0.0";
|
|
412
|
+
// Resolve the skills source path from the manifest
|
|
413
|
+
const rawSkills = stringField(manifest, "skills");
|
|
414
|
+
if (!rawSkills) {
|
|
415
|
+
throw new Error(`Plugin manifest for '${name}' has no 'skills' field — nothing to install for shared target`);
|
|
416
|
+
}
|
|
417
|
+
const cleanedSkills = rawSkills.replace(/^\.\//, "").replace(/\/+$/, "");
|
|
418
|
+
const skillsSource = resolve(options.pluginRoot, cleanedSkills);
|
|
419
|
+
// shared is a skills-only surface: a missing skills source is misuse.
|
|
420
|
+
// Fail loudly before touching the target rather than producing an empty dir.
|
|
421
|
+
if (!existsSync(skillsSource)) {
|
|
422
|
+
throw new Error(`Cannot install shared bundle "${name}": skills source not found at ${skillsSource}`);
|
|
423
|
+
}
|
|
424
|
+
// Target: <sharedHome>/.agents/skills/<name>/
|
|
425
|
+
const installedSkillsPath = join(sharedHome, ".agents", "skills", name);
|
|
426
|
+
rmSync(installedSkillsPath, { recursive: true, force: true });
|
|
427
|
+
mkdirSync(installedSkillsPath, { recursive: true });
|
|
428
|
+
cpSync(skillsSource, installedSkillsPath, { recursive: true, force: true });
|
|
429
|
+
return {
|
|
430
|
+
name,
|
|
431
|
+
version,
|
|
432
|
+
installedSkillsPath,
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Uninstall a shared plugin by removing its skills directory.
|
|
437
|
+
* Reverses installSharedPluginBundle.
|
|
438
|
+
*/
|
|
439
|
+
export function uninstallSharedPluginBundle(name, options = {}) {
|
|
440
|
+
const sharedHome = options.sharedHome ?? defaultSharedHome();
|
|
441
|
+
const installedSkillsPath = join(sharedHome, ".agents", "skills", name);
|
|
442
|
+
const noop = !existsSync(installedSkillsPath);
|
|
443
|
+
const removedPaths = [];
|
|
444
|
+
if (existsSync(installedSkillsPath)) {
|
|
445
|
+
assertWithinBase(join(sharedHome, ".agents", "skills"), installedSkillsPath);
|
|
446
|
+
rmSync(installedSkillsPath, { recursive: true, force: true });
|
|
447
|
+
removedPaths.push(installedSkillsPath);
|
|
448
|
+
}
|
|
449
|
+
return { name, installedSkillsPath, removedPaths, noop };
|
|
450
|
+
}
|
|
250
451
|
//# sourceMappingURL=install.js.map
|