@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.
Files changed (152) hide show
  1. package/README.md +94 -20
  2. package/dist/index.d.ts +3 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/install.d.ts +89 -0
  7. package/dist/install.d.ts.map +1 -1
  8. package/dist/install.js +219 -18
  9. package/dist/install.js.map +1 -1
  10. package/dist/validate/index.d.ts +21 -0
  11. package/dist/validate/index.d.ts.map +1 -1
  12. package/dist/validate/index.js +77 -0
  13. package/dist/validate/index.js.map +1 -1
  14. package/extensions/cmux/.agents/plugin.json +37 -0
  15. package/extensions/cmux/skills/cmux/SKILL.md +82 -0
  16. package/extensions/cmux/skills/cmux/agents/openai.yaml +4 -0
  17. package/extensions/cmux/skills/cmux/references/handles-and-identify.md +35 -0
  18. package/extensions/cmux/skills/cmux/references/panes-surfaces.md +37 -0
  19. package/extensions/cmux/skills/cmux/references/trigger-flash-and-health.md +23 -0
  20. package/extensions/cmux/skills/cmux/references/windows-workspaces.md +31 -0
  21. package/extensions/cmux/skills/cmux-vm-monitor/SKILL.md +122 -0
  22. package/extensions/cmux/skills/cmux-vm-monitor/agents/openai.yaml +4 -0
  23. package/extensions/cmux/skills/cmux-vm-monitor/references/cmux-commands.md +66 -0
  24. package/extensions/cmux/skills/cmux-vm-monitor/scripts/codex_vm_monitor.sh +45 -0
  25. package/extensions/cmux/skills/cmux-workspace/SKILL.md +93 -0
  26. package/extensions/dev-state/.agents/plugin.json +35 -0
  27. package/extensions/dev-state/skills/dev-state-plan-graduation/SKILL.md +194 -0
  28. package/extensions/dev-state/skills/dev-state-plan-graduation/agents/openai.yaml +4 -0
  29. package/extensions/dev-state/skills/dev-state-plan-graduation/references/reference.md +130 -0
  30. package/extensions/devops/.agents/plugin.json +36 -0
  31. package/extensions/devops/skills/azure-devops-cli/SKILL.md +431 -0
  32. package/extensions/devops/skills/azure-devops-cli/agents/openai.yaml +4 -0
  33. package/extensions/devops/skills/ci-pipeline-strategy/SKILL.md +217 -0
  34. package/extensions/devops/skills/ci-pipeline-strategy/agents/openai.yaml +4 -0
  35. package/{plugins/net-revenue-management/.codex-plugin → extensions/net-revenue-management/.agents}/plugin.json +10 -6
  36. package/extensions/plugin-dev/.agents/plugin.json +42 -0
  37. package/extensions/plugin-dev/.mcp.json +3 -0
  38. package/extensions/plugin-dev/agents/agent-creator.md +199 -0
  39. package/extensions/plugin-dev/agents/plugin-validator.md +91 -0
  40. package/extensions/plugin-dev/agents/skill-reviewer.md +212 -0
  41. package/extensions/plugin-dev/commands/_archive/create-marketplace.md +427 -0
  42. package/extensions/plugin-dev/commands/_archive/plugin-dev-guide.md +12 -0
  43. package/extensions/plugin-dev/commands/create-plugin.md +498 -0
  44. package/extensions/plugin-dev/commands/start.md +81 -0
  45. package/extensions/plugin-dev/hooks/hooks.json +3 -0
  46. package/extensions/plugin-dev/skills/agent-development/SKILL.md +641 -0
  47. package/extensions/plugin-dev/skills/agent-development/examples/agent-creation-prompt.md +250 -0
  48. package/extensions/plugin-dev/skills/agent-development/examples/complete-agent-examples.md +461 -0
  49. package/extensions/plugin-dev/skills/agent-development/references/advanced-agent-fields.md +246 -0
  50. package/extensions/plugin-dev/skills/agent-development/references/agent-creation-system-prompt.md +216 -0
  51. package/extensions/plugin-dev/skills/agent-development/references/permission-modes-rules.md +226 -0
  52. package/extensions/plugin-dev/skills/agent-development/references/system-prompt-design.md +464 -0
  53. package/extensions/plugin-dev/skills/agent-development/references/triggering-examples.md +474 -0
  54. package/extensions/plugin-dev/skills/agent-development/scripts/create-agent-skeleton.sh +176 -0
  55. package/extensions/plugin-dev/skills/agent-development/scripts/test-agent-trigger.sh +227 -0
  56. package/extensions/plugin-dev/skills/agent-development/scripts/validate-agent.sh +227 -0
  57. package/extensions/plugin-dev/skills/command-development/SKILL.md +763 -0
  58. package/extensions/plugin-dev/skills/command-development/examples/plugin-commands.md +612 -0
  59. package/extensions/plugin-dev/skills/command-development/examples/simple-commands.md +527 -0
  60. package/extensions/plugin-dev/skills/command-development/references/advanced-workflows.md +762 -0
  61. package/extensions/plugin-dev/skills/command-development/references/documentation-patterns.md +769 -0
  62. package/extensions/plugin-dev/skills/command-development/references/frontmatter-reference.md +508 -0
  63. package/extensions/plugin-dev/skills/command-development/references/interactive-commands.md +966 -0
  64. package/extensions/plugin-dev/skills/command-development/references/marketplace-considerations.md +943 -0
  65. package/extensions/plugin-dev/skills/command-development/references/plugin-features-reference.md +637 -0
  66. package/extensions/plugin-dev/skills/command-development/references/plugin-integration.md +191 -0
  67. package/extensions/plugin-dev/skills/command-development/references/skill-tool.md +447 -0
  68. package/extensions/plugin-dev/skills/command-development/references/testing-strategies.md +723 -0
  69. package/extensions/plugin-dev/skills/command-development/scripts/check-frontmatter.sh +234 -0
  70. package/extensions/plugin-dev/skills/command-development/scripts/validate-command.sh +160 -0
  71. package/extensions/plugin-dev/skills/hook-development/SKILL.md +861 -0
  72. package/extensions/plugin-dev/skills/hook-development/examples/load-context.sh +55 -0
  73. package/extensions/plugin-dev/skills/hook-development/examples/validate-bash.sh +57 -0
  74. package/extensions/plugin-dev/skills/hook-development/examples/validate-write.sh +48 -0
  75. package/extensions/plugin-dev/skills/hook-development/references/advanced.md +871 -0
  76. package/extensions/plugin-dev/skills/hook-development/references/hook-input-schemas.md +145 -0
  77. package/extensions/plugin-dev/skills/hook-development/references/migration.md +392 -0
  78. package/extensions/plugin-dev/skills/hook-development/references/patterns.md +430 -0
  79. package/extensions/plugin-dev/skills/hook-development/scripts/README.md +181 -0
  80. package/extensions/plugin-dev/skills/hook-development/scripts/hook-linter.sh +153 -0
  81. package/extensions/plugin-dev/skills/hook-development/scripts/test-hook.sh +276 -0
  82. package/extensions/plugin-dev/skills/hook-development/scripts/validate-hook-schema.sh +159 -0
  83. package/extensions/plugin-dev/skills/mcp-integration/SKILL.md +775 -0
  84. package/extensions/plugin-dev/skills/mcp-integration/examples/http-server.json +20 -0
  85. package/extensions/plugin-dev/skills/mcp-integration/examples/sse-server.json +19 -0
  86. package/extensions/plugin-dev/skills/mcp-integration/examples/stdio-server.json +38 -0
  87. package/extensions/plugin-dev/skills/mcp-integration/examples/ws-server.json +26 -0
  88. package/extensions/plugin-dev/skills/mcp-integration/references/authentication.md +601 -0
  89. package/extensions/plugin-dev/skills/mcp-integration/references/server-discovery.md +190 -0
  90. package/extensions/plugin-dev/skills/mcp-integration/references/server-types.md +572 -0
  91. package/extensions/plugin-dev/skills/mcp-integration/references/tool-usage.md +623 -0
  92. package/extensions/plugin-dev/skills/plugin-dev-guide/SKILL.md +222 -0
  93. package/extensions/plugin-dev/skills/plugin-structure/SKILL.md +705 -0
  94. package/extensions/plugin-dev/skills/plugin-structure/examples/advanced-plugin.md +774 -0
  95. package/extensions/plugin-dev/skills/plugin-structure/examples/minimal-plugin.md +83 -0
  96. package/extensions/plugin-dev/skills/plugin-structure/examples/standard-plugin.md +611 -0
  97. package/extensions/plugin-dev/skills/plugin-structure/references/advanced-topics.md +289 -0
  98. package/extensions/plugin-dev/skills/plugin-structure/references/component-patterns.md +592 -0
  99. package/extensions/plugin-dev/skills/plugin-structure/references/github-actions.md +233 -0
  100. package/extensions/plugin-dev/skills/plugin-structure/references/headless-ci-mode.md +193 -0
  101. package/extensions/plugin-dev/skills/plugin-structure/references/manifest-reference.md +625 -0
  102. package/extensions/plugin-dev/skills/plugin-structure/references/output-styles.md +116 -0
  103. package/extensions/plugin-dev/skills/skill-development/SKILL.md +564 -0
  104. package/extensions/plugin-dev/skills/skill-development/examples/complete-skill.md +465 -0
  105. package/extensions/plugin-dev/skills/skill-development/examples/frontmatter-templates.md +167 -0
  106. package/extensions/plugin-dev/skills/skill-development/examples/minimal-skill.md +111 -0
  107. package/extensions/plugin-dev/skills/skill-development/references/advanced-frontmatter.md +225 -0
  108. package/extensions/plugin-dev/skills/skill-development/references/commands-vs-skills.md +39 -0
  109. package/extensions/plugin-dev/skills/skill-development/references/skill-creation-workflow.md +379 -0
  110. package/extensions/plugin-dev/skills/skill-development/references/skill-creator-original.md +210 -0
  111. package/package.json +8 -11
  112. package/scripts/enact-extensions.mjs +751 -16
  113. package/scripts/hooks/session-start-drift-check.mjs +58 -0
  114. package/scripts/lib/build-index.mjs +50 -0
  115. package/scripts/lib/bundle-hash.mjs +137 -0
  116. package/scripts/lib/hooks.mjs +389 -0
  117. package/scripts/lib/ledger.mjs +162 -0
  118. package/scripts/lib/list-bundles.mjs +70 -0
  119. package/scripts/lib/outdated.mjs +144 -0
  120. package/scripts/lib/provision-mcp.mjs +369 -0
  121. package/scripts/lib/resolve-bundle.mjs +121 -0
  122. package/scripts/lib/run-install.mjs +321 -39
  123. package/scripts/lib/run-uninstall.mjs +220 -0
  124. package/scripts/lib/run-update.mjs +152 -0
  125. package/scripts/lib/run-validate.mjs +12 -18
  126. package/scripts/lib/serve.mjs +454 -0
  127. package/scripts/postinstall.mjs +63 -0
  128. package/scripts/setup-enact-context.sh +2 -2
  129. package/spec/index.json +59 -0
  130. package/web/assets/README.md +111 -0
  131. package/web/assets/logo-full.png +0 -0
  132. package/web/assets/logo-slim.png +0 -0
  133. package/web/assets/tokens/base.css +45 -0
  134. package/web/assets/tokens/colors.css +248 -0
  135. package/web/assets/tokens/effects.css +24 -0
  136. package/web/assets/tokens/fonts.css +8 -0
  137. package/web/assets/tokens/index.css +18 -0
  138. package/web/assets/tokens/spacing.css +50 -0
  139. package/web/index.html +1188 -0
  140. package/.agents/plugins/marketplace.json +0 -20
  141. package/catalog/enact-context.json +0 -9
  142. package/catalog/enact-factory.json +0 -7
  143. package/catalog/enact-operator.json +0 -7
  144. package/catalog/enact-wiki.json +0 -7
  145. package/catalog/net-revenue-management.json +0 -8
  146. package/scripts/rename-supervisor-to-operator.pl +0 -66
  147. package/scripts/sync-manifests.mjs +0 -23
  148. package/scripts/validate-catalog.mjs +0 -37
  149. package/scripts/validate-plugin.mjs +0 -10
  150. /package/{plugins → extensions}/net-revenue-management/.mcp.json +0 -0
  151. /package/{plugins → extensions}/net-revenue-management/skills/net-revenue-risks/SKILL.md +0 -0
  152. /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/extensions`
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/extensions`) plus the bundled `plugin-dev` toolkit under `extensions/`. It owns:
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/*` and `validate/*` TypeScript library
15
- - `scripts/` — CLI: `enact-extensions` (`validate` | `sync` | `install`, path defaults to cwd)
16
- - `extensions/`distributable `plugin-dev` bundle (plugin-development skills, agents, commands)
17
- - `catalog/` — registered sibling bundle roots for `validate:catalog` (ADR 0010)
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
- It does **not** ship product plugins. The consumer product plugins `enact-context`, `enact-factory`, `enact-operator`, `enact-wiki` live as **sibling top-level submodules of `enact-os/`**, each owning its own `extensions/` bundle. They are listed in `catalog/` so this repo's `validate:catalog` script can audit them from a single place.
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/.agents/plugin.json` is the canonical source manifest. `enact-extensions sync` derives `.claude-plugin/`, `.codex-plugin/`, and `.cursor-plugin/` from that source.
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 this repo's own extensions/ bundle
48
- npm run sync # regenerate host manifests for extensions/ from .agents/plugin.json
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 a sibling product bundle (e.g. the operator package at `../enact-operator/extensions`):
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 ../enact-operator/extensions
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/extensions`. Path defaults to **cwd**:
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/ # @enact/extensions package root
79
- ├── src/ spec/ scripts/ # manifest library + CLI
80
- ├── extensions/ # plugin-dev toolkit bundle (this repo's own plugin)
81
- └── catalog/ # registered sibling bundle roots (validate:catalog target)
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/extensions` owns manifest tooling only; `enact-factory setup` or `enact-factory plugins delivery` persists the local install scope.
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
@@ -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,GAC1B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,8BAA8B,EAC9B,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,cAAc,CAAC"}
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,GAC1B,MAAM,cAAc,CAAC"}
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
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAkB,UAAU,EAAkB,MAAM,qBAAqB,CAAC;AAYtF,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,8BAA+B,SAAQ,yBAAyB;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,wBAAwB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AA0KD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,wBAAwB,CAoDrG;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,8BAA8B,GAAG,6BAA6B,CAY1G;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,yBAAyB,CA2BxG;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,yBAAyB,CAsBxG"}
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 { defaultCodexHome, ensureMarketplace, readCodexConfig, resolveCodexInstallHomes, setPluginEnabled, writeCodexConfig, } from "./internal/codex.js";
4
- import { syncPlatformManifests } from "./create/index.js";
5
- import { checkPluginBundleComponentPaths, readManifestFile, validateClaudeManifest, validateCodexManifest, validateCursorManifest, } from "./validate/index.js";
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
- function maybeSync(pluginRoot, platform) {
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 (!existsSync(enactManifestPath))
67
- return [];
68
- const enact = readManifestFile(pluginRoot, "enact");
69
- return syncPlatformManifests(pluginRoot, enact, [platform]);
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
- const syncResults = options.sync !== false ? maybeSync(options.pluginRoot, "codex") : [];
142
- const codexManifest = readManifestFile(options.pluginRoot, "codex");
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 = checkPluginBundleComponentPaths(options.pluginRoot, ["codex"]);
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
- const syncResults = options.sync !== false ? maybeSync(options.pluginRoot, "claude") : [];
203
- const claudeManifest = readManifestFile(options.pluginRoot, "claude");
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
- const syncResults = options.sync !== false ? maybeSync(options.pluginRoot, "cursor") : [];
230
- const cursorManifest = readManifestFile(options.pluginRoot, "cursor");
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