@skillctl/cli 0.2.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.
Files changed (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/bin/skillctl.js +10 -0
  4. package/dist/commands/add.d.ts +4 -0
  5. package/dist/commands/add.d.ts.map +1 -0
  6. package/dist/commands/add.js +23 -0
  7. package/dist/commands/add.js.map +1 -0
  8. package/dist/commands/audit.d.ts +3 -0
  9. package/dist/commands/audit.d.ts.map +1 -0
  10. package/dist/commands/audit.js +30 -0
  11. package/dist/commands/audit.js.map +1 -0
  12. package/dist/commands/doctor.d.ts +3 -0
  13. package/dist/commands/doctor.d.ts.map +1 -0
  14. package/dist/commands/doctor.js +76 -0
  15. package/dist/commands/doctor.js.map +1 -0
  16. package/dist/commands/import-cmd.d.ts +3 -0
  17. package/dist/commands/import-cmd.d.ts.map +1 -0
  18. package/dist/commands/import-cmd.js +74 -0
  19. package/dist/commands/import-cmd.js.map +1 -0
  20. package/dist/commands/init.d.ts +3 -0
  21. package/dist/commands/init.d.ts.map +1 -0
  22. package/dist/commands/init.js +18 -0
  23. package/dist/commands/init.js.map +1 -0
  24. package/dist/commands/install.d.ts +4 -0
  25. package/dist/commands/install.d.ts.map +1 -0
  26. package/dist/commands/install.js +58 -0
  27. package/dist/commands/install.js.map +1 -0
  28. package/dist/commands/list.d.ts +3 -0
  29. package/dist/commands/list.d.ts.map +1 -0
  30. package/dist/commands/list.js +27 -0
  31. package/dist/commands/list.js.map +1 -0
  32. package/dist/commands/plugin.d.ts +3 -0
  33. package/dist/commands/plugin.d.ts.map +1 -0
  34. package/dist/commands/plugin.js +74 -0
  35. package/dist/commands/plugin.js.map +1 -0
  36. package/dist/commands/remove.d.ts +3 -0
  37. package/dist/commands/remove.d.ts.map +1 -0
  38. package/dist/commands/remove.js +53 -0
  39. package/dist/commands/remove.js.map +1 -0
  40. package/dist/commands/sync.d.ts +3 -0
  41. package/dist/commands/sync.d.ts.map +1 -0
  42. package/dist/commands/sync.js +31 -0
  43. package/dist/commands/sync.js.map +1 -0
  44. package/dist/commands/update.d.ts +4 -0
  45. package/dist/commands/update.d.ts.map +1 -0
  46. package/dist/commands/update.js +49 -0
  47. package/dist/commands/update.js.map +1 -0
  48. package/dist/index.d.ts +6 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +53 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/lib/errors.d.ts +2 -0
  53. package/dist/lib/errors.d.ts.map +1 -0
  54. package/dist/lib/errors.js +6 -0
  55. package/dist/lib/errors.js.map +1 -0
  56. package/package.json +59 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 skillctl contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @skillctl/cli
2
+
3
+ See the [root README](../../README.md) for full documentation.
4
+
5
+ This is the CLI package for skillctl.
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { prepareProgram } from '../dist/index.js';
3
+
4
+ const program = await prepareProgram();
5
+
6
+ if (process.argv.length <= 2) {
7
+ program.outputHelp();
8
+ process.exit(0);
9
+ }
10
+ program.parse(process.argv);
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import { RegistryManager } from '@skillctl/registry';
3
+ export declare function registerAdd(program: Command, mgr?: RegistryManager): void;
4
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,IAAI,CAkBzE"}
@@ -0,0 +1,23 @@
1
+ import { RegistryManager } from '@skillctl/registry';
2
+ import { handleCommandError } from '../lib/errors.js';
3
+ export function registerAdd(program, mgr) {
4
+ program
5
+ .command('add <spec>')
6
+ .description('Add a skill from github, npm, local, skills.sh (registry + cache)')
7
+ .option('--no-manifest', 'do not update agent-skills.json')
8
+ .action(async (spec, options) => {
9
+ try {
10
+ const registry = mgr || new RegistryManager();
11
+ console.log(`Resolving ${spec} via registry...`);
12
+ const entry = await registry.add(spec, { updateManifest: options.manifest !== false });
13
+ console.log(`Added ${entry.name}`);
14
+ console.log(` resolved: ${entry.resolved}`);
15
+ console.log(` integrity: ${entry.integrity}`);
16
+ console.log(` canonical: ${entry.canonicalPath}`);
17
+ }
18
+ catch (err) {
19
+ handleCommandError(err, 'add');
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,GAAqB;IACjE,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,mEAAmE,CAAC;SAChF,MAAM,CAAC,eAAe,EAAE,iCAAiC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,eAAe,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,kBAAkB,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAudit(program: Command): void;
3
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2BpD"}
@@ -0,0 +1,30 @@
1
+ import { runAudit, auditExitCode } from '@skillctl/security';
2
+ import { handleCommandError } from '../lib/errors.js';
3
+ export function registerAudit(program) {
4
+ program
5
+ .command('audit')
6
+ .description('Run security scanner on installed skills')
7
+ .option('--json', 'machine-readable output')
8
+ .option('--strict', 'treat warnings as errors (exit 2)')
9
+ .action(async (options) => {
10
+ try {
11
+ const report = await runAudit(process.cwd());
12
+ if (options.json) {
13
+ console.log(JSON.stringify(report, null, 2));
14
+ process.exitCode = auditExitCode(report, options.strict);
15
+ return;
16
+ }
17
+ console.log(`skillctl audit — scanned ${report.scanned} skill(s), status: ${report.status}`);
18
+ for (const f of report.findings) {
19
+ console.log(` [${f.severity}] ${f.skill} (${f.rule}): ${f.message}`);
20
+ }
21
+ if (report.findings.length === 0)
22
+ console.log(' No issues found.');
23
+ process.exitCode = auditExitCode(report, options.strict);
24
+ }
25
+ catch (err) {
26
+ handleCommandError(err, 'audit');
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,UAAU,EAAE,mCAAmC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAE7C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7C,OAAO,CAAC,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBACzD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,CAAC,OAAO,sBAAsB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7F,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAEpE,OAAO,CAAC,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerDoctor(program: Command): void;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuErD"}
@@ -0,0 +1,76 @@
1
+ import { loadConfig, getRegisteredAdapters, lockToSkillTargets } from '@skillctl/core';
2
+ import { loadManifest } from '@skillctl/manifest';
3
+ import { loadLockfile } from '@skillctl/lockfile';
4
+ import { scanCoexistence, getEnabledAdapters, syncSkillsToAgents } from '@skillctl/adapters';
5
+ import { runAudit, auditExitCode } from '@skillctl/security';
6
+ export function registerDoctor(program) {
7
+ program
8
+ .command('doctor')
9
+ .description('Diagnose environment, links, config, coexistence')
10
+ .option('--json', 'output JSON')
11
+ .option('--fix', 're-sync agent links from lock')
12
+ .action(async (options) => {
13
+ const cwd = process.cwd();
14
+ const [config, manifest, lock, coexist, enabledAdapters, audit] = await Promise.all([
15
+ loadConfig(),
16
+ loadManifest(cwd),
17
+ loadLockfile(cwd),
18
+ scanCoexistence(cwd),
19
+ getEnabledAdapters(),
20
+ runAudit(cwd),
21
+ ]);
22
+ const issues = [];
23
+ const info = [];
24
+ if (!manifest)
25
+ issues.push('No agent-skills.json in project');
26
+ if (!lock)
27
+ info.push('No agent-skills.lock yet (run install after adding skills)');
28
+ if (coexist.detected)
29
+ info.push('Coexistence markers detected');
30
+ for (const f of audit.findings.filter((x) => x.severity === 'error')) {
31
+ issues.push(`[audit] ${f.skill}: ${f.message}`);
32
+ }
33
+ if (options.fix && lock) {
34
+ const res = await syncSkillsToAgents(lockToSkillTargets(lock));
35
+ info.push(`--fix: re-synced ${res.synced} targets`);
36
+ }
37
+ const report = {
38
+ status: issues.length ? 'issues' : audit.status === 'warnings' ? 'warnings' : 'ok',
39
+ config: { store: config.store, defaultMode: config.defaultMode },
40
+ manifestPresent: !!manifest,
41
+ lockPresent: !!lock,
42
+ issues,
43
+ info,
44
+ adapters: {
45
+ registered: getRegisteredAdapters().map((a) => a.id),
46
+ enabled: enabledAdapters.map((a) => a.id),
47
+ },
48
+ coexistence: coexist,
49
+ auditSummary: { scanned: audit.scanned, findings: audit.findings.length },
50
+ };
51
+ if (options.json) {
52
+ console.log(JSON.stringify(report, null, 2));
53
+ process.exitCode = issues.length ? 2 : auditExitCode(audit);
54
+ return;
55
+ }
56
+ console.log('skillctl doctor');
57
+ console.log('Config store:', report.config.store);
58
+ console.log('Manifest:', report.manifestPresent ? 'present' : 'missing');
59
+ console.log('Lockfile:', report.lockPresent ? 'present' : 'missing');
60
+ console.log('Adapters enabled:', report.adapters.enabled.join(', ') || '(none)');
61
+ if (coexist.detected) {
62
+ console.log('Coexistence:', coexist.details.join('; '));
63
+ if (coexist.recommendations.length)
64
+ console.log('Recommendations:', coexist.recommendations.join('; '));
65
+ }
66
+ if (audit.findings.length) {
67
+ console.log(`Audit: ${audit.findings.length} finding(s) across ${audit.scanned} skill(s)`);
68
+ }
69
+ if (issues.length)
70
+ console.log('Issues:', issues.join('; '));
71
+ if (info.length)
72
+ console.log('Info:', info.join('; '));
73
+ process.exitCode = issues.length ? 2 : auditExitCode(audit);
74
+ });
75
+ }
76
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerImport(program: Command): void;
3
+ //# sourceMappingURL=import-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/import-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyErD"}
@@ -0,0 +1,74 @@
1
+ import { executeImport } from '@skillctl/import';
2
+ import { handleCommandError } from '../lib/errors.js';
3
+ export function registerImport(program) {
4
+ const importCmd = program
5
+ .command('import')
6
+ .description('Import skills from npx skills or Python skillctl');
7
+ importCmd
8
+ .command('from-npx')
9
+ .description('Migrate from npx skills (skills-lock.json / .agents/skills)')
10
+ .option('--dry-run', 'show migration plan only')
11
+ .option('--yes', 'skip confirmation prompts')
12
+ .option('--adopt', 'sync to agent targets after import')
13
+ .option('--write-manifest', 'update agent-skills.json with imported specs')
14
+ .action(async (options) => {
15
+ try {
16
+ const result = await executeImport({
17
+ source: 'npx',
18
+ dryRun: options.dryRun,
19
+ yes: options.yes,
20
+ adopt: options.adopt,
21
+ writeManifest: options.writeManifest,
22
+ });
23
+ if (options.dryRun) {
24
+ console.log('Migration plan:');
25
+ for (const item of result.plan) {
26
+ console.log(` ${item.name}: ${item.action}${item.specifier ? ` (${item.specifier})` : ''}${item.note ? ` — ${item.note}` : ''}`);
27
+ }
28
+ return;
29
+ }
30
+ console.log(`Imported: ${result.imported.join(', ') || '(none)'}`);
31
+ if (result.skipped.length)
32
+ console.log(`Skipped: ${result.skipped.join(', ')}`);
33
+ if (result.errors.length) {
34
+ console.error('Errors:', result.errors.join('; '));
35
+ process.exitCode = 1;
36
+ }
37
+ }
38
+ catch (err) {
39
+ handleCommandError(err, 'import');
40
+ }
41
+ });
42
+ importCmd
43
+ .command('from-skillctl')
44
+ .description('Migrate from Python skillctl (~/.skillctl/repos)')
45
+ .option('--dry-run', 'show migration plan only')
46
+ .option('--adopt', 'sync to agent targets after import')
47
+ .option('--write-manifest', 'update agent-skills.json')
48
+ .action(async (options) => {
49
+ try {
50
+ const result = await executeImport({
51
+ source: 'python-skillctl',
52
+ dryRun: options.dryRun,
53
+ adopt: options.adopt,
54
+ writeManifest: options.writeManifest,
55
+ });
56
+ if (options.dryRun) {
57
+ console.log('Migration plan:');
58
+ for (const item of result.plan) {
59
+ console.log(` ${item.name}: ${item.action}${item.localPath ? ` (${item.localPath})` : ''}`);
60
+ }
61
+ return;
62
+ }
63
+ console.log(`Imported: ${result.imported.join(', ') || '(none)'}`);
64
+ if (result.errors.length) {
65
+ console.error('Errors:', result.errors.join('; '));
66
+ process.exitCode = 1;
67
+ }
68
+ }
69
+ catch (err) {
70
+ handleCommandError(err, 'import');
71
+ }
72
+ });
73
+ }
74
+ //# sourceMappingURL=import-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-cmd.js","sourceRoot":"","sources":["../../src/commands/import-cmd.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kDAAkD,CAAC,CAAC;IAEnE,SAAS;SACN,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CAAC,OAAO,EAAE,2BAA2B,CAAC;SAC5C,MAAM,CAAC,SAAS,EAAE,oCAAoC,CAAC;SACvD,MAAM,CAAC,kBAAkB,EAAE,8CAA8C,CAAC;SAC1E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;gBACjC,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpI,CAAC;gBACD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YACnE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CAAC,SAAS,EAAE,oCAAoC,CAAC;SACvD,MAAM,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;gBACjC,MAAM,EAAE,iBAAiB;gBACzB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/F,CAAC;gBACD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YACnE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerInit(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAenD"}
@@ -0,0 +1,18 @@
1
+ import { loadManifest, createDefaultManifest, saveManifest } from '@skillctl/manifest';
2
+ export function registerInit(program) {
3
+ program
4
+ .command('init')
5
+ .description('Initialize agent-skills.json in current project')
6
+ .action(async () => {
7
+ const existing = await loadManifest();
8
+ if (existing) {
9
+ console.log('agent-skills.json already exists');
10
+ return;
11
+ }
12
+ const sample = createDefaultManifest('demo-project');
13
+ await saveManifest(sample);
14
+ console.log('Created agent-skills.json');
15
+ console.log('Run `skillctl add <spec>` to populate, then `install` or `sync`.');
16
+ });
17
+ }
18
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvF,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACrD,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import { RegistryManager } from '@skillctl/registry';
3
+ export declare function registerInstall(program: Command, mgr?: RegistryManager): void;
4
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIrD,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,IAAI,CAqD7E"}
@@ -0,0 +1,58 @@
1
+ import { loadManifest } from '@skillctl/manifest';
2
+ import { loadLockfile, createEmptyLockfile } from '@skillctl/lockfile';
3
+ import { needsInstall, verifyLockIntegrity, lockToSkillTargets } from '@skillctl/core';
4
+ import { RegistryManager } from '@skillctl/registry';
5
+ import { syncSkillsToAgents } from '@skillctl/adapters';
6
+ import { handleCommandError } from '../lib/errors.js';
7
+ export function registerInstall(program, mgr) {
8
+ program
9
+ .command('install')
10
+ .alias('i')
11
+ .description('Install/ensure all skills from agent-skills.json into canonical store')
12
+ .option('--no-sync', 'skip linking to agents after install')
13
+ .option('--frozen', 'fail if lock integrity does not match canonical store')
14
+ .action(async (options) => {
15
+ try {
16
+ const cwd = process.cwd();
17
+ const manifest = await loadManifest(cwd);
18
+ let lock = (await loadLockfile(cwd)) || createEmptyLockfile();
19
+ const registry = mgr || new RegistryManager();
20
+ if (options.frozen) {
21
+ const errors = await verifyLockIntegrity(lock);
22
+ if (errors.length) {
23
+ console.error('Frozen install failed:');
24
+ errors.forEach((e) => console.error(' -', e));
25
+ process.exitCode = 2;
26
+ return;
27
+ }
28
+ }
29
+ let installed = 0;
30
+ let skipped = 0;
31
+ const deps = manifest?.agentSkills?.dependencies || {};
32
+ for (const [name, spec] of Object.entries(deps)) {
33
+ const existing = lock.skills[name];
34
+ if (existing && !(await needsInstall(existing))) {
35
+ console.log(`Using installed ${name}`);
36
+ skipped++;
37
+ continue;
38
+ }
39
+ console.log(`Installing ${name} from ${spec}...`);
40
+ await registry.add(spec, { cwd, updateManifest: false });
41
+ lock = (await loadLockfile(cwd)) || lock;
42
+ installed++;
43
+ }
44
+ console.log(`Install complete. ${installed} fetched, ${skipped} from store.`);
45
+ if (options.sync !== false) {
46
+ const skills = lockToSkillTargets(lock);
47
+ const res = await syncSkillsToAgents(skills);
48
+ console.log(`Synced ${res.synced} links via adapters: ${res.adaptersUsed.join(', ') || 'none'}`);
49
+ if (res.notes.length)
50
+ console.log('Notes:', res.notes.join('; '));
51
+ }
52
+ }
53
+ catch (err) {
54
+ handleCommandError(err, 'install');
55
+ }
56
+ });
57
+ }
58
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerList(program: Command): void;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwBnD"}
@@ -0,0 +1,27 @@
1
+ import { loadManifest } from '@skillctl/manifest';
2
+ import { loadLockfile } from '@skillctl/lockfile';
3
+ export function registerList(program) {
4
+ program
5
+ .command('list')
6
+ .description('List installed skills from lockfile (and manifest)')
7
+ .option('--json', 'output JSON')
8
+ .action(async (options) => {
9
+ const cwd = process.cwd();
10
+ const manifest = await loadManifest(cwd);
11
+ const lock = await loadLockfile(cwd);
12
+ const skills = lock ? Object.keys(lock.skills) : [];
13
+ if (options.json) {
14
+ console.log(JSON.stringify({ manifest: manifest ?? null, lock: lock ?? null, skills }, null, 2));
15
+ return;
16
+ }
17
+ console.log('skillctl list');
18
+ if (manifest) {
19
+ console.log('Manifest deps:', Object.keys(manifest.agentSkills?.dependencies || {}).length);
20
+ }
21
+ else {
22
+ console.log('No agent-skills.json (run `skillctl init`)');
23
+ }
24
+ console.log('Skills in lock:', skills.length ? skills.join(', ') : '(none)');
25
+ });
26
+ }
27
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACjG,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerPlugin(program: Command): void;
3
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqErD"}
@@ -0,0 +1,74 @@
1
+ import { mkdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { listInstalledPlugins, addPluginRecord, removePluginRecord, discoverPluginEntry, getPluginsDir, } from '@skillctl/plugin-system';
4
+ import { loadConfig, saveConfig } from '@skillctl/core';
5
+ import { handleCommandError } from '../lib/errors.js';
6
+ export function registerPlugin(program) {
7
+ const pluginCmd = program.command('plugin').description('Manage skillctl plugins');
8
+ pluginCmd
9
+ .command('list')
10
+ .description('List installed plugins')
11
+ .option('--json', 'JSON output')
12
+ .action(async (options) => {
13
+ const plugins = await listInstalledPlugins();
14
+ const config = await loadConfig();
15
+ if (options.json) {
16
+ console.log(JSON.stringify({ plugins, experimental: config.experimental?.plugins }, null, 2));
17
+ return;
18
+ }
19
+ if (plugins.length === 0) {
20
+ console.log('No plugins installed.');
21
+ console.log('Enable with: set experimental.plugins=true in ~/.skillctl/config.json');
22
+ return;
23
+ }
24
+ for (const p of plugins) {
25
+ console.log(`${p.enabled ? '✓' : '○'} ${p.name} → ${p.path}`);
26
+ }
27
+ });
28
+ pluginCmd
29
+ .command('enable')
30
+ .description('Enable plugin loading (experimental)')
31
+ .action(async () => {
32
+ const config = await loadConfig();
33
+ config.experimental = { ...config.experimental, plugins: true };
34
+ await saveConfig(config);
35
+ console.log('Plugins enabled. Restart skillctl to load plugins.');
36
+ });
37
+ pluginCmd
38
+ .command('add <path>')
39
+ .description('Register a local plugin (directory with package.json skillctl.plugin entry)')
40
+ .action(async (pluginPath) => {
41
+ try {
42
+ const abs = join(process.cwd(), pluginPath);
43
+ const entry = await discoverPluginEntry(abs);
44
+ if (!entry) {
45
+ console.error('No skillctl.plugin entry found in package.json');
46
+ process.exitCode = 1;
47
+ return;
48
+ }
49
+ const pkg = JSON.parse(await (await import('node:fs/promises')).readFile(join(abs, 'package.json'), 'utf8'));
50
+ const name = pkg.name || abs.split(/[/\\]/).pop();
51
+ await mkdir(getPluginsDir(), { recursive: true });
52
+ await addPluginRecord(name, entry);
53
+ console.log(`Registered plugin ${name} at ${entry}`);
54
+ console.log('Run `skillctl plugin enable` if not already enabled.');
55
+ }
56
+ catch (err) {
57
+ handleCommandError(err, 'plugin add');
58
+ }
59
+ });
60
+ pluginCmd
61
+ .command('remove <name>')
62
+ .description('Unregister a plugin')
63
+ .action(async (name) => {
64
+ const ok = await removePluginRecord(name);
65
+ if (!ok) {
66
+ console.log(`Plugin not found: ${name}`);
67
+ process.exitCode = 1;
68
+ }
69
+ else {
70
+ console.log(`Removed plugin ${name}`);
71
+ }
72
+ });
73
+ }
74
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerRemove(program: Command): void;
3
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgDrD"}
@@ -0,0 +1,53 @@
1
+ import { loadManifest, saveManifest } from '@skillctl/manifest';
2
+ import { loadLockfile, saveLockfile } from '@skillctl/lockfile';
3
+ import { canonicalizeName, purgeCanonical, resolveAdapterTarget } from '@skillctl/core';
4
+ import { getEnabledAdapters } from '@skillctl/adapters';
5
+ import { handleCommandError } from '../lib/errors.js';
6
+ export function registerRemove(program) {
7
+ program
8
+ .command('remove <name>')
9
+ .alias('rm')
10
+ .description('Remove skill from manifest/lock and unlink agent targets')
11
+ .option('--purge', 'also remove from canonical ~/.skillctl/skills/<name>')
12
+ .action(async (name, options) => {
13
+ try {
14
+ const cwd = process.cwd();
15
+ let manifest = await loadManifest(cwd);
16
+ let lock = await loadLockfile(cwd);
17
+ const canonicalName = canonicalizeName(name);
18
+ let changed = false;
19
+ if (manifest?.agentSkills?.dependencies?.[canonicalName]) {
20
+ delete manifest.agentSkills.dependencies[canonicalName];
21
+ await saveManifest(manifest, cwd);
22
+ changed = true;
23
+ console.log(`Removed ${canonicalName} from manifest.`);
24
+ }
25
+ if (lock?.skills?.[canonicalName]) {
26
+ const entry = lock.skills[canonicalName];
27
+ delete lock.skills[canonicalName];
28
+ await saveLockfile(lock, cwd);
29
+ changed = true;
30
+ console.log(`Removed ${canonicalName} from lock (was at ${entry.canonicalPath}).`);
31
+ const adapters = await getEnabledAdapters();
32
+ for (const ad of adapters) {
33
+ for (const p of [...ad.projectPaths, ...ad.globalPaths]) {
34
+ const target = resolveAdapterTarget(p, canonicalName, cwd);
35
+ await ad.removeTarget(canonicalName, target).catch(() => { });
36
+ }
37
+ }
38
+ }
39
+ if (options.purge) {
40
+ await purgeCanonical(canonicalName);
41
+ console.log('Purged canonical dir.');
42
+ }
43
+ if (!changed)
44
+ console.log(`No entry for ${name} found.`);
45
+ else
46
+ console.log('Done. Run `sync` if needed.');
47
+ }
48
+ catch (err) {
49
+ handleCommandError(err, 'remove');
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSync(program: Command): void;
3
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsBnD"}
@@ -0,0 +1,31 @@
1
+ import { loadLockfile } from '@skillctl/lockfile';
2
+ import { lockToSkillTargets } from '@skillctl/core';
3
+ import { syncSkillsToAgents } from '@skillctl/adapters';
4
+ import { handleCommandError } from '../lib/errors.js';
5
+ export function registerSync(program) {
6
+ program
7
+ .command('sync')
8
+ .description('Sync canonical skills to all enabled agent directories')
9
+ .option('--dry-run', 'show what would be done')
10
+ .action(async (options) => {
11
+ try {
12
+ const cwd = process.cwd();
13
+ const lock = await loadLockfile(cwd);
14
+ if (!lock || Object.keys(lock.skills || {}).length === 0) {
15
+ console.log('No lockfile or skills to sync. Run install or add first.');
16
+ return;
17
+ }
18
+ const skills = lockToSkillTargets(lock);
19
+ const res = await syncSkillsToAgents(skills, { dryRun: options.dryRun });
20
+ console.log(`sync: ${res.synced} targets processed (adapters: ${res.adaptersUsed.join(', ') || 'none'})`);
21
+ if (res.notes.length)
22
+ console.log('Notes:', res.notes.join(' | '));
23
+ if (options.dryRun)
24
+ console.log('(dry-run complete)');
25
+ }
26
+ catch (err) {
27
+ handleCommandError(err, 'sync');
28
+ }
29
+ });
30
+ }
31
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,WAAW,EAAE,yBAAyB,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;gBACxE,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,MAAM,iCAAiC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;YAC1G,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACnE,IAAI,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import { RegistryManager } from '@skillctl/registry';
3
+ export declare function registerUpdate(program: Command, mgr?: RegistryManager): void;
4
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIrD,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,IAAI,CA2C5E"}
@@ -0,0 +1,49 @@
1
+ import { loadManifest } from '@skillctl/manifest';
2
+ import { loadLockfile } from '@skillctl/lockfile';
3
+ import { lockToSkillTargets, canonicalizeName } from '@skillctl/core';
4
+ import { RegistryManager } from '@skillctl/registry';
5
+ import { syncSkillsToAgents } from '@skillctl/adapters';
6
+ import { handleCommandError } from '../lib/errors.js';
7
+ export function registerUpdate(program, mgr) {
8
+ program
9
+ .command('update [names...]')
10
+ .description('Re-fetch and update skills from their specifiers')
11
+ .option('--no-sync', 'skip agent sync after update')
12
+ .action(async (names, options) => {
13
+ try {
14
+ const cwd = process.cwd();
15
+ const manifest = await loadManifest(cwd);
16
+ const lock = await loadLockfile(cwd);
17
+ if (!lock) {
18
+ console.log('No lockfile. Run install first.');
19
+ return;
20
+ }
21
+ const registry = mgr || new RegistryManager();
22
+ const deps = manifest?.agentSkills?.dependencies || {};
23
+ const toUpdate = names.length
24
+ ? names.map((n) => canonicalizeName(n))
25
+ : Object.keys(lock.skills);
26
+ let updated = 0;
27
+ for (const name of toUpdate) {
28
+ const spec = deps[name] || lock.skills[name]?.specifier;
29
+ if (!spec) {
30
+ console.log(`Skip ${name}: no specifier`);
31
+ continue;
32
+ }
33
+ console.log(`Updating ${name} from ${spec}...`);
34
+ await registry.add(spec, { cwd, updateManifest: false });
35
+ updated++;
36
+ }
37
+ console.log(`Updated ${updated} skill(s).`);
38
+ if (options.sync !== false) {
39
+ const freshLock = (await loadLockfile(cwd)) || lock;
40
+ const res = await syncSkillsToAgents(lockToSkillTargets(freshLock));
41
+ console.log(`Synced ${res.synced} links.`);
42
+ }
43
+ }
44
+ catch (err) {
45
+ handleCommandError(err, 'update');
46
+ }
47
+ });
48
+ }
49
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,GAAqB;IACpE,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,WAAW,EAAE,8BAA8B,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,eAAe,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,QAAQ,EAAE,WAAW,EAAE,YAAY,IAAI,EAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM;gBAC3B,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBAC/C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE7B,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;gBACxD,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,gBAAgB,CAAC,CAAC;oBAC1C,SAAS;gBACX,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,SAAS,IAAI,KAAK,CAAC,CAAC;gBAChD,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,YAAY,CAAC,CAAC;YAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;gBACpD,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpE,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import '@skillctl/adapters';
3
+ declare const program: Command;
4
+ export declare function prepareProgram(): Promise<Command>;
5
+ export { program };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,oBAAoB,CAAC;AA0B5B,QAAA,MAAM,OAAO,SAAgB,CAAC;AAqB9B,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAGvD;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,53 @@
1
+ import { Command } from 'commander';
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname, join } from 'node:path';
5
+ import { RegistryManager } from '@skillctl/registry';
6
+ import { loadPlugins } from '@skillctl/plugin-system';
7
+ import '@skillctl/adapters';
8
+ import { registerInit } from './commands/init.js';
9
+ import { registerAdd } from './commands/add.js';
10
+ import { registerInstall } from './commands/install.js';
11
+ import { registerSync } from './commands/sync.js';
12
+ import { registerRemove } from './commands/remove.js';
13
+ import { registerList } from './commands/list.js';
14
+ import { registerDoctor } from './commands/doctor.js';
15
+ import { registerImport } from './commands/import-cmd.js';
16
+ import { registerAudit } from './commands/audit.js';
17
+ import { registerUpdate } from './commands/update.js';
18
+ import { registerPlugin } from './commands/plugin.js';
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = dirname(__filename);
21
+ const pkgPath = join(__dirname, '..', 'package.json');
22
+ let version = '0.2.0';
23
+ try {
24
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
25
+ version = pkg.version || version;
26
+ }
27
+ catch {
28
+ // fallback
29
+ }
30
+ const program = new Command();
31
+ const registryManager = new RegistryManager();
32
+ program
33
+ .name('skillctl')
34
+ .description('Universal package-manager-like CLI for Agent Skills')
35
+ .version(version, '-v, --version', 'output the current version')
36
+ .helpOption('-h, --help', 'display help for command');
37
+ registerInit(program);
38
+ registerList(program);
39
+ registerDoctor(program);
40
+ registerAdd(program, registryManager);
41
+ registerInstall(program, registryManager);
42
+ registerSync(program);
43
+ registerRemove(program);
44
+ registerImport(program);
45
+ registerAudit(program);
46
+ registerUpdate(program, registryManager);
47
+ registerPlugin(program);
48
+ export async function prepareProgram() {
49
+ await loadPlugins(program, registryManager);
50
+ return program;
51
+ }
52
+ export { program };
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,oBAAoB,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AACtD,IAAI,OAAO,GAAG,OAAO,CAAC;AACtB,IAAI,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AACnC,CAAC;AAAC,MAAM,CAAC;IACP,WAAW;AACb,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAE9C,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC;KAC/D,UAAU,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;AAExD,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AACtC,eAAe,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAC1C,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AACzC,cAAc,CAAC,OAAO,CAAC,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,WAAW,CAAC,OAA0D,EAAE,eAAe,CAAC,CAAC;IAC/F,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleCommandError(err: unknown, label: string): void;
2
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIpE"}
@@ -0,0 +1,6 @@
1
+ export function handleCommandError(err, label) {
2
+ const message = err instanceof Error ? err.message : String(err);
3
+ console.error(`${label} failed:`, message);
4
+ process.exitCode = 1;
5
+ }
6
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,GAAY,EAAE,KAAa;IAC5D,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@skillctl/cli",
3
+ "version": "0.2.0",
4
+ "description": "skillctl CLI - universal manager for Agent Skills",
5
+ "license": "MIT",
6
+ "author": "skillctl contributors",
7
+ "bugs": "https://github.com/xFurti/skillctl/issues",
8
+ "homepage": "https://xfurti.github.io/skillctl/",
9
+ "type": "module",
10
+ "main": "./dist/index.js",
11
+ "bin": {
12
+ "skillctl": "./bin/skillctl.js"
13
+ },
14
+ "files": [
15
+ "bin",
16
+ "dist",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "dependencies": {
21
+ "commander": "^12.1.0",
22
+ "@skillctl/core": "0.2.0",
23
+ "@skillctl/manifest": "0.2.0",
24
+ "@skillctl/lockfile": "0.2.0",
25
+ "@skillctl/import": "0.2.0",
26
+ "@skillctl/adapters": "0.2.0",
27
+ "@skillctl/security": "0.2.0",
28
+ "@skillctl/registry": "0.2.0",
29
+ "@skillctl/link-manager": "0.2.0",
30
+ "@skillctl/plugin-system": "0.2.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^20.14.0",
34
+ "rimraf": "^5.0.7",
35
+ "typescript": "^5.6.3"
36
+ },
37
+ "engines": {
38
+ "node": ">=22.13"
39
+ },
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/xFurti/skillctl.git",
43
+ "directory": "packages/cli"
44
+ },
45
+ "keywords": [
46
+ "cli",
47
+ "skills",
48
+ "agent-skills",
49
+ "ai",
50
+ "agents"
51
+ ],
52
+ "scripts": {
53
+ "build": "tsc -b",
54
+ "dev": "tsc -b --watch",
55
+ "clean": "rimraf dist",
56
+ "lint": "tsc --noEmit",
57
+ "test": "echo \"no tests yet\" && exit 0"
58
+ }
59
+ }