skilld 0.4.0 → 0.4.2

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.
@@ -1,302 +0,0 @@
1
- import { a as optimizeDocs, b as targets, c as computeSkillDirName, o as generateSkillMd, r as getModelLabel, u as linkSkillToAgents } from "./detect-imports.mjs";
2
- import { o as getVersionKey } from "./config.mjs";
3
- import { g as resolvePkgDir, i as getPkgKeyFiles, o as hasShippedDocs, p as listReferenceFiles, r as ensureCacheDir, s as isCached, u as linkPkgNamed } from "./storage.mjs";
4
- import "../cache/index.mjs";
5
- import { h as searchNpmPackages, l as readLocalDependencies, m as resolvePackageDocsWithAttempts, o as fetchPkgDist } from "./releases.mjs";
6
- import "./git-skills.mjs";
7
- import "../sources/index.mjs";
8
- import "../agent/index.mjs";
9
- import { S as registerProject, _ as writeLock, a as fetchAndCacheResources, b as defaultFeatures, c as handleShippedSkills, d as resolveBaseDir, f as resolveLocalDep, g as readLock, h as parsePackages, i as detectChangelog, l as indexResources, m as getSharedSkillsDir, n as selectLlmConfig, o as findRelatedSkills, p as SHARED_SKILLS_DIR, r as RESOLVE_STEP_LABELS, s as forceClearCache, t as ensureGitignore, u as linkAllReferences, v as formatDuration, x as readConfig } from "../cli.mjs";
10
- import { join } from "pathe";
11
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
12
- import pLimit from "p-limit";
13
- import * as p from "@clack/prompts";
14
- import logUpdate from "log-update";
15
- const STATUS_ICONS = {
16
- pending: "○",
17
- resolving: "◐",
18
- downloading: "◒",
19
- embedding: "◓",
20
- exploring: "◔",
21
- thinking: "◔",
22
- generating: "◑",
23
- done: "✓",
24
- error: "✗"
25
- };
26
- const STATUS_COLORS = {
27
- pending: "\x1B[90m",
28
- resolving: "\x1B[36m",
29
- downloading: "\x1B[36m",
30
- embedding: "\x1B[36m",
31
- exploring: "\x1B[34m",
32
- thinking: "\x1B[35m",
33
- generating: "\x1B[33m",
34
- done: "\x1B[32m",
35
- error: "\x1B[31m"
36
- };
37
- async function syncPackagesParallel(config) {
38
- const { packages, concurrency = 5 } = config;
39
- const agent = targets[config.agent];
40
- const states = /* @__PURE__ */ new Map();
41
- const cwd = process.cwd();
42
- for (const pkg of packages) states.set(pkg, {
43
- name: pkg,
44
- status: "pending",
45
- message: "Waiting..."
46
- });
47
- function render() {
48
- const maxNameLen = Math.max(...packages.map((p) => p.length), 20);
49
- const lines = [...states.values()].map((s) => {
50
- const icon = STATUS_ICONS[s.status];
51
- const color = STATUS_COLORS[s.status];
52
- const reset = "\x1B[0m";
53
- const dim = "\x1B[90m";
54
- const name = s.name.padEnd(maxNameLen);
55
- const version = s.version ? `${dim}${s.version}${reset} ` : "";
56
- const elapsed = (s.status === "done" || s.status === "error") && s.startedAt && s.completedAt ? ` ${dim}(${formatDuration(s.completedAt - s.startedAt)})${reset}` : "";
57
- const preview = s.streamPreview ? ` ${dim}${s.streamPreview}${reset}` : "";
58
- return ` ${color}${icon}${reset} ${name} ${version}${s.message}${elapsed}${preview}`;
59
- });
60
- const doneCount = [...states.values()].filter((s) => s.status === "done").length;
61
- const errorCount = [...states.values()].filter((s) => s.status === "error").length;
62
- logUpdate(`\x1B[1mSyncing ${packages.length} packages\x1B[0m (${doneCount} done${errorCount > 0 ? `, ${errorCount} failed` : ""})\n` + lines.join("\n"));
63
- }
64
- function update(pkg, status, message, version) {
65
- const state = states.get(pkg);
66
- if (!state.startedAt && status !== "pending") state.startedAt = performance.now();
67
- if ((status === "done" || status === "error") && !state.completedAt) state.completedAt = performance.now();
68
- state.status = status;
69
- state.message = message;
70
- state.streamPreview = void 0;
71
- if (version) state.version = version;
72
- render();
73
- }
74
- ensureCacheDir();
75
- render();
76
- const limit = pLimit(concurrency);
77
- const skillData = /* @__PURE__ */ new Map();
78
- const baseResults = await Promise.allSettled(packages.map((pkg) => limit(() => syncBaseSkill(pkg, config, cwd, update))));
79
- logUpdate.done();
80
- const successfulPkgs = [];
81
- const shippedPkgs = [];
82
- const errors = [];
83
- for (let i = 0; i < baseResults.length; i++) {
84
- const r = baseResults[i];
85
- if (r.status === "fulfilled" && r.value !== "shipped") {
86
- successfulPkgs.push(packages[i]);
87
- skillData.set(packages[i], r.value);
88
- } else if (r.status === "fulfilled" && r.value === "shipped") shippedPkgs.push(packages[i]);
89
- else if (r.status === "rejected") {
90
- const err = r.reason;
91
- const reason = err instanceof Error ? `${err.message}\n${err.stack}` : String(err);
92
- errors.push({
93
- pkg: packages[i],
94
- reason
95
- });
96
- }
97
- }
98
- const skillMsg = `Created ${successfulPkgs.length} base skills${shippedPkgs.length > 1 ? ` (Skipping ${shippedPkgs.length})` : ""}`;
99
- p.log.success(skillMsg);
100
- if (errors.length > 0) for (const { pkg, reason } of errors) p.log.error(` ${pkg}: ${reason}`);
101
- const globalConfig = readConfig();
102
- if (successfulPkgs.length > 0 && !globalConfig.skipLlm && !(config.yes && !config.model)) {
103
- const llmConfig = await selectLlmConfig(config.model);
104
- if (llmConfig) {
105
- p.log.step(getModelLabel(llmConfig.model));
106
- for (const pkg of successfulPkgs) states.set(pkg, {
107
- name: pkg,
108
- status: "pending",
109
- message: "Waiting..."
110
- });
111
- render();
112
- const llmResults = await Promise.allSettled(successfulPkgs.map((pkg) => limit(() => enhanceWithLLM(pkg, skillData.get(pkg), {
113
- ...config,
114
- model: llmConfig.model
115
- }, cwd, update, llmConfig.sections, llmConfig.customPrompt))));
116
- logUpdate.done();
117
- const llmSucceeded = llmResults.filter((r) => r.status === "fulfilled").length;
118
- p.log.success(`Enhanced ${llmSucceeded}/${successfulPkgs.length} skills with LLM`);
119
- }
120
- }
121
- await ensureGitignore(getSharedSkillsDir(cwd) ? SHARED_SKILLS_DIR : agent.skillsDir, cwd, config.global);
122
- const { shutdownWorker } = await import("./pool.mjs");
123
- await shutdownWorker();
124
- p.outro(`Synced ${successfulPkgs.length}/${packages.length} packages`);
125
- }
126
- async function syncBaseSkill(packageName, config, cwd, update) {
127
- const localVersion = (await readLocalDependencies(cwd).catch(() => [])).find((d) => d.name === packageName)?.version;
128
- const { package: resolvedPkg, attempts } = await resolvePackageDocsWithAttempts(packageName, {
129
- version: localVersion,
130
- cwd,
131
- onProgress: (step) => update(packageName, "resolving", RESOLVE_STEP_LABELS[step])
132
- });
133
- let resolved = resolvedPkg;
134
- if (!resolved) {
135
- update(packageName, "resolving", "Local package...");
136
- resolved = await resolveLocalDep(packageName, cwd);
137
- }
138
- if (!resolved) {
139
- const npmAttempt = attempts.find((a) => a.source === "npm");
140
- let reason;
141
- if (npmAttempt?.status === "not-found") {
142
- const suggestions = await searchNpmPackages(packageName, 3);
143
- const hint = suggestions.length > 0 ? ` (try: ${suggestions.map((s) => s.name).join(", ")})` : "";
144
- reason = (npmAttempt.message || "Not on npm") + hint;
145
- } else reason = attempts.filter((a) => a.status !== "success").map((a) => a.message || a.source).join("; ") || "No docs found";
146
- update(packageName, "error", reason);
147
- throw new Error(`Could not find docs for: ${packageName}`);
148
- }
149
- const version = localVersion || resolved.version || "latest";
150
- const versionKey = getVersionKey(version);
151
- if (!existsSync(join(cwd, "node_modules", packageName))) {
152
- update(packageName, "downloading", "Downloading dist...", versionKey);
153
- await fetchPkgDist(packageName, version);
154
- }
155
- const shippedResult = handleShippedSkills(packageName, version, cwd, config.agent, config.global);
156
- if (shippedResult) {
157
- const shared = !config.global && getSharedSkillsDir(cwd);
158
- if (shared) for (const shipped of shippedResult.shipped) linkSkillToAgents(shipped.skillName, shared, cwd);
159
- update(packageName, "done", "Published SKILL.md", versionKey);
160
- return "shipped";
161
- }
162
- if (config.force) forceClearCache(packageName, version);
163
- const useCache = isCached(packageName, version);
164
- if (useCache) update(packageName, "downloading", "Using cache", versionKey);
165
- else update(packageName, "downloading", config.force ? "Re-fetching docs..." : "Fetching docs...", versionKey);
166
- const baseDir = resolveBaseDir(cwd, config.agent, config.global);
167
- const skillDirName = computeSkillDirName(packageName, resolved.repoUrl);
168
- const skillDir = join(baseDir, skillDirName);
169
- mkdirSync(skillDir, { recursive: true });
170
- const features = readConfig().features ?? defaultFeatures;
171
- const resources = await fetchAndCacheResources({
172
- packageName,
173
- resolved,
174
- version,
175
- useCache,
176
- features,
177
- onProgress: (msg) => update(packageName, "downloading", msg, versionKey)
178
- });
179
- update(packageName, "downloading", "Linking references...", versionKey);
180
- linkAllReferences(skillDir, packageName, cwd, version, resources.docsType);
181
- update(packageName, "embedding", "Indexing docs", versionKey);
182
- await indexResources({
183
- packageName,
184
- version,
185
- cwd,
186
- docsToIndex: resources.docsToIndex,
187
- features,
188
- onProgress: (msg) => update(packageName, "embedding", msg, versionKey)
189
- });
190
- const hasChangelog = detectChangelog(resolvePkgDir(packageName, cwd, version));
191
- const relatedSkills = await findRelatedSkills(packageName, baseDir);
192
- const shippedDocs = hasShippedDocs(packageName, cwd, version);
193
- const pkgFiles = getPkgKeyFiles(packageName, cwd, version);
194
- const repoSlug = resolved.repoUrl?.match(/github\.com\/([^/]+\/[^/]+?)(?:\.git)?(?:[/#]|$)/)?.[1];
195
- linkPkgNamed(skillDir, packageName, cwd, version);
196
- writeLock(baseDir, skillDirName, {
197
- packageName,
198
- version,
199
- repo: repoSlug,
200
- source: resources.docSource,
201
- syncedAt: (/* @__PURE__ */ new Date()).toISOString().split("T")[0],
202
- generator: "skilld"
203
- });
204
- const updatedLock = readLock(baseDir)?.skills[skillDirName];
205
- const allPackages = parsePackages(updatedLock?.packages).map((p) => ({ name: p.name }));
206
- const skillMd = generateSkillMd({
207
- name: packageName,
208
- version,
209
- releasedAt: resolved.releasedAt,
210
- description: resolved.description,
211
- dependencies: resolved.dependencies,
212
- distTags: resolved.distTags,
213
- relatedSkills,
214
- hasIssues: resources.hasIssues,
215
- hasDiscussions: resources.hasDiscussions,
216
- hasReleases: resources.hasReleases,
217
- hasChangelog,
218
- docsType: resources.docsType,
219
- hasShippedDocs: shippedDocs,
220
- pkgFiles,
221
- dirName: skillDirName,
222
- packages: allPackages.length > 1 ? allPackages : void 0,
223
- repoUrl: resolved.repoUrl
224
- });
225
- writeFileSync(join(skillDir, "SKILL.md"), skillMd);
226
- const shared = !config.global && getSharedSkillsDir(cwd);
227
- if (shared) linkSkillToAgents(skillDirName, shared, cwd);
228
- if (!config.global) registerProject(cwd);
229
- update(packageName, "done", "Base skill created", versionKey);
230
- return {
231
- resolved,
232
- version,
233
- skillDirName,
234
- docsType: resources.docsType,
235
- hasIssues: resources.hasIssues,
236
- hasDiscussions: resources.hasDiscussions,
237
- hasReleases: resources.hasReleases,
238
- hasChangelog,
239
- shippedDocs,
240
- pkgFiles,
241
- relatedSkills,
242
- packages: allPackages.length > 1 ? allPackages : void 0
243
- };
244
- }
245
- async function enhanceWithLLM(packageName, data, config, cwd, update, sections, customPrompt) {
246
- const versionKey = getVersionKey(data.version);
247
- const skillDir = join(resolveBaseDir(cwd, config.agent, config.global), data.skillDirName);
248
- const hasGithub = data.hasIssues || data.hasDiscussions;
249
- const docFiles = listReferenceFiles(skillDir);
250
- update(packageName, "generating", config.model, versionKey);
251
- const { optimized, wasOptimized, error } = await optimizeDocs({
252
- packageName,
253
- skillDir,
254
- model: config.model,
255
- version: data.version,
256
- hasGithub,
257
- hasReleases: data.hasReleases,
258
- hasChangelog: data.hasChangelog,
259
- docFiles,
260
- docsType: data.docsType,
261
- hasShippedDocs: data.shippedDocs,
262
- noCache: config.force,
263
- debug: config.debug,
264
- sections,
265
- customPrompt,
266
- onProgress: (progress) => {
267
- const status = progress.type === "reasoning" ? "exploring" : "generating";
268
- const sectionPrefix = progress.section ? `[${progress.section}] ` : "";
269
- update(packageName, status, progress.chunk.startsWith("[") ? `${sectionPrefix}${progress.chunk}` : `${sectionPrefix}${config.model}`, versionKey);
270
- }
271
- });
272
- if (error) {
273
- update(packageName, "error", error, versionKey);
274
- throw new Error(error);
275
- }
276
- if (wasOptimized) {
277
- const skillMd = generateSkillMd({
278
- name: packageName,
279
- version: data.version,
280
- releasedAt: data.resolved.releasedAt,
281
- dependencies: data.resolved.dependencies,
282
- distTags: data.resolved.distTags,
283
- body: optimized,
284
- relatedSkills: data.relatedSkills,
285
- hasIssues: data.hasIssues,
286
- hasDiscussions: data.hasDiscussions,
287
- hasReleases: data.hasReleases,
288
- hasChangelog: data.hasChangelog,
289
- docsType: data.docsType,
290
- hasShippedDocs: data.shippedDocs,
291
- pkgFiles: data.pkgFiles,
292
- dirName: data.skillDirName,
293
- packages: data.packages,
294
- repoUrl: data.resolved.repoUrl
295
- });
296
- writeFileSync(join(skillDir, "SKILL.md"), skillMd);
297
- }
298
- update(packageName, "done", "Skill optimized", versionKey);
299
- }
300
- export { syncPackagesParallel };
301
-
302
- //# sourceMappingURL=sync-parallel.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-parallel.mjs","names":["agents"],"sources":["../../src/commands/sync-parallel.ts"],"sourcesContent":["import type { AgentType, CustomPrompt, OptimizeModel, SkillSection } from '../agent'\nimport type { ResolvedPackage } from '../sources'\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport logUpdate from 'log-update'\nimport pLimit from 'p-limit'\nimport { join } from 'pathe'\nimport {\n agents,\n computeSkillDirName,\n\n generateSkillMd,\n getModelLabel,\n linkSkillToAgents,\n optimizeDocs,\n\n} from '../agent'\nimport {\n ensureCacheDir,\n getPkgKeyFiles,\n getVersionKey,\n hasShippedDocs,\n isCached,\n linkPkgNamed,\n listReferenceFiles,\n resolvePkgDir,\n} from '../cache'\nimport { defaultFeatures, readConfig, registerProject } from '../core/config'\nimport { formatDuration } from '../core/formatting'\nimport { parsePackages, readLock, writeLock } from '../core/lockfile'\nimport { getSharedSkillsDir, SHARED_SKILLS_DIR } from '../core/shared'\nimport {\n fetchPkgDist,\n readLocalDependencies,\n resolvePackageDocsWithAttempts,\n searchNpmPackages,\n} from '../sources'\n\nimport { ensureGitignore, selectLlmConfig } from './sync'\nimport {\n detectChangelog,\n fetchAndCacheResources,\n findRelatedSkills,\n forceClearCache,\n handleShippedSkills,\n indexResources,\n linkAllReferences,\n RESOLVE_STEP_LABELS,\n resolveBaseDir,\n resolveLocalDep,\n} from './sync-shared'\n\ntype PackageStatus = 'pending' | 'resolving' | 'downloading' | 'embedding' | 'exploring' | 'thinking' | 'generating' | 'done' | 'error'\n\ninterface PackageState {\n name: string\n status: PackageStatus\n message: string\n version?: string\n streamPreview?: string\n startedAt?: number\n completedAt?: number\n}\n\nconst STATUS_ICONS: Record<PackageStatus, string> = {\n pending: '○',\n resolving: '◐',\n downloading: '◒',\n embedding: '◓',\n exploring: '◔',\n thinking: '◔',\n generating: '◑',\n done: '✓',\n error: '✗',\n}\n\nconst STATUS_COLORS: Record<PackageStatus, string> = {\n pending: '\\x1B[90m',\n resolving: '\\x1B[36m',\n downloading: '\\x1B[36m',\n embedding: '\\x1B[36m',\n exploring: '\\x1B[34m', // Blue for exploring\n thinking: '\\x1B[35m', // Magenta for thinking\n generating: '\\x1B[33m',\n done: '\\x1B[32m',\n error: '\\x1B[31m',\n}\n\nexport interface ParallelSyncConfig {\n packages: string[]\n global: boolean\n agent: AgentType\n model?: OptimizeModel\n yes?: boolean\n force?: boolean\n debug?: boolean\n concurrency?: number\n}\n\n/** Data passed from phase 1 (base skill) to phase 2 (LLM enhancement) */\ninterface BaseSkillData {\n resolved: ResolvedPackage\n version: string\n skillDirName: string\n docsType: 'llms.txt' | 'readme' | 'docs'\n hasIssues: boolean\n hasDiscussions: boolean\n hasReleases: boolean\n hasChangelog: string | false\n shippedDocs: boolean\n pkgFiles: string[]\n relatedSkills: string[]\n packages?: Array<{ name: string }>\n}\n\nexport async function syncPackagesParallel(config: ParallelSyncConfig): Promise<void> {\n const { packages, concurrency = 5 } = config\n const agent = agents[config.agent]\n const states = new Map<string, PackageState>()\n const cwd = process.cwd()\n\n // Initialize all packages as pending\n for (const pkg of packages) {\n states.set(pkg, { name: pkg, status: 'pending', message: 'Waiting...' })\n }\n\n // Render function\n function render() {\n const maxNameLen = Math.max(...packages.map(p => p.length), 20)\n const lines = [...states.values()].map((s) => {\n const icon = STATUS_ICONS[s.status]\n const color = STATUS_COLORS[s.status]\n const reset = '\\x1B[0m'\n const dim = '\\x1B[90m'\n const name = s.name.padEnd(maxNameLen)\n const version = s.version ? `${dim}${s.version}${reset} ` : ''\n const elapsed = (s.status === 'done' || s.status === 'error') && s.startedAt && s.completedAt\n ? ` ${dim}(${formatDuration(s.completedAt - s.startedAt)})${reset}`\n : ''\n const preview = s.streamPreview ? ` ${dim}${s.streamPreview}${reset}` : ''\n return ` ${color}${icon}${reset} ${name} ${version}${s.message}${elapsed}${preview}`\n })\n\n const doneCount = [...states.values()].filter(s => s.status === 'done').length\n const errorCount = [...states.values()].filter(s => s.status === 'error').length\n const header = `\\x1B[1mSyncing ${packages.length} packages\\x1B[0m (${doneCount} done${errorCount > 0 ? `, ${errorCount} failed` : ''})\\n`\n\n logUpdate(header + lines.join('\\n'))\n }\n\n function update(pkg: string, status: PackageStatus, message: string, version?: string) {\n const state = states.get(pkg)!\n if (!state.startedAt && status !== 'pending')\n state.startedAt = performance.now()\n if ((status === 'done' || status === 'error') && !state.completedAt)\n state.completedAt = performance.now()\n state.status = status\n state.message = message\n state.streamPreview = undefined // Clear preview on status change\n if (version)\n state.version = version\n render()\n }\n\n ensureCacheDir()\n render()\n\n const limit = pLimit(concurrency)\n\n // Phase 1: Generate base skills (no LLM)\n const skillData = new Map<string, BaseSkillData>()\n const baseResults = await Promise.allSettled(\n packages.map(pkg =>\n limit(() => syncBaseSkill(pkg, config, cwd, update)),\n ),\n )\n\n logUpdate.done()\n\n // Collect successful packages for LLM phase (exclude shipped — they need no LLM)\n const successfulPkgs: string[] = []\n const shippedPkgs: string[] = []\n const errors: Array<{ pkg: string, reason: string }> = []\n for (let i = 0; i < baseResults.length; i++) {\n const r = baseResults[i]!\n if (r.status === 'fulfilled' && r.value !== 'shipped') {\n successfulPkgs.push(packages[i]!)\n skillData.set(packages[i]!, r.value)\n }\n else if (r.status === 'fulfilled' && r.value === 'shipped') {\n shippedPkgs.push(packages[i]!)\n }\n else if (r.status === 'rejected') {\n const err = r.reason\n const reason = err instanceof Error ? `${err.message}\\n${err.stack}` : String(err)\n errors.push({ pkg: packages[i]!, reason })\n }\n }\n\n const skillMsg = `Created ${successfulPkgs.length} base skills${shippedPkgs.length > 1 ? ` (Skipping ${shippedPkgs.length})` : ''}`\n p.log.success(skillMsg)\n\n if (errors.length > 0) {\n for (const { pkg, reason } of errors) {\n p.log.error(` ${pkg}: ${reason}`)\n }\n }\n\n // Phase 2: Ask about LLM enhancement (skip if -y without model, or skipLlm config)\n const globalConfig = readConfig()\n if (successfulPkgs.length > 0 && !globalConfig.skipLlm && !(config.yes && !config.model)) {\n const llmConfig = await selectLlmConfig(config.model)\n\n if (llmConfig) {\n p.log.step(getModelLabel(llmConfig.model))\n // Reset states for LLM phase\n for (const pkg of successfulPkgs) {\n states.set(pkg, { name: pkg, status: 'pending', message: 'Waiting...' })\n }\n render()\n\n const llmResults = await Promise.allSettled(\n successfulPkgs.map(pkg =>\n limit(() => enhanceWithLLM(pkg, skillData.get(pkg)!, { ...config, model: llmConfig.model }, cwd, update, llmConfig.sections, llmConfig.customPrompt)),\n ),\n )\n\n logUpdate.done()\n\n const llmSucceeded = llmResults.filter(r => r.status === 'fulfilled').length\n p.log.success(`Enhanced ${llmSucceeded}/${successfulPkgs.length} skills with LLM`)\n }\n }\n\n const parallelShared = getSharedSkillsDir(cwd)\n await ensureGitignore(parallelShared ? SHARED_SKILLS_DIR : agent.skillsDir, cwd, config.global)\n\n const { shutdownWorker } = await import('../retriv/pool')\n await shutdownWorker()\n\n p.outro(`Synced ${successfulPkgs.length}/${packages.length} packages`)\n}\n\ntype UpdateFn = (pkg: string, status: PackageStatus, message: string, version?: string) => void\n\n/** Phase 1: Generate base skill (no LLM). Returns 'shipped' if shipped skill was linked, or BaseSkillData. */\nasync function syncBaseSkill(\n packageName: string,\n config: ParallelSyncConfig,\n cwd: string,\n update: UpdateFn,\n): Promise<'shipped' | BaseSkillData> {\n const localDeps = await readLocalDependencies(cwd).catch(() => [])\n const localVersion = localDeps.find(d => d.name === packageName)?.version\n\n const { package: resolvedPkg, attempts } = await resolvePackageDocsWithAttempts(packageName, {\n version: localVersion,\n cwd,\n onProgress: step => update(packageName, 'resolving', RESOLVE_STEP_LABELS[step]),\n })\n let resolved = resolvedPkg\n\n if (!resolved) {\n update(packageName, 'resolving', 'Local package...')\n resolved = await resolveLocalDep(packageName, cwd)\n }\n\n if (!resolved) {\n const npmAttempt = attempts.find(a => a.source === 'npm')\n let reason: string\n if (npmAttempt?.status === 'not-found') {\n const suggestions = await searchNpmPackages(packageName, 3)\n const hint = suggestions.length > 0\n ? ` (try: ${suggestions.map(s => s.name).join(', ')})`\n : ''\n reason = (npmAttempt.message || 'Not on npm') + hint\n }\n else {\n const failed = attempts.filter(a => a.status !== 'success')\n const messages = failed.map(a => a.message || a.source).join('; ')\n reason = messages || 'No docs found'\n }\n update(packageName, 'error', reason)\n throw new Error(`Could not find docs for: ${packageName}`)\n }\n\n const version = localVersion || resolved.version || 'latest'\n const versionKey = getVersionKey(version)\n\n // Download npm dist if not in node_modules\n if (!existsSync(join(cwd, 'node_modules', packageName))) {\n update(packageName, 'downloading', 'Downloading dist...', versionKey)\n await fetchPkgDist(packageName, version)\n }\n\n // Shipped skills: symlink directly, skip all doc fetching/caching/LLM\n const shippedResult = handleShippedSkills(packageName, version, cwd, config.agent, config.global)\n if (shippedResult) {\n const shared = !config.global && getSharedSkillsDir(cwd)\n if (shared) {\n for (const shipped of shippedResult.shipped)\n linkSkillToAgents(shipped.skillName, shared, cwd)\n }\n update(packageName, 'done', 'Published SKILL.md', versionKey)\n return 'shipped'\n }\n\n // Force: nuke cached references + search index so all existsSync guards re-fetch\n if (config.force) {\n forceClearCache(packageName, version)\n }\n\n const useCache = isCached(packageName, version)\n if (useCache) {\n update(packageName, 'downloading', 'Using cache', versionKey)\n }\n else {\n update(packageName, 'downloading', config.force ? 'Re-fetching docs...' : 'Fetching docs...', versionKey)\n }\n\n const baseDir = resolveBaseDir(cwd, config.agent, config.global)\n const skillDirName = computeSkillDirName(packageName, resolved.repoUrl)\n const skillDir = join(baseDir, skillDirName)\n mkdirSync(skillDir, { recursive: true })\n\n const features = readConfig().features ?? defaultFeatures\n\n // Fetch & cache all resources (docs cascade + issues + discussions + releases)\n const resources = await fetchAndCacheResources({\n packageName,\n resolved,\n version,\n useCache,\n features,\n onProgress: msg => update(packageName, 'downloading', msg, versionKey),\n })\n\n // Create symlinks\n update(packageName, 'downloading', 'Linking references...', versionKey)\n linkAllReferences(skillDir, packageName, cwd, version, resources.docsType)\n\n // Index all resources (single batch)\n update(packageName, 'embedding', 'Indexing docs', versionKey)\n await indexResources({\n packageName,\n version,\n cwd,\n docsToIndex: resources.docsToIndex,\n features,\n onProgress: msg => update(packageName, 'embedding', msg, versionKey),\n })\n\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const hasChangelog = detectChangelog(pkgDir)\n const relatedSkills = await findRelatedSkills(packageName, baseDir)\n const shippedDocs = hasShippedDocs(packageName, cwd, version)\n const pkgFiles = getPkgKeyFiles(packageName, cwd, version)\n\n // Write base SKILL.md\n const repoSlug = resolved.repoUrl?.match(/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?(?:[/#]|$)/)?.[1]\n\n // Create named symlink for this package\n linkPkgNamed(skillDir, packageName, cwd, version)\n\n writeLock(baseDir, skillDirName, {\n packageName,\n version,\n repo: repoSlug,\n source: resources.docSource,\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n\n // Read back merged packages from lockfile\n const updatedLock = readLock(baseDir)?.skills[skillDirName]\n const allPackages = parsePackages(updatedLock?.packages).map(p => ({ name: p.name }))\n\n const skillMd = generateSkillMd({\n name: packageName,\n version,\n releasedAt: resolved.releasedAt,\n description: resolved.description,\n dependencies: resolved.dependencies,\n distTags: resolved.distTags,\n relatedSkills,\n hasIssues: resources.hasIssues,\n hasDiscussions: resources.hasDiscussions,\n hasReleases: resources.hasReleases,\n hasChangelog,\n docsType: resources.docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n dirName: skillDirName,\n packages: allPackages.length > 1 ? allPackages : undefined,\n repoUrl: resolved.repoUrl,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n\n // Link shared dir to per-agent dirs\n const shared = !config.global && getSharedSkillsDir(cwd)\n if (shared)\n linkSkillToAgents(skillDirName, shared, cwd)\n\n if (!config.global) {\n registerProject(cwd)\n }\n\n update(packageName, 'done', 'Base skill created', versionKey)\n\n return {\n resolved,\n version,\n skillDirName,\n docsType: resources.docsType,\n hasIssues: resources.hasIssues,\n hasDiscussions: resources.hasDiscussions,\n hasReleases: resources.hasReleases,\n hasChangelog,\n shippedDocs,\n pkgFiles,\n relatedSkills,\n packages: allPackages.length > 1 ? allPackages : undefined,\n }\n}\n\n/** Phase 2: Enhance skill with LLM */\nasync function enhanceWithLLM(\n packageName: string,\n data: BaseSkillData,\n config: ParallelSyncConfig & { model: OptimizeModel },\n cwd: string,\n update: UpdateFn,\n sections?: SkillSection[],\n customPrompt?: CustomPrompt,\n): Promise<void> {\n const versionKey = getVersionKey(data.version)\n const baseDir = resolveBaseDir(cwd, config.agent, config.global)\n const skillDir = join(baseDir, data.skillDirName)\n\n const hasGithub = data.hasIssues || data.hasDiscussions\n const docFiles = listReferenceFiles(skillDir)\n\n update(packageName, 'generating', config.model, versionKey)\n const { optimized, wasOptimized, error } = await optimizeDocs({\n packageName,\n skillDir,\n model: config.model,\n version: data.version,\n hasGithub,\n hasReleases: data.hasReleases,\n hasChangelog: data.hasChangelog,\n docFiles,\n docsType: data.docsType,\n hasShippedDocs: data.shippedDocs,\n noCache: config.force,\n debug: config.debug,\n sections,\n customPrompt,\n onProgress: (progress) => {\n const isReasoning = progress.type === 'reasoning'\n const status = isReasoning ? 'exploring' : 'generating'\n const sectionPrefix = progress.section ? `[${progress.section}] ` : ''\n const label = progress.chunk.startsWith('[') ? `${sectionPrefix}${progress.chunk}` : `${sectionPrefix}${config.model}`\n update(packageName, status, label, versionKey)\n },\n })\n\n if (error) {\n update(packageName, 'error', error, versionKey)\n throw new Error(error)\n }\n\n if (wasOptimized) {\n const skillMd = generateSkillMd({\n name: packageName,\n version: data.version,\n releasedAt: data.resolved.releasedAt,\n dependencies: data.resolved.dependencies,\n distTags: data.resolved.distTags,\n body: optimized,\n relatedSkills: data.relatedSkills,\n hasIssues: data.hasIssues,\n hasDiscussions: data.hasDiscussions,\n hasReleases: data.hasReleases,\n hasChangelog: data.hasChangelog,\n docsType: data.docsType,\n hasShippedDocs: data.shippedDocs,\n pkgFiles: data.pkgFiles,\n dirName: data.skillDirName,\n packages: data.packages,\n repoUrl: data.resolved.repoUrl,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n }\n\n update(packageName, 'done', 'Skill optimized', versionKey)\n}\n"],"mappings":"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"}