skilld 0.0.1 → 0.1.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 (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -88
  3. package/dist/_chunks/config.mjs +20 -0
  4. package/dist/_chunks/config.mjs.map +1 -0
  5. package/dist/_chunks/llm.mjs +877 -0
  6. package/dist/_chunks/llm.mjs.map +1 -0
  7. package/dist/_chunks/releases.mjs +986 -0
  8. package/dist/_chunks/releases.mjs.map +1 -0
  9. package/dist/_chunks/storage.mjs +198 -0
  10. package/dist/_chunks/storage.mjs.map +1 -0
  11. package/dist/_chunks/sync-parallel.mjs +540 -0
  12. package/dist/_chunks/sync-parallel.mjs.map +1 -0
  13. package/dist/_chunks/types.d.mts +87 -0
  14. package/dist/_chunks/types.d.mts.map +1 -0
  15. package/dist/_chunks/utils.d.mts +352 -0
  16. package/dist/_chunks/utils.d.mts.map +1 -0
  17. package/dist/_chunks/version.d.mts +147 -0
  18. package/dist/_chunks/version.d.mts.map +1 -0
  19. package/dist/agent/index.d.mts +205 -0
  20. package/dist/agent/index.d.mts.map +1 -0
  21. package/dist/agent/index.mjs +2 -0
  22. package/dist/cache/index.d.mts +2 -0
  23. package/dist/cache/index.mjs +3 -0
  24. package/dist/cli.mjs +2650 -449
  25. package/dist/cli.mjs.map +1 -1
  26. package/dist/index.d.mts +5 -14
  27. package/dist/index.mjs +7 -181
  28. package/dist/retriv/index.d.mts +12 -0
  29. package/dist/retriv/index.d.mts.map +1 -0
  30. package/dist/retriv/index.mjs +76 -0
  31. package/dist/retriv/index.mjs.map +1 -0
  32. package/dist/sources/index.d.mts +2 -0
  33. package/dist/sources/index.mjs +3 -0
  34. package/dist/types.d.mts +4 -37
  35. package/package.json +39 -13
  36. package/dist/agents.d.mts +0 -56
  37. package/dist/agents.d.mts.map +0 -1
  38. package/dist/agents.mjs +0 -148
  39. package/dist/agents.mjs.map +0 -1
  40. package/dist/index.d.mts.map +0 -1
  41. package/dist/index.mjs.map +0 -1
  42. package/dist/npm.d.mts +0 -48
  43. package/dist/npm.d.mts.map +0 -1
  44. package/dist/npm.mjs +0 -90
  45. package/dist/npm.mjs.map +0 -1
  46. package/dist/split-text.d.mts +0 -24
  47. package/dist/split-text.d.mts.map +0 -1
  48. package/dist/split-text.mjs +0 -87
  49. package/dist/split-text.mjs.map +0 -1
  50. package/dist/types.d.mts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.mjs","names":[],"sources":["../../src/agent/registry.ts","../../src/agent/detect.ts","../../src/agent/detect-presets.ts","../../src/agent/detect-imports.ts","../../src/agent/install.ts","../../src/agent/prompts/prompt.ts","../../src/agent/types.ts","../../src/agent/prompts/skill.ts","../../src/agent/llm/index.ts"],"sourcesContent":["/**\n * Agent registry - definitions for all supported agents\n */\n\nimport type { AgentConfig, AgentType } from './types'\nimport { existsSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nconst home = homedir()\nconst configHome = process.env.XDG_CONFIG_HOME || join(home, '.config')\nconst claudeHome = process.env.CLAUDE_CONFIG_DIR || join(home, '.claude')\nconst codexHome = process.env.CODEX_HOME || join(home, '.codex')\n\nexport const agents: Record<AgentType, AgentConfig> = {\n 'claude-code': {\n name: 'claude-code',\n displayName: 'Claude Code',\n skillsDir: '.claude/skills',\n globalSkillsDir: join(claudeHome, 'skills'),\n detectInstalled: () => existsSync(claudeHome),\n cli: 'claude',\n },\n 'cursor': {\n name: 'cursor',\n displayName: 'Cursor',\n skillsDir: '.cursor/skills',\n globalSkillsDir: join(home, '.cursor/skills'),\n detectInstalled: () => existsSync(join(home, '.cursor')),\n },\n 'windsurf': {\n name: 'windsurf',\n displayName: 'Windsurf',\n skillsDir: '.windsurf/skills',\n globalSkillsDir: join(home, '.codeium/windsurf/skills'),\n detectInstalled: () => existsSync(join(home, '.codeium/windsurf')),\n },\n 'cline': {\n name: 'cline',\n displayName: 'Cline',\n skillsDir: '.cline/skills',\n globalSkillsDir: join(home, '.cline/skills'),\n detectInstalled: () => existsSync(join(home, '.cline')),\n },\n 'codex': {\n name: 'codex',\n displayName: 'Codex',\n skillsDir: '.codex/skills',\n globalSkillsDir: join(codexHome, 'skills'),\n detectInstalled: () => existsSync(codexHome),\n cli: 'codex',\n },\n 'github-copilot': {\n name: 'github-copilot',\n displayName: 'GitHub Copilot',\n skillsDir: '.github/skills',\n globalSkillsDir: join(home, '.copilot/skills'),\n detectInstalled: () => existsSync(join(home, '.copilot')),\n },\n 'gemini-cli': {\n name: 'gemini-cli',\n displayName: 'Gemini CLI',\n skillsDir: '.gemini/skills',\n globalSkillsDir: join(home, '.gemini/skills'),\n detectInstalled: () => existsSync(join(home, '.gemini')),\n cli: 'gemini',\n },\n 'goose': {\n name: 'goose',\n displayName: 'Goose',\n skillsDir: '.goose/skills',\n globalSkillsDir: join(configHome, 'goose/skills'),\n detectInstalled: () => existsSync(join(configHome, 'goose')),\n cli: 'goose',\n },\n 'amp': {\n name: 'amp',\n displayName: 'Amp',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(configHome, 'agents/skills'),\n detectInstalled: () => existsSync(join(configHome, 'amp')),\n },\n 'opencode': {\n name: 'opencode',\n displayName: 'OpenCode',\n skillsDir: '.opencode/skills',\n globalSkillsDir: join(configHome, 'opencode/skills'),\n detectInstalled: () => existsSync(join(configHome, 'opencode')),\n },\n 'roo': {\n name: 'roo',\n displayName: 'Roo Code',\n skillsDir: '.roo/skills',\n globalSkillsDir: join(home, '.roo/skills'),\n detectInstalled: () => existsSync(join(home, '.roo')),\n },\n}\n","/**\n * Agent detection - identify installed and active agents\n */\n\nimport type { AgentType } from './types'\nimport { execSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { agents } from './registry'\n\n/**\n * Detect which agents are installed on the system\n */\nexport function detectInstalledAgents(): AgentType[] {\n return Object.entries(agents)\n .filter(([_, config]) => config.detectInstalled())\n .map(([type]) => type as AgentType)\n}\n\n/**\n * Detect the target agent (where skills are installed) from env vars and cwd.\n * This is NOT the generator LLM — it determines the skills directory.\n */\nexport function detectTargetAgent(): AgentType | null {\n // Check environment variables set by agents\n if (process.env.CLAUDE_CODE || process.env.CLAUDE_CONFIG_DIR) {\n return 'claude-code'\n }\n if (process.env.CURSOR_SESSION || process.env.CURSOR_TRACE_ID) {\n return 'cursor'\n }\n if (process.env.WINDSURF_SESSION) {\n return 'windsurf'\n }\n if (process.env.CLINE_TASK_ID) {\n return 'cline'\n }\n if (process.env.CODEX_HOME || process.env.CODEX_SESSION) {\n return 'codex'\n }\n if (process.env.GITHUB_COPILOT_SESSION) {\n return 'github-copilot'\n }\n if (process.env.GEMINI_API_KEY && process.env.GEMINI_SESSION) {\n return 'gemini-cli'\n }\n if (process.env.GOOSE_SESSION) {\n return 'goose'\n }\n if (process.env.AMP_SESSION) {\n return 'amp'\n }\n if (process.env.OPENCODE_SESSION) {\n return 'opencode'\n }\n if (process.env.ROO_SESSION) {\n return 'roo'\n }\n\n // Check for project-level agent config directories and files\n // Priority order matters — first match wins\n const cwd = process.cwd()\n\n // Claude Code\n if (existsSync(join(cwd, '.claude')) || existsSync(join(cwd, 'CLAUDE.md'))) {\n return 'claude-code'\n }\n // Cursor\n if (existsSync(join(cwd, '.cursor')) || existsSync(join(cwd, '.cursorrules'))) {\n return 'cursor'\n }\n // Windsurf\n if (existsSync(join(cwd, '.windsurf')) || existsSync(join(cwd, '.windsurfrules'))) {\n return 'windsurf'\n }\n // Cline\n if (existsSync(join(cwd, '.cline'))) {\n return 'cline'\n }\n // Codex\n if (existsSync(join(cwd, '.codex'))) {\n return 'codex'\n }\n // GitHub Copilot\n if (existsSync(join(cwd, '.github', 'copilot-instructions.md'))) {\n return 'github-copilot'\n }\n // Gemini CLI\n if (existsSync(join(cwd, '.gemini')) || existsSync(join(cwd, 'AGENTS.md'))) {\n return 'gemini-cli'\n }\n // Goose\n if (existsSync(join(cwd, '.goose'))) {\n return 'goose'\n }\n // Roo Code\n if (existsSync(join(cwd, '.roo'))) {\n return 'roo'\n }\n\n return null\n}\n\n/**\n * Get the version of an agent's CLI (if available)\n */\nexport function getAgentVersion(agentType: AgentType): string | null {\n const agent = agents[agentType]\n if (!agent.cli)\n return null\n\n try {\n const output = execSync(`${agent.cli} --version`, {\n encoding: 'utf-8',\n timeout: 3000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim()\n\n // Extract version number from output\n // Common formats: \"v1.2.3\", \"1.2.3\", \"cli 1.2.3\", \"name v1.2.3\"\n const match = output.match(/v?(\\d+\\.\\d+\\.\\d+(?:-[a-z0-9.]+)?)/)\n return match ? match[1] : output.split('\\n')[0]\n }\n catch {\n return null\n }\n}\n","/**\n * Detect packages from framework presets (e.g., Nuxt modules in nuxt.config)\n * These are string literals in config arrays, not imports — the import scanner misses them.\n */\n\nimport type { PackageUsage } from './detect-imports'\nimport { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst NUXT_CONFIG_FILES = ['nuxt.config.ts', 'nuxt.config.js', 'nuxt.config.mjs']\nconst NUXT_ECOSYSTEM = ['vue', 'nitro', 'h3']\n\nasync function findNuxtConfig(cwd: string): Promise<{ path: string, content: string } | null> {\n for (const name of NUXT_CONFIG_FILES) {\n const path = join(cwd, name)\n const content = await readFile(path, 'utf8').catch(() => null)\n if (content)\n return { path, content }\n }\n return null\n}\n\n/**\n * Walk AST node to find all string values inside a `modules` array property.\n * Handles: defineNuxtConfig({ modules: [...] }) and export default { modules: [...] }\n */\nexport function extractModuleStrings(node: any): string[] {\n if (!node || typeof node !== 'object')\n return []\n\n // Found a Property with key \"modules\" and an ArrayExpression value\n if (node.type === 'Property' && !node.computed\n && (node.key?.type === 'Identifier' && node.key.name === 'modules')\n && node.value?.type === 'ArrayExpression') {\n return node.value.elements\n .filter((el: any) => el?.type === 'Literal' && typeof el.value === 'string')\n .map((el: any) => el.value as string)\n }\n\n // Recurse into arrays and object values\n const results: string[] = []\n if (Array.isArray(node)) {\n for (const child of node)\n results.push(...extractModuleStrings(child))\n }\n else {\n for (const key of Object.keys(node)) {\n if (key === 'start' || key === 'end' || key === 'type')\n continue\n const val = node[key]\n if (val && typeof val === 'object')\n results.push(...extractModuleStrings(val))\n }\n }\n return results\n}\n\n/**\n * Detect Nuxt modules from nuxt.config.{ts,js,mjs}\n */\nexport async function detectNuxtModules(cwd: string): Promise<PackageUsage[]> {\n const config = await findNuxtConfig(cwd)\n if (!config)\n return []\n\n const { parseSync } = await import('oxc-parser')\n const result = parseSync(config.path, config.content)\n const modules = extractModuleStrings(result.program)\n\n // Dedupe and build results\n const seen = new Set<string>()\n const packages: PackageUsage[] = []\n\n for (const mod of modules) {\n if (!seen.has(mod)) {\n seen.add(mod)\n packages.push({ name: mod, count: 0, source: 'preset' })\n }\n }\n\n // Add core ecosystem packages\n for (const pkg of NUXT_ECOSYSTEM) {\n if (!seen.has(pkg)) {\n seen.add(pkg)\n packages.push({ name: pkg, count: 0, source: 'preset' })\n }\n }\n\n return packages\n}\n\n/**\n * Run all preset detectors and merge results\n */\nexport async function detectPresetPackages(cwd: string): Promise<PackageUsage[]> {\n // Currently only Nuxt, but extensible for other frameworks\n return detectNuxtModules(cwd)\n}\n","/**\n * Detect directly-used npm packages by scanning source files\n * Uses mlly for proper ES module parsing + globby for gitignore support\n */\n\nimport { readFile } from 'node:fs/promises'\nimport { globby } from 'globby'\nimport { findDynamicImports, findStaticImports } from 'mlly'\nimport { detectPresetPackages } from './detect-presets'\n\nexport interface PackageUsage {\n name: string\n count: number\n source?: 'import' | 'preset'\n}\n\nexport interface DetectResult {\n packages: PackageUsage[]\n error?: string\n}\n\nconst PATTERNS = ['**/*.{ts,js,vue,mjs,cjs,tsx,jsx,mts,cts}']\nconst IGNORE = ['**/node_modules/**', '**/dist/**', '**/.nuxt/**', '**/.output/**', '**/coverage/**']\n\nfunction addPackage(counts: Map<string, number>, specifier: string | undefined) {\n if (!specifier || specifier.startsWith('.') || specifier.startsWith('/'))\n return\n\n // Extract package name (handle subpaths like 'pkg/subpath')\n const name = specifier.startsWith('@')\n ? specifier.split('/').slice(0, 2).join('/')\n : specifier.split('/')[0]!\n\n if (!isNodeBuiltin(name)) {\n counts.set(name, (counts.get(name) || 0) + 1)\n }\n}\n\n/**\n * Scan source files to detect all directly-imported npm packages\n * Async with gitignore support for proper spinner animation\n */\nexport async function detectImportedPackages(cwd: string = process.cwd()): Promise<DetectResult> {\n try {\n const counts = new Map<string, number>()\n\n const files = await globby(PATTERNS, {\n cwd,\n ignore: IGNORE,\n gitignore: true,\n absolute: true,\n })\n\n await Promise.all(files.map(async (file) => {\n const content = await readFile(file, 'utf8')\n\n // Static: import x from 'pkg'\n for (const imp of findStaticImports(content)) {\n addPackage(counts, imp.specifier)\n }\n\n // Dynamic: import('pkg') - expression is the string literal\n for (const imp of findDynamicImports(content)) {\n // expression includes quotes, extract string value\n const match = imp.expression.match(/^['\"]([^'\"]+)['\"]$/)\n if (match)\n addPackage(counts, match[1]!)\n }\n }))\n\n // Sort by usage count (descending), then alphabetically\n const packages: PackageUsage[] = [...counts.entries()]\n .map(([name, count]) => ({ name, count, source: 'import' as const }))\n .sort((a, b) => b.count - a.count || a.name.localeCompare(b.name))\n\n // Merge preset-detected packages (imports take priority)\n const presets = await detectPresetPackages(cwd)\n const importNames = new Set(packages.map(p => p.name))\n for (const preset of presets) {\n if (!importNames.has(preset.name))\n packages.push(preset)\n }\n\n return { packages }\n }\n catch (err) {\n return { packages: [], error: String(err) }\n }\n}\n\nconst NODE_BUILTINS = new Set([\n 'assert',\n 'buffer',\n 'child_process',\n 'cluster',\n 'console',\n 'constants',\n 'crypto',\n 'dgram',\n 'dns',\n 'domain',\n 'events',\n 'fs',\n 'http',\n 'https',\n 'module',\n 'net',\n 'os',\n 'path',\n 'perf_hooks',\n 'process',\n 'punycode',\n 'querystring',\n 'readline',\n 'repl',\n 'stream',\n 'string_decoder',\n 'sys',\n 'timers',\n 'tls',\n 'tty',\n 'url',\n 'util',\n 'v8',\n 'vm',\n 'wasi',\n 'worker_threads',\n 'zlib',\n])\n\nfunction isNodeBuiltin(pkg: string): boolean {\n const base = pkg.startsWith('node:') ? pkg.slice(5) : pkg\n return NODE_BUILTINS.has(base.split('/')[0]!)\n}\n","/**\n * Skill installation - write skills to agent directories\n */\n\nimport type { AgentType } from './types'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { detectInstalledAgents } from './detect'\nimport { agents } from './registry'\n\n/**\n * Sanitize skill name for filesystem\n */\nexport function sanitizeName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9._]+/g, '-')\n .replace(/^[.\\-]+|[.\\-]+$/g, '')\n .slice(0, 255) || 'unnamed-skill'\n}\n\n/**\n * Install a skill directly to agent skill directories\n * Writes to each agent's skill folder in the project (e.g., .claude/skills/package-name/)\n */\nexport function installSkillForAgents(\n skillName: string,\n skillContent: string,\n options: {\n global?: boolean\n cwd?: string\n agents?: AgentType[]\n /** Additional files to write (filename -> content) */\n files?: Record<string, string>\n } = {},\n): { installed: AgentType[], paths: string[] } {\n const isGlobal = options.global ?? false\n const cwd = options.cwd || process.cwd()\n const sanitized = sanitizeName(skillName)\n\n // Use specified agents or detect installed\n const targetAgents = options.agents || detectInstalledAgents()\n\n const installed: AgentType[] = []\n const paths: string[] = []\n\n for (const agentType of targetAgents) {\n const agent = agents[agentType]\n\n // Skip if agent doesn't support global installation\n if (isGlobal && !agent.globalSkillsDir)\n continue\n\n // Determine target directory\n const baseDir = isGlobal ? agent.globalSkillsDir! : join(cwd, agent.skillsDir)\n const skillDir = join(baseDir, sanitized)\n\n // Create directory and write files\n mkdirSync(skillDir, { recursive: true })\n writeFileSync(join(skillDir, '_SKILL.md'), skillContent)\n\n // Write additional files\n if (options.files) {\n for (const [filename, content] of Object.entries(options.files)) {\n writeFileSync(join(skillDir, filename), content)\n }\n }\n\n installed.push(agentType)\n paths.push(skillDir)\n }\n\n return { installed, paths }\n}\n","/**\n * Skill generation prompt - minimal, agent explores via tools\n */\n\nimport { dirname } from 'node:path'\n\nexport type SkillSection = 'best-practices' | 'api' | 'custom'\n\nexport interface BuildSkillPromptOptions {\n packageName: string\n /** Absolute path to skill directory with ./.skilld/ */\n skillDir: string\n /** Package version (e.g., \"3.5.13\") */\n version?: string\n /** Has GitHub data (issues + discussions) indexed */\n hasGithub?: boolean\n /** Has release notes */\n hasReleases?: boolean\n /** CHANGELOG filename if found in package (e.g. CHANGELOG.md, changelog.md) */\n hasChangelog?: string | false\n /** Resolved absolute paths to .md doc files */\n docFiles?: string[]\n /** Doc source type */\n docsType?: 'llms.txt' | 'readme' | 'docs'\n /** Package ships its own docs */\n hasShippedDocs?: boolean\n /** Which sections to generate (defaults to all) */\n sections?: SkillSection[]\n /** Custom instructions from the user (when 'custom' section selected) */\n customPrompt?: string\n}\n\n/**\n * Group files by parent directory with counts\n * e.g. `/path/to/docs/api/ (15 .md files)`\n */\nfunction formatDocTree(files: string[]): string {\n const dirs = new Map<string, number>()\n for (const f of files) {\n const dir = dirname(f)\n dirs.set(dir, (dirs.get(dir) || 0) + 1)\n }\n return [...dirs.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([dir, count]) => `- \\`${dir}/\\` (${count} .md files)`)\n .join('\\n')\n}\n\nfunction generateImportantBlock({ packageName, hasGithub, hasReleases, hasChangelog, docsType, hasShippedDocs, skillDir }: {\n packageName: string\n hasGithub?: boolean\n hasReleases?: boolean\n hasChangelog?: string | false\n docsType: string\n hasShippedDocs: boolean\n skillDir: string\n}): string {\n const searchDesc = hasGithub ? 'Docs + GitHub' : 'Docs'\n const searchCmd = `\\`Bash 'npx skilld ${packageName} -q \"<query>\"'\\``\n\n const docsPath = hasShippedDocs\n ? `\\`${skillDir}/.skilld/pkg/docs/\\` or \\`${skillDir}/.skilld/pkg/README.md\\``\n : docsType === 'llms.txt'\n ? `\\`${skillDir}/.skilld/docs/llms.txt\\``\n : docsType === 'readme'\n ? `\\`${skillDir}/.skilld/pkg/README.md\\``\n : `\\`${skillDir}/.skilld/docs/\\``\n\n const rows = [\n [searchDesc, searchCmd],\n ['Docs', docsPath],\n ['Package', `\\`${skillDir}/.skilld/pkg/\\``],\n ]\n if (hasGithub) {\n rows.push(['GitHub', `\\`${skillDir}/.skilld/github/\\``])\n }\n if (hasChangelog) {\n rows.push(['Changelog', `\\`${skillDir}/.skilld/pkg/${hasChangelog}\\``])\n }\n if (hasReleases) {\n rows.push(['Releases', `\\`${skillDir}/.skilld/releases/\\``])\n }\n\n const table = [\n '| Resource | Command |',\n '|----------|---------|',\n ...rows.map(([desc, cmd]) => `| ${desc} | ${cmd} |`),\n ].join('\\n')\n\n return `**IMPORTANT:** Use these references\\n\\n${table}`\n}\n\n/**\n * Build the skill generation prompt - agent uses tools to explore\n */\nexport function buildSkillPrompt(opts: BuildSkillPromptOptions): string {\n const { packageName, skillDir, version, hasGithub, hasReleases, hasChangelog, docFiles, docsType = 'docs', hasShippedDocs = false, sections, customPrompt } = opts\n\n const hasBestPractices = !sections || sections.includes('best-practices')\n const hasApi = !sections || sections.includes('api')\n const hasCustom = sections?.includes('custom') && customPrompt\n\n const versionContext = version ? ` v${version}` : ''\n\n const docsSection = docFiles?.length\n ? `**Documentation** (use Read tool to explore):\\n${formatDocTree(docFiles)}`\n : ''\n\n const importantBlock = generateImportantBlock({ packageName, hasGithub, hasReleases, hasChangelog, docsType, hasShippedDocs, skillDir })\n\n // Build task description based on selected sections\n const taskParts: string[] = []\n if (hasBestPractices) {\n taskParts.push(`Find novel best practices from the references. Every item must link to its source.\n\nLook for: tip, warning, best practice, avoid, pitfall, note, important.`)\n }\n if (hasApi) {\n taskParts.push(`**Generate an API reference section.** List the package's exported functions/composables grouped by documentation page or category. Each function gets a one-liner description. Link group headings to the source doc URL when available.`)\n }\n if (hasCustom) {\n taskParts.push(`**Custom instructions from the user:**\\n${customPrompt}`)\n }\n\n // Build format section based on selected sections\n const formatParts: string[] = []\n if (hasBestPractices) {\n formatParts.push(`\\`\\`\\`\n[✅ descriptive title](./.skilld/path/to/source.md)\n\\`\\`\\`ts\ncode example (1-3 lines)\n\\`\\`\\`\n\n[❌ pitfall title](./.skilld/path/to/source.md#section)\n\\`\\`\\`ts\nwrong // correct way\n\\`\\`\\`\n\\`\\`\\``)\n }\n if (hasApi) {\n formatParts.push(`API reference format${hasBestPractices ? ' (place at end, after best practices)' : ''}:\n\\`\\`\\`\n## API\n\n### [Category Name](./.skilld/docs/category.md)\n- functionName — one-line description\n- anotherFn — one-line description\n\\`\\`\\`\n\nLink group headings to the local \\`./.skilld/\\` source file.\n\nFor single-page-docs packages, use a flat list without grouping. Skip the API section entirely for packages with fewer than 3 exports.`)\n }\n\n // Build rules based on selected sections\n const rules: string[] = []\n if (hasBestPractices)\n rules.push('- **5-10 best practice items**, MAX 150 lines for best practices')\n if (hasApi)\n rules.push('- **API section:** list all public exports, grouped by doc page, MAX 80 lines')\n rules.push(\n '- Link to exact source file where you found info',\n '- TypeScript only, Vue uses `<script setup lang=\"ts\">`',\n '- Imperative voice (\"Use X\" not \"You should use X\")',\n '- **NEVER fetch external URLs.** All information is in the local `./.skilld/` directory. Use Read/Glob only.',\n )\n\n return `Generate SKILL.md body for \"${packageName}\"${versionContext}.\n\n${importantBlock}\n${docsSection ? `${docsSection}\\n` : ''}\n\n## Skill Quality Principles\n\nThe context window is a shared resource. Skills share it with system prompt, conversation history, other skills, and the user request.\n\n- **Only add what Claude doesn't know.** Claude already knows general programming, popular APIs, common patterns. Challenge every line: \"Does this justify its token cost?\"\n- **Prefer concise examples over verbose explanations.** A 2-line code example beats a paragraph.\n- **Skip:** API signatures, installation steps, tutorials, marketing, general programming knowledge, anything in the package README that's obvious\n- **Include:** Non-obvious gotchas, surprising defaults, version-specific breaking changes, pitfalls from issues, patterns that differ from what Claude would assume\n\n## Task\n\n${taskParts.join('\\n\\n')}\n\n## Format\n\n${formatParts.join('\\n\\n')}\n\n## Rules\n\n${rules.join('\\n')}\n\n## Output\n\nWrite the body content to \\`${skillDir}/_SKILL.md\\` using the Write tool.\nDo NOT output the content to stdout. Write it to the file only.\n`\n}\n","/**\n * Agent types and interfaces\n */\n\nexport type AgentType\n = | 'claude-code'\n | 'cursor'\n | 'windsurf'\n | 'cline'\n | 'codex'\n | 'github-copilot'\n | 'gemini-cli'\n | 'goose'\n | 'amp'\n | 'opencode'\n | 'roo'\n\nexport interface AgentConfig {\n name: AgentType\n displayName: string\n /** Project-level skills directory (e.g., .claude/skills) */\n skillsDir: string\n /** Global skills directory (e.g., ~/.claude/skills) */\n globalSkillsDir: string | undefined\n /** Check if agent is installed on the system */\n detectInstalled: () => boolean\n /** CLI command name (if agent has a CLI) */\n cli?: string\n}\n\nexport interface SkillMetadata {\n name: string\n version?: string\n /** ISO date string when this version was released */\n releasedAt?: string\n description?: string\n /** File patterns this skill applies to (e.g., [\"*.vue\", \"*.ts\"]) */\n globs?: string[]\n}\n\n/**\n * Mapping of packages to file patterns they process.\n * Used to generate skill descriptions with file extension triggers.\n */\nexport const FILE_PATTERN_MAP: Record<string, string[]> = {\n // Frameworks with custom file extensions\n 'vue': ['*.vue'],\n 'svelte': ['*.svelte'],\n 'astro': ['*.astro'],\n 'solid-js': ['*.jsx', '*.tsx'],\n 'qwik': ['*.tsx'],\n 'marko': ['*.marko'],\n 'riot': ['*.riot'],\n\n // Languages/transpilers\n 'typescript': ['*.ts', '*.tsx', '*.mts', '*.cts'],\n 'coffeescript': ['*.coffee'],\n 'livescript': ['*.ls'],\n 'elm': ['*.elm'],\n\n // CSS preprocessors\n 'sass': ['*.scss', '*.sass'],\n 'less': ['*.less'],\n 'stylus': ['*.styl'],\n 'postcss': ['*.css', '*.pcss'],\n\n // Template engines\n 'pug': ['*.pug'],\n 'ejs': ['*.ejs'],\n 'handlebars': ['*.hbs', '*.handlebars'],\n 'mustache': ['*.mustache'],\n 'nunjucks': ['*.njk'],\n 'liquid': ['*.liquid'],\n\n // Data formats\n 'yaml': ['*.yaml', '*.yml'],\n 'js-yaml': ['*.yaml', '*.yml'],\n 'toml': ['*.toml'],\n '@iarna/toml': ['*.toml'],\n 'json5': ['*.json5'],\n 'jsonc-parser': ['*.jsonc'],\n\n // Markdown\n 'markdown-it': ['*.md'],\n 'marked': ['*.md'],\n 'remark': ['*.md', '*.mdx'],\n '@mdx-js/mdx': ['*.mdx'],\n\n // GraphQL\n 'graphql': ['*.graphql', '*.gql'],\n 'graphql-tag': ['*.graphql', '*.gql'],\n '@graphql-codegen/cli': ['*.graphql', '*.gql'],\n\n // Other\n 'prisma': ['*.prisma'],\n '@prisma/client': ['*.prisma'],\n 'wasm-pack': ['*.wasm'],\n}\n","/**\n * SKILL.md file generation\n */\n\nimport { sanitizeName } from '../install'\nimport { FILE_PATTERN_MAP } from '../types'\n\nexport interface SkillOptions {\n name: string\n version?: string\n releasedAt?: string\n /** Production dependencies with version specifiers */\n dependencies?: Record<string, string>\n /** npm dist-tags with version and release date */\n distTags?: Record<string, { version: string, releasedAt?: string }>\n globs?: string[]\n description?: string\n /** LLM-generated body — replaces default heading + description */\n body?: string\n relatedSkills: string[]\n hasGithub?: boolean\n hasReleases?: boolean\n hasChangelog?: string | false\n docsType?: 'llms.txt' | 'readme' | 'docs'\n hasShippedDocs?: boolean\n /** Key files in package (entry points + docs) */\n pkgFiles?: string[]\n}\n\nexport function generateSkillMd(opts: SkillOptions): string {\n const header = generatePackageHeader(opts)\n const refs = generateReferencesBlock(opts)\n const content = opts.body ? `${header}\\n\\n${refs}${opts.body}` : `${header}\\n\\n${refs}`\n return `${generateFrontmatter(opts)}${content}\n${generateFooter(opts.relatedSkills)}`\n}\n\nfunction formatRelativeDate(isoDate: string): string {\n const date = new Date(isoDate)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n\n if (diffDays === 0)\n return 'today'\n if (diffDays === 1)\n return 'yesterday'\n if (diffDays < 7)\n return `${diffDays} days ago`\n if (diffDays < 30)\n return `${Math.floor(diffDays / 7)} weeks ago`\n if (diffDays < 365)\n return `${Math.floor(diffDays / 30)} months ago`\n return `${Math.floor(diffDays / 365)} years ago`\n}\n\nfunction generatePackageHeader({ name, description, version, releasedAt, dependencies, distTags, hasGithub }: SkillOptions & { repoUrl?: string }): string {\n const lines: string[] = [`# ${name}`]\n\n if (description)\n lines.push('', `> ${description}`)\n\n // Version with link and relative date\n if (version) {\n const relativeDate = releasedAt ? formatRelativeDate(releasedAt) : ''\n const versionStr = relativeDate ? `${version} (${relativeDate})` : version\n lines.push('', `**Version:** ${versionStr}`)\n }\n\n if (dependencies && Object.keys(dependencies).length > 0) {\n const deps = Object.entries(dependencies)\n .map(([n, v]) => `${n}@${v}`)\n .join(', ')\n lines.push(`**Deps:** ${deps}`)\n }\n\n if (distTags && Object.keys(distTags).length > 0) {\n const tags = Object.entries(distTags)\n .map(([tag, info]) => {\n const relDate = info.releasedAt ? ` (${formatRelativeDate(info.releasedAt)})` : ''\n return `${tag}: ${info.version}${relDate}`\n })\n .join(', ')\n lines.push(`**Tags:** ${tags}`)\n }\n\n if (hasGithub)\n lines.push(`**GitHub:** \\`./.skilld/github/\\``)\n\n return lines.join('\\n')\n}\n\nfunction generateFrontmatter({ name, version, globs }: SkillOptions): string {\n const patterns = globs ?? FILE_PATTERN_MAP[name]\n const description = patterns?.length\n ? `Load skill when working with ${patterns.join(', ')} files or importing from \"${name}\".`\n : `Load skill when using anything from the package \"${name}\".`\n\n const lines = [\n '---',\n `name: ${sanitizeName(name)}-skilld`,\n `description: ${description}`,\n ]\n if (patterns?.length)\n lines.push(`globs: ${JSON.stringify(patterns)}`)\n if (version)\n lines.push(`version: \"${version}\"`)\n lines.push('---', '', '')\n return lines.join('\\n')\n}\n\nfunction generateReferencesBlock({ name, hasGithub, hasReleases, docsType = 'docs', hasShippedDocs = false, pkgFiles = [] }: SkillOptions): string {\n const lines: string[] = [\n '## References',\n '',\n `IMPORTANT: Search all references (semantic and keyword) using \\`skilld ${name} -q \"<query>\"\\`.`,\n '',\n ]\n\n // Package with inline file list\n const fileList = pkgFiles.length ? ` — ${pkgFiles.map(f => `\\`${f}\\``).join(', ')}` : ''\n lines.push(`**Package:** \\`./.skilld/pkg/\\`${fileList}`)\n\n // Docs (only if separate from pkg)\n if (hasShippedDocs) {\n lines.push(`**Docs:** \\`./.skilld/pkg/docs/\\``)\n }\n else if (docsType === 'llms.txt') {\n lines.push(`**Docs:** \\`./.skilld/docs/llms.txt\\``)\n }\n else if (docsType === 'docs') {\n lines.push(`**Docs:** \\`./.skilld/docs/\\``)\n }\n\n if (hasGithub)\n lines.push(`**GitHub:** \\`./.skilld/github/\\``)\n\n if (hasReleases)\n lines.push(`**Releases:** \\`./.skilld/releases/\\``)\n\n lines.push('')\n return lines.join('\\n')\n}\n\nfunction generateFooter(relatedSkills: string[]): string {\n if (relatedSkills.length === 0)\n return ''\n return `\\nRelated: ${relatedSkills.join(', ')}\\n`\n}\n","/**\n * Minimal LLM provider - spawns CLI directly, no AI SDK\n * Supports claude and gemini CLIs with stream-json output\n *\n * Claude: token-level streaming via --include-partial-messages\n * Gemini: turn-level streaming via -o stream-json\n */\n\nimport type { SkillSection } from '../prompts'\nimport type { AgentType } from '../types'\nimport { exec, spawn } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { detectInstalledAgents } from '../detect'\nimport { buildSkillPrompt } from '../prompts'\nimport { agents } from '../registry'\n\nexport { buildSkillPrompt } from '../prompts'\nexport type { SkillSection } from '../prompts'\n\nexport type OptimizeModel\n = | 'opus'\n | 'sonnet'\n | 'haiku'\n | 'gemini-3-pro'\n | 'gemini-3-flash'\n | 'gemini-2.5-pro'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-flash-lite'\n | 'codex'\n\nexport interface ModelInfo {\n id: OptimizeModel\n name: string\n hint: string\n recommended?: boolean\n agentId: string\n agentName: string\n}\n\nexport interface StreamProgress {\n chunk: string\n type: 'reasoning' | 'text'\n text: string\n reasoning: string\n}\n\nexport interface OptimizeDocsOptions {\n packageName: string\n skillDir: string\n model?: OptimizeModel\n version?: string\n hasGithub?: boolean\n hasReleases?: boolean\n hasChangelog?: string | false\n docFiles?: string[]\n onProgress?: (progress: StreamProgress) => void\n timeout?: number\n verbose?: boolean\n noCache?: boolean\n /** Which sections to generate */\n sections?: SkillSection[]\n /** Custom instructions from the user */\n customPrompt?: string\n}\n\nexport interface OptimizeResult {\n optimized: string\n wasOptimized: boolean\n error?: string\n reasoning?: string\n finishReason?: string\n usage?: { inputTokens: number, outputTokens: number, totalTokens: number }\n cost?: number\n}\n\nconst CACHE_DIR = join(homedir(), '.skilld', 'llm-cache')\n\ninterface CliModelConfig {\n cli: 'claude' | 'gemini'\n model: string\n name: string\n hint: string\n recommended?: boolean\n agentId: AgentType\n}\n\n/** CLI config per model */\nconst CLI_MODELS: Partial<Record<OptimizeModel, CliModelConfig>> = {\n 'opus': { cli: 'claude', model: 'opus', name: 'Opus 4.5', hint: 'Most capable', agentId: 'claude-code' },\n 'sonnet': { cli: 'claude', model: 'sonnet', name: 'Sonnet 4.5', hint: 'Balanced', recommended: true, agentId: 'claude-code' },\n 'haiku': { cli: 'claude', model: 'haiku', name: 'Haiku 4.5', hint: 'Fastest', agentId: 'claude-code' },\n 'gemini-2.5-pro': { cli: 'gemini', model: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', hint: 'Most capable', agentId: 'gemini-cli' },\n 'gemini-2.5-flash': { cli: 'gemini', model: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', hint: 'Balanced', agentId: 'gemini-cli' },\n 'gemini-2.5-flash-lite': { cli: 'gemini', model: 'gemini-2.5-flash-lite', name: 'Gemini 2.5 Flash Lite', hint: 'Fastest', agentId: 'gemini-cli' },\n 'gemini-3-pro': { cli: 'gemini', model: 'gemini-3-pro-preview', name: 'Gemini 3 Pro', hint: 'Most capable', agentId: 'gemini-cli' },\n 'gemini-3-flash': { cli: 'gemini', model: 'gemini-3-flash-preview', name: 'Gemini 3 Flash', hint: 'Balanced', agentId: 'gemini-cli' },\n}\n\nexport function getModelName(id: OptimizeModel): string {\n return CLI_MODELS[id]?.name ?? id\n}\n\nexport async function getAvailableModels(): Promise<ModelInfo[]> {\n const { promisify } = await import('node:util')\n const execAsync = promisify(exec)\n\n const installedAgents = detectInstalledAgents()\n const agentsWithCli = installedAgents.filter(id => agents[id].cli)\n\n const cliChecks = await Promise.all(\n agentsWithCli.map(async (agentId) => {\n const cli = agents[agentId].cli!\n try {\n await execAsync(`which ${cli}`)\n return agentId\n }\n catch { return null }\n }),\n )\n const availableAgentIds = new Set(cliChecks.filter((id): id is AgentType => id != null))\n\n return (Object.entries(CLI_MODELS) as [OptimizeModel, CliModelConfig][])\n .filter(([_, config]) => availableAgentIds.has(config.agentId))\n .map(([id, config]) => ({\n id,\n name: config.name,\n hint: config.hint,\n recommended: config.recommended,\n agentId: config.agentId,\n agentName: agents[config.agentId]?.displayName ?? config.agentId,\n }))\n}\n\n/** Resolve symlinks in .skilld/ to get real paths for --add-dir */\nfunction resolveReferenceDirs(skillDir: string): string[] {\n const refsDir = join(skillDir, '.skilld')\n if (!existsSync(refsDir))\n return []\n return readdirSync(refsDir)\n .map(entry => join(refsDir, entry))\n .filter(p => lstatSync(p).isSymbolicLink())\n .map(p => realpathSync(p))\n}\n\nfunction buildCliArgs(cli: 'claude' | 'gemini', model: string, skillDir: string): string[] {\n const symlinkDirs = resolveReferenceDirs(skillDir)\n\n if (cli === 'claude') {\n return [\n '-p',\n '--model',\n model,\n '--output-format',\n 'stream-json',\n '--verbose',\n '--include-partial-messages', // token-level streaming\n '--allowedTools',\n 'Read Glob Grep Write',\n '--add-dir',\n skillDir,\n ...symlinkDirs.flatMap(d => ['--add-dir', d]),\n '--dangerously-skip-permissions',\n '--no-session-persistence',\n ]\n }\n return [\n '-o',\n 'stream-json',\n '-m',\n model,\n '-y', // auto-approve tools\n '--include-directories',\n skillDir,\n ...symlinkDirs.flatMap(d => ['--include-directories', d]),\n ]\n}\n\n// ── Cache ────────────────────────────────────────────────────────────\n\nfunction hashPrompt(prompt: string, model: OptimizeModel): string {\n return createHash('sha256').update(`exec:${model}:${prompt}`).digest('hex').slice(0, 16)\n}\n\nfunction getCached(prompt: string, model: OptimizeModel, maxAge = 7 * 24 * 60 * 60 * 1000): string | null {\n const path = join(CACHE_DIR, `${hashPrompt(prompt, model)}.json`)\n if (!existsSync(path))\n return null\n try {\n const { text, timestamp } = JSON.parse(readFileSync(path, 'utf-8'))\n return Date.now() - timestamp > maxAge ? null : text\n }\n catch { return null }\n}\n\nfunction setCache(prompt: string, model: OptimizeModel, text: string): void {\n mkdirSync(CACHE_DIR, { recursive: true })\n writeFileSync(\n join(CACHE_DIR, `${hashPrompt(prompt, model)}.json`),\n JSON.stringify({ text, model, timestamp: Date.now() }),\n )\n}\n\n// ── Stream event parsing ─────────────────────────────────────────────\n\ninterface ParsedEvent {\n /** Token-level text delta */\n textDelta?: string\n /** Complete text from a full message (non-partial) */\n fullText?: string\n /** Tool name being invoked */\n toolName?: string\n /** Tool input hint (file path, query, etc) */\n toolHint?: string\n /** Stream finished */\n done?: boolean\n /** Token usage */\n usage?: { input: number, output: number }\n /** Cost in USD */\n cost?: number\n /** Number of agentic turns */\n turns?: number\n}\n\n/**\n * Parse claude stream-json events\n *\n * Event types:\n * - stream_event/content_block_delta/text_delta → token streaming\n * - stream_event/content_block_start/tool_use → tool invocation starting\n * - assistant message with tool_use content → tool name + input\n * - assistant message with text content → full text (non-streaming fallback)\n * - result → usage, cost, turns\n */\nfunction parseClaudeLine(line: string): ParsedEvent {\n try {\n const obj = JSON.parse(line)\n\n // Token-level streaming (--include-partial-messages)\n if (obj.type === 'stream_event') {\n const evt = obj.event\n if (!evt)\n return {}\n\n // Text delta — the main streaming path\n if (evt.type === 'content_block_delta' && evt.delta?.type === 'text_delta') {\n return { textDelta: evt.delta.text }\n }\n\n // Tool use starting — get tool name early\n if (evt.type === 'content_block_start' && evt.content_block?.type === 'tool_use') {\n return { toolName: evt.content_block.name }\n }\n\n return {}\n }\n\n // Full assistant message (complete turn, after streaming)\n if (obj.type === 'assistant' && obj.message?.content) {\n const content = obj.message.content as any[]\n\n // Extract tool uses with inputs for progress hints\n const tools = content.filter((c: any) => c.type === 'tool_use')\n if (tools.length) {\n const names = tools.map((t: any) => t.name)\n // Extract useful hint from tool input (file path, query, etc)\n const hint = tools.map((t: any) => {\n const input = t.input || {}\n return input.file_path || input.path || input.pattern || input.query || input.command || ''\n }).filter(Boolean).join(', ')\n return { toolName: names.join(', '), toolHint: hint || undefined }\n }\n\n // Text content (fallback for non-partial mode)\n const text = content\n .filter((c: any) => c.type === 'text')\n .map((c: any) => c.text)\n .join('')\n if (text)\n return { fullText: text }\n }\n\n // Final result\n if (obj.type === 'result') {\n const u = obj.usage\n return {\n done: true,\n usage: u ? { input: u.input_tokens ?? u.inputTokens ?? 0, output: u.output_tokens ?? u.outputTokens ?? 0 } : undefined,\n cost: obj.total_cost_usd,\n turns: obj.num_turns,\n }\n }\n }\n catch {}\n return {}\n}\n\n/**\n * Parse gemini stream-json events\n * Gemini streams at turn level (full message per event)\n */\nfunction parseGeminiLine(line: string): ParsedEvent {\n try {\n const obj = JSON.parse(line)\n\n // Text message (delta or full)\n if (obj.type === 'message' && obj.role === 'assistant' && obj.content) {\n return obj.delta ? { textDelta: obj.content } : { fullText: obj.content }\n }\n\n // Tool invocation\n if (obj.type === 'tool_use' || obj.type === 'tool_call') {\n return { toolName: obj.name || obj.tool || 'tool' }\n }\n\n // Final result\n if (obj.type === 'result') {\n const s = obj.stats\n return {\n done: true,\n usage: s ? { input: s.input_tokens ?? s.input ?? 0, output: s.output_tokens ?? s.output ?? 0 } : undefined,\n turns: s?.tool_calls,\n }\n }\n }\n catch {}\n return {}\n}\n\n// ── Main ─────────────────────────────────────────────────────────────\n\nexport async function optimizeDocs(opts: OptimizeDocsOptions): Promise<OptimizeResult> {\n const { packageName, skillDir, model = 'sonnet', version, hasGithub, docFiles, onProgress, timeout = 180000, noCache, sections, customPrompt } = opts\n const prompt = buildSkillPrompt({ packageName, skillDir, version, hasGithub, docFiles, sections, customPrompt })\n\n // Cache check\n if (!noCache) {\n const cached = getCached(prompt, model)\n if (cached) {\n onProgress?.({ chunk: '[cached]', type: 'text', text: cached, reasoning: '' })\n return { optimized: cached, wasOptimized: true, finishReason: 'cached' }\n }\n }\n\n const cliConfig = CLI_MODELS[model]\n if (!cliConfig) {\n return { optimized: '', wasOptimized: false, error: `No CLI mapping for model: ${model}` }\n }\n\n const { cli, model: cliModel } = cliConfig\n const args = buildCliArgs(cli, cliModel, skillDir)\n const parseLine = cli === 'claude' ? parseClaudeLine : parseGeminiLine\n\n // Write prompt for debugging\n writeFileSync(join(skillDir, 'PROMPT.md'), prompt)\n\n const outputPath = join(skillDir, '__SKILL.md')\n\n return new Promise<OptimizeResult>((resolve) => {\n const proc = spawn(cli, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout,\n env: { ...process.env, NO_COLOR: '1' },\n })\n\n let buffer = ''\n let usage: { input: number, output: number } | undefined\n let cost: number | undefined\n\n onProgress?.({ chunk: '[starting...]', type: 'reasoning', text: '', reasoning: '' })\n\n proc.stdin.write(prompt)\n proc.stdin.end()\n\n proc.stdout.on('data', (chunk: Buffer) => {\n buffer += chunk.toString()\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.trim())\n continue\n const evt = parseLine(line)\n\n if (evt.toolName) {\n const hint = evt.toolHint\n ? `[${evt.toolName}: ${shortenPath(evt.toolHint)}]`\n : `[${evt.toolName}]`\n onProgress?.({ chunk: hint, type: 'reasoning', text: '', reasoning: hint })\n }\n\n if (evt.usage)\n usage = evt.usage\n if (evt.cost != null)\n cost = evt.cost\n }\n })\n\n let stderr = ''\n proc.stderr.on('data', (chunk: Buffer) => {\n stderr += chunk.toString()\n })\n\n proc.on('close', (code) => {\n // Drain remaining buffer for metadata\n if (buffer.trim()) {\n const evt = parseLine(buffer)\n if (evt.usage)\n usage = evt.usage\n if (evt.cost != null)\n cost = evt.cost\n }\n\n // Read agent output from __SKILL.md\n const optimized = existsSync(outputPath)\n ? readFileSync(outputPath, 'utf-8').trim()\n : ''\n\n if (!optimized && code !== 0) {\n resolve({ optimized: '', wasOptimized: false, error: stderr.trim() || `CLI exited with code ${code}` })\n return\n }\n\n if (!noCache && optimized) {\n setCache(prompt, model, optimized)\n }\n\n const usageResult = usage\n ? { inputTokens: usage.input, outputTokens: usage.output, totalTokens: usage.input + usage.output }\n : undefined\n\n resolve({\n optimized,\n wasOptimized: !!optimized,\n finishReason: code === 0 ? 'stop' : 'error',\n usage: usageResult,\n cost,\n })\n })\n\n proc.on('error', (err) => {\n resolve({ optimized: '', wasOptimized: false, error: err.message })\n })\n })\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\n/** Shorten absolute paths for display: /home/.../.skilld/docs/guide.md → docs/guide.md */\nfunction shortenPath(p: string): string {\n const refIdx = p.indexOf('.skilld/')\n if (refIdx !== -1)\n return p.slice(refIdx + '.skilld/'.length)\n // Keep just filename for other paths\n const parts = p.split('/')\n return parts.length > 2 ? `.../${parts.slice(-2).join('/')}` : p\n}\n"],"mappings":"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"}