@skillbase/spm 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.
Files changed (160) hide show
  1. package/CHANGELOG.md +341 -0
  2. package/LICENSE +21 -0
  3. package/README.md +90 -0
  4. package/dist/cli/commands/connect.d.ts +3 -0
  5. package/dist/cli/commands/connect.d.ts.map +1 -0
  6. package/dist/cli/commands/connect.js +95 -0
  7. package/dist/cli/commands/connect.js.map +1 -0
  8. package/dist/cli/commands/convert.d.ts +9 -0
  9. package/dist/cli/commands/convert.d.ts.map +1 -0
  10. package/dist/cli/commands/convert.js +189 -0
  11. package/dist/cli/commands/convert.js.map +1 -0
  12. package/dist/cli/commands/create.d.ts +4 -0
  13. package/dist/cli/commands/create.d.ts.map +1 -0
  14. package/dist/cli/commands/create.js +104 -0
  15. package/dist/cli/commands/create.js.map +1 -0
  16. package/dist/cli/commands/info.d.ts +2 -0
  17. package/dist/cli/commands/info.d.ts.map +1 -0
  18. package/dist/cli/commands/info.js +51 -0
  19. package/dist/cli/commands/info.js.map +1 -0
  20. package/dist/cli/commands/init.d.ts +4 -0
  21. package/dist/cli/commands/init.d.ts.map +1 -0
  22. package/dist/cli/commands/init.js +53 -0
  23. package/dist/cli/commands/init.js.map +1 -0
  24. package/dist/cli/commands/install.d.ts +6 -0
  25. package/dist/cli/commands/install.d.ts.map +1 -0
  26. package/dist/cli/commands/install.js +272 -0
  27. package/dist/cli/commands/install.js.map +1 -0
  28. package/dist/cli/commands/list.d.ts +4 -0
  29. package/dist/cli/commands/list.d.ts.map +1 -0
  30. package/dist/cli/commands/list.js +29 -0
  31. package/dist/cli/commands/list.js.map +1 -0
  32. package/dist/cli/commands/login.d.ts +10 -0
  33. package/dist/cli/commands/login.d.ts.map +1 -0
  34. package/dist/cli/commands/login.js +141 -0
  35. package/dist/cli/commands/login.js.map +1 -0
  36. package/dist/cli/commands/publish.d.ts +6 -0
  37. package/dist/cli/commands/publish.d.ts.map +1 -0
  38. package/dist/cli/commands/publish.js +109 -0
  39. package/dist/cli/commands/publish.js.map +1 -0
  40. package/dist/cli/commands/rate.d.ts +5 -0
  41. package/dist/cli/commands/rate.d.ts.map +1 -0
  42. package/dist/cli/commands/rate.js +22 -0
  43. package/dist/cli/commands/rate.js.map +1 -0
  44. package/dist/cli/commands/search.d.ts +5 -0
  45. package/dist/cli/commands/search.d.ts.map +1 -0
  46. package/dist/cli/commands/search.js +70 -0
  47. package/dist/cli/commands/search.js.map +1 -0
  48. package/dist/cli/commands/stats.d.ts +2 -0
  49. package/dist/cli/commands/stats.d.ts.map +1 -0
  50. package/dist/cli/commands/stats.js +33 -0
  51. package/dist/cli/commands/stats.js.map +1 -0
  52. package/dist/cli/commands/uninstall.d.ts +2 -0
  53. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  54. package/dist/cli/commands/uninstall.js +37 -0
  55. package/dist/cli/commands/uninstall.js.map +1 -0
  56. package/dist/cli/commands/update.d.ts +5 -0
  57. package/dist/cli/commands/update.d.ts.map +1 -0
  58. package/dist/cli/commands/update.js +97 -0
  59. package/dist/cli/commands/update.js.map +1 -0
  60. package/dist/cli/commands/validate.d.ts +2 -0
  61. package/dist/cli/commands/validate.d.ts.map +1 -0
  62. package/dist/cli/commands/validate.js +72 -0
  63. package/dist/cli/commands/validate.js.map +1 -0
  64. package/dist/cli/index.d.ts +3 -0
  65. package/dist/cli/index.d.ts.map +1 -0
  66. package/dist/cli/index.js +159 -0
  67. package/dist/cli/index.js.map +1 -0
  68. package/dist/core/config.d.ts +7 -0
  69. package/dist/core/config.d.ts.map +1 -0
  70. package/dist/core/config.js +72 -0
  71. package/dist/core/config.js.map +1 -0
  72. package/dist/core/feedback.d.ts +22 -0
  73. package/dist/core/feedback.d.ts.map +1 -0
  74. package/dist/core/feedback.js +93 -0
  75. package/dist/core/feedback.js.map +1 -0
  76. package/dist/core/github/client.d.ts +18 -0
  77. package/dist/core/github/client.d.ts.map +1 -0
  78. package/dist/core/github/client.js +141 -0
  79. package/dist/core/github/client.js.map +1 -0
  80. package/dist/core/indexer.d.ts +4 -0
  81. package/dist/core/indexer.d.ts.map +1 -0
  82. package/dist/core/indexer.js +90 -0
  83. package/dist/core/indexer.js.map +1 -0
  84. package/dist/core/loader.d.ts +3 -0
  85. package/dist/core/loader.d.ts.map +1 -0
  86. package/dist/core/loader.js +37 -0
  87. package/dist/core/loader.js.map +1 -0
  88. package/dist/core/lock.d.ts +4 -0
  89. package/dist/core/lock.d.ts.map +1 -0
  90. package/dist/core/lock.js +86 -0
  91. package/dist/core/lock.js.map +1 -0
  92. package/dist/core/manifest.d.ts +6 -0
  93. package/dist/core/manifest.d.ts.map +1 -0
  94. package/dist/core/manifest.js +33 -0
  95. package/dist/core/manifest.js.map +1 -0
  96. package/dist/core/paths.d.ts +8 -0
  97. package/dist/core/paths.d.ts.map +1 -0
  98. package/dist/core/paths.js +30 -0
  99. package/dist/core/paths.js.map +1 -0
  100. package/dist/core/plugins/index.d.ts +8 -0
  101. package/dist/core/plugins/index.d.ts.map +1 -0
  102. package/dist/core/plugins/index.js +30 -0
  103. package/dist/core/plugins/index.js.map +1 -0
  104. package/dist/core/plugins/loader.d.ts +9 -0
  105. package/dist/core/plugins/loader.d.ts.map +1 -0
  106. package/dist/core/plugins/loader.js +57 -0
  107. package/dist/core/plugins/loader.js.map +1 -0
  108. package/dist/core/plugins/types.d.ts +79 -0
  109. package/dist/core/plugins/types.d.ts.map +1 -0
  110. package/dist/core/plugins/types.js +3 -0
  111. package/dist/core/plugins/types.js.map +1 -0
  112. package/dist/core/registry-client.d.ts +80 -0
  113. package/dist/core/registry-client.d.ts.map +1 -0
  114. package/dist/core/registry-client.js +166 -0
  115. package/dist/core/registry-client.js.map +1 -0
  116. package/dist/core/registry.d.ts +11 -0
  117. package/dist/core/registry.d.ts.map +1 -0
  118. package/dist/core/registry.js +44 -0
  119. package/dist/core/registry.js.map +1 -0
  120. package/dist/core/resolver.d.ts +17 -0
  121. package/dist/core/resolver.d.ts.map +1 -0
  122. package/dist/core/resolver.js +44 -0
  123. package/dist/core/resolver.js.map +1 -0
  124. package/dist/core/storage/index.d.ts +9 -0
  125. package/dist/core/storage/index.d.ts.map +1 -0
  126. package/dist/core/storage/index.js +34 -0
  127. package/dist/core/storage/index.js.map +1 -0
  128. package/dist/core/storage/local-provider.d.ts +12 -0
  129. package/dist/core/storage/local-provider.d.ts.map +1 -0
  130. package/dist/core/storage/local-provider.js +44 -0
  131. package/dist/core/storage/local-provider.js.map +1 -0
  132. package/dist/core/storage/packager.d.ts +10 -0
  133. package/dist/core/storage/packager.d.ts.map +1 -0
  134. package/dist/core/storage/packager.js +185 -0
  135. package/dist/core/storage/packager.js.map +1 -0
  136. package/dist/core/storage/s3-provider.d.ts +12 -0
  137. package/dist/core/storage/s3-provider.d.ts.map +1 -0
  138. package/dist/core/storage/s3-provider.js +84 -0
  139. package/dist/core/storage/s3-provider.js.map +1 -0
  140. package/dist/core/storage/types.d.ts +27 -0
  141. package/dist/core/storage/types.d.ts.map +1 -0
  142. package/dist/core/storage/types.js +4 -0
  143. package/dist/core/storage/types.js.map +1 -0
  144. package/dist/mcp/server.d.ts +3 -0
  145. package/dist/mcp/server.d.ts.map +1 -0
  146. package/dist/mcp/server.js +349 -0
  147. package/dist/mcp/server.js.map +1 -0
  148. package/dist/schema/skill-schema.d.ts +6 -0
  149. package/dist/schema/skill-schema.d.ts.map +1 -0
  150. package/dist/schema/skill-schema.js +147 -0
  151. package/dist/schema/skill-schema.js.map +1 -0
  152. package/dist/scripts/reindex.d.ts +3 -0
  153. package/dist/scripts/reindex.d.ts.map +1 -0
  154. package/dist/scripts/reindex.js +37 -0
  155. package/dist/scripts/reindex.js.map +1 -0
  156. package/dist/types/index.d.ts +191 -0
  157. package/dist/types/index.d.ts.map +1 -0
  158. package/dist/types/index.js +3 -0
  159. package/dist/types/index.js.map +1 -0
  160. package/package.json +62 -0
@@ -0,0 +1,22 @@
1
+ import { getSkillIndex, findSkill } from "../../core/registry.js";
2
+ import { addFeedback } from "../../core/feedback.js";
3
+ export async function rateCommand(name, options) {
4
+ const score = Number(options.score);
5
+ if (!Number.isInteger(score) || score < 1 || score > 5) {
6
+ console.error("Score must be an integer from 1 to 5.");
7
+ process.exit(1);
8
+ }
9
+ const index = await getSkillIndex();
10
+ const entry = findSkill(index, name);
11
+ if (!entry) {
12
+ console.error(`Skill "${name}" not found. Use "spm list" to see installed skills.`);
13
+ process.exit(1);
14
+ }
15
+ const result = score >= 4 ? "success" : score >= 3 ? "partial" : "failure";
16
+ await addFeedback(name, entry.v, result, "explicit", {
17
+ rating: score,
18
+ comment: options.comment ?? undefined,
19
+ });
20
+ console.log(`Recorded rating ${score}/5 for ${name}@${entry.v} (${result})`);
21
+ }
22
+ //# sourceMappingURL=rate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate.js","sourceRoot":"","sources":["../../../src/cli/commands/rate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,OAA4C;IAE5C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAErC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,sDAAsD,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE;QACnD,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,SAAS;KACtC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,UAAU,IAAI,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function searchCommand(query: string, options: {
2
+ remote?: boolean;
3
+ all?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAiEf"}
@@ -0,0 +1,70 @@
1
+ import { readConfig } from "../../core/config.js";
2
+ import { getSkillIndex } from "../../core/registry.js";
3
+ import { getStatsForSkill } from "../../core/feedback.js";
4
+ import { createRegistryClients } from "../../core/registry-client.js";
5
+ export async function searchCommand(query, options) {
6
+ const config = await readConfig();
7
+ const showLocal = !options.remote;
8
+ const showRemote = options.remote || options.all;
9
+ // Local search
10
+ if (showLocal) {
11
+ const index = await getSkillIndex();
12
+ const q = query.toLowerCase();
13
+ const scored = index.skills.map((skill) => {
14
+ let score = 0;
15
+ if (skill.name.toLowerCase().includes(q))
16
+ score += 10;
17
+ if (skill.tags.some((t) => t === q))
18
+ score += 8;
19
+ if (skill.tags.some((t) => t.includes(q)))
20
+ score += 4;
21
+ if (skill.trigger.toLowerCase().includes(q))
22
+ score += 3;
23
+ if (skill.file_patterns?.some((p) => p.includes(q)))
24
+ score += 6;
25
+ return { skill, score };
26
+ });
27
+ const matches = scored.filter((s) => s.score > 0).sort((a, b) => b.score - a.score);
28
+ if (matches.length > 0) {
29
+ console.log("Local results:");
30
+ for (const m of matches) {
31
+ const stats = await getStatsForSkill(m.skill.name);
32
+ const conf = stats?.confidence != null ? ` (confidence: ${stats.confidence.toFixed(2)})` : "";
33
+ console.log(` ${m.skill.name}@${m.skill.v} ${m.skill.trigger}${conf}`);
34
+ }
35
+ }
36
+ else if (!showRemote) {
37
+ console.log(`No local skills matching "${query}".`);
38
+ }
39
+ if (showRemote && matches.length > 0)
40
+ console.log("");
41
+ }
42
+ // Remote search
43
+ if (showRemote) {
44
+ if (config.registries.length === 0) {
45
+ console.log("No remote registries configured. Use 'skills login <url>' to add one.");
46
+ return;
47
+ }
48
+ const clients = createRegistryClients(config);
49
+ for (const [name, client] of clients) {
50
+ try {
51
+ const result = await client.search(query);
52
+ if (result.skills.length > 0) {
53
+ console.log(`Registry "${name}" (${result.total} total):`);
54
+ for (const s of result.skills) {
55
+ const rating = s.avg_rating != null ? ` ${s.avg_rating.toFixed(1)}★` : "";
56
+ console.log(` ${s.name}@${s.version} ${s.trigger.description} (${s.installs} installs${rating})`);
57
+ }
58
+ }
59
+ else {
60
+ console.log(`Registry "${name}": no results for "${query}".`);
61
+ }
62
+ }
63
+ catch (err) {
64
+ const message = err instanceof Error ? err.message : String(err);
65
+ console.error(`Registry "${name}" error: ${message}`);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statsCommand(): Promise<void>;
2
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stats.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAoClD"}
@@ -0,0 +1,33 @@
1
+ import { getAllStats } from "../../core/feedback.js";
2
+ export async function statsCommand() {
3
+ const stats = await getAllStats();
4
+ if (stats.length === 0) {
5
+ console.log("No feedback recorded yet. Use skills or call skill_feedback via MCP.");
6
+ return;
7
+ }
8
+ const nameWidth = Math.max(10, ...stats.map((s) => s.skill.length));
9
+ const header = pad("Skill", nameWidth) +
10
+ pad("Uses", 8) +
11
+ pad("Success", 10) +
12
+ pad("Rating", 9) +
13
+ "Confidence";
14
+ console.log(header);
15
+ console.log("-".repeat(header.length));
16
+ for (const s of stats) {
17
+ const successPct = `${Math.round(s.success_rate * 100)}%`;
18
+ const rating = s.avg_rating !== null ? s.avg_rating.toFixed(1) : "-";
19
+ const confidence = s.confidence.toFixed(2);
20
+ const warning = s.confidence < 0.5 ? " \u26A0" : "";
21
+ console.log(pad(s.skill, nameWidth) +
22
+ pad(String(s.usage_count), 8) +
23
+ pad(successPct, 10) +
24
+ pad(rating, 9) +
25
+ confidence +
26
+ warning);
27
+ }
28
+ console.log(`\n${stats.length} skill(s) with feedback`);
29
+ }
30
+ function pad(str, width) {
31
+ return str.padEnd(width);
32
+ }
33
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/cli/commands/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAElC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpE,MAAM,MAAM,GACV,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC;QACvB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACd,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;QAClB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChB,YAAY,CAAC;IACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC;QAC1D,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACrE,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpD,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC7B,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;YACnB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACd,UAAU;YACV,OAAO,CACV,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,yBAAyB,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,GAAG,CAAC,GAAW,EAAE,KAAa;IACrC,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function uninstallCommand(name: string): Promise<void>;
2
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"AAMA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmClE"}
@@ -0,0 +1,37 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getGlobalSkillsDir, getInstalledDir } from "../../core/paths.js";
4
+ import { writeIndex } from "../../core/indexer.js";
5
+ import { writeLock } from "../../core/lock.js";
6
+ export async function uninstallCommand(name) {
7
+ // Parse author/skill-name
8
+ const nameParts = name.match(/^([a-z0-9-]+)\/([a-z0-9-]+)$/);
9
+ if (!nameParts) {
10
+ console.error(`Error: invalid skill name "${name}". Expected author/name.`);
11
+ process.exit(1);
12
+ }
13
+ const [, author, skillName] = nameParts;
14
+ const skillsDir = getGlobalSkillsDir();
15
+ const installedDir = getInstalledDir(skillsDir);
16
+ const skillDir = path.join(installedDir, author, skillName);
17
+ try {
18
+ await fs.access(skillDir);
19
+ }
20
+ catch {
21
+ console.error(`Error: skill "${name}" is not installed.`);
22
+ process.exit(1);
23
+ }
24
+ await fs.rm(skillDir, { recursive: true });
25
+ // Clean up empty author directory
26
+ const authorDir = path.join(installedDir, author);
27
+ const remaining = await fs.readdir(authorDir);
28
+ if (remaining.length === 0) {
29
+ await fs.rmdir(authorDir);
30
+ }
31
+ // Rebuild index and lock
32
+ const index = await writeIndex(skillsDir);
33
+ await writeLock(skillsDir);
34
+ console.log(`Uninstalled ${name}`);
35
+ console.log(` ${index.skills.length} skill(s) remaining`);
36
+ }
37
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,0BAA0B;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,0BAA0B,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC;IAExC,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,qBAAqB,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,kCAAkC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;IAED,yBAAyB;IACzB,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function updateCommand(source: string, options: {
2
+ registry?: string;
3
+ dryRun?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAcA,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/C,OAAO,CAAC,IAAI,CAAC,CAmGf"}
@@ -0,0 +1,97 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { readConfig } from "../../core/config.js";
4
+ import { validateSkillManifest } from "../../schema/skill-schema.js";
5
+ import { RegistryClient } from "../../core/registry-client.js";
6
+ import { packSkill } from "../../core/storage/index.js";
7
+ function formatSize(bytes) {
8
+ if (bytes < 1024)
9
+ return `${bytes} B`;
10
+ if (bytes < 1024 * 1024)
11
+ return `${(bytes / 1024).toFixed(1)} KB`;
12
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
13
+ }
14
+ export async function updateCommand(source, options) {
15
+ const config = await readConfig();
16
+ let registryName = options.registry;
17
+ if (!registryName) {
18
+ registryName = config.scopes["*"];
19
+ }
20
+ if (!registryName) {
21
+ console.error("Error: no default registry configured. Use 'skills login <url>' first.");
22
+ process.exit(1);
23
+ }
24
+ const reg = config.registries.find((r) => r.name === registryName);
25
+ if (!reg) {
26
+ console.error(`Error: registry "${registryName}" not found in config.`);
27
+ process.exit(1);
28
+ }
29
+ if (!reg.token) {
30
+ console.error(`Error: no token for registry "${registryName}". Use 'skills login' first.`);
31
+ process.exit(1);
32
+ }
33
+ const client = new RegistryClient(reg.url, reg.token);
34
+ // Read and validate local skill
35
+ const skillDir = path.resolve(source);
36
+ const manifestPath = path.join(skillDir, "skill.json");
37
+ let manifest;
38
+ try {
39
+ const raw = await fs.readFile(manifestPath, "utf-8");
40
+ const data = JSON.parse(raw);
41
+ const validation = validateSkillManifest(data);
42
+ if (!validation.valid) {
43
+ console.error("Invalid skill.json:");
44
+ for (const error of validation.errors) {
45
+ console.error(` - ${error}`);
46
+ }
47
+ process.exit(1);
48
+ }
49
+ manifest = data;
50
+ }
51
+ catch (err) {
52
+ if (err.code === "ENOENT") {
53
+ console.error(`Error: cannot read skill.json in "${source}".`);
54
+ process.exit(1);
55
+ }
56
+ throw err;
57
+ }
58
+ // Verify skill exists in registry
59
+ const existing = await client.getSkill(manifest.author, manifest.name);
60
+ if (!existing) {
61
+ console.error(`Error: "${manifest.author}/${manifest.name}" not found in registry. Use 'skills publish' for first-time publishing.`);
62
+ process.exit(1);
63
+ }
64
+ const previousVersion = existing.version;
65
+ if (!manifest.entry) {
66
+ console.error("Error: skill.json has no 'entry' field. Bundles cannot be updated — only skills with an entry point.");
67
+ process.exit(1);
68
+ }
69
+ // Read entry content
70
+ const entryPath = path.join(skillDir, manifest.entry);
71
+ const content = await fs.readFile(entryPath, "utf-8");
72
+ let compactContent;
73
+ if (manifest.compact_entry) {
74
+ try {
75
+ compactContent = await fs.readFile(path.join(skillDir, manifest.compact_entry), "utf-8");
76
+ }
77
+ catch {
78
+ // Optional
79
+ }
80
+ }
81
+ // Package
82
+ console.log(`Packaging ${manifest.name}@${manifest.version}...`);
83
+ const pkg = await packSkill(skillDir);
84
+ if (options.dryRun) {
85
+ console.log(`[dry-run] Would update ${manifest.name}@${manifest.version} (was ${previousVersion})`);
86
+ console.log(` Package size: ${formatSize(pkg.size)} (${pkg.filesCount} files)`);
87
+ console.log(` Integrity: ${pkg.integrity}`);
88
+ return;
89
+ }
90
+ // Publish (server handles update vs insert)
91
+ console.log(`Updating ${manifest.name} in ${reg.name}...`);
92
+ const result = await client.publishWithArchive({ manifest, content, compact_content: compactContent }, pkg.data);
93
+ console.log(`Updated ${result.name}@${result.version} (was ${previousVersion})`);
94
+ console.log(` Size: ${formatSize(result.size ?? pkg.size)}`);
95
+ console.log(` Tokens: ~${Math.ceil(content.length / 4).toLocaleString()}`);
96
+ }
97
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function validateCommand(skillPath: string): Promise<void>;
2
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAIA,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEtE"}
@@ -0,0 +1,72 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { validateSkillManifest } from "../../schema/skill-schema.js";
4
+ export async function validateCommand(skillPath) {
5
+ const dir = path.resolve(skillPath);
6
+ // Check directory exists
7
+ try {
8
+ const stat = await fs.stat(dir);
9
+ if (!stat.isDirectory()) {
10
+ console.error(`Error: "${skillPath}" is not a directory.`);
11
+ process.exit(1);
12
+ }
13
+ }
14
+ catch {
15
+ console.error(`Error: "${skillPath}" does not exist.`);
16
+ process.exit(1);
17
+ }
18
+ // Check skill.json exists
19
+ const manifestPath = path.join(dir, "skill.json");
20
+ let rawManifest;
21
+ try {
22
+ rawManifest = await fs.readFile(manifestPath, "utf-8");
23
+ }
24
+ catch {
25
+ console.error(`Error: skill.json not found in "${skillPath}".`);
26
+ process.exit(1);
27
+ }
28
+ // Parse JSON
29
+ let data;
30
+ try {
31
+ data = JSON.parse(rawManifest);
32
+ }
33
+ catch (err) {
34
+ const message = err instanceof Error ? err.message : String(err);
35
+ console.error(`Error: skill.json is not valid JSON: ${message}`);
36
+ process.exit(1);
37
+ }
38
+ // Validate against schema
39
+ const result = validateSkillManifest(data);
40
+ if (!result.valid) {
41
+ console.error("Validation failed:");
42
+ for (const error of result.errors) {
43
+ console.error(` - ${error}`);
44
+ }
45
+ process.exit(1);
46
+ }
47
+ const manifest = data;
48
+ // Check entry file exists
49
+ if (manifest.entry) {
50
+ const entryPath = path.join(dir, manifest.entry);
51
+ try {
52
+ await fs.access(entryPath);
53
+ }
54
+ catch {
55
+ console.error(`Error: entry file "${manifest.entry}" not found.`);
56
+ process.exit(1);
57
+ }
58
+ }
59
+ // Check compact_entry if specified
60
+ if (manifest.compact_entry) {
61
+ const compactPath = path.join(dir, manifest.compact_entry);
62
+ try {
63
+ await fs.access(compactPath);
64
+ }
65
+ catch {
66
+ console.error(`Error: compact_entry file "${manifest.compact_entry}" not found.`);
67
+ process.exit(1);
68
+ }
69
+ }
70
+ console.log(`Valid: ${manifest.name ?? skillPath}`);
71
+ }
72
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,159 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs/promises";
3
+ import { Command } from "commander";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { createServer } from "../mcp/server.js";
6
+ import { initCommand } from "./commands/init.js";
7
+ import { createCommand } from "./commands/create.js";
8
+ import { validateCommand } from "./commands/validate.js";
9
+ import { installCommand } from "./commands/install.js";
10
+ import { uninstallCommand } from "./commands/uninstall.js";
11
+ import { listCommand } from "./commands/list.js";
12
+ import { infoCommand } from "./commands/info.js";
13
+ import { statsCommand } from "./commands/stats.js";
14
+ import { rateCommand } from "./commands/rate.js";
15
+ import { searchCommand } from "./commands/search.js";
16
+ import { publishCommand } from "./commands/publish.js";
17
+ import { loginCommand, addRegistryCommand } from "./commands/login.js";
18
+ import { updateCommand } from "./commands/update.js";
19
+ import { convertCommand } from "./commands/convert.js";
20
+ import { connectCommand, disconnectCommand } from "./commands/connect.js";
21
+ import { writeIndex } from "../core/indexer.js";
22
+ import { getGlobalSkillsDir, getProjectSkillsDir, getInstalledDir } from "../core/paths.js";
23
+ const program = new Command();
24
+ program
25
+ .name("spm")
26
+ .description("SkillBase — AI skill manager")
27
+ .version("0.10.0");
28
+ program
29
+ .command("init")
30
+ .description("Initialize skills directory")
31
+ .option("--project", "Initialize in current project (.skills/) instead of global (~/.skills/)")
32
+ .action(initCommand);
33
+ program
34
+ .command("create <name>")
35
+ .description("Create a new skill scaffold")
36
+ .option("-s, --scope <scope>", "Skill scope", "user")
37
+ .action(createCommand);
38
+ program
39
+ .command("validate <path>")
40
+ .description("Validate a skill directory")
41
+ .action(validateCommand);
42
+ program
43
+ .command("install [source]")
44
+ .description("Install skill(s). Without args installs all from skill.json")
45
+ .option("-g, --global", "Install globally instead of project-local")
46
+ .option("-v, --version <version>", "Specific version to install")
47
+ .option("--github <token>", "GitHub personal access token for private repos")
48
+ .action(installCommand);
49
+ program
50
+ .command("uninstall <name>")
51
+ .description("Uninstall a skill")
52
+ .action(uninstallCommand);
53
+ program
54
+ .command("list")
55
+ .description("List installed skills")
56
+ .option("-v, --verbose", "Show detailed information")
57
+ .action(listCommand);
58
+ program
59
+ .command("info <name>")
60
+ .description("Show detailed information about a skill")
61
+ .action(infoCommand);
62
+ program
63
+ .command("stats")
64
+ .description("Show feedback statistics for installed skills")
65
+ .action(statsCommand);
66
+ program
67
+ .command("rate <name>")
68
+ .description("Rate a skill (explicit feedback)")
69
+ .requiredOption("--score <score>", "Rating from 1 to 5")
70
+ .option("--comment <comment>", "Optional comment")
71
+ .action(rateCommand);
72
+ program
73
+ .command("search <query>")
74
+ .description("Search for skills locally and/or in remote registries")
75
+ .option("--remote", "Search remote registries only")
76
+ .option("--all", "Search both local and remote")
77
+ .action(searchCommand);
78
+ program
79
+ .command("publish <source>")
80
+ .description("Publish a skill to registry")
81
+ .option("--registry <name>", "Publish to a specific registry")
82
+ .option("--github", "Source is a GitHub URL")
83
+ .option("--dry-run", "Show what would happen without executing")
84
+ .action(publishCommand);
85
+ program
86
+ .command("update <source>")
87
+ .description("Update an existing skill in the registry (re-publish)")
88
+ .option("--registry <name>", "Target registry")
89
+ .option("--dry-run", "Show what would happen without executing")
90
+ .action(updateCommand);
91
+ program
92
+ .command("convert <source>")
93
+ .description("Convert prompt files (.md, .txt) into skill scaffolds")
94
+ .option("--author <author>", "Author name")
95
+ .option("--scope <scope>", "Skill scope (default: user)")
96
+ .option("--license <license>", "License (default: MIT)")
97
+ .option("-o, --output <dir>", "Output directory (default: current)")
98
+ .action(convertCommand);
99
+ program
100
+ .command("login [registry-url]")
101
+ .description("Authenticate with a registry server")
102
+ .option("--name <name>", "Your author name (for direct registration)")
103
+ .option("--github", "Authenticate via GitHub OAuth")
104
+ .action(loginCommand);
105
+ // Registry management subcommand
106
+ const registryCmd = program
107
+ .command("registry")
108
+ .description("Manage remote registries");
109
+ registryCmd
110
+ .command("add <url>")
111
+ .description("Add a remote registry")
112
+ .option("--name <name>", "Registry name (auto-generated from URL if omitted)")
113
+ .option("--token <token>", "API token")
114
+ .option("--scope <scope>", "Bind a scope to this registry (e.g. @company)")
115
+ .action(addRegistryCommand);
116
+ program
117
+ .command("connect <client>")
118
+ .description("Connect skills to an AI client (claude, zed)")
119
+ .action(connectCommand);
120
+ program
121
+ .command("disconnect <client>")
122
+ .description("Disconnect skills from an AI client (claude, zed)")
123
+ .action(disconnectCommand);
124
+ program
125
+ .command("reindex")
126
+ .description("Rebuild skill index")
127
+ .option("--project", "Reindex project skills only")
128
+ .action(async (options) => {
129
+ const globalDir = getGlobalSkillsDir();
130
+ const projectDir = getProjectSkillsDir(process.cwd());
131
+ if (!options.project) {
132
+ const index = await writeIndex(globalDir);
133
+ console.log(`Global: ${index.skills.length} skill(s) indexed`);
134
+ }
135
+ if (options.project) {
136
+ const installedDir = getInstalledDir(projectDir);
137
+ try {
138
+ const stat = await fs.stat(installedDir);
139
+ if (stat.isDirectory()) {
140
+ const index = await writeIndex(projectDir);
141
+ console.log(`Project: ${index.skills.length} skill(s) indexed`);
142
+ }
143
+ }
144
+ catch {
145
+ console.log("No .skills/installed/ directory in current project.");
146
+ }
147
+ }
148
+ });
149
+ program
150
+ .command("serve")
151
+ .description("Start the MCP server (stdio transport)")
152
+ .option("--stdio", "Use stdio transport (default)", true)
153
+ .action(async () => {
154
+ const server = await createServer();
155
+ const transport = new StdioServerTransport();
156
+ await server.connect(transport);
157
+ });
158
+ program.parse();
159
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { SkillsConfig } from "../types/index.js";
2
+ export declare function getDefaultConfig(): SkillsConfig;
3
+ export declare function readConfig(skillsDir?: string): Promise<SkillsConfig>;
4
+ export declare function writeConfig(config: SkillsConfig, skillsDir?: string): Promise<void>;
5
+ export declare function resolveRegistry(config: SkillsConfig, _skillRef: string): string | null;
6
+ export declare function getRegistryToken(config: SkillsConfig, registryName: string): string | undefined;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA+BtD,wBAAgB,gBAAgB,IAAI,YAAY,CAE/C;AAED,wBAAsB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAW1E;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAIf;AAcD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAMf;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAGpB"}