@amsterdamdatalabs/enact-extensions 0.1.1 → 0.1.3

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 (115) hide show
  1. package/README.md +4 -3
  2. package/dist/index.d.ts +5 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +3 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/install.d.ts +82 -1
  7. package/dist/install.d.ts.map +1 -1
  8. package/dist/install.js +187 -35
  9. package/dist/install.js.map +1 -1
  10. package/dist/internal/codex.d.ts.map +1 -1
  11. package/dist/internal/codex.js +7 -1
  12. package/dist/internal/codex.js.map +1 -1
  13. package/dist/internal/platform.d.ts +8 -0
  14. package/dist/internal/platform.d.ts.map +1 -1
  15. package/dist/internal/platform.js +46 -2
  16. package/dist/internal/platform.js.map +1 -1
  17. package/dist/provision.d.ts +30 -0
  18. package/dist/provision.d.ts.map +1 -0
  19. package/dist/provision.js +202 -0
  20. package/dist/provision.js.map +1 -0
  21. package/dist/validate/index.d.ts +23 -0
  22. package/dist/validate/index.d.ts.map +1 -1
  23. package/dist/validate/index.js +80 -0
  24. package/dist/validate/index.js.map +1 -1
  25. package/extensions/enact-context/.agents/plugin.json +40 -0
  26. package/extensions/enact-context/.mcp.json +8 -0
  27. package/extensions/enact-context/README.md +25 -0
  28. package/extensions/enact-context/assets/icon.png +0 -0
  29. package/extensions/enact-context/assets/logo.png +0 -0
  30. package/extensions/enact-context/hooks/hooks.json +115 -0
  31. package/extensions/enact-context/skills/enact-context/SKILL.md +149 -0
  32. package/extensions/enact-context/skills/enact-context/scripts/install.sh +69 -0
  33. package/extensions/enact-factory/.agents/plugin.json +42 -0
  34. package/extensions/enact-factory/.mcp.json +8 -0
  35. package/extensions/enact-factory/assets/icon.png +0 -0
  36. package/extensions/enact-factory/assets/logo.png +0 -0
  37. package/extensions/enact-factory/hooks/user-prompt-submit.mjs +67 -0
  38. package/extensions/enact-factory/skills/testing-strategy/SKILL.md +167 -0
  39. package/extensions/enact-factory/skills/workitem-triage/SKILL.md +22 -0
  40. package/extensions/enact-operator/.agents/plugin.json +57 -0
  41. package/extensions/enact-operator/.app.json +3 -0
  42. package/extensions/enact-operator/.mcp.json +10 -0
  43. package/extensions/enact-operator/_taxonomy.md +86 -0
  44. package/extensions/enact-operator/agents/README.md +5 -0
  45. package/extensions/enact-operator/agents/architect.toml +25 -0
  46. package/extensions/enact-operator/agents/code-reviewer.toml +24 -0
  47. package/extensions/enact-operator/agents/critic.toml +30 -0
  48. package/extensions/enact-operator/agents/executor.toml +24 -0
  49. package/extensions/enact-operator/agents/explore.toml +23 -0
  50. package/extensions/enact-operator/agents/planner.toml +24 -0
  51. package/extensions/enact-operator/agents/verifier.toml +24 -0
  52. package/extensions/enact-operator/assets/icon.png +0 -0
  53. package/extensions/enact-operator/assets/logo.png +0 -0
  54. package/extensions/enact-operator/commands/doctor.md +39 -0
  55. package/extensions/enact-operator/commands/setup.md +51 -0
  56. package/extensions/enact-operator/hooks/hooks.json +146 -0
  57. package/extensions/enact-operator/skills/_variants.md +44 -0
  58. package/extensions/enact-operator/skills/ai-slop-cleaner/SKILL.md +50 -0
  59. package/extensions/enact-operator/skills/analyze/SKILL.md +91 -0
  60. package/extensions/enact-operator/skills/ask/SKILL.md +47 -0
  61. package/extensions/enact-operator/skills/autopilot/SKILL.md +170 -0
  62. package/extensions/enact-operator/skills/autoresearch-goal/SKILL.md +79 -0
  63. package/extensions/enact-operator/skills/cancel/SKILL.md +99 -0
  64. package/extensions/enact-operator/skills/configure-notifications/SKILL.md +77 -0
  65. package/extensions/enact-operator/skills/deep-interview/SKILL.md +80 -0
  66. package/extensions/enact-operator/skills/doctor/SKILL.md +48 -0
  67. package/extensions/enact-operator/skills/hud/SKILL.md +49 -0
  68. package/extensions/enact-operator/skills/hyperplan/SKILL.md +47 -0
  69. package/extensions/enact-operator/skills/plan/SKILL.md +78 -0
  70. package/extensions/enact-operator/skills/ralph/SKILL.md +201 -0
  71. package/extensions/enact-operator/skills/ralph/gemini.md +18 -0
  72. package/extensions/enact-operator/skills/ralplan/SKILL.md +151 -0
  73. package/extensions/enact-operator/skills/remove-deadcode/SKILL.md +45 -0
  74. package/extensions/enact-operator/skills/research/SKILL.md +74 -0
  75. package/extensions/enact-operator/skills/review/SKILL.md +58 -0
  76. package/extensions/enact-operator/skills/security-research/SKILL.md +54 -0
  77. package/extensions/enact-operator/skills/setup/SKILL.md +91 -0
  78. package/extensions/enact-operator/skills/setup/scripts/install.sh +50 -0
  79. package/extensions/enact-operator/skills/skill/SKILL.md +82 -0
  80. package/extensions/enact-operator/skills/tdd/SKILL.md +59 -0
  81. package/extensions/enact-operator/skills/team/SKILL.md +199 -0
  82. package/extensions/enact-operator/skills/trace/SKILL.md +41 -0
  83. package/extensions/enact-operator/skills/ultragoal/SKILL.md +99 -0
  84. package/extensions/enact-operator/skills/ultraqa/SKILL.md +113 -0
  85. package/extensions/enact-operator/skills/ultrawork/SKILL.md +145 -0
  86. package/extensions/enact-operator/skills/ultrawork/planner.md +28 -0
  87. package/extensions/enact-operator/skills/wiki/SKILL.md +41 -0
  88. package/extensions/enact-operator/skills/work-with-workitem/SKILL.md +51 -0
  89. package/extensions/enact-wiki/.agents/plugin.json +42 -0
  90. package/extensions/enact-wiki/.mcp.json +15 -0
  91. package/extensions/enact-wiki/README.md +44 -0
  92. package/extensions/enact-wiki/assets/icon.png +0 -0
  93. package/extensions/enact-wiki/assets/logo.png +0 -0
  94. package/extensions/enact-wiki/skills/document-parser/SKILL.md +17 -0
  95. package/extensions/enact-wiki/skills/document-parser/scripts/parse.sh +60 -0
  96. package/extensions/enact-wiki/skills/document-parser/skill.json +9 -0
  97. package/extensions/enact-wiki/skills/enact-wiki/SKILL.md +30 -0
  98. package/extensions/enact-wiki/skills/enact-wiki/references/ingest.md +62 -0
  99. package/extensions/enact-wiki/skills/enact-wiki/references/manage.md +34 -0
  100. package/extensions/enact-wiki/skills/enact-wiki/references/query.md +59 -0
  101. package/extensions/enact-wiki/skills/search-lab/SKILL.md +57 -0
  102. package/extensions/enact-wiki/skills/search-lab/scripts/analyze.ts +23 -0
  103. package/package.json +1 -1
  104. package/scripts/enact-extensions.mjs +79 -12
  105. package/scripts/lib/hooks.mjs +352 -0
  106. package/scripts/lib/ledger.mjs +4 -3
  107. package/scripts/lib/provision-mcp.mjs +12 -365
  108. package/scripts/lib/run-install.mjs +87 -5
  109. package/scripts/lib/run-prune.mjs +73 -0
  110. package/scripts/lib/run-sync.mjs +9 -1
  111. package/scripts/lib/run-uninstall.mjs +26 -2
  112. package/scripts/lib/run-validate.mjs +10 -1
  113. package/scripts/lib/serve.mjs +19 -1
  114. package/scripts/version-bump.sh +463 -0
  115. package/spec/codex.json +1 -11
package/README.md CHANGED
@@ -103,7 +103,7 @@ node scripts/enact-extensions.mjs serve --port 43217 --open
103
103
  Published from `@amsterdamdatalabs/enact-extensions`. Path defaults to **cwd**:
104
104
 
105
105
  ```bash
106
- cd ../enact-operator/extensions
106
+ cd extensions/enact-factory
107
107
  enact-extensions validate
108
108
  enact-extensions sync
109
109
  ```
@@ -152,11 +152,12 @@ enact-extensions/ # @amsterdamdatalabs/enact-extensions packa
152
152
  └── extensions/ # self-contained plugin bundles
153
153
  ├── plugin-dev/ # plugin authoring toolkit
154
154
  ├── cmux/ devops/ dev-state/ # first-party skill bundles
155
- └── net-revenue-management/ # product plugin (Finance)
155
+ ├── enact-context/ enact-factory/ enact-operator/
156
+ └── net-revenue-management/ # product and platform bundles
156
157
  ```
157
158
 
158
159
  ## enact-os integration
159
160
 
160
161
  `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.
161
162
 
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.
163
+ Host plugin delivery now lives in this repo for the shipped bundles under `extensions/`, including `enact-context`, `enact-factory`, and `enact-operator`. Product runtimes still live in their own repos; use `enact-extensions install <name> --platform <surface>` for host registration, while repo-local commands such as `enact-factory setup` or `enact-factory plugins delivery` persist local runtime state.
package/dist/index.d.ts CHANGED
@@ -6,9 +6,11 @@ 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, validatePluginBundleFromCanonical, checkComponentPaths, checkPluginBundleComponentPaths, checkPluginBundleComponentPathsFromCanonical, readManifestFile, } from "./validate/index.js";
9
+ export { validateEnactManifest, assertEnactManifest, validateClaudeManifest, validateCodexManifest, validateCursorManifest, validateManifest, validatePluginManifest, validatePluginBundle, validatePluginBundleFromCanonical, checkComponentPaths, checkPluginBundleComponentPaths, checkPluginBundleComponentPathsFromCanonical, checkHookEvents, assertSupportedHookEvents, SUPPORTED_HOOK_EVENTS, 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, 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";
12
+ export { installCodexPluginBundle, installCodexPluginBundleWithProvision, installPluginBundle, installPluginBundleWithProvision, installClaudePluginBundle, installClaudePluginBundleWithProvision, installCursorPluginBundle, installSharedPluginBundle, codexMarketplaceRoot, codexMarketplacePath, codexMarketplacePluginPath, codexInstalledPluginPath, codexPluginCacheRoot, codexPluginCachePath, readCodexPluginManifest, claudeMarketplaceDir, claudeInstalledPluginPath, claudeKnownMarketplacesPath, readClaudePluginManifest, codexPluginStatus, claudePluginStatus, setInstalledCodexPluginEnabled, runCodexPluginsDoctor, runClaudePluginsDoctor, defaultSharedHome, uninstallCodexPluginBundle, uninstallClaudePluginBundle, uninstallCursorPluginBundle, uninstallSharedPluginBundle, } from "./install.js";
13
+ export type { CodexPluginInstallOptions, CodexPluginInstallResult, CodexPluginInstallWithProvisionOptions, CodexPluginInstallWithProvisionResult, MultiCodexPluginInstallOptions, MultiCodexPluginInstallResult, MultiCodexPluginInstallWithProvisionOptions, MultiCodexPluginInstallWithProvisionResult, CodexPluginDoctorReport, CodexInstalledPluginStatus, ClaudePluginInstallOptions, ClaudePluginInstallResult, ClaudePluginInstallWithProvisionOptions, ClaudePluginInstallWithProvisionResult, ClaudePluginDoctorReport, ClaudeInstalledPluginStatus, CursorPluginInstallOptions, CursorPluginInstallResult, SharedPluginInstallOptions, SharedPluginInstallResult, CodexPluginUninstallOptions, CodexPluginUninstallResult, ClaudePluginUninstallOptions, ClaudePluginUninstallResult, CursorPluginUninstallOptions, CursorPluginUninstallResult, SharedPluginUninstallOptions, SharedPluginUninstallResult, } from "./install.js";
14
+ export type { McpServerDefinition, ProvisionExec, ProvisionExecResult, ProvisionMcpOptions, ProvisionMcpResult, } from "./provision.js";
15
+ export { readMcpServers, provisionMcp, summarizeProvision, } from "./provision.js";
14
16
  //# 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,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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ 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, validatePluginBundleFromCanonical, checkComponentPaths, checkPluginBundleComponentPaths, checkPluginBundleComponentPathsFromCanonical, readManifestFile, } from "./validate/index.js";
8
- export { installCodexPluginBundle, installPluginBundle, installClaudePluginBundle, installCursorPluginBundle, installSharedPluginBundle, defaultSharedHome, uninstallCodexPluginBundle, uninstallClaudePluginBundle, uninstallCursorPluginBundle, uninstallSharedPluginBundle, } from "./install.js";
7
+ export { validateEnactManifest, assertEnactManifest, validateClaudeManifest, validateCodexManifest, validateCursorManifest, validateManifest, validatePluginManifest, validatePluginBundle, validatePluginBundleFromCanonical, checkComponentPaths, checkPluginBundleComponentPaths, checkPluginBundleComponentPathsFromCanonical, checkHookEvents, assertSupportedHookEvents, SUPPORTED_HOOK_EVENTS, readManifestFile, } from "./validate/index.js";
8
+ export { installCodexPluginBundle, installCodexPluginBundleWithProvision, installPluginBundle, installPluginBundleWithProvision, installClaudePluginBundle, installClaudePluginBundleWithProvision, installCursorPluginBundle, installSharedPluginBundle, codexMarketplaceRoot, codexMarketplacePath, codexMarketplacePluginPath, codexInstalledPluginPath, codexPluginCacheRoot, codexPluginCachePath, readCodexPluginManifest, claudeMarketplaceDir, claudeInstalledPluginPath, claudeKnownMarketplacesPath, readClaudePluginManifest, codexPluginStatus, claudePluginStatus, setInstalledCodexPluginEnabled, runCodexPluginsDoctor, runClaudePluginsDoctor, defaultSharedHome, uninstallCodexPluginBundle, uninstallClaudePluginBundle, uninstallCursorPluginBundle, uninstallSharedPluginBundle, } from "./install.js";
9
+ export { readMcpServers, provisionMcp, summarizeProvision, } from "./provision.js";
9
10
  //# 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,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"}
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,eAAe,EACf,yBAAyB,EACzB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,wBAAwB,EACxB,qCAAqC,EACrC,mBAAmB,EACnB,gCAAgC,EAChC,yBAAyB,EACzB,sCAAsC,EACtC,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,8BAA8B,EAC9B,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AAsCtB,OAAO,EACL,cAAc,EACd,YAAY,EACZ,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
package/dist/install.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { SyncResult } from "./internal/types.js";
1
+ import type { PluginManifest, SyncResult } from "./internal/types.js";
2
+ import type { ProvisionExec, ProvisionMcpResult } from "./provision.js";
2
3
  export interface CodexPluginInstallOptions {
3
4
  pluginRoot: string;
4
5
  codexHome?: string;
@@ -26,6 +27,41 @@ export interface MultiCodexPluginInstallResult {
26
27
  codexHomes: string[];
27
28
  results: CodexPluginInstallResult[];
28
29
  }
30
+ export interface CodexPluginDoctorReport {
31
+ configPlugins: string[];
32
+ marketplaceConfigured: boolean;
33
+ marketplaceRoot: string;
34
+ marketplacePath: string;
35
+ marketplacePlugins: string[];
36
+ installedPlugins: string[];
37
+ warnings: string[];
38
+ }
39
+ export interface CodexInstalledPluginStatus {
40
+ name: string;
41
+ enabled: boolean;
42
+ installed: boolean;
43
+ cachedVersions: string[];
44
+ manifest: PluginManifest | null;
45
+ pluginConfigKey: string;
46
+ marketplaceName: string;
47
+ installedPluginPath: string;
48
+ marketplacePluginPath: string;
49
+ cacheRoot: string;
50
+ }
51
+ export interface CodexPluginInstallWithProvisionOptions extends CodexPluginInstallOptions {
52
+ noProvision?: boolean;
53
+ provisionExec?: ProvisionExec;
54
+ }
55
+ export interface CodexPluginInstallWithProvisionResult extends CodexPluginInstallResult {
56
+ provision: ProvisionMcpResult[];
57
+ }
58
+ export interface MultiCodexPluginInstallWithProvisionOptions extends MultiCodexPluginInstallOptions {
59
+ noProvision?: boolean;
60
+ provisionExec?: ProvisionExec;
61
+ }
62
+ export interface MultiCodexPluginInstallWithProvisionResult extends MultiCodexPluginInstallResult {
63
+ provision: ProvisionMcpResult[];
64
+ }
29
65
  export interface ClaudePluginInstallOptions {
30
66
  pluginRoot: string;
31
67
  claudeHome?: string;
@@ -41,6 +77,32 @@ export interface ClaudePluginInstallResult {
41
77
  refreshedPaths: string[];
42
78
  syncResults: SyncResult[];
43
79
  }
80
+ export interface ClaudePluginDoctorReport {
81
+ marketplaceName: string;
82
+ marketplaceDir: string;
83
+ knownMarketplacesPath: string;
84
+ marketplaceRegistered: boolean;
85
+ marketplacePlugins: string[];
86
+ installedPlugins: string[];
87
+ warnings: string[];
88
+ }
89
+ export interface ClaudeInstalledPluginStatus {
90
+ name: string;
91
+ installed: boolean;
92
+ manifest: PluginManifest | null;
93
+ marketplaceName: string;
94
+ marketplaceDir: string;
95
+ installedPluginPath: string;
96
+ knownMarketplaceRegistered: boolean;
97
+ knownMarketplacesPath: string;
98
+ }
99
+ export interface ClaudePluginInstallWithProvisionOptions extends ClaudePluginInstallOptions {
100
+ noProvision?: boolean;
101
+ provisionExec?: ProvisionExec;
102
+ }
103
+ export interface ClaudePluginInstallWithProvisionResult extends ClaudePluginInstallResult {
104
+ provision: ProvisionMcpResult[];
105
+ }
44
106
  export interface CursorPluginInstallOptions {
45
107
  pluginRoot: string;
46
108
  cursorHome?: string;
@@ -53,9 +115,28 @@ export interface CursorPluginInstallResult {
53
115
  refreshedPaths: string[];
54
116
  syncResults: SyncResult[];
55
117
  }
118
+ export declare function codexMarketplaceRoot(codexHome: string, marketplaceName?: string): string;
119
+ export declare function codexMarketplacePath(codexHome: string, marketplaceName?: string): string;
120
+ export declare function codexMarketplacePluginPath(codexHome: string, marketplaceName: string, pluginName: string): string;
121
+ export declare function codexInstalledPluginPath(codexHome: string, pluginName: string): string;
122
+ export declare function codexPluginCachePath(codexHome: string, marketplaceName: string, pluginName: string, version: string): string;
123
+ export declare function codexPluginCacheRoot(codexHome: string, marketplaceName: string, pluginName: string): string;
124
+ export declare function readCodexPluginManifest(pluginRoot: string): PluginManifest | null;
125
+ export declare function claudeMarketplaceDir(claudeHome: string, marketplaceName?: string): string;
126
+ export declare function claudeInstalledPluginPath(claudeHome: string, marketplaceName: string, pluginName: string): string;
127
+ export declare function claudeKnownMarketplacesPath(claudeHome: string): string;
128
+ export declare function readClaudePluginManifest(pluginRoot: string): PluginManifest | null;
56
129
  export declare function installCodexPluginBundle(options: CodexPluginInstallOptions): CodexPluginInstallResult;
57
130
  export declare function installPluginBundle(options: MultiCodexPluginInstallOptions): MultiCodexPluginInstallResult;
131
+ export declare function installCodexPluginBundleWithProvision(options: CodexPluginInstallWithProvisionOptions): CodexPluginInstallWithProvisionResult;
132
+ export declare function installPluginBundleWithProvision(options: MultiCodexPluginInstallWithProvisionOptions): MultiCodexPluginInstallWithProvisionResult;
133
+ export declare function codexPluginStatus(codexHome: string, pluginName: string, marketplaceName?: string): CodexInstalledPluginStatus;
134
+ export declare function setInstalledCodexPluginEnabled(codexHome: string, pluginName: string, enabled: boolean, marketplaceName?: string): CodexInstalledPluginStatus;
135
+ export declare function runCodexPluginsDoctor(codexHome?: string, marketplaceName?: string): CodexPluginDoctorReport;
58
136
  export declare function installClaudePluginBundle(options: ClaudePluginInstallOptions): ClaudePluginInstallResult;
137
+ export declare function installClaudePluginBundleWithProvision(options: ClaudePluginInstallWithProvisionOptions): ClaudePluginInstallWithProvisionResult;
138
+ export declare function claudePluginStatus(claudeHome: string, pluginName: string, marketplaceName?: string): ClaudeInstalledPluginStatus;
139
+ export declare function runClaudePluginsDoctor(claudeHome?: string, marketplaceName?: string): ClaudePluginDoctorReport;
59
140
  export declare function installCursorPluginBundle(options: CursorPluginInstallOptions): CursorPluginInstallResult;
60
141
  export interface CodexPluginUninstallOptions {
61
142
  codexHome?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
package/dist/install.js CHANGED
@@ -1,11 +1,13 @@
1
- import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
1
+ import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
2
2
  import { dirname, join, resolve } from "node:path";
3
3
  import { homedir } from "node:os";
4
- import { defaultCodexHome, ensureMarketplace, readCodexConfig, removePluginConfig, resolveCodexInstallHomes, setPluginEnabled, writeCodexConfig, } from "./internal/codex.js";
4
+ import { defaultCodexHome, ensureMarketplace, isPluginEnabled, readCodexConfig, removePluginConfig, resolveCodexInstallHomes, setPluginEnabled, writeCodexConfig, } from "./internal/codex.js";
5
5
  import { manifestForPlatform } from "./create/index.js";
6
+ import { PROJECTION_COMPONENT_FIELDS } from "./internal/platform.js";
6
7
  import { checkComponentPaths, readManifestFile, validateClaudeManifest, validateCodexManifest, validateCursorManifest, } from "./validate/index.js";
7
- import { defaultClaudeHome, registerLocalMarketplace } from "./internal/claude.js";
8
+ import { defaultClaudeHome, readKnownMarketplaces, registerLocalMarketplace } from "./internal/claude.js";
8
9
  import { defaultCursorHome } from "./internal/cursor.js";
10
+ import { provisionMcp } from "./provision.js";
9
11
  function readJson(path, fallback) {
10
12
  if (!existsSync(path))
11
13
  return fallback;
@@ -15,14 +17,19 @@ function writeJson(path, value) {
15
17
  mkdirSync(dirname(path), { recursive: true });
16
18
  writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
17
19
  }
18
- function pathFieldsFromManifest(manifest) {
19
- const fields = ["skills", "mcpServers", "apps", "commands", "hooks", "agents", "_agents", "rules"];
20
+ function pathFieldsFromManifest(platform, manifest) {
21
+ const fields = PROJECTION_COMPONENT_FIELDS[platform];
20
22
  const results = [];
21
23
  for (const field of fields) {
22
24
  const value = manifest[field];
23
25
  if (typeof value === "string" && value.trim())
24
26
  results.push(value);
25
27
  }
28
+ if (platform === "cursor") {
29
+ const logo = manifest.logo;
30
+ if (typeof logo === "string" && logo.trim())
31
+ results.push(logo);
32
+ }
26
33
  const iface = manifest.interface;
27
34
  if (iface && typeof iface === "object" && !Array.isArray(iface)) {
28
35
  for (const field of ["composerIcon", "logo"]) {
@@ -33,9 +40,9 @@ function pathFieldsFromManifest(manifest) {
33
40
  }
34
41
  return results;
35
42
  }
36
- function normalizedProjectionEntries(manifest, platformDir) {
43
+ function normalizedProjectionEntries(platform, manifest, platformDir) {
37
44
  const entries = new Set([platformDir, "README.md"]);
38
- for (const raw of pathFieldsFromManifest(manifest)) {
45
+ for (const raw of pathFieldsFromManifest(platform, manifest)) {
39
46
  const cleaned = raw.replace(/^\.\//, "").replace(/\/+$/, "");
40
47
  if (!cleaned || cleaned.startsWith("../"))
41
48
  continue;
@@ -51,10 +58,10 @@ function normalizedProjectionEntries(manifest, platformDir) {
51
58
  }
52
59
  return [...entries];
53
60
  }
54
- function projectBundle(sourceRoot, targetRoot, manifest, platformDir) {
61
+ function projectBundle(sourceRoot, targetRoot, platform, manifest, platformDir) {
55
62
  rmSync(targetRoot, { recursive: true, force: true });
56
63
  mkdirSync(targetRoot, { recursive: true });
57
- for (const entry of normalizedProjectionEntries(manifest, platformDir)) {
64
+ for (const entry of normalizedProjectionEntries(platform, manifest, platformDir)) {
58
65
  const sourcePath = resolve(sourceRoot, entry);
59
66
  if (!existsSync(sourcePath))
60
67
  continue;
@@ -91,21 +98,41 @@ function stringField(manifest, key) {
91
98
  const value = manifest[key];
92
99
  return typeof value === "string" && value.trim() ? value : undefined;
93
100
  }
94
- function marketplaceRoot(codexHome, marketplaceName) {
101
+ export function codexMarketplaceRoot(codexHome, marketplaceName = "enact-os-plugins") {
95
102
  return join(codexHome, "marketplaces", marketplaceName);
96
103
  }
97
- function marketplacePath(codexHome, marketplaceName) {
98
- return join(marketplaceRoot(codexHome, marketplaceName), ".agents", "plugins", "marketplace.json");
104
+ export function codexMarketplacePath(codexHome, marketplaceName = "enact-os-plugins") {
105
+ return join(codexMarketplaceRoot(codexHome, marketplaceName), ".agents", "plugins", "marketplace.json");
99
106
  }
100
- function marketplacePluginPath(codexHome, marketplaceName, pluginName) {
101
- return join(marketplaceRoot(codexHome, marketplaceName), "plugins", pluginName);
107
+ export function codexMarketplacePluginPath(codexHome, marketplaceName, pluginName) {
108
+ return join(codexMarketplaceRoot(codexHome, marketplaceName), "plugins", pluginName);
102
109
  }
103
- function installedPluginPath(codexHome, pluginName) {
110
+ export function codexInstalledPluginPath(codexHome, pluginName) {
104
111
  return join(codexHome, "plugins", pluginName);
105
112
  }
106
- function cachePluginPath(codexHome, marketplaceName, pluginName, version) {
113
+ export function codexPluginCachePath(codexHome, marketplaceName, pluginName, version) {
107
114
  return join(codexHome, "plugins", "cache", marketplaceName, pluginName, version);
108
115
  }
116
+ export function codexPluginCacheRoot(codexHome, marketplaceName, pluginName) {
117
+ return join(codexHome, "plugins", "cache", marketplaceName, pluginName);
118
+ }
119
+ export function readCodexPluginManifest(pluginRoot) {
120
+ const manifestPath = join(pluginRoot, ".codex-plugin", "plugin.json");
121
+ return readJson(manifestPath, null);
122
+ }
123
+ export function claudeMarketplaceDir(claudeHome, marketplaceName = "enact-os-plugins") {
124
+ return join(claudeHome, "plugins", "marketplaces", marketplaceName);
125
+ }
126
+ export function claudeInstalledPluginPath(claudeHome, marketplaceName, pluginName) {
127
+ return join(claudeMarketplaceDir(claudeHome, marketplaceName), "plugins", pluginName);
128
+ }
129
+ export function claudeKnownMarketplacesPath(claudeHome) {
130
+ return join(claudeHome, "plugins", "known_marketplaces.json");
131
+ }
132
+ export function readClaudePluginManifest(pluginRoot) {
133
+ const manifestPath = join(pluginRoot, ".claude-plugin", "plugin.json");
134
+ return readJson(manifestPath, null);
135
+ }
109
136
  function marketplaceDisplayName(marketplaceName) {
110
137
  return marketplaceName
111
138
  .split("-")
@@ -123,15 +150,10 @@ function categoryFrom(manifest) {
123
150
  return "Developer Tools";
124
151
  }
125
152
  function manifestForCodexInstall(manifest) {
126
- const name = stringField(manifest, "name");
127
- if (name !== "enact-operator" && name !== "enact-extensions")
128
- return manifest;
129
- const clone = { ...manifest };
130
- delete clone.hooks;
131
- return clone;
153
+ return manifest;
132
154
  }
133
155
  function upsertMarketplaceEntry(codexHome, marketplaceName, manifest, pluginName) {
134
- const path = marketplacePath(codexHome, marketplaceName);
156
+ const path = codexMarketplacePath(codexHome, marketplaceName);
135
157
  const current = readJson(path, {
136
158
  name: marketplaceName,
137
159
  interface: { displayName: marketplaceDisplayName(marketplaceName) },
@@ -177,7 +199,7 @@ export function installCodexPluginBundle(options) {
177
199
  const pluginConfigKey = `${name}@${marketplaceName}`;
178
200
  const config = readCodexConfig(codexHome);
179
201
  ensureMarketplace(config, marketplaceName, {
180
- source: marketplaceRoot(codexHome, marketplaceName),
202
+ source: codexMarketplaceRoot(codexHome, marketplaceName),
181
203
  source_type: "local",
182
204
  });
183
205
  if (options.enable !== false) {
@@ -185,12 +207,12 @@ export function installCodexPluginBundle(options) {
185
207
  }
186
208
  const configPath = writeCodexConfig(codexHome, config);
187
209
  const mktPath = upsertMarketplaceEntry(codexHome, marketplaceName, installManifest, name);
188
- const mktPluginPath = marketplacePluginPath(codexHome, marketplaceName, name);
189
- const installedPath = installedPluginPath(codexHome, name);
190
- const cachePath = cachePluginPath(codexHome, marketplaceName, name, version);
191
- projectBundle(options.pluginRoot, mktPluginPath, installManifest, ".codex-plugin");
192
- projectBundle(options.pluginRoot, installedPath, installManifest, ".codex-plugin");
193
- projectBundle(options.pluginRoot, cachePath, installManifest, ".codex-plugin");
210
+ const mktPluginPath = codexMarketplacePluginPath(codexHome, marketplaceName, name);
211
+ const installedPath = codexInstalledPluginPath(codexHome, name);
212
+ const cachePath = codexPluginCachePath(codexHome, marketplaceName, name, version);
213
+ projectBundle(options.pluginRoot, mktPluginPath, "codex", installManifest, ".codex-plugin");
214
+ projectBundle(options.pluginRoot, installedPath, "codex", installManifest, ".codex-plugin");
215
+ projectBundle(options.pluginRoot, cachePath, "codex", installManifest, ".codex-plugin");
194
216
  return {
195
217
  name,
196
218
  version,
@@ -216,6 +238,83 @@ export function installPluginBundle(options) {
216
238
  }));
217
239
  return { codexHomes, results };
218
240
  }
241
+ export function installCodexPluginBundleWithProvision(options) {
242
+ const result = installCodexPluginBundle(options);
243
+ const provision = provisionMcp(options.pluginRoot, {
244
+ noProvision: options.noProvision,
245
+ exec: options.provisionExec,
246
+ });
247
+ return {
248
+ ...result,
249
+ provision,
250
+ };
251
+ }
252
+ export function installPluginBundleWithProvision(options) {
253
+ const result = installPluginBundle(options);
254
+ const provision = provisionMcp(options.pluginRoot, {
255
+ noProvision: options.noProvision,
256
+ exec: options.provisionExec,
257
+ });
258
+ return {
259
+ ...result,
260
+ provision,
261
+ };
262
+ }
263
+ export function codexPluginStatus(codexHome, pluginName, marketplaceName = "enact-os-plugins") {
264
+ const pluginConfigKey = `${pluginName}@${marketplaceName}`;
265
+ const installedPath = codexInstalledPluginPath(codexHome, pluginName);
266
+ const cacheRoot = codexPluginCacheRoot(codexHome, marketplaceName, pluginName);
267
+ const config = readCodexConfig(codexHome);
268
+ const cachedVersions = existsSync(cacheRoot)
269
+ ? readdirSync(cacheRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort()
270
+ : [];
271
+ const manifest = existsSync(installedPath) ? readCodexPluginManifest(installedPath) : null;
272
+ return {
273
+ name: pluginName,
274
+ enabled: isPluginEnabled(config, pluginConfigKey),
275
+ installed: existsSync(installedPath),
276
+ cachedVersions,
277
+ manifest,
278
+ pluginConfigKey,
279
+ marketplaceName,
280
+ installedPluginPath: installedPath,
281
+ marketplacePluginPath: codexMarketplacePluginPath(codexHome, marketplaceName, pluginName),
282
+ cacheRoot,
283
+ };
284
+ }
285
+ export function setInstalledCodexPluginEnabled(codexHome, pluginName, enabled, marketplaceName = "enact-os-plugins") {
286
+ const config = readCodexConfig(codexHome);
287
+ setPluginEnabled(config, `${pluginName}@${marketplaceName}`, enabled);
288
+ writeCodexConfig(codexHome, config);
289
+ return codexPluginStatus(codexHome, pluginName, marketplaceName);
290
+ }
291
+ export function runCodexPluginsDoctor(codexHome = defaultCodexHome(), marketplaceName = "enact-os-plugins") {
292
+ const config = readCodexConfig(codexHome);
293
+ const marketplace = readJson(codexMarketplacePath(codexHome, marketplaceName), {
294
+ name: marketplaceName,
295
+ interface: { displayName: marketplaceDisplayName(marketplaceName) },
296
+ plugins: [],
297
+ });
298
+ const installedPluginsDir = join(codexMarketplaceRoot(codexHome, marketplaceName), "plugins");
299
+ const installedPlugins = existsSync(installedPluginsDir)
300
+ ? readdirSync(installedPluginsDir, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name)
301
+ : [];
302
+ const warnings = [];
303
+ for (const entry of marketplace.plugins) {
304
+ if (!installedPlugins.includes(entry.name) && isPluginEnabled(config, `${entry.name}@${marketplaceName}`)) {
305
+ warnings.push(`plugin ${entry.name} enabled in config but not installed locally`);
306
+ }
307
+ }
308
+ return {
309
+ configPlugins: Object.keys(config.plugins ?? {}).sort(),
310
+ marketplaceConfigured: Boolean(config.marketplaces?.[marketplaceName]),
311
+ marketplaceRoot: codexMarketplaceRoot(codexHome, marketplaceName),
312
+ marketplacePath: codexMarketplacePath(codexHome, marketplaceName),
313
+ marketplacePlugins: marketplace.plugins.map((plugin) => plugin.name).sort(),
314
+ installedPlugins: installedPlugins.sort(),
315
+ warnings,
316
+ };
317
+ }
219
318
  export function installClaudePluginBundle(options) {
220
319
  const claudeHome = options.claudeHome ?? defaultClaudeHome();
221
320
  const marketplaceName = options.marketplaceName ?? "enact-os-plugins";
@@ -232,7 +331,7 @@ export function installClaudePluginBundle(options) {
232
331
  const version = stringField(claudeManifest, "version") ?? "0.0.0";
233
332
  const marketplaceDir = join(claudeHome, "plugins", "marketplaces", marketplaceName);
234
333
  const installedPath = join(marketplaceDir, "plugins", name);
235
- projectBundle(options.pluginRoot, installedPath, claudeManifest, ".claude-plugin");
334
+ projectBundle(options.pluginRoot, installedPath, "claude", claudeManifest, ".claude-plugin");
236
335
  registerLocalMarketplace(claudeHome, marketplaceName, marketplaceDir);
237
336
  return {
238
337
  name,
@@ -244,6 +343,59 @@ export function installClaudePluginBundle(options) {
244
343
  syncResults: [],
245
344
  };
246
345
  }
346
+ export function installClaudePluginBundleWithProvision(options) {
347
+ const result = installClaudePluginBundle(options);
348
+ const provision = provisionMcp(options.pluginRoot, {
349
+ noProvision: options.noProvision,
350
+ exec: options.provisionExec,
351
+ });
352
+ return {
353
+ ...result,
354
+ provision,
355
+ };
356
+ }
357
+ export function claudePluginStatus(claudeHome, pluginName, marketplaceName = "enact-os-plugins") {
358
+ const marketplaceDir = claudeMarketplaceDir(claudeHome, marketplaceName);
359
+ const knownMarketplaces = readKnownMarketplaces(claudeHome);
360
+ const installedPath = claudeInstalledPluginPath(claudeHome, marketplaceName, pluginName);
361
+ const manifest = existsSync(installedPath) ? readClaudePluginManifest(installedPath) : null;
362
+ return {
363
+ name: pluginName,
364
+ installed: existsSync(installedPath),
365
+ manifest,
366
+ marketplaceName,
367
+ marketplaceDir,
368
+ installedPluginPath: installedPath,
369
+ knownMarketplaceRegistered: Boolean(knownMarketplaces[marketplaceName]),
370
+ knownMarketplacesPath: claudeKnownMarketplacesPath(claudeHome),
371
+ };
372
+ }
373
+ export function runClaudePluginsDoctor(claudeHome = defaultClaudeHome(), marketplaceName = "enact-os-plugins") {
374
+ const marketplaceDir = claudeMarketplaceDir(claudeHome, marketplaceName);
375
+ const knownMarketplaces = readKnownMarketplaces(claudeHome);
376
+ const installedPluginsDir = join(marketplaceDir, "plugins");
377
+ const installedPlugins = existsSync(installedPluginsDir)
378
+ ? readdirSync(installedPluginsDir, { withFileTypes: true })
379
+ .filter((entry) => entry.isDirectory())
380
+ .map((entry) => entry.name)
381
+ : [];
382
+ const warnings = [];
383
+ if (!knownMarketplaces[marketplaceName] && installedPlugins.length > 0) {
384
+ warnings.push(`marketplace ${marketplaceName} has installed plugins but is not registered in known_marketplaces.json`);
385
+ }
386
+ if (knownMarketplaces[marketplaceName] && !existsSync(marketplaceDir)) {
387
+ warnings.push(`marketplace ${marketplaceName} registered in known_marketplaces.json but install directory is missing`);
388
+ }
389
+ return {
390
+ marketplaceName,
391
+ marketplaceDir,
392
+ knownMarketplacesPath: claudeKnownMarketplacesPath(claudeHome),
393
+ marketplaceRegistered: Boolean(knownMarketplaces[marketplaceName]),
394
+ marketplacePlugins: installedPlugins.slice().sort(),
395
+ installedPlugins: installedPlugins.sort(),
396
+ warnings,
397
+ };
398
+ }
247
399
  export function installCursorPluginBundle(options) {
248
400
  const cursorHome = options.cursorHome ?? defaultCursorHome();
249
401
  // Per-surface manifest derived IN MEMORY; install never writes to source.
@@ -258,7 +410,7 @@ export function installCursorPluginBundle(options) {
258
410
  }
259
411
  const version = stringField(cursorManifest, "version") ?? "0.0.0";
260
412
  const installedPath = join(cursorHome, "plugins", "local", name);
261
- projectBundle(options.pluginRoot, installedPath, cursorManifest, ".cursor-plugin");
413
+ projectBundle(options.pluginRoot, installedPath, "cursor", cursorManifest, ".cursor-plugin");
262
414
  return {
263
415
  name,
264
416
  version,
@@ -285,7 +437,7 @@ function assertWithinBase(base, target) {
285
437
  * Other plugin entries are preserved.
286
438
  */
287
439
  function removeMarketplaceEntry(codexHome, marketplaceName, pluginName) {
288
- const path = marketplacePath(codexHome, marketplaceName);
440
+ const path = codexMarketplacePath(codexHome, marketplaceName);
289
441
  if (!existsSync(path))
290
442
  return;
291
443
  const current = readJson(path, { name: marketplaceName, plugins: [] });
@@ -308,8 +460,8 @@ export function uninstallCodexPluginBundle(name, options = {}) {
308
460
  const codexHome = options.codexHome ?? defaultCodexHome();
309
461
  const mktName = options.marketplaceName ?? "enact-os-plugins";
310
462
  const pluginConfigKey = `${name}@${mktName}`;
311
- const installedPath = installedPluginPath(codexHome, name);
312
- const mktPluginPath = marketplacePluginPath(codexHome, mktName, name);
463
+ const installedPath = codexInstalledPluginPath(codexHome, name);
464
+ const mktPluginPath = codexMarketplacePluginPath(codexHome, mktName, name);
313
465
  // Cache dir is versioned; remove the entire <cache>/<marketplace>/<name>/ subtree
314
466
  const cacheDirForPlugin = join(codexHome, "plugins", "cache", mktName, name);
315
467
  const noop = !existsSync(installedPath) &&