skilldex-cli 0.1.0 → 1.0.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 (116) hide show
  1. package/README.md +147 -5
  2. package/dist/cli/commands/config.d.ts +3 -0
  3. package/dist/cli/commands/config.d.ts.map +1 -0
  4. package/dist/cli/commands/config.js +115 -0
  5. package/dist/cli/commands/config.js.map +1 -0
  6. package/dist/cli/commands/install-action.d.ts.map +1 -1
  7. package/dist/cli/commands/install-action.js +71 -0
  8. package/dist/cli/commands/install-action.js.map +1 -1
  9. package/dist/cli/commands/install.d.ts.map +1 -1
  10. package/dist/cli/commands/install.js +4 -1
  11. package/dist/cli/commands/install.js.map +1 -1
  12. package/dist/cli/commands/list-action.d.ts.map +1 -1
  13. package/dist/cli/commands/list-action.js +5 -1
  14. package/dist/cli/commands/list-action.js.map +1 -1
  15. package/dist/cli/commands/publish.d.ts.map +1 -1
  16. package/dist/cli/commands/publish.js +118 -4
  17. package/dist/cli/commands/publish.js.map +1 -1
  18. package/dist/cli/commands/search-action.d.ts +7 -0
  19. package/dist/cli/commands/search-action.d.ts.map +1 -0
  20. package/dist/cli/commands/search-action.js +61 -0
  21. package/dist/cli/commands/search-action.js.map +1 -0
  22. package/dist/cli/commands/search.d.ts +3 -0
  23. package/dist/cli/commands/search.d.ts.map +1 -0
  24. package/dist/cli/commands/search.js +14 -0
  25. package/dist/cli/commands/search.js.map +1 -0
  26. package/dist/cli/commands/skillset-init-action.d.ts +2 -0
  27. package/dist/cli/commands/skillset-init-action.d.ts.map +1 -0
  28. package/dist/cli/commands/skillset-init-action.js +65 -0
  29. package/dist/cli/commands/skillset-init-action.js.map +1 -0
  30. package/dist/cli/commands/skillset-install-action.d.ts +7 -0
  31. package/dist/cli/commands/skillset-install-action.d.ts.map +1 -0
  32. package/dist/cli/commands/skillset-install-action.js +174 -0
  33. package/dist/cli/commands/skillset-install-action.js.map +1 -0
  34. package/dist/cli/commands/skillset-list-action.d.ts +6 -0
  35. package/dist/cli/commands/skillset-list-action.d.ts.map +1 -0
  36. package/dist/cli/commands/skillset-list-action.js +46 -0
  37. package/dist/cli/commands/skillset-list-action.js.map +1 -0
  38. package/dist/cli/commands/skillset-publish-action.d.ts +7 -0
  39. package/dist/cli/commands/skillset-publish-action.d.ts.map +1 -0
  40. package/dist/cli/commands/skillset-publish-action.js +113 -0
  41. package/dist/cli/commands/skillset-publish-action.js.map +1 -0
  42. package/dist/cli/commands/skillset-uninstall-action.d.ts +6 -0
  43. package/dist/cli/commands/skillset-uninstall-action.d.ts.map +1 -0
  44. package/dist/cli/commands/skillset-uninstall-action.js +24 -0
  45. package/dist/cli/commands/skillset-uninstall-action.js.map +1 -0
  46. package/dist/cli/commands/skillset-update-action.d.ts +7 -0
  47. package/dist/cli/commands/skillset-update-action.d.ts.map +1 -0
  48. package/dist/cli/commands/skillset-update-action.js +84 -0
  49. package/dist/cli/commands/skillset-update-action.js.map +1 -0
  50. package/dist/cli/commands/skillset-validate-action.d.ts +4 -0
  51. package/dist/cli/commands/skillset-validate-action.d.ts.map +1 -0
  52. package/dist/cli/commands/skillset-validate-action.js +49 -0
  53. package/dist/cli/commands/skillset-validate-action.js.map +1 -0
  54. package/dist/cli/commands/skillset.d.ts +3 -0
  55. package/dist/cli/commands/skillset.d.ts.map +1 -0
  56. package/dist/cli/commands/skillset.js +70 -0
  57. package/dist/cli/commands/skillset.js.map +1 -0
  58. package/dist/cli/commands/update-action.d.ts +7 -0
  59. package/dist/cli/commands/update-action.d.ts.map +1 -0
  60. package/dist/cli/commands/update-action.js +65 -0
  61. package/dist/cli/commands/update-action.js.map +1 -0
  62. package/dist/cli/commands/update.d.ts +3 -0
  63. package/dist/cli/commands/update.d.ts.map +1 -0
  64. package/dist/cli/commands/update.js +13 -0
  65. package/dist/cli/commands/update.js.map +1 -0
  66. package/dist/cli/index.d.ts.map +1 -1
  67. package/dist/cli/index.js +9 -1
  68. package/dist/cli/index.js.map +1 -1
  69. package/dist/core/config.d.ts +18 -0
  70. package/dist/core/config.d.ts.map +1 -0
  71. package/dist/core/config.js +42 -0
  72. package/dist/core/config.js.map +1 -0
  73. package/dist/core/installer.d.ts +2 -0
  74. package/dist/core/installer.d.ts.map +1 -1
  75. package/dist/core/installer.js.map +1 -1
  76. package/dist/core/manifest.d.ts +3 -1
  77. package/dist/core/manifest.d.ts.map +1 -1
  78. package/dist/core/manifest.js +27 -0
  79. package/dist/core/manifest.js.map +1 -1
  80. package/dist/core/resolver.d.ts.map +1 -1
  81. package/dist/core/resolver.js +2 -0
  82. package/dist/core/resolver.js.map +1 -1
  83. package/dist/core/skillset-installer.d.ts +21 -0
  84. package/dist/core/skillset-installer.d.ts.map +1 -0
  85. package/dist/core/skillset-installer.js +116 -0
  86. package/dist/core/skillset-installer.js.map +1 -0
  87. package/dist/core/skillset-validator.d.ts +4 -0
  88. package/dist/core/skillset-validator.d.ts.map +1 -0
  89. package/dist/core/skillset-validator.js +272 -0
  90. package/dist/core/skillset-validator.js.map +1 -0
  91. package/dist/core/suggest-agent.d.ts.map +1 -1
  92. package/dist/core/suggest-agent.js +23 -22
  93. package/dist/core/suggest-agent.js.map +1 -1
  94. package/dist/mcp/server.d.ts.map +1 -1
  95. package/dist/mcp/server.js +111 -6
  96. package/dist/mcp/server.js.map +1 -1
  97. package/dist/registry/index.d.ts +2 -0
  98. package/dist/registry/index.d.ts.map +1 -1
  99. package/dist/registry/index.js +1 -1
  100. package/dist/registry/index.js.map +1 -1
  101. package/dist/registry/sources/github.d.ts.map +1 -1
  102. package/dist/registry/sources/github.js +11 -3
  103. package/dist/registry/sources/github.js.map +1 -1
  104. package/dist/registry/sources/registry.d.ts +108 -0
  105. package/dist/registry/sources/registry.d.ts.map +1 -0
  106. package/dist/registry/sources/registry.js +124 -0
  107. package/dist/registry/sources/registry.js.map +1 -0
  108. package/dist/types/manifest.d.ts +13 -0
  109. package/dist/types/manifest.d.ts.map +1 -1
  110. package/dist/types/scope.d.ts +1 -0
  111. package/dist/types/scope.d.ts.map +1 -1
  112. package/dist/types/skillset.d.ts +26 -0
  113. package/dist/types/skillset.d.ts.map +1 -0
  114. package/dist/types/skillset.js +2 -0
  115. package/dist/types/skillset.js.map +1 -0
  116. package/package.json +1 -1
@@ -12,10 +12,23 @@ const InstalledSkillSchema = z.object({
12
12
  score: z.number(),
13
13
  path: z.string(),
14
14
  });
15
+ const InstalledSkillsetSchema = z.object({
16
+ name: z.string(),
17
+ version: z.string(),
18
+ source: z.enum(['official', 'community', 'local']),
19
+ sourceUrl: z.string().optional(),
20
+ installedAt: z.string(),
21
+ specVersion: z.string(),
22
+ score: z.number(),
23
+ path: z.string(),
24
+ embeddedSkills: z.array(z.string()),
25
+ remoteSkills: z.array(z.string()),
26
+ });
15
27
  const SkillManifestSchema = z.object({
16
28
  skilldexVersion: z.string(),
17
29
  scope: z.enum(['global', 'shared', 'project']),
18
30
  skills: z.record(InstalledSkillSchema),
31
+ skillsets: z.record(InstalledSkillsetSchema).default({}),
19
32
  updatedAt: z.string(),
20
33
  });
21
34
  export function createEmptyManifest(scope) {
@@ -23,6 +36,7 @@ export function createEmptyManifest(scope) {
23
36
  skilldexVersion: MANIFEST_VERSION,
24
37
  scope,
25
38
  skills: {},
39
+ skillsets: {},
26
40
  updatedAt: new Date().toISOString(),
27
41
  };
28
42
  }
@@ -59,4 +73,17 @@ export async function removeSkillFromManifest(scopeConfig, skillName) {
59
73
  delete manifest.skills[skillName];
60
74
  await writeManifest(scopeConfig, manifest);
61
75
  }
76
+ export async function addSkillsetToManifest(scopeConfig, skillset) {
77
+ const manifest = await readManifest(scopeConfig);
78
+ manifest.skillsets[skillset.name] = skillset;
79
+ await writeManifest(scopeConfig, manifest);
80
+ }
81
+ export async function removeSkillsetFromManifest(scopeConfig, skillsetName) {
82
+ const manifest = await readManifest(scopeConfig);
83
+ if (!(skillsetName in manifest.skillsets)) {
84
+ throw new Error(`Skillset "${skillsetName}" not found in ${scopeConfig.level} manifest`);
85
+ }
86
+ delete manifest.skillsets[skillsetName];
87
+ await writeManifest(scopeConfig, manifest);
88
+ }
62
89
  //# sourceMappingURL=manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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;AAyBhE,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"}
@@ -4,6 +4,7 @@ import os from 'node:os';
4
4
  const SKILLDEX_DIR = '.skilldex';
5
5
  const MANIFEST_FILE = 'skilldex.json';
6
6
  const SKILLS_DIR = 'skills';
7
+ const SKILLSETS_DIR = 'skillsets';
7
8
  function globalBase() {
8
9
  return path.join(os.homedir(), '.skilldex', 'global');
9
10
  }
@@ -16,6 +17,7 @@ function makeScopeConfig(level, rootPath) {
16
17
  rootPath,
17
18
  manifestPath: path.join(rootPath, MANIFEST_FILE),
18
19
  skillsDir: path.join(rootPath, SKILLS_DIR),
20
+ skillsetsDir: path.join(rootPath, SKILLSETS_DIR),
19
21
  };
20
22
  }
21
23
  export async function resolveScope(level, cwd) {
@@ -1 +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"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ScopeLevel } from '../types/scope.js';
2
+ import type { SkillsetValidationResult } from '../types/skillset.js';
3
+ import type { InstallResult } from './installer.js';
4
+ export interface SkillsetInstallOptions {
5
+ scope: ScopeLevel;
6
+ force?: boolean;
7
+ dryRun?: boolean;
8
+ sourceUrl?: string;
9
+ }
10
+ export interface SkillsetInstallResult {
11
+ skillsetName: string;
12
+ scope: ScopeLevel;
13
+ installedPath: string;
14
+ validation: SkillsetValidationResult;
15
+ embeddedResults: InstallResult[];
16
+ remoteResults: InstallResult[];
17
+ alreadyExisted: boolean;
18
+ }
19
+ export declare function installSkillsetFromPath(sourcePath: string, options: SkillsetInstallOptions): Promise<SkillsetInstallResult>;
20
+ export declare function uninstallSkillset(skillsetName: string, scope: ScopeLevel): Promise<void>;
21
+ //# sourceMappingURL=skillset-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillset-installer.d.ts","sourceRoot":"","sources":["../../src/core/skillset-installer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,KAAK,EAAE,wBAAwB,EAAkB,MAAM,sBAAsB,CAAA;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAMnD,MAAM,WAAW,sBAAsB;IACrC,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,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,UAAU,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,wBAAwB,CAAA;IACpC,eAAe,EAAE,aAAa,EAAE,CAAA;IAChC,aAAa,EAAE,aAAa,EAAE,CAAA;IAC9B,cAAc,EAAE,OAAO,CAAA;CACxB;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAqGhC;AAED,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB9F"}
@@ -0,0 +1,116 @@
1
+ import { cp, rm, mkdir, stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { validateSkillset, SKILLSET_SPEC_VERSION } from './skillset-validator.js';
4
+ import { resolveScope } from './resolver.js';
5
+ import { addSkillsetToManifest, removeSkillsetFromManifest, readManifest } from './manifest.js';
6
+ import { installFromPath, uninstallSkill } from './installer.js';
7
+ export async function installSkillsetFromPath(sourcePath, options) {
8
+ const absSource = path.resolve(sourcePath);
9
+ const validation = await validateSkillset(absSource);
10
+ if (validation.errorCount > 0) {
11
+ throw new Error(`Skillset validation failed with ${validation.errorCount} error(s). Run "skillpm skillset validate" for details.`);
12
+ }
13
+ const skillsetName = validation.skillset;
14
+ const scopeConfig = await resolveScope(options.scope);
15
+ const existingManifest = await readManifest(scopeConfig);
16
+ let alreadyExisted = false;
17
+ if (skillsetName in existingManifest.skillsets) {
18
+ if (!options.force) {
19
+ throw new Error(`Skillset "${skillsetName}" is already installed at ${options.scope} scope. Use --force to overwrite.`);
20
+ }
21
+ alreadyExisted = true;
22
+ // Remove the old skillset directory but leave individual skills (they'll be overwritten by installFromPath --force)
23
+ const oldDir = path.join(scopeConfig.skillsetsDir, skillsetName);
24
+ await rm(oldDir, { recursive: true, force: true });
25
+ }
26
+ if (options.dryRun) {
27
+ return {
28
+ skillsetName,
29
+ scope: options.scope,
30
+ installedPath: path.join(scopeConfig.skillsetsDir, skillsetName),
31
+ validation,
32
+ embeddedResults: [],
33
+ remoteResults: [],
34
+ alreadyExisted,
35
+ };
36
+ }
37
+ // Install embedded skills
38
+ const embeddedResults = [];
39
+ for (const skillName of validation.embeddedSkills) {
40
+ const skillPath = path.join(absSource, skillName);
41
+ const result = await installFromPath(skillPath, {
42
+ scope: options.scope,
43
+ force: options.force,
44
+ sourceUrl: options.sourceUrl,
45
+ });
46
+ embeddedResults.push(result);
47
+ }
48
+ // Install remote skills
49
+ const remoteResults = [];
50
+ for (const ref of validation.remoteSkills) {
51
+ const { installFromGitUrl } = await import('../registry/sources/github.js');
52
+ const result = await installFromGitUrl(`git+${ref.source_url}`, scopeConfig, {
53
+ scope: options.scope,
54
+ force: options.force,
55
+ sourceUrl: ref.source_url,
56
+ });
57
+ remoteResults.push(result);
58
+ }
59
+ // Copy SKILLSET.md + assets/ into skillsetsDir/<name>/
60
+ const targetDir = path.join(scopeConfig.skillsetsDir, skillsetName);
61
+ await mkdir(targetDir, { recursive: true });
62
+ await cp(path.join(absSource, 'SKILLSET.md'), path.join(targetDir, 'SKILLSET.md'));
63
+ const assetsPath = path.join(absSource, 'assets');
64
+ try {
65
+ await stat(assetsPath);
66
+ await cp(assetsPath, path.join(targetDir, 'assets'), { recursive: true });
67
+ }
68
+ catch {
69
+ // no assets dir — that's fine
70
+ }
71
+ const installed = {
72
+ name: skillsetName,
73
+ version: '1.0.0',
74
+ source: options.sourceUrl ? 'community' : 'local',
75
+ sourceUrl: options.sourceUrl,
76
+ installedAt: new Date().toISOString(),
77
+ specVersion: SKILLSET_SPEC_VERSION,
78
+ score: validation.score,
79
+ path: path.join('skillsets', skillsetName),
80
+ embeddedSkills: validation.embeddedSkills,
81
+ remoteSkills: validation.remoteSkills.map((r) => r.name),
82
+ };
83
+ await addSkillsetToManifest(scopeConfig, installed);
84
+ return {
85
+ skillsetName,
86
+ scope: options.scope,
87
+ installedPath: targetDir,
88
+ validation,
89
+ embeddedResults,
90
+ remoteResults,
91
+ alreadyExisted,
92
+ };
93
+ }
94
+ export async function uninstallSkillset(skillsetName, scope) {
95
+ const scopeConfig = await resolveScope(scope);
96
+ const manifest = await readManifest(scopeConfig);
97
+ if (!(skillsetName in manifest.skillsets)) {
98
+ throw new Error(`Skillset "${skillsetName}" is not installed at ${scope} scope`);
99
+ }
100
+ const skillset = manifest.skillsets[skillsetName];
101
+ // Uninstall all skills that were installed as part of this skillset
102
+ const allSkillNames = [...skillset.embeddedSkills, ...skillset.remoteSkills];
103
+ for (const skillName of allSkillNames) {
104
+ try {
105
+ await uninstallSkill(skillName, scope);
106
+ }
107
+ catch {
108
+ // Skill might have been manually removed — continue
109
+ }
110
+ }
111
+ // Remove the skillset directory
112
+ const skillsetDir = path.join(scopeConfig.skillsetsDir, skillsetName);
113
+ await rm(skillsetDir, { recursive: true, force: true });
114
+ await removeSkillsetFromManifest(scopeConfig, skillsetName);
115
+ }
116
+ //# sourceMappingURL=skillset-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillset-installer.js","sourceRoot":"","sources":["../../src/core/skillset-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,IAAI,MAAM,WAAW,CAAA;AAK5B,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC/F,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAmBhE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAkB,EAClB,OAA+B;IAE/B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC1C,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAA;IAEpD,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,mCAAmC,UAAU,CAAC,UAAU,yDAAyD,CAClH,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAA;IACxC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAErD,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAA;IACxD,IAAI,cAAc,GAAG,KAAK,CAAA;IAE1B,IAAI,YAAY,IAAI,gBAAgB,CAAC,SAAS,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,aAAa,YAAY,6BAA6B,OAAO,CAAC,KAAK,mCAAmC,CACvG,CAAA;QACH,CAAC;QACD,cAAc,GAAG,IAAI,CAAA;QACrB,oHAAoH;QACpH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;QAChE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,YAAY;YACZ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC;YAChE,UAAU;YACV,eAAe,EAAE,EAAE;YACnB,aAAa,EAAE,EAAE;YACjB,cAAc;SACf,CAAA;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,eAAe,GAAoB,EAAE,CAAA;IAC3C,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QACjD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE;YAC9C,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAA;QACF,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;IAED,wBAAwB;IACxB,MAAM,aAAa,GAAoB,EAAE,CAAA;IACzC,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;QAC1C,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAA;QAC3E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,GAAG,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE;YAC3E,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC,CAAA;QACF,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;IAED,uDAAuD;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IACnE,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAA;IAElF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IACjD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,CAAA;QACtB,MAAM,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;IAED,MAAM,SAAS,GAAsB;QACnC,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;QACjD,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,WAAW,EAAE,qBAAqB;QAClC,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC;QAC1C,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;KACzE,CAAA;IAED,MAAM,qBAAqB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAEnD,OAAO;QACL,YAAY;QACZ,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE,SAAS;QACxB,UAAU;QACV,eAAe;QACf,aAAa;QACb,cAAc;KACf,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,YAAoB,EAAE,KAAiB;IAC7E,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAA;IAEhD,IAAI,CAAC,CAAC,YAAY,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,yBAAyB,KAAK,QAAQ,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;IAEjD,oEAAoE;IACpE,MAAM,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC,cAAc,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IAC5E,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IACrE,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAEvD,MAAM,0BAA0B,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;AAC7D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SkillsetValidationResult } from '../types/skillset.js';
2
+ export declare const SKILLSET_SPEC_VERSION = "1.0";
3
+ export declare function validateSkillset(skillsetPath: string): Promise<SkillsetValidationResult>;
4
+ //# sourceMappingURL=skillset-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillset-validator.d.ts","sourceRoot":"","sources":["../../src/core/skillset-validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAuB,wBAAwB,EAAkB,MAAM,sBAAsB,CAAA;AAEzG,eAAO,MAAM,qBAAqB,QAAQ,CAAA;AAe1C,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAyK9F"}
@@ -0,0 +1,272 @@
1
+ import { readFile, stat, readdir } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { parseDocument } from 'yaml';
4
+ export const SKILLSET_SPEC_VERSION = '1.0';
5
+ const SKILLSET_MD = 'SKILLSET.md';
6
+ const MIN_DESCRIPTION_WORDS = 30;
7
+ // Scoring weights (total 100)
8
+ const WEIGHTS = {
9
+ frontmatterParseable: 25,
10
+ namePresent: 10,
11
+ descriptionPresent: 10,
12
+ descriptionLength: 10,
13
+ hasSkills: 20,
14
+ allowedSubdirs: 10,
15
+ validSourceUrls: 15,
16
+ };
17
+ export async function validateSkillset(skillsetPath) {
18
+ const diagnostics = [];
19
+ let score = 0;
20
+ const absPath = path.resolve(skillsetPath);
21
+ try {
22
+ const s = await stat(absPath);
23
+ if (!s.isDirectory()) {
24
+ return fatal(skillsetPath, `Path is not a directory: ${absPath}`);
25
+ }
26
+ }
27
+ catch {
28
+ return fatal(skillsetPath, `Path does not exist: ${absPath}`);
29
+ }
30
+ const skillsetMdPath = path.join(absPath, SKILLSET_MD);
31
+ let content;
32
+ try {
33
+ content = await readFile(skillsetMdPath, 'utf8');
34
+ }
35
+ catch {
36
+ return fatal(skillsetPath, `SKILLSET.md not found in ${absPath}`);
37
+ }
38
+ const lines = content.split('\n');
39
+ // --- Check: YAML frontmatter parseable (25 pts) ---
40
+ const { frontmatter, parseError } = extractFrontmatter(content, lines);
41
+ if (parseError || frontmatter === null) {
42
+ return {
43
+ skillset: path.basename(absPath),
44
+ score: 0,
45
+ diagnostics: [
46
+ {
47
+ severity: 'error',
48
+ line: 1,
49
+ message: parseError ?? 'Missing YAML frontmatter — file must start with ---',
50
+ check: 'yaml-frontmatter',
51
+ },
52
+ ],
53
+ specVersion: SKILLSET_SPEC_VERSION,
54
+ embeddedSkills: [],
55
+ remoteSkills: [],
56
+ passCount: 0,
57
+ warnCount: 0,
58
+ errorCount: 1,
59
+ };
60
+ }
61
+ score += WEIGHTS.frontmatterParseable;
62
+ diagnostics.push({ severity: 'pass', message: 'YAML frontmatter valid', check: 'yaml-frontmatter' });
63
+ // --- Check: name present (10 pts) ---
64
+ if (!frontmatter.name || String(frontmatter.name).trim() === '') {
65
+ diagnostics.push({
66
+ severity: 'error',
67
+ message: 'Required field "name" is missing or empty',
68
+ check: 'name-present',
69
+ });
70
+ }
71
+ else {
72
+ score += WEIGHTS.namePresent;
73
+ diagnostics.push({ severity: 'pass', message: 'name field present', check: 'name-present' });
74
+ }
75
+ // --- Check: description present + length (20 pts total) ---
76
+ if (!frontmatter.description || String(frontmatter.description).trim() === '') {
77
+ diagnostics.push({
78
+ severity: 'error',
79
+ message: 'Required field "description" is missing or empty',
80
+ check: 'description-length',
81
+ });
82
+ }
83
+ else {
84
+ score += WEIGHTS.descriptionPresent;
85
+ const wordCount = String(frontmatter.description).trim().split(/\s+/).length;
86
+ if (wordCount < MIN_DESCRIPTION_WORDS) {
87
+ diagnostics.push({
88
+ severity: 'error',
89
+ message: `description too short (current: ${wordCount} words, recommended: ${MIN_DESCRIPTION_WORDS}+)`,
90
+ check: 'description-length',
91
+ });
92
+ }
93
+ else {
94
+ score += WEIGHTS.descriptionLength;
95
+ diagnostics.push({
96
+ severity: 'pass',
97
+ message: `description meets length requirement (${wordCount} words)`,
98
+ check: 'description-length',
99
+ });
100
+ }
101
+ }
102
+ // --- Discover embedded skills and collect remote refs ---
103
+ const embeddedSkills = await discoverEmbeddedSkills(absPath);
104
+ const remoteSkills = Array.isArray(frontmatter.skills)
105
+ ? frontmatter.skills.filter((s) => s && typeof s.name === 'string' && typeof s.source_url === 'string')
106
+ : [];
107
+ // --- Check: at least 1 skill (20 pts) ---
108
+ if (embeddedSkills.length === 0 && remoteSkills.length === 0) {
109
+ diagnostics.push({
110
+ severity: 'error',
111
+ message: 'Skillset must contain at least one embedded skill (subdir with SKILL.md) or remote skill reference',
112
+ check: 'has-skills',
113
+ });
114
+ }
115
+ else {
116
+ score += WEIGHTS.hasSkills;
117
+ diagnostics.push({
118
+ severity: 'pass',
119
+ message: `${embeddedSkills.length} embedded skill(s), ${remoteSkills.length} remote reference(s)`,
120
+ check: 'has-skills',
121
+ });
122
+ }
123
+ // --- Check: no unknown top-level dirs (10 pts) ---
124
+ const unknownDirs = await checkUnknownDirs(absPath, embeddedSkills);
125
+ if (unknownDirs.length > 0) {
126
+ for (const dir of unknownDirs) {
127
+ diagnostics.push({
128
+ severity: 'warning',
129
+ message: `Unknown subdirectory "${dir}" — only embedded skill dirs (with SKILL.md) and assets/ are allowed`,
130
+ check: 'allowed-subdirs',
131
+ });
132
+ }
133
+ const deduction = Math.min(WEIGHTS.allowedSubdirs, unknownDirs.length * 3);
134
+ score += Math.max(0, WEIGHTS.allowedSubdirs - deduction);
135
+ }
136
+ else {
137
+ score += WEIGHTS.allowedSubdirs;
138
+ diagnostics.push({ severity: 'pass', message: 'Folder structure matches convention', check: 'allowed-subdirs' });
139
+ }
140
+ // --- Check: remote source_url fields are valid GitHub URLs (15 pts) ---
141
+ if (remoteSkills.length === 0) {
142
+ // No remote refs to validate — full credit
143
+ score += WEIGHTS.validSourceUrls;
144
+ diagnostics.push({ severity: 'pass', message: 'No remote skill references to validate', check: 'valid-source-urls' });
145
+ }
146
+ else {
147
+ const invalidRefs = remoteSkills.filter((s) => !isValidGitHubUrl(s.source_url));
148
+ if (invalidRefs.length > 0) {
149
+ for (const ref of invalidRefs) {
150
+ diagnostics.push({
151
+ severity: 'error',
152
+ message: `Remote skill "${ref.name}" has invalid source_url: "${ref.source_url}" — must be a GitHub URL`,
153
+ check: 'valid-source-urls',
154
+ });
155
+ }
156
+ }
157
+ else {
158
+ score += WEIGHTS.validSourceUrls;
159
+ diagnostics.push({
160
+ severity: 'pass',
161
+ message: `All ${remoteSkills.length} remote source URL(s) are valid`,
162
+ check: 'valid-source-urls',
163
+ });
164
+ }
165
+ }
166
+ score = Math.min(100, Math.max(0, Math.round(score)));
167
+ return {
168
+ skillset: path.basename(absPath),
169
+ score,
170
+ diagnostics,
171
+ specVersion: SKILLSET_SPEC_VERSION,
172
+ embeddedSkills,
173
+ remoteSkills,
174
+ passCount: diagnostics.filter((d) => d.severity === 'pass').length,
175
+ warnCount: diagnostics.filter((d) => d.severity === 'warning').length,
176
+ errorCount: diagnostics.filter((d) => d.severity === 'error').length,
177
+ };
178
+ }
179
+ // --- Helpers ---
180
+ function fatal(skillsetPath, message) {
181
+ return {
182
+ skillset: path.basename(skillsetPath),
183
+ score: 0,
184
+ diagnostics: [{ severity: 'error', message, check: 'skillset-exists' }],
185
+ specVersion: SKILLSET_SPEC_VERSION,
186
+ embeddedSkills: [],
187
+ remoteSkills: [],
188
+ passCount: 0,
189
+ warnCount: 0,
190
+ errorCount: 1,
191
+ };
192
+ }
193
+ function extractFrontmatter(content, lines) {
194
+ if (!lines[0]?.trimEnd().startsWith('---')) {
195
+ return { frontmatter: null, parseError: 'Missing YAML frontmatter — file must start with ---' };
196
+ }
197
+ let endIndex = -1;
198
+ for (let i = 1; i < lines.length; i++) {
199
+ if (lines[i].trimEnd() === '---') {
200
+ endIndex = i;
201
+ break;
202
+ }
203
+ }
204
+ if (endIndex === -1) {
205
+ return { frontmatter: null, parseError: 'Unclosed YAML frontmatter — missing closing ---' };
206
+ }
207
+ const yamlContent = lines.slice(1, endIndex).join('\n');
208
+ try {
209
+ const doc = parseDocument(yamlContent);
210
+ if (doc.errors.length > 0) {
211
+ return { frontmatter: null, parseError: `YAML parse error: ${doc.errors[0].message}` };
212
+ }
213
+ return { frontmatter: doc.toJS(), parseError: null };
214
+ }
215
+ catch (e) {
216
+ return {
217
+ frontmatter: null,
218
+ parseError: `YAML parse error: ${e instanceof Error ? e.message : String(e)}`,
219
+ };
220
+ }
221
+ }
222
+ async function discoverEmbeddedSkills(skillsetPath) {
223
+ const embedded = [];
224
+ try {
225
+ const entries = await readdir(skillsetPath, { withFileTypes: true });
226
+ for (const entry of entries) {
227
+ if (!entry.isDirectory())
228
+ continue;
229
+ try {
230
+ await stat(path.join(skillsetPath, entry.name, 'SKILL.md'));
231
+ embedded.push(entry.name);
232
+ }
233
+ catch {
234
+ // no SKILL.md — not an embedded skill
235
+ }
236
+ }
237
+ }
238
+ catch {
239
+ // ignore readdir errors
240
+ }
241
+ return embedded;
242
+ }
243
+ async function checkUnknownDirs(skillsetPath, embeddedSkillNames) {
244
+ const embeddedSet = new Set(embeddedSkillNames);
245
+ const unknown = [];
246
+ try {
247
+ const entries = await readdir(skillsetPath, { withFileTypes: true });
248
+ for (const entry of entries) {
249
+ if (!entry.isDirectory())
250
+ continue;
251
+ if (entry.name === 'assets')
252
+ continue;
253
+ if (embeddedSet.has(entry.name))
254
+ continue;
255
+ unknown.push(entry.name);
256
+ }
257
+ }
258
+ catch {
259
+ // ignore
260
+ }
261
+ return unknown;
262
+ }
263
+ function isValidGitHubUrl(url) {
264
+ try {
265
+ const parsed = new URL(url);
266
+ return parsed.hostname === 'github.com' && parsed.protocol === 'https:';
267
+ }
268
+ catch {
269
+ return false;
270
+ }
271
+ }
272
+ //# sourceMappingURL=skillset-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillset-validator.js","sourceRoot":"","sources":["../../src/core/skillset-validator.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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,CA0DtF"}
@@ -56,31 +56,32 @@ export async function gatherProjectContext(projectRoot) {
56
56
  return parts.join('\n\n');
57
57
  }
58
58
  export async function generateProposals(context) {
59
- const apiKey = process.env.ANTHROPIC_API_KEY;
59
+ const { getConfigValue } = await import('./config.js');
60
+ const apiKey = await getConfigValue('anthropicApiKey');
60
61
  if (!apiKey) {
61
- throw new Error('ANTHROPIC_API_KEY environment variable is required for the suggest command');
62
+ throw new Error('ANTHROPIC_API_KEY is required for the suggest command. Set it via environment variable or run: skillpm config set anthropicApiKey <key>');
62
63
  }
63
64
  const client = new Anthropic({ apiKey });
64
- const systemPrompt = `You are a Claude skill recommender for the Skilldex package manager.
65
- Skills are Claude Code skill packages (SKILL.md files) that give Claude specialized capabilities.
66
- Given a project context, suggest relevant skills the user might want to install.
67
-
68
- Respond ONLY with valid JSON matching this schema:
69
- {
70
- "proposals": [
71
- {
72
- "skillName": "kebab-case-skill-name",
73
- "reason": "one sentence explaining why this skill fits this project",
74
- "suggestedScope": "project" | "shared" | "global"
75
- }
76
- ]
77
- }
78
-
79
- Rules:
80
- - Suggest 3-7 skills maximum
81
- - suggestedScope should be "project" unless there is a clear reason for global/shared
82
- - Do not suggest skills that are already installed (listed in context)
83
- - Only suggest skills that would realistically exist as Claude Code skills
65
+ const systemPrompt = `You are a Claude skill recommender for the Skilldex package manager.
66
+ Skills are Claude Code skill packages (SKILL.md files) that give Claude specialized capabilities.
67
+ Given a project context, suggest relevant skills the user might want to install.
68
+
69
+ Respond ONLY with valid JSON matching this schema:
70
+ {
71
+ "proposals": [
72
+ {
73
+ "skillName": "kebab-case-skill-name",
74
+ "reason": "one sentence explaining why this skill fits this project",
75
+ "suggestedScope": "project" | "shared" | "global"
76
+ }
77
+ ]
78
+ }
79
+
80
+ Rules:
81
+ - Suggest 3-7 skills maximum
82
+ - suggestedScope should be "project" unless there is a clear reason for global/shared
83
+ - Do not suggest skills that are already installed (listed in context)
84
+ - Only suggest skills that would realistically exist as Claude Code skills
84
85
  - Keep reasons concise (one sentence)`;
85
86
  const message = await client.messages.create({
86
87
  model: 'claude-sonnet-4-6',
@@ -1 +1 @@
1
- {"version":3,"file":"suggest-agent.js","sourceRoot":"","sources":["../../src/core/suggest-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAQ,MAAM,kBAAkB,CAAA;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,SAAS,MAAM,mBAAmB,CAAA;AAUzC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,SAAS;IACT,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;YACpE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5D,KAAK,CAAC,IAAI,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAA;YACrD,MAAK;QACP,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED,eAAe;IACf,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAA;QAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC9B,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;YACjD,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;SACxD,CAAA;QACD,KAAK,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;QACnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAA;QACxC,KAAK,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,eAAe,CAAC,CAAA;QACzE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QACxC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;QACzD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,gCAAgC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACzE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;IAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAExC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;sCAoBe,CAAA;IAEpC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC3C,KAAK,EAAE,mBAAmB;QAC1B,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,mCAAmC,OAAO,kEAAkE;aACtH;SACF;QACD,MAAM,EAAE,YAAY;KACrB,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;IAClE,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC7C,CAAC;IAED,qEAAqE;IACrE,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IACvD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACxD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAwC,CAAA;IAC9E,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AACjE,CAAC"}
1
+ {"version":3,"file":"suggest-agent.js","sourceRoot":"","sources":["../../src/core/suggest-agent.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AASA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuIpD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAWA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAoQpD"}