skilld 1.2.1 → 1.2.3
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.
- package/dist/_chunks/agent.mjs +4 -0
- package/dist/_chunks/agent.mjs.map +1 -1
- package/dist/_chunks/cache2.mjs +14 -6
- package/dist/_chunks/cache2.mjs.map +1 -1
- package/dist/_chunks/index2.d.mts.map +1 -1
- package/dist/_chunks/install.mjs +2 -1
- package/dist/_chunks/install.mjs.map +1 -1
- package/dist/_chunks/prompts.mjs +1 -1
- package/dist/_chunks/sanitize.mjs +8 -1
- package/dist/_chunks/sanitize.mjs.map +1 -1
- package/dist/_chunks/shared.mjs +6 -2
- package/dist/_chunks/shared.mjs.map +1 -1
- package/dist/_chunks/skills.mjs +4 -2
- package/dist/_chunks/skills.mjs.map +1 -1
- package/dist/_chunks/sources.mjs +66 -48
- package/dist/_chunks/sources.mjs.map +1 -1
- package/dist/_chunks/sync.mjs +2 -1
- package/dist/_chunks/sync.mjs.map +1 -1
- package/dist/sources/index.mjs +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.mjs","names":["agents","agents","agents","agents"],"sources":["../../src/commands/sync-shared.ts","../../src/telemetry.ts","../../src/commands/sync-git.ts","../../src/commands/sync-parallel.ts","../../src/commands/sync.ts"],"sourcesContent":["import type { AgentType, CustomPrompt, OptimizeModel, SkillSection } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport type { ResolvedPackage, ResolveStep } from '../sources/index.ts'\nimport { appendFileSync, copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { join, relative, resolve } from 'pathe'\nimport {\n agents,\n buildAllSectionPrompts,\n createToolProgress,\n generateSkillMd,\n getAvailableModels,\n getModelLabel,\n getModelName,\n optimizeDocs,\n SECTION_OUTPUT_FILES,\n} from '../agent/index.ts'\nimport { maxItems, maxLines } from '../agent/prompts/optional/budget.ts'\nimport {\n CACHE_DIR,\n clearCache,\n getCacheDir,\n getPackageDbPath,\n getRepoCacheDir,\n getShippedSkills,\n hasShippedDocs,\n linkCachedDir,\n linkPkg,\n linkPkgNamed,\n linkRepoCachedDir,\n linkShippedSkill,\n listReferenceFiles,\n readCachedDocs,\n resolvePkgDir,\n writeToCache,\n writeToRepoCache,\n} from '../cache/index.ts'\nimport { isInteractive } from '../cli-helpers.ts'\nimport { defaultFeatures, readConfig, registerProject, updateConfig } from '../core/config.ts'\nimport { parsePackages, readLock, writeLock } from '../core/lockfile.ts'\nimport { parseFrontmatter } from '../core/markdown.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport { getSharedSkillsDir } from '../core/shared.ts'\nimport { createIndex, SearchDepsUnavailableError } from '../retriv/index.ts'\nimport {\n downloadLlmsDocs,\n fetchBlogReleases,\n fetchCrawledDocs,\n fetchGitDocs,\n fetchGitHubDiscussions,\n fetchGitHubIssues,\n fetchGitHubRaw,\n fetchLlmsTxt,\n fetchNpmPackage,\n fetchReadmeContent,\n fetchReleaseNotes,\n filterFrameworkDocs,\n formatDiscussionAsMarkdown,\n formatIssueAsMarkdown,\n generateDiscussionIndex,\n generateDocsIndex,\n generateIssueIndex,\n generateReleaseIndex,\n getBlogPreset,\n getPrereleaseChangelogRef,\n isGhAvailable,\n isPrerelease,\n isShallowGitDocs,\n normalizeLlmsLinks,\n parseGitHubUrl,\n resolveEntryFiles,\n resolveLocalPackageDocs,\n toCrawlPattern,\n} from '../sources/index.ts'\n\n/** Max docs sent to the embedding pipeline to prevent oversized indexes */\nconst MAX_INDEX_DOCS = 250\n\nexport const RESOLVE_STEP_LABELS: Record<ResolveStep, string> = {\n 'npm': 'npm registry',\n 'github-docs': 'GitHub docs',\n 'github-meta': 'GitHub meta',\n 'github-search': 'GitHub search',\n 'readme': 'README',\n 'llms.txt': 'llms.txt',\n 'crawl': 'website crawl',\n 'local': 'node_modules',\n}\n\n/** Classify a cached doc path into the right metadata type */\nexport function classifyCachedDoc(path: string): { type: string, number?: number } {\n const issueMatch = path.match(/^issues\\/issue-(\\d+)\\.md$/)\n if (issueMatch)\n return { type: 'issue', number: Number(issueMatch[1]) }\n const discussionMatch = path.match(/^discussions\\/discussion-(\\d+)\\.md$/)\n if (discussionMatch)\n return { type: 'discussion', number: Number(discussionMatch[1]) }\n if (path.startsWith('releases/'))\n return { type: 'release' }\n return { type: 'doc' }\n}\n\nexport async function findRelatedSkills(packageName: string, skillsDir: string): Promise<string[]> {\n const related: string[] = []\n\n const npmInfo = await fetchNpmPackage(packageName)\n if (!npmInfo?.dependencies)\n return related\n\n const deps = new Set(Object.keys(npmInfo.dependencies))\n\n if (!existsSync(skillsDir))\n return related\n\n // Build packageName → dirName map from lockfile for accurate matching\n const lock = readLock(skillsDir)\n const pkgToDirName = new Map<string, string>()\n if (lock) {\n for (const [dirName, info] of Object.entries(lock.skills)) {\n if (info.packageName)\n pkgToDirName.set(info.packageName, dirName)\n for (const pkg of parsePackages(info.packages))\n pkgToDirName.set(pkg.name, dirName)\n }\n }\n\n const installedSkills = readdirSync(skillsDir)\n const installedSet = new Set(installedSkills)\n\n for (const dep of deps) {\n const dirName = pkgToDirName.get(dep)\n if (dirName && installedSet.has(dirName))\n related.push(dirName)\n }\n\n return related.slice(0, 5)\n}\n\n/** Clear cache + db for --force flag */\nexport function forceClearCache(packageName: string, version: string, repoInfo?: { owner: string, repo: string }): void {\n clearCache(packageName, version)\n const forcedDbPath = getPackageDbPath(packageName, version)\n if (existsSync(forcedDbPath))\n rmSync(forcedDbPath, { recursive: true, force: true })\n // Also clear repo-level cache when force is used\n if (repoInfo) {\n const repoDir = getRepoCacheDir(repoInfo.owner, repoInfo.repo)\n if (existsSync(repoDir))\n rmSync(repoDir, { recursive: true, force: true })\n }\n}\n\n/** Link all reference symlinks (pkg, docs, issues, discussions, releases) */\nexport function linkAllReferences(skillDir: string, packageName: string, cwd: string, version: string, docsType: string, extraPackages?: Array<{ name: string, version?: string }>, features?: FeaturesConfig, repoInfo?: { owner: string, repo: string }): void {\n const f = features ?? readConfig().features ?? defaultFeatures\n try {\n linkPkg(skillDir, packageName, cwd, version)\n linkPkgNamed(skillDir, packageName, cwd, version)\n if (!hasShippedDocs(packageName, cwd, version) && docsType !== 'readme') {\n linkCachedDir(skillDir, packageName, version, 'docs')\n }\n // Issues/discussions/releases: use repo cache when available, else package cache\n if (f.issues) {\n if (repoInfo)\n linkRepoCachedDir(skillDir, repoInfo.owner, repoInfo.repo, 'issues')\n else\n linkCachedDir(skillDir, packageName, version, 'issues')\n }\n if (f.discussions) {\n if (repoInfo)\n linkRepoCachedDir(skillDir, repoInfo.owner, repoInfo.repo, 'discussions')\n else\n linkCachedDir(skillDir, packageName, version, 'discussions')\n }\n if (f.releases) {\n if (repoInfo)\n linkRepoCachedDir(skillDir, repoInfo.owner, repoInfo.repo, 'releases')\n else\n linkCachedDir(skillDir, packageName, version, 'releases')\n }\n linkCachedDir(skillDir, packageName, version, 'sections')\n // Create named symlinks for additional packages in multi-package skills\n if (extraPackages) {\n for (const pkg of extraPackages) {\n if (pkg.name !== packageName)\n linkPkgNamed(skillDir, pkg.name, cwd, pkg.version)\n }\n }\n }\n catch {\n // Symlink may fail on some systems\n }\n}\n\n/** Detect docs type from cached directory contents */\nexport function detectDocsType(packageName: string, version: string, repoUrl?: string, llmsUrl?: string): { docsType: 'docs' | 'llms.txt' | 'readme', docSource?: string } {\n const cacheDir = getCacheDir(packageName, version)\n if (existsSync(join(cacheDir, 'docs', 'index.md')) || existsSync(join(cacheDir, 'docs', 'guide'))) {\n return {\n docsType: 'docs',\n docSource: repoUrl ? `${repoUrl}/tree/v${version}/docs` : 'git',\n }\n }\n if (existsSync(join(cacheDir, 'llms.txt'))) {\n return {\n docsType: 'llms.txt',\n docSource: llmsUrl || 'llms.txt',\n }\n }\n if (existsSync(join(cacheDir, 'docs', 'README.md'))) {\n return { docsType: 'readme' }\n }\n return { docsType: 'readme' }\n}\n\nexport interface HandleShippedResult {\n shipped: Array<{ skillName: string, skillDir: string }>\n baseDir: string\n}\n\n/** Link shipped skills, write lock entries, register project. Returns result or null if no shipped skills. */\nexport function handleShippedSkills(\n packageName: string,\n version: string,\n cwd: string,\n agent: AgentType,\n global: boolean,\n): HandleShippedResult | null {\n const shippedSkills = getShippedSkills(packageName, cwd, version)\n if (shippedSkills.length === 0)\n return null\n\n const shared = getSharedSkillsDir(cwd)\n const agentConfig = agents[agent]\n const baseDir = global\n ? join(CACHE_DIR, 'skills')\n : shared || join(cwd, agentConfig.skillsDir)\n mkdirSync(baseDir, { recursive: true })\n\n for (const shipped of shippedSkills) {\n linkShippedSkill(baseDir, shipped.skillName, shipped.skillDir)\n writeLock(baseDir, shipped.skillName, {\n packageName,\n version,\n source: 'shipped',\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n }\n\n if (!global)\n registerProject(cwd)\n\n return { shipped: shippedSkills, baseDir }\n}\n\n/** Resolve the base skills directory for an agent */\nexport function resolveBaseDir(cwd: string, agent: AgentType, global: boolean): string {\n if (global)\n return join(CACHE_DIR, 'skills')\n const shared = getSharedSkillsDir(cwd)\n if (shared)\n return shared\n const agentConfig = agents[agent]\n return join(cwd, agentConfig.skillsDir)\n}\n\n/** Try resolving a `link:` dependency to local package docs. Returns null if not a link dep or resolution fails. */\nexport async function resolveLocalDep(packageName: string, cwd: string): Promise<ResolvedPackage | null> {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath))\n return null\n\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n const depVersion = deps[packageName]\n\n if (!depVersion?.startsWith('link:'))\n return null\n\n const localPath = resolve(cwd, depVersion.slice(5))\n return resolveLocalPackageDocs(localPath)\n}\n\n/** Detect CHANGELOG.md in a package directory or cached releases */\nexport function detectChangelog(pkgDir: string | null, cacheDir?: string): string | false {\n if (pkgDir) {\n const found = ['CHANGELOG.md', 'changelog.md'].find(f => existsSync(join(pkgDir, f)))\n if (found)\n return `pkg/${found}`\n }\n // Also check cached releases/CHANGELOG.md (fetched from GitHub)\n if (cacheDir && existsSync(join(cacheDir, 'releases', 'CHANGELOG.md')))\n return 'releases/CHANGELOG.md'\n return false\n}\n\n// ── Shared pipeline functions ──\n\nexport interface IndexDoc {\n id: string\n content: string\n metadata: Record<string, any>\n}\n\nexport interface FetchResult {\n docSource: string\n docsType: 'llms.txt' | 'readme' | 'docs'\n docsToIndex: IndexDoc[]\n hasIssues: boolean\n hasDiscussions: boolean\n hasReleases: boolean\n warnings: string[]\n /** Parsed GitHub owner/repo for repo-level cache */\n repoInfo?: { owner: string, repo: string }\n /** Whether this result was served from cache (no fresh fetches) */\n usedCache: boolean\n}\n\n/** Fetch and cache all resources for a package (docs cascade + issues + discussions + releases) */\nexport async function fetchAndCacheResources(opts: {\n packageName: string\n resolved: ResolvedPackage\n version: string\n useCache: boolean\n features?: FeaturesConfig\n /** Lower-bound date for release/issue/discussion collection (ISO date) */\n from?: string\n onProgress: (message: string) => void\n}): Promise<FetchResult> {\n const { packageName, resolved, version, onProgress } = opts\n const features = opts.features ?? readConfig().features ?? defaultFeatures\n\n // Retry fetch if cache is README-only but richer sources exist (likely transient failure)\n const cacheInvalidated = opts.useCache\n && resolved.crawlUrl\n && detectDocsType(packageName, version, resolved.repoUrl, resolved.llmsUrl).docsType === 'readme'\n const useCache = opts.useCache && !cacheInvalidated\n let docSource: string = resolved.readmeUrl || 'readme'\n let docsType: 'llms.txt' | 'readme' | 'docs' = 'readme'\n const docsToIndex: IndexDoc[] = []\n const warnings: string[] = []\n if (cacheInvalidated)\n warnings.push(`Retrying crawl for ${resolved.crawlUrl} (previous attempt only cached README)`)\n\n if (!useCache) {\n const cachedDocs: Array<{ path: string, content: string }> = []\n const isFrameworkDoc = (path: string) => filterFrameworkDocs([path], packageName).length > 0\n\n // Try versioned git docs first\n if (resolved.gitDocsUrl && resolved.repoUrl) {\n const gh = parseGitHubUrl(resolved.repoUrl)\n if (gh) {\n onProgress('Fetching git docs')\n const gitDocs = await fetchGitDocs(gh.owner, gh.repo, version, packageName)\n if (gitDocs?.fallback) {\n warnings.push(`Docs fetched from ${gitDocs.ref} branch (no tag found for v${version})`)\n }\n if (gitDocs && gitDocs.files.length > 0) {\n const BATCH_SIZE = 20\n const results: Array<{ file: string, content: string } | null> = []\n\n for (let i = 0; i < gitDocs.files.length; i += BATCH_SIZE) {\n const batch = gitDocs.files.slice(i, i + BATCH_SIZE)\n onProgress(`Downloading docs ${Math.min(i + BATCH_SIZE, gitDocs.files.length)}/${gitDocs.files.length} from ${gitDocs.ref}`)\n const batchResults = await Promise.all(\n batch.map(async (file) => {\n const url = `${gitDocs.baseUrl}/${file}`\n const content = await fetchGitHubRaw(url)\n if (!content)\n return null\n return { file, content }\n }),\n )\n results.push(...batchResults)\n }\n\n for (const r of results) {\n if (r) {\n const stripped = gitDocs.docsPrefix ? r.file.replace(gitDocs.docsPrefix, '') : r.file\n const cachePath = stripped.startsWith('docs/') ? stripped : `docs/${stripped}`\n cachedDocs.push({ path: cachePath, content: r.content })\n docsToIndex.push({\n id: cachePath,\n content: r.content,\n metadata: { package: packageName, source: cachePath, type: 'doc' },\n })\n }\n }\n\n const downloaded = results.filter(Boolean).length\n if (downloaded > 0) {\n // Shallow git-docs: if < threshold and llms.txt exists, discard and fall through\n if (isShallowGitDocs(downloaded) && resolved.llmsUrl) {\n onProgress(`Shallow git-docs (${downloaded} files), trying llms.txt`)\n cachedDocs.length = 0\n docsToIndex.length = 0\n }\n else {\n docSource = `${resolved.repoUrl}/tree/${gitDocs.ref}/docs`\n docsType = 'docs'\n writeToCache(packageName, version, cachedDocs)\n\n // Always cache llms.txt alongside good git-docs as supplementary reference\n if (resolved.llmsUrl) {\n onProgress('Caching supplementary llms.txt')\n const llmsContent = await fetchLlmsTxt(resolved.llmsUrl)\n if (llmsContent) {\n const baseUrl = resolved.docsUrl || new URL(resolved.llmsUrl).origin\n const supplementary: Array<{ path: string, content: string }> = [\n { path: 'llms.txt', content: normalizeLlmsLinks(llmsContent.raw, baseUrl) },\n ]\n if (llmsContent.links.length > 0) {\n onProgress(`Downloading ${llmsContent.links.length} supplementary docs`)\n const docs = await downloadLlmsDocs(llmsContent, baseUrl, (url, done, total) => {\n onProgress(`Downloading supplementary doc ${done + 1}/${total}`)\n })\n for (const doc of docs) {\n if (!isFrameworkDoc(doc.url))\n continue\n const localPath = doc.url.startsWith('/') ? doc.url.slice(1) : doc.url\n supplementary.push({ path: join('llms-docs', ...localPath.split('/')), content: doc.content })\n }\n }\n writeToCache(packageName, version, supplementary)\n }\n }\n }\n }\n }\n }\n }\n\n // Try website crawl\n if (resolved.crawlUrl && cachedDocs.length === 0) {\n onProgress('Crawling website')\n const crawledDocs = await fetchCrawledDocs(resolved.crawlUrl, onProgress).catch((err) => {\n warnings.push(`Crawl failed for ${resolved.crawlUrl}: ${err?.message || err}`)\n return []\n })\n if (crawledDocs.length === 0 && resolved.crawlUrl) {\n warnings.push(`Crawl returned 0 docs from ${resolved.crawlUrl}`)\n }\n if (crawledDocs.length > 0) {\n for (const doc of crawledDocs) {\n if (!isFrameworkDoc(doc.path))\n continue\n cachedDocs.push(doc)\n docsToIndex.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, type: 'doc' },\n })\n }\n docSource = resolved.crawlUrl\n docsType = 'docs'\n writeToCache(packageName, version, cachedDocs)\n }\n }\n\n // Try llms.txt\n if (resolved.llmsUrl && cachedDocs.length === 0) {\n onProgress('Fetching llms.txt')\n const llmsContent = await fetchLlmsTxt(resolved.llmsUrl)\n if (llmsContent) {\n docSource = resolved.llmsUrl!\n docsType = 'llms.txt'\n const baseUrl = resolved.docsUrl || new URL(resolved.llmsUrl).origin\n cachedDocs.push({ path: 'llms.txt', content: normalizeLlmsLinks(llmsContent.raw, baseUrl) })\n\n if (llmsContent.links.length > 0) {\n onProgress(`Downloading ${llmsContent.links.length} linked docs`)\n const docs = await downloadLlmsDocs(llmsContent, baseUrl, (url, done, total) => {\n onProgress(`Downloading linked doc ${done + 1}/${total}`)\n })\n\n for (const doc of docs) {\n if (!isFrameworkDoc(doc.url))\n continue\n const localPath = doc.url.startsWith('/') ? doc.url.slice(1) : doc.url\n const cachePath = join('docs', ...localPath.split('/'))\n cachedDocs.push({ path: cachePath, content: doc.content })\n docsToIndex.push({\n id: doc.url,\n content: doc.content,\n metadata: { package: packageName, source: cachePath, type: 'doc' },\n })\n }\n }\n\n writeToCache(packageName, version, cachedDocs)\n }\n }\n\n // Try crawling docsUrl as fallback (when no actual doc files from git/crawl/llms.txt)\n if (resolved.docsUrl && !cachedDocs.some(d => d.path.startsWith('docs/'))) {\n const crawlPattern = resolved.crawlUrl || toCrawlPattern(resolved.docsUrl)\n onProgress('Crawling docs site')\n const crawlMaxPages = resolved.crawlUrl ? 200 : 400\n const crawledDocs = await fetchCrawledDocs(crawlPattern, onProgress, crawlMaxPages).catch((err) => {\n warnings.push(`Crawl failed for ${crawlPattern}: ${err?.message || err}`)\n return []\n })\n if (crawledDocs.length > 0) {\n for (const doc of crawledDocs) {\n if (!isFrameworkDoc(doc.path))\n continue\n cachedDocs.push(doc)\n docsToIndex.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, type: 'doc' },\n })\n }\n docSource = crawlPattern\n docsType = 'docs'\n writeToCache(packageName, version, cachedDocs)\n }\n }\n\n // Fallback to README\n if (resolved.readmeUrl && cachedDocs.length === 0) {\n onProgress('Fetching README')\n const content = await fetchReadmeContent(resolved.readmeUrl)\n if (content) {\n cachedDocs.push({ path: 'docs/README.md', content })\n docsToIndex.push({\n id: 'README.md',\n content,\n metadata: { package: packageName, source: 'docs/README.md', type: 'doc' },\n })\n writeToCache(packageName, version, cachedDocs)\n }\n }\n\n // Generate docs index if we have multiple doc files\n if (docsType !== 'readme' && cachedDocs.filter(d => d.path.startsWith('docs/') && d.path.endsWith('.md')).length > 1) {\n const docsIndex = generateDocsIndex(cachedDocs)\n if (docsIndex) {\n writeToCache(packageName, version, [{ path: 'docs/_INDEX.md', content: docsIndex }])\n }\n }\n }\n else {\n // Detect docs type from cache\n onProgress('Loading cached docs')\n const detected = detectDocsType(packageName, version, resolved.repoUrl, resolved.llmsUrl)\n docsType = detected.docsType\n if (detected.docSource)\n docSource = detected.docSource\n\n // Load cached docs for indexing if db doesn't exist yet\n const dbPath = getPackageDbPath(packageName, version)\n if (!existsSync(dbPath)) {\n onProgress('Reading cached docs for indexing')\n const cached = readCachedDocs(packageName, version)\n for (const doc of cached) {\n docsToIndex.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, ...classifyCachedDoc(doc.path) },\n })\n }\n }\n\n // Backfill docs index for caches created before this feature\n if (docsType !== 'readme' && !existsSync(join(getCacheDir(packageName, version), 'docs', '_INDEX.md'))) {\n onProgress('Generating docs index')\n const cached = readCachedDocs(packageName, version)\n const docFiles = cached.filter(d => d.path.startsWith('docs/') && d.path.endsWith('.md'))\n if (docFiles.length > 1) {\n const docsIndex = generateDocsIndex(cached)\n if (docsIndex) {\n writeToCache(packageName, version, [{ path: 'docs/_INDEX.md', content: docsIndex }])\n }\n }\n }\n }\n\n // Parse repo info once for repo-level caching\n const gh = resolved.repoUrl ? parseGitHubUrl(resolved.repoUrl) : null\n const repoInfo = gh ? { owner: gh.owner, repo: gh.repo } : undefined\n\n // Determine where repo-level data lives (repo cache if available, else package cache)\n const repoCacheDir = repoInfo ? getRepoCacheDir(repoInfo.owner, repoInfo.repo) : null\n const cacheDir = getCacheDir(packageName, version)\n const issuesDir = repoCacheDir ? join(repoCacheDir, 'issues') : join(cacheDir, 'issues')\n const discussionsDir = repoCacheDir ? join(repoCacheDir, 'discussions') : join(cacheDir, 'discussions')\n const releasesPath = repoCacheDir ? join(repoCacheDir, 'releases') : join(cacheDir, 'releases')\n\n // Issues (independent of useCache — has its own existsSync guard)\n if (features.issues && gh && isGhAvailable() && !existsSync(issuesDir)) {\n onProgress('Fetching issues via GitHub API')\n const issues = await fetchGitHubIssues(gh.owner, gh.repo, 30, resolved.releasedAt, opts.from).catch(() => [])\n if (issues.length > 0) {\n onProgress(`Caching ${issues.length} issues`)\n const issueDocs = [\n ...issues.map(issue => ({\n path: `issues/issue-${issue.number}.md`,\n content: formatIssueAsMarkdown(issue),\n })),\n {\n path: 'issues/_INDEX.md',\n content: generateIssueIndex(issues),\n },\n ]\n if (repoInfo)\n writeToRepoCache(repoInfo.owner, repoInfo.repo, issueDocs)\n else\n writeToCache(packageName, version, issueDocs)\n for (const issue of issues) {\n docsToIndex.push({\n id: `issue-${issue.number}`,\n content: sanitizeMarkdown(`#${issue.number}: ${issue.title}\\n\\n${issue.body || ''}`),\n metadata: { package: packageName, source: `issues/issue-${issue.number}.md`, type: 'issue', number: issue.number },\n })\n }\n }\n }\n\n // Discussions\n if (features.discussions && gh && isGhAvailable() && !existsSync(discussionsDir)) {\n onProgress('Fetching discussions via GitHub API')\n const discussions = await fetchGitHubDiscussions(gh.owner, gh.repo, 20, resolved.releasedAt, opts.from).catch(() => [])\n if (discussions.length > 0) {\n onProgress(`Caching ${discussions.length} discussions`)\n const discussionDocs = [\n ...discussions.map(d => ({\n path: `discussions/discussion-${d.number}.md`,\n content: formatDiscussionAsMarkdown(d),\n })),\n {\n path: 'discussions/_INDEX.md',\n content: generateDiscussionIndex(discussions),\n },\n ]\n if (repoInfo)\n writeToRepoCache(repoInfo.owner, repoInfo.repo, discussionDocs)\n else\n writeToCache(packageName, version, discussionDocs)\n for (const d of discussions) {\n docsToIndex.push({\n id: `discussion-${d.number}`,\n content: sanitizeMarkdown(`#${d.number}: ${d.title}\\n\\n${d.body || ''}`),\n metadata: { package: packageName, source: `discussions/discussion-${d.number}.md`, type: 'discussion', number: d.number },\n })\n }\n }\n }\n\n // Releases (GitHub releases + blog releases + CHANGELOG → unified releases/ dir)\n if (features.releases && gh && isGhAvailable() && !existsSync(releasesPath)) {\n onProgress('Fetching releases via GitHub API')\n const changelogRef = isPrerelease(version) ? getPrereleaseChangelogRef(packageName) : undefined\n const releaseDocs = await fetchReleaseNotes(gh.owner, gh.repo, version, resolved.gitRef, packageName, opts.from, changelogRef).catch(() => [])\n\n // Fetch blog releases into same releases/ dir\n let blogDocs: Array<{ path: string, content: string }> = []\n if (getBlogPreset(packageName)) {\n onProgress('Fetching blog release notes')\n blogDocs = await fetchBlogReleases(packageName, version).catch(() => [])\n }\n\n const allDocs = [...releaseDocs, ...blogDocs]\n\n // Parse blog release metadata for index generation\n const blogEntries = blogDocs\n .filter(d => !d.path.endsWith('_INDEX.md'))\n .map((d) => {\n const versionMatch = d.path.match(/blog-(.+)\\.md$/)\n const fm = parseFrontmatter(d.content)\n return {\n version: versionMatch?.[1] ?? '',\n title: fm.title ?? `Release ${versionMatch?.[1]}`,\n date: fm.date ?? '',\n }\n })\n .filter(b => b.version)\n\n // Parse GitHub releases for index (extract from frontmatter)\n const ghReleases = releaseDocs\n .filter(d => d.path.startsWith('releases/') && !d.path.endsWith('CHANGELOG.md'))\n .map((d) => {\n const fm = parseFrontmatter(d.content)\n const tag = fm.tag ?? ''\n const name = fm.name ?? tag\n const published = fm.published ?? ''\n return { id: 0, tag, name, prerelease: false, createdAt: published, publishedAt: published, markdown: '' }\n })\n .filter(r => r.tag)\n\n const hasChangelog = allDocs.some(d => d.path === 'releases/CHANGELOG.md')\n\n // Generate unified _INDEX.md\n if (ghReleases.length > 0 || blogEntries.length > 0) {\n allDocs.push({\n path: 'releases/_INDEX.md',\n content: generateReleaseIndex({ releases: ghReleases, packageName, blogReleases: blogEntries, hasChangelog }),\n })\n }\n\n if (allDocs.length > 0) {\n onProgress(`Caching ${allDocs.length} releases`)\n if (repoInfo)\n writeToRepoCache(repoInfo.owner, repoInfo.repo, allDocs)\n else\n writeToCache(packageName, version, allDocs)\n for (const doc of allDocs) {\n docsToIndex.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, type: 'release' },\n })\n }\n }\n }\n\n return {\n docSource,\n docsType,\n docsToIndex,\n hasIssues: features.issues && existsSync(issuesDir),\n hasDiscussions: features.discussions && existsSync(discussionsDir),\n hasReleases: features.releases && existsSync(releasesPath),\n warnings,\n repoInfo,\n usedCache: useCache,\n }\n}\n\n/** Index all resources into the search database (single batch) */\nexport async function indexResources(opts: {\n packageName: string\n version: string\n cwd: string\n docsToIndex: IndexDoc[]\n features?: FeaturesConfig\n onProgress: (message: string) => void\n}): Promise<void> {\n const { packageName, version, cwd, onProgress } = opts\n const features = opts.features ?? readConfig().features ?? defaultFeatures\n\n if (!features.search)\n return\n\n const dbPath = getPackageDbPath(packageName, version)\n\n if (existsSync(dbPath))\n return\n\n const allDocs = [...opts.docsToIndex]\n\n // Add entry files\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n if (features.search && pkgDir) {\n onProgress('Scanning exports')\n const entryFiles = await resolveEntryFiles(pkgDir)\n for (const e of entryFiles) {\n allDocs.push({\n id: e.path,\n content: e.content,\n metadata: { package: packageName, source: `pkg/${e.path}`, type: e.type },\n })\n }\n }\n\n if (allDocs.length === 0)\n return\n\n // Cap docs to prevent oversized indexes\n if (allDocs.length > MAX_INDEX_DOCS) {\n const TYPE_PRIORITY: Record<string, number> = { doc: 0, issue: 1, discussion: 2, release: 3, source: 4, types: 5 }\n allDocs.sort((a, b) => {\n const ta = TYPE_PRIORITY[a.metadata?.type || 'doc'] ?? 3\n const tb = TYPE_PRIORITY[b.metadata?.type || 'doc'] ?? 3\n if (ta !== tb)\n return ta - tb\n return a.id.localeCompare(b.id)\n })\n onProgress(`Indexing capped at ${MAX_INDEX_DOCS}/${allDocs.length} docs (prioritized by type)`)\n allDocs.length = MAX_INDEX_DOCS\n }\n\n onProgress(`Building search index (${allDocs.length} docs)`)\n try {\n await createIndex(allDocs, {\n dbPath,\n onProgress: ({ phase, current, total }) => {\n if (phase === 'storing') {\n const d = allDocs[current - 1]\n const type = d?.metadata?.type === 'source' || d?.metadata?.type === 'types' ? 'code' : (d?.metadata?.type || 'doc')\n onProgress(`Storing ${type} (${current}/${total})`)\n }\n else if (phase === 'embedding') {\n onProgress(`Creating embeddings (${current}/${total})`)\n }\n },\n })\n }\n catch (err) {\n if (err instanceof SearchDepsUnavailableError)\n onProgress('Search indexing skipped (native deps unavailable)')\n else\n throw err\n }\n}\n\n/**\n * Eject references: copy cached files as real files into references/ dir.\n * Used for portable skills (git repos, sharing). Replaces symlinks with copies.\n * Does NOT copy pkg files — those reference node_modules directly.\n */\nexport function ejectReferences(skillDir: string, packageName: string, cwd: string, version: string, docsType: string, features?: FeaturesConfig, repoInfo?: { owner: string, repo: string }): void {\n const f = features ?? readConfig().features ?? defaultFeatures\n const cacheDir = getCacheDir(packageName, version)\n const refsDir = join(skillDir, 'references')\n // Repo-level data source (falls back to package cache)\n const repoDir = repoInfo ? getRepoCacheDir(repoInfo.owner, repoInfo.repo) : cacheDir\n\n // Copy cached docs (skip pkg — eject is for portable sharing, pkg references node_modules)\n if (!hasShippedDocs(packageName, cwd, version) && docsType !== 'readme')\n copyCachedSubdir(cacheDir, refsDir, 'docs')\n\n if (f.issues)\n copyCachedSubdir(repoDir, refsDir, 'issues')\n if (f.discussions)\n copyCachedSubdir(repoDir, refsDir, 'discussions')\n if (f.releases)\n copyCachedSubdir(repoDir, refsDir, 'releases')\n}\n\n/** Recursively copy a cached subdirectory into the references dir */\nfunction copyCachedSubdir(cacheDir: string, refsDir: string, subdir: string): void {\n const srcDir = join(cacheDir, subdir)\n if (!existsSync(srcDir))\n return\n\n const destDir = join(refsDir, subdir)\n mkdirSync(destDir, { recursive: true })\n\n function walk(dir: string, rel: string) {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const srcPath = join(dir, entry.name)\n const destPath = join(destDir, rel ? `${rel}/${entry.name}` : entry.name)\n if (entry.isDirectory()) {\n mkdirSync(destPath, { recursive: true })\n walk(srcPath, rel ? `${rel}/${entry.name}` : entry.name)\n }\n else {\n copyFileSync(srcPath, destPath)\n }\n }\n }\n\n walk(srcDir, '')\n}\n\n// ── Shared UI + LLM functions (used by sync.ts, sync-git.ts, sync-parallel.ts, etc.) ──\n\n/**\n * Check if .gitignore has `.skilld` entry.\n * If missing, prompt to add it. Skipped for global installs.\n */\nexport async function ensureGitignore(skillsDir: string, cwd: string, isGlobal: boolean): Promise<void> {\n if (isGlobal)\n return\n\n const gitignorePath = join(cwd, '.gitignore')\n const pattern = '.skilld'\n\n // Check if already ignored\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8')\n if (content.split('\\n').some(line => line.trim() === pattern))\n return\n }\n\n // Non-interactive: auto-add (default is true anyway)\n if (!isInteractive()) {\n const entry = `\\n# Skilld references (recreated by \\`skilld install\\`)\\n${pattern}\\n`\n if (existsSync(gitignorePath)) {\n const existing = readFileSync(gitignorePath, 'utf-8')\n const separator = existing.endsWith('\\n') ? '' : '\\n'\n appendFileSync(gitignorePath, `${separator}${entry}`)\n }\n else {\n writeFileSync(gitignorePath, entry)\n }\n return\n }\n\n // Show guidance\n const relSkillsDir = relative(cwd, skillsDir) || '.'\n p.log.info(\n `\\x1B[1mGit guidance:\\x1B[0m\\n`\n + ` \\x1B[32m✓\\x1B[0m Commit: \\x1B[36m${relSkillsDir}/*/SKILL.md\\x1B[0m\\n`\n + ` \\x1B[32m✓\\x1B[0m Commit: \\x1B[36m${relSkillsDir}/skilld-lock.yaml\\x1B[0m\\n`\n + ` \\x1B[31m✗\\x1B[0m Ignore: \\x1B[36m${pattern}\\x1B[0m \\x1B[90m(recreated by \\`skilld install\\`)\\x1B[0m`,\n )\n\n const add = await p.confirm({\n message: `Add \\`${pattern}\\` to .gitignore?`,\n initialValue: true,\n })\n\n if (p.isCancel(add) || !add)\n return\n\n const entry = `\\n# Skilld references (recreated by \\`skilld install\\`)\\n${pattern}\\n`\n if (existsSync(gitignorePath)) {\n const existing = readFileSync(gitignorePath, 'utf-8')\n const separator = existing.endsWith('\\n') ? '' : '\\n'\n appendFileSync(gitignorePath, `${separator}${entry}`)\n }\n else {\n writeFileSync(gitignorePath, entry)\n }\n\n p.log.success('Updated .gitignore')\n}\n\nexport const SKILLD_MARKER_START = '<!-- skilld -->'\nexport const SKILLD_MARKER_END = '<!-- /skilld -->'\n\nconst SKILLD_INSTRUCTIONS = `${SKILLD_MARKER_START}\nBefore modifying code, evaluate each installed skill against the current task.\nFor each skill, determine YES/NO relevance and invoke all YES skills before proceeding.\n${SKILLD_MARKER_END}`\n\n/**\n * Check if agent instruction file has skilld skill-activation snippet.\n * If missing, prompt to add it. Skipped for global installs or agents without an instructionFile.\n */\nexport async function ensureAgentInstructions(agent: AgentType, cwd: string, isGlobal: boolean): Promise<void> {\n if (isGlobal)\n return\n\n const agentConfig = agents[agent]\n if (!agentConfig.instructionFile)\n return\n\n const filePath = join(cwd, agentConfig.instructionFile)\n\n // Check if marker already present\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, 'utf-8')\n if (content.includes(SKILLD_MARKER_START))\n return\n }\n\n // Non-interactive: auto-add\n if (!isInteractive()) {\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf-8')\n const separator = existing.endsWith('\\n') ? '' : '\\n'\n appendFileSync(filePath, `${separator}\\n${SKILLD_INSTRUCTIONS}\\n`)\n }\n else {\n writeFileSync(filePath, `${SKILLD_INSTRUCTIONS}\\n`)\n }\n return\n }\n\n p.note(SKILLD_INSTRUCTIONS, `Will be added to ${agentConfig.instructionFile}`)\n\n const add = await p.confirm({\n message: `Add skill activation instructions to ${agentConfig.instructionFile}?`,\n initialValue: true,\n })\n\n if (p.isCancel(add) || !add)\n return\n\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf-8')\n const separator = existing.endsWith('\\n') ? '' : '\\n'\n appendFileSync(filePath, `${separator}\\n${SKILLD_INSTRUCTIONS}\\n`)\n }\n else {\n writeFileSync(filePath, `${SKILLD_INSTRUCTIONS}\\n`)\n }\n\n p.log.success(`Updated ${agentConfig.instructionFile}`)\n}\n\n/** Select LLM model for SKILL.md generation (independent of target agent) */\nexport async function selectModel(skipPrompt: boolean): Promise<OptimizeModel | null> {\n const config = readConfig()\n const available = await getAvailableModels()\n\n if (available.length === 0) {\n p.log.warn('No LLM CLIs found (claude, gemini, codex)')\n return null\n }\n\n // Use config model if set and available (only when not prompting)\n if (skipPrompt) {\n if (config.model && available.some(m => m.id === config.model))\n return config.model\n return available.find(m => m.recommended)?.id ?? available[0]!.id\n }\n\n const modelChoice = await p.select({\n message: 'Model for SKILL.md generation',\n options: available.map(m => ({\n label: m.recommended ? `${m.name} (Recommended)` : m.name,\n value: m.id,\n hint: `${m.agentName} · ${m.hint}`,\n })),\n initialValue: available.find(m => m.recommended)?.id ?? available[0]!.id,\n })\n\n if (p.isCancel(modelChoice)) {\n p.cancel('Cancelled')\n return null\n }\n\n // Remember choice for next time\n updateConfig({ model: modelChoice as OptimizeModel })\n\n return modelChoice as OptimizeModel\n}\n\n/** Default sections when model is pre-set (non-interactive) */\nexport const DEFAULT_SECTIONS: SkillSection[] = ['best-practices', 'api-changes']\n\nexport async function selectSkillSections(message = 'Generate SKILL.md with LLM'): Promise<{ sections: SkillSection[], customPrompt?: CustomPrompt, cancelled: boolean }> {\n p.log.info('Budgets adapt to package release density.')\n const selected = await p.multiselect({\n message,\n options: [\n { label: 'API changes', value: 'api-changes' as SkillSection, hint: 'new/deprecated APIs from version history' },\n { label: 'Best practices', value: 'best-practices' as SkillSection, hint: 'gotchas, pitfalls, patterns' },\n { label: 'Custom section', value: 'custom' as SkillSection, hint: 'add your own section' },\n ],\n initialValues: DEFAULT_SECTIONS,\n required: false,\n })\n\n if (p.isCancel(selected))\n return { sections: [], cancelled: true }\n\n const sections = selected as SkillSection[]\n if (sections.length === 0)\n return { sections: [], cancelled: false }\n\n // Show per-section budget based on selection count\n if (sections.length > 1) {\n const n = sections.length\n const budgetLines: string[] = []\n for (const s of sections) {\n switch (s) {\n case 'api-changes':\n budgetLines.push(` API changes ${maxItems(6, 12, n)}–${maxItems(6, Math.round(12 * 1.6), n)} items (adapts to release churn)`)\n break\n case 'best-practices':\n budgetLines.push(` Best practices ${maxItems(4, 10, n)}–${maxItems(4, Math.round(10 * 1.3), n)} items`)\n break\n case 'custom':\n budgetLines.push(` Custom ≤${maxLines(50, 80, n)} lines`)\n break\n }\n }\n p.log.info(`Budget (${n} sections):\\n${budgetLines.join('\\n')}`)\n }\n\n let customPrompt: CustomPrompt | undefined\n if (sections.includes('custom')) {\n const heading = await p.text({\n message: 'Section heading',\n placeholder: 'e.g. \"Migration from v2\" or \"SSR Patterns\"',\n })\n if (p.isCancel(heading))\n return { sections: [], cancelled: true }\n\n const body = await p.text({\n message: 'Instructions for this section',\n placeholder: 'e.g. \"Document breaking changes and migration steps from v2 to v3\"',\n })\n if (p.isCancel(body))\n return { sections: [], cancelled: true }\n\n customPrompt = { heading: heading as string, body: body as string }\n }\n\n return { sections, customPrompt, cancelled: false }\n}\n\nexport interface LlmConfig {\n model: OptimizeModel\n sections: SkillSection[]\n customPrompt?: CustomPrompt\n promptOnly?: boolean\n}\n\n/**\n * Resolve sections + model for LLM enhancement.\n * If presetModel is provided, uses DEFAULT_SECTIONS without prompting.\n * Returns null if cancelled or no sections/model selected.\n */\nexport async function selectLlmConfig(presetModel?: OptimizeModel, message?: string): Promise<LlmConfig | null> {\n if (presetModel) {\n return { model: presetModel, sections: DEFAULT_SECTIONS }\n }\n\n // Non-interactive (CI, agent, no TTY): skip generation unless model explicitly provided\n if (!isInteractive()) {\n return null\n }\n\n // Resolve default model (configured or recommended) without prompting\n const defaultModel = await selectModel(true)\n if (!defaultModel)\n return null\n\n const defaultModelName = getModelName(defaultModel)\n\n const choice = await p.select({\n message: 'Generate enhanced SKILL.md?',\n options: [\n { label: defaultModelName, value: 'default' as const, hint: 'configured default' },\n { label: 'Different model', value: 'pick' as const, hint: 'choose another model' },\n { label: 'Prompt only', value: 'prompt' as const, hint: 'write prompts for manual use' },\n { label: 'Skip', value: 'skip' as const, hint: 'base skill only' },\n ],\n })\n\n if (p.isCancel(choice))\n return null\n\n if (choice === 'skip')\n return null\n\n if (choice === 'prompt') {\n const { sections, customPrompt, cancelled } = await selectSkillSections(\n message ? `${message} (prompt only)` : 'Select sections for prompt generation',\n )\n if (cancelled || sections.length === 0)\n return null\n // model is unused for prompt-only but required by type — use defaultModel as placeholder\n return { model: defaultModel, sections, customPrompt, promptOnly: true }\n }\n\n const model = choice === 'pick' ? await selectModel(false) : defaultModel\n if (!model)\n return null\n\n const modelName = getModelName(model)\n const { sections, customPrompt, cancelled } = await selectSkillSections(\n message ? `${message} (${modelName})` : `Generate SKILL.md with ${modelName}`,\n )\n\n if (cancelled || sections.length === 0)\n return null\n\n return { model, sections, customPrompt }\n}\n\nexport interface EnhanceOptions {\n packageName: string\n version: string\n skillDir: string\n dirName?: string\n model: OptimizeModel\n resolved: { repoUrl?: string, llmsUrl?: string, releasedAt?: string, docsUrl?: string, gitRef?: string, dependencies?: Record<string, string>, distTags?: Record<string, { version: string, releasedAt?: string }> }\n relatedSkills: string[]\n hasIssues: boolean\n hasDiscussions: boolean\n hasReleases: boolean\n hasChangelog: string | false\n docsType: 'llms.txt' | 'readme' | 'docs'\n hasShippedDocs: boolean\n pkgFiles: string[]\n force?: boolean\n debug?: boolean\n sections?: SkillSection[]\n customPrompt?: CustomPrompt\n packages?: Array<{ name: string }>\n features?: FeaturesConfig\n eject?: boolean\n}\n\nexport async function enhanceSkillWithLLM(opts: EnhanceOptions): Promise<void> {\n const { packageName, version, skillDir, dirName, model, resolved, relatedSkills, hasIssues, hasDiscussions, hasReleases, hasChangelog, docsType, hasShippedDocs: shippedDocs, pkgFiles, force, debug, sections, customPrompt, packages, features, eject } = opts\n\n const effectiveFeatures = features\n\n const llmLog = p.taskLog({ title: `Agent exploring ${packageName}` })\n const docFiles = listReferenceFiles(skillDir)\n const hasGithub = hasIssues || hasDiscussions\n const { optimized, wasOptimized, usage, cost, warnings, error, debugLogsDir } = await optimizeDocs({\n packageName,\n skillDir,\n model,\n version,\n hasGithub,\n hasReleases,\n hasChangelog,\n docFiles,\n docsType,\n hasShippedDocs: shippedDocs,\n noCache: force,\n debug,\n sections,\n customPrompt,\n features: effectiveFeatures,\n pkgFiles,\n onProgress: createToolProgress(llmLog),\n })\n\n if (wasOptimized) {\n const costParts: string[] = []\n if (usage) {\n const totalK = Math.round(usage.totalTokens / 1000)\n costParts.push(`${totalK}k tokens`)\n }\n if (cost)\n costParts.push(`$${cost.toFixed(2)}`)\n const costSuffix = costParts.length > 0 ? ` (${costParts.join(', ')})` : ''\n llmLog.success(`Generated best practices${costSuffix}`)\n if (debugLogsDir)\n p.log.info(`Debug logs: ${relative(process.cwd(), debugLogsDir)}`)\n if (error)\n p.log.warn(`\\x1B[33mPartial failure: ${error}\\x1B[0m`)\n if (warnings?.length) {\n for (const w of warnings)\n p.log.warn(`\\x1B[33m${w}\\x1B[0m`)\n }\n const skillMd = generateSkillMd({\n name: packageName,\n version,\n releasedAt: resolved.releasedAt,\n dependencies: resolved.dependencies,\n distTags: resolved.distTags,\n body: optimized,\n relatedSkills,\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n generatedBy: getModelLabel(model),\n dirName,\n packages,\n repoUrl: resolved.repoUrl,\n features,\n eject,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n }\n else {\n llmLog.error(`LLM optimization failed${error ? `: ${error}` : ''}`)\n }\n}\n\nexport interface WritePromptFilesOptions {\n packageName: string\n skillDir: string\n version: string\n hasIssues: boolean\n hasDiscussions: boolean\n hasReleases: boolean\n hasChangelog: string | false\n docsType: 'llms.txt' | 'readme' | 'docs'\n hasShippedDocs: boolean\n pkgFiles: string[]\n sections: SkillSection[]\n customPrompt?: CustomPrompt\n features?: FeaturesConfig\n}\n\n/**\n * Build and write PROMPT_*.md files for manual LLM use.\n * Returns the list of sections that had prompts written.\n */\nexport function writePromptFiles(opts: WritePromptFilesOptions): SkillSection[] {\n const { skillDir, sections, customPrompt, features } = opts\n const docFiles = listReferenceFiles(skillDir)\n const prompts = buildAllSectionPrompts({\n packageName: opts.packageName,\n skillDir,\n version: opts.version,\n hasIssues: opts.hasIssues,\n hasDiscussions: opts.hasDiscussions,\n hasReleases: opts.hasReleases,\n hasChangelog: opts.hasChangelog,\n docFiles,\n docsType: opts.docsType,\n hasShippedDocs: opts.hasShippedDocs,\n pkgFiles: opts.pkgFiles,\n customPrompt,\n features,\n sections,\n })\n\n const skilldDir = join(skillDir, '.skilld')\n mkdirSync(skilldDir, { recursive: true })\n\n for (const [section, prompt] of prompts)\n writeFileSync(join(skilldDir, `PROMPT_${section}.md`), prompt)\n\n const written = [...prompts.keys()]\n if (written.length > 0) {\n const relDir = relative(process.cwd(), skillDir)\n const promptFiles = written.map(s => `PROMPT_${s}.md`).join(', ')\n const outputFileList = written.map(s => SECTION_OUTPUT_FILES[s]).join(', ')\n p.log.info(`Prompt files written to ${relDir}/.skilld/\\n\\x1B[2m\\x1B[3m Read each prompt file (${promptFiles}) in ${relDir}/.skilld/, read the\\n referenced files, then write your output to the matching file (${outputFileList}).\\n When done, run: skilld assemble\\x1B[0m`)\n }\n\n return written\n}\n","/**\n * Anonymous telemetry — fire-and-forget GET to add-skill.vercel.sh/t\n *\n * Opt-out: set DISABLE_TELEMETRY=1 or DO_NOT_TRACK=1\n * Auto-disabled in CI environments.\n */\n\nimport { isCI } from 'std-env'\n\nconst TELEMETRY_URL = 'https://add-skill.vercel.sh/t'\nconst SKILLS_VERSION = '1.3.9'\n\ninterface InstallTelemetryData {\n event: 'install'\n source: string\n skills: string\n agents: string\n global?: '1'\n skillFiles?: string\n sourceType?: string\n}\n\ninterface RemoveTelemetryData {\n event: 'remove'\n source?: string\n skills: string\n agents: string\n global?: '1'\n sourceType?: string\n}\n\ntype TelemetryData\n = | InstallTelemetryData\n | RemoveTelemetryData\n\nfunction isEnabled(): boolean {\n return !process.env.DISABLE_TELEMETRY && !process.env.DO_NOT_TRACK\n}\n\nexport function track(data: TelemetryData): void {\n if (!isEnabled())\n return\n\n try {\n const params = new URLSearchParams()\n\n params.set('v', SKILLS_VERSION)\n\n if (isCI)\n params.set('ci', '1')\n\n for (const [key, value] of Object.entries(data)) {\n if (value !== undefined && value !== null)\n params.set(key, String(value))\n }\n\n // Fire and forget\n fetch(`${TELEMETRY_URL}?${params.toString()}`).catch(() => {})\n }\n catch {\n // Telemetry should never break the CLI\n }\n}\n","/**\n * Git skill sync — install pre-authored skills from git repos,\n * or generate skills 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 * as p from '@clack/prompts'\nimport { dirname, join, relative } from 'pathe'\nimport {\n agents,\n generateSkillMd,\n getModelLabel,\n linkSkillToAgents,\n sanitizeName,\n} from '../agent/index.ts'\nimport {\n CACHE_DIR,\n ensureCacheDir,\n getCacheDir,\n getPkgKeyFiles,\n getVersionKey,\n hasShippedDocs,\n isCached,\n resolvePkgDir,\n} from '../cache/index.ts'\nimport { defaultFeatures, readConfig, registerProject } from '../core/config.ts'\nimport { timedSpinner } from '../core/formatting.ts'\nimport { writeLock } from '../core/lockfile.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport { getSharedSkillsDir } from '../core/shared.ts'\nimport { shutdownWorker } from '../retriv/pool.ts'\nimport { fetchGitSkills } from '../sources/git-skills.ts'\nimport { resolveGitHubRepo } from '../sources/github.ts'\nimport { track } from '../telemetry.ts'\nimport {\n detectChangelog,\n enhanceSkillWithLLM,\n ensureAgentInstructions,\n ensureGitignore,\n fetchAndCacheResources,\n indexResources,\n linkAllReferences,\n resolveBaseDir,\n selectLlmConfig,\n writePromptFiles,\n} from './sync-shared.ts'\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 /** Filter to specific skill names (comma-separated via --skill flag) */\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 // No pre-authored skills — fall back to generating from repo docs (GitHub only)\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 // Select skills to install\n let selected = skills\n\n if (opts.skillFilter?.length) {\n // --skill flag: filter to matching names (strip -skilld suffix for comparison)\n const filterSet = new Set(opts.skillFilter.map(s => s.toLowerCase().replace(/-skilld$/, '')))\n selected = skills.filter(s => filterSet.has(s.name.toLowerCase().replace(/-skilld$/, '')))\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 // Direct path: auto-select the matched skill\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(/-skilld$/, ''),\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 // Install each selected skill\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 // Sanitize and write SKILL.md\n writeFileSync(join(skillDir, 'SKILL.md'), sanitizeMarkdown(skill.content))\n\n // Write supporting files directly in skill dir (not under .skilld/)\n // so SKILL.md relative paths like ./references/docs/guide.md resolve correctly\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 // Write lockfile entry\n const sourceType = source.type === 'local' ? 'local' : source.type\n writeLock(baseDir, skill.name, {\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: new Date().toISOString().split('T')[0],\n generator: 'external',\n })\n }\n\n if (!isGlobal)\n registerProject(cwd)\n\n // Track telemetry (skip local sources)\n if (source.type !== 'local' && source.owner && source.repo) {\n track({\n event: 'install',\n source: `${source.owner}/${source.repo}`,\n skills: selected.map(s => s.name).join(','),\n agents: agent,\n ...(isGlobal && { global: '1' as const }),\n sourceType: source.type,\n })\n }\n\n const names = selected.map(s => `\\x1B[36m${s.name}\\x1B[0m`).join(', ')\n p.log.success(`Installed ${names}`)\n}\n\n/**\n * Generate a skill from a GitHub repo's docs (no npm package required).\n * Uses the same pipeline as npm packages: resolve → fetch → cache → generate → LLM enhance.\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\n const spin = timedSpinner()\n spin.start(`Resolving ${owner}/${repo}`)\n\n const resolved = await resolveGitHubRepo(owner, repo, msg => spin.message(msg))\n if (!resolved) {\n spin.stop(`Could not find docs for ${owner}/${repo}`)\n return\n }\n\n const repoUrl = `https://github.com/${owner}/${repo}`\n const packageName = `${owner}-${repo}`\n const version = resolved.version || 'main'\n const versionKey = getVersionKey(version)\n const useCache = isCached(packageName, version)\n\n spin.stop(`Resolved ${owner}/${repo}@${useCache ? versionKey : version}${useCache ? ' (cached)' : ''}`)\n\n ensureCacheDir()\n\n const baseDir = resolveBaseDir(cwd, agent, isGlobal)\n const skillDirName = sanitizeName(`${owner}-${repo}`)\n const skillDir = join(baseDir, skillDirName)\n mkdirSync(skillDir, { recursive: true })\n\n const features = readConfig().features ?? defaultFeatures\n\n // Phase 1: Fetch & cache all resources\n const resSpin = timedSpinner()\n resSpin.start('Finding resources')\n const resources = await fetchAndCacheResources({\n packageName,\n resolved,\n version,\n useCache,\n features,\n from: opts.from,\n onProgress: msg => resSpin.message(msg),\n })\n const resParts: string[] = []\n if (resources.docsToIndex.length > 0) {\n const docCount = resources.docsToIndex.filter(d => d.metadata?.type === 'doc').length\n if (docCount > 0)\n resParts.push(`${docCount} docs`)\n }\n if (resources.hasIssues)\n resParts.push('issues')\n if (resources.hasDiscussions)\n resParts.push('discussions')\n if (resources.hasReleases)\n resParts.push('releases')\n resSpin.stop(`Fetched ${resParts.length > 0 ? resParts.join(', ') : 'resources'}`)\n for (const w of resources.warnings)\n p.log.warn(`\\x1B[33m${w}\\x1B[0m`)\n\n // Create symlinks (linkPkg/linkPkgNamed gracefully skip when no node_modules)\n linkAllReferences(skillDir, packageName, cwd, version, resources.docsType, undefined, features)\n\n // Phase 2: Search index\n if (features.search) {\n const idxSpin = timedSpinner()\n idxSpin.start('Creating search index')\n await indexResources({\n packageName,\n version,\n cwd,\n docsToIndex: resources.docsToIndex,\n features,\n onProgress: msg => idxSpin.message(msg),\n })\n idxSpin.stop('Search index ready')\n }\n\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const hasChangelog = detectChangelog(pkgDir, getCacheDir(packageName, version))\n const shippedDocs = hasShippedDocs(packageName, cwd, version)\n const pkgFiles = getPkgKeyFiles(packageName, cwd, version)\n\n // Write lockfile\n writeLock(baseDir, skillDirName, {\n packageName,\n version,\n repo: `${owner}/${repo}`,\n source: resources.docSource,\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n\n // Write base SKILL.md\n const baseSkillMd = generateSkillMd({\n name: packageName,\n version,\n releasedAt: resolved.releasedAt,\n description: resolved.description,\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 repoUrl,\n features,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), baseSkillMd)\n\n p.log.success(`Created base skill: ${relative(cwd, skillDir)}`)\n\n // LLM enhancement\n const globalConfig = readConfig()\n if (!globalConfig.skipLlm && (!yes || opts.model)) {\n const llmConfig = await selectLlmConfig(opts.model)\n if (llmConfig?.promptOnly) {\n writePromptFiles({\n packageName,\n skillDir,\n version,\n hasIssues: resources.hasIssues,\n hasDiscussions: resources.hasDiscussions,\n hasReleases: resources.hasReleases,\n hasChangelog,\n docsType: resources.docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features,\n })\n }\n else if (llmConfig) {\n p.log.step(getModelLabel(llmConfig.model))\n await enhanceSkillWithLLM({\n packageName,\n version,\n skillDir,\n dirName: skillDirName,\n model: llmConfig.model,\n resolved,\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 force: opts.force,\n debug: opts.debug,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features,\n })\n }\n }\n\n // Link shared dir to per-agent dirs\n const shared = !isGlobal && getSharedSkillsDir(cwd)\n if (shared)\n linkSkillToAgents(skillDirName, shared, cwd, agent)\n\n if (!isGlobal) {\n registerProject(cwd)\n const skillsDir = shared || agents[agent].skillsDir\n await ensureGitignore(skillsDir, cwd, isGlobal)\n await ensureAgentInstructions(agent, cwd, isGlobal)\n }\n\n await shutdownWorker()\n\n track({\n event: 'install',\n source: `${owner}/${repo}`,\n skills: skillDirName,\n agents: agent,\n ...(isGlobal && { global: '1' as const }),\n sourceType: 'github-generated',\n })\n\n p.outro(`Synced ${owner}/${repo} to ${relative(cwd, skillDir)}`)\n}\n","import type { AgentType, CustomPrompt, OptimizeModel, SkillSection } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport type { ResolvedPackage } from '../sources/index.ts'\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/index.ts'\nimport {\n ensureCacheDir,\n getCacheDir,\n getPkgKeyFiles,\n getVersionKey,\n hasShippedDocs,\n isCached,\n linkPkgNamed,\n listReferenceFiles,\n resolvePkgDir,\n} from '../cache/index.ts'\nimport { defaultFeatures, readConfig, registerProject } from '../core/config.ts'\nimport { formatDuration } from '../core/formatting.ts'\nimport { parsePackages, readLock, writeLock } from '../core/lockfile.ts'\nimport { getSharedSkillsDir, SHARED_SKILLS_DIR } from '../core/shared.ts'\nimport { shutdownWorker } from '../retriv/pool.ts'\nimport {\n fetchPkgDist,\n parsePackageSpec,\n readLocalDependencies,\n resolvePackageDocsWithAttempts,\n searchNpmPackages,\n} from '../sources/index.ts'\n\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.ts'\nimport { ensureAgentInstructions, ensureGitignore, selectLlmConfig, writePromptFiles } from './sync.ts'\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 mode?: 'add' | 'update'\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 warnings: string[]\n features?: FeaturesConfig\n usedCache: boolean\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 = Array.from(states.values(), (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 verb = config.mode === 'update' ? 'Updating' : 'Syncing'\n const header = `\\x1B[1m${verb} ${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 pastVerb = config.mode === 'update' ? 'Updated' : 'Created'\n const skillMsg = `${pastVerb} ${successfulPkgs.length} base skills${shippedPkgs.length > 1 ? ` (Skipping ${shippedPkgs.length})` : ''}`\n p.log.success(skillMsg)\n\n for (const [, data] of skillData) {\n for (const w of data.warnings)\n p.log.warn(`\\x1B[33m${w}\\x1B[0m`)\n }\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?.promptOnly) {\n for (const pkg of successfulPkgs) {\n const data = skillData.get(pkg)!\n const baseDir = resolveBaseDir(cwd, config.agent, config.global)\n const skillDir = join(baseDir, data.skillDirName)\n writePromptFiles({\n packageName: pkg,\n skillDir,\n version: data.version,\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 sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features: data.features,\n })\n }\n }\n else 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 await ensureAgentInstructions(config.agent, cwd, config.global)\n\n await shutdownWorker()\n\n p.outro(`${pastVerb} ${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 packageSpec: string,\n config: ParallelSyncConfig,\n cwd: string,\n update: UpdateFn,\n): Promise<'shipped' | BaseSkillData> {\n // Parse dist-tag from spec: \"vue@beta\" → name=\"vue\", tag=\"beta\"\n const { name: packageName, tag: requestedTag } = parsePackageSpec(packageSpec)\n\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(requestedTag ? packageSpec : 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, config.agent)\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)\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, undefined, features, resources.repoInfo)\n\n // Index all resources (single batch)\n if (features.search) {\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\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const hasChangelog = detectChangelog(pkgDir, getCacheDir(packageName, version))\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 features,\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, config.agent)\n\n if (!config.global) {\n registerProject(cwd)\n }\n\n update(packageName, 'done', config.mode === 'update' ? 'Skill updated' : '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 warnings: resources.warnings,\n features,\n usedCache: resources.usedCache,\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 features: data.features,\n pkgFiles: data.pkgFiles,\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 features: data.features,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n }\n\n update(packageName, 'done', 'Skill optimized', versionKey)\n}\n","import type { AgentType, OptimizeModel, SkillSection } from '../agent/index.ts'\nimport type { ProjectState } from '../core/skills.ts'\nimport type { GitSkillSource } from '../sources/git-skills.ts'\nimport type { ResolveAttempt } from '../sources/index.ts'\nimport { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { join, relative, resolve } from 'pathe'\nimport {\n agents,\n buildAllSectionPrompts,\n computeSkillDirName,\n detectImportedPackages,\n generateSkillMd,\n getModelLabel,\n linkSkillToAgents,\n portabilizePrompt,\n sanitizeName,\n SECTION_OUTPUT_FILES,\n} from '../agent/index.ts'\nimport {\n ensureCacheDir,\n getCacheDir,\n getPkgKeyFiles,\n getVersionKey,\n hasShippedDocs,\n isCached,\n linkPkgNamed,\n listReferenceFiles,\n resolvePkgDir,\n} from '../cache/index.ts'\nimport { getInstalledGenerators, introLine, isInteractive, promptForAgent, resolveAgent, sharedArgs } from '../cli-helpers.ts'\nimport { defaultFeatures, hasCompletedWizard, readConfig, registerProject } from '../core/config.ts'\nimport { timedSpinner } from '../core/formatting.ts'\nimport { parsePackages, readLock, writeLock } from '../core/lockfile.ts'\nimport { getSharedSkillsDir, SHARED_SKILLS_DIR } from '../core/shared.ts'\nimport { getProjectState } from '../core/skills.ts'\nimport { shutdownWorker } from '../retriv/pool.ts'\nimport { parseGitSkillInput } from '../sources/git-skills.ts'\nimport {\n fetchPkgDist,\n isPrerelease,\n parsePackageSpec,\n readLocalDependencies,\n resolvePackageDocsWithAttempts,\n searchNpmPackages,\n} from '../sources/index.ts'\nimport { syncGitSkills } from './sync-git.ts'\nimport { syncPackagesParallel } from './sync-parallel.ts'\nimport {\n DEFAULT_SECTIONS,\n detectChangelog,\n ejectReferences,\n enhanceSkillWithLLM,\n ensureAgentInstructions,\n ensureGitignore,\n fetchAndCacheResources,\n findRelatedSkills,\n forceClearCache,\n handleShippedSkills,\n indexResources,\n linkAllReferences,\n RESOLVE_STEP_LABELS,\n resolveBaseDir,\n resolveLocalDep,\n selectLlmConfig,\n writePromptFiles,\n} from './sync-shared.ts'\nimport { runWizard } from './wizard.ts'\n\n// Re-export for external consumers\nexport { DEFAULT_SECTIONS, enhanceSkillWithLLM, ensureAgentInstructions, ensureGitignore, selectLlmConfig, selectModel, selectSkillSections, SKILLD_MARKER_END, SKILLD_MARKER_START, writePromptFiles } from './sync-shared.ts'\nexport type { EnhanceOptions, LlmConfig } from './sync-shared.ts'\n\nfunction showResolveAttempts(attempts: ResolveAttempt[]): void {\n if (attempts.length === 0)\n return\n\n p.log.message('\\x1B[90mResolution attempts:\\x1B[0m')\n for (const attempt of attempts) {\n const icon = attempt.status === 'success' ? '\\x1B[32m✓\\x1B[0m' : '\\x1B[90m✗\\x1B[0m'\n const source = `\\x1B[90m${attempt.source}\\x1B[0m`\n const msg = attempt.message ? ` - ${attempt.message}` : ''\n p.log.message(` ${icon} ${source}${msg}`)\n }\n}\n\nexport interface SyncOptions {\n packages?: string[]\n global: boolean\n agent: AgentType\n model?: OptimizeModel\n yes: boolean\n force?: boolean\n debug?: boolean\n mode?: 'add' | 'update'\n /** Eject mode: copy references as real files instead of symlinking */\n eject?: boolean | string\n /** Override the computed skill directory name */\n name?: string\n /** Lower-bound date for release/issue/discussion collection (ISO date, e.g. \"2025-07-01\") */\n from?: string\n /** Skip search index / embeddings generation */\n noSearch?: boolean\n}\n\nexport async function syncCommand(state: ProjectState, opts: SyncOptions): Promise<void> {\n // If packages specified, sync those\n if (opts.packages && opts.packages.length > 0) {\n // Use parallel sync for multiple packages\n if (opts.packages.length > 1) {\n return syncPackagesParallel({\n packages: opts.packages,\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 mode: opts.mode,\n })\n }\n\n // Single package - use original flow for cleaner output\n await syncSinglePackage(opts.packages[0]!, opts)\n return\n }\n\n // Otherwise show picker, pre-selecting missing/outdated\n const packages = await interactivePicker(state)\n if (!packages || packages.length === 0) {\n p.outro('No packages selected')\n return\n }\n\n // Use parallel sync for multiple packages\n if (packages.length > 1) {\n return syncPackagesParallel({\n packages,\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 mode: opts.mode,\n })\n }\n\n // Single package - use original flow\n await syncSinglePackage(packages[0]!, opts)\n}\n\nasync function interactivePicker(state: ProjectState): Promise<string[] | null> {\n const spin = timedSpinner()\n spin.start('Detecting imports...')\n\n const cwd = process.cwd()\n const { packages: detected, error } = await detectImportedPackages(cwd)\n const declaredMap = state.deps\n\n if (error || detected.length === 0) {\n spin.stop(error ? `Detection failed: ${error}` : 'No imports detected')\n if (declaredMap.size === 0) {\n p.log.warn('No dependencies found')\n return null\n }\n // Fallback to package.json\n return pickFromList(Array.from(declaredMap.entries(), ([name, version]) => ({\n name,\n version: maskPatch(version),\n count: 0,\n inPkgJson: true,\n })), state)\n }\n\n spin.stop(`Loaded ${detected.length} project skills`)\n\n const packages = detected.map(pkg => ({\n name: pkg.name,\n version: declaredMap.get(pkg.name),\n count: pkg.count,\n inPkgJson: declaredMap.has(pkg.name),\n }))\n\n return pickFromList(packages, state)\n}\n\nfunction maskPatch(version: string | undefined): string | undefined {\n if (!version)\n return undefined\n const parts = version.split('.')\n if (parts.length >= 3) {\n parts[2] = 'x'\n return parts.slice(0, 3).join('.')\n }\n return version\n}\n\nasync function pickFromList(\n packages: Array<{ name: string, version?: string, count: number, inPkgJson: boolean }>,\n state: ProjectState,\n): Promise<string[] | null> {\n // Pre-select missing and outdated\n const missingSet = new Set(state.missing)\n const outdatedSet = new Set(state.outdated.map(s => s.name))\n\n const options = packages.map(pkg => ({\n label: pkg.inPkgJson ? `${pkg.name} ★` : pkg.name,\n value: pkg.name,\n hint: [\n maskPatch(pkg.version),\n pkg.count > 0 ? `${pkg.count} imports` : null,\n ].filter(Boolean).join(' · ') || undefined,\n }))\n\n const initialValues = packages\n .filter(pkg => missingSet.has(pkg.name) || outdatedSet.has(pkg.name))\n .map(pkg => pkg.name)\n\n const selected = await p.multiselect({\n message: 'Select packages to sync',\n options,\n required: false,\n initialValues,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled')\n return null\n }\n\n return selected as string[]\n}\n\ninterface SyncConfig {\n global: boolean\n agent: AgentType\n model?: OptimizeModel\n yes: boolean\n force?: boolean\n debug?: boolean\n mode?: 'add' | 'update'\n eject?: boolean | string\n name?: string\n from?: string\n noSearch?: boolean\n}\n\nasync function syncSinglePackage(packageSpec: string, config: SyncConfig): Promise<void> {\n // Parse dist-tag from spec: \"vue@beta\" → name=\"vue\", tag=\"beta\"\n const { name: packageName, tag: requestedTag } = parsePackageSpec(packageSpec)\n\n const spin = timedSpinner()\n spin.start(`Resolving ${packageSpec}`)\n\n const cwd = process.cwd()\n const localDeps = await readLocalDependencies(cwd).catch(() => [])\n const localVersion = localDeps.find(d => d.name === packageName)?.version\n\n // Try npm first — use full spec for npm resolution (unpkg supports dist-tags)\n const resolveResult = await resolvePackageDocsWithAttempts(requestedTag ? packageSpec : packageName, {\n version: localVersion,\n cwd,\n onProgress: step => spin.message(`${packageName}: ${RESOLVE_STEP_LABELS[step]}`),\n })\n let resolved = resolveResult.package\n\n // If npm fails, check if it's a link: dep and try local resolution\n if (!resolved) {\n spin.message(`Resolving local package: ${packageName}`)\n resolved = await resolveLocalDep(packageName, cwd)\n }\n\n if (!resolved) {\n // Search npm for alternatives before giving up\n spin.message(`Searching npm for \"${packageName}\"...`)\n const suggestions = await searchNpmPackages(packageName)\n\n if (suggestions.length > 0) {\n spin.stop(`Package \"${packageName}\" not found on npm`)\n showResolveAttempts(resolveResult.attempts)\n\n const selected = await p.select({\n message: 'Did you mean one of these?',\n options: [\n ...suggestions.map(s => ({\n label: s.name,\n value: s.name,\n hint: s.description,\n })),\n { label: 'None of these', value: '_none_' as const },\n ],\n })\n\n if (!p.isCancel(selected) && selected !== '_none_')\n return syncSinglePackage(selected as string, config)\n\n return\n }\n\n spin.stop(`Could not find docs for: ${packageName}`)\n showResolveAttempts(resolveResult.attempts)\n return\n }\n\n const version = localVersion || resolved.version || 'latest'\n const versionKey = getVersionKey(version)\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\n // Download npm dist if not in node_modules (for standalone/learning use)\n if (!existsSync(join(cwd, 'node_modules', packageName))) {\n spin.message(`Downloading ${packageName}@${version} dist`)\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 for (const shipped of shippedResult.shipped) {\n if (shared)\n linkSkillToAgents(shipped.skillName, shared, cwd, config.agent)\n p.log.success(`Using published SKILL.md: ${shipped.skillName} → ${relative(cwd, shipped.skillDir)}`)\n }\n spin.stop(`Using published SKILL.md(s) from ${packageName}`)\n return\n }\n\n spin.stop(`Resolved ${packageName}@${useCache ? versionKey : version}${config.force ? ' (force)' : useCache ? ' (cached)' : ''}`)\n\n // Warn when no local dep and resolved to stable latest — prerelease releases won't be fetched\n if (!localVersion && !requestedTag && !isPrerelease(version)) {\n const nextTag = resolved.distTags?.next ?? resolved.distTags?.beta ?? resolved.distTags?.alpha\n if (nextTag && (!resolved.releasedAt || !nextTag.releasedAt || nextTag.releasedAt > resolved.releasedAt)) {\n p.log.warn(`\\x1B[33mNo local dependency found — using latest stable (${version}). Prerelease ${nextTag.version} available: skilld add ${packageName}@beta\\x1B[0m`)\n }\n }\n\n ensureCacheDir()\n\n const baseDir = resolveBaseDir(cwd, config.agent, config.global)\n const skillDirName = config.name ? sanitizeName(config.name) : computeSkillDirName(packageName)\n // Eject path override: default to ./skills/<name>, or use specified directory\n const skillDir = config.eject\n ? typeof config.eject === 'string'\n ? join(resolve(cwd, config.eject), skillDirName)\n : join(cwd, 'skills', skillDirName)\n : join(baseDir, skillDirName)\n mkdirSync(skillDir, { recursive: true })\n\n // ── Merge mode: skill dir already exists with a different primary package (skip in eject) ──\n const existingLock = config.eject ? undefined : readLock(baseDir)?.skills[skillDirName]\n const isMerge = existingLock && existingLock.packageName && existingLock.packageName !== packageName\n\n if (isMerge) {\n spin.stop(`Merging ${packageName} into ${skillDirName}`)\n\n // Create named symlink for this package\n linkPkgNamed(skillDir, packageName, cwd, version)\n\n // Merge into lockfile\n const repoSlug = resolved.repoUrl?.match(/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?(?:[/#]|$)/)?.[1]\n writeLock(baseDir, skillDirName, {\n packageName,\n version,\n repo: repoSlug,\n source: existingLock.source,\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n\n // Regenerate SKILL.md with all packages listed\n const updatedLock = readLock(baseDir)?.skills[skillDirName]\n const allPackages = parsePackages(updatedLock?.packages).map(p => ({ name: p.name }))\n const relatedSkills = await findRelatedSkills(packageName, baseDir)\n const pkgFiles = getPkgKeyFiles(existingLock.packageName!, cwd, existingLock.version)\n const shippedDocs = hasShippedDocs(existingLock.packageName!, cwd, existingLock.version)\n\n const mergeFeatures = readConfig().features ?? defaultFeatures\n const skillMd = generateSkillMd({\n name: existingLock.packageName!,\n version: existingLock.version,\n relatedSkills,\n hasIssues: mergeFeatures.issues && existsSync(join(skillDir, '.skilld', 'issues')),\n hasDiscussions: mergeFeatures.discussions && existsSync(join(skillDir, '.skilld', 'discussions')),\n hasReleases: mergeFeatures.releases && existsSync(join(skillDir, '.skilld', 'releases')),\n docsType: (existingLock.source?.includes('llms.txt') ? 'llms.txt' : 'docs') as 'llms.txt' | 'readme' | 'docs',\n hasShippedDocs: shippedDocs,\n pkgFiles,\n dirName: skillDirName,\n packages: allPackages,\n features: mergeFeatures,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n\n const mergeShared = !config.global && getSharedSkillsDir(cwd)\n if (mergeShared)\n linkSkillToAgents(skillDirName, mergeShared, cwd, config.agent)\n\n if (!config.global)\n registerProject(cwd)\n\n p.outro(`Merged ${packageName} into ${skillDirName}`)\n return\n }\n\n const features = { ...(readConfig().features ?? defaultFeatures) }\n if (config.noSearch)\n features.search = false\n\n // ── Phase 1: Fetch & cache all resources ──\n const resSpin = timedSpinner()\n resSpin.start('Finding resources')\n const resources = await fetchAndCacheResources({\n packageName,\n resolved,\n version,\n useCache,\n features,\n from: config.from,\n onProgress: msg => resSpin.message(msg),\n })\n const resParts: string[] = []\n if (resources.docsToIndex.length > 0) {\n const docCount = resources.docsToIndex.filter(d => d.metadata?.type === 'doc').length\n if (docCount > 0)\n resParts.push(`${docCount} docs`)\n }\n if (resources.hasIssues)\n resParts.push('issues')\n if (resources.hasDiscussions)\n resParts.push('discussions')\n if (resources.hasReleases)\n resParts.push('releases')\n resSpin.stop(resources.usedCache\n ? `Loaded ${resParts.length > 0 ? resParts.join(', ') : 'resources'} (cached)`\n : `Fetched ${resParts.length > 0 ? resParts.join(', ') : 'resources'}`,\n )\n for (const w of resources.warnings)\n p.log.warn(`\\x1B[33m${w}\\x1B[0m`)\n\n // Create symlinks (LLM needs .skilld/ to read docs, even in eject mode)\n linkAllReferences(skillDir, packageName, cwd, version, resources.docsType, undefined, features, resources.repoInfo)\n\n // ── Phase 2: Search index (generated even in eject mode so LLM can use it) ──\n if (features.search) {\n const idxSpin = timedSpinner()\n idxSpin.start('Creating search index')\n await indexResources({\n packageName,\n version,\n cwd,\n docsToIndex: resources.docsToIndex,\n features,\n onProgress: msg => idxSpin.message(msg),\n })\n idxSpin.stop('Search index ready')\n }\n\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const hasChangelog = detectChangelog(pkgDir, getCacheDir(packageName, version))\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 (no LLM needed)\n const repoSlug = resolved.repoUrl?.match(/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?(?:[/#]|$)/)?.[1]\n\n // Also create named symlink for this package (skip in eject mode)\n if (!config.eject)\n linkPkgNamed(skillDir, packageName, cwd, version)\n\n // Skip lockfile in eject mode — no agent skills dir to write to\n if (!config.eject) {\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\n // Read back merged packages from lockfile for SKILL.md generation\n const updatedLock = config.eject ? undefined : readLock(baseDir)?.skills[skillDirName]\n const allPackages = parsePackages(updatedLock?.packages).map(p => ({ name: p.name }))\n\n const isEject = !!config.eject\n const baseSkillMd = 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 features,\n eject: isEject,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), baseSkillMd)\n\n p.log.success(config.mode === 'update' ? `Updated skill: ${relative(cwd, skillDir)}` : `Created base skill: ${relative(cwd, skillDir)}`)\n\n // Ask about LLM optimization (skip if -y flag, skipLlm config, or model already specified)\n const globalConfig = readConfig()\n if (!globalConfig.skipLlm && (!config.yes || config.model)) {\n const llmConfig = await selectLlmConfig(config.model)\n if (llmConfig?.promptOnly) {\n writePromptFiles({\n packageName,\n skillDir,\n version,\n hasIssues: resources.hasIssues,\n hasDiscussions: resources.hasDiscussions,\n hasReleases: resources.hasReleases,\n hasChangelog,\n docsType: resources.docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features,\n })\n }\n else if (llmConfig) {\n p.log.step(getModelLabel(llmConfig.model))\n await enhanceSkillWithLLM({\n packageName,\n version,\n skillDir,\n dirName: skillDirName,\n model: llmConfig.model,\n resolved,\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 force: config.force,\n debug: config.debug,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n packages: allPackages.length > 1 ? allPackages : undefined,\n features,\n eject: isEject,\n })\n }\n }\n\n // Eject: clean up transient .skilld/ symlinks → copy as real files\n if (isEject) {\n const skilldDir = join(skillDir, '.skilld')\n if (existsSync(skilldDir) && !config.debug)\n rmSync(skilldDir, { recursive: true, force: true })\n ejectReferences(skillDir, packageName, cwd, version, resources.docsType, features, resources.repoInfo)\n }\n\n // Skip agent integration in eject mode (no symlinks, no gitignore, no instructions)\n if (!isEject) {\n // Link shared dir to per-agent dirs\n const shared = !config.global && getSharedSkillsDir(cwd)\n if (shared)\n linkSkillToAgents(skillDirName, shared, cwd, config.agent)\n\n // Register project in global config (for uninstall tracking)\n if (!config.global) {\n registerProject(cwd)\n }\n\n await ensureGitignore(shared ? SHARED_SKILLS_DIR : agents[config.agent].skillsDir, cwd, config.global)\n await ensureAgentInstructions(config.agent, cwd, config.global)\n }\n\n await shutdownWorker()\n\n const ejectMsg = isEject ? ' (ejected)' : ''\n p.outro(config.mode === 'update' ? `Updated ${packageName}${ejectMsg}` : `Synced ${packageName} to ${relative(cwd, skillDir)}${ejectMsg}`)\n}\n\n// ── Citty command definitions (lazy-loaded by cli.ts) ──\n\nexport const addCommandDef = defineCommand({\n meta: { name: 'add', description: 'Add skills for package(s)' },\n args: {\n package: {\n type: 'positional',\n description: 'Package(s) to sync (space or comma-separated, e.g., vue nuxt pinia)',\n required: true,\n },\n skill: {\n type: 'string',\n alias: 's',\n description: 'Select specific skills from a git repo (comma-separated)',\n valueHint: 'name',\n },\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n let agent: AgentType | 'none' | null = resolveAgent(args.agent)\n if (!agent) {\n agent = await promptForAgent()\n if (!agent)\n return\n }\n\n // Collect raw inputs (don't split URLs on slashes/spaces yet)\n const rawInputs = [...new Set(\n [args.package, ...((args as any)._ || [])]\n .map((s: string) => s.trim())\n .filter(Boolean),\n )]\n\n // No-agent mode: export portable prompts\n if (agent === 'none') {\n const packages = [...new Set(rawInputs.flatMap(s => s.split(/[,\\s]+/)).map(s => s.trim()).filter(Boolean))]\n for (const pkg of packages)\n await exportPortablePrompts(pkg, { force: args.force, agent: 'none' })\n return\n }\n\n // First-time setup — configure features + LLM model\n if (!hasCompletedWizard())\n await runWizard()\n\n // Partition: git sources vs npm packages\n const gitSources: GitSkillSource[] = []\n const npmTokens: string[] = []\n\n for (const input of rawInputs) {\n const git = parseGitSkillInput(input)\n if (git)\n gitSources.push(git)\n else\n npmTokens.push(input)\n }\n\n // Handle git sources\n if (gitSources.length > 0) {\n for (const source of gitSources) {\n const skillFilter = args.skill ? args.skill.split(/[,\\s]+/).map((s: string) => s.trim()).filter(Boolean) : undefined\n await syncGitSkills({ source, global: args.global, agent, yes: args.yes, model: args.model as OptimizeModel | undefined, force: args.force, debug: args.debug, skillFilter })\n }\n }\n\n // Handle npm packages via existing flow\n if (npmTokens.length > 0) {\n const packages = [...new Set(npmTokens.flatMap(s => s.split(/[,\\s]+/)).map(s => s.trim()).filter(Boolean))]\n const state = await getProjectState(cwd)\n p.intro(introLine({ state }))\n return syncCommand(state, {\n packages,\n global: args.global,\n agent,\n model: args.model as OptimizeModel | undefined,\n yes: args.yes,\n force: args.force,\n debug: args.debug,\n })\n }\n },\n})\n\nexport const ejectCommandDef = defineCommand({\n meta: { name: 'eject', description: 'Eject skill with references as real files (portable, no symlinks)' },\n args: {\n package: {\n type: 'positional',\n description: 'Package to eject',\n required: true,\n },\n name: {\n type: 'string',\n alias: 'n',\n description: 'Custom skill directory name (default: derived from package)',\n },\n out: {\n type: 'string',\n alias: 'o',\n description: 'Output directory path override',\n },\n from: {\n type: 'string',\n description: 'Collect releases/issues/discussions from this date onward (YYYY-MM-DD)',\n },\n search: {\n type: 'boolean',\n description: 'Build search index / embeddings (use --no-search to skip)',\n default: true,\n },\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n // Eject skips agent detection — output goes to ./skills/<name> by default\n const resolved = resolveAgent(args.agent)\n const agent: AgentType = resolved && resolved !== 'none' ? resolved : 'claude-code'\n\n if (!hasCompletedWizard())\n await runWizard()\n\n const state = await getProjectState(cwd)\n p.intro(introLine({ state }))\n return syncCommand(state, {\n packages: [args.package],\n global: args.global,\n agent,\n model: args.model as OptimizeModel | undefined,\n yes: args.yes,\n force: args.force,\n debug: args.debug,\n eject: args.out || true,\n name: args.name,\n from: args.from,\n noSearch: !args.search,\n })\n },\n})\n\nexport const updateCommandDef = defineCommand({\n meta: { name: 'update', description: 'Update outdated skills' },\n args: {\n package: {\n type: 'positional',\n description: 'Package(s) to update (space or comma-separated). Without args, syncs all outdated.',\n required: false,\n },\n background: {\n type: 'boolean',\n alias: 'b',\n description: 'Run in background (detached process, non-interactive)',\n default: false,\n },\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n\n // Background mode: spawn detached `skilld update` and exit immediately\n if (args.background) {\n const { spawn } = await import('node:child_process')\n const updateArgs = ['update', ...(args.package ? [args.package] : []), ...(args.agent ? ['--agent', args.agent] : []), ...(args.model ? ['--model', args.model as string] : [])]\n const child = spawn(process.execPath, [process.argv[1], ...updateArgs], {\n cwd,\n detached: true,\n stdio: 'ignore',\n })\n child.unref()\n return\n }\n\n const silent = !isInteractive()\n\n let agent = resolveAgent(args.agent)\n if (!agent) {\n agent = await promptForAgent()\n if (!agent)\n return\n }\n\n // No-agent mode: re-export portable prompts for outdated packages\n if (agent === 'none') {\n const state = await getProjectState(cwd)\n const packages = args.package\n ? [...new Set([args.package, ...((args as any)._ || [])].flatMap(s => s.split(/[,\\s]+/)).map(s => s.trim()).filter(Boolean))]\n : state.outdated.map(s => s.packageName || s.name)\n if (packages.length === 0) {\n if (!silent)\n p.log.success('All skills up to date')\n return\n }\n for (const pkg of packages)\n await exportPortablePrompts(pkg, { force: args.force, agent: 'none' })\n return\n }\n\n const config = readConfig()\n const state = await getProjectState(cwd)\n\n if (!silent) {\n const generators = getInstalledGenerators()\n p.intro(introLine({ state, generators, modelId: config.model }))\n }\n\n // Specific packages\n if (args.package) {\n const packages = [...new Set([args.package, ...((args as any)._ || [])].flatMap(s => s.split(/[,\\s]+/)).map(s => s.trim()).filter(Boolean))]\n return syncCommand(state, {\n packages,\n global: args.global,\n agent,\n model: (args.model as OptimizeModel | undefined) || (silent ? config.model : undefined),\n yes: args.yes || silent,\n force: args.force,\n debug: args.debug,\n mode: 'update',\n })\n }\n\n // No args: sync all outdated\n if (state.outdated.length === 0) {\n p.log.success('All skills up to date')\n return\n }\n\n const packages = state.outdated.map(s => s.packageName || s.name)\n return syncCommand(state, {\n packages,\n global: args.global,\n agent,\n model: (args.model as OptimizeModel | undefined) || (silent ? config.model : undefined),\n yes: args.yes || silent,\n force: args.force,\n debug: args.debug,\n mode: 'update',\n })\n },\n})\n\n// ── Portable prompt export (no-agent mode) ─────────────────────\n\nexport async function exportPortablePrompts(packageSpec: string, opts: {\n out?: string\n sections?: SkillSection[]\n force?: boolean\n agent?: AgentType | 'none'\n}): Promise<void> {\n const { name: packageName } = parsePackageSpec(packageSpec)\n const sections = opts.sections ?? DEFAULT_SECTIONS\n\n const spin = timedSpinner()\n spin.start(`Resolving ${packageSpec}`)\n\n const cwd = process.cwd()\n const localDeps = await readLocalDependencies(cwd).catch(() => [])\n const localVersion = localDeps.find(d => d.name === packageName)?.version\n\n const resolveResult = await resolvePackageDocsWithAttempts(packageName, {\n version: localVersion,\n cwd,\n onProgress: step => spin.message(`${packageName}: ${RESOLVE_STEP_LABELS[step]}`),\n })\n let resolved = resolveResult.package\n\n if (!resolved) {\n spin.message(`Resolving local package: ${packageName}`)\n resolved = await resolveLocalDep(packageName, cwd)\n }\n\n if (!resolved) {\n spin.stop(`Could not find docs for: ${packageName}`)\n return\n }\n\n const version = localVersion || resolved.version || 'latest'\n const versionKey = getVersionKey(version)\n const useCache = !opts.force && isCached(packageName, version)\n\n // Download npm dist if not in node_modules\n if (!existsSync(join(cwd, 'node_modules', packageName))) {\n spin.message(`Downloading ${packageName}@${version} dist`)\n await fetchPkgDist(packageName, version)\n }\n\n spin.stop(`Resolved ${packageName}@${useCache ? versionKey : version}`)\n ensureCacheDir()\n\n const skillDirName = computeSkillDirName(packageName)\n const features = readConfig().features ?? defaultFeatures\n\n // Resolve skill dir — detect agent unless explicitly 'none'\n const agent: AgentType | null = opts.agent === 'none'\n ? null\n : opts.agent ?? (await import('../agent/detect.ts').then(m => m.detectTargetAgent()))\n const baseDir = agent\n ? resolveBaseDir(cwd, agent, false)\n : join(cwd, '.claude', 'skills') // fallback when no agent detected\n const skillDir = opts.out ? resolve(cwd, opts.out) : join(baseDir, skillDirName)\n\n // Warn if output files already exist (user may have pending work)\n if (existsSync(skillDir) && !opts.force) {\n const existing = Object.values(SECTION_OUTPUT_FILES).filter(f => existsSync(join(skillDir, f)))\n if (existing.length > 0)\n p.log.warn(`Overwriting existing output files in ${relative(cwd, skillDir)}: ${existing.join(', ')}`)\n }\n mkdirSync(skillDir, { recursive: true })\n\n // Fetch & cache resources\n const resSpin = timedSpinner()\n resSpin.start('Fetching resources')\n const resources = await fetchAndCacheResources({\n packageName,\n resolved,\n version,\n useCache,\n features,\n onProgress: msg => resSpin.message(msg),\n })\n resSpin.stop('Resources ready')\n for (const w of resources.warnings)\n p.log.warn(`\\x1B[33m${w}\\x1B[0m`)\n\n // Link references for prompt building\n linkAllReferences(skillDir, packageName, cwd, version, resources.docsType, undefined, features, resources.repoInfo)\n\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const hasChangelog = detectChangelog(pkgDir, getCacheDir(packageName, version))\n const shippedDocs = hasShippedDocs(packageName, cwd, version)\n const pkgFiles = getPkgKeyFiles(packageName, cwd, version)\n const docFiles = listReferenceFiles(skillDir)\n\n // Build prompts\n const prompts = buildAllSectionPrompts({\n packageName,\n skillDir,\n version,\n hasIssues: resources.hasIssues,\n hasDiscussions: resources.hasDiscussions,\n hasReleases: resources.hasReleases,\n hasChangelog,\n docFiles,\n docsType: resources.docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n features,\n sections,\n })\n\n // Eject references as real files, then remove .skilld/ symlinks\n ejectReferences(skillDir, packageName, cwd, version, resources.docsType, features, resources.repoInfo)\n const skilldDir = join(skillDir, '.skilld')\n if (existsSync(skilldDir))\n rmSync(skilldDir, { recursive: true, force: true })\n\n // Write portable prompts\n for (const [section, prompt] of prompts) {\n const portable = portabilizePrompt(prompt, section)\n writeFileSync(join(skillDir, `PROMPT_${section}.md`), portable)\n }\n\n // Generate SKILL.md (ejected — uses ./references/ paths)\n const relatedSkills = await findRelatedSkills(packageName, join(skillDir, '..'))\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 repoUrl: resolved.repoUrl,\n features,\n eject: true,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n\n // Write lockfile so skilld list/update/assemble can discover this skill\n const repoSlug = resolved.repoUrl?.match(/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?(?:[/#]|$)/)?.[1]\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 // Link to agent dirs + setup gitignore/instructions\n if (agent) {\n const shared = getSharedSkillsDir(cwd)\n if (shared)\n linkSkillToAgents(skillDirName, shared, cwd, agent)\n await ensureGitignore(shared ? SHARED_SKILLS_DIR : agents[agent].skillsDir, cwd, false)\n await ensureAgentInstructions(agent, cwd, false)\n registerProject(cwd)\n }\n else {\n // No agent — ensure gitignore for .claude/skills/ fallback dir\n await ensureGitignore('.claude/skills', cwd, false)\n }\n\n const relDir = relative(cwd, skillDir)\n const sectionList = [...prompts.keys()]\n p.log.success(`Skill installed to ${relDir}`)\n\n // Show agent prompt the user can copy-paste\n const promptFiles = sectionList.map(s => `PROMPT_${s}.md`).join(', ')\n const outputFileList = sectionList.map(s => SECTION_OUTPUT_FILES[s]).join(', ')\n p.log.info(`Have your agent enhance the skill. Give it this prompt:\\n\\x1B[2m\\x1B[3m Read each prompt file (${promptFiles}) in ${relDir}/, read the\\n referenced files, then write your output to the matching file (${outputFileList}).\\n When done, run: skilld assemble\\x1B[0m`)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sync.mjs","names":["agents","agents","agents","agents"],"sources":["../../src/commands/sync-shared.ts","../../src/telemetry.ts","../../src/commands/sync-git.ts","../../src/commands/sync-parallel.ts","../../src/commands/sync.ts"],"sourcesContent":["import type { AgentType, CustomPrompt, OptimizeModel, SkillSection } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport type { ResolvedPackage, ResolveStep } from '../sources/index.ts'\nimport { appendFileSync, copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { join, relative, resolve } from 'pathe'\nimport {\n agents,\n buildAllSectionPrompts,\n createToolProgress,\n generateSkillMd,\n getAvailableModels,\n getModelLabel,\n getModelName,\n optimizeDocs,\n SECTION_OUTPUT_FILES,\n} from '../agent/index.ts'\nimport { maxItems, maxLines } from '../agent/prompts/optional/budget.ts'\nimport {\n CACHE_DIR,\n clearCache,\n getCacheDir,\n getPackageDbPath,\n getRepoCacheDir,\n getShippedSkills,\n hasShippedDocs,\n linkCachedDir,\n linkPkg,\n linkPkgNamed,\n linkRepoCachedDir,\n linkShippedSkill,\n listReferenceFiles,\n readCachedDocs,\n resolvePkgDir,\n writeToCache,\n writeToRepoCache,\n} from '../cache/index.ts'\nimport { isInteractive } from '../cli-helpers.ts'\nimport { defaultFeatures, readConfig, registerProject, updateConfig } from '../core/config.ts'\nimport { parsePackages, readLock, writeLock } from '../core/lockfile.ts'\nimport { parseFrontmatter } from '../core/markdown.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport { getSharedSkillsDir } from '../core/shared.ts'\nimport { createIndex, SearchDepsUnavailableError } from '../retriv/index.ts'\nimport {\n downloadLlmsDocs,\n fetchBlogReleases,\n fetchCrawledDocs,\n fetchGitDocs,\n fetchGitHubDiscussions,\n fetchGitHubIssues,\n fetchGitHubRaw,\n fetchLlmsTxt,\n fetchNpmPackage,\n fetchReadmeContent,\n fetchReleaseNotes,\n filterFrameworkDocs,\n formatDiscussionAsMarkdown,\n formatIssueAsMarkdown,\n generateDiscussionIndex,\n generateDocsIndex,\n generateIssueIndex,\n generateReleaseIndex,\n getBlogPreset,\n getPrereleaseChangelogRef,\n isGhAvailable,\n isPrerelease,\n isShallowGitDocs,\n normalizeLlmsLinks,\n parseGitHubUrl,\n resolveEntryFiles,\n resolveLocalPackageDocs,\n toCrawlPattern,\n} from '../sources/index.ts'\n\n/** Max docs sent to the embedding pipeline to prevent oversized indexes */\nconst MAX_INDEX_DOCS = 250\n\nexport const RESOLVE_STEP_LABELS: Record<ResolveStep, string> = {\n 'npm': 'npm registry',\n 'github-docs': 'GitHub docs',\n 'github-meta': 'GitHub meta',\n 'github-search': 'GitHub search',\n 'readme': 'README',\n 'llms.txt': 'llms.txt',\n 'crawl': 'website crawl',\n 'local': 'node_modules',\n}\n\n/** Classify a cached doc path into the right metadata type */\nexport function classifyCachedDoc(path: string): { type: string, number?: number } {\n const issueMatch = path.match(/^issues\\/issue-(\\d+)\\.md$/)\n if (issueMatch)\n return { type: 'issue', number: Number(issueMatch[1]) }\n const discussionMatch = path.match(/^discussions\\/discussion-(\\d+)\\.md$/)\n if (discussionMatch)\n return { type: 'discussion', number: Number(discussionMatch[1]) }\n if (path.startsWith('releases/'))\n return { type: 'release' }\n return { type: 'doc' }\n}\n\nexport async function findRelatedSkills(packageName: string, skillsDir: string): Promise<string[]> {\n const related: string[] = []\n\n const npmInfo = await fetchNpmPackage(packageName)\n if (!npmInfo?.dependencies)\n return related\n\n const deps = new Set(Object.keys(npmInfo.dependencies))\n\n if (!existsSync(skillsDir))\n return related\n\n // Build packageName → dirName map from lockfile for accurate matching\n const lock = readLock(skillsDir)\n const pkgToDirName = new Map<string, string>()\n if (lock) {\n for (const [dirName, info] of Object.entries(lock.skills)) {\n if (info.packageName)\n pkgToDirName.set(info.packageName, dirName)\n for (const pkg of parsePackages(info.packages))\n pkgToDirName.set(pkg.name, dirName)\n }\n }\n\n const installedSkills = readdirSync(skillsDir)\n const installedSet = new Set(installedSkills)\n\n for (const dep of deps) {\n const dirName = pkgToDirName.get(dep)\n if (dirName && installedSet.has(dirName))\n related.push(dirName)\n }\n\n return related.slice(0, 5)\n}\n\n/** Clear cache + db for --force flag */\nexport function forceClearCache(packageName: string, version: string, repoInfo?: { owner: string, repo: string }): void {\n clearCache(packageName, version)\n const forcedDbPath = getPackageDbPath(packageName, version)\n if (existsSync(forcedDbPath))\n rmSync(forcedDbPath, { recursive: true, force: true })\n // Also clear repo-level cache when force is used\n if (repoInfo) {\n const repoDir = getRepoCacheDir(repoInfo.owner, repoInfo.repo)\n if (existsSync(repoDir))\n rmSync(repoDir, { recursive: true, force: true })\n }\n}\n\n/** Link all reference symlinks (pkg, docs, issues, discussions, releases) */\nexport function linkAllReferences(skillDir: string, packageName: string, cwd: string, version: string, docsType: string, extraPackages?: Array<{ name: string, version?: string }>, features?: FeaturesConfig, repoInfo?: { owner: string, repo: string }): void {\n const f = features ?? readConfig().features ?? defaultFeatures\n try {\n linkPkg(skillDir, packageName, cwd, version)\n linkPkgNamed(skillDir, packageName, cwd, version)\n if (!hasShippedDocs(packageName, cwd, version) && docsType !== 'readme') {\n linkCachedDir(skillDir, packageName, version, 'docs')\n }\n // Issues/discussions/releases: use repo cache when available, else package cache\n if (f.issues) {\n if (repoInfo)\n linkRepoCachedDir(skillDir, repoInfo.owner, repoInfo.repo, 'issues')\n else\n linkCachedDir(skillDir, packageName, version, 'issues')\n }\n if (f.discussions) {\n if (repoInfo)\n linkRepoCachedDir(skillDir, repoInfo.owner, repoInfo.repo, 'discussions')\n else\n linkCachedDir(skillDir, packageName, version, 'discussions')\n }\n if (f.releases) {\n if (repoInfo)\n linkRepoCachedDir(skillDir, repoInfo.owner, repoInfo.repo, 'releases')\n else\n linkCachedDir(skillDir, packageName, version, 'releases')\n }\n linkCachedDir(skillDir, packageName, version, 'sections')\n // Create named symlinks for additional packages in multi-package skills\n if (extraPackages) {\n for (const pkg of extraPackages) {\n if (pkg.name !== packageName)\n linkPkgNamed(skillDir, pkg.name, cwd, pkg.version)\n }\n }\n }\n catch {\n // Symlink may fail on some systems\n }\n}\n\n/** Detect docs type from cached directory contents */\nexport function detectDocsType(packageName: string, version: string, repoUrl?: string, llmsUrl?: string): { docsType: 'docs' | 'llms.txt' | 'readme', docSource?: string } {\n const cacheDir = getCacheDir(packageName, version)\n if (existsSync(join(cacheDir, 'docs', 'index.md')) || existsSync(join(cacheDir, 'docs', 'guide'))) {\n return {\n docsType: 'docs',\n docSource: repoUrl ? `${repoUrl}/tree/v${version}/docs` : 'git',\n }\n }\n if (existsSync(join(cacheDir, 'llms.txt'))) {\n return {\n docsType: 'llms.txt',\n docSource: llmsUrl || 'llms.txt',\n }\n }\n if (existsSync(join(cacheDir, 'docs', 'README.md'))) {\n return { docsType: 'readme' }\n }\n return { docsType: 'readme' }\n}\n\nexport interface HandleShippedResult {\n shipped: Array<{ skillName: string, skillDir: string }>\n baseDir: string\n}\n\n/** Link shipped skills, write lock entries, register project. Returns result or null if no shipped skills. */\nexport function handleShippedSkills(\n packageName: string,\n version: string,\n cwd: string,\n agent: AgentType,\n global: boolean,\n): HandleShippedResult | null {\n const shippedSkills = getShippedSkills(packageName, cwd, version)\n if (shippedSkills.length === 0)\n return null\n\n const shared = getSharedSkillsDir(cwd)\n const agentConfig = agents[agent]\n const baseDir = global\n ? join(CACHE_DIR, 'skills')\n : shared || join(cwd, agentConfig.skillsDir)\n mkdirSync(baseDir, { recursive: true })\n\n for (const shipped of shippedSkills) {\n linkShippedSkill(baseDir, shipped.skillName, shipped.skillDir)\n writeLock(baseDir, shipped.skillName, {\n packageName,\n version,\n source: 'shipped',\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n }\n\n if (!global)\n registerProject(cwd)\n\n return { shipped: shippedSkills, baseDir }\n}\n\n/** Resolve the base skills directory for an agent */\nexport function resolveBaseDir(cwd: string, agent: AgentType, global: boolean): string {\n if (global)\n return join(CACHE_DIR, 'skills')\n const shared = getSharedSkillsDir(cwd)\n if (shared)\n return shared\n const agentConfig = agents[agent]\n return join(cwd, agentConfig.skillsDir)\n}\n\n/** Try resolving a `link:` dependency to local package docs. Returns null if not a link dep or resolution fails. */\nexport async function resolveLocalDep(packageName: string, cwd: string): Promise<ResolvedPackage | null> {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath))\n return null\n\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n const depVersion = deps[packageName]\n\n if (!depVersion?.startsWith('link:'))\n return null\n\n const localPath = resolve(cwd, depVersion.slice(5))\n return resolveLocalPackageDocs(localPath)\n}\n\n/** Detect CHANGELOG.md in a package directory or cached releases */\nexport function detectChangelog(pkgDir: string | null, cacheDir?: string): string | false {\n if (pkgDir) {\n const found = ['CHANGELOG.md', 'changelog.md'].find(f => existsSync(join(pkgDir, f)))\n if (found)\n return `pkg/${found}`\n }\n // Also check cached releases/CHANGELOG.md (fetched from GitHub)\n if (cacheDir && existsSync(join(cacheDir, 'releases', 'CHANGELOG.md')))\n return 'releases/CHANGELOG.md'\n return false\n}\n\n// ── Shared pipeline functions ──\n\nexport interface IndexDoc {\n id: string\n content: string\n metadata: Record<string, any>\n}\n\nexport interface FetchResult {\n docSource: string\n docsType: 'llms.txt' | 'readme' | 'docs'\n docsToIndex: IndexDoc[]\n hasIssues: boolean\n hasDiscussions: boolean\n hasReleases: boolean\n warnings: string[]\n /** Parsed GitHub owner/repo for repo-level cache */\n repoInfo?: { owner: string, repo: string }\n /** Whether this result was served from cache (no fresh fetches) */\n usedCache: boolean\n}\n\n/** Fetch and cache all resources for a package (docs cascade + issues + discussions + releases) */\nexport async function fetchAndCacheResources(opts: {\n packageName: string\n resolved: ResolvedPackage\n version: string\n useCache: boolean\n features?: FeaturesConfig\n /** Lower-bound date for release/issue/discussion collection (ISO date) */\n from?: string\n onProgress: (message: string) => void\n}): Promise<FetchResult> {\n const { packageName, resolved, version, onProgress } = opts\n const features = opts.features ?? readConfig().features ?? defaultFeatures\n\n // Retry fetch if cache is README-only but richer sources exist (likely transient failure)\n const cacheInvalidated = opts.useCache\n && resolved.crawlUrl\n && detectDocsType(packageName, version, resolved.repoUrl, resolved.llmsUrl).docsType === 'readme'\n const useCache = opts.useCache && !cacheInvalidated\n let docSource: string = resolved.readmeUrl || 'readme'\n let docsType: 'llms.txt' | 'readme' | 'docs' = 'readme'\n const docsToIndex: IndexDoc[] = []\n const warnings: string[] = []\n if (cacheInvalidated)\n warnings.push(`Retrying crawl for ${resolved.crawlUrl} (previous attempt only cached README)`)\n\n if (!useCache) {\n const cachedDocs: Array<{ path: string, content: string }> = []\n const isFrameworkDoc = (path: string) => filterFrameworkDocs([path], packageName).length > 0\n\n // Try versioned git docs first\n if (resolved.gitDocsUrl && resolved.repoUrl) {\n const gh = parseGitHubUrl(resolved.repoUrl)\n if (gh) {\n onProgress('Fetching git docs')\n const gitDocs = await fetchGitDocs(gh.owner, gh.repo, version, packageName)\n if (gitDocs?.fallback) {\n warnings.push(`Docs fetched from ${gitDocs.ref} branch (no tag found for v${version})`)\n }\n if (gitDocs && gitDocs.files.length > 0) {\n const BATCH_SIZE = 20\n const results: Array<{ file: string, content: string } | null> = []\n\n for (let i = 0; i < gitDocs.files.length; i += BATCH_SIZE) {\n const batch = gitDocs.files.slice(i, i + BATCH_SIZE)\n onProgress(`Downloading docs ${Math.min(i + BATCH_SIZE, gitDocs.files.length)}/${gitDocs.files.length} from ${gitDocs.ref}`)\n const batchResults = await Promise.all(\n batch.map(async (file) => {\n const url = `${gitDocs.baseUrl}/${file}`\n const content = await fetchGitHubRaw(url)\n if (!content)\n return null\n return { file, content }\n }),\n )\n results.push(...batchResults)\n }\n\n for (const r of results) {\n if (r) {\n const stripped = gitDocs.docsPrefix ? r.file.replace(gitDocs.docsPrefix, '') : r.file\n const cachePath = stripped.startsWith('docs/') ? stripped : `docs/${stripped}`\n cachedDocs.push({ path: cachePath, content: r.content })\n docsToIndex.push({\n id: cachePath,\n content: r.content,\n metadata: { package: packageName, source: cachePath, type: 'doc' },\n })\n }\n }\n\n const downloaded = results.filter(Boolean).length\n if (downloaded > 0) {\n // Shallow git-docs: if < threshold and llms.txt exists, discard and fall through\n if (isShallowGitDocs(downloaded) && resolved.llmsUrl) {\n onProgress(`Shallow git-docs (${downloaded} files), trying llms.txt`)\n cachedDocs.length = 0\n docsToIndex.length = 0\n }\n else {\n docSource = `${resolved.repoUrl}/tree/${gitDocs.ref}/docs`\n docsType = 'docs'\n writeToCache(packageName, version, cachedDocs)\n\n // Always cache llms.txt alongside good git-docs as supplementary reference\n if (resolved.llmsUrl) {\n onProgress('Caching supplementary llms.txt')\n const llmsContent = await fetchLlmsTxt(resolved.llmsUrl)\n if (llmsContent) {\n const baseUrl = resolved.docsUrl || new URL(resolved.llmsUrl).origin\n const supplementary: Array<{ path: string, content: string }> = [\n { path: 'llms.txt', content: normalizeLlmsLinks(llmsContent.raw, baseUrl) },\n ]\n if (llmsContent.links.length > 0) {\n onProgress(`Downloading ${llmsContent.links.length} supplementary docs`)\n const docs = await downloadLlmsDocs(llmsContent, baseUrl, (url, done, total) => {\n onProgress(`Downloading supplementary doc ${done + 1}/${total}`)\n })\n for (const doc of docs) {\n if (!isFrameworkDoc(doc.url))\n continue\n const localPath = doc.url.startsWith('/') ? doc.url.slice(1) : doc.url\n supplementary.push({ path: join('llms-docs', ...localPath.split('/')), content: doc.content })\n }\n }\n writeToCache(packageName, version, supplementary)\n }\n }\n }\n }\n }\n }\n }\n\n // Try website crawl\n if (resolved.crawlUrl && cachedDocs.length === 0) {\n onProgress('Crawling website')\n const crawledDocs = await fetchCrawledDocs(resolved.crawlUrl, onProgress).catch((err) => {\n warnings.push(`Crawl failed for ${resolved.crawlUrl}: ${err?.message || err}`)\n return []\n })\n if (crawledDocs.length === 0 && resolved.crawlUrl) {\n warnings.push(`Crawl returned 0 docs from ${resolved.crawlUrl}`)\n }\n if (crawledDocs.length > 0) {\n for (const doc of crawledDocs) {\n if (!isFrameworkDoc(doc.path))\n continue\n cachedDocs.push(doc)\n docsToIndex.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, type: 'doc' },\n })\n }\n docSource = resolved.crawlUrl\n docsType = 'docs'\n writeToCache(packageName, version, cachedDocs)\n }\n }\n\n // Try llms.txt\n if (resolved.llmsUrl && cachedDocs.length === 0) {\n onProgress('Fetching llms.txt')\n const llmsContent = await fetchLlmsTxt(resolved.llmsUrl)\n if (llmsContent) {\n docSource = resolved.llmsUrl!\n docsType = 'llms.txt'\n const baseUrl = resolved.docsUrl || new URL(resolved.llmsUrl).origin\n cachedDocs.push({ path: 'llms.txt', content: normalizeLlmsLinks(llmsContent.raw, baseUrl) })\n\n if (llmsContent.links.length > 0) {\n onProgress(`Downloading ${llmsContent.links.length} linked docs`)\n const docs = await downloadLlmsDocs(llmsContent, baseUrl, (url, done, total) => {\n onProgress(`Downloading linked doc ${done + 1}/${total}`)\n })\n\n for (const doc of docs) {\n if (!isFrameworkDoc(doc.url))\n continue\n const localPath = doc.url.startsWith('/') ? doc.url.slice(1) : doc.url\n const cachePath = join('docs', ...localPath.split('/'))\n cachedDocs.push({ path: cachePath, content: doc.content })\n docsToIndex.push({\n id: doc.url,\n content: doc.content,\n metadata: { package: packageName, source: cachePath, type: 'doc' },\n })\n }\n if (docs.length > 0)\n docsType = 'docs'\n }\n\n writeToCache(packageName, version, cachedDocs)\n }\n }\n\n // Try crawling docsUrl as fallback (when no actual doc files from git/crawl/llms.txt)\n if (resolved.docsUrl && !cachedDocs.some(d => d.path.startsWith('docs/'))) {\n const crawlPattern = resolved.crawlUrl || toCrawlPattern(resolved.docsUrl)\n onProgress('Crawling docs site')\n const crawlMaxPages = resolved.crawlUrl ? 200 : 400\n const crawledDocs = await fetchCrawledDocs(crawlPattern, onProgress, crawlMaxPages).catch((err) => {\n warnings.push(`Crawl failed for ${crawlPattern}: ${err?.message || err}`)\n return []\n })\n if (crawledDocs.length > 0) {\n for (const doc of crawledDocs) {\n if (!isFrameworkDoc(doc.path))\n continue\n cachedDocs.push(doc)\n docsToIndex.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, type: 'doc' },\n })\n }\n docSource = crawlPattern\n docsType = 'docs'\n writeToCache(packageName, version, cachedDocs)\n }\n }\n\n // Fallback to README\n if (resolved.readmeUrl && cachedDocs.length === 0) {\n onProgress('Fetching README')\n const content = await fetchReadmeContent(resolved.readmeUrl)\n if (content) {\n cachedDocs.push({ path: 'docs/README.md', content })\n docsToIndex.push({\n id: 'README.md',\n content,\n metadata: { package: packageName, source: 'docs/README.md', type: 'doc' },\n })\n writeToCache(packageName, version, cachedDocs)\n }\n }\n\n // Generate docs index if we have multiple doc files\n if (docsType !== 'readme' && cachedDocs.filter(d => d.path.startsWith('docs/') && d.path.endsWith('.md')).length > 1) {\n const docsIndex = generateDocsIndex(cachedDocs)\n if (docsIndex) {\n writeToCache(packageName, version, [{ path: 'docs/_INDEX.md', content: docsIndex }])\n }\n }\n }\n else {\n // Detect docs type from cache\n onProgress('Loading cached docs')\n const detected = detectDocsType(packageName, version, resolved.repoUrl, resolved.llmsUrl)\n docsType = detected.docsType\n if (detected.docSource)\n docSource = detected.docSource\n\n // Load cached docs for indexing if db doesn't exist yet\n const dbPath = getPackageDbPath(packageName, version)\n if (!existsSync(dbPath)) {\n onProgress('Reading cached docs for indexing')\n const cached = readCachedDocs(packageName, version)\n for (const doc of cached) {\n docsToIndex.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, ...classifyCachedDoc(doc.path) },\n })\n }\n }\n\n // Backfill docs index for caches created before this feature\n if (docsType !== 'readme' && !existsSync(join(getCacheDir(packageName, version), 'docs', '_INDEX.md'))) {\n onProgress('Generating docs index')\n const cached = readCachedDocs(packageName, version)\n const docFiles = cached.filter(d => d.path.startsWith('docs/') && d.path.endsWith('.md'))\n if (docFiles.length > 1) {\n const docsIndex = generateDocsIndex(cached)\n if (docsIndex) {\n writeToCache(packageName, version, [{ path: 'docs/_INDEX.md', content: docsIndex }])\n }\n }\n }\n }\n\n // Parse repo info once for repo-level caching\n const gh = resolved.repoUrl ? parseGitHubUrl(resolved.repoUrl) : null\n const repoInfo = gh ? { owner: gh.owner, repo: gh.repo } : undefined\n\n // Determine where repo-level data lives (repo cache if available, else package cache)\n const repoCacheDir = repoInfo ? getRepoCacheDir(repoInfo.owner, repoInfo.repo) : null\n const cacheDir = getCacheDir(packageName, version)\n const issuesDir = repoCacheDir ? join(repoCacheDir, 'issues') : join(cacheDir, 'issues')\n const discussionsDir = repoCacheDir ? join(repoCacheDir, 'discussions') : join(cacheDir, 'discussions')\n const releasesPath = repoCacheDir ? join(repoCacheDir, 'releases') : join(cacheDir, 'releases')\n\n // Issues (independent of useCache — has its own existsSync guard)\n if (features.issues && gh && isGhAvailable() && !existsSync(issuesDir)) {\n onProgress('Fetching issues via GitHub API')\n const issues = await fetchGitHubIssues(gh.owner, gh.repo, 30, resolved.releasedAt, opts.from).catch(() => [])\n if (issues.length > 0) {\n onProgress(`Caching ${issues.length} issues`)\n const issueDocs = [\n ...issues.map(issue => ({\n path: `issues/issue-${issue.number}.md`,\n content: formatIssueAsMarkdown(issue),\n })),\n {\n path: 'issues/_INDEX.md',\n content: generateIssueIndex(issues),\n },\n ]\n if (repoInfo)\n writeToRepoCache(repoInfo.owner, repoInfo.repo, issueDocs)\n else\n writeToCache(packageName, version, issueDocs)\n for (const issue of issues) {\n docsToIndex.push({\n id: `issue-${issue.number}`,\n content: sanitizeMarkdown(`#${issue.number}: ${issue.title}\\n\\n${issue.body || ''}`),\n metadata: { package: packageName, source: `issues/issue-${issue.number}.md`, type: 'issue', number: issue.number },\n })\n }\n }\n }\n\n // Discussions\n if (features.discussions && gh && isGhAvailable() && !existsSync(discussionsDir)) {\n onProgress('Fetching discussions via GitHub API')\n const discussions = await fetchGitHubDiscussions(gh.owner, gh.repo, 20, resolved.releasedAt, opts.from).catch(() => [])\n if (discussions.length > 0) {\n onProgress(`Caching ${discussions.length} discussions`)\n const discussionDocs = [\n ...discussions.map(d => ({\n path: `discussions/discussion-${d.number}.md`,\n content: formatDiscussionAsMarkdown(d),\n })),\n {\n path: 'discussions/_INDEX.md',\n content: generateDiscussionIndex(discussions),\n },\n ]\n if (repoInfo)\n writeToRepoCache(repoInfo.owner, repoInfo.repo, discussionDocs)\n else\n writeToCache(packageName, version, discussionDocs)\n for (const d of discussions) {\n docsToIndex.push({\n id: `discussion-${d.number}`,\n content: sanitizeMarkdown(`#${d.number}: ${d.title}\\n\\n${d.body || ''}`),\n metadata: { package: packageName, source: `discussions/discussion-${d.number}.md`, type: 'discussion', number: d.number },\n })\n }\n }\n }\n\n // Releases (GitHub releases + blog releases + CHANGELOG → unified releases/ dir)\n if (features.releases && gh && isGhAvailable() && !existsSync(releasesPath)) {\n onProgress('Fetching releases via GitHub API')\n const changelogRef = isPrerelease(version) ? getPrereleaseChangelogRef(packageName) : undefined\n const releaseDocs = await fetchReleaseNotes(gh.owner, gh.repo, version, resolved.gitRef, packageName, opts.from, changelogRef).catch(() => [])\n\n // Fetch blog releases into same releases/ dir\n let blogDocs: Array<{ path: string, content: string }> = []\n if (getBlogPreset(packageName)) {\n onProgress('Fetching blog release notes')\n blogDocs = await fetchBlogReleases(packageName, version).catch(() => [])\n }\n\n const allDocs = [...releaseDocs, ...blogDocs]\n\n // Parse blog release metadata for index generation\n const blogEntries = blogDocs\n .filter(d => !d.path.endsWith('_INDEX.md'))\n .map((d) => {\n const versionMatch = d.path.match(/blog-(.+)\\.md$/)\n const fm = parseFrontmatter(d.content)\n return {\n version: versionMatch?.[1] ?? '',\n title: fm.title ?? `Release ${versionMatch?.[1]}`,\n date: fm.date ?? '',\n }\n })\n .filter(b => b.version)\n\n // Parse GitHub releases for index (extract from frontmatter)\n const ghReleases = releaseDocs\n .filter(d => d.path.startsWith('releases/') && !d.path.endsWith('CHANGELOG.md'))\n .map((d) => {\n const fm = parseFrontmatter(d.content)\n const tag = fm.tag ?? ''\n const name = fm.name ?? tag\n const published = fm.published ?? ''\n return { id: 0, tag, name, prerelease: false, createdAt: published, publishedAt: published, markdown: '' }\n })\n .filter(r => r.tag)\n\n const hasChangelog = allDocs.some(d => d.path === 'releases/CHANGELOG.md')\n\n // Generate unified _INDEX.md\n if (ghReleases.length > 0 || blogEntries.length > 0) {\n allDocs.push({\n path: 'releases/_INDEX.md',\n content: generateReleaseIndex({ releases: ghReleases, packageName, blogReleases: blogEntries, hasChangelog }),\n })\n }\n\n if (allDocs.length > 0) {\n onProgress(`Caching ${allDocs.length} releases`)\n if (repoInfo)\n writeToRepoCache(repoInfo.owner, repoInfo.repo, allDocs)\n else\n writeToCache(packageName, version, allDocs)\n for (const doc of allDocs) {\n docsToIndex.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, type: 'release' },\n })\n }\n }\n }\n\n return {\n docSource,\n docsType,\n docsToIndex,\n hasIssues: features.issues && existsSync(issuesDir),\n hasDiscussions: features.discussions && existsSync(discussionsDir),\n hasReleases: features.releases && existsSync(releasesPath),\n warnings,\n repoInfo,\n usedCache: useCache,\n }\n}\n\n/** Index all resources into the search database (single batch) */\nexport async function indexResources(opts: {\n packageName: string\n version: string\n cwd: string\n docsToIndex: IndexDoc[]\n features?: FeaturesConfig\n onProgress: (message: string) => void\n}): Promise<void> {\n const { packageName, version, cwd, onProgress } = opts\n const features = opts.features ?? readConfig().features ?? defaultFeatures\n\n if (!features.search)\n return\n\n const dbPath = getPackageDbPath(packageName, version)\n\n if (existsSync(dbPath))\n return\n\n const allDocs = [...opts.docsToIndex]\n\n // Add entry files\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n if (features.search && pkgDir) {\n onProgress('Scanning exports')\n const entryFiles = await resolveEntryFiles(pkgDir)\n for (const e of entryFiles) {\n allDocs.push({\n id: e.path,\n content: e.content,\n metadata: { package: packageName, source: `pkg/${e.path}`, type: e.type },\n })\n }\n }\n\n if (allDocs.length === 0)\n return\n\n // Cap docs to prevent oversized indexes\n if (allDocs.length > MAX_INDEX_DOCS) {\n const TYPE_PRIORITY: Record<string, number> = { doc: 0, issue: 1, discussion: 2, release: 3, source: 4, types: 5 }\n allDocs.sort((a, b) => {\n const ta = TYPE_PRIORITY[a.metadata?.type || 'doc'] ?? 3\n const tb = TYPE_PRIORITY[b.metadata?.type || 'doc'] ?? 3\n if (ta !== tb)\n return ta - tb\n return a.id.localeCompare(b.id)\n })\n onProgress(`Indexing capped at ${MAX_INDEX_DOCS}/${allDocs.length} docs (prioritized by type)`)\n allDocs.length = MAX_INDEX_DOCS\n }\n\n onProgress(`Building search index (${allDocs.length} docs)`)\n try {\n await createIndex(allDocs, {\n dbPath,\n onProgress: ({ phase, current, total }) => {\n if (phase === 'storing') {\n const d = allDocs[current - 1]\n const type = d?.metadata?.type === 'source' || d?.metadata?.type === 'types' ? 'code' : (d?.metadata?.type || 'doc')\n onProgress(`Storing ${type} (${current}/${total})`)\n }\n else if (phase === 'embedding') {\n onProgress(`Creating embeddings (${current}/${total})`)\n }\n },\n })\n }\n catch (err) {\n if (err instanceof SearchDepsUnavailableError)\n onProgress('Search indexing skipped (native deps unavailable)')\n else\n throw err\n }\n}\n\n/**\n * Eject references: copy cached files as real files into references/ dir.\n * Used for portable skills (git repos, sharing). Replaces symlinks with copies.\n * Does NOT copy pkg files — those reference node_modules directly.\n */\nexport function ejectReferences(skillDir: string, packageName: string, cwd: string, version: string, docsType: string, features?: FeaturesConfig, repoInfo?: { owner: string, repo: string }): void {\n const f = features ?? readConfig().features ?? defaultFeatures\n const cacheDir = getCacheDir(packageName, version)\n const refsDir = join(skillDir, 'references')\n // Repo-level data source (falls back to package cache)\n const repoDir = repoInfo ? getRepoCacheDir(repoInfo.owner, repoInfo.repo) : cacheDir\n\n // Copy cached docs (skip pkg — eject is for portable sharing, pkg references node_modules)\n if (!hasShippedDocs(packageName, cwd, version) && docsType !== 'readme')\n copyCachedSubdir(cacheDir, refsDir, 'docs')\n\n if (f.issues)\n copyCachedSubdir(repoDir, refsDir, 'issues')\n if (f.discussions)\n copyCachedSubdir(repoDir, refsDir, 'discussions')\n if (f.releases)\n copyCachedSubdir(repoDir, refsDir, 'releases')\n}\n\n/** Recursively copy a cached subdirectory into the references dir */\nfunction copyCachedSubdir(cacheDir: string, refsDir: string, subdir: string): void {\n const srcDir = join(cacheDir, subdir)\n if (!existsSync(srcDir))\n return\n\n const destDir = join(refsDir, subdir)\n mkdirSync(destDir, { recursive: true })\n\n function walk(dir: string, rel: string) {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const srcPath = join(dir, entry.name)\n const destPath = join(destDir, rel ? `${rel}/${entry.name}` : entry.name)\n if (entry.isDirectory()) {\n mkdirSync(destPath, { recursive: true })\n walk(srcPath, rel ? `${rel}/${entry.name}` : entry.name)\n }\n else {\n copyFileSync(srcPath, destPath)\n }\n }\n }\n\n walk(srcDir, '')\n}\n\n// ── Shared UI + LLM functions (used by sync.ts, sync-git.ts, sync-parallel.ts, etc.) ──\n\n/**\n * Check if .gitignore has `.skilld` entry.\n * If missing, prompt to add it. Skipped for global installs.\n */\nexport async function ensureGitignore(skillsDir: string, cwd: string, isGlobal: boolean): Promise<void> {\n if (isGlobal)\n return\n\n const gitignorePath = join(cwd, '.gitignore')\n const pattern = '.skilld'\n\n // Check if already ignored\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8')\n if (content.split('\\n').some(line => line.trim() === pattern))\n return\n }\n\n // Non-interactive: auto-add (default is true anyway)\n if (!isInteractive()) {\n const entry = `\\n# Skilld references (recreated by \\`skilld install\\`)\\n${pattern}\\n`\n if (existsSync(gitignorePath)) {\n const existing = readFileSync(gitignorePath, 'utf-8')\n const separator = existing.endsWith('\\n') ? '' : '\\n'\n appendFileSync(gitignorePath, `${separator}${entry}`)\n }\n else {\n writeFileSync(gitignorePath, entry)\n }\n return\n }\n\n // Show guidance\n const relSkillsDir = relative(cwd, skillsDir) || '.'\n p.log.info(\n `\\x1B[1mGit guidance:\\x1B[0m\\n`\n + ` \\x1B[32m✓\\x1B[0m Commit: \\x1B[36m${relSkillsDir}/*/SKILL.md\\x1B[0m\\n`\n + ` \\x1B[32m✓\\x1B[0m Commit: \\x1B[36m${relSkillsDir}/skilld-lock.yaml\\x1B[0m\\n`\n + ` \\x1B[31m✗\\x1B[0m Ignore: \\x1B[36m${pattern}\\x1B[0m \\x1B[90m(recreated by \\`skilld install\\`)\\x1B[0m`,\n )\n\n const add = await p.confirm({\n message: `Add \\`${pattern}\\` to .gitignore?`,\n initialValue: true,\n })\n\n if (p.isCancel(add) || !add)\n return\n\n const entry = `\\n# Skilld references (recreated by \\`skilld install\\`)\\n${pattern}\\n`\n if (existsSync(gitignorePath)) {\n const existing = readFileSync(gitignorePath, 'utf-8')\n const separator = existing.endsWith('\\n') ? '' : '\\n'\n appendFileSync(gitignorePath, `${separator}${entry}`)\n }\n else {\n writeFileSync(gitignorePath, entry)\n }\n\n p.log.success('Updated .gitignore')\n}\n\nexport const SKILLD_MARKER_START = '<!-- skilld -->'\nexport const SKILLD_MARKER_END = '<!-- /skilld -->'\n\nconst SKILLD_INSTRUCTIONS = `${SKILLD_MARKER_START}\nBefore modifying code, evaluate each installed skill against the current task.\nFor each skill, determine YES/NO relevance and invoke all YES skills before proceeding.\n${SKILLD_MARKER_END}`\n\n/**\n * Check if agent instruction file has skilld skill-activation snippet.\n * If missing, prompt to add it. Skipped for global installs or agents without an instructionFile.\n */\nexport async function ensureAgentInstructions(agent: AgentType, cwd: string, isGlobal: boolean): Promise<void> {\n if (isGlobal)\n return\n\n const agentConfig = agents[agent]\n if (!agentConfig.instructionFile)\n return\n\n const filePath = join(cwd, agentConfig.instructionFile)\n\n // Check if marker already present\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, 'utf-8')\n if (content.includes(SKILLD_MARKER_START))\n return\n }\n\n // Non-interactive: auto-add\n if (!isInteractive()) {\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf-8')\n const separator = existing.endsWith('\\n') ? '' : '\\n'\n appendFileSync(filePath, `${separator}\\n${SKILLD_INSTRUCTIONS}\\n`)\n }\n else {\n writeFileSync(filePath, `${SKILLD_INSTRUCTIONS}\\n`)\n }\n return\n }\n\n p.note(SKILLD_INSTRUCTIONS, `Will be added to ${agentConfig.instructionFile}`)\n\n const add = await p.confirm({\n message: `Add skill activation instructions to ${agentConfig.instructionFile}?`,\n initialValue: true,\n })\n\n if (p.isCancel(add) || !add)\n return\n\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf-8')\n const separator = existing.endsWith('\\n') ? '' : '\\n'\n appendFileSync(filePath, `${separator}\\n${SKILLD_INSTRUCTIONS}\\n`)\n }\n else {\n writeFileSync(filePath, `${SKILLD_INSTRUCTIONS}\\n`)\n }\n\n p.log.success(`Updated ${agentConfig.instructionFile}`)\n}\n\n/** Select LLM model for SKILL.md generation (independent of target agent) */\nexport async function selectModel(skipPrompt: boolean): Promise<OptimizeModel | null> {\n const config = readConfig()\n const available = await getAvailableModels()\n\n if (available.length === 0) {\n p.log.warn('No LLM CLIs found (claude, gemini, codex)')\n return null\n }\n\n // Use config model if set and available (only when not prompting)\n if (skipPrompt) {\n if (config.model && available.some(m => m.id === config.model))\n return config.model\n return available.find(m => m.recommended)?.id ?? available[0]!.id\n }\n\n const modelChoice = await p.select({\n message: 'Model for SKILL.md generation',\n options: available.map(m => ({\n label: m.recommended ? `${m.name} (Recommended)` : m.name,\n value: m.id,\n hint: `${m.agentName} · ${m.hint}`,\n })),\n initialValue: available.find(m => m.recommended)?.id ?? available[0]!.id,\n })\n\n if (p.isCancel(modelChoice)) {\n p.cancel('Cancelled')\n return null\n }\n\n // Remember choice for next time\n updateConfig({ model: modelChoice as OptimizeModel })\n\n return modelChoice as OptimizeModel\n}\n\n/** Default sections when model is pre-set (non-interactive) */\nexport const DEFAULT_SECTIONS: SkillSection[] = ['best-practices', 'api-changes']\n\nexport async function selectSkillSections(message = 'Generate SKILL.md with LLM'): Promise<{ sections: SkillSection[], customPrompt?: CustomPrompt, cancelled: boolean }> {\n p.log.info('Budgets adapt to package release density.')\n const selected = await p.multiselect({\n message,\n options: [\n { label: 'API changes', value: 'api-changes' as SkillSection, hint: 'new/deprecated APIs from version history' },\n { label: 'Best practices', value: 'best-practices' as SkillSection, hint: 'gotchas, pitfalls, patterns' },\n { label: 'Custom section', value: 'custom' as SkillSection, hint: 'add your own section' },\n ],\n initialValues: DEFAULT_SECTIONS,\n required: false,\n })\n\n if (p.isCancel(selected))\n return { sections: [], cancelled: true }\n\n const sections = selected as SkillSection[]\n if (sections.length === 0)\n return { sections: [], cancelled: false }\n\n // Show per-section budget based on selection count\n if (sections.length > 1) {\n const n = sections.length\n const budgetLines: string[] = []\n for (const s of sections) {\n switch (s) {\n case 'api-changes':\n budgetLines.push(` API changes ${maxItems(6, 12, n)}–${maxItems(6, Math.round(12 * 1.6), n)} items (adapts to release churn)`)\n break\n case 'best-practices':\n budgetLines.push(` Best practices ${maxItems(4, 10, n)}–${maxItems(4, Math.round(10 * 1.3), n)} items`)\n break\n case 'custom':\n budgetLines.push(` Custom ≤${maxLines(50, 80, n)} lines`)\n break\n }\n }\n p.log.info(`Budget (${n} sections):\\n${budgetLines.join('\\n')}`)\n }\n\n let customPrompt: CustomPrompt | undefined\n if (sections.includes('custom')) {\n const heading = await p.text({\n message: 'Section heading',\n placeholder: 'e.g. \"Migration from v2\" or \"SSR Patterns\"',\n })\n if (p.isCancel(heading))\n return { sections: [], cancelled: true }\n\n const body = await p.text({\n message: 'Instructions for this section',\n placeholder: 'e.g. \"Document breaking changes and migration steps from v2 to v3\"',\n })\n if (p.isCancel(body))\n return { sections: [], cancelled: true }\n\n customPrompt = { heading: heading as string, body: body as string }\n }\n\n return { sections, customPrompt, cancelled: false }\n}\n\nexport interface LlmConfig {\n model: OptimizeModel\n sections: SkillSection[]\n customPrompt?: CustomPrompt\n promptOnly?: boolean\n}\n\n/**\n * Resolve sections + model for LLM enhancement.\n * If presetModel is provided, uses DEFAULT_SECTIONS without prompting.\n * Returns null if cancelled or no sections/model selected.\n */\nexport async function selectLlmConfig(presetModel?: OptimizeModel, message?: string): Promise<LlmConfig | null> {\n if (presetModel) {\n return { model: presetModel, sections: DEFAULT_SECTIONS }\n }\n\n // Non-interactive (CI, agent, no TTY): skip generation unless model explicitly provided\n if (!isInteractive()) {\n return null\n }\n\n // Resolve default model (configured or recommended) without prompting\n const defaultModel = await selectModel(true)\n if (!defaultModel)\n return null\n\n const defaultModelName = getModelName(defaultModel)\n\n const choice = await p.select({\n message: 'Generate enhanced SKILL.md?',\n options: [\n { label: defaultModelName, value: 'default' as const, hint: 'configured default' },\n { label: 'Different model', value: 'pick' as const, hint: 'choose another model' },\n { label: 'Prompt only', value: 'prompt' as const, hint: 'write prompts for manual use' },\n { label: 'Skip', value: 'skip' as const, hint: 'base skill only' },\n ],\n })\n\n if (p.isCancel(choice))\n return null\n\n if (choice === 'skip')\n return null\n\n if (choice === 'prompt') {\n const { sections, customPrompt, cancelled } = await selectSkillSections(\n message ? `${message} (prompt only)` : 'Select sections for prompt generation',\n )\n if (cancelled || sections.length === 0)\n return null\n // model is unused for prompt-only but required by type — use defaultModel as placeholder\n return { model: defaultModel, sections, customPrompt, promptOnly: true }\n }\n\n const model = choice === 'pick' ? await selectModel(false) : defaultModel\n if (!model)\n return null\n\n const modelName = getModelName(model)\n const { sections, customPrompt, cancelled } = await selectSkillSections(\n message ? `${message} (${modelName})` : `Generate SKILL.md with ${modelName}`,\n )\n\n if (cancelled || sections.length === 0)\n return null\n\n return { model, sections, customPrompt }\n}\n\nexport interface EnhanceOptions {\n packageName: string\n version: string\n skillDir: string\n dirName?: string\n model: OptimizeModel\n resolved: { repoUrl?: string, llmsUrl?: string, releasedAt?: string, docsUrl?: string, gitRef?: string, dependencies?: Record<string, string>, distTags?: Record<string, { version: string, releasedAt?: string }> }\n relatedSkills: string[]\n hasIssues: boolean\n hasDiscussions: boolean\n hasReleases: boolean\n hasChangelog: string | false\n docsType: 'llms.txt' | 'readme' | 'docs'\n hasShippedDocs: boolean\n pkgFiles: string[]\n force?: boolean\n debug?: boolean\n sections?: SkillSection[]\n customPrompt?: CustomPrompt\n packages?: Array<{ name: string }>\n features?: FeaturesConfig\n eject?: boolean\n}\n\nexport async function enhanceSkillWithLLM(opts: EnhanceOptions): Promise<void> {\n const { packageName, version, skillDir, dirName, model, resolved, relatedSkills, hasIssues, hasDiscussions, hasReleases, hasChangelog, docsType, hasShippedDocs: shippedDocs, pkgFiles, force, debug, sections, customPrompt, packages, features, eject } = opts\n\n const effectiveFeatures = features\n\n const llmLog = p.taskLog({ title: `Agent exploring ${packageName}` })\n const docFiles = listReferenceFiles(skillDir)\n const hasGithub = hasIssues || hasDiscussions\n const { optimized, wasOptimized, usage, cost, warnings, error, debugLogsDir } = await optimizeDocs({\n packageName,\n skillDir,\n model,\n version,\n hasGithub,\n hasReleases,\n hasChangelog,\n docFiles,\n docsType,\n hasShippedDocs: shippedDocs,\n noCache: force,\n debug,\n sections,\n customPrompt,\n features: effectiveFeatures,\n pkgFiles,\n onProgress: createToolProgress(llmLog),\n })\n\n if (wasOptimized) {\n const costParts: string[] = []\n if (usage) {\n const totalK = Math.round(usage.totalTokens / 1000)\n costParts.push(`${totalK}k tokens`)\n }\n if (cost)\n costParts.push(`$${cost.toFixed(2)}`)\n const costSuffix = costParts.length > 0 ? ` (${costParts.join(', ')})` : ''\n llmLog.success(`Generated best practices${costSuffix}`)\n if (debugLogsDir)\n p.log.info(`Debug logs: ${relative(process.cwd(), debugLogsDir)}`)\n if (error)\n p.log.warn(`\\x1B[33mPartial failure: ${error}\\x1B[0m`)\n if (warnings?.length) {\n for (const w of warnings)\n p.log.warn(`\\x1B[33m${w}\\x1B[0m`)\n }\n const skillMd = generateSkillMd({\n name: packageName,\n version,\n releasedAt: resolved.releasedAt,\n dependencies: resolved.dependencies,\n distTags: resolved.distTags,\n body: optimized,\n relatedSkills,\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n generatedBy: getModelLabel(model),\n dirName,\n packages,\n repoUrl: resolved.repoUrl,\n features,\n eject,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n }\n else {\n llmLog.error(`LLM optimization failed${error ? `: ${error}` : ''}`)\n }\n}\n\nexport interface WritePromptFilesOptions {\n packageName: string\n skillDir: string\n version: string\n hasIssues: boolean\n hasDiscussions: boolean\n hasReleases: boolean\n hasChangelog: string | false\n docsType: 'llms.txt' | 'readme' | 'docs'\n hasShippedDocs: boolean\n pkgFiles: string[]\n sections: SkillSection[]\n customPrompt?: CustomPrompt\n features?: FeaturesConfig\n}\n\n/**\n * Build and write PROMPT_*.md files for manual LLM use.\n * Returns the list of sections that had prompts written.\n */\nexport function writePromptFiles(opts: WritePromptFilesOptions): SkillSection[] {\n const { skillDir, sections, customPrompt, features } = opts\n const docFiles = listReferenceFiles(skillDir)\n const prompts = buildAllSectionPrompts({\n packageName: opts.packageName,\n skillDir,\n version: opts.version,\n hasIssues: opts.hasIssues,\n hasDiscussions: opts.hasDiscussions,\n hasReleases: opts.hasReleases,\n hasChangelog: opts.hasChangelog,\n docFiles,\n docsType: opts.docsType,\n hasShippedDocs: opts.hasShippedDocs,\n pkgFiles: opts.pkgFiles,\n customPrompt,\n features,\n sections,\n })\n\n const skilldDir = join(skillDir, '.skilld')\n mkdirSync(skilldDir, { recursive: true })\n\n for (const [section, prompt] of prompts)\n writeFileSync(join(skilldDir, `PROMPT_${section}.md`), prompt)\n\n const written = [...prompts.keys()]\n if (written.length > 0) {\n const relDir = relative(process.cwd(), skillDir)\n const promptFiles = written.map(s => `PROMPT_${s}.md`).join(', ')\n const outputFileList = written.map(s => SECTION_OUTPUT_FILES[s]).join(', ')\n p.log.info(`Prompt files written to ${relDir}/.skilld/\\n\\x1B[2m\\x1B[3m Read each prompt file (${promptFiles}) in ${relDir}/.skilld/, read the\\n referenced files, then write your output to the matching file (${outputFileList}).\\n When done, run: skilld assemble\\x1B[0m`)\n }\n\n return written\n}\n","/**\n * Anonymous telemetry — fire-and-forget GET to add-skill.vercel.sh/t\n *\n * Opt-out: set DISABLE_TELEMETRY=1 or DO_NOT_TRACK=1\n * Auto-disabled in CI environments.\n */\n\nimport { isCI } from 'std-env'\n\nconst TELEMETRY_URL = 'https://add-skill.vercel.sh/t'\nconst SKILLS_VERSION = '1.3.9'\n\ninterface InstallTelemetryData {\n event: 'install'\n source: string\n skills: string\n agents: string\n global?: '1'\n skillFiles?: string\n sourceType?: string\n}\n\ninterface RemoveTelemetryData {\n event: 'remove'\n source?: string\n skills: string\n agents: string\n global?: '1'\n sourceType?: string\n}\n\ntype TelemetryData\n = | InstallTelemetryData\n | RemoveTelemetryData\n\nfunction isEnabled(): boolean {\n return !process.env.DISABLE_TELEMETRY && !process.env.DO_NOT_TRACK\n}\n\nexport function track(data: TelemetryData): void {\n if (!isEnabled())\n return\n\n try {\n const params = new URLSearchParams()\n\n params.set('v', SKILLS_VERSION)\n\n if (isCI)\n params.set('ci', '1')\n\n for (const [key, value] of Object.entries(data)) {\n if (value !== undefined && value !== null)\n params.set(key, String(value))\n }\n\n // Fire and forget\n fetch(`${TELEMETRY_URL}?${params.toString()}`).catch(() => {})\n }\n catch {\n // Telemetry should never break the CLI\n }\n}\n","/**\n * Git skill sync — install pre-authored skills from git repos,\n * or generate skills 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 * as p from '@clack/prompts'\nimport { dirname, join, relative } from 'pathe'\nimport {\n agents,\n generateSkillMd,\n getModelLabel,\n linkSkillToAgents,\n sanitizeName,\n} from '../agent/index.ts'\nimport {\n CACHE_DIR,\n ensureCacheDir,\n getCacheDir,\n getPkgKeyFiles,\n getVersionKey,\n hasShippedDocs,\n isCached,\n resolvePkgDir,\n} from '../cache/index.ts'\nimport { defaultFeatures, readConfig, registerProject } from '../core/config.ts'\nimport { timedSpinner } from '../core/formatting.ts'\nimport { writeLock } from '../core/lockfile.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport { getSharedSkillsDir } from '../core/shared.ts'\nimport { shutdownWorker } from '../retriv/pool.ts'\nimport { fetchGitSkills } from '../sources/git-skills.ts'\nimport { resolveGitHubRepo } from '../sources/github.ts'\nimport { track } from '../telemetry.ts'\nimport {\n detectChangelog,\n enhanceSkillWithLLM,\n ensureAgentInstructions,\n ensureGitignore,\n fetchAndCacheResources,\n indexResources,\n linkAllReferences,\n resolveBaseDir,\n selectLlmConfig,\n writePromptFiles,\n} from './sync-shared.ts'\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 /** Filter to specific skill names (comma-separated via --skill flag) */\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 // No pre-authored skills — fall back to generating from repo docs (GitHub only)\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 // Select skills to install\n let selected = skills\n\n if (opts.skillFilter?.length) {\n // --skill flag: filter to matching names (strip -skilld suffix for comparison)\n const filterSet = new Set(opts.skillFilter.map(s => s.toLowerCase().replace(/-skilld$/, '')))\n selected = skills.filter(s => filterSet.has(s.name.toLowerCase().replace(/-skilld$/, '')))\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 // Direct path: auto-select the matched skill\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(/-skilld$/, ''),\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 // Install each selected skill\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 // Sanitize and write SKILL.md\n writeFileSync(join(skillDir, 'SKILL.md'), sanitizeMarkdown(skill.content))\n\n // Write supporting files directly in skill dir (not under .skilld/)\n // so SKILL.md relative paths like ./references/docs/guide.md resolve correctly\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 // Write lockfile entry\n const sourceType = source.type === 'local' ? 'local' : source.type\n writeLock(baseDir, skill.name, {\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: new Date().toISOString().split('T')[0],\n generator: 'external',\n })\n }\n\n if (!isGlobal)\n registerProject(cwd)\n\n // Track telemetry (skip local sources)\n if (source.type !== 'local' && source.owner && source.repo) {\n track({\n event: 'install',\n source: `${source.owner}/${source.repo}`,\n skills: selected.map(s => s.name).join(','),\n agents: agent,\n ...(isGlobal && { global: '1' as const }),\n sourceType: source.type,\n })\n }\n\n const names = selected.map(s => `\\x1B[36m${s.name}\\x1B[0m`).join(', ')\n p.log.success(`Installed ${names}`)\n}\n\n/**\n * Generate a skill from a GitHub repo's docs (no npm package required).\n * Uses the same pipeline as npm packages: resolve → fetch → cache → generate → LLM enhance.\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\n const spin = timedSpinner()\n spin.start(`Resolving ${owner}/${repo}`)\n\n const resolved = await resolveGitHubRepo(owner, repo, msg => spin.message(msg))\n if (!resolved) {\n spin.stop(`Could not find docs for ${owner}/${repo}`)\n return\n }\n\n const repoUrl = `https://github.com/${owner}/${repo}`\n const packageName = `${owner}-${repo}`\n const version = resolved.version || 'main'\n const versionKey = getVersionKey(version)\n const useCache = isCached(packageName, version)\n\n spin.stop(`Resolved ${owner}/${repo}@${useCache ? versionKey : version}${useCache ? ' (cached)' : ''}`)\n\n ensureCacheDir()\n\n const baseDir = resolveBaseDir(cwd, agent, isGlobal)\n const skillDirName = sanitizeName(`${owner}-${repo}`)\n const skillDir = join(baseDir, skillDirName)\n mkdirSync(skillDir, { recursive: true })\n\n const features = readConfig().features ?? defaultFeatures\n\n // Phase 1: Fetch & cache all resources\n const resSpin = timedSpinner()\n resSpin.start('Finding resources')\n const resources = await fetchAndCacheResources({\n packageName,\n resolved,\n version,\n useCache,\n features,\n from: opts.from,\n onProgress: msg => resSpin.message(msg),\n })\n const resParts: string[] = []\n if (resources.docsToIndex.length > 0) {\n const docCount = resources.docsToIndex.filter(d => d.metadata?.type === 'doc').length\n if (docCount > 0)\n resParts.push(`${docCount} docs`)\n }\n if (resources.hasIssues)\n resParts.push('issues')\n if (resources.hasDiscussions)\n resParts.push('discussions')\n if (resources.hasReleases)\n resParts.push('releases')\n resSpin.stop(`Fetched ${resParts.length > 0 ? resParts.join(', ') : 'resources'}`)\n for (const w of resources.warnings)\n p.log.warn(`\\x1B[33m${w}\\x1B[0m`)\n\n // Create symlinks (linkPkg/linkPkgNamed gracefully skip when no node_modules)\n linkAllReferences(skillDir, packageName, cwd, version, resources.docsType, undefined, features)\n\n // Phase 2: Search index\n if (features.search) {\n const idxSpin = timedSpinner()\n idxSpin.start('Creating search index')\n await indexResources({\n packageName,\n version,\n cwd,\n docsToIndex: resources.docsToIndex,\n features,\n onProgress: msg => idxSpin.message(msg),\n })\n idxSpin.stop('Search index ready')\n }\n\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const hasChangelog = detectChangelog(pkgDir, getCacheDir(packageName, version))\n const shippedDocs = hasShippedDocs(packageName, cwd, version)\n const pkgFiles = getPkgKeyFiles(packageName, cwd, version)\n\n // Write lockfile\n writeLock(baseDir, skillDirName, {\n packageName,\n version,\n repo: `${owner}/${repo}`,\n source: resources.docSource,\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n\n // Write base SKILL.md\n const baseSkillMd = generateSkillMd({\n name: packageName,\n version,\n releasedAt: resolved.releasedAt,\n description: resolved.description,\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 repoUrl,\n features,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), baseSkillMd)\n\n p.log.success(`Created base skill: ${relative(cwd, skillDir)}`)\n\n // LLM enhancement\n const globalConfig = readConfig()\n if (!globalConfig.skipLlm && (!yes || opts.model)) {\n const llmConfig = await selectLlmConfig(opts.model)\n if (llmConfig?.promptOnly) {\n writePromptFiles({\n packageName,\n skillDir,\n version,\n hasIssues: resources.hasIssues,\n hasDiscussions: resources.hasDiscussions,\n hasReleases: resources.hasReleases,\n hasChangelog,\n docsType: resources.docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features,\n })\n }\n else if (llmConfig) {\n p.log.step(getModelLabel(llmConfig.model))\n await enhanceSkillWithLLM({\n packageName,\n version,\n skillDir,\n dirName: skillDirName,\n model: llmConfig.model,\n resolved,\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 force: opts.force,\n debug: opts.debug,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features,\n })\n }\n }\n\n // Link shared dir to per-agent dirs\n const shared = !isGlobal && getSharedSkillsDir(cwd)\n if (shared)\n linkSkillToAgents(skillDirName, shared, cwd, agent)\n\n if (!isGlobal) {\n registerProject(cwd)\n const skillsDir = shared || agents[agent].skillsDir\n await ensureGitignore(skillsDir, cwd, isGlobal)\n await ensureAgentInstructions(agent, cwd, isGlobal)\n }\n\n await shutdownWorker()\n\n track({\n event: 'install',\n source: `${owner}/${repo}`,\n skills: skillDirName,\n agents: agent,\n ...(isGlobal && { global: '1' as const }),\n sourceType: 'github-generated',\n })\n\n p.outro(`Synced ${owner}/${repo} to ${relative(cwd, skillDir)}`)\n}\n","import type { AgentType, CustomPrompt, OptimizeModel, SkillSection } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport type { ResolvedPackage } from '../sources/index.ts'\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/index.ts'\nimport {\n ensureCacheDir,\n getCacheDir,\n getPkgKeyFiles,\n getVersionKey,\n hasShippedDocs,\n isCached,\n linkPkgNamed,\n listReferenceFiles,\n resolvePkgDir,\n} from '../cache/index.ts'\nimport { defaultFeatures, readConfig, registerProject } from '../core/config.ts'\nimport { formatDuration } from '../core/formatting.ts'\nimport { parsePackages, readLock, writeLock } from '../core/lockfile.ts'\nimport { getSharedSkillsDir, SHARED_SKILLS_DIR } from '../core/shared.ts'\nimport { shutdownWorker } from '../retriv/pool.ts'\nimport {\n fetchPkgDist,\n parsePackageSpec,\n readLocalDependencies,\n resolvePackageDocsWithAttempts,\n searchNpmPackages,\n} from '../sources/index.ts'\n\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.ts'\nimport { ensureAgentInstructions, ensureGitignore, selectLlmConfig, writePromptFiles } from './sync.ts'\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 mode?: 'add' | 'update'\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 warnings: string[]\n features?: FeaturesConfig\n usedCache: boolean\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 = Array.from(states.values(), (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 verb = config.mode === 'update' ? 'Updating' : 'Syncing'\n const header = `\\x1B[1m${verb} ${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 pastVerb = config.mode === 'update' ? 'Updated' : 'Created'\n const skillMsg = `${pastVerb} ${successfulPkgs.length} base skills${shippedPkgs.length > 1 ? ` (Skipping ${shippedPkgs.length})` : ''}`\n p.log.success(skillMsg)\n\n for (const [, data] of skillData) {\n for (const w of data.warnings)\n p.log.warn(`\\x1B[33m${w}\\x1B[0m`)\n }\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?.promptOnly) {\n for (const pkg of successfulPkgs) {\n const data = skillData.get(pkg)!\n const baseDir = resolveBaseDir(cwd, config.agent, config.global)\n const skillDir = join(baseDir, data.skillDirName)\n writePromptFiles({\n packageName: pkg,\n skillDir,\n version: data.version,\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 sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features: data.features,\n })\n }\n }\n else 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 await ensureAgentInstructions(config.agent, cwd, config.global)\n\n await shutdownWorker()\n\n p.outro(`${pastVerb} ${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 packageSpec: string,\n config: ParallelSyncConfig,\n cwd: string,\n update: UpdateFn,\n): Promise<'shipped' | BaseSkillData> {\n // Parse dist-tag from spec: \"vue@beta\" → name=\"vue\", tag=\"beta\"\n const { name: packageName, tag: requestedTag } = parsePackageSpec(packageSpec)\n\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(requestedTag ? packageSpec : 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, config.agent)\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)\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, undefined, features, resources.repoInfo)\n\n // Index all resources (single batch)\n if (features.search) {\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\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const hasChangelog = detectChangelog(pkgDir, getCacheDir(packageName, version))\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 features,\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, config.agent)\n\n if (!config.global) {\n registerProject(cwd)\n }\n\n update(packageName, 'done', config.mode === 'update' ? 'Skill updated' : '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 warnings: resources.warnings,\n features,\n usedCache: resources.usedCache,\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 features: data.features,\n pkgFiles: data.pkgFiles,\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 features: data.features,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n }\n\n update(packageName, 'done', 'Skill optimized', versionKey)\n}\n","import type { AgentType, OptimizeModel, SkillSection } from '../agent/index.ts'\nimport type { ProjectState } from '../core/skills.ts'\nimport type { GitSkillSource } from '../sources/git-skills.ts'\nimport type { ResolveAttempt } from '../sources/index.ts'\nimport { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { join, relative, resolve } from 'pathe'\nimport {\n agents,\n buildAllSectionPrompts,\n computeSkillDirName,\n detectImportedPackages,\n generateSkillMd,\n getModelLabel,\n linkSkillToAgents,\n portabilizePrompt,\n sanitizeName,\n SECTION_OUTPUT_FILES,\n} from '../agent/index.ts'\nimport {\n ensureCacheDir,\n getCacheDir,\n getPkgKeyFiles,\n getVersionKey,\n hasShippedDocs,\n isCached,\n linkPkgNamed,\n listReferenceFiles,\n resolvePkgDir,\n} from '../cache/index.ts'\nimport { getInstalledGenerators, introLine, isInteractive, promptForAgent, resolveAgent, sharedArgs } from '../cli-helpers.ts'\nimport { defaultFeatures, hasCompletedWizard, readConfig, registerProject } from '../core/config.ts'\nimport { timedSpinner } from '../core/formatting.ts'\nimport { parsePackages, readLock, writeLock } from '../core/lockfile.ts'\nimport { getSharedSkillsDir, SHARED_SKILLS_DIR } from '../core/shared.ts'\nimport { getProjectState } from '../core/skills.ts'\nimport { shutdownWorker } from '../retriv/pool.ts'\nimport { parseGitSkillInput } from '../sources/git-skills.ts'\nimport {\n fetchPkgDist,\n isPrerelease,\n parsePackageSpec,\n readLocalDependencies,\n resolvePackageDocsWithAttempts,\n searchNpmPackages,\n} from '../sources/index.ts'\nimport { syncGitSkills } from './sync-git.ts'\nimport { syncPackagesParallel } from './sync-parallel.ts'\nimport {\n DEFAULT_SECTIONS,\n detectChangelog,\n ejectReferences,\n enhanceSkillWithLLM,\n ensureAgentInstructions,\n ensureGitignore,\n fetchAndCacheResources,\n findRelatedSkills,\n forceClearCache,\n handleShippedSkills,\n indexResources,\n linkAllReferences,\n RESOLVE_STEP_LABELS,\n resolveBaseDir,\n resolveLocalDep,\n selectLlmConfig,\n writePromptFiles,\n} from './sync-shared.ts'\nimport { runWizard } from './wizard.ts'\n\n// Re-export for external consumers\nexport { DEFAULT_SECTIONS, enhanceSkillWithLLM, ensureAgentInstructions, ensureGitignore, selectLlmConfig, selectModel, selectSkillSections, SKILLD_MARKER_END, SKILLD_MARKER_START, writePromptFiles } from './sync-shared.ts'\nexport type { EnhanceOptions, LlmConfig } from './sync-shared.ts'\n\nfunction showResolveAttempts(attempts: ResolveAttempt[]): void {\n if (attempts.length === 0)\n return\n\n p.log.message('\\x1B[90mResolution attempts:\\x1B[0m')\n for (const attempt of attempts) {\n const icon = attempt.status === 'success' ? '\\x1B[32m✓\\x1B[0m' : '\\x1B[90m✗\\x1B[0m'\n const source = `\\x1B[90m${attempt.source}\\x1B[0m`\n const msg = attempt.message ? ` - ${attempt.message}` : ''\n p.log.message(` ${icon} ${source}${msg}`)\n }\n}\n\nexport interface SyncOptions {\n packages?: string[]\n global: boolean\n agent: AgentType\n model?: OptimizeModel\n yes: boolean\n force?: boolean\n debug?: boolean\n mode?: 'add' | 'update'\n /** Eject mode: copy references as real files instead of symlinking */\n eject?: boolean | string\n /** Override the computed skill directory name */\n name?: string\n /** Lower-bound date for release/issue/discussion collection (ISO date, e.g. \"2025-07-01\") */\n from?: string\n /** Skip search index / embeddings generation */\n noSearch?: boolean\n}\n\nexport async function syncCommand(state: ProjectState, opts: SyncOptions): Promise<void> {\n // If packages specified, sync those\n if (opts.packages && opts.packages.length > 0) {\n // Use parallel sync for multiple packages\n if (opts.packages.length > 1) {\n return syncPackagesParallel({\n packages: opts.packages,\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 mode: opts.mode,\n })\n }\n\n // Single package - use original flow for cleaner output\n await syncSinglePackage(opts.packages[0]!, opts)\n return\n }\n\n // Otherwise show picker, pre-selecting missing/outdated\n const packages = await interactivePicker(state)\n if (!packages || packages.length === 0) {\n p.outro('No packages selected')\n return\n }\n\n // Use parallel sync for multiple packages\n if (packages.length > 1) {\n return syncPackagesParallel({\n packages,\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 mode: opts.mode,\n })\n }\n\n // Single package - use original flow\n await syncSinglePackage(packages[0]!, opts)\n}\n\nasync function interactivePicker(state: ProjectState): Promise<string[] | null> {\n const spin = timedSpinner()\n spin.start('Detecting imports...')\n\n const cwd = process.cwd()\n const { packages: detected, error } = await detectImportedPackages(cwd)\n const declaredMap = state.deps\n\n if (error || detected.length === 0) {\n spin.stop(error ? `Detection failed: ${error}` : 'No imports detected')\n if (declaredMap.size === 0) {\n p.log.warn('No dependencies found')\n return null\n }\n // Fallback to package.json\n return pickFromList(Array.from(declaredMap.entries(), ([name, version]) => ({\n name,\n version: maskPatch(version),\n count: 0,\n inPkgJson: true,\n })), state)\n }\n\n spin.stop(`Loaded ${detected.length} project skills`)\n\n const packages = detected.map(pkg => ({\n name: pkg.name,\n version: declaredMap.get(pkg.name),\n count: pkg.count,\n inPkgJson: declaredMap.has(pkg.name),\n }))\n\n return pickFromList(packages, state)\n}\n\nfunction maskPatch(version: string | undefined): string | undefined {\n if (!version)\n return undefined\n const parts = version.split('.')\n if (parts.length >= 3) {\n parts[2] = 'x'\n return parts.slice(0, 3).join('.')\n }\n return version\n}\n\nasync function pickFromList(\n packages: Array<{ name: string, version?: string, count: number, inPkgJson: boolean }>,\n state: ProjectState,\n): Promise<string[] | null> {\n // Pre-select missing and outdated\n const missingSet = new Set(state.missing)\n const outdatedSet = new Set(state.outdated.map(s => s.name))\n\n const options = packages.map(pkg => ({\n label: pkg.inPkgJson ? `${pkg.name} ★` : pkg.name,\n value: pkg.name,\n hint: [\n maskPatch(pkg.version),\n pkg.count > 0 ? `${pkg.count} imports` : null,\n ].filter(Boolean).join(' · ') || undefined,\n }))\n\n const initialValues = packages\n .filter(pkg => missingSet.has(pkg.name) || outdatedSet.has(pkg.name))\n .map(pkg => pkg.name)\n\n const selected = await p.multiselect({\n message: 'Select packages to sync',\n options,\n required: false,\n initialValues,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled')\n return null\n }\n\n return selected as string[]\n}\n\ninterface SyncConfig {\n global: boolean\n agent: AgentType\n model?: OptimizeModel\n yes: boolean\n force?: boolean\n debug?: boolean\n mode?: 'add' | 'update'\n eject?: boolean | string\n name?: string\n from?: string\n noSearch?: boolean\n}\n\nasync function syncSinglePackage(packageSpec: string, config: SyncConfig): Promise<void> {\n // Parse dist-tag from spec: \"vue@beta\" → name=\"vue\", tag=\"beta\"\n const { name: packageName, tag: requestedTag } = parsePackageSpec(packageSpec)\n\n const spin = timedSpinner()\n spin.start(`Resolving ${packageSpec}`)\n\n const cwd = process.cwd()\n const localDeps = await readLocalDependencies(cwd).catch(() => [])\n const localVersion = localDeps.find(d => d.name === packageName)?.version\n\n // Try npm first — use full spec for npm resolution (unpkg supports dist-tags)\n const resolveResult = await resolvePackageDocsWithAttempts(requestedTag ? packageSpec : packageName, {\n version: localVersion,\n cwd,\n onProgress: step => spin.message(`${packageName}: ${RESOLVE_STEP_LABELS[step]}`),\n })\n let resolved = resolveResult.package\n\n // If npm fails, check if it's a link: dep and try local resolution\n if (!resolved) {\n spin.message(`Resolving local package: ${packageName}`)\n resolved = await resolveLocalDep(packageName, cwd)\n }\n\n if (!resolved) {\n // Search npm for alternatives before giving up\n spin.message(`Searching npm for \"${packageName}\"...`)\n const suggestions = await searchNpmPackages(packageName)\n\n if (suggestions.length > 0) {\n spin.stop(`Package \"${packageName}\" not found on npm`)\n showResolveAttempts(resolveResult.attempts)\n\n const selected = await p.select({\n message: 'Did you mean one of these?',\n options: [\n ...suggestions.map(s => ({\n label: s.name,\n value: s.name,\n hint: s.description,\n })),\n { label: 'None of these', value: '_none_' as const },\n ],\n })\n\n if (!p.isCancel(selected) && selected !== '_none_')\n return syncSinglePackage(selected as string, config)\n\n return\n }\n\n spin.stop(`Could not find docs for: ${packageName}`)\n showResolveAttempts(resolveResult.attempts)\n return\n }\n\n const version = localVersion || resolved.version || 'latest'\n const versionKey = getVersionKey(version)\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\n // Download npm dist if not in node_modules (for standalone/learning use)\n if (!existsSync(join(cwd, 'node_modules', packageName))) {\n spin.message(`Downloading ${packageName}@${version} dist`)\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 for (const shipped of shippedResult.shipped) {\n if (shared)\n linkSkillToAgents(shipped.skillName, shared, cwd, config.agent)\n p.log.success(`Using published SKILL.md: ${shipped.skillName} → ${relative(cwd, shipped.skillDir)}`)\n }\n spin.stop(`Using published SKILL.md(s) from ${packageName}`)\n return\n }\n\n spin.stop(`Resolved ${packageName}@${useCache ? versionKey : version}${config.force ? ' (force)' : useCache ? ' (cached)' : ''}`)\n\n // Warn when no local dep and resolved to stable latest — prerelease releases won't be fetched\n if (!localVersion && !requestedTag && !isPrerelease(version)) {\n const nextTag = resolved.distTags?.next ?? resolved.distTags?.beta ?? resolved.distTags?.alpha\n if (nextTag && (!resolved.releasedAt || !nextTag.releasedAt || nextTag.releasedAt > resolved.releasedAt)) {\n p.log.warn(`\\x1B[33mNo local dependency found — using latest stable (${version}). Prerelease ${nextTag.version} available: skilld add ${packageName}@beta\\x1B[0m`)\n }\n }\n\n ensureCacheDir()\n\n const baseDir = resolveBaseDir(cwd, config.agent, config.global)\n const skillDirName = config.name ? sanitizeName(config.name) : computeSkillDirName(packageName)\n // Eject path override: default to ./skills/<name>, or use specified directory\n const skillDir = config.eject\n ? typeof config.eject === 'string'\n ? join(resolve(cwd, config.eject), skillDirName)\n : join(cwd, 'skills', skillDirName)\n : join(baseDir, skillDirName)\n mkdirSync(skillDir, { recursive: true })\n\n // ── Merge mode: skill dir already exists with a different primary package (skip in eject) ──\n const existingLock = config.eject ? undefined : readLock(baseDir)?.skills[skillDirName]\n const isMerge = existingLock && existingLock.packageName && existingLock.packageName !== packageName\n\n if (isMerge) {\n spin.stop(`Merging ${packageName} into ${skillDirName}`)\n\n // Create named symlink for this package\n linkPkgNamed(skillDir, packageName, cwd, version)\n\n // Merge into lockfile\n const repoSlug = resolved.repoUrl?.match(/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?(?:[/#]|$)/)?.[1]\n writeLock(baseDir, skillDirName, {\n packageName,\n version,\n repo: repoSlug,\n source: existingLock.source,\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n\n // Regenerate SKILL.md with all packages listed\n const updatedLock = readLock(baseDir)?.skills[skillDirName]\n const allPackages = parsePackages(updatedLock?.packages).map(p => ({ name: p.name }))\n const relatedSkills = await findRelatedSkills(packageName, baseDir)\n const pkgFiles = getPkgKeyFiles(existingLock.packageName!, cwd, existingLock.version)\n const shippedDocs = hasShippedDocs(existingLock.packageName!, cwd, existingLock.version)\n\n const mergeFeatures = readConfig().features ?? defaultFeatures\n const skillMd = generateSkillMd({\n name: existingLock.packageName!,\n version: existingLock.version,\n relatedSkills,\n hasIssues: mergeFeatures.issues && existsSync(join(skillDir, '.skilld', 'issues')),\n hasDiscussions: mergeFeatures.discussions && existsSync(join(skillDir, '.skilld', 'discussions')),\n hasReleases: mergeFeatures.releases && existsSync(join(skillDir, '.skilld', 'releases')),\n docsType: (existingLock.source?.includes('llms.txt') ? 'llms.txt' : 'docs') as 'llms.txt' | 'readme' | 'docs',\n hasShippedDocs: shippedDocs,\n pkgFiles,\n dirName: skillDirName,\n packages: allPackages,\n features: mergeFeatures,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n\n const mergeShared = !config.global && getSharedSkillsDir(cwd)\n if (mergeShared)\n linkSkillToAgents(skillDirName, mergeShared, cwd, config.agent)\n\n if (!config.global)\n registerProject(cwd)\n\n p.outro(`Merged ${packageName} into ${skillDirName}`)\n return\n }\n\n const features = { ...(readConfig().features ?? defaultFeatures) }\n if (config.noSearch)\n features.search = false\n\n // ── Phase 1: Fetch & cache all resources ──\n const resSpin = timedSpinner()\n resSpin.start('Finding resources')\n const resources = await fetchAndCacheResources({\n packageName,\n resolved,\n version,\n useCache,\n features,\n from: config.from,\n onProgress: msg => resSpin.message(msg),\n })\n const resParts: string[] = []\n if (resources.docsToIndex.length > 0) {\n const docCount = resources.docsToIndex.filter(d => d.metadata?.type === 'doc').length\n if (docCount > 0)\n resParts.push(`${docCount} docs`)\n }\n if (resources.hasIssues)\n resParts.push('issues')\n if (resources.hasDiscussions)\n resParts.push('discussions')\n if (resources.hasReleases)\n resParts.push('releases')\n resSpin.stop(resources.usedCache\n ? `Loaded ${resParts.length > 0 ? resParts.join(', ') : 'resources'} (cached)`\n : `Fetched ${resParts.length > 0 ? resParts.join(', ') : 'resources'}`,\n )\n for (const w of resources.warnings)\n p.log.warn(`\\x1B[33m${w}\\x1B[0m`)\n\n // Create symlinks (LLM needs .skilld/ to read docs, even in eject mode)\n linkAllReferences(skillDir, packageName, cwd, version, resources.docsType, undefined, features, resources.repoInfo)\n\n // ── Phase 2: Search index (generated even in eject mode so LLM can use it) ──\n if (features.search) {\n const idxSpin = timedSpinner()\n idxSpin.start('Creating search index')\n await indexResources({\n packageName,\n version,\n cwd,\n docsToIndex: resources.docsToIndex,\n features,\n onProgress: msg => idxSpin.message(msg),\n })\n idxSpin.stop('Search index ready')\n }\n\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const hasChangelog = detectChangelog(pkgDir, getCacheDir(packageName, version))\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 (no LLM needed)\n const repoSlug = resolved.repoUrl?.match(/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?(?:[/#]|$)/)?.[1]\n\n // Also create named symlink for this package (skip in eject mode)\n if (!config.eject)\n linkPkgNamed(skillDir, packageName, cwd, version)\n\n // Skip lockfile in eject mode — no agent skills dir to write to\n if (!config.eject) {\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\n // Read back merged packages from lockfile for SKILL.md generation\n const updatedLock = config.eject ? undefined : readLock(baseDir)?.skills[skillDirName]\n const allPackages = parsePackages(updatedLock?.packages).map(p => ({ name: p.name }))\n\n const isEject = !!config.eject\n const baseSkillMd = 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 features,\n eject: isEject,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), baseSkillMd)\n\n p.log.success(config.mode === 'update' ? `Updated skill: ${relative(cwd, skillDir)}` : `Created base skill: ${relative(cwd, skillDir)}`)\n\n // Ask about LLM optimization (skip if -y flag, skipLlm config, or model already specified)\n const globalConfig = readConfig()\n if (!globalConfig.skipLlm && (!config.yes || config.model)) {\n const llmConfig = await selectLlmConfig(config.model)\n if (llmConfig?.promptOnly) {\n writePromptFiles({\n packageName,\n skillDir,\n version,\n hasIssues: resources.hasIssues,\n hasDiscussions: resources.hasDiscussions,\n hasReleases: resources.hasReleases,\n hasChangelog,\n docsType: resources.docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features,\n })\n }\n else if (llmConfig) {\n p.log.step(getModelLabel(llmConfig.model))\n await enhanceSkillWithLLM({\n packageName,\n version,\n skillDir,\n dirName: skillDirName,\n model: llmConfig.model,\n resolved,\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 force: config.force,\n debug: config.debug,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n packages: allPackages.length > 1 ? allPackages : undefined,\n features,\n eject: isEject,\n })\n }\n }\n\n // Eject: clean up transient .skilld/ symlinks → copy as real files\n if (isEject) {\n const skilldDir = join(skillDir, '.skilld')\n if (existsSync(skilldDir) && !config.debug)\n rmSync(skilldDir, { recursive: true, force: true })\n ejectReferences(skillDir, packageName, cwd, version, resources.docsType, features, resources.repoInfo)\n }\n\n // Skip agent integration in eject mode (no symlinks, no gitignore, no instructions)\n if (!isEject) {\n // Link shared dir to per-agent dirs\n const shared = !config.global && getSharedSkillsDir(cwd)\n if (shared)\n linkSkillToAgents(skillDirName, shared, cwd, config.agent)\n\n // Register project in global config (for uninstall tracking)\n if (!config.global) {\n registerProject(cwd)\n }\n\n await ensureGitignore(shared ? SHARED_SKILLS_DIR : agents[config.agent].skillsDir, cwd, config.global)\n await ensureAgentInstructions(config.agent, cwd, config.global)\n }\n\n await shutdownWorker()\n\n const ejectMsg = isEject ? ' (ejected)' : ''\n p.outro(config.mode === 'update' ? `Updated ${packageName}${ejectMsg}` : `Synced ${packageName} to ${relative(cwd, skillDir)}${ejectMsg}`)\n}\n\n// ── Citty command definitions (lazy-loaded by cli.ts) ──\n\nexport const addCommandDef = defineCommand({\n meta: { name: 'add', description: 'Add skills for package(s)' },\n args: {\n package: {\n type: 'positional',\n description: 'Package(s) to sync (space or comma-separated, e.g., vue nuxt pinia)',\n required: true,\n },\n skill: {\n type: 'string',\n alias: 's',\n description: 'Select specific skills from a git repo (comma-separated)',\n valueHint: 'name',\n },\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n let agent: AgentType | 'none' | null = resolveAgent(args.agent)\n if (!agent) {\n agent = await promptForAgent()\n if (!agent)\n return\n }\n\n // Collect raw inputs (don't split URLs on slashes/spaces yet)\n const rawInputs = [...new Set(\n [args.package, ...((args as any)._ || [])]\n .map((s: string) => s.trim())\n .filter(Boolean),\n )]\n\n // No-agent mode: export portable prompts\n if (agent === 'none') {\n const packages = [...new Set(rawInputs.flatMap(s => s.split(/[,\\s]+/)).map(s => s.trim()).filter(Boolean))]\n for (const pkg of packages)\n await exportPortablePrompts(pkg, { force: args.force, agent: 'none' })\n return\n }\n\n // First-time setup — configure features + LLM model\n if (!hasCompletedWizard())\n await runWizard()\n\n // Partition: git sources vs npm packages\n const gitSources: GitSkillSource[] = []\n const npmTokens: string[] = []\n\n for (const input of rawInputs) {\n const git = parseGitSkillInput(input)\n if (git)\n gitSources.push(git)\n else\n npmTokens.push(input)\n }\n\n // Handle git sources\n if (gitSources.length > 0) {\n for (const source of gitSources) {\n const skillFilter = args.skill ? args.skill.split(/[,\\s]+/).map((s: string) => s.trim()).filter(Boolean) : undefined\n await syncGitSkills({ source, global: args.global, agent, yes: args.yes, model: args.model as OptimizeModel | undefined, force: args.force, debug: args.debug, skillFilter })\n }\n }\n\n // Handle npm packages via existing flow\n if (npmTokens.length > 0) {\n const packages = [...new Set(npmTokens.flatMap(s => s.split(/[,\\s]+/)).map(s => s.trim()).filter(Boolean))]\n const state = await getProjectState(cwd)\n p.intro(introLine({ state }))\n return syncCommand(state, {\n packages,\n global: args.global,\n agent,\n model: args.model as OptimizeModel | undefined,\n yes: args.yes,\n force: args.force,\n debug: args.debug,\n })\n }\n },\n})\n\nexport const ejectCommandDef = defineCommand({\n meta: { name: 'eject', description: 'Eject skill with references as real files (portable, no symlinks)' },\n args: {\n package: {\n type: 'positional',\n description: 'Package to eject',\n required: true,\n },\n name: {\n type: 'string',\n alias: 'n',\n description: 'Custom skill directory name (default: derived from package)',\n },\n out: {\n type: 'string',\n alias: 'o',\n description: 'Output directory path override',\n },\n from: {\n type: 'string',\n description: 'Collect releases/issues/discussions from this date onward (YYYY-MM-DD)',\n },\n search: {\n type: 'boolean',\n description: 'Build search index / embeddings (use --no-search to skip)',\n default: true,\n },\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n // Eject skips agent detection — output goes to ./skills/<name> by default\n const resolved = resolveAgent(args.agent)\n const agent: AgentType = resolved && resolved !== 'none' ? resolved : 'claude-code'\n\n if (!hasCompletedWizard())\n await runWizard()\n\n const state = await getProjectState(cwd)\n p.intro(introLine({ state }))\n return syncCommand(state, {\n packages: [args.package],\n global: args.global,\n agent,\n model: args.model as OptimizeModel | undefined,\n yes: args.yes,\n force: args.force,\n debug: args.debug,\n eject: args.out || true,\n name: args.name,\n from: args.from,\n noSearch: !args.search,\n })\n },\n})\n\nexport const updateCommandDef = defineCommand({\n meta: { name: 'update', description: 'Update outdated skills' },\n args: {\n package: {\n type: 'positional',\n description: 'Package(s) to update (space or comma-separated). Without args, syncs all outdated.',\n required: false,\n },\n background: {\n type: 'boolean',\n alias: 'b',\n description: 'Run in background (detached process, non-interactive)',\n default: false,\n },\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n\n // Background mode: spawn detached `skilld update` and exit immediately\n if (args.background) {\n const { spawn } = await import('node:child_process')\n const updateArgs = ['update', ...(args.package ? [args.package] : []), ...(args.agent ? ['--agent', args.agent] : []), ...(args.model ? ['--model', args.model as string] : [])]\n const child = spawn(process.execPath, [process.argv[1], ...updateArgs], {\n cwd,\n detached: true,\n stdio: 'ignore',\n })\n child.unref()\n return\n }\n\n const silent = !isInteractive()\n\n let agent = resolveAgent(args.agent)\n if (!agent) {\n agent = await promptForAgent()\n if (!agent)\n return\n }\n\n // No-agent mode: re-export portable prompts for outdated packages\n if (agent === 'none') {\n const state = await getProjectState(cwd)\n const packages = args.package\n ? [...new Set([args.package, ...((args as any)._ || [])].flatMap(s => s.split(/[,\\s]+/)).map(s => s.trim()).filter(Boolean))]\n : state.outdated.map(s => s.packageName || s.name)\n if (packages.length === 0) {\n if (!silent)\n p.log.success('All skills up to date')\n return\n }\n for (const pkg of packages)\n await exportPortablePrompts(pkg, { force: args.force, agent: 'none' })\n return\n }\n\n const config = readConfig()\n const state = await getProjectState(cwd)\n\n if (!silent) {\n const generators = getInstalledGenerators()\n p.intro(introLine({ state, generators, modelId: config.model }))\n }\n\n // Specific packages\n if (args.package) {\n const packages = [...new Set([args.package, ...((args as any)._ || [])].flatMap(s => s.split(/[,\\s]+/)).map(s => s.trim()).filter(Boolean))]\n return syncCommand(state, {\n packages,\n global: args.global,\n agent,\n model: (args.model as OptimizeModel | undefined) || (silent ? config.model : undefined),\n yes: args.yes || silent,\n force: args.force,\n debug: args.debug,\n mode: 'update',\n })\n }\n\n // No args: sync all outdated\n if (state.outdated.length === 0) {\n p.log.success('All skills up to date')\n return\n }\n\n const packages = state.outdated.map(s => s.packageName || s.name)\n return syncCommand(state, {\n packages,\n global: args.global,\n agent,\n model: (args.model as OptimizeModel | undefined) || (silent ? config.model : undefined),\n yes: args.yes || silent,\n force: args.force,\n debug: args.debug,\n mode: 'update',\n })\n },\n})\n\n// ── Portable prompt export (no-agent mode) ─────────────────────\n\nexport async function exportPortablePrompts(packageSpec: string, opts: {\n out?: string\n sections?: SkillSection[]\n force?: boolean\n agent?: AgentType | 'none'\n}): Promise<void> {\n const { name: packageName } = parsePackageSpec(packageSpec)\n const sections = opts.sections ?? DEFAULT_SECTIONS\n\n const spin = timedSpinner()\n spin.start(`Resolving ${packageSpec}`)\n\n const cwd = process.cwd()\n const localDeps = await readLocalDependencies(cwd).catch(() => [])\n const localVersion = localDeps.find(d => d.name === packageName)?.version\n\n const resolveResult = await resolvePackageDocsWithAttempts(packageName, {\n version: localVersion,\n cwd,\n onProgress: step => spin.message(`${packageName}: ${RESOLVE_STEP_LABELS[step]}`),\n })\n let resolved = resolveResult.package\n\n if (!resolved) {\n spin.message(`Resolving local package: ${packageName}`)\n resolved = await resolveLocalDep(packageName, cwd)\n }\n\n if (!resolved) {\n spin.stop(`Could not find docs for: ${packageName}`)\n return\n }\n\n const version = localVersion || resolved.version || 'latest'\n const versionKey = getVersionKey(version)\n const useCache = !opts.force && isCached(packageName, version)\n\n // Download npm dist if not in node_modules\n if (!existsSync(join(cwd, 'node_modules', packageName))) {\n spin.message(`Downloading ${packageName}@${version} dist`)\n await fetchPkgDist(packageName, version)\n }\n\n spin.stop(`Resolved ${packageName}@${useCache ? versionKey : version}`)\n ensureCacheDir()\n\n const skillDirName = computeSkillDirName(packageName)\n const features = readConfig().features ?? defaultFeatures\n\n // Resolve skill dir — detect agent unless explicitly 'none'\n const agent: AgentType | null = opts.agent === 'none'\n ? null\n : opts.agent ?? (await import('../agent/detect.ts').then(m => m.detectTargetAgent()))\n const baseDir = agent\n ? resolveBaseDir(cwd, agent, false)\n : join(cwd, '.claude', 'skills') // fallback when no agent detected\n const skillDir = opts.out ? resolve(cwd, opts.out) : join(baseDir, skillDirName)\n\n // Warn if output files already exist (user may have pending work)\n if (existsSync(skillDir) && !opts.force) {\n const existing = Object.values(SECTION_OUTPUT_FILES).filter(f => existsSync(join(skillDir, f)))\n if (existing.length > 0)\n p.log.warn(`Overwriting existing output files in ${relative(cwd, skillDir)}: ${existing.join(', ')}`)\n }\n mkdirSync(skillDir, { recursive: true })\n\n // Fetch & cache resources\n const resSpin = timedSpinner()\n resSpin.start('Fetching resources')\n const resources = await fetchAndCacheResources({\n packageName,\n resolved,\n version,\n useCache,\n features,\n onProgress: msg => resSpin.message(msg),\n })\n resSpin.stop('Resources ready')\n for (const w of resources.warnings)\n p.log.warn(`\\x1B[33m${w}\\x1B[0m`)\n\n // Link references for prompt building\n linkAllReferences(skillDir, packageName, cwd, version, resources.docsType, undefined, features, resources.repoInfo)\n\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const hasChangelog = detectChangelog(pkgDir, getCacheDir(packageName, version))\n const shippedDocs = hasShippedDocs(packageName, cwd, version)\n const pkgFiles = getPkgKeyFiles(packageName, cwd, version)\n const docFiles = listReferenceFiles(skillDir)\n\n // Build prompts\n const prompts = buildAllSectionPrompts({\n packageName,\n skillDir,\n version,\n hasIssues: resources.hasIssues,\n hasDiscussions: resources.hasDiscussions,\n hasReleases: resources.hasReleases,\n hasChangelog,\n docFiles,\n docsType: resources.docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n features,\n sections,\n })\n\n // Eject references as real files, then remove .skilld/ symlinks\n ejectReferences(skillDir, packageName, cwd, version, resources.docsType, features, resources.repoInfo)\n const skilldDir = join(skillDir, '.skilld')\n if (existsSync(skilldDir))\n rmSync(skilldDir, { recursive: true, force: true })\n\n // Write portable prompts\n for (const [section, prompt] of prompts) {\n const portable = portabilizePrompt(prompt, section)\n writeFileSync(join(skillDir, `PROMPT_${section}.md`), portable)\n }\n\n // Generate SKILL.md (ejected — uses ./references/ paths)\n const relatedSkills = await findRelatedSkills(packageName, join(skillDir, '..'))\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 repoUrl: resolved.repoUrl,\n features,\n eject: true,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n\n // Write lockfile so skilld list/update/assemble can discover this skill\n const repoSlug = resolved.repoUrl?.match(/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?(?:[/#]|$)/)?.[1]\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 // Link to agent dirs + setup gitignore/instructions\n if (agent) {\n const shared = getSharedSkillsDir(cwd)\n if (shared)\n linkSkillToAgents(skillDirName, shared, cwd, agent)\n await ensureGitignore(shared ? SHARED_SKILLS_DIR : agents[agent].skillsDir, cwd, false)\n await ensureAgentInstructions(agent, cwd, false)\n registerProject(cwd)\n }\n else {\n // No agent — ensure gitignore for .claude/skills/ fallback dir\n await ensureGitignore('.claude/skills', cwd, false)\n }\n\n const relDir = relative(cwd, skillDir)\n const sectionList = [...prompts.keys()]\n p.log.success(`Skill installed to ${relDir}`)\n\n // Show agent prompt the user can copy-paste\n const promptFiles = sectionList.map(s => `PROMPT_${s}.md`).join(', ')\n const outputFileList = sectionList.map(s => SECTION_OUTPUT_FILES[s]).join(', ')\n p.log.info(`Have your agent enhance the skill. Give it this prompt:\\n\\x1B[2m\\x1B[3m Read each prompt file (${promptFiles}) in ${relDir}/, read the\\n referenced files, then write your output to the matching file (${outputFileList}).\\n When done, run: skilld assemble\\x1B[0m`)\n}\n"],"mappings":"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"}
|