@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,189 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ const PROMPT_EXTENSIONS = new Set([".md", ".txt", ".prompt"]);
4
+ // XML tags used in the structured skill template
5
+ const STRUCTURE_MARKERS = ["<role>", "<context>", "<instructions>", "<examples>", "<guidelines>", "<verification>"];
6
+ function hasStructuredFormat(content) {
7
+ return STRUCTURE_MARKERS.some((marker) => content.includes(marker));
8
+ }
9
+ function wrapInStructuredTemplate(name, rawContent) {
10
+ // If already structured with XML tags, preserve as-is
11
+ if (hasStructuredFormat(rawContent)) {
12
+ return rawContent;
13
+ }
14
+ return `<role>
15
+ TODO: one-sentence role definition for the AI model.
16
+ </role>
17
+
18
+ # ${name}
19
+
20
+ <context>
21
+ TODO: explain why this skill exists and what problem it solves.
22
+ </context>
23
+
24
+ <instructions>
25
+ ${rawContent.trim()}
26
+ </instructions>
27
+
28
+ <examples>
29
+ <example>
30
+ <input>TODO: describe a typical user request</input>
31
+ <output>TODO: show the expected model response</output>
32
+ </example>
33
+ </examples>
34
+
35
+ <guidelines>
36
+ TODO: add constraints with motivation (use positive framing — what TO do, not what NOT to do).
37
+ </guidelines>
38
+
39
+ <verification>
40
+ Before completing, verify:
41
+ - [ ] Output matches the expected format
42
+ - [ ] Edge cases are handled
43
+ </verification>
44
+ `;
45
+ }
46
+ function slugify(name) {
47
+ return name
48
+ .toLowerCase()
49
+ .replace(/[^a-z0-9-]/g, "-")
50
+ .replace(/-+/g, "-")
51
+ .replace(/^-|-$/g, "");
52
+ }
53
+ function buildManifest(skillName, meta) {
54
+ return {
55
+ schema_version: 1,
56
+ name: skillName,
57
+ version: "1.0.0",
58
+ language: "en",
59
+ description: `TODO: describe what ${skillName} does`,
60
+ trigger: {
61
+ description: `TODO: describe when to use ${skillName}`,
62
+ tags: [skillName],
63
+ priority: 50,
64
+ },
65
+ dependencies: {},
66
+ compatibility: {
67
+ min_context_tokens: 1000,
68
+ requires: [],
69
+ models: [],
70
+ },
71
+ entry: "SKILL.md",
72
+ security: {
73
+ permissions: [],
74
+ },
75
+ author: meta.author,
76
+ license: meta.license,
77
+ };
78
+ }
79
+ async function promptSharedMeta(options) {
80
+ // If all values provided via flags, skip interactive
81
+ if (options.author && options.scope && options.license) {
82
+ return {
83
+ author: options.author,
84
+ scope: options.scope,
85
+ license: options.license,
86
+ };
87
+ }
88
+ const readline = await import("node:readline/promises");
89
+ const rl = readline.createInterface({
90
+ input: process.stdin,
91
+ output: process.stdout,
92
+ });
93
+ try {
94
+ const author = options.author ?? (await rl.question("Author name: ")).trim();
95
+ if (!author) {
96
+ console.error("Error: author name is required.");
97
+ process.exit(1);
98
+ }
99
+ const scopeInput = options.scope
100
+ ? options.scope
101
+ : (await rl.question("Scope [user]: ")).trim();
102
+ const scope = scopeInput || "user";
103
+ const licenseInput = options.license
104
+ ? options.license
105
+ : (await rl.question("License [MIT]: ")).trim();
106
+ const license = licenseInput || "MIT";
107
+ return { author, scope, license };
108
+ }
109
+ finally {
110
+ rl.close();
111
+ }
112
+ }
113
+ async function collectPromptFiles(source) {
114
+ const stat = await fs.stat(source);
115
+ if (stat.isFile()) {
116
+ return [source];
117
+ }
118
+ if (stat.isDirectory()) {
119
+ const entries = await fs.readdir(source, { withFileTypes: true });
120
+ const files = [];
121
+ for (const entry of entries) {
122
+ if (entry.isFile() && PROMPT_EXTENSIONS.has(path.extname(entry.name).toLowerCase())) {
123
+ files.push(path.join(source, entry.name));
124
+ }
125
+ }
126
+ if (files.length === 0) {
127
+ console.error(`Error: no prompt files (${[...PROMPT_EXTENSIONS].join(", ")}) found in "${source}".`);
128
+ process.exit(1);
129
+ }
130
+ return files.sort();
131
+ }
132
+ console.error(`Error: "${source}" is not a file or directory.`);
133
+ process.exit(1);
134
+ }
135
+ async function convertFile(filePath, meta, outputDir) {
136
+ const baseName = path.basename(filePath, path.extname(filePath));
137
+ const skillName = slugify(baseName);
138
+ const skillDir = path.join(outputDir, skillName);
139
+ try {
140
+ await fs.access(skillDir);
141
+ console.error(` Skipped: ${skillDir}/ already exists`);
142
+ return "";
143
+ }
144
+ catch {
145
+ // Does not exist — good
146
+ }
147
+ const rawContent = await fs.readFile(filePath, "utf-8");
148
+ const manifest = buildManifest(skillName, meta);
149
+ await fs.mkdir(skillDir, { recursive: true });
150
+ await fs.writeFile(path.join(skillDir, "skill.json"), JSON.stringify(manifest, null, 2), "utf-8");
151
+ const content = wrapInStructuredTemplate(skillName, rawContent);
152
+ await fs.writeFile(path.join(skillDir, "SKILL.md"), content, "utf-8");
153
+ return skillName;
154
+ }
155
+ export async function convertCommand(source, options) {
156
+ const resolvedSource = path.resolve(source);
157
+ try {
158
+ await fs.access(resolvedSource);
159
+ }
160
+ catch {
161
+ console.error(`Error: "${source}" does not exist.`);
162
+ process.exit(1);
163
+ }
164
+ const files = await collectPromptFiles(resolvedSource);
165
+ console.log(`Found ${files.length} prompt file${files.length > 1 ? "s" : ""}: ${files.map((f) => path.basename(f)).join(", ")}`);
166
+ console.log();
167
+ const meta = await promptSharedMeta(options);
168
+ const outputDir = path.resolve(options.output ?? ".");
169
+ console.log();
170
+ console.log("Converting...");
171
+ const created = [];
172
+ for (const file of files) {
173
+ const name = await convertFile(file, meta, outputDir);
174
+ if (name) {
175
+ console.log(` ${name}/ ← ${path.basename(file)}`);
176
+ created.push(name);
177
+ }
178
+ }
179
+ if (created.length === 0) {
180
+ console.log("No skills created.");
181
+ return;
182
+ }
183
+ console.log();
184
+ console.log("Next steps:");
185
+ console.log(" 1. Review and edit skill.json in each directory (description, trigger, tags)");
186
+ console.log(` 2. skills validate ./${created[0]}`);
187
+ console.log(` 3. skills install ./${created[0]}`);
188
+ }
189
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/cli/commands/convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function createCommand(name: string, options: {
2
+ scope?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAmFA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC5F"}
@@ -0,0 +1,104 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ function buildManifest(name, scope) {
4
+ return {
5
+ schema_version: 1,
6
+ name: `@${scope}/${name}`,
7
+ version: "1.0.0",
8
+ language: "en",
9
+ description: `TODO: describe what ${name} does`,
10
+ trigger: {
11
+ description: `TODO: describe when to use ${name}`,
12
+ tags: [name],
13
+ priority: 50,
14
+ },
15
+ dependencies: {},
16
+ compatibility: {
17
+ min_context_tokens: 1000,
18
+ requires: [],
19
+ models: [],
20
+ },
21
+ entry: "SKILL.md",
22
+ security: {
23
+ permissions: [],
24
+ },
25
+ author: "TODO",
26
+ license: "MIT",
27
+ };
28
+ }
29
+ const SKILL_MD_TEMPLATE = (name) => `<role>
30
+ TODO: one-sentence role definition. E.g., "You are an expert Python developer specializing in data pipelines."
31
+ </role>
32
+
33
+ # ${name}
34
+
35
+ <context>
36
+ TODO: explain why this skill exists — what problem it solves and what the user is trying to achieve.
37
+ This helps the model understand motivation and make better decisions in ambiguous situations.
38
+ </context>
39
+
40
+ <instructions>
41
+ TODO: core step-by-step instructions. Be specific: name exact libraries, APIs, file formats.
42
+ The model follows these literally. Use numbered lists for ordered steps, bullets for unordered.
43
+
44
+ 1. First, ...
45
+ 2. Then, ...
46
+ 3. Finally, ...
47
+ </instructions>
48
+
49
+ <examples>
50
+ <example>
51
+ <input>User asks: "TODO: describe a typical request"</input>
52
+ <output>
53
+ TODO: show what the model should do — code, commands, or response format.
54
+ </output>
55
+ </example>
56
+
57
+ <example>
58
+ <input>User asks: "TODO: describe an edge case"</input>
59
+ <output>
60
+ TODO: show how the model handles this edge case.
61
+ </output>
62
+ </example>
63
+ </examples>
64
+
65
+ <guidelines>
66
+ TODO: use positive framing — describe what TO do, not what NOT to do.
67
+ Include motivation (WHY) for each guideline so the model can generalize.
68
+
69
+ - Always validate inputs before processing (prevents silent data corruption)
70
+ - Use explicit error messages with fix suggestions (reduces user back-and-forth)
71
+ </guidelines>
72
+
73
+ <verification>
74
+ Before completing, verify:
75
+ - [ ] Output matches the expected format from examples
76
+ - [ ] All edge cases are handled
77
+ - [ ] No security permissions are used beyond what is declared in skill.json
78
+ </verification>
79
+ `;
80
+ export async function createCommand(name, options) {
81
+ const scope = options.scope ?? "user";
82
+ const dir = path.resolve(name);
83
+ try {
84
+ await fs.access(dir);
85
+ console.error(`Error: directory "${name}" already exists.`);
86
+ process.exit(1);
87
+ }
88
+ catch {
89
+ // Directory doesn't exist — good
90
+ }
91
+ await fs.mkdir(dir, { recursive: true });
92
+ const manifest = buildManifest(name, scope);
93
+ await fs.writeFile(path.join(dir, "skill.json"), JSON.stringify(manifest, null, 2), "utf-8");
94
+ await fs.writeFile(path.join(dir, "SKILL.md"), SKILL_MD_TEMPLATE(name), "utf-8");
95
+ console.log(`Created skill scaffold: ${dir}/`);
96
+ console.log(` skill.json — manifest (edit name, trigger, permissions)`);
97
+ console.log(` SKILL.md — instructions for the model`);
98
+ console.log(`\nNext steps:`);
99
+ console.log(` 1. Edit skill.json — set description, trigger, tags`);
100
+ console.log(` 2. Edit SKILL.md — write model instructions`);
101
+ console.log(` 3. skills validate ./${name}`);
102
+ console.log(` 4. skills install ./${name}`);
103
+ }
104
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,SAAS,aAAa,CAAC,IAAY,EAAE,KAAa;IAChD,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,EAAE;QACzB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,uBAAuB,IAAI,OAAO;QAC/C,OAAO,EAAE;YACP,WAAW,EAAE,8BAA8B,IAAI,EAAE;YACjD,IAAI,EAAE,CAAC,IAAI,CAAC;YACZ,QAAQ,EAAE,EAAE;SACb;QACD,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE;YACb,kBAAkB,EAAE,IAAI;YACxB,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;SACX;QACD,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE;YACR,WAAW,EAAE,EAAE;SAChB;QACD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC;;;;IAIxC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CP,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAA2B;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,qBAAqB,IAAI,mBAAmB,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;IAED,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAC5B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC,OAAO,CACR,CAAC;IAEF,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAC1B,iBAAiB,CAAC,IAAI,CAAC,EACvB,OAAO,CACR,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function infoCommand(name: string): Promise<void>;
2
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD7D"}
@@ -0,0 +1,51 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getSkillIndex, findSkill } from "../../core/registry.js";
4
+ export async function infoCommand(name) {
5
+ const index = await getSkillIndex();
6
+ const entry = findSkill(index, name);
7
+ if (!entry) {
8
+ console.error(`Skill "${name}" not found. Use "spm list" to see installed skills.`);
9
+ process.exit(1);
10
+ }
11
+ // Read full manifest
12
+ const skillDir = path.dirname(entry.entry);
13
+ const manifestPath = path.join(skillDir, "skill.json");
14
+ let manifest = null;
15
+ try {
16
+ const raw = await fs.readFile(manifestPath, "utf-8");
17
+ manifest = JSON.parse(raw);
18
+ }
19
+ catch {
20
+ // Continue with index data only
21
+ }
22
+ console.log(`${entry.name}@${entry.v}`);
23
+ console.log();
24
+ if (manifest) {
25
+ console.log(` description: ${manifest.description}`);
26
+ }
27
+ console.log(` trigger: ${entry.trigger}`);
28
+ console.log(` tags: ${entry.tags.join(", ")}`);
29
+ console.log(` priority: ${entry.priority}`);
30
+ console.log(` tokens: ~${entry.tokens_estimate}`);
31
+ console.log(` entry: ${entry.entry}`);
32
+ if (entry.file_patterns) {
33
+ console.log(` patterns: ${entry.file_patterns.join(", ")}`);
34
+ }
35
+ if (manifest) {
36
+ console.log(` author: ${manifest.author}`);
37
+ console.log(` license: ${manifest.license}`);
38
+ console.log(` permissions: ${manifest.security?.permissions.length ? manifest.security.permissions.join(", ") : "none"}`);
39
+ if (manifest.works_with && manifest.works_with.length > 0) {
40
+ console.log(` works_with:`);
41
+ for (const w of manifest.works_with) {
42
+ console.log(` - ${w.skill} (${w.relationship}): ${w.description}`);
43
+ }
44
+ }
45
+ const deps = Object.keys(manifest.dependencies);
46
+ if (deps.length > 0) {
47
+ console.log(` dependencies: ${deps.join(", ")}`);
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function initCommand(options: {
2
+ project?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAoCA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB/E"}
@@ -0,0 +1,53 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getGlobalSkillsDir, getProjectSkillsDir, getInstalledDir, getManifestPath } from "../../core/paths.js";
4
+ import { getDefaultConfig } from "../../core/config.js";
5
+ import { getDefaultManifest } from "../../core/manifest.js";
6
+ async function createStructure(skillsDir, label) {
7
+ const installedDir = getInstalledDir(skillsDir);
8
+ const configPath = path.join(skillsDir, "config.json");
9
+ const feedbackPath = path.join(skillsDir, "feedback.json");
10
+ const cachePath = path.join(skillsDir, "cache");
11
+ await fs.mkdir(installedDir, { recursive: true });
12
+ await fs.mkdir(cachePath, { recursive: true });
13
+ // Write config.json only if it doesn't exist
14
+ try {
15
+ await fs.access(configPath);
16
+ }
17
+ catch {
18
+ await fs.writeFile(configPath, JSON.stringify(getDefaultConfig(), null, 2) + "\n", "utf-8");
19
+ }
20
+ // Write empty feedback.json only if it doesn't exist
21
+ try {
22
+ await fs.access(feedbackPath);
23
+ }
24
+ catch {
25
+ await fs.writeFile(feedbackPath, JSON.stringify({ entries: [] }, null, 2) + "\n", "utf-8");
26
+ }
27
+ console.log(`Initialized ${label} skills directory: ${skillsDir}`);
28
+ console.log(` installed/ — skill packages`);
29
+ console.log(` config.json — settings`);
30
+ console.log(` feedback.json — usage feedback`);
31
+ console.log(` cache/ — download cache`);
32
+ }
33
+ export async function initCommand(options) {
34
+ if (options.project) {
35
+ const cwd = process.cwd();
36
+ const dir = getProjectSkillsDir(cwd);
37
+ await createStructure(dir, "project");
38
+ // Create skill.json in project root if it doesn't exist
39
+ const manifestPath = getManifestPath(cwd);
40
+ try {
41
+ await fs.access(manifestPath);
42
+ }
43
+ catch {
44
+ await fs.writeFile(manifestPath, JSON.stringify(getDefaultManifest(), null, 2) + "\n", "utf-8");
45
+ console.log(` skill.json — project dependencies`);
46
+ }
47
+ }
48
+ else {
49
+ const dir = getGlobalSkillsDir();
50
+ await createStructure(dir, "global");
51
+ }
52
+ }
53
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function installCommand(source: string | undefined, options: {
2
+ global?: boolean;
3
+ version?: string;
4
+ github?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAiUA,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D,OAAO,CAAC,IAAI,CAAC,CAuBf"}