skilld 1.7.3 → 2.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 (161) hide show
  1. package/dist/_chunks/add.mjs +66 -0
  2. package/dist/_chunks/add.mjs.map +1 -0
  3. package/dist/_chunks/agent-prompt.mjs +88 -0
  4. package/dist/_chunks/agent-prompt.mjs.map +1 -0
  5. package/dist/_chunks/agent.mjs +737 -619
  6. package/dist/_chunks/agent.mjs.map +1 -1
  7. package/dist/_chunks/args.mjs +42 -0
  8. package/dist/_chunks/args.mjs.map +1 -0
  9. package/dist/_chunks/assemble.mjs +11 -8
  10. package/dist/_chunks/assemble.mjs.map +1 -1
  11. package/dist/_chunks/author.mjs +77 -131
  12. package/dist/_chunks/author.mjs.map +1 -1
  13. package/dist/_chunks/cache.mjs +320 -54
  14. package/dist/_chunks/cache.mjs.map +1 -1
  15. package/dist/_chunks/cache2.mjs +7 -6
  16. package/dist/_chunks/cache2.mjs.map +1 -1
  17. package/dist/_chunks/client.mjs +117 -0
  18. package/dist/_chunks/client.mjs.map +1 -0
  19. package/dist/_chunks/core.mjs +7 -4
  20. package/dist/_chunks/detect.mjs +54 -44
  21. package/dist/_chunks/detect.mjs.map +1 -1
  22. package/dist/_chunks/eject.mjs +69 -0
  23. package/dist/_chunks/eject.mjs.map +1 -0
  24. package/dist/_chunks/embedding-cache2.mjs +2 -2
  25. package/dist/_chunks/env.mjs +19 -0
  26. package/dist/_chunks/env.mjs.map +1 -0
  27. package/dist/_chunks/install-many.mjs +376 -0
  28. package/dist/_chunks/install-many.mjs.map +1 -0
  29. package/dist/_chunks/install.mjs +86 -371
  30. package/dist/_chunks/install.mjs.map +1 -1
  31. package/dist/_chunks/intro.mjs +63 -0
  32. package/dist/_chunks/intro.mjs.map +1 -0
  33. package/dist/_chunks/list.mjs +2 -2
  34. package/dist/_chunks/list.mjs.map +1 -1
  35. package/dist/_chunks/lockfile.mjs +31 -7
  36. package/dist/_chunks/lockfile.mjs.map +1 -1
  37. package/dist/_chunks/login.mjs +233 -0
  38. package/dist/_chunks/login.mjs.map +1 -0
  39. package/dist/_chunks/logout.mjs +27 -0
  40. package/dist/_chunks/logout.mjs.map +1 -0
  41. package/dist/_chunks/map.mjs +11 -0
  42. package/dist/_chunks/map.mjs.map +1 -0
  43. package/dist/_chunks/markdown.mjs +79 -54
  44. package/dist/_chunks/markdown.mjs.map +1 -1
  45. package/dist/_chunks/menu.mjs +33 -0
  46. package/dist/_chunks/menu.mjs.map +1 -0
  47. package/dist/_chunks/model-picker.mjs +61 -0
  48. package/dist/_chunks/model-picker.mjs.map +1 -0
  49. package/dist/_chunks/monorepo.mjs +73 -0
  50. package/dist/_chunks/monorepo.mjs.map +1 -0
  51. package/dist/_chunks/package-json.mjs.map +1 -1
  52. package/dist/_chunks/paths.mjs +47 -0
  53. package/dist/_chunks/paths.mjs.map +1 -0
  54. package/dist/_chunks/pipeline.mjs +985 -0
  55. package/dist/_chunks/pipeline.mjs.map +1 -0
  56. package/dist/_chunks/pool2.mjs +2 -2
  57. package/dist/_chunks/portable.mjs +151 -0
  58. package/dist/_chunks/portable.mjs.map +1 -0
  59. package/dist/_chunks/prepare-hook.mjs +2 -0
  60. package/dist/_chunks/prepare-hook2.mjs +61 -0
  61. package/dist/_chunks/prepare-hook2.mjs.map +1 -0
  62. package/dist/_chunks/prepare.mjs +47 -3
  63. package/dist/_chunks/prepare.mjs.map +1 -1
  64. package/dist/_chunks/prepare2.mjs +9 -8
  65. package/dist/_chunks/prepare2.mjs.map +1 -1
  66. package/dist/_chunks/prompts.mjs +784 -26
  67. package/dist/_chunks/prompts.mjs.map +1 -1
  68. package/dist/_chunks/pull.mjs +219 -0
  69. package/dist/_chunks/pull.mjs.map +1 -0
  70. package/dist/_chunks/regex.mjs +19 -0
  71. package/dist/_chunks/regex.mjs.map +1 -0
  72. package/dist/_chunks/retriv.mjs +2 -171
  73. package/dist/_chunks/retriv2.mjs +159 -0
  74. package/dist/_chunks/retriv2.mjs.map +1 -0
  75. package/dist/_chunks/sanitize.mjs +12 -9
  76. package/dist/_chunks/sanitize.mjs.map +1 -1
  77. package/dist/_chunks/search-helpers.mjs +9 -8
  78. package/dist/_chunks/search-helpers.mjs.map +1 -1
  79. package/dist/_chunks/search-interactive.mjs +23 -20
  80. package/dist/_chunks/search-interactive.mjs.map +1 -1
  81. package/dist/_chunks/search.mjs +3 -4
  82. package/dist/_chunks/search.mjs.map +1 -1
  83. package/dist/_chunks/{sources.mjs → semver.mjs} +1128 -838
  84. package/dist/_chunks/semver.mjs.map +1 -0
  85. package/dist/_chunks/skill-installer.mjs +2 -0
  86. package/dist/_chunks/skill-installer2.mjs +154 -0
  87. package/dist/_chunks/skill-installer2.mjs.map +1 -0
  88. package/dist/_chunks/skills.mjs +12 -12
  89. package/dist/_chunks/skills.mjs.map +1 -1
  90. package/dist/_chunks/store.mjs +107 -0
  91. package/dist/_chunks/store.mjs.map +1 -0
  92. package/dist/_chunks/sync.mjs +761 -1349
  93. package/dist/_chunks/sync.mjs.map +1 -1
  94. package/dist/_chunks/sync2.mjs +2 -3
  95. package/dist/_chunks/telemetry.mjs +26 -0
  96. package/dist/_chunks/telemetry.mjs.map +1 -0
  97. package/dist/_chunks/uninstall.mjs +15 -13
  98. package/dist/_chunks/uninstall.mjs.map +1 -1
  99. package/dist/_chunks/update.mjs +171 -0
  100. package/dist/_chunks/update.mjs.map +1 -0
  101. package/dist/_chunks/upload.mjs +4 -4
  102. package/dist/_chunks/validate.mjs +1 -1
  103. package/dist/_chunks/version.mjs +16 -27
  104. package/dist/_chunks/version.mjs.map +1 -1
  105. package/dist/_chunks/whoami.mjs +21 -0
  106. package/dist/_chunks/whoami.mjs.map +1 -0
  107. package/dist/_chunks/wizard.mjs +2 -190
  108. package/dist/_chunks/wizard2.mjs +200 -0
  109. package/dist/_chunks/wizard2.mjs.map +1 -0
  110. package/dist/cli.mjs +77 -59
  111. package/dist/cli.mjs.map +1 -1
  112. package/dist/prepare.mjs +5 -4
  113. package/dist/prepare.mjs.map +1 -1
  114. package/dist/retriv/worker.d.mts +5 -1
  115. package/dist/retriv/worker.d.mts.map +1 -1
  116. package/dist/retriv/worker.mjs +1 -1
  117. package/package.json +20 -29
  118. package/dist/_chunks/author-group.mjs +0 -17
  119. package/dist/_chunks/author-group.mjs.map +0 -1
  120. package/dist/_chunks/cli-helpers.mjs +0 -335
  121. package/dist/_chunks/cli-helpers.mjs.map +0 -1
  122. package/dist/_chunks/cli-helpers2.mjs +0 -2
  123. package/dist/_chunks/config.mjs +0 -122
  124. package/dist/_chunks/config.mjs.map +0 -1
  125. package/dist/_chunks/index.d.mts +0 -151
  126. package/dist/_chunks/index.d.mts.map +0 -1
  127. package/dist/_chunks/index2.d.mts +0 -44
  128. package/dist/_chunks/index2.d.mts.map +0 -1
  129. package/dist/_chunks/index3.d.mts +0 -589
  130. package/dist/_chunks/index3.d.mts.map +0 -1
  131. package/dist/_chunks/prefix.mjs +0 -108
  132. package/dist/_chunks/prefix.mjs.map +0 -1
  133. package/dist/_chunks/retriv.mjs.map +0 -1
  134. package/dist/_chunks/setup.mjs +0 -17
  135. package/dist/_chunks/setup.mjs.map +0 -1
  136. package/dist/_chunks/shared.mjs +0 -503
  137. package/dist/_chunks/shared.mjs.map +0 -1
  138. package/dist/_chunks/skill.mjs +0 -329
  139. package/dist/_chunks/skill.mjs.map +0 -1
  140. package/dist/_chunks/sources.mjs.map +0 -1
  141. package/dist/_chunks/sync-registry.mjs +0 -59
  142. package/dist/_chunks/sync-registry.mjs.map +0 -1
  143. package/dist/_chunks/sync-shared.mjs +0 -2
  144. package/dist/_chunks/sync-shared2.mjs +0 -1020
  145. package/dist/_chunks/sync-shared2.mjs.map +0 -1
  146. package/dist/_chunks/types.d.mts +0 -88
  147. package/dist/_chunks/types.d.mts.map +0 -1
  148. package/dist/_chunks/wizard.mjs.map +0 -1
  149. package/dist/agent/index.d.mts +0 -346
  150. package/dist/agent/index.d.mts.map +0 -1
  151. package/dist/agent/index.mjs +0 -5
  152. package/dist/cache/index.d.mts +0 -2
  153. package/dist/cache/index.mjs +0 -4
  154. package/dist/index.d.mts +0 -5
  155. package/dist/index.mjs +0 -5
  156. package/dist/retriv/index.d.mts +0 -3
  157. package/dist/retriv/index.mjs +0 -2
  158. package/dist/sources/index.d.mts +0 -2
  159. package/dist/sources/index.mjs +0 -3
  160. package/dist/types.d.mts +0 -4
  161. package/dist/types.mjs +0 -1
@@ -0,0 +1,376 @@
1
+ import { a as targets } from "./detect.mjs";
2
+ import "./agent.mjs";
3
+ import { g as todayIsoDate, h as timedSpinner, n as writeSkillMd } from "./prompts.mjs";
4
+ import { l as SHARED_SKILLS_DIR, n as CACHE_DIR } from "./paths.mjs";
5
+ import { n as COMMA_OR_WHITESPACE_RE } from "./regex.mjs";
6
+ import { n as sanitizeMarkdown } from "./sanitize.mjs";
7
+ import { d as readConfig } from "./cache.mjs";
8
+ import { i as introLine } from "./intro.mjs";
9
+ import { _ as fetchGitSkills } from "./semver.mjs";
10
+ import { t as getProjectState } from "./skills.mjs";
11
+ import { l as resolveBaseDir, s as installSkill } from "./skill-installer2.mjs";
12
+ import { c as selectLlmConfig, o as DEFAULT_SECTIONS } from "./pipeline.mjs";
13
+ import { n as shutdownWorker } from "./pool2.mjs";
14
+ import { n as fetchRegistrySkill, r as gateInstall, t as createRegistryClient } from "./client.mjs";
15
+ import { t as track } from "./telemetry.mjs";
16
+ import { i as createGithubResolver, n as bindClackUi, r as createSyncRun, t as syncCommand } from "./sync.mjs";
17
+ import { mkdirSync, writeFileSync } from "node:fs";
18
+ import { styleText } from "node:util";
19
+ import * as p from "@clack/prompts";
20
+ import { dirname, join, relative } from "pathe";
21
+ const STATIC_REGEX_1 = /-skilld$/;
22
+ async function syncGitSkills(opts) {
23
+ const { source, agent, global: isGlobal, yes } = opts;
24
+ const cwd = process.cwd();
25
+ const agentConfig = targets[agent];
26
+ const baseDir = isGlobal ? join(CACHE_DIR, "skills") : join(cwd, agentConfig.skillsDir);
27
+ const label = source.type === "local" ? source.localPath : `${source.owner}/${source.repo}`;
28
+ const spin = timedSpinner();
29
+ spin.start(`Fetching skills from ${label}`);
30
+ const { skills } = await fetchGitSkills(source, (msg) => spin.message(msg));
31
+ if (skills.length === 0) {
32
+ if (source.type === "github" && source.owner && source.repo) {
33
+ spin.stop(`No pre-authored skills in ${label}, generating from repo docs...`);
34
+ return syncGitHubRepo(opts);
35
+ }
36
+ spin.stop(`No skills found in ${label}`);
37
+ return;
38
+ }
39
+ spin.stop(`Found ${skills.length} skill(s) in ${label}`);
40
+ let selected = skills;
41
+ if (opts.skillFilter?.length) {
42
+ const filterSet = new Set(opts.skillFilter.map((s) => s.toLowerCase().replace(STATIC_REGEX_1, "")));
43
+ selected = skills.filter((s) => filterSet.has(s.name.toLowerCase().replace(STATIC_REGEX_1, "")));
44
+ if (selected.length === 0) {
45
+ p.log.warn(`No skills matched: ${opts.skillFilter.join(", ")}`);
46
+ p.log.message(`Available: ${skills.map((s) => s.name).join(", ")}`);
47
+ return;
48
+ }
49
+ } else if (source.skillPath) selected = skills;
50
+ else if (skills.length > 1 && !yes) {
51
+ const choices = await p.autocompleteMultiselect({
52
+ message: `Select skills to install from ${label}`,
53
+ options: skills.map((s) => ({
54
+ label: s.name.replace(STATIC_REGEX_1, ""),
55
+ value: s.name,
56
+ hint: s.description || s.path
57
+ })),
58
+ initialValues: []
59
+ });
60
+ if (p.isCancel(choices)) return;
61
+ const selectedNames = new Set(choices);
62
+ selected = skills.filter((s) => selectedNames.has(s.name));
63
+ if (selected.length === 0) return;
64
+ }
65
+ mkdirSync(baseDir, { recursive: true });
66
+ for (const skill of selected) {
67
+ const skillDir = join(baseDir, skill.name);
68
+ mkdirSync(skillDir, { recursive: true });
69
+ writeSkillMd(skillDir, sanitizeMarkdown(skill.content));
70
+ if (skill.files.length > 0) for (const f of skill.files) {
71
+ const filePath = join(skillDir, f.path);
72
+ mkdirSync(dirname(filePath), { recursive: true });
73
+ writeFileSync(filePath, f.content);
74
+ }
75
+ const sourceType = source.type === "local" ? "local" : source.type;
76
+ installSkill({
77
+ cwd,
78
+ agent,
79
+ global: isGlobal,
80
+ baseDir,
81
+ skillDirName: skill.name,
82
+ lock: {
83
+ source: sourceType,
84
+ repo: source.type === "local" ? source.localPath : `${source.owner}/${source.repo}`,
85
+ path: skill.path || void 0,
86
+ ref: source.ref || "main",
87
+ syncedAt: todayIsoDate(),
88
+ generator: "external"
89
+ },
90
+ skipLinkAgents: true
91
+ });
92
+ }
93
+ if (source.type !== "local" && source.owner && source.repo) track({
94
+ event: "install",
95
+ surface: "cli:add",
96
+ sourceKind: "gh",
97
+ slug: `${source.owner}/${source.repo}`,
98
+ agent
99
+ });
100
+ for (const skill of selected) {
101
+ const skillRel = relative(cwd, join(baseDir, skill.name));
102
+ const fileLines = ["SKILL.md", ...skill.files.map((f) => f.path)].map((f) => ` ${styleText("gray", "└")} ${f}`).join("\n");
103
+ p.log.success(`Installed ${styleText("cyan", skill.name)} ${styleText("gray", `→ ${skillRel}`)}\n${fileLines}`);
104
+ }
105
+ }
106
+ async function syncGitHubRepo(opts) {
107
+ const { source, agent, global: isGlobal, yes } = opts;
108
+ const owner = source.owner;
109
+ const repo = source.repo;
110
+ const cwd = process.cwd();
111
+ const spec = `${owner}/${repo}`;
112
+ const run = createSyncRun({
113
+ cwd,
114
+ resolver: createGithubResolver(owner, repo),
115
+ agent,
116
+ global: isGlobal,
117
+ force: opts.force,
118
+ debug: opts.debug,
119
+ from: opts.from,
120
+ defaultSections: DEFAULT_SECTIONS
121
+ });
122
+ bindClackUi(run.hooks, { cwd });
123
+ const base = await run.runBase(spec);
124
+ if (base.kind !== "ready") return;
125
+ const { state } = base;
126
+ const globalConfig = readConfig();
127
+ let llmConfig = null;
128
+ if (!state.allSectionsCached && !globalConfig.skipLlm && (!yes || opts.model)) llmConfig = await selectLlmConfig(opts.model);
129
+ await run.runEnhance(state, llmConfig);
130
+ await shutdownWorker();
131
+ track({
132
+ event: "install",
133
+ surface: "cli:add",
134
+ sourceKind: "gh",
135
+ slug: spec,
136
+ agent
137
+ });
138
+ p.outro(`Synced ${spec} to ${relative(cwd, state.skillDir)}`);
139
+ }
140
+ async function syncRegistrySkill(opts) {
141
+ const { packageName, agent, cwd = process.cwd() } = opts;
142
+ const skill = opts.prefetched ?? await fetchRegistrySkill(packageName);
143
+ if (!skill) return null;
144
+ const skillDir = join(join(cwd, SHARED_SKILLS_DIR), skill.name);
145
+ mkdirSync(skillDir, { recursive: true });
146
+ writeSkillMd(skillDir, skill.content);
147
+ const baseDir = resolveBaseDir(cwd, agent, false);
148
+ mkdirSync(baseDir, { recursive: true });
149
+ installSkill({
150
+ cwd,
151
+ agent,
152
+ global: false,
153
+ baseDir,
154
+ skillDirName: skill.name,
155
+ lock: {
156
+ packageName: skill.packageName,
157
+ version: skill.updatedAt,
158
+ repo: skill.repo,
159
+ source: "registry",
160
+ syncedAt: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10),
161
+ generator: "curator"
162
+ }
163
+ });
164
+ track({
165
+ event: "install",
166
+ surface: opts.surface ?? "cli:add",
167
+ sourceKind: "npm",
168
+ slug: packageName,
169
+ agent
170
+ });
171
+ return skill;
172
+ }
173
+ const RECEIPTS_URL = "https://skilld.dev/gh";
174
+ async function getAudit(client, cache, owner, repo, name) {
175
+ const key = `${owner}/${repo}/${name}`;
176
+ const cached = cache.get(key);
177
+ if (cached) return cached;
178
+ const result = await client.audit({
179
+ owner,
180
+ repo,
181
+ name
182
+ });
183
+ cache.set(key, result);
184
+ return result;
185
+ }
186
+ function logAuditWarn(slug, result) {
187
+ const parts = [
188
+ result.riskLevel && `risk: ${result.riskLevel}`,
189
+ result.summary,
190
+ result.audits.filter((a) => a.status === "warn").map((a) => a.slug).join(",")
191
+ ].filter(Boolean).join(" · ");
192
+ p.log.warn(`${styleText("yellow", "⚠")} ${slug} ${styleText("gray", parts)}`);
193
+ }
194
+ function logAuditFail(slug, result, owner, repo, name) {
195
+ const detail = result.audits.filter((a) => a.status === "fail").map((a) => a.summary || a.slug).join("; ");
196
+ p.log.error(`${styleText("red", "✗")} ${slug} blocked: ${detail || "audit failed"}\n Receipts: ${RECEIPTS_URL}/${owner}/${repo}/${name}`);
197
+ }
198
+ async function installSkills(items, opts) {
199
+ const cwd = process.cwd();
200
+ const summary = {
201
+ installed: 0,
202
+ skipped: 0,
203
+ failed: 0
204
+ };
205
+ const client = createRegistryClient();
206
+ const auditCache = opts.auditCache ?? /* @__PURE__ */ new Map();
207
+ const gitSources = [];
208
+ const npmEntries = [];
209
+ const crateSpecs = [];
210
+ const unsupported = [];
211
+ for (const source of items) switch (source.type) {
212
+ case "git":
213
+ gitSources.push({
214
+ source: source.source,
215
+ skillFilter: source.skillFilter
216
+ });
217
+ break;
218
+ case "npm":
219
+ npmEntries.push({
220
+ name: source.package,
221
+ spec: source.tag ? `${source.package}@${source.tag}` : source.package
222
+ });
223
+ break;
224
+ case "crate":
225
+ crateSpecs.push(source.version ? `crate:${source.package}@${source.version}` : `crate:${source.package}`);
226
+ break;
227
+ case "bare":
228
+ p.log.warn(`Bare names are deprecated. Use ${styleText("cyan", `npm:${source.package}`)} instead.`);
229
+ npmEntries.push({
230
+ name: source.package,
231
+ spec: source.tag ? `${source.package}@${source.tag}` : source.package
232
+ });
233
+ break;
234
+ case "curator":
235
+ unsupported.push(`@${source.handle} (curator)`);
236
+ break;
237
+ case "collection":
238
+ unsupported.push(`@${source.handle}/${source.name} (collection)`);
239
+ break;
240
+ default: throw new Error(`Unhandled SkillSource type: ${JSON.stringify(source)}`);
241
+ }
242
+ if (unsupported.length > 0) {
243
+ p.log.error(`Curator and collection installs are not yet available:\n ${unsupported.join("\n ")}\n\nFollow https://skilld.dev for launch updates.`);
244
+ summary.skipped += unsupported.length;
245
+ process.exitCode = 1;
246
+ if (gitSources.length === 0 && npmEntries.length === 0 && crateSpecs.length === 0) return summary;
247
+ }
248
+ for (const { source, skillFilter: perSourceFilter } of gitSources) {
249
+ const filterRaw = perSourceFilter ?? opts.skillFilter;
250
+ const skillFilter = filterRaw ? filterRaw.split(COMMA_OR_WHITESPACE_RE).map((s) => s.trim()).filter(Boolean) : void 0;
251
+ await syncGitSkills({
252
+ source,
253
+ global: !!opts.global,
254
+ agent: opts.agent,
255
+ yes: !!opts.yes,
256
+ model: opts.model,
257
+ force: opts.force,
258
+ debug: opts.debug,
259
+ skillFilter
260
+ }).then(() => {
261
+ summary.installed += 1;
262
+ }).catch((err) => {
263
+ summary.failed += 1;
264
+ p.log.error(`Failed to install ${source.type === "local" ? source.localPath : `${source.owner}/${source.repo}`}: ${err instanceof Error ? err.message : String(err)}`);
265
+ });
266
+ }
267
+ if (npmEntries.length > 0) {
268
+ const seen = /* @__PURE__ */ new Set();
269
+ const dedupedEntries = npmEntries.filter((e) => {
270
+ if (seen.has(e.name)) return false;
271
+ seen.add(e.name);
272
+ return true;
273
+ });
274
+ const fallbackPackages = [];
275
+ for (const entry of dedupedEntries) {
276
+ const resolved = await client.resolveSkill(entry.name).catch(() => null);
277
+ if (!resolved) {
278
+ fallbackPackages.push(entry.spec);
279
+ continue;
280
+ }
281
+ const [auditOwner, auditRepo] = resolved.repo.split("/");
282
+ const audit = await getAudit(client, auditCache, auditOwner, auditRepo, resolved.name);
283
+ const decision = gateInstall(audit, {
284
+ allowUnsafe: opts.allowUnsafe,
285
+ yes: opts.yes,
286
+ sourceKind: "npm"
287
+ });
288
+ const slug = `${resolved.repo}/${resolved.name}`;
289
+ if (audit.status === "warn") {
290
+ logAuditWarn(slug, audit);
291
+ track({
292
+ event: "audit-warn",
293
+ surface: opts.surface,
294
+ sourceKind: "npm",
295
+ slug,
296
+ agent: opts.agent
297
+ });
298
+ }
299
+ if (audit.status === "fail") {
300
+ logAuditFail(slug, audit, auditOwner, auditRepo, resolved.name);
301
+ track({
302
+ event: "audit-fail",
303
+ surface: opts.surface,
304
+ sourceKind: "npm",
305
+ slug,
306
+ agent: opts.agent
307
+ });
308
+ }
309
+ if (decision === "skip") {
310
+ track({
311
+ event: "audit-blocked",
312
+ surface: opts.surface,
313
+ sourceKind: "npm",
314
+ slug,
315
+ agent: opts.agent
316
+ });
317
+ summary.skipped += 1;
318
+ continue;
319
+ }
320
+ const result = await syncRegistrySkill({
321
+ packageName: entry.name,
322
+ agent: opts.agent,
323
+ cwd,
324
+ prefetched: resolved,
325
+ surface: opts.surface
326
+ }).catch((err) => {
327
+ summary.failed += 1;
328
+ p.log.error(`Failed to install ${entry.name}: ${err instanceof Error ? err.message : String(err)}`);
329
+ return null;
330
+ });
331
+ if (result) {
332
+ p.log.success(`Installed ${styleText("cyan", result.name)} from registry`);
333
+ summary.installed += 1;
334
+ } else if (result === null) fallbackPackages.push(entry.spec);
335
+ }
336
+ if (fallbackPackages.length > 0) {
337
+ const state = await getProjectState(cwd);
338
+ p.intro(introLine({
339
+ state,
340
+ agentId: opts.agent
341
+ }));
342
+ await syncCommand(state, {
343
+ packages: [...fallbackPackages, ...crateSpecs],
344
+ global: !!opts.global,
345
+ agent: opts.agent,
346
+ model: opts.model,
347
+ yes: !!opts.yes,
348
+ force: opts.force,
349
+ debug: opts.debug
350
+ });
351
+ summary.installed += fallbackPackages.length + crateSpecs.length;
352
+ return summary;
353
+ }
354
+ }
355
+ if (crateSpecs.length > 0) {
356
+ const state = await getProjectState(cwd);
357
+ p.intro(introLine({
358
+ state,
359
+ agentId: opts.agent
360
+ }));
361
+ await syncCommand(state, {
362
+ packages: crateSpecs,
363
+ global: !!opts.global,
364
+ agent: opts.agent,
365
+ model: opts.model,
366
+ yes: !!opts.yes,
367
+ force: opts.force,
368
+ debug: opts.debug
369
+ });
370
+ summary.installed += crateSpecs.length;
371
+ }
372
+ return summary;
373
+ }
374
+ export { installSkills as t };
375
+
376
+ //# sourceMappingURL=install-many.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-many.mjs","names":["agents","_exhaustive"],"sources":["../../src/commands/sync-git.ts","../../src/commands/sync/registry.ts","../../src/commands/sync/install-many.ts"],"sourcesContent":["/**\n * Git skill sync — install pre-authored skills from git repos, or generate\n * from repo docs when no pre-authored skills exist.\n */\n\nimport type { AgentType, OptimizeModel } from '../agent/index.ts'\nimport type { GitSkillSource } from '../sources/git-skills.ts'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { styleText } from 'node:util'\nimport * as p from '@clack/prompts'\nimport { dirname, join, relative } from 'pathe'\nimport { agents, writeSkillMd } from '../agent/index.ts'\nimport { installSkill } from '../agent/skill-installer.ts'\nimport { CACHE_DIR } from '../cache/index.ts'\nimport { readConfig } from '../core/config.ts'\nimport { timedSpinner, todayIsoDate } from '../core/formatting.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport { shutdownWorker } from '../retriv/pool.ts'\nimport { fetchGitSkills } from '../sources/git-skills.ts'\nimport { track } from '../telemetry.ts'\nimport { DEFAULT_SECTIONS, selectLlmConfig } from './llm-prompts.ts'\nimport { createGithubResolver } from './sync/resolvers.ts'\nimport { createSyncRun } from './sync/run.ts'\nimport { bindClackUi } from './sync/ui/clack.ts'\n\nconst STATIC_REGEX_1 = /-skilld$/\n\nexport interface GitSyncOptions {\n source: GitSkillSource\n global: boolean\n agent: AgentType\n yes: boolean\n model?: OptimizeModel\n force?: boolean\n debug?: boolean\n from?: string\n skillFilter?: string[]\n}\n\nexport async function syncGitSkills(opts: GitSyncOptions): Promise<void> {\n const { source, agent, global: isGlobal, yes } = opts\n const cwd = process.cwd()\n const agentConfig = agents[agent]\n const baseDir = isGlobal\n ? join(CACHE_DIR, 'skills')\n : join(cwd, agentConfig.skillsDir)\n\n const label = source.type === 'local'\n ? source.localPath!\n : `${source.owner}/${source.repo}`\n\n const spin = timedSpinner()\n spin.start(`Fetching skills from ${label}`)\n\n const { skills } = await fetchGitSkills(source, msg => spin.message(msg))\n\n if (skills.length === 0) {\n if (source.type === 'github' && source.owner && source.repo) {\n spin.stop(`No pre-authored skills in ${label}, generating from repo docs...`)\n return syncGitHubRepo(opts)\n }\n spin.stop(`No skills found in ${label}`)\n return\n }\n\n spin.stop(`Found ${skills.length} skill(s) in ${label}`)\n\n let selected = skills\n\n if (opts.skillFilter?.length) {\n const filterSet = new Set(opts.skillFilter.map(s => s.toLowerCase().replace(STATIC_REGEX_1, '')))\n selected = skills.filter(s => filterSet.has(s.name.toLowerCase().replace(STATIC_REGEX_1, '')))\n if (selected.length === 0) {\n p.log.warn(`No skills matched: ${opts.skillFilter.join(', ')}`)\n p.log.message(`Available: ${skills.map(s => s.name).join(', ')}`)\n return\n }\n }\n else if (source.skillPath) {\n selected = skills\n }\n else if (skills.length > 1 && !yes) {\n const choices = await p.autocompleteMultiselect({\n message: `Select skills to install from ${label}`,\n options: skills.map(s => ({\n label: s.name.replace(STATIC_REGEX_1, ''),\n value: s.name,\n hint: s.description || s.path,\n })),\n initialValues: [],\n })\n\n if (p.isCancel(choices))\n return\n\n const selectedNames = new Set(choices)\n selected = skills.filter(s => selectedNames.has(s.name))\n if (selected.length === 0)\n return\n }\n\n mkdirSync(baseDir, { recursive: true })\n\n for (const skill of selected) {\n const skillDir = join(baseDir, skill.name)\n mkdirSync(skillDir, { recursive: true })\n\n writeSkillMd(skillDir, sanitizeMarkdown(skill.content))\n\n if (skill.files.length > 0) {\n for (const f of skill.files) {\n const filePath = join(skillDir, f.path)\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, f.content)\n }\n }\n\n const sourceType = source.type === 'local' ? 'local' : source.type\n installSkill({\n cwd,\n agent,\n global: isGlobal,\n baseDir,\n skillDirName: skill.name,\n lock: {\n source: sourceType,\n repo: source.type === 'local' ? source.localPath : `${source.owner}/${source.repo}`,\n path: skill.path || undefined,\n ref: source.ref || 'main',\n syncedAt: todayIsoDate(),\n generator: 'external',\n },\n skipLinkAgents: true,\n })\n }\n\n if (source.type !== 'local' && source.owner && source.repo) {\n track({\n event: 'install',\n surface: 'cli:add',\n sourceKind: 'gh',\n slug: `${source.owner}/${source.repo}`,\n agent,\n })\n }\n\n for (const skill of selected) {\n const skillRel = relative(cwd, join(baseDir, skill.name))\n const fileLines = ['SKILL.md', ...skill.files.map(f => f.path)]\n .map(f => ` ${styleText('gray', '└')} ${f}`)\n .join('\\n')\n p.log.success(`Installed ${styleText('cyan', skill.name)} ${styleText('gray', `→ ${skillRel}`)}\\n${fileLines}`)\n }\n}\n\nasync function syncGitHubRepo(opts: GitSyncOptions): Promise<void> {\n const { source, agent, global: isGlobal, yes } = opts\n const owner = source.owner!\n const repo = source.repo!\n const cwd = process.cwd()\n const spec = `${owner}/${repo}`\n\n const run = createSyncRun({\n cwd,\n resolver: createGithubResolver(owner, repo),\n agent,\n global: isGlobal,\n force: opts.force,\n debug: opts.debug,\n from: opts.from,\n defaultSections: DEFAULT_SECTIONS,\n })\n bindClackUi(run.hooks, { cwd })\n\n const base = await run.runBase(spec)\n\n if (base.kind !== 'ready')\n return\n\n const { state } = base\n const globalConfig = readConfig()\n let llmConfig: import('./llm-prompts.ts').LlmConfig | null = null\n if (!state.allSectionsCached && !globalConfig.skipLlm && (!yes || opts.model))\n llmConfig = await selectLlmConfig(opts.model)\n\n await run.runEnhance(state, llmConfig)\n\n await shutdownWorker()\n\n track({\n event: 'install',\n surface: 'cli:add',\n sourceKind: 'gh',\n slug: spec,\n agent,\n })\n\n p.outro(`Synced ${spec} to ${relative(cwd, state.skillDir)}`)\n}\n","/**\n * Registry-based skill installation: fetch SKILL.md → write → lockfile → link.\n * No doc resolution, no LLM, no caching. Fast path.\n */\n\nimport type { AgentType } from '../../agent/index.ts'\nimport type { RegistrySkill } from '../../registry/client.ts'\nimport type { TelemetrySurface } from '../../telemetry.ts'\nimport { mkdirSync } from 'node:fs'\nimport { join } from 'pathe'\nimport { writeSkillMd } from '../../agent/prompts/skill.ts'\nimport { installSkill, resolveBaseDir } from '../../agent/skill-installer.ts'\nimport { SHARED_SKILLS_DIR } from '../../core/paths.ts'\nimport { fetchRegistrySkill } from '../../registry/client.ts'\nimport { track } from '../../telemetry.ts'\n\nexport interface SyncRegistryOptions {\n packageName: string\n agent: AgentType\n global?: boolean\n cwd?: string\n /** Skip resolve when caller has already fetched the skill (e.g. after audit gate). */\n prefetched?: RegistrySkill\n surface?: TelemetrySurface\n}\n\nexport async function syncRegistrySkill(opts: SyncRegistryOptions): Promise<RegistrySkill | null> {\n const { packageName, agent, cwd = process.cwd() } = opts\n\n const skill = opts.prefetched ?? await fetchRegistrySkill(packageName)\n if (!skill)\n return null\n\n const sharedDir = join(cwd, SHARED_SKILLS_DIR)\n const skillDir = join(sharedDir, skill.name)\n mkdirSync(skillDir, { recursive: true })\n writeSkillMd(skillDir, skill.content)\n\n const baseDir = resolveBaseDir(cwd, agent, false)\n mkdirSync(baseDir, { recursive: true })\n installSkill({\n cwd,\n agent,\n global: false,\n baseDir,\n skillDirName: skill.name,\n lock: {\n packageName: skill.packageName,\n version: skill.updatedAt,\n repo: skill.repo,\n source: 'registry',\n syncedAt: new Date().toISOString().slice(0, 10),\n generator: 'curator',\n },\n })\n\n track({\n event: 'install',\n surface: opts.surface ?? 'cli:add',\n sourceKind: 'npm',\n slug: packageName,\n agent,\n })\n\n return skill\n}\n","/**\n * Install many skills from a parsed source list. Routes each `SkillSource`\n * to the right pipeline (git, npm registry → npm doc fallback, crate) and\n * collects per-item outcomes for telemetry and `pull` summaries.\n */\n\nimport type { AgentType, OptimizeModel } from '../../agent/index.ts'\nimport type { SkillSource } from '../../core/prefix.ts'\nimport type { AuditResult, RegistryClient } from '../../registry/client.ts'\nimport type { GitSkillSource } from '../../sources/git-skills.ts'\nimport { styleText } from 'node:util'\nimport * as p from '@clack/prompts'\nimport { introLine } from '../../cli/intro.ts'\nimport { COMMA_OR_WHITESPACE_RE } from '../../core/regex.ts'\nimport { getProjectState } from '../../core/skills.ts'\nimport { createRegistryClient, gateInstall } from '../../registry/client.ts'\nimport { track } from '../../telemetry.ts'\nimport { syncGitSkills } from '../sync-git.ts'\nimport { syncCommand } from '../sync.ts'\nimport { syncRegistrySkill } from './registry.ts'\n\nexport type InstallSurface = 'cli:add' | 'cli:pull' | 'cli:prepare' | 'cli:update' | 'cli:wizard'\n\nexport interface InstallOpts {\n agent: AgentType\n surface: InstallSurface\n global?: boolean\n yes?: boolean\n force?: boolean\n debug?: boolean\n model?: OptimizeModel\n skillFilter?: string\n /** Allow installs that fail the upstream audit gate (Step 3 wiring). */\n allowUnsafe?: boolean\n /** Caller-supplied audit cache; pull populates this with pre-fetched results. */\n auditCache?: Map<string, AuditResult>\n}\n\nexport interface InstallSummary {\n installed: number\n skipped: number\n failed: number\n}\n\nconst RECEIPTS_URL = 'https://skilld.dev/gh'\n\nasync function getAudit(\n client: RegistryClient,\n cache: Map<string, AuditResult>,\n owner: string,\n repo: string,\n name: string,\n): Promise<AuditResult> {\n const key = `${owner}/${repo}/${name}`\n const cached = cache.get(key)\n if (cached)\n return cached\n const result = await client.audit({ owner, repo, name })\n cache.set(key, result)\n return result\n}\n\nfunction logAuditWarn(slug: string, result: AuditResult): void {\n const parts = [\n result.riskLevel && `risk: ${result.riskLevel}`,\n result.summary,\n result.audits.filter(a => a.status === 'warn').map(a => a.slug).join(','),\n ].filter(Boolean).join(' · ')\n p.log.warn(`${styleText('yellow', '⚠')} ${slug} ${styleText('gray', parts)}`)\n}\n\nfunction logAuditFail(slug: string, result: AuditResult, owner: string, repo: string, name: string): void {\n const detail = result.audits.filter(a => a.status === 'fail').map(a => a.summary || a.slug).join('; ')\n p.log.error(`${styleText('red', '✗')} ${slug} blocked: ${detail || 'audit failed'}\\n Receipts: ${RECEIPTS_URL}/${owner}/${repo}/${name}`)\n}\n\nexport async function installSkills(items: SkillSource[], opts: InstallOpts): Promise<InstallSummary> {\n const cwd = process.cwd()\n const summary: InstallSummary = { installed: 0, skipped: 0, failed: 0 }\n const client = createRegistryClient()\n const auditCache = opts.auditCache ?? new Map<string, AuditResult>()\n\n const gitSources: Array<{ source: GitSkillSource, skillFilter?: string }> = []\n const npmEntries: Array<{ name: string, spec: string }> = []\n const crateSpecs: string[] = []\n const unsupported: string[] = []\n\n for (const source of items) {\n switch (source.type) {\n case 'git':\n gitSources.push({ source: source.source, skillFilter: source.skillFilter })\n break\n case 'npm':\n npmEntries.push({ name: source.package, spec: source.tag ? `${source.package}@${source.tag}` : source.package })\n break\n case 'crate':\n crateSpecs.push(source.version ? `crate:${source.package}@${source.version}` : `crate:${source.package}`)\n break\n case 'bare':\n p.log.warn(`Bare names are deprecated. Use ${styleText('cyan', `npm:${source.package}`)} instead.`)\n npmEntries.push({ name: source.package, spec: source.tag ? `${source.package}@${source.tag}` : source.package })\n break\n case 'curator':\n unsupported.push(`@${source.handle} (curator)`)\n break\n case 'collection':\n unsupported.push(`@${source.handle}/${source.name} (collection)`)\n break\n default: {\n const _exhaustive: never = source\n throw new Error(`Unhandled SkillSource type: ${JSON.stringify(_exhaustive)}`)\n }\n }\n }\n\n if (unsupported.length > 0) {\n p.log.error(`Curator and collection installs are not yet available:\\n ${unsupported.join('\\n ')}\\n\\nFollow https://skilld.dev for launch updates.`)\n summary.skipped += unsupported.length\n process.exitCode = 1\n if (gitSources.length === 0 && npmEntries.length === 0 && crateSpecs.length === 0)\n return summary\n }\n\n for (const { source, skillFilter: perSourceFilter } of gitSources) {\n // Per-source filter (from a pull manifest) wins over the global flag.\n const filterRaw = perSourceFilter ?? opts.skillFilter\n const skillFilter = filterRaw\n ? filterRaw.split(COMMA_OR_WHITESPACE_RE).map(s => s.trim()).filter(Boolean)\n : undefined\n await syncGitSkills({\n source,\n global: !!opts.global,\n agent: opts.agent,\n yes: !!opts.yes,\n model: opts.model,\n force: opts.force,\n debug: opts.debug,\n skillFilter,\n })\n .then(() => { summary.installed += 1 })\n .catch((err) => {\n summary.failed += 1\n p.log.error(`Failed to install ${source.type === 'local' ? source.localPath : `${source.owner}/${source.repo}`}: ${err instanceof Error ? err.message : String(err)}`)\n })\n }\n\n if (npmEntries.length > 0) {\n const seen = new Set<string>()\n const dedupedEntries = npmEntries.filter((e) => {\n if (seen.has(e.name))\n return false\n seen.add(e.name)\n return true\n })\n\n const fallbackPackages: string[] = []\n for (const entry of dedupedEntries) {\n const resolved = await client.resolveSkill(entry.name).catch(() => null)\n if (!resolved) {\n fallbackPackages.push(entry.spec)\n continue\n }\n\n const [auditOwner, auditRepo] = resolved.repo.split('/')\n const audit = await getAudit(client, auditCache, auditOwner!, auditRepo!, resolved.name)\n const decision = gateInstall(audit, { allowUnsafe: opts.allowUnsafe, yes: opts.yes, sourceKind: 'npm' })\n\n const slug = `${resolved.repo}/${resolved.name}`\n if (audit.status === 'warn') {\n logAuditWarn(slug, audit)\n track({ event: 'audit-warn', surface: opts.surface, sourceKind: 'npm', slug, agent: opts.agent })\n }\n if (audit.status === 'fail') {\n logAuditFail(slug, audit, auditOwner!, auditRepo!, resolved.name)\n track({ event: 'audit-fail', surface: opts.surface, sourceKind: 'npm', slug, agent: opts.agent })\n }\n if (decision === 'skip') {\n track({ event: 'audit-blocked', surface: opts.surface, sourceKind: 'npm', slug, agent: opts.agent })\n summary.skipped += 1\n continue\n }\n\n const result = await syncRegistrySkill({ packageName: entry.name, agent: opts.agent, cwd, prefetched: resolved, surface: opts.surface })\n .catch((err) => {\n summary.failed += 1\n p.log.error(`Failed to install ${entry.name}: ${err instanceof Error ? err.message : String(err)}`)\n return null\n })\n if (result) {\n p.log.success(`Installed ${styleText('cyan', result.name)} from registry`)\n summary.installed += 1\n }\n else if (result === null) {\n fallbackPackages.push(entry.spec)\n }\n }\n\n if (fallbackPackages.length > 0) {\n const state = await getProjectState(cwd)\n p.intro(introLine({ state, agentId: opts.agent }))\n await syncCommand(state, {\n packages: [...fallbackPackages, ...crateSpecs],\n global: !!opts.global,\n agent: opts.agent,\n model: opts.model,\n yes: !!opts.yes,\n force: opts.force,\n debug: opts.debug,\n })\n summary.installed += fallbackPackages.length + crateSpecs.length\n return summary\n }\n }\n\n if (crateSpecs.length > 0) {\n const state = await getProjectState(cwd)\n p.intro(introLine({ state, agentId: opts.agent }))\n await syncCommand(state, {\n packages: crateSpecs,\n global: !!opts.global,\n agent: opts.agent,\n model: opts.model,\n yes: !!opts.yes,\n force: opts.force,\n debug: opts.debug,\n })\n summary.installed += crateSpecs.length\n }\n\n return summary\n}\n"],"mappings":"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"}