skilldex-cli 0.1.0
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/LICENSE +21 -0
- package/README.md +318 -0
- package/dist/cli/commands/install-action.d.ts +7 -0
- package/dist/cli/commands/install-action.d.ts.map +1 -0
- package/dist/cli/commands/install-action.js +85 -0
- package/dist/cli/commands/install-action.js.map +1 -0
- package/dist/cli/commands/install.d.ts +3 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +13 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list-action.d.ts +6 -0
- package/dist/cli/commands/list-action.d.ts.map +1 -0
- package/dist/cli/commands/list-action.js +46 -0
- package/dist/cli/commands/list-action.js.map +1 -0
- package/dist/cli/commands/list.d.ts +3 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +12 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +3 -0
- package/dist/cli/commands/publish.d.ts.map +1 -0
- package/dist/cli/commands/publish.js +10 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/suggest-action.d.ts +6 -0
- package/dist/cli/commands/suggest-action.d.ts.map +1 -0
- package/dist/cli/commands/suggest-action.js +51 -0
- package/dist/cli/commands/suggest-action.js.map +1 -0
- package/dist/cli/commands/suggest.d.ts +3 -0
- package/dist/cli/commands/suggest.d.ts.map +1 -0
- package/dist/cli/commands/suggest.js +13 -0
- package/dist/cli/commands/suggest.js.map +1 -0
- package/dist/cli/commands/uninstall-action.d.ts +6 -0
- package/dist/cli/commands/uninstall-action.d.ts.map +1 -0
- package/dist/cli/commands/uninstall-action.js +21 -0
- package/dist/cli/commands/uninstall-action.js.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +3 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.js +12 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/commands/validate-action.d.ts +4 -0
- package/dist/cli/commands/validate-action.d.ts.map +1 -0
- package/dist/cli/commands/validate-action.js +22 -0
- package/dist/cli/commands/validate-action.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +11 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/output.d.ts +9 -0
- package/dist/cli/ui/output.d.ts.map +1 -0
- package/dist/cli/ui/output.js +43 -0
- package/dist/cli/ui/output.js.map +1 -0
- package/dist/cli/ui/prompts.d.ts +8 -0
- package/dist/cli/ui/prompts.d.ts.map +1 -0
- package/dist/cli/ui/prompts.js +28 -0
- package/dist/cli/ui/prompts.js.map +1 -0
- package/dist/core/installer.d.ts +18 -0
- package/dist/core/installer.d.ts.map +1 -0
- package/dist/core/installer.js +68 -0
- package/dist/core/installer.js.map +1 -0
- package/dist/core/manifest.d.ts +8 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +62 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/resolver.d.ts +5 -0
- package/dist/core/resolver.d.ts.map +1 -0
- package/dist/core/resolver.js +68 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/core/suggest-agent.d.ts +10 -0
- package/dist/core/suggest-agent.d.ts.map +1 -0
- package/dist/core/suggest-agent.js +108 -0
- package/dist/core/suggest-agent.js.map +1 -0
- package/dist/core/validator.d.ts +4 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +347 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +109 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/registry/index.d.ts +2 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +4 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/sources/github.d.ts +10 -0
- package/dist/registry/sources/github.d.ts.map +1 -0
- package/dist/registry/sources/github.js +78 -0
- package/dist/registry/sources/github.js.map +1 -0
- package/dist/types/manifest.d.ts +19 -0
- package/dist/types/manifest.d.ts.map +1 -0
- package/dist/types/manifest.js +2 -0
- package/dist/types/manifest.js.map +1 -0
- package/dist/types/registry.d.ts +17 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +2 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/scope.d.ts +8 -0
- package/dist/types/scope.d.ts.map +1 -0
- package/dist/types/scope.js +2 -0
- package/dist/types/scope.js.map +1 -0
- package/dist/types/skill.d.ts +34 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +2 -0
- package/dist/types/skill.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function registerSuggest(program) {
|
|
2
|
+
program
|
|
3
|
+
.command('suggest')
|
|
4
|
+
.description('AI-powered skill suggestion loop for your project')
|
|
5
|
+
.option('-p, --project-path <path>', 'Path to project (defaults to cwd)')
|
|
6
|
+
.option('-y, --yes', 'Auto-approve all suggestions without prompting', false)
|
|
7
|
+
.option('--json', 'Output as JSON')
|
|
8
|
+
.action(async (options) => {
|
|
9
|
+
const { runSuggest } = await import('./suggest-action.js');
|
|
10
|
+
await runSuggest(options);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=suggest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../../src/cli/commands/suggest.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,2BAA2B,EAAE,mCAAmC,CAAC;SACxE,MAAM,CAAC,WAAW,EAAE,gDAAgD,EAAE,KAAK,CAAC;SAC5E,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAA8D,EAAE,EAAE;QAC/E,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;QAC1D,MAAM,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall-action.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/uninstall-action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAItD,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import { uninstallSkill } from '../../core/installer.js';
|
|
3
|
+
import { printJson, printError } from '../ui/output.js';
|
|
4
|
+
export async function runUninstall(skillName, options) {
|
|
5
|
+
const spinner = options.json ? null : ora(`Uninstalling "${skillName}"...`).start();
|
|
6
|
+
try {
|
|
7
|
+
await uninstallSkill(skillName, options.scope);
|
|
8
|
+
if (spinner)
|
|
9
|
+
spinner.succeed(`Uninstalled "${skillName}" from ${options.scope} scope`);
|
|
10
|
+
if (options.json) {
|
|
11
|
+
printJson({ removed: true, skillName, scope: options.scope });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
if (spinner)
|
|
16
|
+
spinner.fail();
|
|
17
|
+
printError(e instanceof Error ? e.message : String(e));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=uninstall-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall-action.js","sourceRoot":"","sources":["../../../src/cli/commands/uninstall-action.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AAErB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAgB,MAAM,iBAAiB,CAAA;AAErE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,OAA6C;IAE7C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,SAAS,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;IAEnF,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QAE9C,IAAI,OAAO;YAAE,OAAO,CAAC,OAAO,CAAC,gBAAgB,SAAS,UAAU,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAA;QAEtF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,EAAE,CAAA;QAC3B,UAAU,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUxD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function registerUninstall(program) {
|
|
2
|
+
program
|
|
3
|
+
.command('uninstall <skill-name>')
|
|
4
|
+
.description('Uninstall a skill from a scope')
|
|
5
|
+
.option('-s, --scope <scope>', 'Scope to remove from: global, shared, or project', 'project')
|
|
6
|
+
.option('--json', 'Output as JSON')
|
|
7
|
+
.action(async (skillName, options) => {
|
|
8
|
+
const { runUninstall } = await import('./uninstall-action.js');
|
|
9
|
+
await runUninstall(skillName, options);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,OAAO;SACJ,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,qBAAqB,EAAE,kDAAkD,EAAE,SAAS,CAAC;SAC5F,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAA6C,EAAE,EAAE;QACjF,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;QAC9D,MAAM,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-action.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate-action.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { validateSkill } from '../../core/validator.js';
|
|
2
|
+
import { printValidationReport, printJson, printError } from '../ui/output.js';
|
|
3
|
+
export async function runValidate(skillPath, options) {
|
|
4
|
+
try {
|
|
5
|
+
const result = await validateSkill(skillPath);
|
|
6
|
+
if (options.json) {
|
|
7
|
+
printJson(result);
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
printValidationReport(result);
|
|
11
|
+
}
|
|
12
|
+
// Exit with non-zero if there are errors
|
|
13
|
+
if (result.errorCount > 0) {
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
printError(e instanceof Error ? e.message : String(e));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=validate-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-action.js","sourceRoot":"","sources":["../../../src/cli/commands/validate-action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE9E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,OAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAA;QAC7C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,SAAS,CAAC,MAAM,CAAC,CAAA;QACnB,CAAC;aAAM,CAAC;YACN,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;QACD,yCAAyC;QACzC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,UAAU,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CASvD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function registerValidate(program) {
|
|
2
|
+
program
|
|
3
|
+
.command('validate [path]')
|
|
4
|
+
.description('Validate a skill folder and show its format conformance score')
|
|
5
|
+
.option('--json', 'Output as JSON')
|
|
6
|
+
.action(async (skillPath, options) => {
|
|
7
|
+
const { runValidate } = await import('./validate-action.js');
|
|
8
|
+
await runValidate(skillPath ?? process.cwd(), options);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,OAA0B,EAAE,EAAE;QAC1E,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC5D,MAAM,WAAW,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,wBAAgB,SAAS,IAAI,OAAO,CA0BnC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { registerInstall } from './commands/install.js';
|
|
3
|
+
import { registerUninstall } from './commands/uninstall.js';
|
|
4
|
+
import { registerList } from './commands/list.js';
|
|
5
|
+
import { registerValidate } from './commands/validate.js';
|
|
6
|
+
import { registerSuggest } from './commands/suggest.js';
|
|
7
|
+
import { registerPublish } from './commands/publish.js';
|
|
8
|
+
export function createCli() {
|
|
9
|
+
const program = new Command();
|
|
10
|
+
program
|
|
11
|
+
.name('skillpm')
|
|
12
|
+
.description('Package manager for Claude skill packages')
|
|
13
|
+
.version('0.1.0')
|
|
14
|
+
.option('--no-color', 'Disable colored output');
|
|
15
|
+
registerInstall(program);
|
|
16
|
+
registerUninstall(program);
|
|
17
|
+
registerList(program);
|
|
18
|
+
registerValidate(program);
|
|
19
|
+
registerSuggest(program);
|
|
20
|
+
registerPublish(program);
|
|
21
|
+
// Hidden MCP server command
|
|
22
|
+
program
|
|
23
|
+
.command('mcp', { hidden: true })
|
|
24
|
+
.description('Start the MCP server')
|
|
25
|
+
.action(async () => {
|
|
26
|
+
const { startMcpServer } = await import('../mcp/server.js');
|
|
27
|
+
await startMcpServer();
|
|
28
|
+
});
|
|
29
|
+
return program;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,2CAA2C,CAAC;SACxD,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAA;IAEjD,eAAe,CAAC,OAAO,CAAC,CAAA;IACxB,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC1B,YAAY,CAAC,OAAO,CAAC,CAAA;IACrB,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACzB,eAAe,CAAC,OAAO,CAAC,CAAA;IACxB,eAAe,CAAC,OAAO,CAAC,CAAA;IAExB,4BAA4B;IAC5B,OAAO;SACJ,OAAO,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChC,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAA;QAC3D,MAAM,cAAc,EAAE,CAAA;IACxB,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ValidationResult } from '../../types/skill.js';
|
|
2
|
+
export declare function renderValidationReport(result: ValidationResult): string;
|
|
3
|
+
export declare function printValidationReport(result: ValidationResult): void;
|
|
4
|
+
export declare function printJson(data: unknown): void;
|
|
5
|
+
export declare function printError(message: string): void;
|
|
6
|
+
export declare function printSuccess(message: string): void;
|
|
7
|
+
export declare function printWarning(message: string): void;
|
|
8
|
+
export declare function printInfo(message: string): void;
|
|
9
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,sBAAsB,CAAA;AAelF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAgBvE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAEpE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
const LABEL_WIDTH = 7;
|
|
3
|
+
function label(severity) {
|
|
4
|
+
switch (severity) {
|
|
5
|
+
case 'error':
|
|
6
|
+
return chalk.red('error'.padEnd(LABEL_WIDTH));
|
|
7
|
+
case 'warning':
|
|
8
|
+
return chalk.yellow('warn'.padEnd(LABEL_WIDTH));
|
|
9
|
+
case 'pass':
|
|
10
|
+
return chalk.green('pass'.padEnd(LABEL_WIDTH));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function renderValidationReport(result) {
|
|
14
|
+
const lines = [];
|
|
15
|
+
for (const diag of result.diagnostics) {
|
|
16
|
+
const loc = diag.line !== undefined ? `line ${diag.line}: ` : '';
|
|
17
|
+
lines.push(` ${label(diag.severity)} ${loc}${diag.message}`);
|
|
18
|
+
}
|
|
19
|
+
lines.push('');
|
|
20
|
+
const scoreColor = result.score >= 80 ? chalk.green : result.score >= 50 ? chalk.yellow : chalk.red;
|
|
21
|
+
lines.push(`Format conformance score: ${scoreColor(String(result.score))}/100`);
|
|
22
|
+
lines.push(`Validated against: skill-format v${result.specVersion}`);
|
|
23
|
+
return lines.join('\n');
|
|
24
|
+
}
|
|
25
|
+
export function printValidationReport(result) {
|
|
26
|
+
console.log(renderValidationReport(result));
|
|
27
|
+
}
|
|
28
|
+
export function printJson(data) {
|
|
29
|
+
console.log(JSON.stringify(data, null, 2));
|
|
30
|
+
}
|
|
31
|
+
export function printError(message) {
|
|
32
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
33
|
+
}
|
|
34
|
+
export function printSuccess(message) {
|
|
35
|
+
console.log(chalk.green(`✓ ${message}`));
|
|
36
|
+
}
|
|
37
|
+
export function printWarning(message) {
|
|
38
|
+
console.log(chalk.yellow(`⚠ ${message}`));
|
|
39
|
+
}
|
|
40
|
+
export function printInfo(message) {
|
|
41
|
+
console.log(chalk.dim(message));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/ui/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,MAAM,WAAW,GAAG,CAAC,CAAA;AAErB,SAAS,KAAK,CAAC,QAA0C;IACvD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;QAC/C,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;QACjD,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;IAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAwB;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAChE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,MAAM,UAAU,GACd,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA;IAClF,KAAK,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAA;IAC/E,KAAK,CAAC,IAAI,CAAC,oCAAoC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;IAEpE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAwB;IAC5D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;AACjC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SuggestionProposal } from '../../core/suggest-agent.js';
|
|
2
|
+
import type { ScopeLevel } from '../../types/scope.js';
|
|
3
|
+
export interface ApprovedSkill {
|
|
4
|
+
proposal: SuggestionProposal;
|
|
5
|
+
scope: ScopeLevel;
|
|
6
|
+
}
|
|
7
|
+
export declare function promptSuggestions(proposals: SuggestionProposal[]): Promise<ApprovedSkill[]>;
|
|
8
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/prompts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,kBAAkB,EAAE,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CA8B1B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { select } from '@inquirer/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
export async function promptSuggestions(proposals) {
|
|
4
|
+
console.log(chalk.bold('\nProposed skills for this project:'));
|
|
5
|
+
proposals.forEach((p, i) => {
|
|
6
|
+
console.log(` ${chalk.dim(`${i + 1}.`)} ${chalk.cyan(p.skillName.padEnd(30))} ${chalk.dim(`[${p.suggestedScope}]`)}`);
|
|
7
|
+
console.log(` ${chalk.dim(p.reason)}`);
|
|
8
|
+
});
|
|
9
|
+
console.log('');
|
|
10
|
+
const approved = [];
|
|
11
|
+
for (const proposal of proposals) {
|
|
12
|
+
const action = await select({
|
|
13
|
+
message: `${chalk.cyan(proposal.skillName)}: Install?`,
|
|
14
|
+
choices: [
|
|
15
|
+
{ name: 'Yes (project scope)', value: 'project' },
|
|
16
|
+
{ name: 'Yes (shared scope)', value: 'shared' },
|
|
17
|
+
{ name: 'Yes (global scope)', value: 'global' },
|
|
18
|
+
{ name: 'Skip', value: 'skip' },
|
|
19
|
+
],
|
|
20
|
+
default: proposal.suggestedScope,
|
|
21
|
+
});
|
|
22
|
+
if (action !== 'skip') {
|
|
23
|
+
approved.push({ proposal, scope: action });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return approved;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/cli/ui/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAkB,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,MAAM,OAAO,CAAA;AASzB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAA+B;IAE/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAA;IAC9D,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC,EAAE,CAC1G,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEf,MAAM,QAAQ,GAAoB,EAAE,CAAA;IAEpC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY;YACtD,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE;gBACjD,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAC/C,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAC/C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;YACD,OAAO,EAAE,QAAQ,CAAC,cAAc;SACjC,CAAC,CAAA;QAEF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAoB,EAAE,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ScopeLevel } from '../types/scope.js';
|
|
2
|
+
import type { ValidationResult } from '../types/skill.js';
|
|
3
|
+
export interface InstallOptions {
|
|
4
|
+
scope: ScopeLevel;
|
|
5
|
+
force?: boolean;
|
|
6
|
+
dryRun?: boolean;
|
|
7
|
+
sourceUrl?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface InstallResult {
|
|
10
|
+
skillName: string;
|
|
11
|
+
scope: ScopeLevel;
|
|
12
|
+
installedPath: string;
|
|
13
|
+
validation: ValidationResult;
|
|
14
|
+
alreadyExisted: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function installFromPath(sourcePath: string, options: InstallOptions): Promise<InstallResult>;
|
|
17
|
+
export declare function uninstallSkill(skillName: string, scope: ScopeLevel): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAKzD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,UAAU,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,cAAc,EAAE,OAAO,CAAA;CACxB;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA4DxB;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { cp, rm, mkdir } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { validateSkill, SPEC_VERSION } from './validator.js';
|
|
4
|
+
import { resolveScope, resolveAllScopes } from './resolver.js';
|
|
5
|
+
import { addSkillToManifest, removeSkillFromManifest, readManifest } from './manifest.js';
|
|
6
|
+
export async function installFromPath(sourcePath, options) {
|
|
7
|
+
const absSource = path.resolve(sourcePath);
|
|
8
|
+
const validation = await validateSkill(absSource);
|
|
9
|
+
const skillName = validation.skill;
|
|
10
|
+
const scopeConfig = await resolveScope(options.scope);
|
|
11
|
+
// Check for conflicts across all scopes
|
|
12
|
+
if (!options.force) {
|
|
13
|
+
const allScopes = await resolveAllScopes();
|
|
14
|
+
for (const sc of allScopes) {
|
|
15
|
+
if (sc.level === options.scope)
|
|
16
|
+
continue;
|
|
17
|
+
const manifest = await readManifest(sc);
|
|
18
|
+
if (skillName in manifest.skills) {
|
|
19
|
+
// Just a warning — we don't block
|
|
20
|
+
// Caller should surface this
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const targetDir = path.join(scopeConfig.skillsDir, skillName);
|
|
25
|
+
let alreadyExisted = false;
|
|
26
|
+
// Check if already installed at this scope
|
|
27
|
+
const existingManifest = await readManifest(scopeConfig);
|
|
28
|
+
if (skillName in existingManifest.skills) {
|
|
29
|
+
if (!options.force) {
|
|
30
|
+
throw new Error(`Skill "${skillName}" is already installed at ${options.scope} scope. Use --force to overwrite.`);
|
|
31
|
+
}
|
|
32
|
+
alreadyExisted = true;
|
|
33
|
+
await rm(targetDir, { recursive: true, force: true });
|
|
34
|
+
}
|
|
35
|
+
if (!options.dryRun) {
|
|
36
|
+
await mkdir(scopeConfig.skillsDir, { recursive: true });
|
|
37
|
+
await cp(absSource, targetDir, { recursive: true });
|
|
38
|
+
const installed = {
|
|
39
|
+
name: skillName,
|
|
40
|
+
version: '1.0.0',
|
|
41
|
+
source: options.sourceUrl ? 'community' : 'local',
|
|
42
|
+
sourceUrl: options.sourceUrl,
|
|
43
|
+
installedAt: new Date().toISOString(),
|
|
44
|
+
specVersion: SPEC_VERSION,
|
|
45
|
+
score: validation.score,
|
|
46
|
+
path: path.join('skills', skillName),
|
|
47
|
+
};
|
|
48
|
+
await addSkillToManifest(scopeConfig, installed);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
skillName,
|
|
52
|
+
scope: options.scope,
|
|
53
|
+
installedPath: targetDir,
|
|
54
|
+
validation,
|
|
55
|
+
alreadyExisted,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export async function uninstallSkill(skillName, scope) {
|
|
59
|
+
const scopeConfig = await resolveScope(scope);
|
|
60
|
+
const manifest = await readManifest(scopeConfig);
|
|
61
|
+
if (!(skillName in manifest.skills)) {
|
|
62
|
+
throw new Error(`Skill "${skillName}" is not installed at ${scope} scope`);
|
|
63
|
+
}
|
|
64
|
+
const skillDir = path.join(scopeConfig.skillsDir, skillName);
|
|
65
|
+
await rm(skillDir, { recursive: true, force: true });
|
|
66
|
+
await removeSkillFromManifest(scopeConfig, skillName);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SkillManifest, InstalledSkill } from '../types/manifest.js';
|
|
2
|
+
import type { ScopeConfig } from '../types/scope.js';
|
|
3
|
+
export declare function createEmptyManifest(scope: SkillManifest['scope']): SkillManifest;
|
|
4
|
+
export declare function readManifest(scopeConfig: ScopeConfig): Promise<SkillManifest>;
|
|
5
|
+
export declare function writeManifest(scopeConfig: ScopeConfig, manifest: SkillManifest): Promise<void>;
|
|
6
|
+
export declare function addSkillToManifest(scopeConfig: ScopeConfig, skill: InstalledSkill): Promise<void>;
|
|
7
|
+
export declare function removeSkillFromManifest(scopeConfig: ScopeConfig, skillName: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAsBpD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAOhF;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAWnF;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpG;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
const MANIFEST_VERSION = '1';
|
|
5
|
+
const InstalledSkillSchema = z.object({
|
|
6
|
+
name: z.string(),
|
|
7
|
+
version: z.string(),
|
|
8
|
+
source: z.enum(['official', 'community', 'local']),
|
|
9
|
+
sourceUrl: z.string().optional(),
|
|
10
|
+
installedAt: z.string(),
|
|
11
|
+
specVersion: z.string(),
|
|
12
|
+
score: z.number(),
|
|
13
|
+
path: z.string(),
|
|
14
|
+
});
|
|
15
|
+
const SkillManifestSchema = z.object({
|
|
16
|
+
skilldexVersion: z.string(),
|
|
17
|
+
scope: z.enum(['global', 'shared', 'project']),
|
|
18
|
+
skills: z.record(InstalledSkillSchema),
|
|
19
|
+
updatedAt: z.string(),
|
|
20
|
+
});
|
|
21
|
+
export function createEmptyManifest(scope) {
|
|
22
|
+
return {
|
|
23
|
+
skilldexVersion: MANIFEST_VERSION,
|
|
24
|
+
scope,
|
|
25
|
+
skills: {},
|
|
26
|
+
updatedAt: new Date().toISOString(),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export async function readManifest(scopeConfig) {
|
|
30
|
+
try {
|
|
31
|
+
const raw = await readFile(scopeConfig.manifestPath, 'utf8');
|
|
32
|
+
const parsed = JSON.parse(raw);
|
|
33
|
+
return SkillManifestSchema.parse(parsed);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
if (e.code === 'ENOENT') {
|
|
37
|
+
return createEmptyManifest(scopeConfig.level);
|
|
38
|
+
}
|
|
39
|
+
throw new Error(`Failed to read manifest at ${scopeConfig.manifestPath}: ${e instanceof Error ? e.message : String(e)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function writeManifest(scopeConfig, manifest) {
|
|
43
|
+
await mkdir(path.dirname(scopeConfig.manifestPath), { recursive: true });
|
|
44
|
+
const tmp = `${scopeConfig.manifestPath}.tmp`;
|
|
45
|
+
const content = JSON.stringify({ ...manifest, updatedAt: new Date().toISOString() }, null, 2);
|
|
46
|
+
await writeFile(tmp, content, 'utf8');
|
|
47
|
+
await writeFile(scopeConfig.manifestPath, content, 'utf8');
|
|
48
|
+
}
|
|
49
|
+
export async function addSkillToManifest(scopeConfig, skill) {
|
|
50
|
+
const manifest = await readManifest(scopeConfig);
|
|
51
|
+
manifest.skills[skill.name] = skill;
|
|
52
|
+
await writeManifest(scopeConfig, manifest);
|
|
53
|
+
}
|
|
54
|
+
export async function removeSkillFromManifest(scopeConfig, skillName) {
|
|
55
|
+
const manifest = await readManifest(scopeConfig);
|
|
56
|
+
if (!(skillName in manifest.skills)) {
|
|
57
|
+
throw new Error(`Skill "${skillName}" not found in ${scopeConfig.level} manifest`);
|
|
58
|
+
}
|
|
59
|
+
delete manifest.skills[skillName];
|
|
60
|
+
await writeManifest(scopeConfig, manifest);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAE5B,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CACjB,CAAC,CAAA;AAEF,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAA;AAEF,MAAM,UAAU,mBAAmB,CAAC,KAA6B;IAC/D,OAAO;QACL,eAAe,EAAE,gBAAgB;QACjC,KAAK;QACL,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAwB;IACzD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9B,OAAO,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAkB,CAAA;IAC3D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnD,OAAO,mBAAmB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAC/C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,WAAW,CAAC,YAAY,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC1H,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAwB,EAAE,QAAuB;IACnF,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxE,MAAM,GAAG,GAAG,GAAG,WAAW,CAAC,YAAY,MAAM,CAAA;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAC7F,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACrC,MAAM,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAwB,EACxB,KAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAA;IAChD,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IACnC,MAAM,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAwB,EACxB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAA;IAChD,IAAI,CAAC,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,kBAAkB,WAAW,CAAC,KAAK,WAAW,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACjC,MAAM,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;AAC5C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ScopeLevel, ScopeConfig } from '../types/scope.js';
|
|
2
|
+
export declare function resolveScope(level: ScopeLevel, cwd?: string): Promise<ScopeConfig>;
|
|
3
|
+
export declare function resolveAllScopes(cwd?: string): Promise<ScopeConfig[]>;
|
|
4
|
+
export declare function findProjectRoot(cwd: string): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAuBhE,wBAAsB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAWxF;AAED,wBAAsB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAM3E;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BlE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
const SKILLDEX_DIR = '.skilldex';
|
|
5
|
+
const MANIFEST_FILE = 'skilldex.json';
|
|
6
|
+
const SKILLS_DIR = 'skills';
|
|
7
|
+
function globalBase() {
|
|
8
|
+
return path.join(os.homedir(), '.skilldex', 'global');
|
|
9
|
+
}
|
|
10
|
+
function sharedBase() {
|
|
11
|
+
return path.join(os.homedir(), '.skilldex', 'shared');
|
|
12
|
+
}
|
|
13
|
+
function makeScopeConfig(level, rootPath) {
|
|
14
|
+
return {
|
|
15
|
+
level,
|
|
16
|
+
rootPath,
|
|
17
|
+
manifestPath: path.join(rootPath, MANIFEST_FILE),
|
|
18
|
+
skillsDir: path.join(rootPath, SKILLS_DIR),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export async function resolveScope(level, cwd) {
|
|
22
|
+
switch (level) {
|
|
23
|
+
case 'global':
|
|
24
|
+
return makeScopeConfig('global', globalBase());
|
|
25
|
+
case 'shared':
|
|
26
|
+
return makeScopeConfig('shared', sharedBase());
|
|
27
|
+
case 'project': {
|
|
28
|
+
const projectRoot = await findProjectRoot(cwd ?? process.cwd());
|
|
29
|
+
return makeScopeConfig('project', path.join(projectRoot, SKILLDEX_DIR));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function resolveAllScopes(cwd) {
|
|
34
|
+
return Promise.all([
|
|
35
|
+
resolveScope('global', cwd),
|
|
36
|
+
resolveScope('shared', cwd),
|
|
37
|
+
resolveScope('project', cwd),
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
export async function findProjectRoot(cwd) {
|
|
41
|
+
let current = path.resolve(cwd);
|
|
42
|
+
const root = path.parse(current).root;
|
|
43
|
+
while (true) {
|
|
44
|
+
// Check for git root
|
|
45
|
+
try {
|
|
46
|
+
await stat(path.join(current, '.git'));
|
|
47
|
+
return current;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// not a git root
|
|
51
|
+
}
|
|
52
|
+
// Check for package.json (also a project root indicator)
|
|
53
|
+
try {
|
|
54
|
+
await stat(path.join(current, 'package.json'));
|
|
55
|
+
return current;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// not a package.json root
|
|
59
|
+
}
|
|
60
|
+
const parent = path.dirname(current);
|
|
61
|
+
if (parent === current || current === root) {
|
|
62
|
+
// Reached filesystem root — use cwd as fallback
|
|
63
|
+
return path.resolve(cwd);
|
|
64
|
+
}
|
|
65
|
+
current = parent;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAW,MAAM,kBAAkB,CAAA;AAChD,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,SAAS,CAAA;AAGxB,MAAM,YAAY,GAAG,WAAW,CAAA;AAChC,MAAM,aAAa,GAAG,eAAe,CAAA;AACrC,MAAM,UAAU,GAAG,QAAQ,CAAA;AAE3B,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,KAAiB,EAAE,QAAgB;IAC1D,OAAO;QACL,KAAK;QACL,QAAQ;QACR,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC;QAChD,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;KAC3C,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAiB,EAAE,GAAY;IAChE,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAA;QAChD,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAA;QAChD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YAC/D,OAAO,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAA;QACzE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAY;IACjD,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC;QAC3B,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC;QAC3B,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC;KAC7B,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAA;IAErC,OAAO,IAAI,EAAE,CAAC;QACZ,qBAAqB;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;YACtC,OAAO,OAAO,CAAA;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QAED,yDAAyD;QACzD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAA;YAC9C,OAAO,OAAO,CAAA;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACpC,IAAI,MAAM,KAAK,OAAO,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3C,gDAAgD;YAChD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QACD,OAAO,GAAG,MAAM,CAAA;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ScopeLevel } from '../types/scope.js';
|
|
2
|
+
export interface SuggestionProposal {
|
|
3
|
+
skillName: string;
|
|
4
|
+
reason: string;
|
|
5
|
+
suggestedScope: ScopeLevel;
|
|
6
|
+
available: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function gatherProjectContext(projectRoot: string): Promise<string>;
|
|
9
|
+
export declare function generateProposals(context: string): Promise<SuggestionProposal[]>;
|
|
10
|
+
//# sourceMappingURL=suggest-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest-agent.d.ts","sourceRoot":"","sources":["../../src/core/suggest-agent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,UAAU,CAAA;IAC1B,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsD/E;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyDtF"}
|