@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.
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +59 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/mcp.d.ts +10 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +33 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/plugin/install.d.ts.map +1 -1
- package/dist/commands/plugin/install.js +6 -7
- package/dist/commands/plugin/install.js.map +1 -1
- package/dist/commands/plugin/uninstall.d.ts.map +1 -1
- package/dist/commands/plugin/uninstall.js +6 -7
- package/dist/commands/plugin/uninstall.js.map +1 -1
- package/dist/commands/plugin-guide.d.ts.map +1 -1
- package/dist/commands/plugin-guide.js +8 -5
- package/dist/commands/plugin-guide.js.map +1 -1
- package/dist/commands/skill-health.d.ts +21 -0
- package/dist/commands/skill-health.d.ts.map +1 -0
- package/dist/commands/skill-health.js +106 -0
- package/dist/commands/skill-health.js.map +1 -0
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +101 -29
- package/dist/commands/skill.js.map +1 -1
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/plugin-registry.d.ts.map +1 -1
- package/dist/lib/plugin-registry.js +3 -10
- package/dist/lib/plugin-registry.js.map +1 -1
- package/dist/plugin-files/.claude-plugin/plugin.json +1 -1
- package/dist/plugin-files/dist/command-registry.json +116 -20
- package/dist/plugin-files/dist/hooks/hook-client.js +6 -6
- package/dist/plugin-files/dist/hooks/hook-daemon.js +9 -9
- package/dist/plugin-files/dist/hooks/post-tool-use.js +3 -3
- package/dist/plugin-files/dist/hooks/pre-tool-use.js +2 -2
- package/dist/plugin-files/dist/hooks/user-prompt-submit.js +2 -2
- package/dist/plugin-files/package.json +7 -7
- 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,
|
|
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 {
|
|
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
|
|
9
|
-
|
|
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
|
-
|
|
14
|
-
console.log(`\n${chalk.green('✓')} ${fullName} installed
|
|
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.
|
|
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,
|
|
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,
|
|
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 {
|
|
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
|
|
9
|
-
|
|
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
|
-
|
|
14
|
-
console.log(`\n${chalk.green('✓')} ${fullName} uninstalled
|
|
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.
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
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":"
|
|
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"}
|
package/dist/commands/skill.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { withServer } from "../lib/with-server.js";
|
|
2
2
|
import { loadPlugins } from "./plugin-loader.js";
|
|
3
|
-
import {
|
|
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 {
|
|
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 =
|
|
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
|
-
|
|
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
|
|
56
|
-
const shortName =
|
|
65
|
+
const npmName = normalizePluginPackageName(name);
|
|
66
|
+
const shortName = npmName.replace(/^@devflow-tools\/plugin-/, "");
|
|
57
67
|
mkdirSync(HOME_SKILLS_DIR, { recursive: true });
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
101
|
-
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAA0B,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
|