@devflow-tools/cli 0.16.8 → 0.16.9

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 (37) hide show
  1. package/dist/commands/doctor.d.ts.map +1 -1
  2. package/dist/commands/doctor.js +59 -2
  3. package/dist/commands/doctor.js.map +1 -1
  4. package/dist/commands/mcp.d.ts +10 -0
  5. package/dist/commands/mcp.d.ts.map +1 -0
  6. package/dist/commands/mcp.js +33 -0
  7. package/dist/commands/mcp.js.map +1 -0
  8. package/dist/commands/plugin/install.d.ts.map +1 -1
  9. package/dist/commands/plugin/install.js +6 -7
  10. package/dist/commands/plugin/install.js.map +1 -1
  11. package/dist/commands/plugin/uninstall.d.ts.map +1 -1
  12. package/dist/commands/plugin/uninstall.js +6 -7
  13. package/dist/commands/plugin/uninstall.js.map +1 -1
  14. package/dist/commands/plugin-guide.d.ts.map +1 -1
  15. package/dist/commands/plugin-guide.js +8 -5
  16. package/dist/commands/plugin-guide.js.map +1 -1
  17. package/dist/commands/skill-health.d.ts +21 -0
  18. package/dist/commands/skill-health.d.ts.map +1 -0
  19. package/dist/commands/skill-health.js +106 -0
  20. package/dist/commands/skill-health.js.map +1 -0
  21. package/dist/commands/skill.d.ts.map +1 -1
  22. package/dist/commands/skill.js +101 -29
  23. package/dist/commands/skill.js.map +1 -1
  24. package/dist/index.js +32 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/plugin-registry.d.ts.map +1 -1
  27. package/dist/lib/plugin-registry.js +3 -10
  28. package/dist/lib/plugin-registry.js.map +1 -1
  29. package/dist/plugin-files/.claude-plugin/plugin.json +1 -1
  30. package/dist/plugin-files/dist/command-registry.json +116 -20
  31. package/dist/plugin-files/dist/hooks/hook-client.js +6 -6
  32. package/dist/plugin-files/dist/hooks/hook-daemon.js +9 -9
  33. package/dist/plugin-files/dist/hooks/post-tool-use.js +3 -3
  34. package/dist/plugin-files/dist/hooks/pre-tool-use.js +2 -2
  35. package/dist/plugin-files/dist/hooks/user-prompt-submit.js +2 -2
  36. package/dist/plugin-files/package.json +7 -7
  37. package/package.json +27 -27
@@ -0,0 +1,10 @@
1
+ export declare function showMcpInventory(options?: {
2
+ project?: string;
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ export declare function showMcpHealth(options?: {
6
+ project?: string;
7
+ json?: boolean;
8
+ refresh?: boolean;
9
+ }): Promise<void>;
10
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAcxG;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxH"}
@@ -0,0 +1,33 @@
1
+ import { homedir } from "node:os";
2
+ import { checkMcpHealth, readMcpInventory, redactMcpInventory, readCachedMcpHealth } from "@devflow-tools/sdk";
3
+ export async function showMcpInventory(options = {}) {
4
+ const report = redactMcpInventory(readMcpInventory(options.project ?? process.cwd()));
5
+ if (options.json) {
6
+ console.log(JSON.stringify(report, null, 2));
7
+ return;
8
+ }
9
+ for (const server of report.servers) {
10
+ const drift = server.drift?.length ? ` [${server.drift.join(", ")}]` : "";
11
+ console.log(`${server.name} ${server.transport} ${server.enabled ? "enabled" : "disabled"}${drift}`);
12
+ console.log(` sources: ${server.sourcePaths.join(", ")}`);
13
+ console.log(` fingerprint: ${server.fingerprint}`);
14
+ }
15
+ if (report.duplicates.length)
16
+ console.log(`duplicates: ${report.duplicates.map((entry) => entry.name).join(", ")}`);
17
+ if (report.unreadable.length)
18
+ console.error(`unreadable: ${report.unreadable.map((entry) => entry.path).join(", ")}`);
19
+ }
20
+ export async function showMcpHealth(options = {}) {
21
+ const report = options.refresh
22
+ ? await checkMcpHealth(readMcpInventory(options.project ?? process.cwd()))
23
+ : readCachedMcpHealth(homedir());
24
+ if (options.json) {
25
+ console.log(JSON.stringify(report, null, 2));
26
+ return;
27
+ }
28
+ for (const record of report.records) {
29
+ const detail = record.failureCategory ? ` ${record.failureCategory}: ${record.lastError ?? ""}` : "";
30
+ console.log(`${record.status.toUpperCase()} ${record.name} failures=${record.failureCount}${detail}`);
31
+ }
32
+ }
33
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE/G,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAgD,EAAE;IACvF,MAAM,MAAM,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACtF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,EAAE,CAAC,CAAC;QACrG,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpH,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAmE,EAAE;IACvG,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO;QAC5B,CAAC,CAAC,MAAM,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC;IACnC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,eAAe,KAAK,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrG,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,YAAY,GAAG,MAAM,EAAE,CAAC,CAAC;IACxG,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,oBAAoB,SAkB7B,CAAC"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,oBAAoB,SAiB7B,CAAC"}
@@ -1,22 +1,21 @@
1
1
  import { Command } from 'commander';
2
2
  import chalk from 'chalk';
3
- import { execSync } from 'child_process';
3
+ import { installSkill } from '../skill.js';
4
4
  export const pluginInstallCommand = new Command('install')
5
5
  .description('Install a plugin')
6
6
  .argument('<name>', 'Plugin name (with or without @devflow-tools/ prefix)')
7
7
  .action(async (name) => {
8
- const fullName = name.startsWith('@devflow-tools/')
9
- ? name
10
- : `@devflow-tools/${name}`;
8
+ const normalized = name.replace(/^@devflow-tools\/(?:plugin-)?/, '');
9
+ const fullName = `@devflow-tools/plugin-${normalized}`;
11
10
  console.log(`Installing ${fullName}...`);
12
11
  try {
13
- execSync(`npm install -g ${fullName}`, { stdio: 'inherit' });
14
- console.log(`\n${chalk.green('✓')} ${fullName} installed successfully`);
12
+ const result = await installSkill(fullName, process.cwd(), true);
13
+ console.log(`\n${chalk.green('✓')} ${fullName}@${result.version} installed and activated`);
15
14
  console.log(`\nRun "devflow plugin list --installed" to verify.`);
16
15
  }
17
16
  catch (error) {
18
17
  console.error(`\n${chalk.red('✗')} Installation failed: ${error.message}`);
19
- process.exit(1);
18
+ process.exitCode = 1;
20
19
  }
21
20
  });
22
21
  //# sourceMappingURL=install.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/plugin/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACvD,WAAW,CAAC,kBAAkB,CAAC;KAC/B,QAAQ,CAAC,QAAQ,EAAE,sDAAsD,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACjD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,kBAAkB,IAAI,EAAE,CAAC;IAE7B,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,KAAK,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,yBAAyB,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/plugin/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACvD,WAAW,CAAC,kBAAkB,CAAC;KAC/B,QAAQ,CAAC,QAAQ,EAAE,sDAAsD,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,yBAAyB,UAAU,EAAE,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,KAAK,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,IAAI,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,yBAA0B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,sBAAsB,SAiB/B,CAAC"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/plugin/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,sBAAsB,SAgB/B,CAAC"}
@@ -1,21 +1,20 @@
1
1
  import { Command } from 'commander';
2
2
  import chalk from 'chalk';
3
- import { execSync } from 'child_process';
3
+ import { uninstallSkill } from '../skill.js';
4
4
  export const pluginUninstallCommand = new Command('uninstall')
5
5
  .description('Uninstall a plugin')
6
6
  .argument('<name>', 'Plugin name (with or without @devflow-tools/ prefix)')
7
7
  .action(async (name) => {
8
- const fullName = name.startsWith('@devflow-tools/')
9
- ? name
10
- : `@devflow-tools/${name}`;
8
+ const normalized = name.replace(/^@devflow-tools\/(?:plugin-)?/, '');
9
+ const fullName = `@devflow-tools/plugin-${normalized}`;
11
10
  console.log(`Uninstalling ${fullName}...`);
12
11
  try {
13
- execSync(`npm uninstall -g ${fullName}`, { stdio: 'inherit' });
14
- console.log(`\n${chalk.green('✓')} ${fullName} uninstalled successfully`);
12
+ await uninstallSkill(fullName, process.cwd(), true);
13
+ console.log(`\n${chalk.green('✓')} ${fullName} deactivated and uninstalled`);
15
14
  }
16
15
  catch (error) {
17
16
  console.error(`\n${chalk.red('✗')} Uninstallation failed: ${error.message}`);
18
- process.exit(1);
17
+ process.exitCode = 1;
19
18
  }
20
19
  });
21
20
  //# sourceMappingURL=uninstall.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/plugin/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KAC3D,WAAW,CAAC,oBAAoB,CAAC;KACjC,QAAQ,CAAC,QAAQ,EAAE,sDAAsD,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACjD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,kBAAkB,IAAI,EAAE,CAAC;IAE7B,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,KAAK,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,QAAQ,CAAC,oBAAoB,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,2BAA2B,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/plugin/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KAC3D,WAAW,CAAC,oBAAoB,CAAC;KACjC,QAAQ,CAAC,QAAQ,EAAE,sDAAsD,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,yBAAyB,UAAU,EAAE,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,KAAK,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,8BAA8B,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,2BAA4B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACxF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-guide.d.ts","sourceRoot":"","sources":["../../src/commands/plugin-guide.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAazE;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyEpF"}
1
+ {"version":3,"file":"plugin-guide.d.ts","sourceRoot":"","sources":["../../src/commands/plugin-guide.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAazE;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyEpF"}
@@ -1,8 +1,8 @@
1
1
  import { readFileSync } from "fs";
2
2
  import { join } from "path";
3
- import { execSync } from "child_process";
4
3
  import { checkbox } from "@inquirer/prompts";
5
4
  import { loadPluginRegistry } from "../lib/plugin-registry.js";
5
+ import { installSkill } from "./skill.js";
6
6
  /**
7
7
  * Detect project tech stack by inspecting package.json dependencies.
8
8
  */
@@ -36,7 +36,10 @@ export function detectTechStack(projectRoot) {
36
36
  */
37
37
  export function resolvePluginName(name) {
38
38
  const trimmed = name.trim();
39
- return trimmed.startsWith("@devflow-tools/") ? trimmed : `@devflow-tools/${trimmed}`;
39
+ if (!trimmed)
40
+ return "";
41
+ const shortName = trimmed.replace(/^@devflow-tools\/(?:plugin-)?/, "");
42
+ return `@devflow-tools/plugin-${shortName}`;
40
43
  }
41
44
  /**
42
45
  * Non-interactive plugin installation from a comma-separated list.
@@ -48,7 +51,7 @@ export async function installPluginsFromList(names) {
48
51
  for (const plugin of plugins) {
49
52
  console.log(`Installing ${plugin}...`);
50
53
  try {
51
- execSync(`npm install -g ${plugin}`, { stdio: "inherit" });
54
+ await installSkill(plugin, process.cwd(), true);
52
55
  console.log(`✓ ${plugin}`);
53
56
  }
54
57
  catch {
@@ -83,7 +86,7 @@ export async function guidePluginInstallation(projectRoot) {
83
86
  const defaults = [...recommended];
84
87
  for (const plugin of defaults) {
85
88
  try {
86
- execSync(`npm install -g ${plugin}`, { stdio: "inherit" });
89
+ await installSkill(plugin, projectRoot, true);
87
90
  console.log(`✓ ${plugin}`);
88
91
  }
89
92
  catch {
@@ -113,7 +116,7 @@ export async function guidePluginInstallation(projectRoot) {
113
116
  console.log("\nInstalling selected plugins...\n");
114
117
  for (const plugin of selected) {
115
118
  try {
116
- execSync(`npm install -g ${plugin}`, { stdio: "inherit" });
119
+ await installSkill(plugin, projectRoot, true);
117
120
  console.log(`✓ ${plugin}\n`);
118
121
  }
119
122
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-guide.js","sourceRoot":"","sources":["../../src/commands/plugin-guide.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-guide.js","sourceRoot":"","sources":["../../src/commands/plugin-guide.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type SkillHealthCategory = "missing" | "duplicate" | "stale" | "malformed" | "unsupported" | "unbound";
2
+ export interface SkillHealthIssue {
3
+ category: SkillHealthCategory;
4
+ skill?: string;
5
+ path?: string;
6
+ reason: string;
7
+ }
8
+ export interface SkillHealthReport {
9
+ pluginRoot: string | null;
10
+ registryVersion: number | null;
11
+ skills: number;
12
+ commands: number;
13
+ issues: SkillHealthIssue[];
14
+ healthy: boolean;
15
+ }
16
+ export declare function inspectSkillHealth(pluginRoot?: string | null): SkillHealthReport;
17
+ export declare function showSkillHealth(options?: {
18
+ root?: string;
19
+ json?: boolean;
20
+ }): number;
21
+ //# sourceMappingURL=skill-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-health.d.ts","sourceRoot":"","sources":["../../src/commands/skill-health.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;AAE9G,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAiBD,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,CAyDhF;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAQvF"}
@@ -0,0 +1,106 @@
1
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { resolveActivePlugin } from "../lib/plugin-setup.js";
5
+ function parseFrontmatter(path) {
6
+ const source = readFileSync(path, "utf8");
7
+ const match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(source);
8
+ if (!match)
9
+ return {};
10
+ const result = {};
11
+ for (const line of match[1].split(/\r?\n/)) {
12
+ const separator = line.indexOf(":");
13
+ if (separator < 1)
14
+ continue;
15
+ const key = line.slice(0, separator).trim();
16
+ const value = line.slice(separator + 1).trim();
17
+ if (key === "name" || key === "description")
18
+ result[key] = value;
19
+ }
20
+ return result;
21
+ }
22
+ export function inspectSkillHealth(pluginRoot) {
23
+ const root = pluginRoot === undefined ? resolveActivePlugin(homedir()).root : pluginRoot;
24
+ if (!root)
25
+ return { pluginRoot: null, registryVersion: null, skills: 0, commands: 0, healthy: false, issues: [{ category: "missing", reason: "No active DevFlow Claude plugin found" }] };
26
+ const issues = [];
27
+ const registryPath = [join(root, "dist", "command-registry.json"), join(root, "command-registry.json")].find(existsSync);
28
+ let registryVersion = null;
29
+ let commands = {};
30
+ if (!registryPath) {
31
+ issues.push({ category: "missing", reason: "command-registry.json is missing" });
32
+ }
33
+ else {
34
+ try {
35
+ const registry = JSON.parse(readFileSync(registryPath, "utf8"));
36
+ registryVersion = typeof registry.version === "number" ? registry.version : null;
37
+ if (registryVersion !== 1 && registryVersion !== 2)
38
+ issues.push({ category: "unsupported", path: registryPath, reason: `unsupported registry version ${String(registry.version)}` });
39
+ if (registry.commands && typeof registry.commands === "object")
40
+ commands = registry.commands;
41
+ else
42
+ issues.push({ category: "malformed", path: registryPath, reason: "commands object is missing" });
43
+ }
44
+ catch (error) {
45
+ issues.push({ category: "malformed", path: registryPath, reason: error.message });
46
+ }
47
+ }
48
+ const skillsRoot = join(root, "skills");
49
+ const skillNames = new Map();
50
+ if (!existsSync(skillsRoot)) {
51
+ issues.push({ category: "missing", path: skillsRoot, reason: "skills directory is missing" });
52
+ }
53
+ else {
54
+ for (const entry of readdirSync(skillsRoot, { withFileTypes: true })) {
55
+ if (!entry.isDirectory())
56
+ continue;
57
+ const path = join(skillsRoot, entry.name, "SKILL.md");
58
+ if (!existsSync(path))
59
+ continue;
60
+ const frontmatter = parseFrontmatter(path);
61
+ if (!frontmatter.name || !frontmatter.description) {
62
+ issues.push({ category: "malformed", skill: entry.name, path, reason: "frontmatter name and description are required" });
63
+ continue;
64
+ }
65
+ if (!/^devflow(?::[a-z0-9-]+)?$/.test(frontmatter.name))
66
+ issues.push({ category: "unsupported", skill: frontmatter.name, path, reason: "skill name is outside the canonical DevFlow namespace" });
67
+ const canonicalDirectory = frontmatter.name.startsWith("devflow:") ? frontmatter.name.slice("devflow:".length) : frontmatter.name;
68
+ if (frontmatter.name !== entry.name && canonicalDirectory !== entry.name)
69
+ issues.push({ category: "stale", skill: frontmatter.name, path, reason: `directory name ${entry.name} does not match frontmatter` });
70
+ const paths = skillNames.get(frontmatter.name) ?? [];
71
+ paths.push(path);
72
+ skillNames.set(frontmatter.name, paths);
73
+ }
74
+ }
75
+ for (const [name, paths] of skillNames) {
76
+ if (paths.length > 1)
77
+ issues.push({ category: "duplicate", skill: name, reason: paths.join(", ") });
78
+ if (name !== "devflow" && !commands[name] && !["devflow:doctor", "devflow:start"].includes(name))
79
+ issues.push({ category: "unbound", skill: name, path: paths[0], reason: "skill has no command registry entry" });
80
+ }
81
+ for (const [command, entry] of Object.entries(commands)) {
82
+ if (!skillNames.has(command))
83
+ issues.push({ category: "missing", skill: command, reason: "registry command has no installed SKILL.md" });
84
+ if (!Array.isArray(entry.mcpTools) || entry.mcpTools.some((tool) => typeof tool !== "string"))
85
+ issues.push({ category: "malformed", skill: command, reason: "mcpTools must be a string array" });
86
+ if (registryVersion === 2 && typeof entry.skillPath === "string") {
87
+ const canonicalPath = join(root, entry.skillPath);
88
+ const packagedPath = join(root, entry.skillPath.replace(/^skills\/devflow:/, "skills/"));
89
+ if (!existsSync(canonicalPath) && !existsSync(packagedPath))
90
+ issues.push({ category: "stale", skill: command, path: entry.skillPath, reason: "registry skillPath does not exist" });
91
+ }
92
+ }
93
+ return { pluginRoot: root, registryVersion, skills: skillNames.size, commands: Object.keys(commands).length, issues, healthy: issues.length === 0 };
94
+ }
95
+ export function showSkillHealth(options = {}) {
96
+ const report = inspectSkillHealth(options.root);
97
+ if (options.json)
98
+ console.log(JSON.stringify(report, null, 2));
99
+ else {
100
+ console.log(`Skills: ${report.skills}, registry commands: ${report.commands}, version: ${report.registryVersion ?? "missing"}`);
101
+ for (const issue of report.issues)
102
+ console.log(`${issue.category.toUpperCase()} ${issue.skill ?? "runtime"}: ${issue.reason}`);
103
+ }
104
+ return report.healthy ? 0 : 1;
105
+ }
106
+ //# sourceMappingURL=skill-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-health.js","sourceRoot":"","sources":["../../src/commands/skill-health.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA2B3E;AAED,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAE5C;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAS5F;AAmBD,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,MAAsB,EACnC,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAyCjE;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,MAAsB,EACnC,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC,IAAI,CAAC,CAyBf"}
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA2B3E;AAED,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAE5C;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAS5F;AA4BD,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,MAAsB,EACnC,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA6EjE;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,MAAsB,EACnC,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
@@ -1,8 +1,9 @@
1
1
  import { withServer } from "../lib/with-server.js";
2
2
  import { loadPlugins } from "./plugin-loader.js";
3
- import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync } from "fs";
3
+ import { extractPlugin, getPluginInstallRoot, importPluginModule, readPluginInstallState, removePluginInstallRecord, upsertPluginInstallRecord, } from "@devflow-tools/sdk";
4
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, renameSync, rmSync } from "fs";
4
5
  import { join } from "path";
5
- import { execSync } from "child_process";
6
+ import { execFileSync } from "child_process";
6
7
  export async function listSkills(skipServer) {
7
8
  return withServer(process.cwd(), async (client) => {
8
9
  const plugins = await client.listPlugins();
@@ -24,7 +25,7 @@ export async function listSkills(skipServer) {
24
25
  tags: p.meta.tags,
25
26
  installed: true,
26
27
  }));
27
- }, { skipServer });
28
+ }, { skipServer: true });
28
29
  }
29
30
  export function listSkillsSync() {
30
31
  return [];
@@ -36,7 +37,13 @@ export async function searchSkills(query, skipServer) {
36
37
  s.description.toLowerCase().includes(q) ||
37
38
  s.tags.some((t) => t.toLowerCase().includes(q)));
38
39
  }
39
- const HOME_SKILLS_DIR = join(process.env.HOME ?? "~", ".devflow", "skills");
40
+ const HOME_SKILLS_DIR = getPluginInstallRoot();
41
+ function normalizePluginPackageName(name) {
42
+ const shortName = name.trim().replace(/^@devflow-tools\/(?:plugin-)?/, "");
43
+ if (!/^[a-z0-9-]+$/.test(shortName))
44
+ throw new Error(`Invalid plugin name: ${name}`);
45
+ return `@devflow-tools/plugin-${shortName}`;
46
+ }
40
47
  function readConfig(projectRoot) {
41
48
  const configPath = join(projectRoot, ".devflow", "config.json");
42
49
  if (!existsSync(configPath))
@@ -45,25 +52,25 @@ function readConfig(projectRoot) {
45
52
  }
46
53
  function writeConfig(projectRoot, config) {
47
54
  const configPath = join(projectRoot, ".devflow", "config.json");
48
- writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
55
+ mkdirSync(join(projectRoot, ".devflow"), { recursive: true });
56
+ const temporary = `${configPath}.${process.pid}.${Date.now()}.tmp`;
57
+ writeFileSync(temporary, `${JSON.stringify(config, null, 2)}\n`, "utf-8");
58
+ renameSync(temporary, configPath);
49
59
  }
50
60
  export async function installSkill(name, projectRoot = process.cwd(), skipServer) {
51
61
  return withServer(projectRoot, async (client) => {
52
62
  const result = await client.installPlugin(name);
53
63
  return result;
54
64
  }, async () => {
55
- const npmName = name.startsWith("@devflow-tools/plugin-") ? name : `@devflow-tools/plugin-${name}`;
56
- const shortName = name.replace(/^@devflow-tools\/plugin-/, "");
65
+ const npmName = normalizePluginPackageName(name);
66
+ const shortName = npmName.replace(/^@devflow-tools\/plugin-/, "");
57
67
  mkdirSync(HOME_SKILLS_DIR, { recursive: true });
58
- try {
59
- execSync(`npm install --prefix "${HOME_SKILLS_DIR}" ${npmName}`, {
60
- stdio: "pipe",
61
- timeout: 60_000,
62
- });
63
- }
64
- catch {
65
- // If npm install fails, still register
66
- }
68
+ const before = readPluginInstallState();
69
+ const previous = before.plugins[npmName];
70
+ execFileSync("npm", ["install", "--prefix", HOME_SKILLS_DIR, npmName], {
71
+ stdio: "pipe",
72
+ timeout: 60_000,
73
+ });
67
74
  const config = readConfig(projectRoot);
68
75
  if (!config.plugins)
69
76
  config.plugins = [];
@@ -72,34 +79,99 @@ export async function installSkill(name, projectRoot = process.cwd(), skipServer
72
79
  writeConfig(projectRoot, config);
73
80
  }
74
81
  let templates = [];
82
+ let version = "0.0.0";
83
+ let installPath = join(HOME_SKILLS_DIR, "node_modules", ...npmName.split("/"));
75
84
  try {
76
- const pkgJson = JSON.parse(readFileSync(join(HOME_SKILLS_DIR, "node_modules", npmName, "package.json"), "utf-8"));
85
+ const pkgJson = JSON.parse(readFileSync(join(installPath, "package.json"), "utf-8"));
77
86
  templates = pkgJson?.devflow?.templates ?? [];
87
+ version = typeof pkgJson.version === "string" ? pkgJson.version : version;
78
88
  }
79
89
  catch {
80
- // Plugin metadata not available
90
+ throw new Error(`Installed plugin metadata is unreadable: ${installPath}`);
91
+ }
92
+ upsertPluginInstallRecord({
93
+ packageName: npmName,
94
+ pluginName: shortName,
95
+ version,
96
+ installPath,
97
+ source: "npm",
98
+ installedAt: previous?.installedAt ?? new Date().toISOString(),
99
+ updatedAt: new Date().toISOString(),
100
+ projects: [...new Set([...(previous?.projects ?? []), projectRoot])],
101
+ });
102
+ if (!previous || previous.version !== version) {
103
+ try {
104
+ const plugin = extractPlugin(await importPluginModule({ packageName: npmName, modulePath: installPath, source: "npm", installPath }), npmName);
105
+ if (plugin) {
106
+ const context = {
107
+ projectRoot,
108
+ memory: { getAll: async () => [], upsertGlobal: async () => undefined },
109
+ knowledge: { registerSource: async () => undefined },
110
+ workflow: { registerStepHandler: () => undefined },
111
+ };
112
+ if (previous && plugin.onUpdate)
113
+ await plugin.onUpdate(context, previous.version);
114
+ else if (!previous && plugin.onInstall)
115
+ await plugin.onInstall(context);
116
+ }
117
+ }
118
+ catch (error) {
119
+ const state = readPluginInstallState();
120
+ const record = state.plugins[npmName];
121
+ if (record) {
122
+ record.lastLoad = { status: "failed", checkedAt: new Date().toISOString(), reason: error.message };
123
+ upsertPluginInstallRecord(record);
124
+ }
125
+ throw new Error(`Plugin lifecycle failed: ${error.message}`);
126
+ }
81
127
  }
82
- return { name: shortName, version: "0.1.0", templates };
83
- }, { skipServer });
128
+ return { name: shortName, version, templates };
129
+ }, { skipServer: true });
84
130
  }
85
131
  export async function uninstallSkill(name, projectRoot = process.cwd(), skipServer) {
86
132
  return withServer(projectRoot, async (client) => { await client.uninstallPlugin(name); }, async () => {
87
- const shortName = name.replace(/^@devflow-tools\/plugin-/, "");
133
+ const npmName = normalizePluginPackageName(name);
134
+ const shortName = npmName.replace(/^@devflow-tools\/plugin-/, "");
88
135
  const config = readConfig(projectRoot);
89
136
  if (config.plugins) {
90
137
  config.plugins = config.plugins.filter(p => p !== shortName);
91
138
  writeConfig(projectRoot, config);
92
139
  }
93
- const npmName = name.startsWith("@devflow-tools/plugin-") ? name : `@devflow-tools/plugin-${name}`;
94
- try {
95
- const pkgDir = join(HOME_SKILLS_DIR, "node_modules", npmName);
96
- if (existsSync(pkgDir)) {
97
- rmSync(pkgDir, { recursive: true, force: true });
140
+ const state = readPluginInstallState();
141
+ const record = state.plugins[npmName];
142
+ const remainingProjects = record?.projects.filter((project) => project !== projectRoot) ?? [];
143
+ if (record && remainingProjects.length === 0) {
144
+ const plugin = existsSync(record.installPath)
145
+ ? extractPlugin(await importPluginModule({ packageName: npmName, modulePath: record.installPath, source: record.source, installPath: record.installPath }), npmName)
146
+ : null;
147
+ if (plugin?.onUninstall) {
148
+ await plugin.onUninstall({
149
+ projectRoot,
150
+ memory: { getAll: async () => [], upsertGlobal: async () => undefined },
151
+ knowledge: { registerSource: async () => undefined },
152
+ workflow: { registerStepHandler: () => undefined },
153
+ });
98
154
  }
99
155
  }
100
- catch {
101
- // Cleanup failure is non-fatal
156
+ if (!record || remainingProjects.length === 0) {
157
+ try {
158
+ execFileSync("npm", ["uninstall", "--prefix", HOME_SKILLS_DIR, npmName], { stdio: "pipe", timeout: 60_000 });
159
+ }
160
+ catch {
161
+ const pkgDir = join(HOME_SKILLS_DIR, "node_modules", npmName);
162
+ if (existsSync(pkgDir))
163
+ rmSync(pkgDir, { recursive: true, force: true });
164
+ }
165
+ }
166
+ if (record) {
167
+ if (remainingProjects.length > 0) {
168
+ record.projects = remainingProjects;
169
+ upsertPluginInstallRecord(record);
170
+ }
171
+ else {
172
+ removePluginInstallRecord(npmName);
173
+ }
102
174
  }
103
- }, { skipServer });
175
+ }, { skipServer: true });
104
176
  }
105
177
  //# sourceMappingURL=skill.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}