@amsterdamdatalabs/enact-extensions 0.1.0 → 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.
- package/README.md +96 -21
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +171 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +402 -49
- package/dist/install.js.map +1 -1
- package/dist/internal/codex.d.ts.map +1 -1
- package/dist/internal/codex.js +7 -1
- package/dist/internal/codex.js.map +1 -1
- package/dist/internal/platform.d.ts +8 -0
- package/dist/internal/platform.d.ts.map +1 -1
- package/dist/internal/platform.js +46 -2
- package/dist/internal/platform.js.map +1 -1
- package/dist/provision.d.ts +30 -0
- package/dist/provision.d.ts.map +1 -0
- package/dist/provision.js +202 -0
- package/dist/provision.js.map +1 -0
- package/dist/validate/index.d.ts +44 -0
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +157 -0
- package/dist/validate/index.js.map +1 -1
- package/extensions/cmux/.agents/plugin.json +37 -0
- package/extensions/cmux/skills/cmux/SKILL.md +82 -0
- package/extensions/cmux/skills/cmux/agents/openai.yaml +4 -0
- package/extensions/cmux/skills/cmux/references/handles-and-identify.md +35 -0
- package/extensions/cmux/skills/cmux/references/panes-surfaces.md +37 -0
- package/extensions/cmux/skills/cmux/references/trigger-flash-and-health.md +23 -0
- package/extensions/cmux/skills/cmux/references/windows-workspaces.md +31 -0
- package/extensions/cmux/skills/cmux-vm-monitor/SKILL.md +122 -0
- package/extensions/cmux/skills/cmux-vm-monitor/agents/openai.yaml +4 -0
- package/extensions/cmux/skills/cmux-vm-monitor/references/cmux-commands.md +66 -0
- package/extensions/cmux/skills/cmux-vm-monitor/scripts/codex_vm_monitor.sh +45 -0
- package/extensions/cmux/skills/cmux-workspace/SKILL.md +93 -0
- package/extensions/dev-state/.agents/plugin.json +35 -0
- package/extensions/dev-state/skills/dev-state-plan-graduation/SKILL.md +194 -0
- package/extensions/dev-state/skills/dev-state-plan-graduation/agents/openai.yaml +4 -0
- package/extensions/dev-state/skills/dev-state-plan-graduation/references/reference.md +130 -0
- package/extensions/devops/.agents/plugin.json +36 -0
- package/extensions/devops/skills/azure-devops-cli/SKILL.md +431 -0
- package/extensions/devops/skills/azure-devops-cli/agents/openai.yaml +4 -0
- package/extensions/devops/skills/ci-pipeline-strategy/SKILL.md +217 -0
- package/extensions/devops/skills/ci-pipeline-strategy/agents/openai.yaml +4 -0
- package/extensions/enact-context/.agents/plugin.json +40 -0
- package/extensions/enact-context/.mcp.json +8 -0
- package/extensions/enact-context/README.md +25 -0
- package/extensions/enact-context/assets/icon.png +0 -0
- package/extensions/enact-context/assets/logo.png +0 -0
- package/extensions/enact-context/hooks/hooks.json +115 -0
- package/extensions/enact-context/skills/enact-context/SKILL.md +149 -0
- package/extensions/enact-context/skills/enact-context/scripts/install.sh +69 -0
- package/extensions/enact-factory/.agents/plugin.json +42 -0
- package/extensions/enact-factory/.mcp.json +8 -0
- package/extensions/enact-factory/assets/icon.png +0 -0
- package/extensions/enact-factory/assets/logo.png +0 -0
- package/extensions/enact-factory/hooks/user-prompt-submit.mjs +67 -0
- package/extensions/enact-factory/skills/testing-strategy/SKILL.md +167 -0
- package/extensions/enact-factory/skills/workitem-triage/SKILL.md +22 -0
- package/extensions/enact-operator/.agents/plugin.json +57 -0
- package/extensions/enact-operator/.app.json +3 -0
- package/extensions/enact-operator/.mcp.json +10 -0
- package/extensions/enact-operator/_taxonomy.md +86 -0
- package/extensions/enact-operator/agents/README.md +5 -0
- package/extensions/enact-operator/agents/architect.toml +25 -0
- package/extensions/enact-operator/agents/code-reviewer.toml +24 -0
- package/extensions/enact-operator/agents/critic.toml +30 -0
- package/extensions/enact-operator/agents/executor.toml +24 -0
- package/extensions/enact-operator/agents/explore.toml +23 -0
- package/extensions/enact-operator/agents/planner.toml +24 -0
- package/extensions/enact-operator/agents/verifier.toml +24 -0
- package/extensions/enact-operator/assets/icon.png +0 -0
- package/extensions/enact-operator/assets/logo.png +0 -0
- package/extensions/enact-operator/commands/doctor.md +39 -0
- package/extensions/enact-operator/commands/setup.md +51 -0
- package/extensions/enact-operator/hooks/hooks.json +146 -0
- package/extensions/enact-operator/skills/_variants.md +44 -0
- package/extensions/enact-operator/skills/ai-slop-cleaner/SKILL.md +50 -0
- package/extensions/enact-operator/skills/analyze/SKILL.md +91 -0
- package/extensions/enact-operator/skills/ask/SKILL.md +47 -0
- package/extensions/enact-operator/skills/autopilot/SKILL.md +170 -0
- package/extensions/enact-operator/skills/autoresearch-goal/SKILL.md +79 -0
- package/extensions/enact-operator/skills/cancel/SKILL.md +99 -0
- package/extensions/enact-operator/skills/configure-notifications/SKILL.md +77 -0
- package/extensions/enact-operator/skills/deep-interview/SKILL.md +80 -0
- package/extensions/enact-operator/skills/doctor/SKILL.md +48 -0
- package/extensions/enact-operator/skills/hud/SKILL.md +49 -0
- package/extensions/enact-operator/skills/hyperplan/SKILL.md +47 -0
- package/extensions/enact-operator/skills/plan/SKILL.md +78 -0
- package/extensions/enact-operator/skills/ralph/SKILL.md +201 -0
- package/extensions/enact-operator/skills/ralph/gemini.md +18 -0
- package/extensions/enact-operator/skills/ralplan/SKILL.md +151 -0
- package/extensions/enact-operator/skills/remove-deadcode/SKILL.md +45 -0
- package/extensions/enact-operator/skills/research/SKILL.md +74 -0
- package/extensions/enact-operator/skills/review/SKILL.md +58 -0
- package/extensions/enact-operator/skills/security-research/SKILL.md +54 -0
- package/extensions/enact-operator/skills/setup/SKILL.md +91 -0
- package/extensions/enact-operator/skills/setup/scripts/install.sh +50 -0
- package/extensions/enact-operator/skills/skill/SKILL.md +82 -0
- package/extensions/enact-operator/skills/tdd/SKILL.md +59 -0
- package/extensions/enact-operator/skills/team/SKILL.md +199 -0
- package/extensions/enact-operator/skills/trace/SKILL.md +41 -0
- package/extensions/enact-operator/skills/ultragoal/SKILL.md +99 -0
- package/extensions/enact-operator/skills/ultraqa/SKILL.md +113 -0
- package/extensions/enact-operator/skills/ultrawork/SKILL.md +145 -0
- package/extensions/enact-operator/skills/ultrawork/planner.md +28 -0
- package/extensions/enact-operator/skills/wiki/SKILL.md +41 -0
- package/extensions/enact-operator/skills/work-with-workitem/SKILL.md +51 -0
- package/extensions/enact-wiki/.agents/plugin.json +42 -0
- package/extensions/enact-wiki/.mcp.json +15 -0
- package/extensions/enact-wiki/README.md +44 -0
- package/extensions/enact-wiki/assets/icon.png +0 -0
- package/extensions/enact-wiki/assets/logo.png +0 -0
- package/extensions/enact-wiki/skills/document-parser/SKILL.md +17 -0
- package/extensions/enact-wiki/skills/document-parser/scripts/parse.sh +60 -0
- package/extensions/enact-wiki/skills/document-parser/skill.json +9 -0
- package/extensions/enact-wiki/skills/enact-wiki/SKILL.md +30 -0
- package/extensions/enact-wiki/skills/enact-wiki/references/ingest.md +62 -0
- package/extensions/enact-wiki/skills/enact-wiki/references/manage.md +34 -0
- package/extensions/enact-wiki/skills/enact-wiki/references/query.md +59 -0
- package/extensions/enact-wiki/skills/search-lab/SKILL.md +57 -0
- package/extensions/enact-wiki/skills/search-lab/scripts/analyze.ts +23 -0
- package/{plugins/net-revenue-management/.codex-plugin → extensions/net-revenue-management/.agents}/plugin.json +10 -6
- package/extensions/plugin-dev/.agents/plugin.json +42 -0
- package/extensions/plugin-dev/.mcp.json +3 -0
- package/extensions/plugin-dev/agents/agent-creator.md +199 -0
- package/extensions/plugin-dev/agents/plugin-validator.md +91 -0
- package/extensions/plugin-dev/agents/skill-reviewer.md +212 -0
- package/extensions/plugin-dev/commands/_archive/create-marketplace.md +427 -0
- package/extensions/plugin-dev/commands/_archive/plugin-dev-guide.md +12 -0
- package/extensions/plugin-dev/commands/create-plugin.md +498 -0
- package/extensions/plugin-dev/commands/start.md +81 -0
- package/extensions/plugin-dev/hooks/hooks.json +3 -0
- package/extensions/plugin-dev/skills/agent-development/SKILL.md +641 -0
- package/extensions/plugin-dev/skills/agent-development/examples/agent-creation-prompt.md +250 -0
- package/extensions/plugin-dev/skills/agent-development/examples/complete-agent-examples.md +461 -0
- package/extensions/plugin-dev/skills/agent-development/references/advanced-agent-fields.md +246 -0
- package/extensions/plugin-dev/skills/agent-development/references/agent-creation-system-prompt.md +216 -0
- package/extensions/plugin-dev/skills/agent-development/references/permission-modes-rules.md +226 -0
- package/extensions/plugin-dev/skills/agent-development/references/system-prompt-design.md +464 -0
- package/extensions/plugin-dev/skills/agent-development/references/triggering-examples.md +474 -0
- package/extensions/plugin-dev/skills/agent-development/scripts/create-agent-skeleton.sh +176 -0
- package/extensions/plugin-dev/skills/agent-development/scripts/test-agent-trigger.sh +227 -0
- package/extensions/plugin-dev/skills/agent-development/scripts/validate-agent.sh +227 -0
- package/extensions/plugin-dev/skills/command-development/SKILL.md +763 -0
- package/extensions/plugin-dev/skills/command-development/examples/plugin-commands.md +612 -0
- package/extensions/plugin-dev/skills/command-development/examples/simple-commands.md +527 -0
- package/extensions/plugin-dev/skills/command-development/references/advanced-workflows.md +762 -0
- package/extensions/plugin-dev/skills/command-development/references/documentation-patterns.md +769 -0
- package/extensions/plugin-dev/skills/command-development/references/frontmatter-reference.md +508 -0
- package/extensions/plugin-dev/skills/command-development/references/interactive-commands.md +966 -0
- package/extensions/plugin-dev/skills/command-development/references/marketplace-considerations.md +943 -0
- package/extensions/plugin-dev/skills/command-development/references/plugin-features-reference.md +637 -0
- package/extensions/plugin-dev/skills/command-development/references/plugin-integration.md +191 -0
- package/extensions/plugin-dev/skills/command-development/references/skill-tool.md +447 -0
- package/extensions/plugin-dev/skills/command-development/references/testing-strategies.md +723 -0
- package/extensions/plugin-dev/skills/command-development/scripts/check-frontmatter.sh +234 -0
- package/extensions/plugin-dev/skills/command-development/scripts/validate-command.sh +160 -0
- package/extensions/plugin-dev/skills/hook-development/SKILL.md +861 -0
- package/extensions/plugin-dev/skills/hook-development/examples/load-context.sh +55 -0
- package/extensions/plugin-dev/skills/hook-development/examples/validate-bash.sh +57 -0
- package/extensions/plugin-dev/skills/hook-development/examples/validate-write.sh +48 -0
- package/extensions/plugin-dev/skills/hook-development/references/advanced.md +871 -0
- package/extensions/plugin-dev/skills/hook-development/references/hook-input-schemas.md +145 -0
- package/extensions/plugin-dev/skills/hook-development/references/migration.md +392 -0
- package/extensions/plugin-dev/skills/hook-development/references/patterns.md +430 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/README.md +181 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/hook-linter.sh +153 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/test-hook.sh +276 -0
- package/extensions/plugin-dev/skills/hook-development/scripts/validate-hook-schema.sh +159 -0
- package/extensions/plugin-dev/skills/mcp-integration/SKILL.md +775 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/http-server.json +20 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/sse-server.json +19 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/stdio-server.json +38 -0
- package/extensions/plugin-dev/skills/mcp-integration/examples/ws-server.json +26 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/authentication.md +601 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/server-discovery.md +190 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/server-types.md +572 -0
- package/extensions/plugin-dev/skills/mcp-integration/references/tool-usage.md +623 -0
- package/extensions/plugin-dev/skills/plugin-dev-guide/SKILL.md +222 -0
- package/extensions/plugin-dev/skills/plugin-structure/SKILL.md +705 -0
- package/extensions/plugin-dev/skills/plugin-structure/examples/advanced-plugin.md +774 -0
- package/extensions/plugin-dev/skills/plugin-structure/examples/minimal-plugin.md +83 -0
- package/extensions/plugin-dev/skills/plugin-structure/examples/standard-plugin.md +611 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/advanced-topics.md +289 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/component-patterns.md +592 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/github-actions.md +233 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/headless-ci-mode.md +193 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/manifest-reference.md +625 -0
- package/extensions/plugin-dev/skills/plugin-structure/references/output-styles.md +116 -0
- package/extensions/plugin-dev/skills/skill-development/SKILL.md +564 -0
- package/extensions/plugin-dev/skills/skill-development/examples/complete-skill.md +465 -0
- package/extensions/plugin-dev/skills/skill-development/examples/frontmatter-templates.md +167 -0
- package/extensions/plugin-dev/skills/skill-development/examples/minimal-skill.md +111 -0
- package/extensions/plugin-dev/skills/skill-development/references/advanced-frontmatter.md +225 -0
- package/extensions/plugin-dev/skills/skill-development/references/commands-vs-skills.md +39 -0
- package/extensions/plugin-dev/skills/skill-development/references/skill-creation-workflow.md +379 -0
- package/extensions/plugin-dev/skills/skill-development/references/skill-creator-original.md +210 -0
- package/package.json +8 -11
- package/scripts/enact-extensions.mjs +823 -21
- package/scripts/hooks/session-start-drift-check.mjs +58 -0
- package/scripts/lib/build-index.mjs +50 -0
- package/scripts/lib/bundle-hash.mjs +137 -0
- package/scripts/lib/hooks.mjs +741 -0
- package/scripts/lib/ledger.mjs +163 -0
- package/scripts/lib/list-bundles.mjs +70 -0
- package/scripts/lib/outdated.mjs +144 -0
- package/scripts/lib/provision-mcp.mjs +16 -0
- package/scripts/lib/resolve-bundle.mjs +121 -0
- package/scripts/lib/run-install.mjs +402 -38
- package/scripts/lib/run-prune.mjs +73 -0
- package/scripts/lib/run-sync.mjs +9 -1
- package/scripts/lib/run-uninstall.mjs +244 -0
- package/scripts/lib/run-update.mjs +152 -0
- package/scripts/lib/run-validate.mjs +21 -18
- package/scripts/lib/serve.mjs +472 -0
- package/scripts/postinstall.mjs +63 -0
- package/scripts/setup-enact-context.sh +2 -2
- package/scripts/version-bump.sh +463 -0
- package/spec/codex.json +1 -11
- package/spec/index.json +59 -0
- package/web/assets/README.md +111 -0
- package/web/assets/logo-full.png +0 -0
- package/web/assets/logo-slim.png +0 -0
- package/web/assets/tokens/base.css +45 -0
- package/web/assets/tokens/colors.css +248 -0
- package/web/assets/tokens/effects.css +24 -0
- package/web/assets/tokens/fonts.css +8 -0
- package/web/assets/tokens/index.css +18 -0
- package/web/assets/tokens/spacing.css +50 -0
- package/web/index.html +1188 -0
- package/.agents/plugins/marketplace.json +0 -20
- package/catalog/enact-context.json +0 -9
- package/catalog/enact-factory.json +0 -7
- package/catalog/enact-operator.json +0 -7
- package/catalog/enact-wiki.json +0 -7
- package/catalog/net-revenue-management.json +0 -8
- package/scripts/rename-supervisor-to-operator.pl +0 -66
- package/scripts/sync-manifests.mjs +0 -23
- package/scripts/validate-catalog.mjs +0 -37
- package/scripts/validate-plugin.mjs +0 -10
- /package/{plugins → extensions}/net-revenue-management/.mcp.json +0 -0
- /package/{plugins → extensions}/net-revenue-management/skills/net-revenue-risks/SKILL.md +0 -0
- /package/{plugins → extensions}/net-revenue-management/skills/net-revenue-scenario/SKILL.md +0 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import {
|
|
4
|
+
uninstallCodexPluginBundle,
|
|
5
|
+
uninstallClaudePluginBundle,
|
|
6
|
+
uninstallCursorPluginBundle,
|
|
7
|
+
uninstallSharedPluginBundle,
|
|
8
|
+
defaultEnactHome,
|
|
9
|
+
defaultSharedHome,
|
|
10
|
+
} from "../../dist/index.js";
|
|
11
|
+
import { appendEntry } from "./ledger.mjs";
|
|
12
|
+
import { removePluginHooks } from "./hooks.mjs";
|
|
13
|
+
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// resolveHomes — mirrors run-install.mjs; same scope/per-platform-home logic.
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
function resolveHomes(options) {
|
|
18
|
+
const scope = options.scope ?? "global";
|
|
19
|
+
const local = (sub) => join(process.cwd(), sub);
|
|
20
|
+
return {
|
|
21
|
+
scope,
|
|
22
|
+
codexHome: options.codexHome ?? (scope === "local" ? local(".codex") : undefined),
|
|
23
|
+
enactHome: options.enactHome ?? (scope === "local" ? local(".enact/agent") : defaultEnactHome()),
|
|
24
|
+
claudeHome: options.claudeHome ?? (scope === "local" ? local(".claude") : undefined),
|
|
25
|
+
cursorHome: options.cursorHome ?? (scope === "local" ? local(".cursor") : undefined),
|
|
26
|
+
sharedHome: options.sharedHome ?? (scope === "local" ? process.cwd() : defaultSharedHome()),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// ALL_PLATFORMS / parsePlatforms — reuse same logic as run-install.mjs
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
const ALL_PLATFORMS = ["codex", "claude", "cursor", "enact"];
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Expand "all" and split comma-separated platform lists.
|
|
37
|
+
* Returns a deduped array of validated platform name strings.
|
|
38
|
+
* Throws on unknown platform tokens.
|
|
39
|
+
*/
|
|
40
|
+
export function parsePlatforms(platform) {
|
|
41
|
+
if (!platform || platform === "codex") return ["codex"];
|
|
42
|
+
if (platform === "all") return ALL_PLATFORMS;
|
|
43
|
+
|
|
44
|
+
const parts = [...new Set(platform.split(",").map((p) => p.trim()).filter(Boolean))];
|
|
45
|
+
if (parts.length === 0) return ["codex"];
|
|
46
|
+
|
|
47
|
+
const valid = new Set(["codex", "claude", "cursor", "enact", "shared"]);
|
|
48
|
+
for (const part of parts) {
|
|
49
|
+
if (!valid.has(part)) {
|
|
50
|
+
throw new Error(
|
|
51
|
+
`Unknown platform: "${part}". Valid: codex, claude, cursor, enact, shared, all`,
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return parts;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Ledger wiring — best-effort; a write failure NEVER aborts the uninstall.
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
function recordLedgerEntry(entry, options) {
|
|
62
|
+
try {
|
|
63
|
+
appendEntry(entry, {
|
|
64
|
+
home: options.ledgerHome ?? homedir(),
|
|
65
|
+
});
|
|
66
|
+
} catch (err) {
|
|
67
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
68
|
+
process.stderr.write(
|
|
69
|
+
`[enact-extensions uninstall] Warning: failed to write uninstall ledger: ${msg}\n`,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function recordUninstall(name, version, platform, homes, options, result) {
|
|
75
|
+
if (!name) return;
|
|
76
|
+
// Determine the path field from the uninstall result
|
|
77
|
+
const path = (result && result.removedPaths && result.removedPaths[0]) ?? "";
|
|
78
|
+
recordLedgerEntry(
|
|
79
|
+
{
|
|
80
|
+
action: "uninstall",
|
|
81
|
+
name,
|
|
82
|
+
version: version ?? "0.0.0",
|
|
83
|
+
platform,
|
|
84
|
+
scope: homes.scope,
|
|
85
|
+
home: homes[platformHomeField(platform)] ?? homes.enactHome,
|
|
86
|
+
path,
|
|
87
|
+
marketplaceName: options.marketplaceName ?? "enact-os-plugins",
|
|
88
|
+
},
|
|
89
|
+
options,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function removeInstalledPluginHooks(name, platform, homes, options) {
|
|
94
|
+
if (!["codex", "claude", "cursor", "enact"].includes(platform)) return;
|
|
95
|
+
const hookResult = removePluginHooks(platform, name, {
|
|
96
|
+
cwd: options.cwd ?? process.cwd(),
|
|
97
|
+
codexHome: platform === "codex" ? homes.codexHome : undefined,
|
|
98
|
+
claudeHome: platform === "claude" ? homes.claudeHome : undefined,
|
|
99
|
+
cursorHome: platform === "cursor" ? homes.cursorHome : undefined,
|
|
100
|
+
enactHome: platform === "enact" ? homes.enactHome : undefined,
|
|
101
|
+
});
|
|
102
|
+
if (hookResult.result !== "not_found" && hookResult.result !== "skipped") {
|
|
103
|
+
console.log(`hooks ${hookResult.result} for ${name} on ${platform} -> ${hookResult.location}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function platformHomeField(platform) {
|
|
108
|
+
switch (platform) {
|
|
109
|
+
case "enact": return "enactHome";
|
|
110
|
+
case "codex": return "codexHome";
|
|
111
|
+
case "claude": return "claudeHome";
|
|
112
|
+
case "cursor": return "cursorHome";
|
|
113
|
+
case "shared": return "sharedHome";
|
|
114
|
+
default: return "enactHome";
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
// Per-platform uninstall dispatch
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
/**
|
|
122
|
+
* Uninstall `name` from a single platform. Returns the uninstall result.
|
|
123
|
+
* Emits a stderr warning (never throws) when the plugin is not installed.
|
|
124
|
+
*/
|
|
125
|
+
function runSinglePlatform(name, platform, homes, options) {
|
|
126
|
+
let result;
|
|
127
|
+
|
|
128
|
+
// Remove plugin hook registrations before platform uninstall rewrites host
|
|
129
|
+
// config files. Some serializers preserve hook tables but drop marker
|
|
130
|
+
// comments, so post-uninstall cleanup would lose its reversible marker.
|
|
131
|
+
removeInstalledPluginHooks(name, platform, homes, options);
|
|
132
|
+
|
|
133
|
+
switch (platform) {
|
|
134
|
+
case "enact":
|
|
135
|
+
result = uninstallCodexPluginBundle(name, {
|
|
136
|
+
codexHome: homes.enactHome,
|
|
137
|
+
marketplaceName: options.marketplaceName,
|
|
138
|
+
});
|
|
139
|
+
break;
|
|
140
|
+
case "codex":
|
|
141
|
+
result = uninstallCodexPluginBundle(name, {
|
|
142
|
+
codexHome: homes.codexHome,
|
|
143
|
+
marketplaceName: options.marketplaceName,
|
|
144
|
+
});
|
|
145
|
+
break;
|
|
146
|
+
case "claude":
|
|
147
|
+
result = uninstallClaudePluginBundle(name, {
|
|
148
|
+
claudeHome: homes.claudeHome,
|
|
149
|
+
marketplaceName: options.marketplaceName,
|
|
150
|
+
});
|
|
151
|
+
break;
|
|
152
|
+
case "cursor":
|
|
153
|
+
result = uninstallCursorPluginBundle(name, {
|
|
154
|
+
cursorHome: homes.cursorHome,
|
|
155
|
+
});
|
|
156
|
+
break;
|
|
157
|
+
case "shared":
|
|
158
|
+
result = uninstallSharedPluginBundle(name, {
|
|
159
|
+
sharedHome: homes.sharedHome,
|
|
160
|
+
});
|
|
161
|
+
break;
|
|
162
|
+
default:
|
|
163
|
+
throw new Error(`Unknown platform: "${platform}"`);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (result.noop) {
|
|
167
|
+
removeInstalledPluginHooks(name, platform, homes, options);
|
|
168
|
+
process.stderr.write(
|
|
169
|
+
`[enact-extensions uninstall] Nothing to remove for ${name} on ${platform} (not installed).\n`,
|
|
170
|
+
);
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
for (const p of result.removedPaths) {
|
|
175
|
+
console.log(`removed ${p}`);
|
|
176
|
+
}
|
|
177
|
+
console.log(`uninstalled ${name} from ${platform}`);
|
|
178
|
+
|
|
179
|
+
removeInstalledPluginHooks(name, platform, homes, options);
|
|
180
|
+
|
|
181
|
+
// Record uninstall in ledger (best-effort)
|
|
182
|
+
recordUninstall(name, options.version, platform, homes, options, result);
|
|
183
|
+
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
// runUninstall — main entry point (mirrors runInstall signature)
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
/**
|
|
191
|
+
* Uninstall `nameOrPath` from the given platform(s).
|
|
192
|
+
*
|
|
193
|
+
* `nameOrPath` may be:
|
|
194
|
+
* - a plugin name (string), used directly
|
|
195
|
+
* - a path to a bundle root (resolveBundlePath should have been called by the CLI)
|
|
196
|
+
*
|
|
197
|
+
* The CLI passes the resolved name. Library callers may pass the name directly.
|
|
198
|
+
*
|
|
199
|
+
* @param {string} name - Plugin name (not a bundle path).
|
|
200
|
+
* @param {object} options - Same option bag as runInstall, plus optional `version`.
|
|
201
|
+
*/
|
|
202
|
+
export function runUninstall(name, options = {}) {
|
|
203
|
+
const platforms = parsePlatforms(options.platform);
|
|
204
|
+
const homes = resolveHomes(options);
|
|
205
|
+
|
|
206
|
+
console.log(
|
|
207
|
+
`uninstall scope: ${homes.scope}${homes.scope === "local" ? ` (${process.cwd()})` : ""}`,
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
// Single-platform path
|
|
211
|
+
if (platforms.length === 1) {
|
|
212
|
+
return runSinglePlatform(name, platforms[0], homes, options);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Multi-platform path — run each sequentially, collect results + errors.
|
|
216
|
+
const platformResults = [];
|
|
217
|
+
let hasError = false;
|
|
218
|
+
|
|
219
|
+
for (const platform of platforms) {
|
|
220
|
+
console.log(`\n[${platform}] uninstalling...`);
|
|
221
|
+
try {
|
|
222
|
+
const result = runSinglePlatform(name, platform, homes, options);
|
|
223
|
+
console.log(`[${platform}] ✓ done`);
|
|
224
|
+
platformResults.push({ platform, result, error: null });
|
|
225
|
+
} catch (err) {
|
|
226
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
227
|
+
console.error(`[${platform}] ✗ failed: ${msg}`);
|
|
228
|
+
platformResults.push({ platform, result: null, error: err });
|
|
229
|
+
hasError = true;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (hasError) {
|
|
234
|
+
const failed = platformResults.filter((r) => r.error).map((r) => r.platform);
|
|
235
|
+
const succeeded = platformResults.filter((r) => !r.error).map((r) => r.platform);
|
|
236
|
+
const summary = `Multi-platform uninstall: ${succeeded.length} succeeded (${succeeded.join(", ")}), ${failed.length} failed (${failed.join(", ")})`;
|
|
237
|
+
console.error(`\n${summary}`);
|
|
238
|
+
const err = new Error(summary);
|
|
239
|
+
err.platforms = platformResults;
|
|
240
|
+
throw err;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return { platforms: platformResults };
|
|
244
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* run-update.mjs — refresh installed plugins that have drifted from their
|
|
3
|
+
* canonical source bundle.
|
|
4
|
+
*
|
|
5
|
+
* runUpdate({ name?, all?, dryRun?, home?, cwd? }) → summary
|
|
6
|
+
*
|
|
7
|
+
* The update is driven ENTIRELY by the ledger, per (plugin, surface, home):
|
|
8
|
+
*
|
|
9
|
+
* 1. computeOutdated({ home, cwd }) classifies every installed surface as
|
|
10
|
+
* fresh | outdated | orphaned.
|
|
11
|
+
* 2. We keep only the OUTDATED surfaces (fresh needs nothing; orphaned can't be
|
|
12
|
+
* refreshed because the canonical source is gone).
|
|
13
|
+
* 3. Scope the candidate set:
|
|
14
|
+
* --all → every outdated surface
|
|
15
|
+
* <name> → only outdated surfaces for that plugin
|
|
16
|
+
* (neither) → error (don't silently update everything without --all)
|
|
17
|
+
* 4. For each target outdated surface, re-install THAT plugin to THAT ONE surface
|
|
18
|
+
* at THAT recorded home, by calling runInstall(canonicalPath, {
|
|
19
|
+
* platform: entry.platform, scope: entry.scope, <matching *-home>: entry.home,
|
|
20
|
+
* ledgerHome: home, sync: false }).
|
|
21
|
+
* runInstall appends a fresh ledger entry (with the new hash), so the ledger
|
|
22
|
+
* self-updates and a later computeOutdated reports the surface as fresh.
|
|
23
|
+
*
|
|
24
|
+
* CRITICAL: we ONLY touch surfaces the plugin is actually installed on. A plugin
|
|
25
|
+
* installed only on cursor updates ONLY cursor — it is never installed to a
|
|
26
|
+
* surface it isn't already on.
|
|
27
|
+
*
|
|
28
|
+
* --dry-run: report what WOULD be updated and do NOTHING (no install, no ledger
|
|
29
|
+
* writes).
|
|
30
|
+
*
|
|
31
|
+
* Returns a summary:
|
|
32
|
+
* {
|
|
33
|
+
* planned: Entry[], // outdated surfaces in scope (what was / would be targeted)
|
|
34
|
+
* updated: Entry[], // surfaces actually re-installed (empty on dry-run)
|
|
35
|
+
* skipped: Entry[], // orphaned surfaces in scope (can't refresh)
|
|
36
|
+
* failed: { entry, error }[], // surfaces whose re-install threw
|
|
37
|
+
* dryRun: boolean,
|
|
38
|
+
* }
|
|
39
|
+
* where each Entry is the OutdatedEntry { name, platform, scope, home, status, ... }.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
import { homedir } from "node:os";
|
|
43
|
+
import { cwd as processCwd } from "node:process";
|
|
44
|
+
import { computeOutdated } from "./outdated.mjs";
|
|
45
|
+
import { resolveBundlePath } from "./resolve-bundle.mjs";
|
|
46
|
+
import { runInstall } from "./run-install.mjs";
|
|
47
|
+
|
|
48
|
+
// Map a ledger platform → the runInstall option key that carries its home.
|
|
49
|
+
// (Mirrors the homeField mapping in run-install.mjs PLATFORM_TARGETS; codex has
|
|
50
|
+
// no dedicated *-home table entry there, so it maps to codexHome explicitly.)
|
|
51
|
+
const PLATFORM_HOME_OPTION = {
|
|
52
|
+
codex: "codexHome",
|
|
53
|
+
claude: "claudeHome",
|
|
54
|
+
cursor: "cursorHome",
|
|
55
|
+
enact: "enactHome",
|
|
56
|
+
shared: "sharedHome",
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the canonical bundle path for a plugin name, or null when the source
|
|
61
|
+
* cannot be found (so an outdated→install attempt degrades to a skip rather than
|
|
62
|
+
* a crash).
|
|
63
|
+
*
|
|
64
|
+
* @param {string} name
|
|
65
|
+
* @param {string} cwd
|
|
66
|
+
* @returns {string|null}
|
|
67
|
+
*/
|
|
68
|
+
function safeResolveBundlePath(name, cwd) {
|
|
69
|
+
try {
|
|
70
|
+
return resolveBundlePath(name, { cwd });
|
|
71
|
+
} catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Refresh outdated installed plugin surfaces, driven by the ledger.
|
|
78
|
+
*
|
|
79
|
+
* @param {object} [opts]
|
|
80
|
+
* @param {string} [opts.name] — restrict to a single plugin name.
|
|
81
|
+
* @param {boolean} [opts.all] — update every outdated surface.
|
|
82
|
+
* @param {boolean} [opts.dryRun]— report only; make no changes.
|
|
83
|
+
* @param {string} [opts.home] — ledger home override (defaults to os.homedir()).
|
|
84
|
+
* @param {string} [opts.cwd] — working dir for canonical bundle resolution.
|
|
85
|
+
* @returns {{ planned: object[], updated: object[], skipped: object[], failed: {entry: object, error: Error}[], dryRun: boolean }}
|
|
86
|
+
*/
|
|
87
|
+
export function runUpdate({ name, all, dryRun, home, cwd } = {}) {
|
|
88
|
+
const resolvedHome = home ?? homedir();
|
|
89
|
+
const resolvedCwd = cwd ?? processCwd();
|
|
90
|
+
|
|
91
|
+
// Scope guard: require an explicit target. Never silently update everything.
|
|
92
|
+
if (!all && !name) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
"update requires a plugin name or --all. " +
|
|
95
|
+
'Use "update <name>" to refresh one plugin, or "update --all" to refresh every outdated plugin.',
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 1. Compute freshness across every installed surface.
|
|
100
|
+
const outdatedReport = computeOutdated({ home: resolvedHome, cwd: resolvedCwd });
|
|
101
|
+
|
|
102
|
+
// 2. Restrict to the requested plugin (when a name is given).
|
|
103
|
+
const inScope = name
|
|
104
|
+
? outdatedReport.filter((e) => e.name === name)
|
|
105
|
+
: outdatedReport;
|
|
106
|
+
|
|
107
|
+
// 3. Split into actionable (outdated) vs orphaned (skip). fresh is ignored.
|
|
108
|
+
/** @type {object[]} */
|
|
109
|
+
const planned = inScope.filter((e) => e.status === "outdated");
|
|
110
|
+
/** @type {object[]} */
|
|
111
|
+
const skipped = inScope.filter((e) => e.status === "orphaned");
|
|
112
|
+
|
|
113
|
+
/** @type {object[]} */
|
|
114
|
+
const updated = [];
|
|
115
|
+
/** @type {{ entry: object, error: Error }[]} */
|
|
116
|
+
const failed = [];
|
|
117
|
+
|
|
118
|
+
// Dry-run: report the plan, change nothing.
|
|
119
|
+
if (dryRun) {
|
|
120
|
+
return { planned, updated, skipped, failed, dryRun: true };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// 4. Re-install each outdated surface to its EXACT recorded platform + home.
|
|
124
|
+
for (const entry of planned) {
|
|
125
|
+
const canonicalPath = safeResolveBundlePath(entry.name, resolvedCwd);
|
|
126
|
+
if (!canonicalPath) {
|
|
127
|
+
// Source vanished between the freshness scan and now → treat as orphaned skip.
|
|
128
|
+
skipped.push({ ...entry, status: "orphaned" });
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const homeOption = PLATFORM_HOME_OPTION[entry.platform] ?? "codexHome";
|
|
133
|
+
try {
|
|
134
|
+
runInstall(canonicalPath, {
|
|
135
|
+
platform: entry.platform,
|
|
136
|
+
scope: entry.scope,
|
|
137
|
+
[homeOption]: entry.home,
|
|
138
|
+
ledgerHome: resolvedHome,
|
|
139
|
+
// Refresh the already-installed surface only; do not regenerate source
|
|
140
|
+
// manifests, and skip MCP provisioning (a refresh re-installs identical
|
|
141
|
+
// package deps — provisioning is best-effort and not needed here).
|
|
142
|
+
sync: false,
|
|
143
|
+
noProvision: true,
|
|
144
|
+
});
|
|
145
|
+
updated.push(entry);
|
|
146
|
+
} catch (err) {
|
|
147
|
+
failed.push({ entry, error: err instanceof Error ? err : new Error(String(err)) });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return { planned, updated, skipped, failed, dryRun: false };
|
|
152
|
+
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
readManifestFile,
|
|
2
|
+
validatePluginBundleFromCanonical,
|
|
3
|
+
checkPluginBundleComponentPathsFromCanonical,
|
|
4
|
+
checkHookEvents,
|
|
6
5
|
} from "../../dist/index.js";
|
|
7
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Validate a plugin bundle using IN-MEMORY manifest derivation from the
|
|
9
|
+
* canonical `.agents/plugin.json`. No source `.<platform>-plugin/` dirs are
|
|
10
|
+
* read or created.
|
|
11
|
+
*
|
|
12
|
+
* For backward-compatibility, `platforms` defaults to all four surfaces.
|
|
13
|
+
*/
|
|
8
14
|
export function runValidate(pluginRoot, platforms) {
|
|
9
|
-
const report =
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
try {
|
|
13
|
-
const enact = readManifestFile(pluginRoot, "enact");
|
|
14
|
-
warnings = checkComponentPaths(pluginRoot, enact);
|
|
15
|
-
} catch {
|
|
16
|
-
// enact manifest optional for partial bundles
|
|
17
|
-
}
|
|
15
|
+
const report = validatePluginBundleFromCanonical(pluginRoot, platforms);
|
|
16
|
+
const warnings = checkPluginBundleComponentPathsFromCanonical(pluginRoot);
|
|
17
|
+
const hookErrors = checkHookEvents(pluginRoot);
|
|
18
18
|
|
|
19
19
|
for (const result of report.results) {
|
|
20
20
|
const status = result.ok ? "ok" : "FAIL";
|
|
@@ -24,13 +24,16 @@ export function runValidate(pluginRoot, platforms) {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
if (hookErrors.length > 0) {
|
|
28
|
+
console.log(`[FAIL] hooks (${pluginRoot})`);
|
|
29
|
+
for (const err of hookErrors) {
|
|
30
|
+
console.log(` - ${err}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
27
34
|
for (const warn of warnings) {
|
|
28
35
|
console.log(`[warn] ${warn}`);
|
|
29
36
|
}
|
|
30
|
-
const componentIssues = checkPluginBundleComponentPaths(pluginRoot, platforms);
|
|
31
|
-
for (const issue of componentIssues) {
|
|
32
|
-
console.log(`[FAIL] ${issue}`);
|
|
33
|
-
}
|
|
34
37
|
|
|
35
|
-
return report.ok &&
|
|
38
|
+
return report.ok && warnings.length === 0 && hookErrors.length === 0;
|
|
36
39
|
}
|