skilld 0.0.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":[],"sources":["../src/optimize.ts","../src/cli.ts"],"sourcesContent":["/**\n * LLM-based documentation optimization\n * Extracts non-obvious best practices and public APIs from raw docs\n */\n\nimport { execSync } from 'node:child_process'\nimport type { AgentType } from './agents'\n\nexport interface AvailableModel {\n id: 'haiku' | 'sonnet' | 'opus'\n name: string\n description: string\n available: boolean\n}\n\n/**\n * Get available optimization models\n */\nexport async function getAvailableModels(): Promise<AvailableModel[]> {\n const models: AvailableModel[] = []\n\n // Check if claude CLI is available\n const hasClaude = (() => {\n try {\n execSync('which claude', { stdio: 'ignore' })\n return true\n }\n catch {\n return false\n }\n })()\n\n if (hasClaude) {\n models.push(\n { id: 'haiku', name: 'Haiku', description: 'Fast and cheap', available: true },\n { id: 'sonnet', name: 'Sonnet', description: 'Balanced', available: true },\n { id: 'opus', name: 'Opus', description: 'Most capable', available: true },\n )\n }\n\n // Check Anthropic SDK\n if (process.env.ANTHROPIC_API_KEY) {\n if (models.length === 0) {\n models.push(\n { id: 'haiku', name: 'Haiku (API)', description: 'Fast and cheap', available: true },\n { id: 'sonnet', name: 'Sonnet (API)', description: 'Balanced', available: true },\n )\n }\n }\n\n return models\n}\n\nconst OPTIMIZE_PROMPT = `You are a technical documentation optimizer for coding agents.\n\nYour task: Transform raw package documentation into a concise skill reference focused on what an AI coding assistant needs.\n\n## EXTRACT THESE (IMPORTANT):\n\n### 1. Public API Reference\n- All exported functions, components, composables with their signatures\n- Required vs optional parameters and their types\n- Return types and what they represent\n- Export names exactly as they should be imported\n\n### 2. Non-Obvious Best Practices\n- Gotchas and common mistakes developers make\n- Edge cases that cause bugs\n- Performance considerations (what's expensive, what to cache)\n- Order-of-operations requirements\n- Initialization patterns that aren't obvious\n- When NOT to use certain features\n\n### 3. Integration Patterns\n- How this integrates with common frameworks/tools\n- Required peer dependencies and version constraints\n- Configuration that's easy to get wrong\n\n## REMOVE THESE:\n- Installation instructions (npm install, etc.)\n- Badges, shields, contributor info\n- License information\n- Changelog/version history\n- Generic \"what is this\" introductions\n- Marketing language\n- Links to external resources (keep inline code examples)\n\n## OUTPUT FORMAT:\nUse clear markdown with code blocks. Be dense and direct - no filler. Prefer tables for API references.\nOrganize as: Quick Reference → API → Best Practices → Gotchas\n\n## INPUT DOCUMENTATION:\n`\n\nexport type OptimizeModel = AvailableModel['id']\n\n/**\n * Optimize documentation using the detected LLM agent\n * Falls back gracefully if no LLM available\n */\nexport async function optimizeDocs(\n content: string,\n packageName: string,\n agent: AgentType | null,\n model: OptimizeModel = 'haiku',\n): Promise<{ optimized: string, wasOptimized: boolean }> {\n // Try Claude Code first (most common)\n if (agent === 'claude-code' || !agent) {\n const result = await tryClaudeCode(content, packageName, model)\n if (result) return { optimized: result, wasOptimized: true }\n }\n\n // Fallback: try Anthropic SDK if API key available\n if (process.env.ANTHROPIC_API_KEY) {\n const result = await tryAnthropicSDK(content, packageName, model)\n if (result) return { optimized: result, wasOptimized: true }\n }\n\n // No LLM available, return original\n return { optimized: content, wasOptimized: false }\n}\n\nasync function tryClaudeCode(content: string, packageName: string, model: OptimizeModel): Promise<string | null> {\n try {\n // Check if claude CLI exists\n execSync('which claude', { stdio: 'ignore' })\n\n const prompt = `${OPTIMIZE_PROMPT}\\n\\nPackage: ${packageName}\\n\\n${content}`\n\n // Write prompt to temp file to avoid shell escaping issues\n const tempFile = `/tmp/skilld-optimize-${Date.now()}.txt`\n const { writeFileSync, unlinkSync } = await import('node:fs')\n writeFileSync(tempFile, prompt)\n\n try {\n const result = execSync(\n `claude --model ${model} --print < \"${tempFile}\"`,\n {\n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024, // 10MB\n timeout: 180_000, // 3 min for larger models\n },\n )\n return result.trim()\n }\n finally {\n unlinkSync(tempFile)\n }\n }\n catch {\n return null\n }\n}\n\nconst MODEL_MAP: Record<OptimizeModel, string> = {\n haiku: 'claude-3-5-haiku-latest',\n sonnet: 'claude-sonnet-4-20250514',\n opus: 'claude-opus-4-20250514',\n}\n\nasync function tryAnthropicSDK(content: string, packageName: string, model: OptimizeModel): Promise<string | null> {\n try {\n // Dynamic import to avoid requiring the SDK if not used\n // @ts-expect-error - optional dependency\n const { default: Anthropic } = await import('@anthropic-ai/sdk')\n const client = new Anthropic()\n\n const response = await client.messages.create({\n model: MODEL_MAP[model],\n max_tokens: 8192,\n messages: [{\n role: 'user',\n content: `${OPTIMIZE_PROMPT}\\n\\nPackage: ${packageName}\\n\\n${content}`,\n }],\n })\n\n const textBlock = response.content.find((b: { type: string, text?: string }) => b.type === 'text') as { type: 'text', text: string } | undefined\n return textBlock?.text || null\n }\n catch {\n return null\n }\n}\n","#!/usr/bin/env node\nimport { join } from 'node:path'\nimport { defineCommand, runMain } from 'citty'\nimport consola from 'consola'\nimport { generateSkill } from './index'\nimport { getInstalledSkillVersion, readLocalDependencies, resolvePackageDocs } from './npm'\nimport { agents, detectCurrentAgent, generateSkillMd, installSkillForAgents, sanitizeName } from './agents'\nimport { type OptimizeModel, getAvailableModels, optimizeDocs } from './optimize'\n\nconst main = defineCommand({\n meta: {\n name: 'skilld',\n description: 'Generate searchable skills from documentation sites or package.json dependencies',\n },\n args: {\n url: {\n type: 'positional',\n description: 'URL or package name (omit to process package.json deps)',\n required: false,\n },\n output: {\n type: 'string',\n alias: 'o',\n description: 'Output directory (legacy mode)',\n },\n maxPages: {\n type: 'string',\n alias: 'm',\n description: 'Max pages to fetch',\n default: '100',\n },\n chunkSize: {\n type: 'string',\n description: 'Chunk size in characters',\n default: '1000',\n },\n model: {\n type: 'string',\n description: 'Embedding model',\n default: 'Xenova/bge-small-en-v1.5',\n },\n crawl: {\n type: 'boolean',\n description: 'Skip llms.txt and always crawl',\n default: false,\n },\n concurrency: {\n type: 'string',\n alias: 'c',\n description: 'Concurrent package processing',\n default: '3',\n },\n global: {\n type: 'boolean',\n alias: 'g',\n description: 'Install skills globally',\n default: false,\n },\n agent: {\n type: 'string',\n alias: 'a',\n description: 'Target specific agent (claude-code, cursor, windsurf, etc.)',\n },\n force: {\n type: 'boolean',\n alias: 'f',\n description: 'Force regenerate even if version matches',\n default: false,\n },\n optimize: {\n type: 'boolean',\n description: 'Optimize docs with LLM (extracts APIs & best practices)',\n default: true,\n },\n yes: {\n type: 'boolean',\n alias: 'y',\n description: 'Skip prompts, use defaults',\n default: false,\n },\n },\n async run({ args }) {\n const maxPages = Number.parseInt(args.maxPages, 10)\n const chunkSize = Number.parseInt(args.chunkSize, 10)\n const concurrency = Number.parseInt(args.concurrency, 10)\n\n // Detect current agent (the one running this command)\n const currentAgent = detectCurrentAgent()\n\n if (!currentAgent && !args.agent && !args.output) {\n consola.warn('Could not detect which agent is running. Use --agent <name> or --output <dir>')\n consola.info('Supported agents: ' + Object.keys(agents).join(', '))\n return\n }\n\n const targetAgents = args.agent\n ? [args.agent as keyof typeof agents]\n : currentAgent\n ? [currentAgent]\n : []\n\n if (targetAgents.length > 0) {\n consola.info(`Target agent: ${targetAgents.map(a => agents[a].displayName).join(', ')}`)\n }\n\n // Single URL/package mode\n if (args.url) {\n await processUrl(args.url, {\n outputDir: args.output,\n maxPages,\n chunkSize,\n skipLlmsTxt: args.crawl,\n model: args.model,\n global: args.global,\n agents: targetAgents,\n optimize: args.optimize,\n currentAgent,\n })\n return\n }\n\n // Package.json mode\n consola.start('Reading package.json dependencies...')\n\n const allDeps = await readLocalDependencies(process.cwd())\n if (allDeps.length === 0) {\n consola.warn('No dependencies found in package.json')\n return\n }\n\n // Categorize deps: needs update vs up-to-date\n const needsUpdate: typeof allDeps = []\n const upToDate: typeof allDeps = []\n\n for (const dep of allDeps) {\n if (args.force) {\n needsUpdate.push(dep)\n continue\n }\n\n if (targetAgents.length > 0) {\n const agent = agents[targetAgents[0]]\n const skillDir = join(process.cwd(), agent.skillsDir, sanitizeName(dep.name))\n const installedVersion = await getInstalledSkillVersion(skillDir)\n\n if (installedVersion && installedVersion === dep.version) {\n upToDate.push(dep)\n }\n else {\n needsUpdate.push(dep)\n }\n }\n else {\n needsUpdate.push(dep)\n }\n }\n\n if (needsUpdate.length === 0) {\n consola.success(`All ${allDeps.length} skills are up-to-date`)\n return\n }\n\n consola.info(`Found ${needsUpdate.length} packages to sync (${upToDate.length} up-to-date)`)\n\n // Prompt for package selection (unless --yes)\n let selectedDeps = needsUpdate\n if (!args.yes && needsUpdate.length > 1) {\n const choices = needsUpdate.map(d => ({\n label: `${d.name}@${d.version}`,\n value: d.name,\n }))\n\n const selected = await consola.prompt('Select packages to sync:', {\n type: 'multiselect',\n options: choices,\n initial: choices.map(c => c.value), // all selected by default\n }) as string[]\n\n if (!selected || selected.length === 0) {\n consola.warn('No packages selected')\n return\n }\n\n selectedDeps = needsUpdate.filter(d => selected.includes(d.name))\n }\n\n // Prompt for optimization model (unless --yes or --no-optimize)\n let optimizeModel: OptimizeModel | null = null\n if (args.optimize && !args.yes) {\n const availableModels = await getAvailableModels()\n if (availableModels.length > 0) {\n const modelChoice = await consola.prompt('Optimize with LLM?', {\n type: 'select',\n options: [\n ...availableModels.map(m => ({\n label: `${m.name} ${m.available ? '(available)' : ''}`,\n value: m.id,\n hint: m.description,\n })),\n { label: 'Skip optimization', value: 'skip' },\n ],\n initial: availableModels[0]?.id || 'skip',\n }) as string\n\n optimizeModel = modelChoice === 'skip' ? null : modelChoice as OptimizeModel\n }\n }\n else if (args.optimize) {\n optimizeModel = 'haiku' // default for --yes\n }\n\n const queue = [...selectedDeps]\n let processed = 0\n let failed = 0\n\n const worker = async () => {\n while (queue.length > 0) {\n const dep = queue.shift()\n if (!dep) break\n\n const { name: packageName, version: localVersion } = dep\n\n try {\n consola.start(`[${processed + failed + 1}/${selectedDeps.length}] ${packageName}@${localVersion}`)\n\n const resolved = await resolvePackageDocs(packageName)\n if (!resolved) {\n consola.warn(` No docs found for ${packageName}`)\n failed++\n continue\n }\n\n const url = resolved.llmsUrl || resolved.docsUrl || resolved.readmeUrl\n if (!url) {\n consola.warn(` No URL resolved for ${packageName}`)\n failed++\n continue\n }\n\n await processUrl(url, {\n outputDir: args.output,\n maxPages,\n chunkSize,\n skipLlmsTxt: args.crawl,\n model: args.model,\n global: args.global,\n agents: targetAgents,\n packageName,\n packageVersion: localVersion,\n quiet: true,\n optimize: !!optimizeModel,\n optimizeModel,\n currentAgent,\n })\n\n processed++\n consola.success(` Generated skill for ${packageName}@${localVersion}`)\n }\n catch (e: any) {\n consola.error(` Failed: ${e.message}`)\n failed++\n }\n }\n }\n\n await Promise.all(Array.from({ length: concurrency }, () => worker()))\n\n consola.box(`Generated ${processed} skills (${upToDate.length} up-to-date, ${failed} failed)`)\n },\n})\n\nasync function processUrl(url: string, config: {\n outputDir?: string\n maxPages: number\n chunkSize: number\n skipLlmsTxt: boolean\n model: string\n global: boolean\n agents: Array<keyof typeof agents>\n packageName?: string\n packageVersion?: string\n quiet?: boolean\n optimize?: boolean\n optimizeModel?: OptimizeModel | null\n currentAgent?: ReturnType<typeof detectCurrentAgent>\n}) {\n let resolvedUrl = url\n let skillName = config.packageName\n let skillVersion: string | undefined = config.packageVersion\n let isRawReadme = false\n let description = ''\n\n // Check if it's a package name (no protocol)\n if (!url.includes('://') && !url.startsWith('http')) {\n if (!config.quiet) consola.start(`Resolving docs for package: ${url}`)\n skillName = url\n\n const resolved = await resolvePackageDocs(url)\n if (!resolved) {\n consola.error(`Could not find docs for package: ${url}`)\n return\n }\n\n description = resolved.description || ''\n // Use provided version (from package.json) or fallback to npm registry version\n skillVersion = skillVersion || resolved.version\n\n // Prioritize: llms.txt > docs site > raw README\n if (resolved.llmsUrl) {\n resolvedUrl = resolved.llmsUrl\n }\n else if (resolved.docsUrl) {\n resolvedUrl = resolved.docsUrl\n }\n else if (resolved.readmeUrl) {\n resolvedUrl = resolved.readmeUrl\n isRawReadme = true\n }\n else {\n consola.error(`No documentation found for ${url}`)\n return\n }\n\n if (!config.quiet) consola.info(`Resolved to: ${resolvedUrl}${isRawReadme ? ' (README)' : ''}`)\n }\n\n // Raw README: fetch directly and create simple skill\n if (isRawReadme || resolvedUrl.includes('raw.githubusercontent.com') || resolvedUrl.startsWith('ungh://')) {\n if (!config.quiet) consola.start(`Fetching README for ${skillName || 'package'}`)\n\n let readmeContent: string\n\n // Handle ungh:// URLs (JSON API)\n if (resolvedUrl.startsWith('ungh://')) {\n const parts = resolvedUrl.replace('ungh://', '').split('/')\n const owner = parts[0]\n const repo = parts[1]\n const subdir = parts.slice(2).join('/')\n\n const unghUrl = subdir\n ? `https://ungh.cc/repos/${owner}/${repo}/files/main/${subdir}/README.md`\n : `https://ungh.cc/repos/${owner}/${repo}/readme`\n\n const res = await fetch(unghUrl, {\n headers: { 'User-Agent': 'skilld/1.0' },\n }).catch(() => null)\n\n if (!res?.ok) {\n consola.error(`Failed to fetch README from ungh: ${res?.status}`)\n return\n }\n\n const text = await res.text()\n\n // Try to parse as JSON first\n try {\n const json = JSON.parse(text) as { markdown?: string, file?: { contents?: string } }\n readmeContent = json.markdown || json.file?.contents || ''\n }\n catch {\n // If JSON parse fails, treat as raw markdown\n readmeContent = text\n }\n }\n else {\n // Direct raw URL\n const res = await fetch(resolvedUrl, {\n headers: { 'User-Agent': 'skilld/1.0' },\n }).catch(() => null)\n\n if (!res?.ok) {\n consola.error(`Failed to fetch README: ${res?.status}`)\n return\n }\n\n readmeContent = await res.text()\n }\n\n if (!readmeContent) {\n consola.error('README content is empty')\n return\n }\n\n const name = skillName || 'package'\n\n // Optimize docs with LLM if enabled\n let finalContent = readmeContent\n if (config.optimize !== false && config.optimizeModel) {\n const spinner = !config.quiet ? consola.start(`Optimizing ${name} with ${config.optimizeModel}...`) : null\n const { optimized, wasOptimized } = await optimizeDocs(\n readmeContent,\n name,\n config.currentAgent || null,\n config.optimizeModel,\n )\n finalContent = optimized\n if (!config.quiet && wasOptimized) {\n consola.success(`Optimized: ${readmeContent.length} → ${optimized.length} chars`)\n }\n else if (!config.quiet && !wasOptimized) {\n consola.warn(`Optimization skipped (no LLM available)`)\n }\n }\n\n const skillContent = generateSkillMd(\n { name, version: skillVersion, description },\n finalContent,\n )\n\n // Install to agents\n const { installed, paths } = installSkillForAgents(name, skillContent, {\n global: config.global,\n agents: config.agents,\n })\n\n if (!config.quiet) {\n consola.success(`Installed skill: ${name}`)\n consola.info(` Agents: ${installed.map(a => agents[a].displayName).join(', ')}`)\n consola.info(` Paths: ${paths.join(', ')}`)\n }\n return\n }\n\n if (!config.quiet) consola.start(`Generating skill from ${resolvedUrl}`)\n\n // Legacy mode: output to specific directory\n if (config.outputDir) {\n const result = await generateSkill({\n url: resolvedUrl,\n outputDir: config.outputDir,\n maxPages: config.maxPages,\n chunkSize: config.chunkSize,\n skipLlmsTxt: config.skipLlmsTxt,\n model: config.model,\n }, config.quiet ? undefined : ({ url: pageUrl, count, phase }) => {\n const icon = phase === 'fetch' ? '📄' : '🔍'\n consola.info(`${icon} [${count}] ${pageUrl}`)\n })\n\n if (!config.quiet) {\n consola.success(`Generated skill: ${result.siteName}`)\n consola.info(` SKILL.md: ${result.skillPath}`)\n consola.info(` References: ${result.referencesDir}`)\n consola.info(` Database: ${result.dbPath}`)\n consola.info(` Chunks: ${result.chunkCount}`)\n }\n return\n }\n\n // Agent mode: crawl/index then install to detected agents\n const result = await generateSkill({\n url: resolvedUrl,\n outputDir: '.skilld-temp',\n maxPages: config.maxPages,\n chunkSize: config.chunkSize,\n skipLlmsTxt: config.skipLlmsTxt,\n model: config.model,\n }, config.quiet ? undefined : ({ url: pageUrl, count, phase }) => {\n if (phase === 'fetch' && count % 5 === 0) {\n consola.info(` [${count}] ${pageUrl}`)\n }\n })\n\n // Generate skill content\n const name = skillName || result.siteName\n const body = `# ${name}\n\nThis skill provides searchable documentation for ${name}.\n\n## Search Database\n- Path: ${result.dbPath}\n- Chunks indexed: ${result.chunkCount}\n\n## References\nIndividual documentation chunks are available in the references directory.\n`\n\n const skillContent = generateSkillMd(\n { name, version: skillVersion, description },\n body,\n )\n\n // Install to agents\n const { installed, paths } = installSkillForAgents(name, skillContent, {\n global: config.global,\n agents: config.agents,\n })\n\n if (!config.quiet) {\n consola.success(`Installed skill: ${name}`)\n consola.info(` Agents: ${installed.map(a => agents[a].displayName).join(', ')}`)\n consola.info(` Paths: ${paths.join(', ')}`)\n consola.info(` Chunks: ${result.chunkCount}`)\n }\n}\n\nrunMain(main)\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":["require","getLastSynced"],"sources":["../src/core/config.ts","../src/commands/config.ts","../src/core/lockfile.ts","../src/commands/install.ts","../src/core/skills.ts","../src/commands/remove.ts","../src/core/formatting.ts","../src/commands/search.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/uninstall.ts","../src/commands/wizard.ts","../src/cli.ts"],"sourcesContent":["import type { OptimizeModel } from '../agent'\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nexport interface FeaturesConfig {\n search: boolean\n issues: boolean\n discussions: boolean\n releases: boolean\n}\n\nexport const defaultFeatures: FeaturesConfig = {\n search: true,\n issues: false,\n discussions: false,\n releases: true,\n}\n\nexport interface SkilldConfig {\n model?: OptimizeModel\n agent?: string\n features?: FeaturesConfig\n projects?: string[]\n skipLlm?: boolean\n}\n\nconst CONFIG_DIR = join(homedir(), '.skilld')\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.yaml')\n\nexport function hasConfig(): boolean {\n return existsSync(CONFIG_PATH)\n}\n\nexport function readConfig(): SkilldConfig {\n if (!existsSync(CONFIG_PATH))\n return {}\n\n const content = readFileSync(CONFIG_PATH, 'utf-8')\n const config: SkilldConfig = {}\n let inBlock: 'projects' | 'features' | null = null\n const projects: string[] = []\n const features: Partial<FeaturesConfig> = {}\n\n for (const line of content.split('\\n')) {\n if (line.startsWith('projects:')) {\n inBlock = 'projects'\n continue\n }\n if (line.startsWith('features:')) {\n inBlock = 'features'\n continue\n }\n if (inBlock === 'projects') {\n if (line.startsWith(' - ')) {\n projects.push(line.slice(4).trim().replace(/^[\"']|[\"']$/g, ''))\n continue\n }\n inBlock = null\n }\n if (inBlock === 'features') {\n const m = line.match(/^ {2}(\\w+):\\s*(.+)/)\n if (m) {\n const key = m[1] as keyof FeaturesConfig\n if (key in defaultFeatures)\n features[key] = m[2] === 'true'\n continue\n }\n inBlock = null\n }\n const [key, ...rest] = line.split(':')\n const value = rest.join(':').trim().replace(/^[\"']|[\"']$/g, '')\n if (key === 'model' && value)\n config.model = value as OptimizeModel\n if (key === 'agent' && value)\n config.agent = value\n if (key === 'skipLlm')\n config.skipLlm = value === 'true'\n }\n\n if (projects.length > 0)\n config.projects = projects\n if (Object.keys(features).length > 0)\n config.features = { ...defaultFeatures, ...features }\n return config\n}\n\nexport function writeConfig(config: SkilldConfig): void {\n mkdirSync(CONFIG_DIR, { recursive: true })\n\n let yaml = ''\n if (config.model)\n yaml += `model: ${config.model}\\n`\n if (config.agent)\n yaml += `agent: ${config.agent}\\n`\n if (config.skipLlm)\n yaml += `skipLlm: true\\n`\n if (config.features) {\n yaml += 'features:\\n'\n for (const [k, v] of Object.entries(config.features)) {\n yaml += ` ${k}: ${v}\\n`\n }\n }\n if (config.projects?.length) {\n yaml += 'projects:\\n'\n for (const p of config.projects) {\n yaml += ` - ${p}\\n`\n }\n }\n\n writeFileSync(CONFIG_PATH, yaml)\n}\n\nexport function updateConfig(updates: Partial<SkilldConfig>): void {\n const config = readConfig()\n writeConfig({ ...config, ...updates })\n}\n\nexport function registerProject(projectPath: string): void {\n const config = readConfig()\n const projects = new Set(config.projects || [])\n projects.add(projectPath)\n writeConfig({ ...config, projects: [...projects] })\n}\n\nexport function unregisterProject(projectPath: string): void {\n const config = readConfig()\n const projects = (config.projects || []).filter(p => p !== projectPath)\n writeConfig({ ...config, projects })\n}\n\nexport function getRegisteredProjects(): string[] {\n return readConfig().projects || []\n}\n","import type { FeaturesConfig } from '../core/config'\nimport * as p from '@clack/prompts'\nimport { agents, getAvailableModels } from '../agent'\nimport { defaultFeatures, readConfig, updateConfig } from '../core/config'\n\nexport async function configCommand(): Promise<void> {\n const config = readConfig()\n\n const features = config.features ?? defaultFeatures\n const enabledCount = Object.values(features).filter(Boolean).length\n\n const action = await p.select({\n message: 'Settings',\n options: [\n { label: 'Change features', value: 'features', hint: `${enabledCount}/4 enabled` },\n { label: 'Change model', value: 'model', hint: config.model || 'auto' },\n { label: 'Change agent', value: 'agent', hint: config.agent || 'auto-detect' },\n ],\n })\n\n if (p.isCancel(action)) {\n p.cancel('Cancelled')\n return\n }\n\n switch (action) {\n case 'features': {\n const featureOptions = [\n { label: 'Semantic + token search', value: 'search' as const, hint: 'local query engine to cut token costs and speed up grep' },\n { label: 'Release notes', value: 'releases' as const, hint: 'track changelogs for installed packages' },\n { label: 'GitHub issues', value: 'issues' as const, hint: 'surface common problems and solutions' },\n { label: 'GitHub discussions', value: 'discussions' as const, hint: 'include Q&A and community knowledge' },\n ] as const\n\n const selected = await p.multiselect({\n message: 'Enable features',\n options: featureOptions.map(f => ({\n label: f.label,\n value: f.value,\n hint: f.hint,\n })),\n initialValues: Object.entries(features)\n .filter(([, v]) => v)\n .map(([k]) => k) as Array<keyof FeaturesConfig>,\n required: false,\n })\n\n if (p.isCancel(selected))\n return\n\n const updated: FeaturesConfig = {\n search: selected.includes('search'),\n issues: selected.includes('issues'),\n discussions: selected.includes('discussions'),\n releases: selected.includes('releases'),\n }\n updateConfig({ features: updated })\n p.log.success(`Features updated: ${selected.length} enabled`)\n break\n }\n\n case 'model': {\n const available = await getAvailableModels()\n if (available.length === 0) {\n p.log.warn('No LLM CLIs found')\n return\n }\n\n const model = await p.select({\n message: 'Select default model',\n options: [\n { label: 'Auto (prompt each time)', value: '' },\n ...available.map(m => ({\n label: m.recommended ? `${m.name} (Recommended)` : m.name,\n value: m.id,\n hint: m.hint,\n })),\n ],\n initialValue: config.model || '',\n })\n\n if (p.isCancel(model))\n return\n\n updateConfig({ model: (model || undefined) as typeof config.model })\n p.log.success(model ? `Default model set to ${model}` : 'Model will be prompted each time')\n break\n }\n\n case 'agent': {\n const agentChoice = await p.select({\n message: 'Select default agent',\n options: [\n { label: 'Auto-detect', value: '' },\n ...Object.entries(agents).map(([id, a]) => ({\n label: a.displayName,\n value: id,\n hint: a.skillsDir,\n })),\n ],\n initialValue: config.agent || '',\n })\n\n if (p.isCancel(agentChoice))\n return\n\n updateConfig({ agent: agentChoice || undefined })\n p.log.success(agentChoice ? `Default agent set to ${agentChoice}` : 'Agent will be auto-detected')\n break\n }\n }\n}\n","import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport interface SkillInfo {\n packageName?: string\n version?: string\n source?: string\n syncedAt?: string\n generator?: string\n}\n\nexport interface SkilldLock {\n skills: Record<string, SkillInfo>\n}\n\nexport function parseSkillFrontmatter(skillPath: string): SkillInfo | null {\n if (!existsSync(skillPath))\n return null\n const content = readFileSync(skillPath, 'utf-8')\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/)\n if (!match)\n return null\n\n const info: SkillInfo = {}\n const lines = match[1].split('\\n')\n for (const line of lines) {\n const [key, ...rest] = line.split(':')\n const value = rest.join(':').trim().replace(/^[\"']|[\"']$/g, '')\n if (key === 'packageName')\n info.packageName = value\n if (key === 'version')\n info.version = value\n if (key === 'source')\n info.source = value\n if (key === 'syncedAt')\n info.syncedAt = value\n if (key === 'generator')\n info.generator = value\n }\n return info\n}\n\nexport function readLock(skillsDir: string): SkilldLock | null {\n const lockPath = join(skillsDir, 'skilld-lock.yaml')\n if (!existsSync(lockPath))\n return null\n const content = readFileSync(lockPath, 'utf-8')\n\n const skills: Record<string, SkillInfo> = {}\n let currentSkill: string | null = null\n\n for (const line of content.split('\\n')) {\n const skillMatch = line.match(/^ {2}(\\S+):$/)\n if (skillMatch) {\n currentSkill = skillMatch[1]\n skills[currentSkill] = {}\n continue\n }\n if (currentSkill && line.startsWith(' ')) {\n const [key, ...rest] = line.trim().split(':')\n const value = rest.join(':').trim().replace(/^[\"']|[\"']$/g, '')\n if (key && value)\n (skills[currentSkill] as any)[key] = value\n }\n }\n return { skills }\n}\n\nexport function writeLock(skillsDir: string, skillName: string, info: SkillInfo): void {\n const lockPath = join(skillsDir, 'skilld-lock.yaml')\n let lock: SkilldLock = { skills: {} }\n if (existsSync(lockPath)) {\n lock = readLock(skillsDir) || { skills: {} }\n }\n lock.skills[skillName] = info\n\n let yaml = 'skills:\\n'\n for (const [name, skill] of Object.entries(lock.skills)) {\n yaml += ` ${name}:\\n`\n if (skill.packageName)\n yaml += ` packageName: \"${skill.packageName}\"\\n`\n if (skill.version)\n yaml += ` version: \"${skill.version}\"\\n`\n if (skill.source)\n yaml += ` source: \"${skill.source}\"\\n`\n if (skill.syncedAt)\n yaml += ` syncedAt: \"${skill.syncedAt}\"\\n`\n if (skill.generator)\n yaml += ` generator: \"${skill.generator}\"\\n`\n }\n writeFileSync(lockPath, yaml)\n}\n\nexport function removeLockEntry(skillsDir: string, skillName: string): void {\n const lockPath = join(skillsDir, 'skilld-lock.yaml')\n const lock = readLock(skillsDir)\n if (!lock)\n return\n\n delete lock.skills[skillName]\n\n if (Object.keys(lock.skills).length === 0) {\n // Remove empty lock file\n unlinkSync(lockPath)\n return\n }\n\n let yaml = 'skills:\\n'\n for (const [name, skill] of Object.entries(lock.skills)) {\n yaml += ` ${name}:\\n`\n if (skill.packageName)\n yaml += ` packageName: \"${skill.packageName}\"\\n`\n if (skill.version)\n yaml += ` version: \"${skill.version}\"\\n`\n if (skill.source)\n yaml += ` source: \"${skill.source}\"\\n`\n if (skill.syncedAt)\n yaml += ` syncedAt: \"${skill.syncedAt}\"\\n`\n if (skill.generator)\n yaml += ` generator: \"${skill.generator}\"\\n`\n }\n writeFileSync(lockPath, yaml)\n}\n","/**\n * Install command - restore .skilld/ from lockfile without regenerating SKILL.md\n *\n * After cloning a repo, the .skilld/ symlinks are missing (gitignored).\n * This command recreates them from the lockfile:\n * .claude/skills/<skill>/.skilld/pkg -> node_modules/<pkg> (always)\n * .claude/skills/<skill>/.skilld/docs -> ~/.skilld/references/<pkg>@<version>/docs (if external)\n */\n\nimport type { AgentType } from '../agent'\nimport type { SkillInfo } from '../core/lockfile'\nimport { existsSync, lstatSync, mkdirSync, readdirSync, symlinkSync, unlinkSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { agents } from '../agent'\nimport {\n ensureCacheDir,\n getCacheDir,\n getPackageDbPath,\n getShippedSkills,\n isCached,\n linkShippedSkill,\n resolvePkgDir,\n writeToCache,\n} from '../cache'\nimport { readLock } from '../core/lockfile'\nimport { createIndex } from '../retriv'\nimport {\n downloadLlmsDocs,\n fetchGitDocs,\n fetchLlmsTxt,\n fetchReadmeContent,\n normalizeLlmsLinks,\n parseGitHubUrl,\n resolveEntryFiles,\n resolvePackageDocs,\n} from '../sources'\n\nexport interface InstallOptions {\n global: boolean\n agent: AgentType\n}\n\nexport async function installCommand(opts: InstallOptions): Promise<void> {\n const cwd = process.cwd()\n const agent = agents[opts.agent]\n const skillsDir = opts.global\n // eslint-disable-next-line ts/no-require-imports\n ? join(require('node:os').homedir(), '.skilld', 'skills')\n : join(cwd, agent.skillsDir)\n\n const lock = readLock(skillsDir)\n if (!lock || Object.keys(lock.skills).length === 0) {\n p.log.warn('No skilld-lock.yaml found. Run `skilld` to sync skills first.')\n return\n }\n\n const skills = Object.entries(lock.skills)\n const toRestore: Array<{ name: string, info: SkillInfo }> = []\n\n // Find skills with missing/broken references symlinks\n for (const [name, info] of skills) {\n if (!info.version)\n continue\n\n // Shipped skills: the skill dir IS the symlink, no references/ subdir\n if (info.source === 'shipped') {\n const skillDir = join(skillsDir, name)\n if (!existsSync(skillDir)) {\n toRestore.push({ name, info })\n }\n continue\n }\n\n const skillDir = join(skillsDir, name)\n const referencesPath = join(skillDir, '.skilld')\n const skillMdPath = join(skillDir, 'SKILL.md')\n\n // Check if skill dir is missing entirely, or has broken symlinks\n const needsRestore = !existsSync(skillDir)\n || !existsSync(skillMdPath)\n || !existsSync(referencesPath)\n || (lstatSync(referencesPath).isSymbolicLink() && !existsSync(referencesPath))\n || (existsSync(skillMdPath) && lstatSync(skillMdPath).isSymbolicLink() && !existsSync(skillMdPath))\n\n if (needsRestore) {\n toRestore.push({ name, info })\n }\n }\n\n if (toRestore.length === 0) {\n p.log.success('All references already linked')\n return\n }\n\n p.log.info(`Restoring ${toRestore.length} references`)\n ensureCacheDir()\n\n for (const { name, info } of toRestore) {\n const version = info.version!\n const pkgName = info.packageName || unsanitizeName(name, info.source)\n\n // Shipped skills: re-link from node_modules or cached dist\n if (info.source === 'shipped') {\n const shipped = getShippedSkills(pkgName, cwd, version)\n const match = shipped.find(s => s.skillName === name)\n if (match) {\n linkShippedSkill(skillsDir, name, match.skillDir)\n p.log.success(`Linked ${name}`)\n }\n else {\n p.log.warn(`${name}: package ${pkgName} no longer ships this skill`)\n }\n continue\n }\n\n const skillDir = join(skillsDir, name)\n const referencesPath = join(skillDir, '.skilld')\n const globalCachePath = getCacheDir(pkgName, version)\n const spin = p.spinner()\n\n // Check if already in global cache - just create symlinks\n if (isCached(pkgName, version)) {\n spin.start(`Linking ${name}`)\n mkdirSync(skillDir, { recursive: true })\n mkdirSync(referencesPath, { recursive: true })\n linkPkgSymlink(referencesPath, pkgName, cwd, version)\n // Only link external docs if package doesn't ship its own and has more than just README\n if (!pkgHasShippedDocs(pkgName, cwd, version) && !isReadmeOnly(globalCachePath)) {\n const docsLink = join(referencesPath, 'docs')\n const cachedDocs = join(globalCachePath, 'docs')\n if (existsSync(docsLink))\n unlinkSync(docsLink)\n if (existsSync(cachedDocs))\n symlinkSync(cachedDocs, docsLink, 'junction')\n }\n // Link github data and releases\n const githubLink = join(referencesPath, 'github')\n const cachedGithub = join(globalCachePath, 'github')\n if (existsSync(githubLink))\n unlinkSync(githubLink)\n if (existsSync(cachedGithub))\n symlinkSync(cachedGithub, githubLink, 'junction')\n const releasesLink = join(referencesPath, 'releases')\n const cachedReleases = join(globalCachePath, 'releases')\n if (existsSync(releasesLink))\n unlinkSync(releasesLink)\n if (existsSync(cachedReleases))\n symlinkSync(cachedReleases, releasesLink, 'junction')\n spin.stop(`Linked ${name}`)\n continue\n }\n\n // Need to download to global cache first\n spin.start(`Downloading ${name}@${version}`)\n\n const resolved = await resolvePackageDocs(pkgName, { version })\n\n if (!resolved) {\n spin.stop(`Could not resolve: ${name}`)\n continue\n }\n\n const cachedDocs: Array<{ path: string, content: string }> = []\n const docsToIndex: Array<{ id: string, content: string, metadata: Record<string, any> }> = []\n\n // Try git docs first\n if (resolved.gitDocsUrl && resolved.repoUrl) {\n const gh = parseGitHubUrl(resolved.repoUrl)\n if (gh) {\n const gitDocs = await fetchGitDocs(gh.owner, gh.repo, version, pkgName)\n if (gitDocs?.files.length) {\n const BATCH_SIZE = 20\n for (let i = 0; i < gitDocs.files.length; i += BATCH_SIZE) {\n const batch = gitDocs.files.slice(i, i + BATCH_SIZE)\n const results = await Promise.all(\n batch.map(async (file) => {\n const url = `${gitDocs.baseUrl}/${file}`\n const res = await fetch(url, { headers: { 'User-Agent': 'skilld/1.0' } }).catch(() => null)\n if (!res?.ok)\n return null\n return { file, content: await res.text() }\n }),\n )\n for (const r of results) {\n if (r) {\n const cachePath = gitDocs.docsPrefix ? r.file.replace(gitDocs.docsPrefix, '') : r.file\n cachedDocs.push({ path: cachePath, content: r.content })\n docsToIndex.push({ id: cachePath, content: r.content, metadata: { package: pkgName, source: cachePath, type: 'doc' } })\n }\n }\n }\n }\n }\n }\n\n // Try llms.txt\n if (resolved.llmsUrl && cachedDocs.length === 0) {\n const llmsContent = await fetchLlmsTxt(resolved.llmsUrl)\n if (llmsContent) {\n cachedDocs.push({ path: 'llms.txt', content: normalizeLlmsLinks(llmsContent.raw) })\n if (llmsContent.links.length > 0) {\n const baseUrl = resolved.docsUrl || new URL(resolved.llmsUrl).origin\n const docs = await downloadLlmsDocs(llmsContent, baseUrl)\n for (const doc of docs) {\n const localPath = doc.url.startsWith('/') ? doc.url.slice(1) : doc.url\n const cachePath = join('docs', ...localPath.split('/'))\n cachedDocs.push({ path: cachePath, content: doc.content })\n docsToIndex.push({ id: doc.url, content: doc.content, metadata: { package: pkgName, source: cachePath, type: 'doc' } })\n }\n }\n }\n }\n\n // Fallback to README\n if (resolved.readmeUrl && cachedDocs.length === 0) {\n const content = await fetchReadmeContent(resolved.readmeUrl)\n if (content) {\n cachedDocs.push({ path: 'docs/README.md', content })\n docsToIndex.push({ id: 'README.md', content, metadata: { package: pkgName, source: 'docs/README.md', type: 'doc' } })\n }\n }\n\n if (cachedDocs.length > 0) {\n writeToCache(pkgName, version, cachedDocs)\n\n mkdirSync(referencesPath, { recursive: true })\n linkPkgSymlink(referencesPath, pkgName, cwd, version)\n // Link fetched docs unless it's just a README (already in pkg/)\n if (!isReadmeOnly(globalCachePath)) {\n const docsLink = join(referencesPath, 'docs')\n const cachedDocsDir = join(globalCachePath, 'docs')\n if (existsSync(docsLink))\n unlinkSync(docsLink)\n if (existsSync(cachedDocsDir))\n symlinkSync(cachedDocsDir, docsLink, 'junction')\n }\n\n if (docsToIndex.length > 0) {\n await createIndex(docsToIndex, { dbPath: getPackageDbPath(pkgName, version) })\n }\n\n // Index package entry files (.d.ts / .js)\n const pkgDir = resolvePkgDir(pkgName, cwd, version)\n const entryFiles = pkgDir ? await resolveEntryFiles(pkgDir) : []\n if (entryFiles.length > 0) {\n await createIndex(entryFiles.map(e => ({\n id: e.path,\n content: e.content,\n metadata: { package: pkgName, source: `pkg/${e.path}`, type: e.type },\n })), { dbPath: getPackageDbPath(pkgName, version) })\n }\n\n spin.stop(`Downloaded and linked ${name}`)\n }\n else {\n spin.stop(`No docs found for ${name}`)\n }\n }\n\n p.outro('Install complete')\n}\n\n/** Try to recover original package name from sanitized name + source */\nfunction unsanitizeName(sanitized: string, source?: string): string {\n if (source?.includes('ungh://')) {\n const match = source.match(/ungh:\\/\\/([^/]+)\\/(.+)/)\n if (match)\n return `@${match[1]}/${match[2]}`\n }\n\n if (sanitized.startsWith('antfu-'))\n return `@antfu/${sanitized.slice(6)}`\n if (sanitized.startsWith('clack-'))\n return `@clack/${sanitized.slice(6)}`\n if (sanitized.startsWith('nuxt-'))\n return `@nuxt/${sanitized.slice(5)}`\n if (sanitized.startsWith('vue-'))\n return `@vue/${sanitized.slice(4)}`\n if (sanitized.startsWith('vueuse-'))\n return `@vueuse/${sanitized.slice(7)}`\n\n return sanitized\n}\n\n/** Create pkg symlink inside references dir (links to entire package or cached dist) */\nfunction linkPkgSymlink(referencesDir: string, name: string, cwd: string, version?: string): void {\n const pkgPath = resolvePkgDir(name, cwd, version)\n if (!pkgPath)\n return\n\n const pkgLink = join(referencesDir, 'pkg')\n if (existsSync(pkgLink))\n unlinkSync(pkgLink)\n symlinkSync(pkgPath, pkgLink, 'junction')\n}\n\n/** Check if cache only has docs/README.md (pkg/ already has this) */\nfunction isReadmeOnly(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\n/** Check if package ships its own docs folder */\nfunction pkgHasShippedDocs(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","import type { AgentType } from '../agent'\nimport type { SkillInfo } from './lockfile'\nimport { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { agents } from '../agent'\nimport { readLocalDependencies } from '../sources'\nimport { parseSkillFrontmatter, readLock } from './lockfile'\n\nexport interface SkillEntry {\n name: string\n dir: string\n agent: AgentType\n info: SkillInfo | null\n scope: 'local' | 'global'\n /** Original package name from package.json (e.g., @scope/pkg) */\n packageName?: string\n /** Latest version from package.json deps */\n latestVersion?: string\n}\n\nexport interface ProjectState {\n skills: SkillEntry[]\n deps: Map<string, string>\n missing: string[]\n outdated: SkillEntry[]\n synced: SkillEntry[]\n /** Skills in lockfile but not matched to any local dep */\n unmatched: SkillEntry[]\n}\n\nexport interface IterateSkillsOptions {\n scope?: 'local' | 'global' | 'all'\n agents?: AgentType[]\n cwd?: string\n}\n\nexport function* iterateSkills(opts: IterateSkillsOptions = {}): Generator<SkillEntry> {\n const { scope = 'all', cwd = process.cwd() } = opts\n const agentTypes = opts.agents ?? (Object.keys(agents) as AgentType[])\n\n for (const agentType of agentTypes) {\n const agent = agents[agentType]\n\n // Local skills\n if (scope === 'local' || scope === 'all') {\n const localDir = join(cwd, agent.skillsDir)\n if (existsSync(localDir)) {\n const lock = readLock(localDir)\n const entries = readdirSync(localDir).filter(f => !f.startsWith('.') && f !== 'skilld-lock.yaml')\n for (const name of entries) {\n const dir = join(localDir, name)\n // Only track skills in lockfile OR with generator: \"skilld\"\n if (lock?.skills[name]) {\n yield { name, dir, agent: agentType, info: lock.skills[name], scope: 'local' }\n }\n else {\n const info = parseSkillFrontmatter(join(dir, '_SKILL.md'))\n if (info?.generator === 'skilld') {\n yield { name, dir, agent: agentType, info, scope: 'local' }\n }\n }\n }\n }\n }\n\n // Global skills\n if ((scope === 'global' || scope === 'all') && agent.globalSkillsDir) {\n const globalDir = agent.globalSkillsDir\n if (existsSync(globalDir)) {\n const lock = readLock(globalDir)\n const entries = readdirSync(globalDir).filter(f => !f.startsWith('.') && f !== 'skilld-lock.yaml')\n for (const name of entries) {\n const dir = join(globalDir, name)\n // Only track skills in lockfile OR with generator: \"skilld\"\n if (lock?.skills[name]) {\n yield { name, dir, agent: agentType, info: lock.skills[name], scope: 'global' }\n }\n else {\n const info = parseSkillFrontmatter(join(dir, '_SKILL.md'))\n if (info?.generator === 'skilld') {\n yield { name, dir, agent: agentType, info, scope: 'global' }\n }\n }\n }\n }\n }\n }\n}\n\nexport function isOutdated(skill: SkillEntry, depVersion: string): boolean {\n if (!skill.info?.version)\n return true\n\n const skillMajorMinor = skill.info.version.split('.').slice(0, 2).join('.')\n const depMajorMinor = depVersion.replace(/^[\\^~]/, '').split('.').slice(0, 2).join('.')\n\n return skillMajorMinor !== depMajorMinor\n}\n\nexport async function getProjectState(cwd: string = process.cwd()): Promise<ProjectState> {\n const skills = [...iterateSkills({ scope: 'local', cwd })]\n\n // Get package.json deps\n const localDeps = await readLocalDependencies(cwd).catch(() => [])\n const deps = new Map(localDeps.map(d => [d.name, d.version]))\n\n // Build skill name -> entry map (for lookup by package name)\n const skillByName = new Map(skills.map(s => [s.name, s]))\n\n // Secondary lookup: packageName from lockfile (shipped skills have different names)\n const skillByPkgName = new Map<string, SkillEntry>()\n for (const s of skills) {\n if (s.info?.packageName)\n skillByPkgName.set(s.info.packageName, s)\n }\n\n const missing: string[] = []\n const outdated: SkillEntry[] = []\n const synced: SkillEntry[] = []\n const matchedSkillNames = new Set<string>()\n\n for (const [pkgName, version] of deps) {\n // Normalize package name (e.g., @scope/pkg -> scope-pkg)\n const normalizedName = pkgName.replace(/^@/, '').replace(/\\//g, '-')\n const skill = skillByName.get(normalizedName) || skillByName.get(pkgName) || skillByPkgName.get(pkgName)\n\n if (!skill) {\n missing.push(pkgName)\n }\n else {\n matchedSkillNames.add(skill.name)\n if (isOutdated(skill, version)) {\n outdated.push({ ...skill, packageName: pkgName, latestVersion: version })\n }\n else {\n synced.push({ ...skill, packageName: pkgName, latestVersion: version })\n }\n }\n }\n\n // Skills in lockfile but not matched to any local dep\n const unmatched = skills.filter(s => !matchedSkillNames.has(s.name))\n\n return { skills, deps, missing, outdated, synced, unmatched }\n}\n\nexport function getSkillsDir(agent: AgentType, scope: 'local' | 'global', cwd: string = process.cwd()): string {\n const agentConfig = agents[agent]\n if (scope === 'global') {\n if (!agentConfig.globalSkillsDir) {\n throw new Error(`Agent ${agent} does not support global skills`)\n }\n return agentConfig.globalSkillsDir\n }\n return join(cwd, agentConfig.skillsDir)\n}\n","import type { AgentType } from '../agent'\nimport type { ProjectState, SkillEntry } from '../core/skills'\nimport { existsSync, rmSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { removeLockEntry } from '../core/lockfile'\nimport { getSkillsDir, iterateSkills } from '../core/skills'\n\nexport interface RemoveOptions {\n packages?: string[]\n global: boolean\n agent: AgentType\n yes: boolean\n}\n\nexport async function removeCommand(state: ProjectState, opts: RemoveOptions): Promise<void> {\n // Get skills from the appropriate scope\n const scope = opts.global ? 'global' : 'local'\n const allSkills = [...iterateSkills({ scope })]\n\n // Get skills to choose from\n const skills = opts.packages\n ? allSkills.filter(s => opts.packages!.includes(s.name))\n : await pickSkillsToRemove(allSkills, scope)\n\n if (!skills || skills.length === 0) {\n p.log.info('No skills selected')\n return\n }\n\n // Confirm deletion\n if (!opts.yes) {\n const confirmed = await p.confirm({\n message: `Remove ${skills.length} skill(s)? ${skills.map(s => s.name).join(', ')}`,\n })\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('Cancelled')\n return\n }\n }\n\n // Delete each skill\n for (const skill of skills) {\n const skillsDir = getSkillsDir(skill.agent, skill.scope)\n\n if (existsSync(skill.dir)) {\n rmSync(skill.dir, { recursive: true, force: true })\n removeLockEntry(skillsDir, skill.name)\n p.log.success(`Removed ${skill.name}`)\n }\n else {\n p.log.warn(`${skill.name} not found`)\n }\n }\n\n p.outro(`Removed ${skills.length} skill(s)`)\n}\n\nasync function pickSkillsToRemove(skills: SkillEntry[], scope: 'local' | 'global'): Promise<SkillEntry[] | null> {\n if (skills.length === 0) {\n p.log.warn(`No ${scope} skills installed`)\n return null\n }\n\n const options = skills.map(skill => ({\n label: skill.name,\n value: skill.name,\n hint: skill.info?.version ? `@${skill.info.version}` : undefined,\n }))\n\n const selected = await p.multiselect({\n message: 'Select skills to remove',\n options,\n required: false,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled')\n return null\n }\n\n const selectedSet = new Set(selected as string[])\n return skills.filter(s => selectedSet.has(s.name))\n}\n","import type { SearchSnippet } from '../retriv'\nimport type { ProjectState } from './skills'\nimport * as p from '@clack/prompts'\n\nexport function formatSkillStatus(state: ProjectState): void {\n const { missing, outdated, synced } = state\n\n if (synced.length > 0)\n p.log.success(`${synced.length} synced`)\n if (outdated.length > 0)\n p.log.warn(`${outdated.length} outdated: ${outdated.map(s => s.name).join(', ')}`)\n if (missing.length > 0)\n p.log.info(`${missing.length} missing: ${missing.slice(0, 5).join(', ')}${missing.length > 5 ? '...' : ''}`)\n}\n\nfunction highlightTerms(content: string, terms: string[]): string {\n if (terms.length === 0)\n return content\n // Sort by length desc to match longer terms first\n const sorted = [...terms].sort((a, b) => b.length - a.length)\n const pattern = new RegExp(`(${sorted.map(t => t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')})`, 'gi')\n return content.replace(pattern, '\\x1B[33m$1\\x1B[0m')\n}\n\nexport function formatSnippet(r: SearchSnippet): string {\n const refPath = `.claude/skills/${r.package}/.skilld/${r.source}`\n const lineRange = r.lineStart === r.lineEnd ? `L${r.lineStart}` : `L${r.lineStart}-${r.lineEnd}`\n const score = `\\x1B[90m${r.score.toFixed(2)}\\x1B[0m`\n\n const scopeStr = r.scope?.length ? `${r.scope.map(e => e.name).join('.')} → ` : ''\n const entityStr = r.entities?.map(e => e.signature || `${e.type} ${e.name}`).join(', ')\n const highlighted = highlightTerms(r.content, r.highlights)\n\n return [\n `${r.package} ${score}${entityStr ? ` \\x1B[36m${scopeStr}${entityStr}\\x1B[0m` : ''}`,\n `\\x1B[90m${refPath}:${lineRange}\\x1B[0m`,\n ` ${highlighted.replace(/\\n/g, '\\n ')}`,\n ].join('\\n')\n}\n","import type { SearchFilter } from '../retriv'\nimport { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { REFERENCES_DIR } from '../cache'\nimport { formatSnippet } from '../core'\nimport { searchSnippets } from '../retriv'\n\n/** Find all per-package search DBs, optionally filtered by package name */\nfunction findPackageDbs(packageFilter?: string): string[] {\n if (!existsSync(REFERENCES_DIR))\n return []\n\n const normalize = (s: string) => s.toLowerCase().replace(/[-_]/g, '')\n\n return readdirSync(REFERENCES_DIR)\n .filter(name => name.includes('@'))\n .filter((name) => {\n if (!packageFilter)\n return true\n const pkg = name.split('@')[0]\n const filter = normalize(packageFilter)\n return normalize(pkg).includes(filter) || pkg.startsWith(packageFilter)\n })\n .map(dir => join(REFERENCES_DIR, dir, 'search.db'))\n .filter(db => existsSync(db))\n}\n\nexport async function searchCommand(rawQuery: string, packageFilter?: string): Promise<void> {\n const dbs = findPackageDbs(packageFilter)\n\n if (dbs.length === 0) {\n if (packageFilter)\n p.log.warn(`No docs indexed for \"${packageFilter}\". Run \\`skilld add ${packageFilter}\\` first.`)\n else\n p.log.warn('No docs indexed yet. Run `skilld add <package>` first.')\n return\n }\n\n // Parse filter prefix (e.g., \"issues:bug\" -> filter by type=issue, query=\"bug\")\n let query = rawQuery\n let filter: SearchFilter | undefined\n\n const prefixMatch = rawQuery.match(/^(issues?|docs?|releases?):(.+)$/i)\n if (prefixMatch) {\n const prefix = prefixMatch[1]!.toLowerCase()\n query = prefixMatch[2]!\n if (prefix.startsWith('issue'))\n filter = { type: 'issue' }\n else if (prefix.startsWith('release'))\n filter = { type: 'release' }\n else\n filter = { type: { $in: ['doc', 'docs'] } }\n }\n\n const start = performance.now()\n\n // Query all package DBs in parallel with native filtering\n const allResults = await Promise.all(\n dbs.map(dbPath => searchSnippets(query, { dbPath }, { limit: filter ? 10 : 5, filter })),\n )\n\n // Merge and sort by score\n const merged = allResults.flat().sort((a, b) => b.score - a.score).slice(0, 5)\n\n const elapsed = ((performance.now() - start) / 1000).toFixed(2)\n\n if (merged.length === 0) {\n p.log.warn(`No results for \"${query}\"`)\n return\n }\n\n const output = merged.map(r => formatSnippet(r)).join('\\n\\n')\n p.log.message(`${output}\\n\\n${merged.length} results (${elapsed}s)`)\n}\n","import type { AgentType } from '../agent'\nimport type { SkillInfo } from '../core/lockfile'\nimport { existsSync, readdirSync, statSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { agents, getAgentVersion } from '../agent'\nimport { CACHE_DIR, getPackageDbPath } from '../cache'\nimport { getCacheDir } from '../cache/version'\nimport { defaultFeatures, hasConfig, readConfig } from '../core/config'\nimport { iterateSkills } from '../core/skills'\n\nconst require = createRequire(import.meta.url)\nconst { version: skilldVersion } = require('../package.json')\n\nexport interface StatusOptions {\n global?: boolean\n}\n\ninterface TrackedPackage {\n name: string\n info: SkillInfo\n agents: Set<AgentType>\n scope: 'local' | 'global'\n}\n\nfunction countDocs(packageName: string, version?: string): number {\n if (!version)\n return 0\n const cacheDir = getCacheDir(packageName, version)\n if (!existsSync(cacheDir))\n return 0\n let count = 0\n const walk = (dir: string, depth = 0) => {\n if (depth > 3)\n return\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === 'search.db')\n continue\n if (entry.isDirectory())\n walk(join(dir, entry.name), depth + 1)\n else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx'))\n count++\n }\n }\n catch {}\n }\n walk(cacheDir)\n return count\n}\n\nfunction countEmbeddings(packageName: string, version?: string): number | null {\n if (!version)\n return null\n const dbPath = getPackageDbPath(packageName, version)\n if (!existsSync(dbPath))\n return null\n try {\n const { DatabaseSync } = require('node:sqlite')\n const db = new DatabaseSync(dbPath, { open: true, readOnly: true })\n const row = db.prepare('SELECT count(*) as cnt FROM vector_metadata').get() as { cnt: number } | undefined\n db.close()\n return row?.cnt ?? null\n }\n catch {\n return null\n }\n}\n\nfunction countRefDocs(skillDir: string): number {\n const refsDir = join(skillDir, '.skilld')\n if (!existsSync(refsDir))\n return 0\n let count = 0\n const walk = (dir: string, depth = 0) => {\n if (depth > 3)\n return\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory() || entry.isSymbolicLink()) {\n try {\n const stat = statSync(join(dir, entry.name))\n if (stat.isDirectory())\n walk(join(dir, entry.name), depth + 1)\n }\n catch { continue }\n }\n else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) {\n count++\n }\n }\n }\n catch {}\n }\n walk(refsDir)\n return count\n}\n\nfunction timeAgo(iso?: string): string {\n if (!iso)\n return ''\n const diff = Date.now() - new Date(iso).getTime()\n const days = Math.floor(diff / 86400000)\n if (days <= 0)\n return 'today'\n if (days === 1)\n return '1d ago'\n if (days < 7)\n return `${days}d ago`\n if (days < 30)\n return `${Math.floor(days / 7)}w ago`\n return `${Math.floor(days / 30)}mo ago`\n}\n\nfunction formatSource(source?: string): string {\n if (!source)\n return ''\n if (source === 'shipped')\n return 'shipped'\n if (source.includes('llms.txt'))\n return 'llms.txt'\n if (source.includes('github.com'))\n return source.replace(/https?:\\/\\/github\\.com\\//, '')\n return source\n}\n\n// dim helper\nconst dim = (s: string) => `\\x1B[90m${s}\\x1B[0m`\nconst bold = (s: string) => `\\x1B[1m${s}\\x1B[0m`\nconst green = (s: string) => `\\x1B[32m${s}\\x1B[0m`\n\nfunction getLastSynced(): string | null {\n let latest: Date | null = null\n for (const skill of iterateSkills()) {\n if (skill.info?.syncedAt) {\n const d = new Date(skill.info.syncedAt)\n if (!latest || d > latest)\n latest = d\n }\n }\n if (!latest)\n return null\n return timeAgo(latest.toISOString())\n}\n\nfunction buildConfigLines(): string[] {\n const config = readConfig()\n const lines: string[] = []\n\n lines.push(`Version v${skilldVersion}`)\n const lastSynced = getLastSynced()\n if (lastSynced)\n lines.push(`Synced ${dim(lastSynced)}`)\n lines.push(`Config ${dim(join(CACHE_DIR, 'config.yaml'))}${hasConfig() ? '' : dim(' (not created)')}`)\n lines.push(`Cache ${dim(CACHE_DIR)}`)\n\n const withCli = Object.entries(agents).filter(([_, a]) => a.cli) as [AgentType, typeof agents[AgentType]][]\n const installed: string[] = []\n for (const [id, agent] of withCli) {\n const ver = getAgentVersion(id)\n if (ver)\n installed.push(`${agent.displayName} v${ver}`)\n }\n if (installed.length > 0)\n lines.push(`Agents ${installed.join(', ')}`)\n\n if (config.model)\n lines.push(`Model ${config.model}`)\n\n const features = { ...defaultFeatures, ...config.features }\n const parts = Object.entries(features).map(([k, v]) => `${k}: ${v ? green('on') : dim('off')}`)\n lines.push(`Features ${parts.join(', ')}`)\n\n if (config.projects?.length)\n lines.push(`Projects ${config.projects.length} registered`)\n\n return lines\n}\n\nexport function statusCommand(opts: StatusOptions = {}): void {\n const allSkills = [...iterateSkills({ scope: opts.global ? 'global' : 'all' })]\n\n // Config section\n p.log.step(bold('Skilld Config'))\n p.log.message(buildConfigLines().join('\\n'))\n\n if (allSkills.length === 0) {\n p.log.step(bold('Skills'))\n p.log.message(`${dim('(none)')}\\n\\nRun ${bold('skilld add <package>')} to install skills`)\n return\n }\n\n // Deduplicate by package identity, grouped by scope\n const localPkgs = new Map<string, TrackedPackage>()\n const globalPkgs = new Map<string, TrackedPackage>()\n\n for (const skill of allSkills) {\n const key = skill.info?.packageName || skill.name\n const map = skill.scope === 'local' ? localPkgs : globalPkgs\n\n if (!map.has(key)) {\n map.set(key, {\n name: skill.name,\n info: skill.info || {},\n agents: new Set([skill.agent]),\n scope: skill.scope,\n })\n }\n else {\n map.get(key)!.agents.add(skill.agent)\n }\n }\n\n const buildPackageLines = (pkgs: Map<string, TrackedPackage>): string[] => {\n const lines: string[] = []\n for (const [, pkg] of pkgs) {\n const { info } = pkg\n const isShipped = info.source === 'shipped'\n const icon = isShipped ? '▶' : '◆'\n\n const parts = [`${icon} ${bold(pkg.name)}`]\n if (info.version)\n parts.push(dim(info.version))\n const source = formatSource(info.source)\n if (source && source !== 'shipped')\n parts.push(dim(source))\n\n lines.push(parts.join(' '))\n\n const meta: string[] = []\n const pkgName = info.packageName || pkg.name\n const docs = countDocs(pkgName, info.version) || countRefDocs(join(\n pkg.scope === 'global'\n ? agents[pkg.agents.values().next().value!].globalSkillsDir!\n : join(process.cwd(), agents[pkg.agents.values().next().value!].skillsDir),\n pkg.name,\n ))\n if (docs > 0)\n meta.push(`${docs} docs`)\n\n const embeddings = countEmbeddings(pkgName, info.version)\n if (embeddings !== null)\n meta.push(`${embeddings} chunks`)\n\n const ago = timeAgo(info.syncedAt)\n if (ago)\n meta.push(`synced ${ago}`)\n\n if (pkg.agents.size > 0) {\n const agentNames = [...pkg.agents].map(a => agents[a].displayName)\n meta.push(agentNames.join(', '))\n }\n\n if (meta.length > 0)\n lines.push(` ${dim(meta.join(' · '))}`)\n }\n return lines\n }\n\n if (!opts.global && localPkgs.size > 0) {\n p.log.step(`${bold('Local')} (project)`)\n p.log.message(buildPackageLines(localPkgs).join('\\n'))\n }\n\n if (globalPkgs.size > 0) {\n p.log.step(bold('Global'))\n p.log.message(buildPackageLines(globalPkgs).join('\\n'))\n }\n\n if (!opts.global && localPkgs.size === 0) {\n p.log.step(`${bold('Local')} (project)`)\n p.log.message(dim('(none)'))\n }\n\n const total = localPkgs.size + globalPkgs.size\n p.log.info(`${total} package${total !== 1 ? 's' : ''}`)\n}\n","import type { AgentType, OptimizeModel, SkillSection } from '../agent'\nimport type { ProjectState } from '../core/skills'\nimport type { ResolveAttempt, ResolveStep } from '../sources'\nimport { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { join, relative } from 'node:path'\nimport * as p from '@clack/prompts'\nimport {\n agents,\n\n detectImportedPackages,\n generateSkillMd,\n getAvailableModels,\n optimizeDocs,\n\n sanitizeName,\n} from '../agent'\nimport {\n CACHE_DIR,\n clearCache,\n ensureCacheDir,\n getCacheDir,\n getPackageDbPath,\n getPkgKeyFiles,\n getShippedSkills,\n getVersionKey,\n hasShippedDocs,\n isCached,\n linkGithub,\n linkPkg,\n linkReferences,\n linkReleases,\n linkShippedSkill,\n listReferenceFiles,\n readCachedDocs,\n resolvePkgDir,\n writeToCache,\n} from '../cache'\nimport { defaultFeatures, readConfig, registerProject, updateConfig } from '../core/config'\nimport { writeLock } from '../core/lockfile'\nimport { createIndex } from '../retriv'\nimport {\n downloadLlmsDocs,\n fetchGitDocs,\n fetchGitHubDiscussions,\n fetchGitHubIssues,\n fetchLlmsTxt,\n fetchNpmPackage,\n fetchPkgDist,\n fetchReadmeContent,\n fetchReleaseNotes,\n formatDiscussionsAsMarkdown,\n formatIssuesAsMarkdown,\n isGhAvailable,\n normalizeLlmsLinks,\n parseGitHubUrl,\n readLocalDependencies,\n\n resolveEntryFiles,\n resolveLocalPackageDocs,\n resolvePackageDocsWithAttempts,\n} from '../sources'\n\nconst RESOLVE_STEP_LABELS: Record<ResolveStep, string> = {\n 'npm': 'npm registry',\n 'github-docs': 'GitHub docs',\n 'github-meta': 'GitHub meta',\n 'github-search': 'GitHub search',\n 'readme': 'README',\n 'llms.txt': 'llms.txt',\n 'local': 'node_modules',\n}\n\nfunction showResolveAttempts(attempts: ResolveAttempt[]): void {\n if (attempts.length === 0)\n return\n\n p.log.message('\\x1B[90mResolution attempts:\\x1B[0m')\n for (const attempt of attempts) {\n const icon = attempt.status === 'success' ? '\\x1B[32m✓\\x1B[0m' : '\\x1B[90m✗\\x1B[0m'\n const source = `\\x1B[90m${attempt.source}\\x1B[0m`\n const msg = attempt.message ? ` - ${attempt.message}` : ''\n p.log.message(` ${icon} ${source}${msg}`)\n }\n}\n\nfunction formatTaskResults(results: Array<{ msg: string, status: 'ok' | 'warn' | 'error' }>): string {\n return results.map((r) => {\n if (r.status === 'error')\n return `\\x1B[31m✖\\x1B[0m ${r.msg}`\n if (r.status === 'warn')\n return `\\x1B[33m▲\\x1B[0m ${r.msg}`\n return `\\x1B[32m✓\\x1B[0m ${r.msg}`\n }).join('\\n')\n}\n\n/**\n * Check if .gitignore has `.skilld` entry.\n * If missing, prompt to add it. Skipped for global installs.\n */\nexport async function ensureGitignore(skillsDir: string, cwd: string, isGlobal: boolean): Promise<void> {\n if (isGlobal)\n return\n\n const gitignorePath = join(cwd, '.gitignore')\n const pattern = '.skilld'\n\n // Check if already ignored\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8')\n if (content.split('\\n').some(line => line.trim() === pattern))\n return\n }\n\n // Show guidance\n p.log.info(\n `\\x1B[1mGit guidance:\\x1B[0m\\n`\n + ` \\x1B[32m✓\\x1B[0m Commit: \\x1B[36m${skillsDir}/*/SKILL.md\\x1B[0m\\n`\n + ` \\x1B[32m✓\\x1B[0m Commit: \\x1B[36m${skillsDir}/skilld-lock.yaml\\x1B[0m\\n`\n + ` \\x1B[31m✗\\x1B[0m Ignore: \\x1B[36m${pattern}\\x1B[0m \\x1B[90m(recreated by \\`skilld install\\`)\\x1B[0m`,\n )\n\n const add = await p.confirm({\n message: `Add \\`${pattern}\\` to .gitignore?`,\n initialValue: true,\n })\n\n if (p.isCancel(add) || !add)\n return\n\n const entry = `\\n# Skilld references (recreated by \\`skilld install\\`)\\n${pattern}\\n`\n if (existsSync(gitignorePath)) {\n const existing = readFileSync(gitignorePath, 'utf-8')\n const separator = existing.endsWith('\\n') ? '' : '\\n'\n appendFileSync(gitignorePath, `${separator}${entry}`)\n }\n else {\n writeFileSync(gitignorePath, entry)\n }\n\n p.log.success('Updated .gitignore')\n}\n\nexport interface SyncOptions {\n packages?: string[]\n global: boolean\n agent: AgentType\n model?: OptimizeModel\n yes: boolean\n force?: boolean\n}\n\nexport async function syncCommand(state: ProjectState, opts: SyncOptions): Promise<void> {\n // If packages specified, sync those\n if (opts.packages && opts.packages.length > 0) {\n // Use parallel sync for multiple packages\n if (opts.packages.length > 1) {\n const { syncPackagesParallel } = await import('./sync-parallel')\n return syncPackagesParallel({\n packages: opts.packages,\n global: opts.global,\n agent: opts.agent,\n model: opts.model,\n yes: opts.yes,\n force: opts.force,\n })\n }\n\n // Single package - use original flow for cleaner output\n await syncSinglePackage(opts.packages[0]!, opts)\n return\n }\n\n // Otherwise show picker, pre-selecting missing/outdated\n const packages = await interactivePicker(state)\n if (!packages || packages.length === 0) {\n p.outro('No packages selected')\n return\n }\n\n // Use parallel sync for multiple packages\n if (packages.length > 1) {\n const { syncPackagesParallel } = await import('./sync-parallel')\n return syncPackagesParallel({\n packages,\n global: opts.global,\n agent: opts.agent,\n model: opts.model,\n yes: opts.yes,\n force: opts.force,\n })\n }\n\n // Single package - use original flow\n await syncSinglePackage(packages[0]!, opts)\n}\n\nasync function interactivePicker(state: ProjectState): Promise<string[] | null> {\n const spin = p.spinner()\n spin.start('Detecting imports...')\n\n const cwd = process.cwd()\n const { packages: detected, error } = await detectImportedPackages(cwd)\n const declaredMap = state.deps\n\n if (error || detected.length === 0) {\n spin.stop(error ? `Detection failed: ${error}` : 'No imports detected')\n if (declaredMap.size === 0) {\n p.log.warn('No dependencies found')\n return null\n }\n // Fallback to package.json\n return pickFromList([...declaredMap.entries()].map(([name, version]) => ({\n name,\n version: maskPatch(version),\n count: 0,\n inPkgJson: true,\n })), state)\n }\n\n spin.stop(`Loaded ${detected.length} project skills`)\n\n const packages = detected.map(pkg => ({\n name: pkg.name,\n version: declaredMap.get(pkg.name),\n count: pkg.count,\n inPkgJson: declaredMap.has(pkg.name),\n }))\n\n return pickFromList(packages, state)\n}\n\nfunction maskPatch(version: string | undefined): string | undefined {\n if (!version)\n return undefined\n const parts = version.split('.')\n if (parts.length >= 3) {\n parts[2] = 'x'\n return parts.slice(0, 3).join('.')\n }\n return version\n}\n\nasync function pickFromList(\n packages: Array<{ name: string, version?: string, count: number, inPkgJson: boolean }>,\n state: ProjectState,\n): Promise<string[] | null> {\n // Pre-select missing and outdated\n const missingSet = new Set(state.missing)\n const outdatedSet = new Set(state.outdated.map(s => s.name))\n\n const options = packages.map(pkg => ({\n label: pkg.inPkgJson ? `${pkg.name} ★` : pkg.name,\n value: pkg.name,\n hint: [\n maskPatch(pkg.version),\n pkg.count > 0 ? `${pkg.count} imports` : null,\n ].filter(Boolean).join(' · ') || undefined,\n }))\n\n const initialValues = packages\n .filter(pkg => missingSet.has(pkg.name) || outdatedSet.has(pkg.name))\n .map(pkg => pkg.name)\n\n const selected = await p.multiselect({\n message: 'Select packages to sync',\n options,\n required: false,\n initialValues,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled')\n return null\n }\n\n return selected as string[]\n}\n\n/** Select LLM model for SKILL.md generation (independent of target agent) */\nexport async function selectModel(skipPrompt: boolean): Promise<OptimizeModel | null> {\n const config = readConfig()\n const available = await getAvailableModels()\n\n if (available.length === 0) {\n p.log.warn('No LLM CLIs found (claude, gemini, codex)')\n return null\n }\n\n // Use config model if set and available\n if (config.model && available.some(m => m.id === config.model)) {\n return config.model\n }\n\n if (skipPrompt)\n return available.find(m => m.recommended)?.id ?? available[0]!.id\n\n const modelChoice = await p.select({\n message: 'Model for SKILL.md generation',\n options: available.map(m => ({\n label: m.recommended ? `${m.name} (Recommended)` : m.name,\n value: m.id,\n hint: `${m.agentName} · ${m.hint}`,\n })),\n initialValue: available.find(m => m.recommended)?.id ?? available[0]!.id,\n })\n\n if (p.isCancel(modelChoice)) {\n p.cancel('Cancelled')\n return null\n }\n\n // Remember choice for next time\n updateConfig({ model: modelChoice as OptimizeModel })\n\n return modelChoice as OptimizeModel\n}\n\nexport async function selectSkillSections(): Promise<{ sections: SkillSection[], customPrompt?: string, cancelled: boolean }> {\n const selected = await p.multiselect({\n message: 'Generate SKILL.md with LLM',\n options: [\n { label: 'Best practices', value: 'best-practices' as SkillSection, hint: 'gotchas, pitfalls, patterns' },\n { label: 'API reference', value: 'api' as SkillSection, hint: 'exported functions & composables' },\n { label: 'Custom prompt', value: 'custom' as SkillSection, hint: 'add your own instructions' },\n ],\n initialValues: ['best-practices', 'api'] as SkillSection[],\n required: false,\n })\n\n if (p.isCancel(selected))\n return { sections: [], cancelled: true }\n\n const sections = selected as SkillSection[]\n if (sections.length === 0)\n return { sections: [], cancelled: false }\n\n let customPrompt: string | undefined\n if (sections.includes('custom')) {\n const text = await p.text({\n message: 'Custom instructions',\n placeholder: 'e.g. \"Focus on SSR patterns\" or \"Include migration notes from v2 to v3\"',\n })\n if (p.isCancel(text))\n return { sections: [], cancelled: true }\n customPrompt = text as string\n }\n\n return { sections, customPrompt, cancelled: false }\n}\n\ninterface SyncConfig {\n global: boolean\n agent: AgentType\n model?: OptimizeModel\n yes: boolean\n force?: boolean\n}\n\nasync function syncSinglePackage(packageName: string, config: SyncConfig): Promise<void> {\n const spin = p.spinner()\n spin.start(`Resolving ${packageName}`)\n\n const cwd = process.cwd()\n const localDeps = await readLocalDependencies(cwd).catch(() => [])\n const localVersion = localDeps.find(d => d.name === packageName)?.version\n\n // Try npm first\n const resolveResult = await resolvePackageDocsWithAttempts(packageName, {\n version: localVersion,\n cwd,\n onProgress: step => spin.message(`${packageName}: ${RESOLVE_STEP_LABELS[step]}`),\n })\n let resolved = resolveResult.package\n\n // If npm fails, check if it's a link: dep and try local resolution\n if (!resolved) {\n const { readFileSync, existsSync } = await import('node:fs')\n const { join, resolve } = await import('node:path')\n const pkgPath = join(cwd, 'package.json')\n\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n const depVersion = deps[packageName]\n\n if (depVersion?.startsWith('link:')) {\n spin.message(`Resolving local package: ${packageName}`)\n const localPath = resolve(cwd, depVersion.slice(5))\n resolved = await resolveLocalPackageDocs(localPath)\n }\n }\n }\n\n if (!resolved) {\n spin.stop(`Could not find docs for: ${packageName}`)\n showResolveAttempts(resolveResult.attempts)\n return\n }\n\n const version = localVersion || resolved.version || 'latest'\n const versionKey = getVersionKey(version)\n\n // Download npm dist if not in node_modules (for standalone/learning use)\n if (!existsSync(join(cwd, 'node_modules', packageName))) {\n spin.message(`Downloading ${packageName}@${version} dist`)\n await fetchPkgDist(packageName, version)\n }\n\n // Shipped skills: symlink directly, skip all doc fetching/caching/LLM\n const shippedSkills = getShippedSkills(packageName, cwd, version)\n if (shippedSkills.length > 0) {\n const agent = agents[config.agent]\n const baseDir = config.global\n ? join(CACHE_DIR, 'skills')\n : join(cwd, agent.skillsDir)\n mkdirSync(baseDir, { recursive: true })\n\n for (const shipped of shippedSkills) {\n linkShippedSkill(baseDir, shipped.skillName, shipped.skillDir)\n writeLock(baseDir, shipped.skillName, {\n packageName,\n version,\n source: 'shipped',\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n p.log.success(`Linked shipped skill: ${shipped.skillName} → ${relative(cwd, shipped.skillDir)}`)\n }\n if (!config.global)\n registerProject(cwd)\n spin.stop(`Shipped ${shippedSkills.length} skill(s) from ${packageName}`)\n return\n }\n\n // Force: nuke cached references + search index so all existsSync guards re-fetch\n if (config.force) {\n clearCache(packageName, version)\n const forcedDbPath = getPackageDbPath(packageName, version)\n if (existsSync(forcedDbPath))\n rmSync(forcedDbPath, { recursive: true, force: true })\n }\n\n const useCache = isCached(packageName, version)\n spin.stop(`Resolved ${packageName}@${useCache ? versionKey : version}${config.force ? ' (force)' : useCache ? ' (cached)' : ''}`)\n\n ensureCacheDir()\n\n const agent = agents[config.agent]\n const baseDir = config.global\n ? join(CACHE_DIR, 'skills')\n : join(cwd, agent.skillsDir)\n\n const skillDir = join(baseDir, sanitizeName(packageName))\n mkdirSync(skillDir, { recursive: true })\n\n let docSource: string = resolved.readmeUrl || 'readme'\n let docsType: 'llms.txt' | 'readme' | 'docs' = 'readme'\n\n // Collect all fetched resources for indexing phase\n const fetchedDocs: Array<{ id: string, content: string, metadata: Record<string, any> }> = []\n const fetchedIssues: Array<{ id: string, content: string, metadata: Record<string, any> }> = []\n const fetchedDiscussions: Array<{ id: string, content: string, metadata: Record<string, any> }> = []\n const fetchedReleases: Array<{ id: string, content: string, metadata: Record<string, any> }> = []\n\n // ── Phase 1: Finding resources ──\n // Build task list dynamically based on what needs fetching\n interface TaskItem { title: string, task: (message: (msg: string) => void) => Promise<string> }\n const resourceTasks: TaskItem[] = []\n\n if (!useCache) {\n resourceTasks.push({\n title: 'Fetching documentation',\n task: async (message) => {\n const cachedDocs: Array<{ path: string, content: string }> = []\n\n // Try versioned git docs first\n if (resolved.gitDocsUrl && resolved.repoUrl) {\n const gh = parseGitHubUrl(resolved.repoUrl)\n if (gh) {\n const gitDocs = await fetchGitDocs(gh.owner, gh.repo, version, packageName)\n if (gitDocs && gitDocs.files.length > 0) {\n message(`Downloading ${gitDocs.files.length} docs from ${gitDocs.ref}`)\n\n const BATCH_SIZE = 20\n const results: Array<{ file: string, content: string } | null> = []\n\n for (let i = 0; i < gitDocs.files.length; i += BATCH_SIZE) {\n const batch = gitDocs.files.slice(i, i + BATCH_SIZE)\n const batchResults = await Promise.all(\n batch.map(async (file) => {\n const url = `${gitDocs.baseUrl}/${file}`\n const res = await fetch(url, { headers: { 'User-Agent': 'skilld/1.0' } }).catch(() => null)\n if (!res?.ok)\n return null\n const content = await res.text()\n return { file, content }\n }),\n )\n results.push(...batchResults)\n }\n\n for (const r of results) {\n if (r) {\n // Normalize nested monorepo paths to docs/ (e.g. apps/pkg-docs/src/content/docs/guide.md → docs/guide.md)\n const cachePath = gitDocs.docsPrefix ? r.file.replace(gitDocs.docsPrefix, '') : r.file\n cachedDocs.push({ path: cachePath, content: r.content })\n fetchedDocs.push({\n id: cachePath,\n content: r.content,\n metadata: { package: packageName, source: cachePath, type: 'doc' },\n })\n }\n }\n\n const downloaded = results.filter(Boolean).length\n if (downloaded > 0) {\n docSource = `${resolved.repoUrl}/tree/${gitDocs.ref}/docs`\n docsType = 'docs'\n writeToCache(packageName, version, cachedDocs)\n return `Downloaded ${downloaded} git docs`\n }\n }\n }\n }\n\n // Try llms.txt\n if (resolved.llmsUrl && cachedDocs.length === 0) {\n message('Fetching llms.txt')\n const llmsContent = await fetchLlmsTxt(resolved.llmsUrl)\n if (llmsContent) {\n docSource = resolved.llmsUrl!\n docsType = 'llms.txt'\n const baseUrl = resolved.docsUrl || new URL(resolved.llmsUrl).origin\n cachedDocs.push({ path: 'llms.txt', content: normalizeLlmsLinks(llmsContent.raw, baseUrl) })\n\n if (llmsContent.links.length > 0) {\n message(`Downloading ${llmsContent.links.length} linked docs`)\n const docs = await downloadLlmsDocs(llmsContent, baseUrl)\n\n for (const doc of docs) {\n const localPath = doc.url.startsWith('/') ? doc.url.slice(1) : doc.url\n const cachePath = join('docs', ...localPath.split('/'))\n cachedDocs.push({ path: cachePath, content: doc.content })\n fetchedDocs.push({\n id: doc.url,\n content: doc.content,\n metadata: { package: packageName, source: cachePath, type: 'doc' },\n })\n }\n\n writeToCache(packageName, version, cachedDocs)\n return `Saved ${docs.length + 1} docs from llms.txt`\n }\n\n writeToCache(packageName, version, cachedDocs)\n return 'Saved llms.txt'\n }\n }\n\n // Fallback to README\n if (resolved.readmeUrl && cachedDocs.length === 0) {\n message('Fetching README')\n const content = await fetchReadmeContent(resolved.readmeUrl)\n if (content) {\n cachedDocs.push({ path: 'docs/README.md', content })\n fetchedDocs.push({\n id: 'README.md',\n content,\n metadata: { package: packageName, source: 'docs/README.md', type: 'doc' },\n })\n writeToCache(packageName, version, cachedDocs)\n return 'Saved README.md'\n }\n }\n\n return 'No docs found'\n },\n })\n }\n\n const features = readConfig().features ?? defaultFeatures\n\n // Issues task (runs for both fresh and cached if issues don't exist yet)\n const issuesPath = join(getCacheDir(packageName, version), 'github', 'RECENT-ISSUES.md')\n if (features.issues && resolved.repoUrl && isGhAvailable() && !existsSync(issuesPath)) {\n const gh = parseGitHubUrl(resolved.repoUrl)\n if (gh) {\n resourceTasks.push({\n title: 'Fetching GitHub issues',\n task: async () => {\n const issues = await fetchGitHubIssues(gh.owner, gh.repo, 20)\n if (issues.length > 0) {\n const issuesMd = formatIssuesAsMarkdown(issues)\n writeToCache(packageName, version, [{ path: 'github/RECENT-ISSUES.md', content: issuesMd }])\n for (const issue of issues) {\n fetchedIssues.push({\n id: `issue-${issue.number}`,\n content: `#${issue.number}: ${issue.title}\\n\\n${issue.body || ''}`,\n metadata: { package: packageName, source: 'github/RECENT-ISSUES.md', type: 'issue', number: issue.number },\n })\n }\n return `Cached ${issues.length} issues`\n }\n return 'No issues found'\n },\n })\n }\n }\n\n // Discussions task\n const discussionsPath = join(getCacheDir(packageName, version), 'github', 'RECENT-DISCUSSIONS.md')\n if (features.discussions && resolved.repoUrl && isGhAvailable() && !existsSync(discussionsPath)) {\n const gh = parseGitHubUrl(resolved.repoUrl)\n if (gh) {\n resourceTasks.push({\n title: 'Fetching GitHub discussions',\n task: async () => {\n const discussions = await fetchGitHubDiscussions(gh.owner, gh.repo, 20)\n if (discussions.length > 0) {\n const discussionsMd = formatDiscussionsAsMarkdown(discussions)\n writeToCache(packageName, version, [{ path: 'github/RECENT-DISCUSSIONS.md', content: discussionsMd }])\n for (const d of discussions) {\n fetchedDiscussions.push({\n id: `discussion-${d.number}`,\n content: `#${d.number}: ${d.title}\\n\\n${d.body || ''}`,\n metadata: { package: packageName, source: 'github/RECENT-DISCUSSIONS.md', type: 'discussion', number: d.number },\n })\n }\n return `Cached ${discussions.length} discussions`\n }\n return 'No discussions found'\n },\n })\n }\n }\n\n // Releases task\n const releasesPath = join(getCacheDir(packageName, version), 'releases')\n if (features.releases && resolved.repoUrl && !existsSync(releasesPath)) {\n const gh = parseGitHubUrl(resolved.repoUrl)\n if (gh) {\n resourceTasks.push({\n title: 'Fetching release notes',\n task: async () => {\n const releaseDocs = await fetchReleaseNotes(gh.owner, gh.repo, version, resolved.gitRef, packageName)\n if (releaseDocs.length > 0) {\n writeToCache(packageName, version, releaseDocs)\n for (const doc of releaseDocs) {\n fetchedReleases.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, type: 'release' },\n })\n }\n return `Cached ${releaseDocs.length} release note(s)`\n }\n return 'No releases found'\n },\n })\n }\n }\n\n // Run resource tasks\n if (resourceTasks.length > 0) {\n const resSpin = p.spinner()\n resSpin.start('Finding resources')\n const resResults: Array<{ msg: string, status: 'ok' | 'warn' | 'error' }> = []\n for (const task of resourceTasks) {\n resSpin.message(task.title)\n try {\n const result = await task.task(msg => resSpin.message(msg))\n // Discussions are opt-in on GitHub, silently skip if missing\n if (result === 'No discussions found')\n continue\n resResults.push({ msg: result, status: result.startsWith('No ') ? 'warn' : 'ok' })\n }\n catch {\n resResults.push({ msg: `${task.title} failed`, status: 'error' })\n }\n }\n resSpin.stop('Fetched resources')\n p.log.message(formatTaskResults(resResults))\n }\n\n // Create symlinks\n try {\n linkPkg(skillDir, packageName, cwd, version)\n if (!hasShippedDocs(packageName, cwd, version) && docsType !== 'readme') {\n linkReferences(skillDir, packageName, version)\n }\n linkGithub(skillDir, packageName, version)\n linkReleases(skillDir, packageName, version)\n }\n catch {\n // Symlink may fail on some systems\n }\n\n // ── Phase 2: Creating search index ──\n const dbPath = getPackageDbPath(packageName, version)\n const indexTasks: TaskItem[] = []\n\n if (!existsSync(dbPath)) {\n // Fresh index needed — use fetched data or read from cache\n if (fetchedDocs.length > 0 || fetchedIssues.length > 0 || fetchedDiscussions.length > 0 || fetchedReleases.length > 0) {\n // We have freshly fetched data\n if (fetchedDocs.length > 0) {\n indexTasks.push({\n title: `Indexing ${fetchedDocs.length} docs`,\n task: async (message) => {\n await createIndex(fetchedDocs, { dbPath, onProgress: (current, total, doc) => {\n const file = doc?.id ? doc.id.split('/').pop() : ''\n message(`Indexing doc ${file} - ${current}/${total}`)\n } })\n return `Indexed ${fetchedDocs.length} docs`\n },\n })\n }\n if (fetchedIssues.length > 0) {\n indexTasks.push({\n title: `Indexing ${fetchedIssues.length} issues`,\n task: async (message) => {\n await createIndex(fetchedIssues, { dbPath, onProgress: (current, total, doc) => {\n const file = doc?.id ? doc.id.split('/').pop() : ''\n message(`Indexing doc ${file} - ${current}/${total}`)\n } })\n return `Indexed ${fetchedIssues.length} issues`\n },\n })\n }\n if (fetchedDiscussions.length > 0) {\n indexTasks.push({\n title: `Indexing ${fetchedDiscussions.length} discussions`,\n task: async (message) => {\n await createIndex(fetchedDiscussions, { dbPath, onProgress: (current, total, doc) => {\n const file = doc?.id ? doc.id.split('/').pop() : ''\n message(`Indexing doc ${file} - ${current}/${total}`)\n } })\n return `Indexed ${fetchedDiscussions.length} discussions`\n },\n })\n }\n if (fetchedReleases.length > 0) {\n indexTasks.push({\n title: `Indexing ${fetchedReleases.length} releases`,\n task: async (message) => {\n await createIndex(fetchedReleases, { dbPath, onProgress: (current, total, doc) => {\n const file = doc?.id ? doc.id.split('/').pop() : ''\n message(`Indexing doc ${file} - ${current}/${total}`)\n } })\n return `Indexed ${fetchedReleases.length} releases`\n },\n })\n }\n }\n else {\n // Cached data — read from disk and index\n indexTasks.push({\n title: 'Indexing cached docs',\n task: async (message) => {\n const cachedDocs = readCachedDocs(packageName, version)\n if (cachedDocs.length === 0)\n return 'No docs to index'\n\n const docsToIndex: Array<{ id: string, content: string, metadata: Record<string, any> }> = cachedDocs\n .filter(doc => !doc.path.startsWith('github/'))\n .map(doc => ({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, type: 'doc' },\n }))\n\n // Parse issues individually\n const issuesDoc = cachedDocs.find(doc => doc.path === 'github/RECENT-ISSUES.md')\n if (issuesDoc) {\n const issueBlocks = issuesDoc.content.split(/\\n---\\n/).filter(Boolean)\n for (const block of issueBlocks) {\n const match = block.match(/## #(\\d+): (.+)/)\n if (match) {\n docsToIndex.push({\n id: `issue-${match[1]}`,\n content: block,\n metadata: { package: packageName, source: 'github/RECENT-ISSUES.md', type: 'issue', number: Number(match[1]) },\n })\n }\n }\n }\n\n // Parse discussions individually\n const discussionsDoc = cachedDocs.find(doc => doc.path === 'github/RECENT-DISCUSSIONS.md')\n if (discussionsDoc) {\n const discussionBlocks = discussionsDoc.content.split(/\\n---\\n/).filter(Boolean)\n for (const block of discussionBlocks) {\n const match = block.match(/## #(\\d+): (.+)/)\n if (match) {\n docsToIndex.push({\n id: `discussion-${match[1]}`,\n content: block,\n metadata: { package: packageName, source: 'github/RECENT-DISCUSSIONS.md', type: 'discussion', number: Number(match[1]) },\n })\n }\n }\n }\n\n await createIndex(docsToIndex, { dbPath, onProgress: (current, total, doc) => {\n const type = doc?.type === 'source' || doc?.type === 'types' ? 'code' : 'doc'\n const file = doc?.id ? doc.id.split('/').pop() : ''\n message(`Indexing ${type} ${file} - ${current}/${total}`)\n } })\n return `Indexed ${docsToIndex.length} docs`\n },\n })\n }\n }\n\n // Index package entry files (.d.ts / .js)\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const entryFiles = features.search && pkgDir ? await resolveEntryFiles(pkgDir) : []\n if (entryFiles.length > 0) {\n const entryLabel = entryFiles.length === 1\n ? entryFiles[0]!.path\n : `${entryFiles.length} entry files`\n indexTasks.push({\n title: `Indexing ${entryLabel}`,\n task: async (message) => {\n await createIndex(entryFiles.map(e => ({\n id: e.path,\n content: e.content,\n metadata: { package: packageName, source: `pkg/${e.path}`, type: e.type },\n })), { dbPath, onProgress: (current, total, doc) => {\n const file = doc?.id ? doc.id.split('/').pop() : ''\n message(`Indexing code ${file} - ${current}/${total}`)\n } })\n return `Indexed ${entryLabel}`\n },\n })\n }\n\n if (indexTasks.length > 0) {\n const idxSpin = p.spinner()\n idxSpin.start('Creating search index')\n const idxResults: Array<{ msg: string, status: 'ok' | 'warn' | 'error' }> = []\n for (const task of indexTasks) {\n idxSpin.message(task.title)\n try {\n const result = await task.task(msg => idxSpin.message(msg))\n idxResults.push({ msg: result, status: result.startsWith('No ') ? 'warn' : 'ok' })\n }\n catch {\n idxResults.push({ msg: `${task.title} failed`, status: 'error' })\n }\n }\n idxSpin.stop('Search index ready')\n p.log.message(formatTaskResults(idxResults))\n }\n\n // Detect docs type from cache\n const cacheDir = getCacheDir(packageName, version)\n if (useCache) {\n if (existsSync(join(cacheDir, 'docs', 'index.md')) || existsSync(join(cacheDir, 'docs', 'guide'))) {\n docSource = resolved.repoUrl ? `${resolved.repoUrl}/tree/v${version}/docs` : 'git'\n docsType = 'docs'\n }\n else if (existsSync(join(cacheDir, 'llms.txt'))) {\n docSource = resolved.llmsUrl || 'llms.txt'\n docsType = 'llms.txt'\n }\n else if (existsSync(join(cacheDir, 'docs', 'README.md'))) {\n docsType = 'readme'\n }\n }\n\n const githubDir = join(getCacheDir(packageName, version), 'github')\n const hasGithub = existsSync(githubDir)\n const hasReleases = existsSync(releasesPath)\n const hasChangelog = pkgDir ? (['CHANGELOG.md', 'changelog.md'].find(f => existsSync(join(pkgDir, f))) || false) : false\n\n const relatedSkills = await findRelatedSkills(packageName, baseDir)\n const shippedDocs = hasShippedDocs(packageName, cwd, version)\n const pkgFiles = getPkgKeyFiles(packageName, cwd, version)\n\n // Write base SKILL.md (no LLM needed)\n const baseSkillMd = generateSkillMd({\n name: packageName,\n version,\n releasedAt: resolved.releasedAt,\n description: resolved.description,\n dependencies: resolved.dependencies,\n distTags: resolved.distTags,\n relatedSkills,\n hasGithub,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), baseSkillMd)\n\n writeLock(baseDir, sanitizeName(packageName), {\n packageName,\n version,\n source: docSource,\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n\n p.log.success(`Created base skill: ${relative(cwd, skillDir)}`)\n\n // Ask about LLM optimization (skip if -y flag, skipLlm config, or model already specified)\n const globalConfig = readConfig()\n if (!globalConfig.skipLlm && (!config.yes || config.model)) {\n const { sections, customPrompt, cancelled } = config.model\n ? { sections: ['best-practices', 'api'] as SkillSection[], customPrompt: undefined, cancelled: false }\n : await selectSkillSections()\n\n if (!cancelled && sections.length > 0) {\n const model = config.model ?? await selectModel(false)\n if (model) {\n await enhanceSkillWithLLM({\n packageName,\n version,\n skillDir,\n model,\n resolved,\n relatedSkills,\n hasGithub,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n force: config.force,\n sections,\n customPrompt,\n })\n }\n }\n }\n\n // Register project in global config (for uninstall tracking)\n if (!config.global) {\n registerProject(cwd)\n }\n\n await ensureGitignore(agent.skillsDir, cwd, config.global)\n\n p.outro(`Synced ${packageName} to ${relative(cwd, skillDir)}`)\n}\n\ninterface EnhanceOptions {\n packageName: string\n version: string\n skillDir: string\n model: OptimizeModel\n resolved: { repoUrl?: string, llmsUrl?: string, releasedAt?: string, docsUrl?: string, gitRef?: string, dependencies?: Record<string, string>, distTags?: Record<string, { version: string, releasedAt?: string }> }\n relatedSkills: string[]\n hasGithub: boolean\n hasReleases: boolean\n hasChangelog: string | false\n docsType: 'llms.txt' | 'readme' | 'docs'\n hasShippedDocs: boolean\n pkgFiles: string[]\n force?: boolean\n sections?: SkillSection[]\n customPrompt?: string\n}\n\nasync function enhanceSkillWithLLM(opts: EnhanceOptions): Promise<void> {\n const { packageName, version, skillDir, model, resolved, relatedSkills, hasGithub, hasReleases, hasChangelog, docsType, hasShippedDocs: shippedDocs, pkgFiles, force, sections, customPrompt } = opts\n\n const llmSpin = p.spinner()\n llmSpin.start(`Agent exploring ${packageName}`)\n const docFiles = listReferenceFiles(skillDir)\n const { optimized, wasOptimized } = await optimizeDocs({\n packageName,\n skillDir,\n model,\n version,\n hasGithub,\n hasReleases,\n hasChangelog,\n docFiles,\n noCache: force,\n sections,\n customPrompt,\n onProgress: ({ type, chunk }) => {\n if (type === 'reasoning' && chunk.startsWith('[')) {\n llmSpin.message(chunk)\n }\n else if (type === 'text') {\n llmSpin.message(`Writing...`)\n }\n },\n })\n\n if (wasOptimized) {\n llmSpin.stop('Generated best practices')\n const body = cleanSkillMd(optimized)\n const skillMd = generateSkillMd({\n name: packageName,\n version,\n releasedAt: resolved.releasedAt,\n dependencies: resolved.dependencies,\n distTags: resolved.distTags,\n body,\n relatedSkills,\n hasGithub,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n }\n else {\n llmSpin.stop('LLM optimization failed')\n }\n}\n\nasync function findRelatedSkills(packageName: string, skillsDir: string): Promise<string[]> {\n const related: string[] = []\n\n const npmInfo = await fetchNpmPackage(packageName)\n if (!npmInfo?.dependencies)\n return related\n\n const deps = Object.keys(npmInfo.dependencies)\n\n if (!existsSync(skillsDir))\n return related\n\n const installedSkills = readdirSync(skillsDir)\n\n for (const skill of installedSkills) {\n if (deps.some(d => sanitizeName(d) === skill)) {\n related.push(skill)\n }\n }\n\n return related.slice(0, 5)\n}\n\nfunction cleanSkillMd(content: string): string {\n let cleaned = content\n .replace(/^```markdown\\n?/m, '')\n .replace(/\\n?```$/m, '')\n .trim()\n\n // Strip any accidental frontmatter or leading horizontal rules\n // We always add our own frontmatter\n // Match 3+ dashes (handles ---, ------, etc)\n const fmMatch = cleaned.match(/^-{3,}\\n/)\n if (fmMatch) {\n const afterOpen = fmMatch[0].length\n const closeMatch = cleaned.slice(afterOpen).match(/\\n-{3,}/)\n if (closeMatch) {\n // Has closing dashes (frontmatter), strip entire block\n cleaned = cleaned.slice(afterOpen + closeMatch.index! + closeMatch[0].length).trim()\n }\n else {\n // Just leading dashes, strip them\n cleaned = cleaned.slice(afterOpen).trim()\n }\n }\n\n return cleaned\n}\n","import type { AgentType } from '../agent'\nimport { existsSync, readdirSync, rmSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { agents } from '../agent'\nimport { CACHE_DIR } from '../cache'\nimport { getRegisteredProjects, unregisterProject } from '../core/config'\nimport { readLock } from '../core/lockfile'\n\nexport interface UninstallOptions {\n scope?: 'project' | 'all'\n agent?: AgentType\n yes: boolean\n}\n\n/**\n * Uninstall skilld skills by scope:\n * - project: Remove project skills (cwd)\n * - all: All registered projects + global skills + cache\n */\nexport async function uninstallCommand(opts: UninstallOptions): Promise<void> {\n let scope = opts.scope\n const registeredProjects = getRegisteredProjects()\n\n // Prompt for scope if not provided\n if (!scope) {\n const allHint = registeredProjects.length > 0\n ? `${registeredProjects.length} projects + global + cache`\n : 'global skills + cache'\n\n const selected = await p.select({\n message: 'What do you want to uninstall?',\n options: [\n { label: 'This project', value: 'project', hint: 'current project only' },\n { label: 'Everything', value: 'all', hint: allHint },\n ],\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled')\n return\n }\n scope = selected as 'project' | 'all'\n }\n\n interface RemoveItem { label: string, path: string, version?: string }\n const toRemove: RemoveItem[] = []\n const seenPaths = new Set<string>()\n const projectsToUnregister: string[] = []\n const agentFilter = opts.agent ? [opts.agent] : undefined\n\n const addToRemove = (label: string, path: string, version?: string) => {\n if (seenPaths.has(path))\n return\n seenPaths.add(path)\n toRemove.push({ label, path, version })\n }\n\n // Helper to add skills from a lockfile\n const addSkillsFromLock = (skillsDir: string, label: string): string[] => {\n const trackedNames: string[] = []\n const lock = readLock(skillsDir)\n\n if (lock?.skills) {\n for (const [skillName, info] of Object.entries(lock.skills)) {\n trackedNames.push(skillName)\n const skillDir = join(skillsDir, skillName)\n if (existsSync(skillDir)) {\n const version = info.version ? `${info.version.split('.').slice(0, 2).join('.')}.x` : undefined\n addToRemove(`${label}: ${skillName}`, skillDir, version)\n }\n }\n\n // Also add the lockfile itself\n const lockPath = join(skillsDir, 'skilld-lock.yaml')\n if (existsSync(lockPath)) {\n addToRemove(`${label}: skilld-lock.yaml`, lockPath)\n }\n }\n\n return trackedNames\n }\n\n // Helper to find untracked skills in a directory\n const findUntrackedSkills = (skillsDir: string, trackedNames: string[]): string[] => {\n if (!existsSync(skillsDir))\n return []\n const tracked = new Set(trackedNames)\n return readdirSync(skillsDir)\n .filter(f => !f.startsWith('.') && f !== 'skilld-lock.yaml' && !tracked.has(f))\n }\n\n // Track untracked skills per directory (dedupe by path)\n const untrackedByDir = new Map<string, { label: string, skills: string[] }>()\n const processedDirs = new Set<string>()\n\n // Helper to process a skills directory (with deduping)\n const processSkillsDir = (skillsDir: string, label: string) => {\n if (processedDirs.has(skillsDir))\n return\n processedDirs.add(skillsDir)\n\n const tracked = addSkillsFromLock(skillsDir, label)\n const untracked = findUntrackedSkills(skillsDir, tracked)\n if (untracked.length > 0) {\n untrackedByDir.set(skillsDir, { label, skills: untracked })\n }\n }\n\n // Project skills\n if (scope === 'project') {\n for (const [name, agent] of Object.entries(agents)) {\n if (agentFilter && !agentFilter.includes(name as AgentType))\n continue\n processSkillsDir(join(process.cwd(), agent.skillsDir), 'project')\n }\n projectsToUnregister.push(process.cwd())\n }\n\n // All registered projects + global\n if (scope === 'all') {\n const projectPaths = registeredProjects.length > 0 ? registeredProjects : [process.cwd()]\n\n // Show which projects will be affected\n if (registeredProjects.length > 0) {\n p.log.info('Projects to uninstall from:')\n for (const proj of projectPaths) {\n p.log.message(` ${proj}`)\n }\n }\n\n // Project skills from lockfiles\n for (const projectPath of projectPaths) {\n if (!existsSync(projectPath))\n continue\n\n const shortPath = projectPath.replace(process.env.HOME || '', '~')\n\n for (const [name, agent] of Object.entries(agents)) {\n if (agentFilter && !agentFilter.includes(name as AgentType))\n continue\n processSkillsDir(join(projectPath, agent.skillsDir), shortPath)\n }\n\n projectsToUnregister.push(projectPath)\n }\n\n // Global skills from lockfiles\n for (const [name, agent] of Object.entries(agents)) {\n if (agentFilter && !agentFilter.includes(name as AgentType))\n continue\n if (!agent.globalSkillsDir)\n continue\n processSkillsDir(agent.globalSkillsDir, 'user')\n }\n\n // Cache directory\n if (existsSync(CACHE_DIR)) {\n addToRemove('~/.skilld cache', CACHE_DIR)\n }\n }\n\n // Warn about untracked skills that will remain (grouped by label, deduped)\n if (untrackedByDir.size > 0) {\n const groupedUntracked = new Map<string, Set<string>>()\n for (const [_dir, { label, skills }] of untrackedByDir) {\n if (!groupedUntracked.has(label))\n groupedUntracked.set(label, new Set())\n for (const s of skills) groupedUntracked.get(label)!.add(s)\n }\n\n const totalUntracked = [...groupedUntracked.values()].reduce((sum, s) => sum + s.size, 0)\n p.log.warn(`${totalUntracked} untracked skill(s) will remain (not managed by skilld):`)\n for (const [label, skills] of groupedUntracked) {\n p.log.message(` ${label}: ${[...skills].join(', ')}`)\n }\n }\n\n if (toRemove.length === 0) {\n p.log.info('Nothing to uninstall')\n return\n }\n\n // Group by prefix for display\n const groups = new Map<string, Array<{ name: string, version?: string }>>()\n for (const item of toRemove) {\n const [prefix, name] = item.label.includes(': ')\n ? item.label.split(': ', 2)\n : ['other', item.label]\n if (!groups.has(prefix))\n groups.set(prefix, [])\n groups.get(prefix)!.push({ name, version: item.version })\n }\n\n const formatGroup = (items: Array<{ name: string, version?: string }>) =>\n items.map(i => i.version ? `${i.name}@${i.version}` : i.name).join(', ')\n\n p.log.info(`Will remove ${toRemove.length} items:`)\n for (const [prefix, items] of groups) {\n p.log.message(` ${prefix}: ${formatGroup(items)}`)\n }\n\n if (!opts.yes) {\n const confirmed = await p.confirm({\n message: 'Proceed with uninstall?',\n })\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('Cancelled')\n return\n }\n }\n\n // Remove all items\n for (const item of toRemove) {\n rmSync(item.path, { recursive: true, force: true })\n }\n\n // Show grouped removal summary\n for (const [prefix, items] of groups) {\n p.log.success(`Removed ${prefix}: ${formatGroup(items)}`)\n }\n\n // Unregister projects from config (skip if cache dir was removed — config is gone)\n if (scope !== 'all') {\n for (const proj of projectsToUnregister) {\n unregisterProject(proj)\n }\n }\n\n p.outro('skilld uninstalled')\n}\n","import type { FeaturesConfig } from '../core/config'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { getAvailableModels } from '../agent'\nimport { defaultFeatures, updateConfig } from '../core/config'\n\nfunction hasGhCli(): boolean {\n if (process.env.SKILLD_NO_GH)\n return false\n try {\n execSync('gh --version', { stdio: 'ignore' })\n return true\n }\n catch {\n return false\n }\n}\n\nexport async function runWizard(): Promise<void> {\n p.note(\n 'Skilld gives your AI agent skill knowledge on your NPM\\n'\n + 'dependencies gathered from versioned docs, source code\\n'\n + 'and GitHub issues.',\n 'Welcome to skilld',\n )\n\n const ghInstalled = hasGhCli()\n\n if (ghInstalled) {\n p.log.success(\n 'GitHub CLI detected — will use it to pull issues and discussions.',\n )\n }\n else {\n p.log.warn(\n 'GitHub CLI not found. Install it to enable issues/discussions:\\n'\n + ' \\x1B[36mhttps://cli.github.com\\x1B[0m',\n )\n }\n\n // Feature toggles\n const selected = await p.multiselect({\n message: 'Which features would you like to enable?',\n options: [\n { label: 'Semantic + token search', value: 'search' as const, hint: 'local query engine to cut token costs and speed up grep' },\n { label: 'Release notes', value: 'releases' as const, hint: 'track changelogs for installed packages' },\n { label: 'GitHub issues', value: 'issues' as const, hint: 'surface common problems and solutions', disabled: !ghInstalled },\n { label: 'GitHub discussions', value: 'discussions' as const, hint: 'include Q&A and community knowledge', disabled: !ghInstalled },\n ],\n initialValues: [\n ...Object.entries(defaultFeatures)\n .filter(([, v]) => v)\n .map(([k]) => k),\n ...(ghInstalled ? ['issues', 'discussions'] as const : []),\n ] as Array<keyof FeaturesConfig>,\n required: false,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Setup cancelled')\n process.exit(0)\n }\n\n const features: FeaturesConfig = {\n search: selected.includes('search'),\n issues: selected.includes('issues'),\n discussions: selected.includes('discussions'),\n releases: selected.includes('releases'),\n }\n\n // LLM optimization — optional, model selection is independent of target agent\n const allModels = process.env.SKILLD_NO_AGENTS ? [] : await getAvailableModels()\n let modelId: string | undefined\n\n if (allModels.length > 0) {\n p.note(\n 'Skills work without an LLM, but one can rewrite your\\n'\n + 'SKILL.md files with best practices and better structure.\\n'\n + '\\x1B[90mThis is separate from the agent where skills are installed —\\n'\n + 'the target agent is auto-detected from your project files.\\x1B[0m',\n 'Optional: LLM optimization',\n )\n\n const modelChoice = await p.select({\n message: 'Model for generating SKILL.md',\n options: [\n { label: 'Skip', value: '', hint: 'use raw docs, no LLM needed' },\n ...allModels.map(m => ({\n label: m.recommended ? `${m.name} (Recommended)` : m.name,\n value: m.id,\n hint: `${m.agentName} · ${m.hint}`,\n })),\n ],\n })\n\n if (p.isCancel(modelChoice)) {\n p.cancel('Setup cancelled')\n process.exit(0)\n }\n\n modelId = (modelChoice as string) || undefined\n }\n else {\n p.log.warn(\n 'No supported LLM CLIs detected (claude, gemini, codex).\\n'\n + ' Skills will still work, but won\\'t be LLM-optimized.',\n )\n const proceed = await p.confirm({\n message: 'Continue without LLM optimization?',\n initialValue: true,\n })\n if (p.isCancel(proceed) || !proceed) {\n p.cancel('Setup cancelled')\n process.exit(0)\n }\n }\n\n updateConfig({\n features,\n ...(modelId ? { model: modelId as any } : { skipLlm: true }),\n })\n\n p.outro('Thanks, you\\'re all set! Change config anytime with `skilld config`.')\n}\n","#!/usr/bin/env node\nimport type { AgentType } from './agent'\nimport type { PackageUsage } from './agent/detect-imports'\nimport type { ProjectState } from './core'\nimport { existsSync, readFileSync, realpathSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { join, resolve } from 'node:path'\nimport * as p from '@clack/prompts'\nimport { defineCommand, runMain } from 'citty'\nimport pLimit from 'p-limit'\nimport { agents, detectImportedPackages, detectInstalledAgents, detectTargetAgent, getAgentVersion, getModelName } from './agent'\nimport { configCommand, installCommand, removeCommand, runWizard, searchCommand, statusCommand, syncCommand, uninstallCommand } from './commands'\nimport { getProjectState, hasConfig, isOutdated, readConfig } from './core'\nimport { fetchLatestVersion, fetchNpmRegistryMeta } from './sources'\n\n// Suppress node:sqlite ExperimentalWarning (loaded lazily by retriv)\nconst _emit = process.emit\nprocess.emit = (event: string, ...args: any[]) =>\n event === 'warning' && args[0]?.name === 'ExperimentalWarning' && args[0]?.message?.includes('SQLite')\n ? false\n : _emit.apply(process, [event, ...args])\n\nconst require = createRequire(import.meta.url)\nconst { version } = require('../package.json')\n\n// ── Helpers ──\n\nfunction getRepoHint(name: string, cwd: string): string | undefined {\n const pkgJsonPath = join(cwd, 'node_modules', name, 'package.json')\n if (!existsSync(pkgJsonPath))\n return undefined\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'))\n const url = typeof pkg.repository === 'string'\n ? pkg.repository\n : pkg.repository?.url\n if (!url)\n return undefined\n return url\n .replace(/^git\\+/, '')\n .replace(/\\.git$/, '')\n .replace(/^git:\\/\\//, 'https://')\n .replace(/^ssh:\\/\\/git@github\\.com/, 'https://github.com')\n .replace(/^https?:\\/\\/(www\\.)?github\\.com\\//, '')\n}\n\nfunction formatStatus(synced: number, outdated: number): string {\n const parts: string[] = []\n if (synced > 0)\n parts.push(`\\x1B[32m${synced} synced\\x1B[0m`)\n if (outdated > 0)\n parts.push(`\\x1B[33m${outdated} outdated\\x1B[0m`)\n return `Skills: ${parts.join(' · ')}`\n}\n\nfunction relativeTime(date: Date): string {\n const now = Date.now()\n const diff = now - date.getTime()\n const mins = Math.floor(diff / 60000)\n const hours = Math.floor(diff / 3600000)\n const days = Math.floor(diff / 86400000)\n if (mins < 1)\n return 'just now'\n if (mins < 60)\n return `${mins}m ago`\n if (hours < 24)\n return `${hours}h ago`\n return `${days}d ago`\n}\n\nfunction getLastSynced(state: ProjectState): string | null {\n let latest: Date | null = null\n for (const skill of state.skills) {\n if (skill.info?.syncedAt) {\n const d = new Date(skill.info.syncedAt)\n if (!latest || d > latest)\n latest = d\n }\n }\n return latest ? relativeTime(latest) : null\n}\n\ninterface IntroOptions {\n state: ProjectState\n generators?: Array<{ name: string, version: string }>\n modelId?: string\n}\n\n// ── Brand animation ──\n\nconst NOISE_CHARS = '⣿⡿⣷⣾⣽⣻⢿⡷⣯⣟⡾⣵⣳⢾⡽⣞⡷⣝⢯'\n\n// Seed hue from cwd so each project gets a consistent color\nfunction djb2(s: string): number {\n let h = 5381\n for (let i = 0; i < s.length; i++)\n h = ((h << 5) + h + s.charCodeAt(i)) >>> 0\n return h\n}\n\nfunction hueToChannel(p: number, q: number, t: number): number {\n const t1 = t < 0 ? t + 1 : t > 1 ? t - 1 : t\n if (t1 < 1 / 6)\n return p + (q - p) * 6 * t1\n if (t1 < 1 / 2)\n return q\n if (t1 < 2 / 3)\n return p + (q - p) * (2 / 3 - t1) * 6\n return p\n}\n\nfunction hsl(h: number, s: number, l: number): [number, number, number] {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n return [\n Math.round(hueToChannel(p, q, h + 1 / 3) * 255),\n Math.round(hueToChannel(p, q, h) * 255),\n Math.round(hueToChannel(p, q, h - 1 / 3) * 255),\n ]\n}\n\nconst BRAND_HUE = (djb2(process.cwd()) % 360) / 360\n\n// density 0 = random sparse braille, density 1 = ⣿ (all dots filled)\nfunction noiseChar(brightness: number, density = 0): string {\n if (brightness < 0.08)\n return ' '\n const b = Math.min(brightness, 1)\n const ch = Math.random() < density ? '⣿' : NOISE_CHARS[Math.floor(Math.random() * NOISE_CHARS.length)]\n const [r, g, bl] = hsl(BRAND_HUE, 0.4 + b * 0.15, 0.35 + b * 0.25)\n return `\\x1B[38;2;${r};${g};${bl}m${ch}`\n}\n\nfunction noiseLine(len: number, brightnessFn: (x: number) => number, density = 0): string {\n let s = ''\n for (let i = 0; i < len; i++)\n s += noiseChar(brightnessFn(i), density)\n return `${s}\\x1B[0m`\n}\n\nfunction brandFrame(t: number, floor = 0, density = 0): string {\n const cx = 5\n const cy = 1\n const brightness = (x: number, y: number) => {\n const d = Math.sqrt((x - cx) ** 2 + ((y - cy) * 3) ** 2)\n let val = 0\n for (let ring = 0; ring < 3; ring++) {\n const rt = t - ring * 0.5\n if (rt <= 0)\n continue\n const front = rt * 4\n const proximity = Math.abs(d - front)\n val += Math.exp(-proximity * proximity * 0.8) * Math.exp(-rt * 0.4)\n }\n const base = Math.max(0, (t - 1.5) * 0.3) * (Math.random() * 0.3 + 0.1)\n return Math.min(1, Math.max(floor, val + base))\n }\n return [\n noiseLine(10, x => brightness(x, 0), density),\n `${noiseLine(2, x => brightness(x, 1), density)} %NAME% ${noiseLine(2, x => brightness(x + 8, 1), density)} %VER%`,\n noiseLine(10, x => brightness(x, 2), density),\n ].join('\\n')\n}\n\nasync function brandLoader<T>(work: () => Promise<T>, minMs = 1500): Promise<T> {\n if (process.env.SKILLD_EFFECT === 'none')\n return work()\n\n const logUpdate = (await import('log-update')).default\n const name = '\\x1B[1m\\x1B[38;2;255;255;255mskilld\\x1B[0m'\n const ver = `\\x1B[2mv${version}\\x1B[0m`\n const status = '\\x1B[2mSetting up your environment\\x1B[0m'\n const start = Date.now()\n\n const sub = (raw: string) => raw.replace('%NAME%', name).replace('%VER%', ver)\n\n let done = false\n const result = Promise.all([\n work(),\n new Promise<void>(r => setTimeout(r, minMs)),\n ]).then(([v]) => {\n done = true\n return v\n })\n\n // Main animation — ripple with status text\n // eslint-disable-next-line no-unmodified-loop-condition -- modified async in .then()\n while (!done) {\n const t = (Date.now() - start) / 1000\n logUpdate(`\\n ${sub(brandFrame(t))}\\n\\n ${status}`)\n await new Promise(r => setTimeout(r, 60))\n }\n\n // Fill outro — ramp floor + density so all dots fill in\n const outroMs = 500\n const outroStart = Date.now()\n const tFinal = (outroStart - start) / 1000\n while (Date.now() - outroStart < outroMs) {\n const p = (Date.now() - outroStart) / outroMs\n const eased = p * p\n logUpdate(`\\n ${sub(brandFrame(tFinal + p * 0.5, eased * 0.9, eased))}\\n`)\n await new Promise(r => setTimeout(r, 40))\n }\n\n // Final frame — all pixels ⣿, full brightness\n logUpdate(`\\n ${sub(brandFrame(tFinal + 1, 0.9, 1))}\\n`)\n logUpdate.done()\n return result\n}\n\nfunction introLine({ state, generators, modelId }: IntroOptions): string {\n const name = '\\x1B[1m\\x1B[35mskilld\\x1B[0m'\n const ver = `\\x1B[90mv${version}\\x1B[0m`\n const lastSynced = getLastSynced(state)\n const synced = lastSynced ? ` · \\x1B[90msynced ${lastSynced}\\x1B[0m` : ''\n const modelStr = modelId ? ` · ${getModelName(modelId as any)}` : ''\n const genStr = generators?.length\n ? generators.map(g => `${g.name} v${g.version}`).join(', ')\n : ''\n const genLine = genStr ? `\\n\\x1B[90m↳ ${genStr}${modelStr}\\x1B[0m` : ''\n return `${name} ${ver}${synced}${genLine}`\n}\n\n/** Get installed LLM generators with working CLIs (verified via --version) */\nfunction getInstalledGenerators(): Array<{ name: string, version: string }> {\n const installed = detectInstalledAgents()\n return installed\n .filter(id => agents[id].cli)\n .map((id) => {\n const version = getAgentVersion(id)\n return version ? { name: agents[id].displayName, version } : null\n })\n .filter((a): a is { name: string, version: string } => a !== null)\n}\n\n/** Non-interactive sync for pnpm prepare hook. Syncs outdated skills only, no LLM, exits 0 always. */\nasync function prepareSync(cwd: string, agentFlag?: AgentType): Promise<void> {\n const agent = resolveAgent(agentFlag)\n\n if (!agent)\n return\n\n const state = await getProjectState(cwd)\n if (state.outdated.length === 0) {\n p.log.success('Skills up to date')\n return\n }\n\n const packages = state.outdated.map(s => s.packageName || s.name)\n await syncCommand(state, {\n packages,\n global: false,\n agent,\n yes: true,\n })\n}\n\n/** Resolve agent from flags/cwd/config. cwd is source of truth over config. */\nfunction resolveAgent(agentFlag?: string): AgentType | null {\n return (agentFlag as AgentType | undefined)\n ?? detectTargetAgent()\n ?? (readConfig().agent as AgentType | undefined)\n ?? null\n}\n\n// ── Shared args reused by subcommands ──\n\nconst sharedArgs = {\n global: {\n type: 'boolean' as const,\n alias: 'g',\n description: 'Install globally to ~/.claude/skills',\n default: false,\n },\n agent: {\n type: 'string' as const,\n alias: 'a',\n description: 'Agent where skills are installed (claude-code, cursor, windsurf, etc.)',\n },\n yes: {\n type: 'boolean' as const,\n alias: 'y',\n description: 'Skip prompts, use defaults',\n default: false,\n },\n force: {\n type: 'boolean' as const,\n alias: 'f',\n description: 'Ignore all caches, re-fetch docs and regenerate',\n default: false,\n },\n}\n\n// ── Subcommands ──\n\nconst SUBCOMMAND_NAMES = ['add', 'update', 'status', 'config', 'remove', 'install', 'uninstall', 'search']\n\nconst addCommand = defineCommand({\n meta: { name: 'add', description: 'Add skills for package(s)' },\n args: {\n package: {\n type: 'positional',\n description: 'Package(s) to sync, comma-separated (e.g., vue,nuxt,pinia)',\n required: true,\n },\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n const agent = resolveAgent(args.agent)\n if (!agent) {\n p.log.warn('Could not detect agent. Use --agent <name>')\n return\n }\n\n const state = await getProjectState(cwd)\n p.intro(introLine({ state }))\n\n const packages = args.package.split(',').map(s => s.trim()).filter(Boolean)\n return syncCommand(state, {\n packages,\n global: args.global,\n agent,\n yes: args.yes,\n force: args.force,\n })\n },\n})\n\nconst updateSubCommand = defineCommand({\n meta: { name: 'update', description: 'Update outdated skills' },\n args: {\n package: {\n type: 'positional',\n description: 'Package(s) to update, comma-separated. Without args, syncs all outdated.',\n required: false,\n },\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n const agent = resolveAgent(args.agent)\n if (!agent) {\n p.log.warn('Could not detect agent. Use --agent <name>')\n return\n }\n\n const state = await getProjectState(cwd)\n const generators = getInstalledGenerators()\n const config = readConfig()\n p.intro(introLine({ state, generators, modelId: config.model }))\n\n // Specific packages\n if (args.package) {\n const packages = args.package.split(',').map(s => s.trim()).filter(Boolean)\n return syncCommand(state, {\n packages,\n global: args.global,\n agent,\n yes: args.yes,\n force: args.force,\n })\n }\n\n // No args: sync all outdated\n if (state.outdated.length === 0) {\n p.log.success('All skills up to date')\n return\n }\n\n const packages = state.outdated.map(s => s.packageName || s.name)\n return syncCommand(state, {\n packages,\n global: args.global,\n agent,\n yes: args.yes,\n force: args.force,\n })\n },\n})\n\nconst statusSubCommand = defineCommand({\n meta: { name: 'status', description: 'Show skill status' },\n args: {\n global: sharedArgs.global,\n },\n run({ args }) {\n return statusCommand({ global: args.global })\n },\n})\n\nconst configSubCommand = defineCommand({\n meta: { name: 'config', description: 'Edit settings' },\n args: {},\n async run() {\n const cwd = process.cwd()\n const state = await getProjectState(cwd)\n const generators = getInstalledGenerators()\n const config = readConfig()\n p.intro(introLine({ state, generators, modelId: config.model }))\n return configCommand()\n },\n})\n\nconst removeSubCommand = defineCommand({\n meta: { name: 'remove', description: 'Remove installed skills' },\n args: {\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n const agent = resolveAgent(args.agent)\n if (!agent) {\n p.log.warn('Could not detect agent. Use --agent <name>')\n return\n }\n\n const state = await getProjectState(cwd)\n const generators = getInstalledGenerators()\n const config = readConfig()\n const scope = args.global ? 'global' : 'project'\n const intro = { state, generators, modelId: config.model }\n p.intro(`${introLine(intro)} · remove (${scope})`)\n\n return removeCommand(state, {\n global: args.global,\n agent,\n yes: args.yes,\n })\n },\n})\n\nconst installSubCommand = defineCommand({\n meta: { name: 'install', description: 'Restore references from lockfile' },\n args: {\n global: sharedArgs.global,\n agent: sharedArgs.agent,\n },\n async run({ args }) {\n const agent = resolveAgent(args.agent)\n if (!agent) {\n p.log.warn('Could not detect agent. Use --agent <name>')\n return\n }\n\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m install`)\n return installCommand({ global: args.global, agent })\n },\n})\n\nconst uninstallSubCommand = defineCommand({\n meta: { name: 'uninstall', description: 'Remove skilld data' },\n args: {\n ...sharedArgs,\n },\n async run({ args }) {\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m uninstall`)\n return uninstallCommand({\n scope: args.global ? 'all' : undefined,\n agent: args.agent as AgentType | undefined,\n yes: args.yes,\n })\n },\n})\n\nconst searchSubCommand = defineCommand({\n meta: { name: 'search', description: 'Search indexed docs' },\n args: {\n query: {\n type: 'positional',\n description: 'Search query (e.g., \"useFetch options\")',\n required: true,\n },\n package: {\n type: 'string',\n alias: 'p',\n description: 'Filter by package name',\n },\n },\n async run({ args }) {\n return searchCommand(args.query, args.package || undefined)\n },\n})\n\n// ── Main command ──\n\nconst main = defineCommand({\n meta: {\n name: 'skilld',\n description: 'Sync package documentation for agentic use',\n },\n args: {\n prepare: {\n type: 'boolean',\n description: 'Non-interactive sync for pnpm prepare hook (outdated only, no LLM, always exits 0)',\n default: false,\n },\n background: {\n type: 'boolean',\n alias: 'b',\n description: 'Run --prepare in background (detached process)',\n default: false,\n },\n agent: sharedArgs.agent,\n },\n subCommands: {\n add: addCommand,\n update: updateSubCommand,\n status: statusSubCommand,\n config: configSubCommand,\n remove: removeSubCommand,\n install: installSubCommand,\n uninstall: uninstallSubCommand,\n search: searchSubCommand,\n },\n async run({ args }) {\n // Guard: citty always calls parent run() after subcommand dispatch.\n // If a subcommand was invoked, bail out here.\n const firstArg = process.argv[2]\n if (firstArg && !firstArg.startsWith('-') && SUBCOMMAND_NAMES.includes(firstArg))\n return\n\n const cwd = process.cwd()\n\n // Prepare mode — pnpm prepare hook: sync outdated only, no LLM, no prompts, always exit 0\n if (args.prepare) {\n // Background mode: spawn detached process and exit immediately\n if (args.background) {\n const { spawn } = await import('node:child_process')\n const child = spawn(process.execPath, [process.argv[1], '--prepare', ...(args.agent ? ['--agent', args.agent] : [])], {\n cwd,\n detached: true,\n stdio: 'ignore',\n })\n child.unref()\n return\n }\n await prepareSync(cwd, args.agent as AgentType | undefined).catch(() => {})\n return\n }\n\n // Bare `skilld` — interactive menu\n const currentAgent = resolveAgent(args.agent)\n\n if (!currentAgent) {\n p.log.warn('Could not detect agent. Use --agent <name> or `skilld config`')\n p.log.info(`Supported: ${Object.keys(agents).join(', ')}`)\n return\n }\n\n // Animate brand while bootstrapping + check for updates\n const { state, selfUpdate } = await brandLoader(async () => {\n const config = readConfig()\n const state = await getProjectState(cwd)\n\n // Run self-update check + unmatched skills NPM check in parallel\n let selfUpdate = null as { latest: string, releasedAt?: string } | null\n const tasks: Promise<void>[] = []\n\n // Check if skilld itself has a newer version (skip for npx/dlx/bunx)\n const isEphemeral = process.env.npm_command === 'exec'\n if (!isEphemeral) {\n tasks.push(\n fetchNpmRegistryMeta('skilld', version).then((meta) => {\n const latestTag = meta.distTags?.latest\n if (latestTag && latestTag.version !== version)\n selfUpdate = { latest: latestTag.version, releasedAt: latestTag.releasedAt }\n }).catch(() => {}),\n )\n }\n\n // For skills not in local deps, check NPM for version updates\n if (state.unmatched.length > 0) {\n const limit = pLimit(5)\n tasks.push(\n Promise.all(state.unmatched.map(skill => limit(async () => {\n const pkgName = skill.info?.packageName || skill.name\n const latest = await fetchLatestVersion(pkgName)\n if (latest && isOutdated(skill, latest)) {\n state.outdated.push({ ...skill, packageName: pkgName, latestVersion: latest })\n }\n else if (latest) {\n state.synced.push({ ...skill, packageName: pkgName, latestVersion: latest })\n }\n }))).then(() => {}),\n )\n }\n\n await Promise.all(tasks)\n return { config, state, selfUpdate }\n })\n\n // Show self-update notification\n if (selfUpdate) {\n const released = selfUpdate.releasedAt ? `\\x1B[90m · ${relativeTime(new Date(selfUpdate.releasedAt))}\\x1B[0m` : ''\n const binPath = realpathSync(process.argv[1])\n const isLocal = binPath.startsWith(resolve(cwd, 'node_modules'))\n const flag = isLocal ? '' : ' -g'\n const cmd = `npx nypm add${flag} skilld@${selfUpdate.latest}`\n p.note(\n `\\x1B[90m${version}\\x1B[0m → \\x1B[1m\\x1B[32m${selfUpdate.latest}\\x1B[0m${released}\\n\\x1B[36m${cmd}\\x1B[0m`,\n '\\x1B[33mUpdate available\\x1B[0m',\n )\n }\n\n // First time setup - no skills yet\n if (state.skills.length === 0) {\n if (!hasConfig()) {\n await runWizard()\n }\n\n // Transition to project setup\n const pkgJsonPath = join(cwd, 'package.json')\n const projectName = existsSync(pkgJsonPath)\n ? JSON.parse(readFileSync(pkgJsonPath, 'utf-8')).name\n : undefined\n const projectLabel = projectName\n ? `Generating skills for \\x1B[36m${projectName}\\x1B[0m`\n : 'Generating skills for current directory'\n p.log.step(projectLabel)\n p.log.info('Tip: Only generate skills for packages your agent struggles with.\\n The fewer skills, the more context you have for everything else :)')\n\n const source = await p.select({\n message: 'How should I find packages?',\n options: [\n { label: 'Scan source files', value: 'imports', hint: 'Find actually used imports' },\n { label: 'Use package.json', value: 'deps', hint: `All ${state.deps.size} dependencies` },\n { label: 'Enter manually', value: 'manual' },\n ],\n })\n\n if (p.isCancel(source)) {\n p.cancel('Setup cancelled')\n return\n }\n\n // Get packages based on source\n let selected: string[]\n\n if (source === 'manual') {\n const input = await p.text({\n message: 'Enter package names (comma-separated)',\n placeholder: 'vue, nuxt, pinia',\n })\n if (p.isCancel(input) || !input) {\n p.cancel('No packages entered')\n return\n }\n selected = input.split(',').map(s => s.trim()).filter(Boolean)\n }\n else {\n let usages: PackageUsage[]\n if (source === 'imports') {\n const spinner = p.spinner()\n spinner.start('Scanning imports...')\n const result = await detectImportedPackages(cwd)\n spinner.stop(`Found ${result.packages.length} imported packages`)\n\n if (result.packages.length === 0) {\n p.log.warn('No imports found, falling back to package.json')\n usages = [...state.deps.keys()].map(name => ({ name, count: 0 }))\n }\n else {\n // Filter to packages in deps (presets pass through even if not in deps)\n const depSet = new Set(state.deps.keys())\n usages = result.packages.filter(pkg => depSet.has(pkg.name) || pkg.source === 'preset')\n\n if (usages.length === 0) {\n p.log.warn('No matching dependencies, using all imports')\n usages = result.packages\n }\n }\n }\n else {\n usages = [...state.deps.keys()].map(name => ({ name, count: 0 }))\n }\n\n // Let user select which packages\n const packages = usages.map(u => u.name)\n const sourceMap = new Map(usages.map(u => [u.name, u.source]))\n const maxLen = Math.max(...packages.map(n => n.length))\n const choice = await p.multiselect({\n message: `Select packages (${packages.length} found)`,\n options: packages.map((name) => {\n const ver = state.deps.get(name)?.replace(/^[\\^~>=<]/, '') || ''\n const repo = getRepoHint(name, cwd)\n const hint = sourceMap.get(name) === 'preset' ? 'nuxt module' : undefined\n const pad = ' '.repeat(maxLen - name.length + 2)\n const meta = [ver, hint, repo].filter(Boolean).join(' ')\n return { label: meta ? `${name}${pad}\\x1B[90m${meta}\\x1B[39m` : name, value: name }\n }),\n initialValues: packages,\n })\n\n if (p.isCancel(choice) || choice.length === 0) {\n p.cancel('No packages selected')\n return\n }\n selected = choice\n }\n\n // syncCommand will ask about LLM after generating base skills\n return syncCommand(state, {\n packages: selected,\n global: false,\n agent: currentAgent,\n yes: false,\n })\n }\n\n // Has skills - show status + interactive menu\n const status = formatStatus(state.synced.length, state.outdated.length)\n p.log.info(status)\n\n // Menu loop — Escape in sub-actions returns to menu\n\n while (true) {\n type ActionValue = 'install' | 'update' | 'remove' | 'status' | 'config'\n const options: Array<{ label: string, value: ActionValue, hint?: string }> = []\n\n options.push({ label: 'Add new skills', value: 'install' })\n if (state.outdated.length > 0) {\n options.push({ label: 'Update skills', value: 'update', hint: `\\x1B[33m${state.outdated.length} outdated\\x1B[0m` })\n }\n options.push(\n { label: 'Remove skills', value: 'remove' },\n { label: 'Status', value: 'status' },\n { label: 'Configure', value: 'config' },\n )\n\n const action = await p.select({\n message: 'What would you like to do?',\n options,\n })\n\n if (p.isCancel(action)) {\n p.cancel('Cancelled')\n return\n }\n\n switch (action) {\n case 'install': {\n const installedNames = new Set(state.skills.map(s => s.packageName || s.name))\n const uninstalledDeps = [...state.deps.keys()].filter(d => !installedNames.has(d))\n const allDepsInstalled = uninstalledDeps.length === 0\n\n const source = await p.select({\n message: 'How should I find packages?',\n options: [\n { label: 'Scan source files', value: 'imports' as const, hint: allDepsInstalled ? 'all installed' : 'find actually used imports', disabled: allDepsInstalled },\n { label: 'Use package.json', value: 'deps' as const, hint: allDepsInstalled ? 'all installed' : `${uninstalledDeps.length} uninstalled`, disabled: allDepsInstalled },\n { label: 'Enter manually', value: 'manual' as const },\n ],\n })\n\n if (p.isCancel(source))\n continue\n\n let selected: string[]\n\n if (source === 'manual') {\n const input = await p.text({\n message: 'Enter package names (comma-separated)',\n placeholder: 'vue, nuxt, pinia',\n })\n if (p.isCancel(input) || !input)\n continue\n selected = input.split(',').map(s => s.trim()).filter(Boolean)\n if (selected.length === 0)\n continue\n }\n else {\n let usages: PackageUsage[]\n if (source === 'imports') {\n const spinner = p.spinner()\n spinner.start('Scanning imports...')\n const result = await detectImportedPackages(cwd)\n spinner.stop(`Found ${result.packages.length} imported packages`)\n\n if (result.packages.length === 0) {\n p.log.warn('No imports found, falling back to package.json')\n usages = uninstalledDeps.map(name => ({ name, count: 0 }))\n }\n else {\n const depSet = new Set(state.deps.keys())\n usages = result.packages\n .filter(pkg => depSet.has(pkg.name) || pkg.source === 'preset')\n .filter(pkg => !installedNames.has(pkg.name))\n\n if (usages.length === 0) {\n p.log.warn('All detected imports already have skills')\n continue\n }\n }\n }\n else {\n usages = uninstalledDeps.map(name => ({ name, count: 0 }))\n }\n\n const packages = usages.map(u => u.name)\n const sourceMap = new Map(usages.map(u => [u.name, u.source]))\n const maxLen = Math.max(...packages.map(n => n.length))\n const choice = await p.multiselect({\n message: `Select packages (${packages.length} found)`,\n options: packages.map((name) => {\n const ver = state.deps.get(name)?.replace(/^[\\^~>=<]/, '') || ''\n const repo = getRepoHint(name, cwd)\n const hint = sourceMap.get(name) === 'preset' ? 'nuxt module' : undefined\n const pad = ' '.repeat(maxLen - name.length + 2)\n const meta = [ver, hint, repo].filter(Boolean).join(' ')\n return { label: meta ? `${name}${pad}\\x1B[90m${meta}\\x1B[39m` : name, value: name }\n }),\n initialValues: packages,\n })\n\n if (p.isCancel(choice) || choice.length === 0)\n continue\n selected = choice\n }\n\n return syncCommand(state, {\n packages: selected,\n global: false,\n agent: currentAgent,\n yes: false,\n })\n }\n case 'update': {\n if (state.outdated.length === 0) {\n p.log.success('All skills up to date')\n return\n }\n const selected = await p.multiselect({\n message: 'Select packages to update',\n options: state.outdated.map(s => ({\n label: s.name,\n value: s.packageName || s.name,\n hint: `${s.info?.version ?? 'unknown'} → ${s.latestVersion}`,\n })),\n initialValues: state.outdated.map(s => s.packageName || s.name),\n })\n if (p.isCancel(selected) || selected.length === 0)\n continue\n return syncCommand(state, {\n packages: selected,\n global: false,\n agent: currentAgent,\n yes: false,\n })\n }\n case 'remove':\n await removeCommand(state, {\n global: false,\n agent: currentAgent,\n yes: false,\n })\n continue\n case 'status':\n await statusCommand({ global: false })\n continue\n case 'config':\n await configCommand()\n continue\n }\n }\n },\n})\n\nrunMain(main)\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,14 +1,5 @@
1
- import { FetchedDoc, SkillConfig, SkillResult } from "./types.mjs";
2
-
3
- //#region src/index.d.ts
4
- /**
5
- * Generate a skill from a documentation site
6
- */
7
- declare function generateSkill(config: SkillConfig, onProgress?: (info: {
8
- url: string;
9
- count: number;
10
- phase: 'fetch' | 'index';
11
- }) => void): Promise<SkillResult>;
12
- //#endregion
13
- export { type FetchedDoc, type SkillConfig, type SkillResult, generateSkill };
14
- //# sourceMappingURL=index.d.mts.map
1
+ import { C as CachedDoc, D as SEARCH_DB, E as REFERENCES_DIR, S as CacheConfig, T as CACHE_DIR, _ as listCached, a as clearAllCache, d as isCached, m as linkReferences, n as getCacheKey, o as clearCache, r as getVersionKey, s as ensureCacheDir, t as getCacheDir, w as CachedPackage, x as writeToCache, y as readCachedDocs } from "./_chunks/version.mjs";
2
+ import { a as SearchOptions, i as SearchFilter, n as Document, o as SearchResult, r as IndexConfig, s as SearchSnippet } from "./_chunks/types.mjs";
3
+ import { createIndex, search, searchSnippets } from "./retriv/index.mjs";
4
+ import { A as parseMarkdownLinks, C as resolvePackageDocs, D as fetchLlmsTxt, F as NpmPackageInfo, M as LlmsContent, N as LlmsLink, P as LocalDependency, R as ResolvedPackage, T as downloadLlmsDocs, b as readLocalDependencies, h as fetchNpmPackage, j as FetchedDoc, k as normalizeLlmsLinks, q as fetchReadmeContent } from "./_chunks/utils.mjs";
5
+ export { CACHE_DIR, type CacheConfig, type CachedDoc, type CachedPackage, type Document, type FetchedDoc, type IndexConfig, type LlmsContent, type LlmsLink, type LocalDependency, type NpmPackageInfo, REFERENCES_DIR, type ResolvedPackage, SEARCH_DB, type SearchFilter, type SearchOptions, type SearchResult, type SearchSnippet, clearAllCache, clearCache, createIndex, downloadLlmsDocs, ensureCacheDir, fetchLlmsTxt, fetchNpmPackage, fetchReadmeContent, getCacheDir, getCacheKey, getVersionKey, isCached, linkReferences, listCached, normalizeLlmsLinks, parseMarkdownLinks, readCachedDocs, readLocalDependencies, resolvePackageDocs, search, searchSnippets, writeToCache };