skilld 1.7.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/_chunks/agent.mjs +14 -5
  2. package/dist/_chunks/agent.mjs.map +1 -1
  3. package/dist/_chunks/assemble.mjs +1 -1
  4. package/dist/_chunks/author.mjs +6 -9
  5. package/dist/_chunks/author.mjs.map +1 -1
  6. package/dist/_chunks/cache.mjs +11 -1
  7. package/dist/_chunks/cache.mjs.map +1 -1
  8. package/dist/_chunks/cli-helpers.mjs +1 -1
  9. package/dist/_chunks/core.mjs +1 -1
  10. package/dist/_chunks/index.d.mts +4 -1
  11. package/dist/_chunks/index.d.mts.map +1 -1
  12. package/dist/_chunks/index3.d.mts +3 -1
  13. package/dist/_chunks/index3.d.mts.map +1 -1
  14. package/dist/_chunks/install.mjs +523 -85
  15. package/dist/_chunks/install.mjs.map +1 -1
  16. package/dist/_chunks/list.mjs +1 -1
  17. package/dist/_chunks/lockfile.mjs +4 -1
  18. package/dist/_chunks/lockfile.mjs.map +1 -1
  19. package/dist/_chunks/prepare2.mjs +4 -4
  20. package/dist/_chunks/prepare2.mjs.map +1 -1
  21. package/dist/_chunks/prompts.mjs +3 -142
  22. package/dist/_chunks/prompts.mjs.map +1 -1
  23. package/dist/_chunks/search-helpers.mjs +2 -2
  24. package/dist/_chunks/search-interactive.mjs +1 -1
  25. package/dist/_chunks/search.mjs +1 -1
  26. package/dist/_chunks/shared.mjs +463 -1
  27. package/dist/_chunks/shared.mjs.map +1 -1
  28. package/dist/_chunks/skill.mjs +329 -0
  29. package/dist/_chunks/skill.mjs.map +1 -0
  30. package/dist/_chunks/skills.mjs +3 -3
  31. package/dist/_chunks/sources.mjs +7 -3
  32. package/dist/_chunks/sources.mjs.map +1 -1
  33. package/dist/_chunks/sync-registry.mjs +4 -4
  34. package/dist/_chunks/sync-registry.mjs.map +1 -1
  35. package/dist/_chunks/sync-shared2.mjs +9 -10
  36. package/dist/_chunks/sync-shared2.mjs.map +1 -1
  37. package/dist/_chunks/sync.mjs +48 -62
  38. package/dist/_chunks/sync.mjs.map +1 -1
  39. package/dist/_chunks/uninstall.mjs +2 -2
  40. package/dist/_chunks/upload.mjs +1 -1
  41. package/dist/_chunks/validate.mjs +1 -1
  42. package/dist/_chunks/wizard.mjs +1 -1
  43. package/dist/agent/index.d.mts +3 -1
  44. package/dist/agent/index.d.mts.map +1 -1
  45. package/dist/agent/index.mjs +4 -4
  46. package/dist/cache/index.d.mts +2 -2
  47. package/dist/cache/index.mjs +2 -2
  48. package/dist/cli.mjs +5 -6
  49. package/dist/cli.mjs.map +1 -1
  50. package/dist/index.d.mts +2 -2
  51. package/dist/index.mjs +1 -1
  52. package/dist/prepare.mjs +1 -1
  53. package/dist/sources/index.d.mts +2 -2
  54. package/dist/sources/index.mjs +3 -3
  55. package/dist/types.d.mts +2 -2
  56. package/package.json +5 -4
  57. package/dist/THIRD-PARTY-LICENSES.md +0 -38
  58. package/dist/_chunks/formatting.mjs +0 -82
  59. package/dist/_chunks/formatting.mjs.map +0 -1
  60. package/dist/_chunks/install2.mjs +0 -554
  61. package/dist/_chunks/install2.mjs.map +0 -1
  62. package/dist/_chunks/libs/@sinclair/typebox.mjs +0 -2304
  63. package/dist/_chunks/libs/@sinclair/typebox.mjs.map +0 -1
  64. package/dist/_chunks/package-registry.mjs +0 -465
  65. package/dist/_chunks/package-registry.mjs.map +0 -1
  66. package/dist/_chunks/rolldown-runtime.mjs +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"author.mjs","names":[],"sources":["../../src/commands/author.ts"],"sourcesContent":["import type { OptimizeModel } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport type { LlmConfig } from './sync-shared.ts'\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { join, relative, resolve } from 'pathe'\nimport {\n computeSkillDirName,\n generateSkillMd,\n getModelLabel,\n} from '../agent/index.ts'\nimport {\n ensureCacheDir,\n getCacheDir,\n writeToCache,\n} from '../cache/index.ts'\nimport { guard } from '../cli-helpers.ts'\nimport { defaultFeatures, readConfig } from '../core/config.ts'\nimport { timedSpinner } from '../core/formatting.ts'\nimport { appendToJsonArray, patchPackageJson, readPackageJsonSafe } from '../core/package-json.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport {\n fetchGitHubDiscussions,\n fetchGitHubIssues,\n formatDiscussionAsMarkdown,\n formatIssueAsMarkdown,\n generateDiscussionIndex,\n generateIssueIndex,\n isGhAvailable,\n parseGitHubUrl,\n readLocalPackageInfo,\n} from '../sources/index.ts'\nimport {\n detectChangelog,\n ejectReferences,\n enhanceSkillWithLLM,\n forceClearCache,\n linkAllReferences,\n selectLlmConfig,\n writePromptFiles,\n} from './sync-shared.ts'\n\nconst QUOTE_PREFIX_RE = /^['\"]/\nconst QUOTE_SUFFIX_RE = /['\"]$/\n\n// ── Monorepo detection ──\n\nexport interface MonorepoPackage {\n name: string\n version: string\n description?: string\n repoUrl?: string\n dir: string\n}\n\nexport function detectMonorepoPackages(cwd: string): MonorepoPackage[] | null {\n const rootResult = readPackageJsonSafe(join(cwd, 'package.json'))\n if (!rootResult)\n return null\n\n const pkg = rootResult.parsed as Record<string, any>\n\n // Must be private (monorepo root) with workspaces or pnpm-workspace.yaml\n if (!pkg.private)\n return null\n\n let patterns: string[] = []\n\n if (Array.isArray(pkg.workspaces)) {\n patterns = pkg.workspaces\n }\n else if (pkg.workspaces?.packages) {\n patterns = pkg.workspaces.packages\n }\n\n // Check pnpm-workspace.yaml\n if (patterns.length === 0) {\n const pnpmWs = join(cwd, 'pnpm-workspace.yaml')\n if (existsSync(pnpmWs)) {\n const lines = readFileSync(pnpmWs, 'utf-8').split('\\n')\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed.startsWith('-'))\n continue\n const value = trimmed.slice(1).trim().replace(QUOTE_PREFIX_RE, '').replace(QUOTE_SUFFIX_RE, '')\n if (value)\n patterns.push(value)\n }\n }\n }\n\n if (patterns.length === 0)\n return null\n\n const packages: MonorepoPackage[] = []\n\n for (const pattern of patterns) {\n // Expand simple glob: \"packages/*\" → scan packages/*/package.json\n const base = pattern.replace(/\\/?\\*+$/, '')\n const scanDir = resolve(cwd, base)\n if (!existsSync(scanDir))\n continue\n\n const directResult = readPackageJsonSafe(join(scanDir, 'package.json'))\n if (directResult) {\n const directPkg = directResult.parsed as Record<string, any>\n if (!directPkg.private && directPkg.name) {\n const repoUrl = typeof directPkg.repository === 'string'\n ? directPkg.repository\n : directPkg.repository?.url?.replace(/^git\\+/, '').replace(/\\.git$/, '')\n\n packages.push({\n name: directPkg.name,\n version: directPkg.version || '0.0.0',\n description: directPkg.description,\n repoUrl,\n dir: scanDir,\n })\n continue\n }\n }\n\n for (const entry of readdirSync(scanDir, { withFileTypes: true })) {\n if (!entry.isDirectory())\n continue\n const childResult = readPackageJsonSafe(join(scanDir, entry.name, 'package.json'))\n if (!childResult)\n continue\n\n const childPkg = childResult.parsed as Record<string, any>\n if (childPkg.private)\n continue\n if (!childPkg.name)\n continue\n\n const repoUrl = typeof childPkg.repository === 'string'\n ? childPkg.repository\n : childPkg.repository?.url?.replace(/^git\\+/, '').replace(/\\.git$/, '')\n\n packages.push({\n name: childPkg.name,\n version: childPkg.version || '0.0.0',\n description: childPkg.description,\n repoUrl,\n dir: join(scanDir, entry.name),\n })\n }\n }\n\n return packages.length > 0 ? packages : null\n}\n\n// ── Docs resolution ──\n\nfunction walkMarkdownFiles(dir: string, base = ''): Array<{ path: string, content: string }> {\n const results: Array<{ path: string, content: string }> = []\n if (!existsSync(dir))\n return results\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const rel = base ? `${base}/${entry.name}` : entry.name\n const full = join(dir, entry.name)\n if (entry.isDirectory()) {\n results.push(...walkMarkdownFiles(full, rel))\n }\n else if (/\\.mdx?$/.test(entry.name)) {\n results.push({ path: rel, content: readFileSync(full, 'utf-8') })\n }\n }\n return results\n}\n\n/**\n * Resolve docs from local filesystem. Cascade:\n * 1. Package-level docs/ directory\n * 2. Monorepo-root docs/ directory (if monorepoRoot provided)\n * 3. Monorepo-root docs/content/ (Nuxt Content convention)\n * 4. llms.txt in package dir\n * 5. README.md in package dir\n */\nfunction resolveLocalDocs(\n packageDir: string,\n packageName: string,\n version: string,\n monorepoRoot?: string,\n): { docsType: 'docs' | 'llms.txt' | 'readme', docSource: string } {\n const cachedDocs: Array<{ path: string, content: string }> = []\n\n const cacheChangelog = () => cacheLocalChangelog(packageDir, packageName, version, monorepoRoot)\n\n // 1. Package-level docs/\n const docsDir = join(packageDir, 'docs')\n if (existsSync(docsDir)) {\n const mdFiles = walkMarkdownFiles(docsDir)\n if (mdFiles.length > 0) {\n for (const f of mdFiles)\n cachedDocs.push({ path: `docs/${f.path}`, content: sanitizeMarkdown(f.content) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n return { docsType: 'docs', docSource: `local docs/ (${mdFiles.length} files)` }\n }\n }\n\n // 2. Monorepo-root docs/ or docs/content/\n if (monorepoRoot) {\n for (const candidate of ['docs/content', 'docs']) {\n const rootDocsDir = join(monorepoRoot, candidate)\n if (existsSync(rootDocsDir)) {\n const mdFiles = walkMarkdownFiles(rootDocsDir)\n if (mdFiles.length > 0) {\n for (const f of mdFiles)\n cachedDocs.push({ path: `docs/${f.path}`, content: sanitizeMarkdown(f.content) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n return { docsType: 'docs', docSource: `monorepo ${candidate}/ (${mdFiles.length} files)` }\n }\n }\n }\n }\n\n // 3. llms.txt (package dir, then monorepo root)\n for (const dir of [packageDir, monorepoRoot].filter(Boolean) as string[]) {\n const llmsPath = join(dir, 'llms.txt')\n if (existsSync(llmsPath)) {\n cachedDocs.push({ path: 'llms.txt', content: sanitizeMarkdown(readFileSync(llmsPath, 'utf-8')) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n const source = dir === packageDir ? 'local llms.txt' : 'monorepo llms.txt'\n return { docsType: 'llms.txt', docSource: source }\n }\n }\n\n // 4. README.md (package dir, then monorepo root)\n for (const dir of [packageDir, monorepoRoot].filter(Boolean) as string[]) {\n const readmeFile = readdirSync(dir).find(f => /^readme\\.md$/i.test(f))\n if (readmeFile) {\n cachedDocs.push({ path: 'docs/README.md', content: sanitizeMarkdown(readFileSync(join(dir, readmeFile), 'utf-8')) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n const source = dir === packageDir ? 'local README.md' : 'monorepo README.md'\n return { docsType: 'readme', docSource: source }\n }\n }\n\n cacheChangelog()\n return { docsType: 'readme', docSource: 'none' }\n}\n\nfunction cacheLocalChangelog(dir: string, packageName: string, version: string, monorepoRoot?: string): void {\n const candidates = ['CHANGELOG.md', 'changelog.md']\n const changelogFile = candidates.find(f => existsSync(join(dir, f)))\n || (monorepoRoot ? candidates.find(f => existsSync(join(monorepoRoot, f))) : undefined)\n const changelogDir = changelogFile && existsSync(join(dir, changelogFile)) ? dir : monorepoRoot\n if (changelogFile && changelogDir) {\n writeToCache(packageName, version, [{\n path: `releases/${changelogFile}`,\n content: sanitizeMarkdown(readFileSync(join(changelogDir, changelogFile), 'utf-8')),\n }])\n }\n}\n\n// ── Remote supplements ──\n\nasync function fetchRemoteSupplements(opts: {\n packageName: string\n version: string\n repoUrl?: string\n features: FeaturesConfig\n onProgress: (msg: string) => void\n}): Promise<{ hasIssues: boolean, hasDiscussions: boolean }> {\n const { packageName, version, repoUrl, features, onProgress } = opts\n\n if (!repoUrl || !isGhAvailable())\n return { hasIssues: false, hasDiscussions: false }\n\n const gh = parseGitHubUrl(repoUrl)\n if (!gh)\n return { hasIssues: false, hasDiscussions: false }\n\n const cacheDir = getCacheDir(packageName, version)\n\n let hasIssues = false\n const issuesDir = join(cacheDir, 'issues')\n if (features.issues && !existsSync(issuesDir)) {\n onProgress('Fetching issues via GitHub API')\n const issues = await fetchGitHubIssues(gh.owner, gh.repo, 30).catch(() => [])\n if (issues.length > 0) {\n onProgress(`Caching ${issues.length} issues`)\n writeToCache(packageName, version, issues.map(issue => ({\n path: `issues/issue-${issue.number}.md`,\n content: formatIssueAsMarkdown(issue),\n })))\n writeToCache(packageName, version, [{\n path: 'issues/_INDEX.md',\n content: generateIssueIndex(issues),\n }])\n hasIssues = true\n }\n }\n else {\n hasIssues = features.issues && existsSync(issuesDir)\n }\n\n let hasDiscussions = false\n const discussionsDir = join(cacheDir, 'discussions')\n if (features.discussions && !existsSync(discussionsDir)) {\n onProgress('Fetching discussions via GitHub API')\n const discussions = await fetchGitHubDiscussions(gh.owner, gh.repo, 20).catch(() => [])\n if (discussions.length > 0) {\n onProgress(`Caching ${discussions.length} discussions`)\n writeToCache(packageName, version, discussions.map(d => ({\n path: `discussions/discussion-${d.number}.md`,\n content: formatDiscussionAsMarkdown(d),\n })))\n writeToCache(packageName, version, [{\n path: 'discussions/_INDEX.md',\n content: generateDiscussionIndex(discussions),\n }])\n hasDiscussions = true\n }\n }\n else {\n hasDiscussions = features.discussions && existsSync(discussionsDir)\n }\n\n return { hasIssues, hasDiscussions }\n}\n\n// ── package.json patching ──\n\nexport function patchPackageJsonFiles(packageDir: string): void {\n const pkgPath = join(packageDir, 'package.json')\n if (!existsSync(pkgPath))\n return\n\n const wrote = patchPackageJson(pkgPath, (raw, pkg) => {\n if (!Array.isArray(pkg.files)) {\n p.log.warn('No `files` array in package.json. Add `\"skills\"` to your files array manually.')\n return null\n }\n\n if ((pkg.files as string[]).some((f: string) => f === 'skills' || f === 'skills/' || f === 'skills/**'))\n return null\n\n return appendToJsonArray(raw, ['files'], 'skills')\n })\n\n if (wrote)\n p.log.success('Added `\"skills\"` to package.json files array')\n}\n\n// ── Core author flow for a single package ──\n\nasync function authorSinglePackage(opts: {\n packageDir: string\n packageName: string\n version: string\n description?: string\n repoUrl?: string\n monorepoRoot?: string\n out?: string\n llmConfig?: LlmConfig | null\n force?: boolean\n debug?: boolean\n}): Promise<string | null> {\n const { packageDir, packageName, version } = opts\n const spin = timedSpinner()\n\n const sanitizedName = computeSkillDirName(packageName)\n const outDir = opts.out ? resolve(packageDir, opts.out) : join(packageDir, 'skills', sanitizedName)\n\n // Validate --out doesn't point at the package root or a parent\n if (opts.out) {\n const rel = relative(packageDir, outDir)\n if (!rel || rel === '.' || rel.startsWith('..')) {\n p.log.error('--out must point to a child directory, not the package root or a parent')\n return null\n }\n }\n\n if (existsSync(outDir))\n rmSync(outDir, { recursive: true, force: true })\n mkdirSync(outDir, { recursive: true })\n\n if (opts.force) {\n forceClearCache(packageName, version)\n }\n\n ensureCacheDir()\n const features = readConfig().features ?? defaultFeatures\n\n // Resolve local docs\n spin.start('Resolving local docs')\n const { docsType, docSource } = resolveLocalDocs(packageDir, packageName, version, opts.monorepoRoot)\n spin.stop(`Resolved docs: ${docSource}`)\n\n // Fetch remote supplements (issues/discussions)\n const supSpin = timedSpinner()\n supSpin.start('Checking remote supplements')\n const { hasIssues, hasDiscussions } = await fetchRemoteSupplements({\n packageName,\n version,\n repoUrl: opts.repoUrl,\n features,\n onProgress: msg => supSpin.message(msg),\n })\n const supParts: string[] = []\n if (hasIssues)\n supParts.push('issues')\n if (hasDiscussions)\n supParts.push('discussions')\n supSpin.stop(supParts.length > 0 ? `Fetched ${supParts.join(', ')}` : 'No remote supplements')\n\n // Create temporary .skilld/ symlinks (LLM needs these to read docs)\n linkAllReferences(outDir, packageName, packageDir, version, docsType, undefined, features)\n\n // Detect changelog + releases\n const cacheDir = getCacheDir(packageName, version)\n const hasChangelog = detectChangelog(packageDir, cacheDir)\n const hasReleases = existsSync(join(cacheDir, 'releases'))\n\n // Generate base SKILL.md\n const baseSkillMd = generateSkillMd({\n name: packageName,\n version,\n description: opts.description,\n relatedSkills: [],\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: false,\n pkgFiles: [],\n dirName: sanitizedName,\n repoUrl: opts.repoUrl,\n features,\n eject: true,\n })\n writeFileSync(join(outDir, 'SKILL.md'), baseSkillMd)\n p.log.success(`Created base skill: ${relative(packageDir, outDir)}`)\n\n // LLM enhancement (config resolved by caller)\n const skilldDir = join(outDir, '.skilld')\n try {\n const llmConfig = opts.llmConfig\n if (llmConfig?.promptOnly) {\n writePromptFiles({\n packageName,\n skillDir: outDir,\n version,\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: false,\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: outDir,\n dirName: sanitizedName,\n model: llmConfig.model,\n resolved: { repoUrl: opts.repoUrl },\n relatedSkills: [],\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: false,\n pkgFiles: [],\n force: opts.force,\n debug: opts.debug,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features,\n eject: true,\n })\n }\n\n ejectReferences(outDir, packageName, packageDir, version, docsType, features)\n }\n finally {\n // Always clean up .skilld/ symlinks, even if LLM enhancement fails\n if (existsSync(skilldDir))\n rmSync(skilldDir, { recursive: true, force: true })\n }\n\n // Only patch package.json when output is under skills/\n const relOut = relative(packageDir, outDir)\n if (relOut === 'skills' || relOut.startsWith('skills/'))\n patchPackageJsonFiles(packageDir)\n else if (opts.out)\n p.log.info('Output is outside skills/, skipping package.json patch. Add the path to \"files\" manually if publishing.')\n\n return outDir\n}\n\n// ── Main command ──\n\nasync function resolveLlmConfig(model?: OptimizeModel, yes?: boolean): Promise<LlmConfig | null | undefined> {\n const globalConfig = readConfig()\n if (globalConfig.skipLlm || (yes && !model))\n return undefined\n return selectLlmConfig(model, 'Generate skill sections')\n}\n\nasync function authorCommand(opts: {\n out?: string\n model?: OptimizeModel\n yes?: boolean\n force?: boolean\n debug?: boolean\n}): Promise<void> {\n const cwd = process.cwd()\n\n // Check for monorepo\n const monoPackages = detectMonorepoPackages(cwd)\n\n if (monoPackages && monoPackages.length > 0) {\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m author \\x1B[90m(monorepo: ${monoPackages.length} packages)\\x1B[0m`)\n\n if (opts.out) {\n p.log.error('--out is not supported in monorepo mode (each package gets its own skills/ directory)')\n return\n }\n\n const selected = guard(await p.multiselect({\n message: 'Which packages should ship skills?',\n options: monoPackages.map(pkg => ({\n label: pkg.name,\n value: pkg,\n hint: pkg.description,\n })),\n }))\n\n if (selected.length === 0)\n return\n\n // Resolve LLM config once for all packages\n const llmConfig = await resolveLlmConfig(opts.model, opts.yes)\n if (llmConfig === null) {\n p.cancel('Cancelled')\n return\n }\n\n // Resolve monorepo-level repoUrl for packages that lack their own\n const rootPkgResult = readPackageJsonSafe(join(cwd, 'package.json'))\n const rootPkg = rootPkgResult?.parsed as Record<string, any> | undefined\n const rootRepoUrl = typeof rootPkg?.repository === 'string'\n ? rootPkg.repository\n : rootPkg?.repository?.url?.replace(/^git\\+/, '').replace(/\\.git$/, '')\n\n const results: Array<{ name: string, outDir: string }> = []\n\n for (const pkg of selected) {\n p.log.step(`\\x1B[36m${pkg.name}\\x1B[0m@${pkg.version}`)\n const outDir = await authorSinglePackage({\n packageDir: pkg.dir,\n packageName: pkg.name,\n version: pkg.version,\n description: pkg.description,\n repoUrl: pkg.repoUrl || rootRepoUrl,\n monorepoRoot: cwd,\n llmConfig,\n force: opts.force,\n debug: opts.debug,\n })\n if (outDir)\n results.push({ name: pkg.name, outDir })\n }\n\n if (results.length > 0) {\n p.log.message('')\n for (const { name, outDir } of results)\n p.log.success(`${name} → ${relative(cwd, outDir)}`)\n\n printConsumerGuidance(results.map(r => r.name))\n }\n\n p.outro('Done')\n return\n }\n\n // Single package mode\n const pkgInfo = readLocalPackageInfo(cwd)\n if (!pkgInfo) {\n p.log.error('No package.json found in current directory')\n return\n }\n\n const { name: packageName, version, repoUrl } = pkgInfo\n\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m author \\x1B[36m${packageName}\\x1B[0m@${version}`)\n\n const llmConfig = await resolveLlmConfig(opts.model, opts.yes)\n if (llmConfig === null) {\n p.cancel('Cancelled')\n return\n }\n\n const outDir = await authorSinglePackage({\n packageDir: cwd,\n packageName,\n version,\n description: pkgInfo.description,\n repoUrl,\n out: opts.out,\n llmConfig,\n force: opts.force,\n debug: opts.debug,\n })\n\n if (outDir) {\n printConsumerGuidance([packageName])\n p.outro(`Authored skill to ${relative(cwd, outDir)}`)\n }\n}\n\nfunction printConsumerGuidance(packageNames: string[]): void {\n const names = packageNames.join(', ')\n p.log.info(\n `\\x1B[90mConsumers get ${packageNames.length > 1 ? 'these skills' : 'this skill'} automatically:\\x1B[0m\\n`\n + ` \\x1B[90m1. Install ${names} as a dependency\\x1B[0m\\n`\n + ` \\x1B[90m2. Run \\x1B[36mskilld prepare\\x1B[90m (or add to package.json: \\x1B[36m\"prepare\": \"skilld prepare\"\\x1B[90m)\\x1B[0m`,\n )\n}\n\nexport const authorCommandDef = defineCommand({\n meta: { name: 'package', description: 'Generate a package skill from documentation' },\n args: {\n out: {\n type: 'string',\n alias: 'o',\n description: 'Output directory (default: ./skills/<name>/)',\n },\n model: {\n type: 'string',\n alias: 'm',\n description: 'Enhancement model for SKILL.md generation',\n valueHint: 'id',\n },\n yes: {\n type: 'boolean',\n alias: 'y',\n description: 'Skip prompts, use defaults',\n default: false,\n },\n force: {\n type: 'boolean',\n alias: 'f',\n description: 'Clear cache and regenerate',\n default: false,\n },\n debug: {\n type: 'boolean',\n description: 'Save raw enhancement output to logs/',\n default: false,\n },\n },\n async run({ args }) {\n await authorCommand({\n out: args.out,\n model: args.model as OptimizeModel | undefined,\n yes: args.yes,\n force: args.force,\n debug: args.debug,\n })\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"author.mjs","names":[],"sources":["../../src/commands/author.ts"],"sourcesContent":["import type { OptimizeModel } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport type { LlmConfig } from './sync-shared.ts'\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { join, relative, resolve } from 'pathe'\nimport {\n computeSkillDirName,\n getModelLabel,\n writeGeneratedSkillMd,\n} from '../agent/index.ts'\nimport {\n ensureCacheDir,\n getCacheDir,\n writeToCache,\n} from '../cache/index.ts'\nimport { guard } from '../cli-helpers.ts'\nimport { defaultFeatures, readConfig } from '../core/config.ts'\nimport { timedSpinner } from '../core/formatting.ts'\nimport { appendToJsonArray, patchPackageJson, readPackageJsonSafe } from '../core/package-json.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport {\n fetchGitHubDiscussions,\n fetchGitHubIssues,\n formatDiscussionAsMarkdown,\n formatIssueAsMarkdown,\n generateDiscussionIndex,\n generateIssueIndex,\n isGhAvailable,\n parseGitHubUrl,\n readLocalPackageInfo,\n} from '../sources/index.ts'\nimport {\n detectChangelog,\n ejectReferences,\n enhanceSkillWithLLM,\n forceClearCache,\n linkAllReferences,\n selectLlmConfig,\n writePromptFiles,\n} from './sync-shared.ts'\n\nconst QUOTE_PREFIX_RE = /^['\"]/\nconst QUOTE_SUFFIX_RE = /['\"]$/\n\n// ── Monorepo detection ──\n\nexport interface MonorepoPackage {\n name: string\n version: string\n description?: string\n repoUrl?: string\n dir: string\n}\n\nexport function detectMonorepoPackages(cwd: string): MonorepoPackage[] | null {\n const rootResult = readPackageJsonSafe(join(cwd, 'package.json'))\n if (!rootResult)\n return null\n\n const pkg = rootResult.parsed as Record<string, any>\n\n // Must be private (monorepo root) with workspaces or pnpm-workspace.yaml\n if (!pkg.private)\n return null\n\n let patterns: string[] = []\n\n if (Array.isArray(pkg.workspaces)) {\n patterns = pkg.workspaces\n }\n else if (pkg.workspaces?.packages) {\n patterns = pkg.workspaces.packages\n }\n\n // Check pnpm-workspace.yaml\n if (patterns.length === 0) {\n const pnpmWs = join(cwd, 'pnpm-workspace.yaml')\n if (existsSync(pnpmWs)) {\n const lines = readFileSync(pnpmWs, 'utf-8').split('\\n')\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed.startsWith('-'))\n continue\n const value = trimmed.slice(1).trim().replace(QUOTE_PREFIX_RE, '').replace(QUOTE_SUFFIX_RE, '')\n if (value)\n patterns.push(value)\n }\n }\n }\n\n if (patterns.length === 0)\n return null\n\n const packages: MonorepoPackage[] = []\n\n for (const pattern of patterns) {\n // Expand simple glob: \"packages/*\" → scan packages/*/package.json\n const base = pattern.replace(/\\/?\\*+$/, '')\n const scanDir = resolve(cwd, base)\n if (!existsSync(scanDir))\n continue\n\n const directResult = readPackageJsonSafe(join(scanDir, 'package.json'))\n if (directResult) {\n const directPkg = directResult.parsed as Record<string, any>\n if (!directPkg.private && directPkg.name) {\n const repoUrl = typeof directPkg.repository === 'string'\n ? directPkg.repository\n : directPkg.repository?.url?.replace(/^git\\+/, '').replace(/\\.git$/, '')\n\n packages.push({\n name: directPkg.name,\n version: directPkg.version || '0.0.0',\n description: directPkg.description,\n repoUrl,\n dir: scanDir,\n })\n continue\n }\n }\n\n for (const entry of readdirSync(scanDir, { withFileTypes: true })) {\n if (!entry.isDirectory())\n continue\n const childResult = readPackageJsonSafe(join(scanDir, entry.name, 'package.json'))\n if (!childResult)\n continue\n\n const childPkg = childResult.parsed as Record<string, any>\n if (childPkg.private)\n continue\n if (!childPkg.name)\n continue\n\n const repoUrl = typeof childPkg.repository === 'string'\n ? childPkg.repository\n : childPkg.repository?.url?.replace(/^git\\+/, '').replace(/\\.git$/, '')\n\n packages.push({\n name: childPkg.name,\n version: childPkg.version || '0.0.0',\n description: childPkg.description,\n repoUrl,\n dir: join(scanDir, entry.name),\n })\n }\n }\n\n return packages.length > 0 ? packages : null\n}\n\n// ── Docs resolution ──\n\nfunction walkMarkdownFiles(dir: string, base = ''): Array<{ path: string, content: string }> {\n const results: Array<{ path: string, content: string }> = []\n if (!existsSync(dir))\n return results\n\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const rel = base ? `${base}/${entry.name}` : entry.name\n const full = join(dir, entry.name)\n if (entry.isDirectory()) {\n results.push(...walkMarkdownFiles(full, rel))\n }\n else if (/\\.mdx?$/.test(entry.name)) {\n results.push({ path: rel, content: readFileSync(full, 'utf-8') })\n }\n }\n return results\n}\n\n/**\n * Resolve docs from local filesystem. Cascade:\n * 1. Package-level docs/ directory\n * 2. Monorepo-root docs/ directory (if monorepoRoot provided)\n * 3. Monorepo-root docs/content/ (Nuxt Content convention)\n * 4. llms.txt in package dir\n * 5. README.md in package dir\n */\nfunction resolveLocalDocs(\n packageDir: string,\n packageName: string,\n version: string,\n monorepoRoot?: string,\n): { docsType: 'docs' | 'llms.txt' | 'readme', docSource: string } {\n const cachedDocs: Array<{ path: string, content: string }> = []\n\n const cacheChangelog = () => cacheLocalChangelog(packageDir, packageName, version, monorepoRoot)\n\n // 1. Package-level docs/\n const docsDir = join(packageDir, 'docs')\n if (existsSync(docsDir)) {\n const mdFiles = walkMarkdownFiles(docsDir)\n if (mdFiles.length > 0) {\n for (const f of mdFiles)\n cachedDocs.push({ path: `docs/${f.path}`, content: sanitizeMarkdown(f.content) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n return { docsType: 'docs', docSource: `local docs/ (${mdFiles.length} files)` }\n }\n }\n\n // 2. Monorepo-root docs/ or docs/content/\n if (monorepoRoot) {\n for (const candidate of ['docs/content', 'docs']) {\n const rootDocsDir = join(monorepoRoot, candidate)\n if (existsSync(rootDocsDir)) {\n const mdFiles = walkMarkdownFiles(rootDocsDir)\n if (mdFiles.length > 0) {\n for (const f of mdFiles)\n cachedDocs.push({ path: `docs/${f.path}`, content: sanitizeMarkdown(f.content) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n return { docsType: 'docs', docSource: `monorepo ${candidate}/ (${mdFiles.length} files)` }\n }\n }\n }\n }\n\n // 3. llms.txt (package dir, then monorepo root)\n for (const dir of [packageDir, monorepoRoot].filter(Boolean) as string[]) {\n const llmsPath = join(dir, 'llms.txt')\n if (existsSync(llmsPath)) {\n cachedDocs.push({ path: 'llms.txt', content: sanitizeMarkdown(readFileSync(llmsPath, 'utf-8')) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n const source = dir === packageDir ? 'local llms.txt' : 'monorepo llms.txt'\n return { docsType: 'llms.txt', docSource: source }\n }\n }\n\n // 4. README.md (package dir, then monorepo root)\n for (const dir of [packageDir, monorepoRoot].filter(Boolean) as string[]) {\n const readmeFile = readdirSync(dir).find(f => /^readme\\.md$/i.test(f))\n if (readmeFile) {\n cachedDocs.push({ path: 'docs/README.md', content: sanitizeMarkdown(readFileSync(join(dir, readmeFile), 'utf-8')) })\n writeToCache(packageName, version, cachedDocs)\n cacheChangelog()\n const source = dir === packageDir ? 'local README.md' : 'monorepo README.md'\n return { docsType: 'readme', docSource: source }\n }\n }\n\n cacheChangelog()\n return { docsType: 'readme', docSource: 'none' }\n}\n\nfunction cacheLocalChangelog(dir: string, packageName: string, version: string, monorepoRoot?: string): void {\n const candidates = ['CHANGELOG.md', 'changelog.md']\n const changelogFile = candidates.find(f => existsSync(join(dir, f)))\n || (monorepoRoot ? candidates.find(f => existsSync(join(monorepoRoot, f))) : undefined)\n const changelogDir = changelogFile && existsSync(join(dir, changelogFile)) ? dir : monorepoRoot\n if (changelogFile && changelogDir) {\n writeToCache(packageName, version, [{\n path: `releases/${changelogFile}`,\n content: sanitizeMarkdown(readFileSync(join(changelogDir, changelogFile), 'utf-8')),\n }])\n }\n}\n\n// ── Remote supplements ──\n\nasync function fetchRemoteSupplements(opts: {\n packageName: string\n version: string\n repoUrl?: string\n features: FeaturesConfig\n onProgress: (msg: string) => void\n}): Promise<{ hasIssues: boolean, hasDiscussions: boolean }> {\n const { packageName, version, repoUrl, features, onProgress } = opts\n\n if (!repoUrl || !isGhAvailable())\n return { hasIssues: false, hasDiscussions: false }\n\n const gh = parseGitHubUrl(repoUrl)\n if (!gh)\n return { hasIssues: false, hasDiscussions: false }\n\n const cacheDir = getCacheDir(packageName, version)\n\n let hasIssues = false\n const issuesDir = join(cacheDir, 'issues')\n if (features.issues && !existsSync(issuesDir)) {\n onProgress('Fetching issues via GitHub API')\n const issues = await fetchGitHubIssues(gh.owner, gh.repo, 30).catch(() => [])\n if (issues.length > 0) {\n onProgress(`Caching ${issues.length} issues`)\n writeToCache(packageName, version, issues.map(issue => ({\n path: `issues/issue-${issue.number}.md`,\n content: formatIssueAsMarkdown(issue),\n })))\n writeToCache(packageName, version, [{\n path: 'issues/_INDEX.md',\n content: generateIssueIndex(issues),\n }])\n hasIssues = true\n }\n }\n else {\n hasIssues = features.issues && existsSync(issuesDir)\n }\n\n let hasDiscussions = false\n const discussionsDir = join(cacheDir, 'discussions')\n if (features.discussions && !existsSync(discussionsDir)) {\n onProgress('Fetching discussions via GitHub API')\n const discussions = await fetchGitHubDiscussions(gh.owner, gh.repo, 20).catch(() => [])\n if (discussions.length > 0) {\n onProgress(`Caching ${discussions.length} discussions`)\n writeToCache(packageName, version, discussions.map(d => ({\n path: `discussions/discussion-${d.number}.md`,\n content: formatDiscussionAsMarkdown(d),\n })))\n writeToCache(packageName, version, [{\n path: 'discussions/_INDEX.md',\n content: generateDiscussionIndex(discussions),\n }])\n hasDiscussions = true\n }\n }\n else {\n hasDiscussions = features.discussions && existsSync(discussionsDir)\n }\n\n return { hasIssues, hasDiscussions }\n}\n\n// ── package.json patching ──\n\nexport function patchPackageJsonFiles(packageDir: string): void {\n const pkgPath = join(packageDir, 'package.json')\n if (!existsSync(pkgPath))\n return\n\n const wrote = patchPackageJson(pkgPath, (raw, pkg) => {\n if (!Array.isArray(pkg.files)) {\n p.log.warn('No `files` array in package.json. Add `\"skills\"` to your files array manually.')\n return null\n }\n\n if ((pkg.files as string[]).some((f: string) => f === 'skills' || f === 'skills/' || f === 'skills/**'))\n return null\n\n return appendToJsonArray(raw, ['files'], 'skills')\n })\n\n if (wrote)\n p.log.success('Added `\"skills\"` to package.json files array')\n}\n\n// ── Core author flow for a single package ──\n\nasync function authorSinglePackage(opts: {\n packageDir: string\n packageName: string\n version: string\n description?: string\n repoUrl?: string\n monorepoRoot?: string\n out?: string\n llmConfig?: LlmConfig | null\n force?: boolean\n debug?: boolean\n}): Promise<string | null> {\n const { packageDir, packageName, version } = opts\n const spin = timedSpinner()\n\n const sanitizedName = computeSkillDirName(packageName)\n const outDir = opts.out ? resolve(packageDir, opts.out) : join(packageDir, 'skills', sanitizedName)\n\n // Validate --out doesn't point at the package root or a parent\n if (opts.out) {\n const rel = relative(packageDir, outDir)\n if (!rel || rel === '.' || rel.startsWith('..')) {\n p.log.error('--out must point to a child directory, not the package root or a parent')\n return null\n }\n }\n\n if (existsSync(outDir))\n rmSync(outDir, { recursive: true, force: true })\n mkdirSync(outDir, { recursive: true })\n\n if (opts.force) {\n forceClearCache(packageName, version)\n }\n\n ensureCacheDir()\n const features = readConfig().features ?? defaultFeatures\n\n // Resolve local docs\n spin.start('Resolving local docs')\n const { docsType, docSource } = resolveLocalDocs(packageDir, packageName, version, opts.monorepoRoot)\n spin.stop(`Resolved docs: ${docSource}`)\n\n // Fetch remote supplements (issues/discussions)\n const supSpin = timedSpinner()\n supSpin.start('Checking remote supplements')\n const { hasIssues, hasDiscussions } = await fetchRemoteSupplements({\n packageName,\n version,\n repoUrl: opts.repoUrl,\n features,\n onProgress: msg => supSpin.message(msg),\n })\n const supParts: string[] = []\n if (hasIssues)\n supParts.push('issues')\n if (hasDiscussions)\n supParts.push('discussions')\n supSpin.stop(supParts.length > 0 ? `Fetched ${supParts.join(', ')}` : 'No remote supplements')\n\n // Create temporary .skilld/ symlinks (LLM needs these to read docs)\n linkAllReferences(outDir, packageName, packageDir, version, docsType, undefined, features)\n\n // Detect changelog + releases\n const cacheDir = getCacheDir(packageName, version)\n const hasChangelog = detectChangelog(packageDir, cacheDir)\n const hasReleases = existsSync(join(cacheDir, 'releases'))\n\n // Generate base SKILL.md\n writeGeneratedSkillMd(outDir, {\n name: packageName,\n version,\n description: opts.description,\n relatedSkills: [],\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: false,\n pkgFiles: [],\n dirName: sanitizedName,\n repoUrl: opts.repoUrl,\n features,\n eject: true,\n })\n p.log.success(`Created base skill: ${relative(packageDir, outDir)}`)\n\n // LLM enhancement (config resolved by caller)\n const skilldDir = join(outDir, '.skilld')\n try {\n const llmConfig = opts.llmConfig\n if (llmConfig?.promptOnly) {\n writePromptFiles({\n packageName,\n skillDir: outDir,\n version,\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: false,\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: outDir,\n dirName: sanitizedName,\n model: llmConfig.model,\n resolved: { repoUrl: opts.repoUrl },\n relatedSkills: [],\n hasIssues,\n hasDiscussions,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: false,\n pkgFiles: [],\n force: opts.force,\n debug: opts.debug,\n sections: llmConfig.sections,\n customPrompt: llmConfig.customPrompt,\n features,\n eject: true,\n })\n }\n\n ejectReferences(outDir, packageName, packageDir, version, docsType, features)\n }\n finally {\n // Always clean up .skilld/ symlinks, even if LLM enhancement fails\n if (existsSync(skilldDir))\n rmSync(skilldDir, { recursive: true, force: true })\n }\n\n // Only patch package.json when output is under skills/\n const relOut = relative(packageDir, outDir)\n if (relOut === 'skills' || relOut.startsWith('skills/'))\n patchPackageJsonFiles(packageDir)\n else if (opts.out)\n p.log.info('Output is outside skills/, skipping package.json patch. Add the path to \"files\" manually if publishing.')\n\n return outDir\n}\n\n// ── Main command ──\n\nasync function resolveLlmConfig(model?: OptimizeModel, yes?: boolean): Promise<LlmConfig | null | undefined> {\n const globalConfig = readConfig()\n if (globalConfig.skipLlm || (yes && !model))\n return undefined\n return selectLlmConfig(model, 'Generate skill sections')\n}\n\nasync function authorCommand(opts: {\n out?: string\n model?: OptimizeModel\n yes?: boolean\n force?: boolean\n debug?: boolean\n}): Promise<void> {\n const cwd = process.cwd()\n\n // Check for monorepo\n const monoPackages = detectMonorepoPackages(cwd)\n\n if (monoPackages && monoPackages.length > 0) {\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m author \\x1B[90m(monorepo: ${monoPackages.length} packages)\\x1B[0m`)\n\n if (opts.out) {\n p.log.error('--out is not supported in monorepo mode (each package gets its own skills/ directory)')\n return\n }\n\n const selected = guard(await p.multiselect({\n message: 'Which packages should ship skills?',\n options: monoPackages.map(pkg => ({\n label: pkg.name,\n value: pkg,\n hint: pkg.description,\n })),\n }))\n\n if (selected.length === 0)\n return\n\n // Resolve LLM config once for all packages\n const llmConfig = await resolveLlmConfig(opts.model, opts.yes)\n if (llmConfig === null) {\n p.cancel('Cancelled')\n return\n }\n\n // Resolve monorepo-level repoUrl for packages that lack their own\n const rootPkgResult = readPackageJsonSafe(join(cwd, 'package.json'))\n const rootPkg = rootPkgResult?.parsed as Record<string, any> | undefined\n const rootRepoUrl = typeof rootPkg?.repository === 'string'\n ? rootPkg.repository\n : rootPkg?.repository?.url?.replace(/^git\\+/, '').replace(/\\.git$/, '')\n\n const results: Array<{ name: string, outDir: string }> = []\n\n for (const pkg of selected) {\n p.log.step(`\\x1B[36m${pkg.name}\\x1B[0m@${pkg.version}`)\n const outDir = await authorSinglePackage({\n packageDir: pkg.dir,\n packageName: pkg.name,\n version: pkg.version,\n description: pkg.description,\n repoUrl: pkg.repoUrl || rootRepoUrl,\n monorepoRoot: cwd,\n llmConfig,\n force: opts.force,\n debug: opts.debug,\n })\n if (outDir)\n results.push({ name: pkg.name, outDir })\n }\n\n if (results.length > 0) {\n p.log.message('')\n for (const { name, outDir } of results)\n p.log.success(`${name} → ${relative(cwd, outDir)}`)\n\n printConsumerGuidance(results.map(r => r.name))\n }\n\n p.outro('Done')\n return\n }\n\n // Single package mode\n const pkgInfo = readLocalPackageInfo(cwd)\n if (!pkgInfo) {\n p.log.error('No package.json found in current directory')\n return\n }\n\n const { name: packageName, version, repoUrl } = pkgInfo\n\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m author \\x1B[36m${packageName}\\x1B[0m@${version}`)\n\n const llmConfig = await resolveLlmConfig(opts.model, opts.yes)\n if (llmConfig === null) {\n p.cancel('Cancelled')\n return\n }\n\n const outDir = await authorSinglePackage({\n packageDir: cwd,\n packageName,\n version,\n description: pkgInfo.description,\n repoUrl,\n out: opts.out,\n llmConfig,\n force: opts.force,\n debug: opts.debug,\n })\n\n if (outDir) {\n printConsumerGuidance([packageName])\n p.outro(`Authored skill to ${relative(cwd, outDir)}`)\n }\n}\n\nfunction printConsumerGuidance(packageNames: string[]): void {\n const names = packageNames.join(', ')\n p.log.info(\n `\\x1B[90mConsumers get ${packageNames.length > 1 ? 'these skills' : 'this skill'} automatically:\\x1B[0m\\n`\n + ` \\x1B[90m1. Install ${names} as a dependency\\x1B[0m\\n`\n + ` \\x1B[90m2. Run \\x1B[36mskilld prepare\\x1B[90m (or add to package.json: \\x1B[36m\"prepare\": \"skilld prepare\"\\x1B[90m)\\x1B[0m`,\n )\n}\n\nexport const authorCommandDef = defineCommand({\n meta: { name: 'package', description: 'Generate a package skill from documentation' },\n args: {\n out: {\n type: 'string',\n alias: 'o',\n description: 'Output directory (default: ./skills/<name>/)',\n },\n model: {\n type: 'string',\n alias: 'm',\n description: 'Enhancement model for SKILL.md generation',\n valueHint: 'id',\n },\n yes: {\n type: 'boolean',\n alias: 'y',\n description: 'Skip prompts, use defaults',\n default: false,\n },\n force: {\n type: 'boolean',\n alias: 'f',\n description: 'Clear cache and regenerate',\n default: false,\n },\n debug: {\n type: 'boolean',\n description: 'Save raw enhancement output to logs/',\n default: false,\n },\n },\n async run({ args }) {\n await authorCommand({\n out: args.out,\n model: args.model as OptimizeModel | undefined,\n yes: args.yes,\n force: args.force,\n debug: args.debug,\n })\n },\n})\n"],"mappings":"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"}
@@ -16,6 +16,16 @@ function safeSymlink(target, linkPath) {
16
16
  function isCached(name, version) {
17
17
  return existsSync(getCacheDir(name, version));
18
18
  }
19
+ function isReadmeOnlyCache(cacheDir) {
20
+ const docsDir = join(cacheDir, "docs");
21
+ if (!existsSync(docsDir)) return false;
22
+ const files = readdirSync(docsDir);
23
+ return files.length === 1 && files[0] === "README.md";
24
+ }
25
+ function inferDocsTypeFromCache(cacheDir, source) {
26
+ if (source?.includes("llms.txt") || existsSync(join(cacheDir, "docs", "llms.txt"))) return "llms.txt";
27
+ return isReadmeOnlyCache(cacheDir) ? "readme" : "docs";
28
+ }
19
29
  function ensureCacheDir() {
20
30
  mkdirSync(REFERENCES_DIR, {
21
31
  recursive: true,
@@ -203,6 +213,6 @@ function listReferenceFiles(skillDir, maxDepth = 3) {
203
213
  walk(referencesDir, 0);
204
214
  return files;
205
215
  }
206
- export { writeToRepoCache as _, hasShippedDocs as a, linkPkg as c, listCached as d, listReferenceFiles as f, writeToCache as g, writeSections as h, getPkgKeyFiles as i, linkPkgNamed as l, readCachedSection as m, clearCache as n, isCached as o, readCachedDocs as p, ensureCacheDir as r, linkCachedDir as s, clearAllCache as t, linkRepoCachedDir as u };
216
+ export { writeSections as _, hasShippedDocs as a, isReadmeOnlyCache as c, linkPkgNamed as d, linkRepoCachedDir as f, readCachedSection as g, readCachedDocs as h, getPkgKeyFiles as i, linkCachedDir as l, listReferenceFiles as m, clearCache as n, inferDocsTypeFromCache as o, listCached as p, ensureCacheDir as r, isCached as s, clearAllCache as t, linkPkg as u, writeToCache as v, writeToRepoCache as y };
207
217
 
208
218
  //# sourceMappingURL=cache.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.mjs","names":[],"sources":["../../src/cache/storage.ts"],"sourcesContent":["/**\n * Cache storage operations\n */\n\nimport type { CachedDoc, CachedPackage } from './types.ts'\nimport { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs'\nimport { basename, join, resolve } from 'pathe'\nimport { readPackageJsonSafe } from '../core/package-json.ts'\nimport { resolvePkgDir } from '../core/prepare.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport { getRepoCacheDir, REFERENCES_DIR, REPOS_DIR } from './config.ts'\nimport { getCacheDir } from './version.ts'\n\n/** Safely create a symlink, validating target is under REFERENCES_DIR or REPOS_DIR */\nfunction safeSymlink(target: string, linkPath: string): void {\n const resolved = resolve(target)\n if (!resolved.startsWith(REFERENCES_DIR) && !resolved.startsWith(REPOS_DIR))\n throw new Error(`Symlink target outside allowed dirs: ${resolved}`)\n // Remove pre-existing symlink (check with lstat to detect symlinks)\n try {\n const stat = lstatSync(linkPath)\n if (stat.isSymbolicLink() || stat.isFile())\n unlinkSync(linkPath)\n }\n catch {}\n symlinkSync(target, linkPath, 'junction')\n}\n\n/**\n * Check if package is cached at given version\n */\nexport function isCached(name: string, version: string): boolean {\n return existsSync(getCacheDir(name, version))\n}\n\n/**\n * Ensure cache directories exist\n */\nexport function ensureCacheDir(): void {\n mkdirSync(REFERENCES_DIR, { recursive: true, mode: 0o700 })\n mkdirSync(REPOS_DIR, { recursive: true, mode: 0o700 })\n}\n\n/**\n * Write docs to cache\n */\nexport function writeToCache(\n name: string,\n version: string,\n docs: CachedDoc[],\n): string {\n const cacheDir = getCacheDir(name, version)\n mkdirSync(cacheDir, { recursive: true, mode: 0o700 })\n\n for (const doc of docs) {\n const filePath = join(cacheDir, doc.path)\n mkdirSync(join(filePath, '..'), { recursive: true, mode: 0o700 })\n writeFileSync(filePath, sanitizeMarkdown(doc.content), { mode: 0o600 })\n }\n\n return cacheDir\n}\n\n/**\n * Write docs to repo-level cache (~/.skilld/repos/<owner>/<repo>/)\n */\nexport function writeToRepoCache(\n owner: string,\n repo: string,\n docs: CachedDoc[],\n): string {\n const repoDir = getRepoCacheDir(owner, repo)\n mkdirSync(repoDir, { recursive: true, mode: 0o700 })\n\n for (const doc of docs) {\n const filePath = join(repoDir, doc.path)\n mkdirSync(join(filePath, '..'), { recursive: true, mode: 0o700 })\n writeFileSync(filePath, sanitizeMarkdown(doc.content), { mode: 0o600 })\n }\n\n return repoDir\n}\n\n/**\n * Create symlink from .skilld dir to a repo-level cached subdirectory.\n * .claude/skills/<skill>/.skilld/<subdir> -> ~/.skilld/repos/<owner>/<repo>/<subdir>\n */\nexport function linkRepoCachedDir(skillDir: string, owner: string, repo: string, subdir: string): void {\n const repoDir = getRepoCacheDir(owner, repo)\n const referencesDir = join(skillDir, '.skilld')\n const linkPath = join(referencesDir, subdir)\n const cachedPath = join(repoDir, subdir)\n\n mkdirSync(referencesDir, { recursive: true })\n\n if (existsSync(cachedPath)) {\n safeSymlink(cachedPath, linkPath)\n }\n}\n\n/**\n * Create symlink from .skilld dir to a cached subdirectory.\n * Unified handler for docs, issues, discussions, sections, releases.\n *\n * Structure:\n * .claude/skills/<skill>/.skilld/<subdir> -> ~/.skilld/references/<pkg>@<version>/<subdir>\n *\n * The .skilld/ dirs are gitignored. After clone, `skilld install` recreates from lockfile.\n */\nexport function linkCachedDir(skillDir: string, name: string, version: string, subdir: string): void {\n const cacheDir = getCacheDir(name, version)\n const referencesDir = join(skillDir, '.skilld')\n const linkPath = join(referencesDir, subdir)\n const cachedPath = join(cacheDir, subdir)\n\n mkdirSync(referencesDir, { recursive: true })\n\n if (existsSync(cachedPath)) {\n safeSymlink(cachedPath, linkPath)\n }\n}\n\n/**\n * Resolve the package directory: node_modules first, then cached dist fallback.\n * Returns the path if found, null otherwise.\n */\nexport { resolvePkgDir } from '../core/prepare.ts'\nexport { getShippedSkills, linkShippedSkill } from '../core/prepare.ts'\nexport type { ShippedSkill } from '../core/prepare.ts'\n\n/**\n * Create symlink from .skilld dir to package directory\n *\n * Structure:\n * .claude/skills/<skill>/.skilld/pkg -> node_modules/<pkg> OR ~/.skilld/references/<pkg>@<version>/pkg\n *\n * This gives access to package.json, README.md, dist/, and any shipped docs/\n */\nexport function linkPkg(skillDir: string, name: string, cwd: string, version?: string): void {\n const pkgPath = resolvePkgDir(name, cwd, version)\n if (!pkgPath)\n return\n\n const referencesDir = join(skillDir, '.skilld')\n mkdirSync(referencesDir, { recursive: true })\n\n const pkgLinkPath = join(referencesDir, 'pkg')\n try {\n lstatSync(pkgLinkPath)\n unlinkSync(pkgLinkPath)\n }\n catch {}\n symlinkSync(pkgPath, pkgLinkPath, 'junction')\n}\n\n/**\n * Create named symlink from .skilld dir to package directory.\n * Short name = last segment of package name (e.g., @vue/reactivity → pkg-reactivity)\n *\n * Structure:\n * .claude/skills/<skill>/.skilld/pkg-<short> -> node_modules/<pkg>\n */\nexport function linkPkgNamed(skillDir: string, name: string, cwd: string, version?: string): void {\n const pkgPath = resolvePkgDir(name, cwd, version)\n if (!pkgPath)\n return\n\n const shortName = name.split('/').pop()!.toLowerCase()\n const referencesDir = join(skillDir, '.skilld')\n mkdirSync(referencesDir, { recursive: true })\n\n const linkPath = join(referencesDir, `pkg-${shortName}`)\n try {\n lstatSync(linkPath)\n unlinkSync(linkPath)\n }\n catch {}\n symlinkSync(pkgPath, linkPath, 'junction')\n}\n\n/**\n * Get key files from a package directory for display\n * Returns entry points + docs files\n */\nexport function getPkgKeyFiles(name: string, cwd: string, version?: string): string[] {\n const pkgPath = resolvePkgDir(name, cwd, version)\n if (!pkgPath)\n return []\n\n const files: string[] = []\n const pkgJsonPath = join(pkgPath, 'package.json')\n\n const pkgJsonResult = readPackageJsonSafe(pkgJsonPath)\n if (pkgJsonResult) {\n const pkg = pkgJsonResult.parsed as Record<string, any>\n\n // Entry points\n if (pkg.main)\n files.push(basename(pkg.main))\n if (pkg.module && pkg.module !== pkg.main)\n files.push(basename(pkg.module))\n\n // Type definitions (relative path preserved for LLM tool hints)\n const typesPath = pkg.types || pkg.typings\n if (typesPath && existsSync(join(pkgPath, typesPath)))\n files.push(typesPath)\n }\n\n // Check for common doc files (case-insensitive readme match)\n const entries = readdirSync(pkgPath).filter(f =>\n /^readme\\.md$/i.test(f) || /^changelog\\.md$/i.test(f),\n )\n files.push(...entries)\n\n return [...new Set(files)]\n}\n\n/**\n * Write LLM-generated section outputs to global cache for cross-project reuse\n *\n * Structure:\n * ~/.skilld/references/<pkg>@<version>/sections/_BEST_PRACTICES.md\n */\nexport function writeSections(name: string, version: string, sections: Array<{ file: string, content: string }>): void {\n const cacheDir = getCacheDir(name, version)\n const sectionsDir = join(cacheDir, 'sections')\n mkdirSync(sectionsDir, { recursive: true, mode: 0o700 })\n for (const { file, content } of sections) {\n writeFileSync(join(sectionsDir, file), content, { mode: 0o600 })\n }\n}\n\n/**\n * Read a cached section from the global references dir\n */\nexport function readCachedSection(name: string, version: string, file: string): string | null {\n const path = join(getCacheDir(name, version), 'sections', file)\n if (!existsSync(path))\n return null\n return readFileSync(path, 'utf-8')\n}\n\nexport function hasShippedDocs(name: string, cwd: string, version?: string): boolean {\n const pkgPath = resolvePkgDir(name, cwd, version)\n if (!pkgPath)\n return false\n\n const docsCandidates = ['docs', 'documentation', 'doc']\n for (const candidate of docsCandidates) {\n const docsPath = join(pkgPath, candidate)\n if (existsSync(docsPath))\n return true\n }\n return false\n}\n\n/**\n * List all cached packages\n */\nexport function listCached(): CachedPackage[] {\n if (!existsSync(REFERENCES_DIR))\n return []\n\n return readdirSync(REFERENCES_DIR)\n .filter(name => name.includes('@'))\n .map((dir) => {\n const atIdx = dir.lastIndexOf('@')\n return { name: dir.slice(0, atIdx), version: dir.slice(atIdx + 1), dir: join(REFERENCES_DIR, dir) }\n })\n}\n\n/**\n * Read cached docs for a package\n */\nexport function readCachedDocs(name: string, version: string): CachedDoc[] {\n const cacheDir = getCacheDir(name, version)\n if (!existsSync(cacheDir))\n return []\n\n const docs: CachedDoc[] = []\n\n function walk(dir: string, prefix = '') {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const entryPath = join(dir, entry.name)\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name\n\n if (entry.isDirectory()) {\n walk(entryPath, relativePath)\n }\n else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) {\n docs.push({\n path: relativePath,\n content: readFileSync(entryPath, 'utf-8'),\n })\n }\n }\n }\n\n walk(cacheDir)\n return docs\n}\n\n/**\n * Clear cache for a specific package\n */\nexport function clearCache(name: string, version: string): boolean {\n const cacheDir = getCacheDir(name, version)\n if (!existsSync(cacheDir))\n return false\n\n rmSync(cacheDir, { recursive: true })\n return true\n}\n\n/**\n * Clear all cache\n */\nexport function clearAllCache(): number {\n const packages = listCached()\n for (const pkg of packages) {\n clearCache(pkg.name, pkg.version)\n }\n // Also clear repo-level cache\n if (existsSync(REPOS_DIR))\n rmSync(REPOS_DIR, { recursive: true })\n return packages.length\n}\n\n/**\n * List files in .skilld directory (pkg + docs) as relative paths for prompt context\n * Returns paths like ./.skilld/pkg/README.md, ./.skilld/docs/api.md\n */\nexport function listReferenceFiles(skillDir: string, maxDepth = 3): string[] {\n const referencesDir = join(skillDir, '.skilld')\n if (!existsSync(referencesDir))\n return []\n\n const files: string[] = []\n\n function walk(dir: string, depth: number) {\n if (depth > maxDepth)\n return\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name)\n if (entry.isDirectory() || entry.isSymbolicLink()) {\n try {\n const stat = statSync(full)\n if (stat.isDirectory()) {\n walk(full, depth + 1)\n continue\n }\n }\n catch { continue }\n }\n if (entry.name.endsWith('.md')) {\n files.push(full)\n }\n }\n }\n catch {\n // Broken symlink or permission error\n }\n }\n\n walk(referencesDir, 0)\n return files\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cache.mjs","names":[],"sources":["../../src/cache/storage.ts"],"sourcesContent":["/**\n * Cache storage operations\n */\n\nimport type { CachedDoc, CachedPackage } from './types.ts'\nimport { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs'\nimport { basename, join, resolve } from 'pathe'\nimport { readPackageJsonSafe } from '../core/package-json.ts'\nimport { resolvePkgDir } from '../core/prepare.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport { getRepoCacheDir, REFERENCES_DIR, REPOS_DIR } from './config.ts'\nimport { getCacheDir } from './version.ts'\n\n/** Safely create a symlink, validating target is under REFERENCES_DIR or REPOS_DIR */\nfunction safeSymlink(target: string, linkPath: string): void {\n const resolved = resolve(target)\n if (!resolved.startsWith(REFERENCES_DIR) && !resolved.startsWith(REPOS_DIR))\n throw new Error(`Symlink target outside allowed dirs: ${resolved}`)\n // Remove pre-existing symlink (check with lstat to detect symlinks)\n try {\n const stat = lstatSync(linkPath)\n if (stat.isSymbolicLink() || stat.isFile())\n unlinkSync(linkPath)\n }\n catch {}\n symlinkSync(target, linkPath, 'junction')\n}\n\n/**\n * Check if package is cached at given version\n */\nexport function isCached(name: string, version: string): boolean {\n return existsSync(getCacheDir(name, version))\n}\n\n/** Check if cache only has docs/README.md (pkg/ already has this) */\nexport function isReadmeOnlyCache(cacheDir: string): boolean {\n const docsDir = join(cacheDir, 'docs')\n if (!existsSync(docsDir))\n return false\n const files = readdirSync(docsDir)\n return files.length === 1 && files[0] === 'README.md'\n}\n\nexport function inferDocsTypeFromCache(cacheDir: string, source?: string): 'llms.txt' | 'readme' | 'docs' {\n if (source?.includes('llms.txt') || existsSync(join(cacheDir, 'docs', 'llms.txt')))\n return 'llms.txt'\n return isReadmeOnlyCache(cacheDir) ? 'readme' : 'docs'\n}\n\n/**\n * Ensure cache directories exist\n */\nexport function ensureCacheDir(): void {\n mkdirSync(REFERENCES_DIR, { recursive: true, mode: 0o700 })\n mkdirSync(REPOS_DIR, { recursive: true, mode: 0o700 })\n}\n\n/**\n * Write docs to cache\n */\nexport function writeToCache(\n name: string,\n version: string,\n docs: CachedDoc[],\n): string {\n const cacheDir = getCacheDir(name, version)\n mkdirSync(cacheDir, { recursive: true, mode: 0o700 })\n\n for (const doc of docs) {\n const filePath = join(cacheDir, doc.path)\n mkdirSync(join(filePath, '..'), { recursive: true, mode: 0o700 })\n writeFileSync(filePath, sanitizeMarkdown(doc.content), { mode: 0o600 })\n }\n\n return cacheDir\n}\n\n/**\n * Write docs to repo-level cache (~/.skilld/repos/<owner>/<repo>/)\n */\nexport function writeToRepoCache(\n owner: string,\n repo: string,\n docs: CachedDoc[],\n): string {\n const repoDir = getRepoCacheDir(owner, repo)\n mkdirSync(repoDir, { recursive: true, mode: 0o700 })\n\n for (const doc of docs) {\n const filePath = join(repoDir, doc.path)\n mkdirSync(join(filePath, '..'), { recursive: true, mode: 0o700 })\n writeFileSync(filePath, sanitizeMarkdown(doc.content), { mode: 0o600 })\n }\n\n return repoDir\n}\n\n/**\n * Create symlink from .skilld dir to a repo-level cached subdirectory.\n * .claude/skills/<skill>/.skilld/<subdir> -> ~/.skilld/repos/<owner>/<repo>/<subdir>\n */\nexport function linkRepoCachedDir(skillDir: string, owner: string, repo: string, subdir: string): void {\n const repoDir = getRepoCacheDir(owner, repo)\n const referencesDir = join(skillDir, '.skilld')\n const linkPath = join(referencesDir, subdir)\n const cachedPath = join(repoDir, subdir)\n\n mkdirSync(referencesDir, { recursive: true })\n\n if (existsSync(cachedPath)) {\n safeSymlink(cachedPath, linkPath)\n }\n}\n\n/**\n * Create symlink from .skilld dir to a cached subdirectory.\n * Unified handler for docs, issues, discussions, sections, releases.\n *\n * Structure:\n * .claude/skills/<skill>/.skilld/<subdir> -> ~/.skilld/references/<pkg>@<version>/<subdir>\n *\n * The .skilld/ dirs are gitignored. After clone, `skilld install` recreates from lockfile.\n */\nexport function linkCachedDir(skillDir: string, name: string, version: string, subdir: string): void {\n const cacheDir = getCacheDir(name, version)\n const referencesDir = join(skillDir, '.skilld')\n const linkPath = join(referencesDir, subdir)\n const cachedPath = join(cacheDir, subdir)\n\n mkdirSync(referencesDir, { recursive: true })\n\n if (existsSync(cachedPath)) {\n safeSymlink(cachedPath, linkPath)\n }\n}\n\n/**\n * Resolve the package directory: node_modules first, then cached dist fallback.\n * Returns the path if found, null otherwise.\n */\nexport { resolvePkgDir } from '../core/prepare.ts'\nexport { getShippedSkills, linkShippedSkill } from '../core/prepare.ts'\nexport type { ShippedSkill } from '../core/prepare.ts'\n\n/**\n * Create symlink from .skilld dir to package directory\n *\n * Structure:\n * .claude/skills/<skill>/.skilld/pkg -> node_modules/<pkg> OR ~/.skilld/references/<pkg>@<version>/pkg\n *\n * This gives access to package.json, README.md, dist/, and any shipped docs/\n */\nexport function linkPkg(skillDir: string, name: string, cwd: string, version?: string): void {\n const pkgPath = resolvePkgDir(name, cwd, version)\n if (!pkgPath)\n return\n\n const referencesDir = join(skillDir, '.skilld')\n mkdirSync(referencesDir, { recursive: true })\n\n const pkgLinkPath = join(referencesDir, 'pkg')\n try {\n lstatSync(pkgLinkPath)\n unlinkSync(pkgLinkPath)\n }\n catch {}\n symlinkSync(pkgPath, pkgLinkPath, 'junction')\n}\n\n/**\n * Create named symlink from .skilld dir to package directory.\n * Short name = last segment of package name (e.g., @vue/reactivity → pkg-reactivity)\n *\n * Structure:\n * .claude/skills/<skill>/.skilld/pkg-<short> -> node_modules/<pkg>\n */\nexport function linkPkgNamed(skillDir: string, name: string, cwd: string, version?: string): void {\n const pkgPath = resolvePkgDir(name, cwd, version)\n if (!pkgPath)\n return\n\n const shortName = name.split('/').pop()!.toLowerCase()\n const referencesDir = join(skillDir, '.skilld')\n mkdirSync(referencesDir, { recursive: true })\n\n const linkPath = join(referencesDir, `pkg-${shortName}`)\n try {\n lstatSync(linkPath)\n unlinkSync(linkPath)\n }\n catch {}\n symlinkSync(pkgPath, linkPath, 'junction')\n}\n\n/**\n * Get key files from a package directory for display\n * Returns entry points + docs files\n */\nexport function getPkgKeyFiles(name: string, cwd: string, version?: string): string[] {\n const pkgPath = resolvePkgDir(name, cwd, version)\n if (!pkgPath)\n return []\n\n const files: string[] = []\n const pkgJsonPath = join(pkgPath, 'package.json')\n\n const pkgJsonResult = readPackageJsonSafe(pkgJsonPath)\n if (pkgJsonResult) {\n const pkg = pkgJsonResult.parsed as Record<string, any>\n\n // Entry points\n if (pkg.main)\n files.push(basename(pkg.main))\n if (pkg.module && pkg.module !== pkg.main)\n files.push(basename(pkg.module))\n\n // Type definitions (relative path preserved for LLM tool hints)\n const typesPath = pkg.types || pkg.typings\n if (typesPath && existsSync(join(pkgPath, typesPath)))\n files.push(typesPath)\n }\n\n // Check for common doc files (case-insensitive readme match)\n const entries = readdirSync(pkgPath).filter(f =>\n /^readme\\.md$/i.test(f) || /^changelog\\.md$/i.test(f),\n )\n files.push(...entries)\n\n return [...new Set(files)]\n}\n\n/**\n * Write LLM-generated section outputs to global cache for cross-project reuse\n *\n * Structure:\n * ~/.skilld/references/<pkg>@<version>/sections/_BEST_PRACTICES.md\n */\nexport function writeSections(name: string, version: string, sections: Array<{ file: string, content: string }>): void {\n const cacheDir = getCacheDir(name, version)\n const sectionsDir = join(cacheDir, 'sections')\n mkdirSync(sectionsDir, { recursive: true, mode: 0o700 })\n for (const { file, content } of sections) {\n writeFileSync(join(sectionsDir, file), content, { mode: 0o600 })\n }\n}\n\n/**\n * Read a cached section from the global references dir\n */\nexport function readCachedSection(name: string, version: string, file: string): string | null {\n const path = join(getCacheDir(name, version), 'sections', file)\n if (!existsSync(path))\n return null\n return readFileSync(path, 'utf-8')\n}\n\nexport function hasShippedDocs(name: string, cwd: string, version?: string): boolean {\n const pkgPath = resolvePkgDir(name, cwd, version)\n if (!pkgPath)\n return false\n\n const docsCandidates = ['docs', 'documentation', 'doc']\n for (const candidate of docsCandidates) {\n const docsPath = join(pkgPath, candidate)\n if (existsSync(docsPath))\n return true\n }\n return false\n}\n\n/**\n * List all cached packages\n */\nexport function listCached(): CachedPackage[] {\n if (!existsSync(REFERENCES_DIR))\n return []\n\n return readdirSync(REFERENCES_DIR)\n .filter(name => name.includes('@'))\n .map((dir) => {\n const atIdx = dir.lastIndexOf('@')\n return { name: dir.slice(0, atIdx), version: dir.slice(atIdx + 1), dir: join(REFERENCES_DIR, dir) }\n })\n}\n\n/**\n * Read cached docs for a package\n */\nexport function readCachedDocs(name: string, version: string): CachedDoc[] {\n const cacheDir = getCacheDir(name, version)\n if (!existsSync(cacheDir))\n return []\n\n const docs: CachedDoc[] = []\n\n function walk(dir: string, prefix = '') {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const entryPath = join(dir, entry.name)\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name\n\n if (entry.isDirectory()) {\n walk(entryPath, relativePath)\n }\n else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) {\n docs.push({\n path: relativePath,\n content: readFileSync(entryPath, 'utf-8'),\n })\n }\n }\n }\n\n walk(cacheDir)\n return docs\n}\n\n/**\n * Clear cache for a specific package\n */\nexport function clearCache(name: string, version: string): boolean {\n const cacheDir = getCacheDir(name, version)\n if (!existsSync(cacheDir))\n return false\n\n rmSync(cacheDir, { recursive: true })\n return true\n}\n\n/**\n * Clear all cache\n */\nexport function clearAllCache(): number {\n const packages = listCached()\n for (const pkg of packages) {\n clearCache(pkg.name, pkg.version)\n }\n // Also clear repo-level cache\n if (existsSync(REPOS_DIR))\n rmSync(REPOS_DIR, { recursive: true })\n return packages.length\n}\n\n/**\n * List files in .skilld directory (pkg + docs) as relative paths for prompt context\n * Returns paths like ./.skilld/pkg/README.md, ./.skilld/docs/api.md\n */\nexport function listReferenceFiles(skillDir: string, maxDepth = 3): string[] {\n const referencesDir = join(skillDir, '.skilld')\n if (!existsSync(referencesDir))\n return []\n\n const files: string[] = []\n\n function walk(dir: string, depth: number) {\n if (depth > maxDepth)\n return\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name)\n if (entry.isDirectory() || entry.isSymbolicLink()) {\n try {\n const stat = statSync(full)\n if (stat.isDirectory()) {\n walk(full, depth + 1)\n continue\n }\n }\n catch { continue }\n }\n if (entry.name.endsWith('.md')) {\n files.push(full)\n }\n }\n }\n catch {\n // Broken symlink or permission error\n }\n }\n\n walk(referencesDir, 0)\n return files\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
+ import { o as getModelName } from "./agent.mjs";
1
2
  import { i as readPackageJsonSafe, n as editJsonProperty, r as patchPackageJson } from "./package-json.mjs";
2
3
  import { a as targets, i as getAgentVersion, n as detectProjectAgents, r as detectTargetAgent, t as detectInstalledAgents } from "./detect.mjs";
3
- import { o as getModelName } from "./agent.mjs";
4
4
  import { a as readConfig, c as updateConfig } from "./config.mjs";
5
5
  import { join } from "pathe";
6
6
  import { readFileSync } from "node:fs";
@@ -3,8 +3,8 @@ import "./sanitize.mjs";
3
3
  import "./yaml.mjs";
4
4
  import "./markdown.mjs";
5
5
  import "./shared.mjs";
6
+ import "./skill.mjs";
6
7
  import "./config.mjs";
7
8
  import "./lockfile.mjs";
8
9
  import "./skills.mjs";
9
- import "./formatting.mjs";
10
10
  export {};
@@ -43,6 +43,9 @@ declare function linkShippedSkill(baseDir: string, skillName: string, targetDir:
43
43
  * Check if package is cached at given version
44
44
  */
45
45
  declare function isCached(name: string, version: string): boolean;
46
+ /** Check if cache only has docs/README.md (pkg/ already has this) */
47
+ declare function isReadmeOnlyCache(cacheDir: string): boolean;
48
+ declare function inferDocsTypeFromCache(cacheDir: string, source?: string): 'llms.txt' | 'readme' | 'docs';
46
49
  /**
47
50
  * Ensure cache directories exist
48
51
  */
@@ -144,5 +147,5 @@ declare function getCacheKey(name: string, version: string): string;
144
147
  * Validates name/version to prevent path traversal.
145
148
  */
146
149
  declare function getCacheDir(name: string, version: string): string;
147
- export { REPOS_DIR as A, linkShippedSkill as C, CachedPackage as D, CachedDoc as E, getRepoCacheDir as M, CACHE_DIR as O, getShippedSkills as S, CacheConfig as T, readCachedSection as _, clearCache as a, writeToRepoCache as b, hasShippedDocs as c, linkPkg as d, linkPkgNamed as f, readCachedDocs as g, listReferenceFiles as h, clearAllCache as i, getPackageDbPath as j, REFERENCES_DIR as k, isCached as l, listCached as m, getCacheKey as n, ensureCacheDir as o, linkRepoCachedDir as p, getVersionKey as r, getPkgKeyFiles as s, getCacheDir as t, linkCachedDir as u, writeSections as v, resolvePkgDir as w, ShippedSkill as x, writeToCache as y };
150
+ export { CACHE_DIR as A, ShippedSkill as C, CacheConfig as D, resolvePkgDir as E, REPOS_DIR as M, getPackageDbPath as N, CachedDoc as O, getRepoCacheDir as P, writeToRepoCache as S, linkShippedSkill as T, listReferenceFiles as _, clearCache as a, writeSections as b, hasShippedDocs as c, isReadmeOnlyCache as d, linkCachedDir as f, listCached as g, linkRepoCachedDir as h, clearAllCache as i, REFERENCES_DIR as j, CachedPackage as k, inferDocsTypeFromCache as l, linkPkgNamed as m, getCacheKey as n, ensureCacheDir as o, linkPkg as p, getVersionKey as r, getPkgKeyFiles as s, getCacheDir as t, isCached as u, readCachedDocs as v, getShippedSkills as w, writeToCache as x, readCachedSection as y };
148
151
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/cache/config.ts","../../src/cache/types.ts","../../src/core/prepare.ts","../../src/cache/storage.ts","../../src/cache/version.ts"],"mappings":"AAQA;;;;cAAa,SAAA;AAGb;AAAA,cAAa,cAAA;;cAGA,SAAA;;iBAGG,eAAA,CAAgB,KAAA,UAAe,IAAA;;iBAO/B,gBAAA,CAAiB,IAAA,UAAc,OAAA;AAhB/C;;;AAAA,UCJiB,WAAA;EDIkC;ECFjD,IAAA;EDKyD;ECHzD,OAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,OAAA;EACA,GAAA;AAAA;AAAA,UAGe,SAAA;EACf,IAAA;EACA,OAAA;AAAA;;iBCEc,aAAA,CAAc,IAAA,UAAc,GAAA,UAAa,OAAA;AAAA,UAiDxC,YAAA;EACf,SAAA;EACA,QAAA;AAAA;;iBAIc,gBAAA,CAAiB,IAAA,UAAc,GAAA,UAAa,OAAA,YAAmB,YAAA;;iBAe/D,gBAAA,CAAiB,OAAA,UAAiB,SAAA,UAAmB,SAAA;;AFhFrE;;iBGoBgB,QAAA,CAAS,IAAA,UAAc,OAAA;;;AHjBvC;iBGwBgB,cAAA,CAAA;;;;iBAQA,YAAA,CACd,IAAA,UACA,OAAA,UACA,IAAA,EAAM,SAAA;;;;iBAiBQ,gBAAA,CACd,KAAA,UACA,IAAA,UACA,IAAA,EAAM,SAAA;AH7CR;;;;AAAA,iBG+DgB,iBAAA,CAAkB,QAAA,UAAkB,KAAA,UAAe,IAAA,UAAc,MAAA;;AFnFjF;;;;;AAOA;;;iBEkGgB,aAAA,CAAc,QAAA,UAAkB,IAAA,UAAc,OAAA,UAAiB,MAAA;;;;;ADxF/E;;;;iBCqHgB,OAAA,CAAQ,QAAA,UAAkB,IAAA,UAAc,GAAA,UAAa,OAAA;;;;;ADpErE;;;iBC4FgB,YAAA,CAAa,QAAA,UAAkB,IAAA,UAAc,GAAA,UAAa,OAAA;;ADtF1E;;;iBC4GgB,cAAA,CAAe,IAAA,UAAc,GAAA,UAAa,OAAA;;;;;;;iBAuC1C,aAAA,CAAc,IAAA,UAAc,OAAA,UAAiB,QAAA,EAAU,KAAA;EAAQ,IAAA;EAAc,OAAA;AAAA;;;;iBAY7E,iBAAA,CAAkB,IAAA,UAAc,OAAA,UAAiB,IAAA;AAAA,iBAOjD,cAAA,CAAe,IAAA,UAAc,GAAA,UAAa,OAAA;;AAnN1D;;iBAoOgB,UAAA,CAAA,GAAc,aAAA;;;AA7N9B;iBA4OgB,cAAA,CAAe,IAAA,UAAc,OAAA,WAAkB,SAAA;;;;iBA+B/C,UAAA,CAAW,IAAA,UAAc,OAAA;;;;iBAYzB,aAAA,CAAA;;;;;iBAeA,kBAAA,CAAmB,QAAA,UAAkB,QAAA;AHpUrD;;;;;AAGA;iBIKgB,aAAA,CAAc,OAAA;;;;iBAOd,WAAA,CAAY,IAAA,UAAc,OAAA;;;;;iBAQ1B,WAAA,CAAY,IAAA,UAAc,OAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/cache/config.ts","../../src/cache/types.ts","../../src/core/prepare.ts","../../src/cache/storage.ts","../../src/cache/version.ts"],"mappings":"AAQA;;;;cAAa,SAAA;AAGb;AAAA,cAAa,cAAA;;cAGA,SAAA;;iBAGG,eAAA,CAAgB,KAAA,UAAe,IAAA;;iBAO/B,gBAAA,CAAiB,IAAA,UAAc,OAAA;AAhB/C;;;AAAA,UCJiB,WAAA;EDIkC;ECFjD,IAAA;EDKyD;ECHzD,OAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,OAAA;EACA,GAAA;AAAA;AAAA,UAGe,SAAA;EACf,IAAA;EACA,OAAA;AAAA;;iBCEc,aAAA,CAAc,IAAA,UAAc,GAAA,UAAa,OAAA;AAAA,UAiDxC,YAAA;EACf,SAAA;EACA,QAAA;AAAA;;iBAIc,gBAAA,CAAiB,IAAA,UAAc,GAAA,UAAa,OAAA,YAAmB,YAAA;;iBAe/D,gBAAA,CAAiB,OAAA,UAAiB,SAAA,UAAmB,SAAA;;AFhFrE;;iBGoBgB,QAAA,CAAS,IAAA,UAAc,OAAA;;iBAKvB,iBAAA,CAAkB,QAAA;AAAA,iBAQlB,sBAAA,CAAuB,QAAA,UAAkB,MAAA;;;;iBASzC,cAAA,CAAA;AHpChB;;;AAAA,iBG4CgB,YAAA,CACd,IAAA,UACA,OAAA,UACA,IAAA,EAAM,SAAA;;AHxCR;;iBGyDgB,gBAAA,CACd,KAAA,UACA,IAAA,UACA,IAAA,EAAM,SAAA;;;;AFhFR;iBEkGgB,iBAAA,CAAkB,QAAA,UAAkB,KAAA,UAAe,IAAA,UAAc,MAAA;;;;AF3FjF;;;;;;iBEiHgB,aAAA,CAAc,QAAA,UAAkB,IAAA,UAAc,OAAA,UAAiB,MAAA;;ADvG/E;;;;;;;iBCoIgB,OAAA,CAAQ,QAAA,UAAkB,IAAA,UAAc,GAAA,UAAa,OAAA;;ADnFrE;;;;;AAMA;iBCqGgB,YAAA,CAAa,QAAA,UAAkB,IAAA,UAAc,GAAA,UAAa,OAAA;;;;;iBAsB1D,cAAA,CAAe,IAAA,UAAc,GAAA,UAAa,OAAA;;;;AD5G1D;;;iBCmJgB,aAAA,CAAc,IAAA,UAAc,OAAA,UAAiB,QAAA,EAAU,KAAA;EAAQ,IAAA;EAAc,OAAA;AAAA;;;;iBAY7E,iBAAA,CAAkB,IAAA,UAAc,OAAA,UAAiB,IAAA;AAAA,iBAOjD,cAAA,CAAe,IAAA,UAAc,GAAA,UAAa,OAAA;;;;iBAiB1C,UAAA,CAAA,GAAc,aAAA;;;;iBAed,cAAA,CAAe,IAAA,UAAc,OAAA,WAAkB,SAAA;AArP/D;;;AAAA,iBAoRgB,UAAA,CAAW,IAAA,UAAc,OAAA;;AA3QzC;;iBAuRgB,aAAA,CAAA;;;AA/QhB;;iBA8RgB,kBAAA,CAAmB,QAAA,UAAkB,QAAA;AHnVrD;;;;;AAGA;iBIKgB,aAAA,CAAc,OAAA;;;;iBAOd,WAAA,CAAY,IAAA,UAAc,OAAA;;;;;iBAQ1B,WAAA,CAAY,IAAA,UAAc,OAAA"}
@@ -567,6 +567,8 @@ declare function parseGitHubUrl(url: string): {
567
567
  owner: string;
568
568
  repo: string;
569
569
  } | null;
570
+ /** Parse owner/repo slug from GitHub URL */
571
+ declare function parseGitHubRepoSlug(url: string | undefined): string | undefined;
570
572
  /**
571
573
  * Normalize git repo URL to https
572
574
  */
@@ -583,5 +585,5 @@ declare function parsePackageSpec(spec: string): {
583
585
  * Extract branch hint from URL fragment (e.g. "git+https://...#main" → "main")
584
586
  */
585
587
  declare function extractBranchHint(url: string): string | undefined;
586
- export { formatIssueAsMarkdown as $, ResolveOptions as A, LocalDependency as At, resolveInstalledVersion as B, getDocOverride as C, generateDiscussionIndex as Ct, getRepoEntry as D, FetchedDoc as Dt, getRelatedPackages as E, resolveCrateDocsWithAttempts as Et, fetchPkgDist as F, fetchBlogReleases as Ft, downloadLlmsDocs as G, resolvePackageDocs as H, getInstalledSkillVersion as I, fetchLlmsUrl as J, extractSections as K, parseVersionSpecifier as L, fetchLatestVersion as M, ResolveAttempt as Mt, fetchNpmPackage as N, ResolveResult as Nt, getRepoKeyForPackage as O, LlmsContent as Ot, fetchNpmRegistryMeta as P, ResolvedPackage as Pt, fetchGitHubIssues as Q, readLocalDependencies as R, getCrawlUrl as S, formatDiscussionAsMarkdown as St, getPrereleaseChangelogRef as T, toCrawlPattern as Tt, resolvePackageDocsWithAttempts as U, resolveLocalPackageDocs as V, searchNpmPackages as W, parseMarkdownLinks as X, normalizeLlmsLinks as Y, GitHubIssue as Z, parseSemver as _, EntryFile as _t, isGitHubRepoUrl as a, fetchGitHubRepoMeta as at, DocOverride as b, GitHubDiscussion as bt, parsePackageSpec as c, filterFrameworkDocs as ct, ReleaseIndexOptions as d, validateGitDocsWithLlms as dt, generateIssueIndex as et, SemVer as f, GitSkillSource as ft, isPrerelease as g, parseSkillFrontmatterName as gt, generateReleaseIndex as h, parseGitSkillInput as ht, fetchText as i, fetchGitDocs as it, ResolveStep as j, NpmPackageInfo as jt, LocalPackageInfo as k, LlmsLink as kt, verifyUrl as l, isShallowGitDocs as lt, fetchReleaseNotes as m, fetchGitSkills as mt, extractBranchHint as n, GitDocsResult as nt, normalizeRepoUrl as o, fetchReadme as ot, compareSemver as p, RemoteSkill as pt, fetchLlmsTxt as q, fetchGitHubRaw as r, MIN_GIT_DOCS as rt, parseGitHubUrl as s, fetchReadmeContent as st, $fetch as t, isGhAvailable as tt, GitHubRelease as u, resolveGitHubRepo as ut, BlogPreset as v, resolveEntryFiles as vt, getFilePatterns as w, fetchCrawledDocs as wt, getBlogPreset as x, fetchGitHubDiscussions as xt, BlogRelease as y, generateDocsIndex as yt, readLocalPackageInfo as z };
588
+ export { fetchGitHubIssues as $, LocalPackageInfo as A, LlmsLink as At, readLocalPackageInfo as B, getCrawlUrl as C, formatDiscussionAsMarkdown as Ct, getRelatedPackages as D, resolveCrateDocsWithAttempts as Dt, getPrereleaseChangelogRef as E, toCrawlPattern as Et, fetchNpmRegistryMeta as F, ResolvedPackage as Ft, searchNpmPackages as G, resolveLocalPackageDocs as H, fetchPkgDist as I, fetchBlogReleases as It, fetchLlmsTxt as J, downloadLlmsDocs as K, getInstalledSkillVersion as L, ResolveStep as M, NpmPackageInfo as Mt, fetchLatestVersion as N, ResolveAttempt as Nt, getRepoEntry as O, FetchedDoc as Ot, fetchNpmPackage as P, ResolveResult as Pt, GitHubIssue as Q, parseVersionSpecifier as R, getBlogPreset as S, fetchGitHubDiscussions as St, getFilePatterns as T, fetchCrawledDocs as Tt, resolvePackageDocs as U, resolveInstalledVersion as V, resolvePackageDocsWithAttempts as W, normalizeLlmsLinks as X, fetchLlmsUrl as Y, parseMarkdownLinks as Z, isPrerelease as _, parseSkillFrontmatterName as _t, isGitHubRepoUrl as a, fetchGitDocs as at, BlogRelease as b, generateDocsIndex as bt, parseGitHubUrl as c, fetchReadmeContent as ct, GitHubRelease as d, resolveGitHubRepo as dt, formatIssueAsMarkdown as et, ReleaseIndexOptions as f, validateGitDocsWithLlms as ft, generateReleaseIndex as g, parseGitSkillInput as gt, fetchReleaseNotes as h, fetchGitSkills as ht, fetchText as i, MIN_GIT_DOCS as it, ResolveOptions as j, LocalDependency as jt, getRepoKeyForPackage as k, LlmsContent as kt, parsePackageSpec as l, filterFrameworkDocs as lt, compareSemver as m, RemoteSkill as mt, extractBranchHint as n, isGhAvailable as nt, normalizeRepoUrl as o, fetchGitHubRepoMeta as ot, SemVer as p, GitSkillSource as pt, extractSections as q, fetchGitHubRaw as r, GitDocsResult as rt, parseGitHubRepoSlug as s, fetchReadme as st, $fetch as t, generateIssueIndex as tt, verifyUrl as u, isShallowGitDocs as ut, parseSemver as v, EntryFile as vt, getDocOverride as w, generateDiscussionIndex as wt, DocOverride as x, GitHubDiscussion as xt, BlogPreset as y, resolveEntryFiles as yt, readLocalDependencies as z };
587
589
  //# sourceMappingURL=index3.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index3.d.mts","names":[],"sources":["../../src/sources/blog-releases.ts","../../src/sources/types.ts","../../src/sources/crates.ts","../../src/sources/crawl.ts","../../src/sources/discussions.ts","../../src/sources/docs.ts","../../src/sources/entries.ts","../../src/sources/git-skills.ts","../../src/sources/github.ts","../../src/sources/issues.ts","../../src/sources/llms.ts","../../src/sources/npm.ts","../../src/sources/package-registry.ts","../../src/sources/releases.ts","../../src/sources/utils.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index3.d.mts","names":[],"sources":["../../src/sources/blog-releases.ts","../../src/sources/types.ts","../../src/sources/crates.ts","../../src/sources/crawl.ts","../../src/sources/discussions.ts","../../src/sources/docs.ts","../../src/sources/entries.ts","../../src/sources/git-skills.ts","../../src/sources/github.ts","../../src/sources/issues.ts","../../src/sources/llms.ts","../../src/sources/npm.ts","../../src/sources/package-registry.ts","../../src/sources/releases.ts","../../src/sources/utils.ts"],"mappings":"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"}