skilldb 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/search.ts","../src/config.ts","../src/client.ts","../src/commands/list.ts","../src/commands/add.ts","../src/cache.ts","../src/commands/get.ts","../src/commands/info.ts","../src/commands/init.ts","../src/commands/login.ts","../src/commands/use.ts","../src/commands/budget.ts","../src/commands/slim.ts","../src/commands/recommend.ts","../src/commands/doctor.ts","../src/commands/update.ts","../src/commands/remove.ts","../src/commands/export.ts","../src/commands/stats.ts","../src/commands/diff.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { searchCommand } from './commands/search.js';\nimport { listCommand } from './commands/list.js';\nimport { addCommand } from './commands/add.js';\nimport { getCommand } from './commands/get.js';\nimport { infoCommand } from './commands/info.js';\nimport { initCommand } from './commands/init.js';\nimport { loginCommand } from './commands/login.js';\nimport { useCommand } from './commands/use.js';\nimport { budgetCommand } from './commands/budget.js';\nimport { slimCommand } from './commands/slim.js';\nimport { recommendCommand } from './commands/recommend.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { updateCommand } from './commands/update.js';\nimport { removeCommand } from './commands/remove.js';\nimport { exportCommand } from './commands/export.js';\nimport { statsCommand } from './commands/stats.js';\nimport { diffCommand } from './commands/diff.js';\n\nconst program = new Command();\n\nprogram\n .name('skilldb')\n .description('SkillDB CLI — discover, install, and manage AI agent skills')\n .version('0.2.1');\n\nprogram\n .command('init')\n .description('Initialize SkillDB in this project (detect IDE, create .skilldb/)')\n .action(initCommand);\n\nprogram\n .command('login')\n .description('Save your SkillDB API key')\n .action(loginCommand);\n\nprogram\n .command('search <query...>')\n .description('Search skills by keyword(s)')\n .option('-c, --category <name>', 'Filter by category')\n .option('-l, --limit <n>', 'Max results', '20')\n .action((queryParts: string[], options: { category?: string; limit?: string }) => {\n searchCommand(queryParts.join(' '), options);\n });\n\nprogram\n .command('list')\n .description('List skills, optionally filtered')\n .option('-c, --category <name>', 'Filter by category')\n .option('-p, --pack <name>', 'Filter by pack')\n .option('-l, --limit <n>', 'Max results', '50')\n .action(listCommand);\n\nprogram\n .command('get <id>')\n .description('Download a single skill to .skilldb/skills/ (e.g. \"software-skills/code-review\")')\n .action(getCommand);\n\nprogram\n .command('add <pack>')\n .description('Download an entire skill pack to local .skilldb/skills/ cache')\n .action(addCommand);\n\nprogram\n .command('info <id>')\n .description('Show metadata and preview for a skill (e.g. \"software-skills/code-review\")')\n .action(infoCommand);\n\nprogram\n .command('use [profile]')\n .description('Activate a skill profile (frontend, backend, devops, security, data, fullstack, mobile, ai-agent, auto, none)')\n .option('--list', 'List available profiles')\n .option('--current', 'Show active profile')\n .action((profile: string | undefined, options: { list?: boolean; current?: boolean }) => {\n if (!profile && !options.list && !options.current) {\n options.list = true;\n }\n useCommand(profile || '', options);\n });\n\nprogram\n .command('budget [action] [value]')\n .description('Manage token/line budget for active skills')\n .action((action?: string, value?: string) => {\n budgetCommand(action, value);\n });\n\nprogram\n .command('slim [pack]')\n .description('Generate compressed skill summaries')\n .option('-r, --ratio <ratio>', 'Keep ratio (0-1, default 0.3)', '0.3')\n .action((pack: string | undefined, options: { ratio?: string }) => {\n slimCommand(pack, options);\n });\n\nprogram\n .command('recommend')\n .description('Scan project and suggest skill packs')\n .option('-i, --install', 'Auto-install recommendations')\n .action(recommendCommand);\n\nprogram\n .command('doctor')\n .description('Run health check and audit on installed skills')\n .action(doctorCommand);\n\nprogram\n .command('update [pack]')\n .description('Update installed skills from remote')\n .action((pack?: string) => {\n updateCommand(pack);\n });\n\nprogram\n .command('remove <target>')\n .description('Remove a skill or pack (e.g. \"software-skills/code-review\" or \"software-skills\")')\n .option('--unused', 'Remove skills not in active profile')\n .action((target: string, options: { unused?: boolean }) => {\n removeCommand(target, options);\n });\n\nprogram\n .command('export <format> [target]')\n .description('Export skills (formats: claude, cursor, profile, inject)')\n .action((format: string, target?: string) => {\n exportCommand(format, target);\n });\n\nprogram\n .command('stats')\n .description('Show local statistics and coverage')\n .action(statsCommand);\n\nprogram\n .command('diff [target]')\n .description('Compare local skills with latest remote versions')\n .action((target?: string) => {\n diffCommand(target);\n });\n\nprogram.parse();\n","import pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\n\nexport async function searchCommand(query: string, options: { category?: string; limit?: string }): Promise<void> {\n const client = new SkillDBClient();\n const limit = options.limit ? parseInt(options.limit) : 20;\n\n try {\n const res = await client.search(query, { category: options.category, limit });\n\n if (res.skills.length === 0) {\n console.log(pc.yellow(`No skills found for \"${query}\"`));\n return;\n }\n\n console.log(pc.bold(`Found ${res.pagination.total} skill${res.pagination.total === 1 ? '' : 's'} for \"${query}\":\\n`));\n\n // Column widths\n const idW = 42;\n const nameW = 28;\n const descW = 44;\n\n console.log(\n pc.dim(\n pad('ID', idW) + pad('SKILL', nameW) + 'DESCRIPTION'\n )\n );\n console.log(pc.dim('─'.repeat(idW + nameW + descW)));\n\n for (const s of res.skills) {\n const id = truncate(s.id.replace('.md', ''), idW - 2);\n const name = truncate(s.title, nameW - 2);\n const desc = truncate(s.description, descW);\n console.log(\n pc.white(pad(id, idW)) + pc.cyan(pad(name, nameW)) + pc.dim(desc)\n );\n }\n\n if (res.pagination.hasMore) {\n console.log(pc.dim(`\\n... and ${res.pagination.total - res.skills.length} more. Use --limit to see more.`));\n }\n\n console.log(pc.dim(`\\nTo download a skill: `) + pc.cyan(`skilldb get <pack>/<skill-name>`));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n\nfunction pad(str: string, width: number): string {\n return str.length >= width ? str.slice(0, width) : str + ' '.repeat(width - str.length);\n}\n\nfunction truncate(str: string, max: number): string {\n return str.length <= max ? str : str.slice(0, max - 1) + '…';\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nconst RC_FILE = '.skilldbrc';\n\nexport const DEFAULT_BASE_URL = 'https://skilldb.dev/api/v1';\n\ninterface RcConfig {\n apiKey?: string;\n}\n\nfunction readJson(filePath: string): RcConfig | null {\n try {\n const raw = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve API key from (in priority order):\n * 1. SKILLDB_API_KEY env var\n * 2. .skilldbrc in project root (cwd)\n * 3. ~/.skilldbrc in home dir\n */\nexport function resolveApiKey(): string | undefined {\n if (process.env.SKILLDB_API_KEY) {\n return process.env.SKILLDB_API_KEY;\n }\n\n const projectRc = path.join(process.cwd(), RC_FILE);\n const projectConfig = readJson(projectRc);\n if (projectConfig?.apiKey) return projectConfig.apiKey;\n\n const homeRc = path.join(os.homedir(), RC_FILE);\n const homeConfig = readJson(homeRc);\n if (homeConfig?.apiKey) return homeConfig.apiKey;\n\n return undefined;\n}\n\n/**\n * Resolve base URL from env or default.\n */\nexport function resolveBaseUrl(): string {\n return process.env.SKILLDB_API_URL || DEFAULT_BASE_URL;\n}\n\n/**\n * Save API key to ~/.skilldbrc (user-wide) or project .skilldbrc.\n */\nexport function saveApiKey(apiKey: string, global = true): string {\n const target = global\n ? path.join(os.homedir(), RC_FILE)\n : path.join(process.cwd(), RC_FILE);\n\n const existing = readJson(target) || {};\n fs.writeFileSync(target, JSON.stringify({ ...existing, apiKey }, null, 2) + '\\n', 'utf-8');\n return target;\n}\n","import type { ClientConfig, Skill, SkillsResponse, SearchOptions } from './types.js';\nimport { resolveApiKey, resolveBaseUrl } from './config.js';\n\nexport class SkillDBClient {\n private apiKey?: string;\n private baseUrl: string;\n\n constructor(config?: ClientConfig) {\n this.apiKey = config?.apiKey ?? resolveApiKey();\n this.baseUrl = config?.baseUrl ?? resolveBaseUrl();\n }\n\n private headers(): Record<string, string> {\n const h: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.apiKey) {\n h['Authorization'] = `Bearer ${this.apiKey}`;\n }\n return h;\n }\n\n private async request<T>(endpoint: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== '') url.searchParams.set(k, v);\n }\n }\n\n const res = await fetch(url.toString(), { headers: this.headers() });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n const msg = (body as Record<string, string>).error || `HTTP ${res.status}`;\n throw new Error(msg);\n }\n\n return res.json() as Promise<T>;\n }\n\n /** Search skills by keyword. */\n async search(query: string, options?: Omit<SearchOptions, 'search'>): Promise<SkillsResponse> {\n return this.request<SkillsResponse>('/skills', {\n search: query,\n category: options?.category ?? '',\n pack: options?.pack ?? '',\n limit: String(options?.limit ?? 20),\n offset: String(options?.offset ?? 0),\n include_content: options?.includeContent ? 'true' : '',\n });\n }\n\n /** List skills with optional filters. */\n async list(options?: SearchOptions): Promise<SkillsResponse> {\n return this.request<SkillsResponse>('/skills', {\n category: options?.category ?? '',\n pack: options?.pack ?? '',\n search: options?.search ?? '',\n limit: String(options?.limit ?? 50),\n offset: String(options?.offset ?? 0),\n include_content: options?.includeContent ? 'true' : '',\n });\n }\n\n /** Get a single skill by ID (e.g. \"software-skills/code-review.md\"). */\n async get(id: string): Promise<Skill> {\n const encoded = encodeURIComponent(id);\n const res = await this.request<Skill | { skill: Skill }>(`/skills/${encoded}`, {\n include_content: 'true',\n });\n // Handle both direct and wrapped responses\n return 'skill' in res ? res.skill : res;\n }\n\n /** Validate that the configured API key works. */\n async validate(): Promise<boolean> {\n try {\n const url = `${this.baseUrl}/keys/usage`;\n const res = await fetch(url, { headers: this.headers() });\n return res.ok;\n } catch {\n // Network error — key might still be valid, just can't reach server\n return false;\n }\n }\n}\n","import pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\n\nexport async function listCommand(options: { category?: string; pack?: string; limit?: string }): Promise<void> {\n const client = new SkillDBClient();\n const limit = options.limit ? parseInt(options.limit) : 50;\n\n try {\n const res = await client.list({ category: options.category, pack: options.pack, limit });\n\n if (res.skills.length === 0) {\n console.log(pc.yellow('No skills found.'));\n return;\n }\n\n // If no filter, show categories overview\n if (!options.category && !options.pack) {\n console.log(pc.bold('Categories:'));\n for (const cat of res.meta.categories) {\n console.log(` ${pc.cyan(cat)}`);\n }\n console.log(`\\n${pc.dim(`${res.meta.totalPacks} packs, ${res.pagination.total} skills total`)}`);\n console.log(pc.dim('Use --category or --pack to filter.\\n'));\n }\n\n // Print skills\n const nameW = 30;\n const packW = 24;\n const catW = 20;\n\n console.log(pc.dim(pad('SKILL', nameW) + pad('PACK', packW) + 'CATEGORY'));\n console.log(pc.dim('─'.repeat(nameW + packW + catW)));\n\n for (const s of res.skills) {\n console.log(\n pc.cyan(pad(truncate(s.title, nameW - 2), nameW)) +\n pc.white(pad(truncate(s.packLabel, packW - 2), packW)) +\n pc.dim(s.category)\n );\n }\n\n if (res.pagination.hasMore) {\n console.log(pc.dim(`\\nShowing ${res.skills.length} of ${res.pagination.total}. Use --limit to see more.`));\n }\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n\nfunction pad(str: string, width: number): string {\n return str.length >= width ? str.slice(0, width) : str + ' '.repeat(width - str.length);\n}\n\nfunction truncate(str: string, max: number): string {\n return str.length <= max ? str : str.slice(0, max - 1) + '…';\n}\n","import pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\nimport { initCache, cacheSkill, isCached } from '../cache.js';\n\nexport async function addCommand(packName: string): Promise<void> {\n const client = new SkillDBClient();\n\n console.log(pc.bold(`Adding pack: ${packName}`));\n initCache();\n\n try {\n // Fetch all skills in the pack\n const res = await client.list({ pack: packName, limit: 500, includeContent: true });\n\n if (res.skills.length === 0) {\n console.error(pc.red(`Pack \"${packName}\" not found or empty.`));\n process.exit(1);\n }\n\n let added = 0;\n let skipped = 0;\n\n for (const skill of res.skills) {\n if (isCached(skill.id)) {\n skipped++;\n console.log(pc.dim(` skip ${skill.id} (already cached)`));\n continue;\n }\n\n const filePath = cacheSkill(skill);\n added++;\n console.log(pc.green(` add ${skill.id}`) + pc.dim(` → ${filePath}`));\n }\n\n console.log(\n `\\n${pc.green(`${added} skill${added === 1 ? '' : 's'} added`)}` +\n (skipped > 0 ? pc.dim(`, ${skipped} skipped`) : '')\n );\n\n if (res.skills.some(s => !s.content)) {\n console.log(pc.yellow('\\nNote: Some skills were cached without content (metadata only).'));\n console.log(pc.yellow('Run \"skilldb login\" with a Pro key to download full content.'));\n }\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { Manifest, Skill } from './types.js';\n\nconst SKILLDB_DIR = '.skilldb';\nconst SKILLS_DIR = 'skills';\nconst MANIFEST_FILE = 'manifest.json';\n\nfunction ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction skilldbRoot(cwd?: string): string {\n return path.join(cwd ?? process.cwd(), SKILLDB_DIR);\n}\n\n/** Ensure .skilldb/ directory structure exists. */\nexport function initCache(cwd?: string): string {\n const root = skilldbRoot(cwd);\n ensureDir(path.join(root, SKILLS_DIR));\n\n const manifestPath = path.join(root, MANIFEST_FILE);\n if (!fs.existsSync(manifestPath)) {\n fs.writeFileSync(manifestPath, JSON.stringify({ installed: {} }, null, 2) + '\\n');\n }\n\n return root;\n}\n\n/** Read the local manifest. */\nexport function readManifest(cwd?: string): Manifest {\n const manifestPath = path.join(skilldbRoot(cwd), MANIFEST_FILE);\n try {\n return JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));\n } catch {\n return { installed: {} };\n }\n}\n\n/** Write the local manifest. */\nexport function writeManifest(manifest: Manifest, cwd?: string): void {\n const root = skilldbRoot(cwd);\n ensureDir(root);\n fs.writeFileSync(\n path.join(root, MANIFEST_FILE),\n JSON.stringify(manifest, null, 2) + '\\n'\n );\n}\n\n/** Save a skill to the local cache. */\nexport function cacheSkill(skill: Skill, cwd?: string): string {\n const root = skilldbRoot(cwd);\n const skillDir = path.join(root, SKILLS_DIR, skill.pack);\n ensureDir(skillDir);\n\n const safeName = skill.name.replace(/[/\\\\:*?\"<>|]/g, '-');\n const filePath = path.join(skillDir, `${safeName}.md`);\n fs.writeFileSync(filePath, skill.content ?? `# ${skill.title}\\n\\n${skill.description}\\n`);\n\n // Update manifest\n const manifest = readManifest(cwd);\n manifest.installed[skill.id] = {\n addedAt: new Date().toISOString(),\n lines: skill.lines,\n };\n writeManifest(manifest, cwd);\n\n return filePath;\n}\n\n/** Check if a skill is already cached. */\nexport function isCached(skillId: string, cwd?: string): boolean {\n const manifest = readManifest(cwd);\n return skillId in manifest.installed;\n}\n\n/** Get the local path for a cached skill. */\nexport function getCachedPath(skillId: string, cwd?: string): string | null {\n if (!isCached(skillId, cwd)) return null;\n const [pack, file] = skillId.split('/');\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-');\n const filePath = path.join(skilldbRoot(cwd), SKILLS_DIR, pack, `${name}.md`);\n return fs.existsSync(filePath) ? filePath : null;\n}\n\n/** List all cached skills. */\nexport function listCached(cwd?: string): Manifest {\n return readManifest(cwd);\n}\n\n/** Ensure .skilldb/ and .skilldbrc are in .gitignore. */\nexport function updateGitignore(cwd?: string): void {\n const root = cwd ?? process.cwd();\n const gitignorePath = path.join(root, '.gitignore');\n\n const entries = ['.skilldb/', '.skilldbrc'];\n let content = '';\n\n if (fs.existsSync(gitignorePath)) {\n content = fs.readFileSync(gitignorePath, 'utf-8');\n }\n\n const toAdd = entries.filter(e => !content.includes(e));\n if (toAdd.length === 0) return;\n\n const suffix = (content && !content.endsWith('\\n') ? '\\n' : '') +\n '\\n# SkillDB\\n' + toAdd.join('\\n') + '\\n';\n\n fs.writeFileSync(gitignorePath, content + suffix);\n}\n","import pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\nimport { initCache, cacheSkill, isCached, getCachedPath } from '../cache.js';\n\nexport async function getCommand(id: string): Promise<void> {\n const client = new SkillDBClient();\n\n // Normalize: accept \"pack/skill\" without .md\n if (!id.includes('.md')) {\n id = id + '.md';\n }\n\n // Check if already cached\n if (isCached(id)) {\n const cachedPath = getCachedPath(id);\n console.log(pc.dim(`Already cached: ${cachedPath}`));\n return;\n }\n\n console.log(pc.dim(`Fetching ${id}...`));\n initCache();\n\n try {\n const skill = await client.get(id);\n\n if (!skill.content) {\n console.log(pc.yellow('Skill fetched (metadata only — no content without API key).'));\n console.log(pc.yellow('Run \"skilldb login\" with a Pro key to download full content.'));\n }\n\n const filePath = cacheSkill(skill);\n console.log(pc.green(`✓ Saved ${skill.title}`) + pc.dim(` → ${filePath}`));\n console.log(pc.dim(` ${skill.lines} lines | ${skill.packLabel} | ${skill.category}`));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n","import pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\n\nexport async function infoCommand(id: string): Promise<void> {\n const client = new SkillDBClient();\n\n // Normalize: accept \"pack/skill\" without .md\n if (!id.includes('.md')) {\n id = id + '.md';\n }\n\n try {\n const skill = await client.get(id);\n\n console.log(pc.bold(skill.title));\n console.log(pc.dim('─'.repeat(50)));\n console.log(`${pc.cyan('ID:')} ${skill.id}`);\n console.log(`${pc.cyan('Pack:')} ${skill.packLabel} (${skill.pack})`);\n console.log(`${pc.cyan('Category:')} ${skill.category}`);\n console.log(`${pc.cyan('Lines:')} ${skill.lines}`);\n console.log(`${pc.cyan('Description:')} ${skill.description}`);\n\n if (skill.content) {\n console.log(pc.dim('\\n─── Preview ───────────────────────────────────'));\n const preview = skill.content.split('\\n').slice(0, 20).join('\\n');\n console.log(preview);\n if (skill.content.split('\\n').length > 20) {\n console.log(pc.dim(`\\n... ${skill.lines - 20} more lines`));\n }\n }\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport readline from 'node:readline';\nimport { initCache, updateGitignore } from '../cache.js';\n\ntype IDE = 'claude-code' | 'cursor' | 'codex';\n\ninterface Detection {\n ide: IDE;\n label: string;\n configFile: string;\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise(resolve => {\n rl.question(question, answer => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction detectIDE(cwd: string): Detection | null {\n // Claude Code\n if (fs.existsSync(path.join(cwd, 'CLAUDE.md')) || fs.existsSync(path.join(cwd, '.claude'))) {\n return {\n ide: 'claude-code',\n label: 'Claude Code',\n configFile: path.join(cwd, 'CLAUDE.md'),\n };\n }\n\n // Cursor\n if (fs.existsSync(path.join(cwd, '.cursor')) || fs.existsSync(path.join(cwd, '.cursorrules'))) {\n return {\n ide: 'cursor',\n label: 'Cursor',\n configFile: fs.existsSync(path.join(cwd, '.cursorrules'))\n ? path.join(cwd, '.cursorrules')\n : path.join(cwd, '.cursor', 'rules'),\n };\n }\n\n // Codex\n if (fs.existsSync(path.join(cwd, 'codex.md')) || fs.existsSync(path.join(cwd, '.codex'))) {\n return {\n ide: 'codex',\n label: 'Codex CLI',\n configFile: path.join(cwd, 'codex.md'),\n };\n }\n\n return null;\n}\n\nfunction getIntegrationSnippet(ide: IDE): string {\n const marker = '<!-- skilldb:start -->';\n const endMarker = '<!-- skilldb:end -->';\n\n const content = `\n## SkillDB Skills\n\nLocal skills are available in \\`.skilldb/skills/\\`. Use them as reference when working on tasks.\nSearch: \\`skilldb search react server components\\` (supports multiple words)\nDownload a skill: \\`skilldb get <pack>/<skill>\\` (e.g. \\`skilldb get software-skills/code-review\\`)\nDownload a full pack: \\`skilldb add <pack>\\`\n`.trim();\n\n return `\\n\\n${marker}\\n${content}\\n${endMarker}\\n`;\n}\n\nexport async function initCommand(): Promise<void> {\n const cwd = process.cwd();\n console.log(pc.bold('SkillDB Init\\n'));\n\n // Detect IDE\n let detection = detectIDE(cwd);\n\n if (detection) {\n console.log(`Detected: ${pc.cyan(detection.label)}`);\n } else {\n console.log('No IDE config detected. Which are you using?');\n console.log(' 1) Claude Code');\n console.log(' 2) Cursor');\n console.log(' 3) Codex CLI');\n const choice = await prompt('\\nChoice (1-3): ');\n\n const ideMap: Record<string, IDE> = { '1': 'claude-code', '2': 'cursor', '3': 'codex' };\n const ide = ideMap[choice];\n if (!ide) {\n console.log(pc.red('Invalid choice.'));\n process.exit(1);\n }\n\n const configFiles: Record<IDE, string> = {\n 'claude-code': path.join(cwd, 'CLAUDE.md'),\n 'cursor': path.join(cwd, '.cursorrules'),\n 'codex': path.join(cwd, 'codex.md'),\n };\n\n detection = {\n ide,\n label: ide === 'claude-code' ? 'Claude Code' : ide === 'cursor' ? 'Cursor' : 'Codex CLI',\n configFile: configFiles[ide],\n };\n }\n\n // Create .skilldb/ directory\n const cacheDir = initCache(cwd);\n console.log(`Created ${pc.dim(cacheDir)}`);\n\n // Update .gitignore\n updateGitignore(cwd);\n console.log(`Updated ${pc.dim('.gitignore')}`);\n\n // Write integration snippet\n const snippet = getIntegrationSnippet(detection.ide);\n const configFile = detection.configFile;\n\n let existing = '';\n if (fs.existsSync(configFile)) {\n existing = fs.readFileSync(configFile, 'utf-8');\n }\n\n if (existing.includes('<!-- skilldb:start -->')) {\n console.log(pc.dim(`${path.basename(configFile)} already has SkillDB integration.`));\n } else {\n // Ensure parent dir exists\n const dir = path.dirname(configFile);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(configFile, existing + snippet);\n console.log(`Added SkillDB snippet to ${pc.cyan(path.basename(configFile))}`);\n }\n\n console.log(pc.green('\\nDone! Next steps:'));\n console.log(` ${pc.dim('$')} skilldb login ${pc.dim('# save your API key')}`);\n console.log(` ${pc.dim('$')} skilldb search react server components ${pc.dim('# multi-word search')}`);\n console.log(` ${pc.dim('$')} skilldb get software-skills/code-review ${pc.dim('# download one skill')}`);\n console.log(` ${pc.dim('$')} skilldb add game-design-skills ${pc.dim('# download full pack')}`);\n}\n","import pc from 'picocolors';\nimport { saveApiKey } from '../config.js';\nimport { SkillDBClient } from '../client.js';\nimport readline from 'node:readline';\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise(resolve => {\n rl.question(question, answer => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport async function loginCommand(): Promise<void> {\n console.log(pc.bold('SkillDB Login'));\n console.log('Get your API key at https://skilldb.dev/api-access\\n');\n\n const apiKey = await prompt('API key: ');\n\n if (!apiKey) {\n console.log(pc.red('No API key provided.'));\n process.exit(1);\n }\n\n if (!apiKey.startsWith('sk_')) {\n console.log(pc.yellow('Warning: API key should start with \"sk_\". Saving anyway.'));\n }\n\n // Validate the key\n process.stdout.write('Validating... ');\n const client = new SkillDBClient({ apiKey });\n const valid = await client.validate();\n\n if (valid) {\n const savedTo = saveApiKey(apiKey);\n console.log(pc.green('valid!'));\n console.log(`Saved to ${pc.dim(savedTo)}`);\n } else {\n console.log(pc.yellow('could not validate (saved anyway)'));\n const savedTo = saveApiKey(apiKey);\n console.log(`Saved to ${pc.dim(savedTo)}`);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { readManifest } from '../cache.js';\n\nconst SKILLDB_DIR = '.skilldb';\nconst ACTIVE_DIR = 'active';\nconst CONFIG_FILE = 'config.json';\n\nconst PROFILES: Record<string, string[]> = {\n frontend: ['react-patterns-skills', 'web-polish-skills', 'typescript-skills', 'css-skills'],\n backend: ['software-skills', 'api-design-skills', 'database-skills', 'nodejs-skills'],\n devops: ['devops-skills', 'docker-skills', 'ci-cd-skills', 'infrastructure-skills'],\n security: ['security-skills', 'appsec-skills', 'auth-skills'],\n data: ['data-engineering-skills', 'sql-skills', 'analytics-skills'],\n fullstack: ['react-patterns-skills', 'software-skills', 'typescript-skills', 'api-design-skills'],\n mobile: ['react-native-skills', 'mobile-skills', 'ios-skills', 'android-skills'],\n 'ai-agent': ['ai-agent-skills', 'prompt-engineering-skills', 'llm-skills'],\n};\n\ninterface Config {\n activeProfile?: string;\n budget?: { max: number; unit: string };\n [key: string]: unknown;\n}\n\nfunction readConfig(cwd: string): Config {\n const p = path.join(cwd, SKILLDB_DIR, CONFIG_FILE);\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return {}; }\n}\n\nfunction writeConfig(cwd: string, config: Config): void {\n const dir = path.join(cwd, SKILLDB_DIR);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, CONFIG_FILE), JSON.stringify(config, null, 2) + '\\n');\n}\n\nfunction autoDetect(cwd: string): string {\n const has = (f: string) => fs.existsSync(path.join(cwd, f));\n let pkgDeps: string[] = [];\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8'));\n pkgDeps = Object.keys({ ...pkg.dependencies, ...pkg.devDependencies });\n } catch { /* no package.json */ }\n\n if (pkgDeps.some(d => ['react-native', 'expo'].includes(d))) return 'mobile';\n if (pkgDeps.some(d => ['react', 'next', 'vue', 'svelte', 'angular'].includes(d))) {\n if (pkgDeps.some(d => ['express', 'fastify', 'nestjs', 'prisma'].includes(d))) return 'fullstack';\n return 'frontend';\n }\n if (has('Dockerfile') || has('docker-compose.yml') || has('.github/workflows')) return 'devops';\n if (pkgDeps.some(d => ['langchain', 'openai', '@anthropic-ai/sdk'].includes(d))) return 'ai-agent';\n if (pkgDeps.some(d => ['express', 'fastify', 'koa', 'nestjs'].includes(d))) return 'backend';\n return 'fullstack';\n}\n\nfunction activateProfile(cwd: string, profile: string): void {\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n if (fs.existsSync(activeDir)) fs.rmSync(activeDir, { recursive: true });\n fs.mkdirSync(activeDir, { recursive: true });\n\n const packs = PROFILES[profile] || [];\n const skillsDir = path.join(cwd, SKILLDB_DIR, 'skills');\n let copied = 0;\n\n for (const pack of packs) {\n const packDir = path.join(skillsDir, pack);\n if (!fs.existsSync(packDir)) continue;\n const destDir = path.join(activeDir, pack);\n fs.mkdirSync(destDir, { recursive: true });\n for (const file of fs.readdirSync(packDir)) {\n fs.copyFileSync(path.join(packDir, file), path.join(destDir, file));\n copied++;\n }\n }\n\n const config = readConfig(cwd);\n config.activeProfile = profile;\n writeConfig(cwd, config);\n\n console.log(pc.green(`Profile \"${profile}\" activated`) + pc.dim(` (${copied} skills in .skilldb/active/)`));\n if (copied === 0) {\n console.log(pc.yellow('No matching skills found locally. Install packs first:'));\n for (const pack of packs.slice(0, 3)) {\n console.log(pc.dim(` skilldb add ${pack}`));\n }\n }\n}\n\nexport async function useCommand(profile: string, options: { list?: boolean; current?: boolean }): Promise<void> {\n const cwd = process.cwd();\n\n if (options.list) {\n console.log(pc.bold('Available profiles:\\n'));\n for (const [name, packs] of Object.entries(PROFILES)) {\n console.log(` ${pc.cyan(name.padEnd(12))} ${pc.dim(packs.join(', '))}`);\n }\n console.log(pc.dim('\\nUse \"skilldb use auto\" to auto-detect from project files.'));\n return;\n }\n\n if (options.current) {\n const config = readConfig(cwd);\n if (config.activeProfile) {\n console.log(`Active profile: ${pc.cyan(config.activeProfile)}`);\n } else {\n console.log(pc.dim('No active profile. Run \"skilldb use <profile>\" to activate.'));\n }\n return;\n }\n\n if (profile === 'none') {\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n if (fs.existsSync(activeDir)) fs.rmSync(activeDir, { recursive: true });\n const config = readConfig(cwd);\n delete config.activeProfile;\n writeConfig(cwd, config);\n console.log(pc.green('Profile deactivated. Active directory cleared.'));\n return;\n }\n\n if (profile === 'auto') {\n const detected = autoDetect(cwd);\n console.log(pc.dim(`Auto-detected profile: ${detected}`));\n activateProfile(cwd, detected);\n return;\n }\n\n if (!PROFILES[profile]) {\n console.error(pc.red(`Unknown profile \"${profile}\". Use --list to see available profiles.`));\n process.exit(1);\n }\n\n activateProfile(cwd, profile);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\n\nconst SKILLDB_DIR = '.skilldb';\nconst CONFIG_FILE = 'config.json';\nconst ACTIVE_DIR = 'active';\nconst TOKENS_PER_LINE = 10; // rough estimate\n\ninterface Config {\n activeProfile?: string;\n budget?: { max: number; unit: string };\n [key: string]: unknown;\n}\n\nfunction readConfig(cwd: string): Config {\n const p = path.join(cwd, SKILLDB_DIR, CONFIG_FILE);\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return {}; }\n}\n\nfunction writeConfig(cwd: string, config: Config): void {\n const dir = path.join(cwd, SKILLDB_DIR);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, CONFIG_FILE), JSON.stringify(config, null, 2) + '\\n');\n}\n\nfunction countActiveSkills(cwd: string): { files: string[]; totalLines: number; totalTokens: number } {\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n const files: string[] = [];\n let totalLines = 0;\n\n if (!fs.existsSync(activeDir)) return { files, totalLines, totalTokens: 0 };\n\n function walk(dir: string): void {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) { walk(full); continue; }\n if (!entry.name.endsWith('.md')) continue;\n const content = fs.readFileSync(full, 'utf-8');\n const lines = content.split('\\n').length;\n files.push(path.relative(path.join(cwd, SKILLDB_DIR), full));\n totalLines += lines;\n }\n }\n\n walk(activeDir);\n return { files, totalLines, totalTokens: totalLines * TOKENS_PER_LINE };\n}\n\nfunction parseBudget(value: string): { max: number; unit: string } {\n const lower = value.toLowerCase();\n if (lower.endsWith('k')) {\n return { max: parseInt(lower) * 1000, unit: 'tokens' };\n }\n const num = parseInt(value);\n if (num > 10000) return { max: num, unit: 'tokens' };\n return { max: num, unit: 'lines' };\n}\n\nexport async function budgetCommand(action?: string, value?: string): Promise<void> {\n const cwd = process.cwd();\n const config = readConfig(cwd);\n const usage = countActiveSkills(cwd);\n\n if (action === 'set' && value) {\n const budget = parseBudget(value);\n config.budget = budget;\n writeConfig(cwd, config);\n console.log(pc.green(`Budget set to ${budget.max.toLocaleString()} ${budget.unit}`));\n return;\n }\n\n if (action === 'optimize') {\n if (!config.budget) {\n console.error(pc.red('No budget set. Run \"skilldb budget set <value>\" first.'));\n process.exit(1);\n }\n\n const budgetValue = config.budget.unit === 'tokens' ? usage.totalTokens : usage.totalLines;\n if (budgetValue <= config.budget.max) {\n console.log(pc.green('Already within budget. No changes needed.'));\n return;\n }\n\n // Remove skills from active/ until under budget, starting from largest\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n const skillFiles: { path: string; lines: number }[] = [];\n\n function walk(dir: string): void {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) { walk(full); continue; }\n if (!entry.name.endsWith('.md')) continue;\n const lines = fs.readFileSync(full, 'utf-8').split('\\n').length;\n skillFiles.push({ path: full, lines });\n }\n }\n walk(activeDir);\n skillFiles.sort((a, b) => b.lines - a.lines);\n\n let current = config.budget.unit === 'tokens' ? usage.totalTokens : usage.totalLines;\n let removed = 0;\n for (const sf of skillFiles) {\n if (current <= config.budget.max) break;\n fs.unlinkSync(sf.path);\n current -= config.budget.unit === 'tokens' ? sf.lines * TOKENS_PER_LINE : sf.lines;\n removed++;\n console.log(pc.yellow(` removed ${path.basename(sf.path)}`) + pc.dim(` (${sf.lines} lines)`));\n }\n\n console.log(pc.green(`\\nOptimized: removed ${removed} skill(s) to fit budget.`));\n return;\n }\n\n // Default: show budget status\n console.log(pc.bold('Budget Status\\n'));\n console.log(` ${pc.cyan('Active skills:')} ${usage.files.length}`);\n console.log(` ${pc.cyan('Total lines:')} ${usage.totalLines.toLocaleString()}`);\n console.log(` ${pc.cyan('Est. tokens:')} ${usage.totalTokens.toLocaleString()}`);\n\n if (config.budget) {\n const budgetValue = config.budget.unit === 'tokens' ? usage.totalTokens : usage.totalLines;\n const pct = Math.round((budgetValue / config.budget.max) * 100);\n const color = pct > 100 ? pc.red : pct > 80 ? pc.yellow : pc.green;\n console.log(` ${pc.cyan('Budget:')} ${config.budget.max.toLocaleString()} ${config.budget.unit}`);\n console.log(` ${pc.cyan('Usage:')} ${color(`${pct}%`)}`);\n } else {\n console.log(pc.dim('\\n No budget set. Use \"skilldb budget set <value>\" to set one.'));\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\n\nconst SKILLDB_DIR = '.skilldb';\nconst ACTIVE_DIR = 'active';\nconst SLIM_DIR = 'slim';\nconst SKILLS_DIR = 'skills';\n\nfunction ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n}\n\nfunction slimContent(content: string, ratio: number): string {\n const lines = content.split('\\n');\n const kept: string[] = [];\n let inCodeBlock = false;\n let codeBlockLines = 0;\n let skipExplanation = false;\n\n for (const line of lines) {\n // Always keep titles and headers\n if (line.startsWith('#')) {\n kept.push(line);\n skipExplanation = false;\n continue;\n }\n\n // Track code blocks — keep short ones, trim long ones\n if (line.startsWith('```')) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeBlockLines = 0;\n kept.push(line);\n } else {\n inCodeBlock = false;\n kept.push(line);\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeBlockLines++;\n if (codeBlockLines <= 15) kept.push(line);\n else if (codeBlockLines === 16) kept.push(' // ... (trimmed)');\n continue;\n }\n\n // Keep checklist items and bullet points\n if (line.match(/^[-*]\\s+\\[[ x]\\]/)) { kept.push(line); continue; }\n if (line.match(/^[-*]\\s+\\*\\*/)) { kept.push(line); continue; }\n if (line.match(/^\\d+\\.\\s+\\*\\*/)) { kept.push(line); continue; }\n\n // Keep short bullet points (methodology steps)\n if (line.match(/^[-*]\\s+/) && line.length < 120) { kept.push(line); continue; }\n if (line.match(/^\\d+\\.\\s+/) && line.length < 120) { kept.push(line); continue; }\n\n // Keep bold/key lines\n if (line.match(/^\\*\\*.+\\*\\*/)) { kept.push(line); continue; }\n\n // Skip verbose explanation paragraphs\n if (line.trim() === '') {\n if (!skipExplanation) kept.push(line);\n continue;\n }\n\n // Keep if within ratio budget\n if (kept.length / Math.max(lines.length, 1) < ratio) {\n kept.push(line);\n } else {\n skipExplanation = true;\n }\n }\n\n return kept.join('\\n');\n}\n\nfunction processDir(sourceDir: string, destDir: string, ratio: number): number {\n ensureDir(destDir);\n let count = 0;\n\n for (const entry of fs.readdirSync(sourceDir, { withFileTypes: true })) {\n const srcPath = path.join(sourceDir, entry.name);\n if (entry.isDirectory()) {\n count += processDir(srcPath, path.join(destDir, entry.name), ratio);\n continue;\n }\n if (!entry.name.endsWith('.md')) continue;\n\n const content = fs.readFileSync(srcPath, 'utf-8');\n const slimmed = slimContent(content, ratio);\n const footer = `\\n\\n---\\n*Full skill: \\`skilldb get ${entry.name.replace('.md', '')}\\`*\\n`;\n\n ensureDir(destDir);\n fs.writeFileSync(path.join(destDir, entry.name), slimmed + footer);\n count++;\n\n const origLines = content.split('\\n').length;\n const slimLines = slimmed.split('\\n').length;\n console.log(\n pc.green(` slim ${entry.name}`) +\n pc.dim(` ${origLines} → ${slimLines} lines (${Math.round((slimLines / origLines) * 100)}%)`)\n );\n }\n\n return count;\n}\n\nexport async function slimCommand(pack?: string, options?: { ratio?: string }): Promise<void> {\n const cwd = process.cwd();\n const ratio = options?.ratio ? parseFloat(options.ratio) : 0.3;\n\n if (ratio <= 0 || ratio >= 1) {\n console.error(pc.red('Ratio must be between 0 and 1 (e.g. 0.3 for 30%).'));\n process.exit(1);\n }\n\n const slimDir = path.join(cwd, SKILLDB_DIR, SLIM_DIR);\n console.log(pc.bold(`Generating slim versions (${Math.round(ratio * 100)}% ratio)\\n`));\n\n let sourceDir: string;\n if (pack) {\n sourceDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, pack);\n if (!fs.existsSync(sourceDir)) {\n sourceDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR, pack);\n }\n if (!fs.existsSync(sourceDir)) {\n console.error(pc.red(`Pack \"${pack}\" not found in skills/ or active/.`));\n process.exit(1);\n }\n } else {\n sourceDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n if (!fs.existsSync(sourceDir)) {\n sourceDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR);\n }\n }\n\n if (!fs.existsSync(sourceDir)) {\n console.error(pc.red('No skills found. Install skills first with \"skilldb add <pack>\".'));\n process.exit(1);\n }\n\n const destDir = pack ? path.join(slimDir, pack) : slimDir;\n const count = processDir(sourceDir, destDir, ratio);\n console.log(pc.green(`\\n${count} skill(s) slimmed → .skilldb/slim/`));\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\nimport { readManifest, initCache, cacheSkill } from '../cache.js';\n\nconst TECH_MAP: Record<string, string[]> = {\n react: ['react-patterns-skills', 'web-polish-skills'],\n next: ['react-patterns-skills', 'web-polish-skills', 'nextjs-skills'],\n vue: ['vue-skills', 'web-polish-skills'],\n angular: ['angular-skills', 'web-polish-skills'],\n express: ['software-skills', 'api-design-skills', 'nodejs-skills'],\n fastify: ['software-skills', 'api-design-skills', 'nodejs-skills'],\n nestjs: ['software-skills', 'api-design-skills', 'nodejs-skills'],\n prisma: ['database-skills', 'software-skills'],\n typescript: ['typescript-skills', 'software-skills'],\n tailwindcss: ['css-skills', 'web-polish-skills'],\n docker: ['devops-skills', 'docker-skills'],\n openai: ['ai-agent-skills', 'prompt-engineering-skills'],\n '@anthropic-ai/sdk': ['ai-agent-skills', 'prompt-engineering-skills'],\n langchain: ['ai-agent-skills', 'llm-skills'],\n 'react-native': ['mobile-skills', 'react-native-skills'],\n expo: ['mobile-skills', 'react-native-skills'],\n jest: ['testing-skills', 'software-skills'],\n vitest: ['testing-skills', 'software-skills'],\n};\n\nfunction scanProject(cwd: string): { detected: string[]; packs: Set<string> } {\n const detected: string[] = [];\n const packs = new Set<string>();\n\n // Scan package.json\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const dep of Object.keys(allDeps)) {\n const key = dep.replace(/^@[^/]+\\//, '');\n if (TECH_MAP[dep]) {\n detected.push(dep);\n TECH_MAP[dep].forEach(p => packs.add(p));\n } else if (TECH_MAP[key]) {\n detected.push(key);\n TECH_MAP[key].forEach(p => packs.add(p));\n }\n }\n } catch { /* no package.json */ }\n\n // Check common files\n if (fs.existsSync(path.join(cwd, 'Dockerfile'))) {\n detected.push('docker');\n (TECH_MAP.docker || []).forEach(p => packs.add(p));\n }\n if (fs.existsSync(path.join(cwd, 'tsconfig.json'))) {\n detected.push('typescript');\n (TECH_MAP.typescript || []).forEach(p => packs.add(p));\n }\n\n // Always recommend software-skills as baseline\n packs.add('software-skills');\n\n return { detected, packs };\n}\n\nexport async function recommendCommand(options: { install?: boolean }): Promise<void> {\n const cwd = process.cwd();\n const manifest = readManifest(cwd);\n const installed = new Set(Object.keys(manifest.installed).map(id => id.split('/')[0]));\n\n console.log(pc.bold('Scanning project...\\n'));\n const { detected, packs } = scanProject(cwd);\n\n if (detected.length > 0) {\n console.log(pc.dim('Detected technologies: ') + detected.join(', '));\n console.log();\n }\n\n const missing = [...packs].filter(p => !installed.has(p));\n const existing = [...packs].filter(p => installed.has(p));\n\n if (existing.length > 0) {\n console.log(pc.green('Already installed:'));\n for (const p of existing) {\n console.log(pc.dim(` + ${p}`));\n }\n console.log();\n }\n\n if (missing.length === 0) {\n console.log(pc.green('You have all recommended packs installed!'));\n return;\n }\n\n console.log(pc.yellow('Recommended packs to install:'));\n for (const p of missing) {\n console.log(` ${pc.cyan(p)}`);\n }\n\n if (!options.install) {\n console.log(pc.dim('\\nRun \"skilldb recommend --install\" to auto-install all.'));\n return;\n }\n\n // Auto-install\n console.log(pc.bold('\\nInstalling recommended packs...\\n'));\n const client = new SkillDBClient();\n initCache(cwd);\n\n for (const pack of missing) {\n try {\n const res = await client.list({ pack, limit: 500, includeContent: true });\n if (res.skills.length === 0) {\n console.log(pc.dim(` skip ${pack} (not found)`));\n continue;\n }\n let added = 0;\n for (const skill of res.skills) {\n cacheSkill(skill, cwd);\n added++;\n }\n console.log(pc.green(` add ${pack}`) + pc.dim(` (${added} skills)`));\n } catch (err) {\n console.log(pc.red(` fail ${pack}: ${(err as Error).message}`));\n }\n }\n\n console.log(pc.green('\\nDone! Run \"skilldb use auto\" to activate a profile.'));\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { readManifest } from '../cache.js';\n\nconst SKILLDB_DIR = '.skilldb';\nconst SKILLS_DIR = 'skills';\nconst ACTIVE_DIR = 'active';\nconst CONFIG_FILE = 'config.json';\nconst TOKENS_PER_LINE = 10;\n\ninterface Config {\n activeProfile?: string;\n budget?: { max: number; unit: string };\n}\n\nfunction readConfig(cwd: string): Config {\n const p = path.join(cwd, SKILLDB_DIR, CONFIG_FILE);\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return {}; }\n}\n\nfunction collectFiles(dir: string): { name: string; lines: number }[] {\n const result: { name: string; lines: number }[] = [];\n if (!fs.existsSync(dir)) return result;\n\n function walk(d: string): void {\n for (const entry of fs.readdirSync(d, { withFileTypes: true })) {\n const full = path.join(d, entry.name);\n if (entry.isDirectory()) { walk(full); continue; }\n if (!entry.name.endsWith('.md')) continue;\n const lines = fs.readFileSync(full, 'utf-8').split('\\n').length;\n result.push({ name: path.relative(dir, full), lines });\n }\n }\n\n walk(dir);\n return result;\n}\n\nexport async function doctorCommand(): Promise<void> {\n const cwd = process.cwd();\n const manifest = readManifest(cwd);\n const config = readConfig(cwd);\n let issues = 0;\n\n console.log(pc.bold('SkillDB Doctor\\n'));\n\n // Check .skilldb/ exists\n const skilldbDir = path.join(cwd, SKILLDB_DIR);\n if (!fs.existsSync(skilldbDir)) {\n console.log(pc.red(' [!] .skilldb/ not found. Run \"skilldb init\" first.'));\n return;\n }\n console.log(pc.green(' [ok] .skilldb/ directory exists'));\n\n // Check installed skills\n const installedIds = Object.keys(manifest.installed);\n const skillsDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR);\n const skillFiles = collectFiles(skillsDir);\n console.log(pc.green(` [ok] ${installedIds.length} skills in manifest, ${skillFiles.length} files on disk`));\n\n // Check for orphaned manifest entries (in manifest but file missing)\n let orphaned = 0;\n for (const id of installedIds) {\n const [pack, file] = id.split('/');\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-');\n const filePath = path.join(skillsDir, pack, `${name}.md`);\n if (!fs.existsSync(filePath)) {\n orphaned++;\n if (orphaned <= 3) console.log(pc.yellow(` [!] Missing file for manifest entry: ${id}`));\n }\n }\n if (orphaned > 3) console.log(pc.yellow(` [!] ...and ${orphaned - 3} more missing files`));\n if (orphaned > 0) issues++;\n\n // Check active profile\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n const activeFiles = collectFiles(activeDir);\n if (config.activeProfile) {\n console.log(pc.green(` [ok] Active profile: ${config.activeProfile} (${activeFiles.length} skills)`));\n } else {\n console.log(pc.yellow(' [!] No active profile. Run \"skilldb use <profile>\" to set one.'));\n issues++;\n }\n\n // Check for unused skills (installed but not in active)\n const activeNames = new Set(activeFiles.map(f => f.name));\n const unused = skillFiles.filter(f => !activeNames.has(f.name));\n if (unused.length > 0 && config.activeProfile) {\n console.log(pc.yellow(` [!] ${unused.length} installed skill(s) not in active profile`));\n issues++;\n }\n\n // Token/line stats\n const totalLines = skillFiles.reduce((sum, f) => sum + f.lines, 0);\n const activeLines = activeFiles.reduce((sum, f) => sum + f.lines, 0);\n const totalTokens = totalLines * TOKENS_PER_LINE;\n const activeTokens = activeLines * TOKENS_PER_LINE;\n\n console.log(pc.dim('\\n Summary:'));\n console.log(` Installed: ${totalLines.toLocaleString()} lines (~${totalTokens.toLocaleString()} tokens)`);\n console.log(` Active: ${activeLines.toLocaleString()} lines (~${activeTokens.toLocaleString()} tokens)`);\n\n // Budget check\n if (config.budget) {\n const budgetValue = config.budget.unit === 'tokens' ? activeTokens : activeLines;\n const pct = Math.round((budgetValue / config.budget.max) * 100);\n const color = pct > 100 ? pc.red : pct > 80 ? pc.yellow : pc.green;\n console.log(` Budget: ${color(`${pct}%`)} of ${config.budget.max.toLocaleString()} ${config.budget.unit}`);\n if (pct > 100) issues++;\n }\n\n // Packs summary\n const packs = new Set(installedIds.map(id => id.split('/')[0]));\n console.log(` Packs: ${packs.size} installed`);\n\n console.log(issues === 0\n ? pc.green('\\nNo issues found!')\n : pc.yellow(`\\n${issues} issue(s) found. Run suggested commands to fix.`)\n );\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\nimport { readManifest, cacheSkill } from '../cache.js';\n\nconst SKILLDB_DIR = '.skilldb';\nconst SKILLS_DIR = 'skills';\n\nexport async function updateCommand(pack?: string): Promise<void> {\n const cwd = process.cwd();\n const client = new SkillDBClient();\n const manifest = readManifest(cwd);\n const installedIds = Object.keys(manifest.installed);\n\n if (installedIds.length === 0) {\n console.log(pc.yellow('No skills installed. Use \"skilldb add <pack>\" first.'));\n return;\n }\n\n // Filter by pack if specified\n const targetIds = pack\n ? installedIds.filter(id => id.startsWith(pack + '/'))\n : installedIds;\n\n if (targetIds.length === 0) {\n console.error(pc.red(`No installed skills found for pack \"${pack}\".`));\n process.exit(1);\n }\n\n console.log(pc.bold(`Updating ${targetIds.length} skill(s)...\\n`));\n\n // Group by pack for efficient fetching\n const packGroups = new Map<string, string[]>();\n for (const id of targetIds) {\n const p = id.split('/')[0];\n if (!packGroups.has(p)) packGroups.set(p, []);\n packGroups.get(p)!.push(id);\n }\n\n let updated = 0;\n let unchanged = 0;\n let failed = 0;\n\n for (const [packName, ids] of packGroups) {\n try {\n const res = await client.list({ pack: packName, limit: 500, includeContent: true });\n const remoteMap = new Map(res.skills.map(s => [s.id, s]));\n\n for (const id of ids) {\n const remote = remoteMap.get(id);\n if (!remote) {\n console.log(pc.dim(` skip ${id} (not found on remote)`));\n continue;\n }\n\n // Compare content\n const localPath = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, packName,\n id.split('/')[1].replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-') + '.md');\n\n let localContent = '';\n try { localContent = fs.readFileSync(localPath, 'utf-8'); } catch { /* missing */ }\n\n if (remote.content && remote.content !== localContent) {\n const oldLines = localContent.split('\\n').length;\n const newLines = remote.content.split('\\n').length;\n const diff = newLines - oldLines;\n const diffStr = diff > 0 ? `+${diff}` : `${diff}`;\n\n cacheSkill(remote, cwd);\n updated++;\n console.log(\n pc.green(` update ${id}`) +\n pc.dim(` (${diffStr} lines)`)\n );\n } else {\n unchanged++;\n }\n }\n } catch (err) {\n failed += ids.length;\n console.log(pc.red(` fail ${packName}: ${(err as Error).message}`));\n }\n }\n\n console.log(\n `\\n${pc.green(`${updated} updated`)}` +\n pc.dim(`, ${unchanged} unchanged`) +\n (failed > 0 ? pc.red(`, ${failed} failed`) : '')\n );\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { readManifest, writeManifest } from '../cache.js';\n\nconst SKILLDB_DIR = '.skilldb';\nconst SKILLS_DIR = 'skills';\nconst ACTIVE_DIR = 'active';\n\nfunction collectActiveSkills(cwd: string): Set<string> {\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n const result = new Set<string>();\n if (!fs.existsSync(activeDir)) return result;\n\n for (const pack of fs.readdirSync(activeDir, { withFileTypes: true })) {\n if (!pack.isDirectory()) continue;\n for (const file of fs.readdirSync(path.join(activeDir, pack.name))) {\n if (file.endsWith('.md')) {\n result.add(`${pack.name}/${file}`);\n }\n }\n }\n return result;\n}\n\nfunction removeSkillFile(cwd: string, id: string): boolean {\n const [pack, file] = id.split('/');\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-');\n const filePath = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, pack, `${name}.md`);\n\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n // Clean up empty pack directory\n const packDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, pack);\n if (fs.existsSync(packDir) && fs.readdirSync(packDir).length === 0) {\n fs.rmdirSync(packDir);\n }\n return true;\n }\n return false;\n}\n\nexport async function removeCommand(target: string, options: { unused?: boolean }): Promise<void> {\n const cwd = process.cwd();\n const manifest = readManifest(cwd);\n\n if (options.unused) {\n const activeSkills = collectActiveSkills(cwd);\n const installedIds = Object.keys(manifest.installed);\n let removed = 0;\n\n for (const id of installedIds) {\n const [pack, file] = id.split('/');\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-') + '.md';\n const key = `${pack}/${name}`;\n\n if (!activeSkills.has(key)) {\n removeSkillFile(cwd, id);\n delete manifest.installed[id];\n removed++;\n console.log(pc.yellow(` remove ${id}`));\n }\n }\n\n writeManifest(manifest, cwd);\n console.log(removed > 0\n ? pc.green(`\\n${removed} unused skill(s) removed.`)\n : pc.dim('No unused skills found.')\n );\n return;\n }\n\n // Normalize target\n if (!target.includes('/')) {\n // Remove entire pack\n const packIds = Object.keys(manifest.installed).filter(id => id.startsWith(target + '/'));\n\n if (packIds.length === 0) {\n console.error(pc.red(`No installed skills found for \"${target}\".`));\n process.exit(1);\n }\n\n const activeSkills = collectActiveSkills(cwd);\n let activeWarning = false;\n\n for (const id of packIds) {\n const [pack, file] = id.split('/');\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-') + '.md';\n if (activeSkills.has(`${pack}/${name}`)) activeWarning = true;\n\n removeSkillFile(cwd, id);\n delete manifest.installed[id];\n console.log(pc.yellow(` remove ${id}`));\n }\n\n writeManifest(manifest, cwd);\n console.log(pc.green(`\\n${packIds.length} skill(s) from \"${target}\" removed.`));\n if (activeWarning) {\n console.log(pc.yellow('Warning: Some removed skills were in your active profile.'));\n console.log(pc.yellow('Run \"skilldb use <profile>\" to refresh.'));\n }\n return;\n }\n\n // Remove single skill\n let id = target;\n if (!id.includes('.md')) id = id + '.md';\n\n if (!(id in manifest.installed)) {\n console.error(pc.red(`Skill \"${id}\" is not installed.`));\n process.exit(1);\n }\n\n const activeSkills = collectActiveSkills(cwd);\n const [pack, file] = id.split('/');\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-') + '.md';\n\n removeSkillFile(cwd, id);\n delete manifest.installed[id];\n writeManifest(manifest, cwd);\n\n console.log(pc.green(`Removed ${id}`));\n if (activeSkills.has(`${pack}/${name}`)) {\n console.log(pc.yellow('Warning: This skill was in your active profile. Run \"skilldb use <profile>\" to refresh.'));\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { readManifest, getCachedPath } from '../cache.js';\n\nconst SKILLDB_DIR = '.skilldb';\nconst ACTIVE_DIR = 'active';\nconst CONFIG_FILE = 'config.json';\n\ninterface Config {\n activeProfile?: string;\n budget?: { max: number; unit: string };\n}\n\nfunction readConfig(cwd: string): Config {\n const p = path.join(cwd, SKILLDB_DIR, CONFIG_FILE);\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return {}; }\n}\n\nfunction collectActiveSkills(cwd: string): { pack: string; name: string; path: string }[] {\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n const result: { pack: string; name: string; path: string }[] = [];\n if (!fs.existsSync(activeDir)) return result;\n\n for (const pack of fs.readdirSync(activeDir, { withFileTypes: true })) {\n if (!pack.isDirectory()) continue;\n for (const file of fs.readdirSync(path.join(activeDir, pack.name))) {\n if (file.endsWith('.md')) {\n result.push({\n pack: pack.name,\n name: file.replace('.md', ''),\n path: path.join(activeDir, pack.name, file),\n });\n }\n }\n }\n return result;\n}\n\nfunction exportClaude(cwd: string): void {\n const skills = collectActiveSkills(cwd);\n if (skills.length === 0) {\n console.error(pc.red('No active skills. Run \"skilldb use <profile>\" first.'));\n process.exit(1);\n }\n\n const lines = ['<!-- skilldb:start -->', '## SkillDB Active Skills\\n'];\n lines.push('Reference these skills from `.skilldb/active/` when working on tasks:\\n');\n for (const s of skills) {\n lines.push(`- \\`.skilldb/active/${s.pack}/${s.name}.md\\``);\n }\n lines.push('', '<!-- skilldb:end -->');\n\n const output = lines.join('\\n');\n console.log(output);\n console.log(pc.dim('\\n--- Copy the above into your CLAUDE.md ---'));\n}\n\nfunction exportCursor(cwd: string): void {\n const skills = collectActiveSkills(cwd);\n if (skills.length === 0) {\n console.error(pc.red('No active skills. Run \"skilldb use <profile>\" first.'));\n process.exit(1);\n }\n\n const lines = ['# SkillDB Active Skills', ''];\n lines.push('Reference these skills from `.skilldb/active/` when working on tasks:', '');\n for (const s of skills) {\n lines.push(`@file .skilldb/active/${s.pack}/${s.name}.md`);\n }\n\n const output = lines.join('\\n');\n console.log(output);\n console.log(pc.dim('\\n--- Copy the above into your .cursorrules ---'));\n}\n\nfunction exportProfile(cwd: string): void {\n const config = readConfig(cwd);\n const manifest = readManifest(cwd);\n\n const profile = {\n profile: config.activeProfile || 'custom',\n budget: config.budget || null,\n skills: Object.keys(manifest.installed),\n exportedAt: new Date().toISOString(),\n };\n\n const filename = '.skilldb-profile.json';\n fs.writeFileSync(path.join(cwd, filename), JSON.stringify(profile, null, 2) + '\\n');\n console.log(pc.green(`Exported profile to ${filename}`));\n console.log(pc.dim('Share this file and import with \"skilldb use --import .skilldb-profile.json\"'));\n}\n\nfunction exportInject(cwd: string, id: string): void {\n if (!id.includes('.md')) id = id + '.md';\n\n const cachedPath = getCachedPath(id, cwd);\n if (!cachedPath) {\n console.error(pc.red(`Skill \"${id}\" not found locally. Run \"skilldb get ${id}\" first.`));\n process.exit(1);\n }\n\n const content = fs.readFileSync(cachedPath, 'utf-8');\n process.stdout.write(content);\n}\n\nexport async function exportCommand(format: string, target?: string): Promise<void> {\n const cwd = process.cwd();\n\n switch (format) {\n case 'claude':\n exportClaude(cwd);\n break;\n case 'cursor':\n exportCursor(cwd);\n break;\n case 'profile':\n exportProfile(cwd);\n break;\n case 'inject':\n if (!target) {\n console.error(pc.red('Usage: skilldb export inject <skill-id>'));\n process.exit(1);\n }\n exportInject(cwd, target);\n break;\n default:\n console.error(pc.red(`Unknown format \"${format}\". Use: claude, cursor, profile, inject`));\n process.exit(1);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { readManifest } from '../cache.js';\n\nconst SKILLDB_DIR = '.skilldb';\nconst SKILLS_DIR = 'skills';\nconst ACTIVE_DIR = 'active';\nconst CONFIG_FILE = 'config.json';\nconst TOKENS_PER_LINE = 10;\n\ninterface Config {\n activeProfile?: string;\n budget?: { max: number; unit: string };\n}\n\nfunction readConfig(cwd: string): Config {\n const p = path.join(cwd, SKILLDB_DIR, CONFIG_FILE);\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return {}; }\n}\n\nfunction countDir(dir: string): { files: number; lines: number; packs: Set<string>; categories: Set<string> } {\n const result = { files: 0, lines: 0, packs: new Set<string>(), categories: new Set<string>() };\n if (!fs.existsSync(dir)) return result;\n\n for (const pack of fs.readdirSync(dir, { withFileTypes: true })) {\n if (!pack.isDirectory()) continue;\n result.packs.add(pack.name);\n // Derive category from pack name suffix\n const cat = pack.name.replace(/-skills$/, '');\n result.categories.add(cat);\n\n for (const file of fs.readdirSync(path.join(dir, pack.name))) {\n if (!file.endsWith('.md')) continue;\n result.files++;\n result.lines += fs.readFileSync(path.join(dir, pack.name, file), 'utf-8').split('\\n').length;\n }\n }\n return result;\n}\n\nexport async function statsCommand(): Promise<void> {\n const cwd = process.cwd();\n const config = readConfig(cwd);\n const manifest = readManifest(cwd);\n\n const skillsDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR);\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n\n const installed = countDir(skillsDir);\n const active = countDir(activeDir);\n\n console.log(pc.bold('SkillDB Stats\\n'));\n\n // Installed\n console.log(pc.cyan('Installed:'));\n console.log(` Skills: ${installed.files}`);\n console.log(` Packs: ${installed.packs.size}` + (installed.packs.size > 0 ? pc.dim(` (${[...installed.packs].join(', ')})`) : ''));\n console.log(` Lines: ${installed.lines.toLocaleString()}`);\n console.log(` Est tokens: ${(installed.lines * TOKENS_PER_LINE).toLocaleString()}`);\n\n // Active\n console.log(pc.cyan('\\nActive:'));\n if (config.activeProfile) {\n console.log(` Profile: ${config.activeProfile}`);\n } else {\n console.log(` Profile: ${pc.dim('none')}`);\n }\n console.log(` Skills: ${active.files}`);\n console.log(` Lines: ${active.lines.toLocaleString()}`);\n console.log(` Est tokens: ${(active.lines * TOKENS_PER_LINE).toLocaleString()}`);\n\n // Budget\n if (config.budget) {\n const budgetValue = config.budget.unit === 'tokens'\n ? active.lines * TOKENS_PER_LINE\n : active.lines;\n const pct = Math.round((budgetValue / config.budget.max) * 100);\n const color = pct > 100 ? pc.red : pct > 80 ? pc.yellow : pc.green;\n console.log(pc.cyan('\\nBudget:'));\n console.log(` Limit: ${config.budget.max.toLocaleString()} ${config.budget.unit}`);\n console.log(` Usage: ${color(`${pct}%`)}`);\n }\n\n // Coverage\n console.log(pc.cyan('\\nCoverage:'));\n console.log(` Categories: ${installed.categories.size} covered`);\n\n // Gap analysis\n const manifestPacks = new Set(Object.keys(manifest.installed).map(id => id.split('/')[0]));\n const activePacks = active.packs;\n const unusedPacks = [...manifestPacks].filter(p => !activePacks.has(p));\n if (unusedPacks.length > 0) {\n console.log(pc.yellow(`\\n Installed but not active: ${unusedPacks.join(', ')}`));\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\nimport { readManifest } from '../cache.js';\n\nconst SKILLDB_DIR = '.skilldb';\nconst SKILLS_DIR = 'skills';\n\nfunction diffLines(local: string, remote: string): { added: number; removed: number; changed: boolean } {\n const localLines = local.split('\\n');\n const remoteLines = remote.split('\\n');\n let added = 0;\n let removed = 0;\n\n const localSet = new Set(localLines);\n const remoteSet = new Set(remoteLines);\n\n for (const line of remoteLines) {\n if (!localSet.has(line)) added++;\n }\n for (const line of localLines) {\n if (!remoteSet.has(line)) removed++;\n }\n\n return { added, removed, changed: added > 0 || removed > 0 };\n}\n\nfunction showDiff(id: string, local: string, remote: string): void {\n const result = diffLines(local, remote);\n\n if (!result.changed) {\n console.log(pc.dim(` ${id}: up to date`));\n return;\n }\n\n console.log(pc.bold(` ${id}:`));\n if (result.added > 0) console.log(pc.green(` +${result.added} lines added`));\n if (result.removed > 0) console.log(pc.red(` -${result.removed} lines removed`));\n\n // Show first few changed lines\n const localLines = local.split('\\n');\n const remoteLines = remote.split('\\n');\n const localSet = new Set(localLines);\n const remoteSet = new Set(remoteLines);\n let shown = 0;\n\n for (const line of remoteLines) {\n if (!localSet.has(line) && line.trim()) {\n console.log(pc.green(` + ${line.slice(0, 80)}`));\n if (++shown >= 3) break;\n }\n }\n shown = 0;\n for (const line of localLines) {\n if (!remoteSet.has(line) && line.trim()) {\n console.log(pc.red(` - ${line.slice(0, 80)}`));\n if (++shown >= 3) break;\n }\n }\n}\n\nexport async function diffCommand(target?: string): Promise<void> {\n const cwd = process.cwd();\n const client = new SkillDBClient();\n const manifest = readManifest(cwd);\n const installedIds = Object.keys(manifest.installed);\n\n if (installedIds.length === 0) {\n console.log(pc.yellow('No skills installed.'));\n return;\n }\n\n // Single skill diff\n if (target) {\n let id = target;\n if (!id.includes('.md')) id = id + '.md';\n\n const [pack, file] = id.split('/');\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-');\n const localPath = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, pack, `${name}.md`);\n\n if (!fs.existsSync(localPath)) {\n console.error(pc.red(`Skill \"${id}\" not found locally.`));\n process.exit(1);\n }\n\n console.log(pc.bold('Comparing with remote...\\n'));\n\n try {\n const remote = await client.get(id);\n const localContent = fs.readFileSync(localPath, 'utf-8');\n\n if (!remote.content) {\n console.log(pc.yellow('Remote content not available (API key required).'));\n return;\n }\n\n showDiff(id, localContent, remote.content);\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n return;\n }\n\n // Diff all installed\n console.log(pc.bold(`Comparing ${installedIds.length} skill(s) with remote...\\n`));\n\n const packGroups = new Map<string, string[]>();\n for (const id of installedIds) {\n const p = id.split('/')[0];\n if (!packGroups.has(p)) packGroups.set(p, []);\n packGroups.get(p)!.push(id);\n }\n\n let changed = 0;\n let upToDate = 0;\n\n for (const [packName, ids] of packGroups) {\n try {\n const res = await client.list({ pack: packName, limit: 500, includeContent: true });\n const remoteMap = new Map(res.skills.map(s => [s.id, s]));\n\n for (const id of ids) {\n const remote = remoteMap.get(id);\n if (!remote?.content) continue;\n\n const [pack, file] = id.split('/');\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-');\n const localPath = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, pack, `${name}.md`);\n\n let localContent = '';\n try { localContent = fs.readFileSync(localPath, 'utf-8'); } catch { continue; }\n\n const result = diffLines(localContent, remote.content);\n if (result.changed) {\n showDiff(id, localContent, remote.content);\n changed++;\n } else {\n upToDate++;\n }\n }\n } catch (err) {\n console.log(pc.red(` Error fetching ${packName}: ${(err as Error).message}`));\n }\n }\n\n console.log(`\\n${pc.green(`${upToDate} up to date`)}` +\n (changed > 0 ? pc.yellow(`, ${changed} changed`) : ''));\n if (changed > 0) {\n console.log(pc.dim('Run \"skilldb update\" to pull latest versions.'));\n }\n}\n"],"mappings":"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","names":["pc","pc","pad","truncate","pc","fs","path","path","fs","pc","pc","pc","pc","pc","fs","path","pc","fs","path","pc","pc","readline","prompt","pc","fs","path","pc","SKILLDB_DIR","fs","path","pc","SKILLDB_DIR","CONFIG_FILE","ACTIVE_DIR","readConfig","writeConfig","walk","fs","path","pc","SKILLDB_DIR","ACTIVE_DIR","SKILLS_DIR","ensureDir","fs","path","pc","fs","path","pc","fs","path","pc","SKILLDB_DIR","SKILLS_DIR","ACTIVE_DIR","CONFIG_FILE","TOKENS_PER_LINE","readConfig","path","fs","pc","fs","path","pc","SKILLDB_DIR","SKILLS_DIR","pc","path","fs","fs","path","pc","SKILLDB_DIR","SKILLS_DIR","ACTIVE_DIR","path","fs","activeSkills","id","pack","file","name","pc","fs","path","pc","SKILLDB_DIR","ACTIVE_DIR","CONFIG_FILE","readConfig","path","fs","collectActiveSkills","pc","fs","path","pc","SKILLDB_DIR","SKILLS_DIR","ACTIVE_DIR","CONFIG_FILE","TOKENS_PER_LINE","readConfig","path","fs","pc","fs","path","pc","SKILLDB_DIR","SKILLS_DIR","pc","path","fs"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/search.ts","../src/config.ts","../src/client.ts","../src/commands/list.ts","../src/commands/add.ts","../src/cache.ts","../src/commands/get.ts","../src/commands/info.ts","../src/commands/init.ts","../src/commands/login.ts","../src/commands/use.ts","../src/commands/budget.ts","../src/commands/slim.ts","../src/commands/recommend.ts","../src/commands/doctor.ts","../src/commands/update.ts","../src/commands/remove.ts","../src/commands/export.ts","../src/commands/stats.ts","../src/commands/diff.ts"],"sourcesContent":["import { Command } from 'commander';\r\nimport { searchCommand } from './commands/search.js';\r\nimport { listCommand } from './commands/list.js';\r\nimport { addCommand } from './commands/add.js';\r\nimport { getCommand } from './commands/get.js';\r\nimport { infoCommand } from './commands/info.js';\r\nimport { initCommand } from './commands/init.js';\r\nimport { loginCommand } from './commands/login.js';\r\nimport { useCommand } from './commands/use.js';\r\nimport { budgetCommand } from './commands/budget.js';\r\nimport { slimCommand } from './commands/slim.js';\r\nimport { recommendCommand } from './commands/recommend.js';\r\nimport { doctorCommand } from './commands/doctor.js';\r\nimport { updateCommand } from './commands/update.js';\r\nimport { removeCommand } from './commands/remove.js';\r\nimport { exportCommand } from './commands/export.js';\r\nimport { statsCommand } from './commands/stats.js';\r\nimport { diffCommand } from './commands/diff.js';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('skilldb')\r\n .description('SkillDB CLI — discover, install, and manage AI agent skills')\r\n .version('0.3.0');\r\n\r\nprogram\r\n .command('init')\r\n .description('Initialize SkillDB in this project (detect IDE, create .skilldb/)')\r\n .action(initCommand);\r\n\r\nprogram\r\n .command('login')\r\n .description('Save your SkillDB API key')\r\n .action(loginCommand);\r\n\r\nprogram\r\n .command('search <query...>')\r\n .description('Search skills by keyword(s)')\r\n .option('-c, --category <name>', 'Filter by category')\r\n .option('-l, --limit <n>', 'Max results', '20')\r\n .action((queryParts: string[], options: { category?: string; limit?: string }) => {\r\n searchCommand(queryParts.join(' '), options);\r\n });\r\n\r\nprogram\r\n .command('list')\r\n .description('List skills, optionally filtered')\r\n .option('-c, --category <name>', 'Filter by category')\r\n .option('-p, --pack <name>', 'Filter by pack')\r\n .option('-l, --limit <n>', 'Max results', '50')\r\n .action(listCommand);\r\n\r\nprogram\r\n .command('get <id>')\r\n .description('Download a single skill to .skilldb/skills/ (e.g. \"software-skills/code-review\")')\r\n .action(getCommand);\r\n\r\nprogram\r\n .command('add <pack>')\r\n .description('Download an entire skill pack to local .skilldb/skills/ cache')\r\n .action(addCommand);\r\n\r\nprogram\r\n .command('info <id>')\r\n .description('Show metadata and preview for a skill (e.g. \"software-skills/code-review\")')\r\n .action(infoCommand);\r\n\r\nprogram\r\n .command('use [profile]')\r\n .description('Activate a skill profile (frontend, backend, devops, security, data, fullstack, mobile, ai-agent, auto, none)')\r\n .option('--list', 'List available profiles')\r\n .option('--current', 'Show active profile')\r\n .action((profile: string | undefined, options: { list?: boolean; current?: boolean }) => {\r\n if (!profile && !options.list && !options.current) {\r\n options.list = true;\r\n }\r\n useCommand(profile || '', options);\r\n });\r\n\r\nprogram\r\n .command('budget [action] [value]')\r\n .description('Manage token/line budget for active skills')\r\n .action((action?: string, value?: string) => {\r\n budgetCommand(action, value);\r\n });\r\n\r\nprogram\r\n .command('slim [pack]')\r\n .description('Generate compressed skill summaries')\r\n .option('-r, --ratio <ratio>', 'Keep ratio (0-1, default 0.3)', '0.3')\r\n .action((pack: string | undefined, options: { ratio?: string }) => {\r\n slimCommand(pack, options);\r\n });\r\n\r\nprogram\r\n .command('recommend')\r\n .description('Scan project and suggest skill packs')\r\n .option('-i, --install', 'Auto-install recommendations')\r\n .action(recommendCommand);\r\n\r\nprogram\r\n .command('doctor')\r\n .description('Run health check and audit on installed skills')\r\n .action(doctorCommand);\r\n\r\nprogram\r\n .command('update [pack]')\r\n .description('Update installed skills from remote')\r\n .action((pack?: string) => {\r\n updateCommand(pack);\r\n });\r\n\r\nprogram\r\n .command('remove <target>')\r\n .description('Remove a skill or pack (e.g. \"software-skills/code-review\" or \"software-skills\")')\r\n .option('--unused', 'Remove skills not in active profile')\r\n .action((target: string, options: { unused?: boolean }) => {\r\n removeCommand(target, options);\r\n });\r\n\r\nprogram\r\n .command('export <format> [target]')\r\n .description('Export skills (formats: claude, cursor, profile, inject)')\r\n .action((format: string, target?: string) => {\r\n exportCommand(format, target);\r\n });\r\n\r\nprogram\r\n .command('stats')\r\n .description('Show local statistics and coverage')\r\n .action(statsCommand);\r\n\r\nprogram\r\n .command('diff [target]')\r\n .description('Compare local skills with latest remote versions')\r\n .action((target?: string) => {\r\n diffCommand(target);\r\n });\r\n\r\nprogram.parse();\r\n","import pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\n\nexport async function searchCommand(query: string, options: { category?: string; limit?: string }): Promise<void> {\n const client = new SkillDBClient();\n const limit = options.limit ? parseInt(options.limit) : 20;\n\n try {\n const res = await client.search(query, { category: options.category, limit });\n\n if (res.skills.length === 0) {\n console.log(pc.yellow(`No skills found for \"${query}\"`));\n return;\n }\n\n console.log(pc.bold(`Found ${res.pagination.total} skill${res.pagination.total === 1 ? '' : 's'} for \"${query}\":\\n`));\n\n // Column widths\n const idW = 42;\n const nameW = 28;\n const descW = 44;\n\n console.log(\n pc.dim(\n pad('ID', idW) + pad('SKILL', nameW) + 'DESCRIPTION'\n )\n );\n console.log(pc.dim('─'.repeat(idW + nameW + descW)));\n\n for (const s of res.skills) {\n const id = truncate(s.id.replace('.md', ''), idW - 2);\n const name = truncate(s.title, nameW - 2);\n const desc = truncate(s.description, descW);\n console.log(\n pc.white(pad(id, idW)) + pc.cyan(pad(name, nameW)) + pc.dim(desc)\n );\n }\n\n if (res.pagination.hasMore) {\n console.log(pc.dim(`\\n... and ${res.pagination.total - res.skills.length} more. Use --limit to see more.`));\n }\n\n console.log(pc.dim(`\\nTo download a skill: `) + pc.cyan(`skilldb get <pack>/<skill-name>`));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n\nfunction pad(str: string, width: number): string {\n return str.length >= width ? str.slice(0, width) : str + ' '.repeat(width - str.length);\n}\n\nfunction truncate(str: string, max: number): string {\n return str.length <= max ? str : str.slice(0, max - 1) + '…';\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nconst RC_FILE = '.skilldbrc';\n\nexport const DEFAULT_BASE_URL = 'https://skilldb.dev/api/v1';\n\ninterface RcConfig {\n apiKey?: string;\n}\n\nfunction readJson(filePath: string): RcConfig | null {\n try {\n const raw = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve API key from (in priority order):\n * 1. SKILLDB_API_KEY env var\n * 2. .skilldbrc in project root (cwd)\n * 3. ~/.skilldbrc in home dir\n */\nexport function resolveApiKey(): string | undefined {\n if (process.env.SKILLDB_API_KEY) {\n return process.env.SKILLDB_API_KEY;\n }\n\n const projectRc = path.join(process.cwd(), RC_FILE);\n const projectConfig = readJson(projectRc);\n if (projectConfig?.apiKey) return projectConfig.apiKey;\n\n const homeRc = path.join(os.homedir(), RC_FILE);\n const homeConfig = readJson(homeRc);\n if (homeConfig?.apiKey) return homeConfig.apiKey;\n\n return undefined;\n}\n\n/**\n * Resolve base URL from env or default.\n */\nexport function resolveBaseUrl(): string {\n return process.env.SKILLDB_API_URL || DEFAULT_BASE_URL;\n}\n\n/**\n * Save API key to ~/.skilldbrc (user-wide) or project .skilldbrc.\n */\nexport function saveApiKey(apiKey: string, global = true): string {\n const target = global\n ? path.join(os.homedir(), RC_FILE)\n : path.join(process.cwd(), RC_FILE);\n\n const existing = readJson(target) || {};\n fs.writeFileSync(target, JSON.stringify({ ...existing, apiKey }, null, 2) + '\\n', 'utf-8');\n return target;\n}\n","import type { ClientConfig, Skill, SkillsResponse, SearchOptions } from './types.js';\nimport { resolveApiKey, resolveBaseUrl } from './config.js';\n\nexport class SkillDBClient {\n private apiKey?: string;\n private baseUrl: string;\n\n constructor(config?: ClientConfig) {\n this.apiKey = config?.apiKey ?? resolveApiKey();\n this.baseUrl = config?.baseUrl ?? resolveBaseUrl();\n }\n\n private headers(): Record<string, string> {\n const h: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.apiKey) {\n h['Authorization'] = `Bearer ${this.apiKey}`;\n }\n return h;\n }\n\n private async request<T>(endpoint: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined && v !== '') url.searchParams.set(k, v);\n }\n }\n\n const res = await fetch(url.toString(), { headers: this.headers() });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n const msg = (body as Record<string, string>).error || `HTTP ${res.status}`;\n throw new Error(msg);\n }\n\n return res.json() as Promise<T>;\n }\n\n /** Search skills by keyword. */\n async search(query: string, options?: Omit<SearchOptions, 'search'>): Promise<SkillsResponse> {\n return this.request<SkillsResponse>('/skills', {\n search: query,\n category: options?.category ?? '',\n pack: options?.pack ?? '',\n sort: options?.sort ?? '',\n limit: String(options?.limit ?? 20),\n offset: String(options?.offset ?? 0),\n include_content: options?.includeContent ? 'true' : '',\n });\n }\n\n /** List skills with optional filters and sorting. */\n async list(options?: SearchOptions): Promise<SkillsResponse> {\n return this.request<SkillsResponse>('/skills', {\n category: options?.category ?? '',\n pack: options?.pack ?? '',\n search: options?.search ?? '',\n sort: options?.sort ?? '',\n limit: String(options?.limit ?? 50),\n offset: String(options?.offset ?? 0),\n include_content: options?.includeContent ? 'true' : '',\n });\n }\n\n /** Get a single skill by ID (e.g. \"software-skills/code-review.md\"). */\n async get(id: string): Promise<Skill> {\n const encoded = encodeURIComponent(id);\n const res = await this.request<Skill | { skill: Skill }>(`/skills/${encoded}`, {\n include_content: 'true',\n });\n // Handle both direct and wrapped responses\n return 'skill' in res ? res.skill : res;\n }\n\n /** Batch retrieve multiple skills by IDs (max 50). */\n async batch(ids: string[]): Promise<SkillsResponse> {\n return this.request<SkillsResponse>('/skills', {\n ids: ids.slice(0, 50).join(','),\n include_content: 'true',\n });\n }\n\n /** Get search autocomplete suggestions. */\n async suggest(query: string): Promise<{ suggestions: Array<{ title: string; pack: string; category: string; id: string }> }> {\n return this.request('/skills/suggest', { q: query });\n }\n\n /** Validate that the configured API key works. */\n async validate(): Promise<boolean> {\n try {\n const url = `${this.baseUrl}/keys/usage`;\n const res = await fetch(url, { headers: this.headers() });\n return res.ok;\n } catch {\n return false;\n }\n }\n}\n","import pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\n\nexport async function listCommand(options: { category?: string; pack?: string; limit?: string }): Promise<void> {\n const client = new SkillDBClient();\n const limit = options.limit ? parseInt(options.limit) : 50;\n\n try {\n const res = await client.list({ category: options.category, pack: options.pack, limit });\n\n if (res.skills.length === 0) {\n console.log(pc.yellow('No skills found.'));\n return;\n }\n\n // If no filter, show categories overview\n if (!options.category && !options.pack) {\n console.log(pc.bold('Categories:'));\n for (const cat of res.meta.categories) {\n console.log(` ${pc.cyan(cat)}`);\n }\n console.log(`\\n${pc.dim(`${res.meta.totalPacks} packs, ${res.pagination.total} skills total`)}`);\n console.log(pc.dim('Use --category or --pack to filter.\\n'));\n }\n\n // Print skills\n const nameW = 30;\n const packW = 24;\n const catW = 20;\n\n console.log(pc.dim(pad('SKILL', nameW) + pad('PACK', packW) + 'CATEGORY'));\n console.log(pc.dim('─'.repeat(nameW + packW + catW)));\n\n for (const s of res.skills) {\n console.log(\n pc.cyan(pad(truncate(s.title, nameW - 2), nameW)) +\n pc.white(pad(truncate(s.packLabel, packW - 2), packW)) +\n pc.dim(s.category)\n );\n }\n\n if (res.pagination.hasMore) {\n console.log(pc.dim(`\\nShowing ${res.skills.length} of ${res.pagination.total}. Use --limit to see more.`));\n }\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n\nfunction pad(str: string, width: number): string {\n return str.length >= width ? str.slice(0, width) : str + ' '.repeat(width - str.length);\n}\n\nfunction truncate(str: string, max: number): string {\n return str.length <= max ? str : str.slice(0, max - 1) + '…';\n}\n","import pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\nimport { initCache, cacheSkill, isCached } from '../cache.js';\n\nexport async function addCommand(packName: string): Promise<void> {\n const client = new SkillDBClient();\n\n console.log(pc.bold(`Adding pack: ${packName}`));\n initCache();\n\n try {\n // Fetch all skills in the pack\n const res = await client.list({ pack: packName, limit: 500, includeContent: true });\n\n if (res.skills.length === 0) {\n console.error(pc.red(`Pack \"${packName}\" not found or empty.`));\n process.exit(1);\n }\n\n let added = 0;\n let skipped = 0;\n\n for (const skill of res.skills) {\n if (isCached(skill.id)) {\n skipped++;\n console.log(pc.dim(` skip ${skill.id} (already cached)`));\n continue;\n }\n\n const filePath = cacheSkill(skill);\n added++;\n console.log(pc.green(` add ${skill.id}`) + pc.dim(` → ${filePath}`));\n }\n\n console.log(\n `\\n${pc.green(`${added} skill${added === 1 ? '' : 's'} added`)}` +\n (skipped > 0 ? pc.dim(`, ${skipped} skipped`) : '')\n );\n\n if (res.skills.some(s => !s.content)) {\n console.log(pc.yellow('\\nNote: Some skills were cached without content (metadata only).'));\n console.log(pc.yellow('Run \"skilldb login\" with a Pro key to download full content.'));\n }\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { Manifest, Skill } from './types.js';\n\nconst SKILLDB_DIR = '.skilldb';\nconst SKILLS_DIR = 'skills';\nconst MANIFEST_FILE = 'manifest.json';\n\nfunction ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction skilldbRoot(cwd?: string): string {\n return path.join(cwd ?? process.cwd(), SKILLDB_DIR);\n}\n\n/** Ensure .skilldb/ directory structure exists. */\nexport function initCache(cwd?: string): string {\n const root = skilldbRoot(cwd);\n ensureDir(path.join(root, SKILLS_DIR));\n\n const manifestPath = path.join(root, MANIFEST_FILE);\n if (!fs.existsSync(manifestPath)) {\n fs.writeFileSync(manifestPath, JSON.stringify({ installed: {} }, null, 2) + '\\n');\n }\n\n return root;\n}\n\n/** Read the local manifest. */\nexport function readManifest(cwd?: string): Manifest {\n const manifestPath = path.join(skilldbRoot(cwd), MANIFEST_FILE);\n try {\n return JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));\n } catch {\n return { installed: {} };\n }\n}\n\n/** Write the local manifest. */\nexport function writeManifest(manifest: Manifest, cwd?: string): void {\n const root = skilldbRoot(cwd);\n ensureDir(root);\n fs.writeFileSync(\n path.join(root, MANIFEST_FILE),\n JSON.stringify(manifest, null, 2) + '\\n'\n );\n}\n\n/** Save a skill to the local cache. */\nexport function cacheSkill(skill: Skill, cwd?: string): string {\n const root = skilldbRoot(cwd);\n const skillDir = path.join(root, SKILLS_DIR, skill.pack);\n ensureDir(skillDir);\n\n const safeName = skill.name.replace(/[/\\\\:*?\"<>|]/g, '-');\n const filePath = path.join(skillDir, `${safeName}.md`);\n fs.writeFileSync(filePath, skill.content ?? `# ${skill.title}\\n\\n${skill.description}\\n`);\n\n // Update manifest\n const manifest = readManifest(cwd);\n manifest.installed[skill.id] = {\n addedAt: new Date().toISOString(),\n lines: skill.lines,\n };\n writeManifest(manifest, cwd);\n\n return filePath;\n}\n\n/** Check if a skill is already cached. */\nexport function isCached(skillId: string, cwd?: string): boolean {\n const manifest = readManifest(cwd);\n return skillId in manifest.installed;\n}\n\n/** Get the local path for a cached skill. */\nexport function getCachedPath(skillId: string, cwd?: string): string | null {\n if (!isCached(skillId, cwd)) return null;\n const [pack, file] = skillId.split('/');\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-');\n const filePath = path.join(skilldbRoot(cwd), SKILLS_DIR, pack, `${name}.md`);\n return fs.existsSync(filePath) ? filePath : null;\n}\n\n/** List all cached skills. */\nexport function listCached(cwd?: string): Manifest {\n return readManifest(cwd);\n}\n\n/** Ensure .skilldb/ and .skilldbrc are in .gitignore. */\nexport function updateGitignore(cwd?: string): void {\n const root = cwd ?? process.cwd();\n const gitignorePath = path.join(root, '.gitignore');\n\n const entries = ['.skilldb/', '.skilldbrc'];\n let content = '';\n\n if (fs.existsSync(gitignorePath)) {\n content = fs.readFileSync(gitignorePath, 'utf-8');\n }\n\n const toAdd = entries.filter(e => !content.includes(e));\n if (toAdd.length === 0) return;\n\n const suffix = (content && !content.endsWith('\\n') ? '\\n' : '') +\n '\\n# SkillDB\\n' + toAdd.join('\\n') + '\\n';\n\n fs.writeFileSync(gitignorePath, content + suffix);\n}\n","import pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\nimport { initCache, cacheSkill, isCached, getCachedPath } from '../cache.js';\n\nexport async function getCommand(id: string): Promise<void> {\n const client = new SkillDBClient();\n\n // Normalize: accept \"pack/skill\" without .md\n if (!id.includes('.md')) {\n id = id + '.md';\n }\n\n // Check if already cached\n if (isCached(id)) {\n const cachedPath = getCachedPath(id);\n console.log(pc.dim(`Already cached: ${cachedPath}`));\n return;\n }\n\n console.log(pc.dim(`Fetching ${id}...`));\n initCache();\n\n try {\n const skill = await client.get(id);\n\n if (!skill.content) {\n console.log(pc.yellow('Skill fetched (metadata only — no content without API key).'));\n console.log(pc.yellow('Run \"skilldb login\" with a Pro key to download full content.'));\n }\n\n const filePath = cacheSkill(skill);\n console.log(pc.green(`✓ Saved ${skill.title}`) + pc.dim(` → ${filePath}`));\n console.log(pc.dim(` ${skill.lines} lines | ${skill.packLabel} | ${skill.category}`));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n","import pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\n\nexport async function infoCommand(id: string): Promise<void> {\n const client = new SkillDBClient();\n\n // Normalize: accept \"pack/skill\" without .md\n if (!id.includes('.md')) {\n id = id + '.md';\n }\n\n try {\n const skill = await client.get(id);\n\n console.log(pc.bold(skill.title));\n console.log(pc.dim('─'.repeat(50)));\n console.log(`${pc.cyan('ID:')} ${skill.id}`);\n console.log(`${pc.cyan('Pack:')} ${skill.packLabel} (${skill.pack})`);\n console.log(`${pc.cyan('Category:')} ${skill.category}`);\n console.log(`${pc.cyan('Lines:')} ${skill.lines}`);\n console.log(`${pc.cyan('Description:')} ${skill.description}`);\n\n if (skill.content) {\n console.log(pc.dim('\\n─── Preview ───────────────────────────────────'));\n const preview = skill.content.split('\\n').slice(0, 20).join('\\n');\n console.log(preview);\n if (skill.content.split('\\n').length > 20) {\n console.log(pc.dim(`\\n... ${skill.lines - 20} more lines`));\n }\n }\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport readline from 'node:readline';\nimport { initCache, updateGitignore } from '../cache.js';\n\ntype IDE = 'claude-code' | 'cursor' | 'codex';\n\ninterface Detection {\n ide: IDE;\n label: string;\n configFile: string;\n}\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise(resolve => {\n rl.question(question, answer => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction detectIDE(cwd: string): Detection | null {\n // Claude Code\n if (fs.existsSync(path.join(cwd, 'CLAUDE.md')) || fs.existsSync(path.join(cwd, '.claude'))) {\n return {\n ide: 'claude-code',\n label: 'Claude Code',\n configFile: path.join(cwd, 'CLAUDE.md'),\n };\n }\n\n // Cursor\n if (fs.existsSync(path.join(cwd, '.cursor')) || fs.existsSync(path.join(cwd, '.cursorrules'))) {\n return {\n ide: 'cursor',\n label: 'Cursor',\n configFile: fs.existsSync(path.join(cwd, '.cursorrules'))\n ? path.join(cwd, '.cursorrules')\n : path.join(cwd, '.cursor', 'rules'),\n };\n }\n\n // Codex\n if (fs.existsSync(path.join(cwd, 'codex.md')) || fs.existsSync(path.join(cwd, '.codex'))) {\n return {\n ide: 'codex',\n label: 'Codex CLI',\n configFile: path.join(cwd, 'codex.md'),\n };\n }\n\n return null;\n}\n\nfunction getIntegrationSnippet(ide: IDE): string {\n const marker = '<!-- skilldb:start -->';\n const endMarker = '<!-- skilldb:end -->';\n\n const content = `\n## SkillDB Skills\n\nLocal skills are available in \\`.skilldb/skills/\\`. Use them as reference when working on tasks.\nSearch: \\`skilldb search react server components\\` (supports multiple words)\nDownload a skill: \\`skilldb get <pack>/<skill>\\` (e.g. \\`skilldb get software-skills/code-review\\`)\nDownload a full pack: \\`skilldb add <pack>\\`\n`.trim();\n\n return `\\n\\n${marker}\\n${content}\\n${endMarker}\\n`;\n}\n\nexport async function initCommand(): Promise<void> {\n const cwd = process.cwd();\n console.log(pc.bold('SkillDB Init\\n'));\n\n // Detect IDE\n let detection = detectIDE(cwd);\n\n if (detection) {\n console.log(`Detected: ${pc.cyan(detection.label)}`);\n } else {\n console.log('No IDE config detected. Which are you using?');\n console.log(' 1) Claude Code');\n console.log(' 2) Cursor');\n console.log(' 3) Codex CLI');\n const choice = await prompt('\\nChoice (1-3): ');\n\n const ideMap: Record<string, IDE> = { '1': 'claude-code', '2': 'cursor', '3': 'codex' };\n const ide = ideMap[choice];\n if (!ide) {\n console.log(pc.red('Invalid choice.'));\n process.exit(1);\n }\n\n const configFiles: Record<IDE, string> = {\n 'claude-code': path.join(cwd, 'CLAUDE.md'),\n 'cursor': path.join(cwd, '.cursorrules'),\n 'codex': path.join(cwd, 'codex.md'),\n };\n\n detection = {\n ide,\n label: ide === 'claude-code' ? 'Claude Code' : ide === 'cursor' ? 'Cursor' : 'Codex CLI',\n configFile: configFiles[ide],\n };\n }\n\n // Create .skilldb/ directory\n const cacheDir = initCache(cwd);\n console.log(`Created ${pc.dim(cacheDir)}`);\n\n // Update .gitignore\n updateGitignore(cwd);\n console.log(`Updated ${pc.dim('.gitignore')}`);\n\n // Write integration snippet\n const snippet = getIntegrationSnippet(detection.ide);\n const configFile = detection.configFile;\n\n let existing = '';\n if (fs.existsSync(configFile)) {\n existing = fs.readFileSync(configFile, 'utf-8');\n }\n\n if (existing.includes('<!-- skilldb:start -->')) {\n console.log(pc.dim(`${path.basename(configFile)} already has SkillDB integration.`));\n } else {\n // Ensure parent dir exists\n const dir = path.dirname(configFile);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(configFile, existing + snippet);\n console.log(`Added SkillDB snippet to ${pc.cyan(path.basename(configFile))}`);\n }\n\n console.log(pc.green('\\nDone! Next steps:'));\n console.log(` ${pc.dim('$')} skilldb login ${pc.dim('# save your API key')}`);\n console.log(` ${pc.dim('$')} skilldb search react server components ${pc.dim('# multi-word search')}`);\n console.log(` ${pc.dim('$')} skilldb get software-skills/code-review ${pc.dim('# download one skill')}`);\n console.log(` ${pc.dim('$')} skilldb add game-design-skills ${pc.dim('# download full pack')}`);\n}\n","import pc from 'picocolors';\nimport { saveApiKey } from '../config.js';\nimport { SkillDBClient } from '../client.js';\nimport readline from 'node:readline';\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise(resolve => {\n rl.question(question, answer => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport async function loginCommand(): Promise<void> {\n console.log(pc.bold('SkillDB Login'));\n console.log('Get your API key at https://skilldb.dev/api-access\\n');\n\n const apiKey = await prompt('API key: ');\n\n if (!apiKey) {\n console.log(pc.red('No API key provided.'));\n process.exit(1);\n }\n\n if (!apiKey.startsWith('sk_')) {\n console.log(pc.yellow('Warning: API key should start with \"sk_\". Saving anyway.'));\n }\n\n // Validate the key\n process.stdout.write('Validating... ');\n const client = new SkillDBClient({ apiKey });\n const valid = await client.validate();\n\n if (valid) {\n const savedTo = saveApiKey(apiKey);\n console.log(pc.green('valid!'));\n console.log(`Saved to ${pc.dim(savedTo)}`);\n } else {\n console.log(pc.yellow('could not validate (saved anyway)'));\n const savedTo = saveApiKey(apiKey);\n console.log(`Saved to ${pc.dim(savedTo)}`);\n }\n}\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { readManifest } from '../cache.js';\r\n\r\nconst SKILLDB_DIR = '.skilldb';\r\nconst ACTIVE_DIR = 'active';\r\nconst CONFIG_FILE = 'config.json';\r\n\r\nconst PROFILES: Record<string, string[]> = {\r\n frontend: ['react-patterns-skills', 'web-polish-skills', 'typescript-skills', 'css-skills'],\r\n backend: ['software-skills', 'api-design-skills', 'database-skills', 'nodejs-skills'],\r\n devops: ['devops-skills', 'docker-skills', 'ci-cd-skills', 'infrastructure-skills'],\r\n security: ['security-skills', 'appsec-skills', 'auth-skills'],\r\n data: ['data-engineering-skills', 'sql-skills', 'analytics-skills'],\r\n fullstack: ['react-patterns-skills', 'software-skills', 'typescript-skills', 'api-design-skills'],\r\n mobile: ['react-native-skills', 'mobile-skills', 'ios-skills', 'android-skills'],\r\n 'ai-agent': ['ai-agent-skills', 'prompt-engineering-skills', 'llm-skills'],\r\n};\r\n\r\ninterface Config {\r\n activeProfile?: string;\r\n budget?: { max: number; unit: string };\r\n [key: string]: unknown;\r\n}\r\n\r\nfunction readConfig(cwd: string): Config {\r\n const p = path.join(cwd, SKILLDB_DIR, CONFIG_FILE);\r\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return {}; }\r\n}\r\n\r\nfunction writeConfig(cwd: string, config: Config): void {\r\n const dir = path.join(cwd, SKILLDB_DIR);\r\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(path.join(dir, CONFIG_FILE), JSON.stringify(config, null, 2) + '\\n');\r\n}\r\n\r\nfunction autoDetect(cwd: string): string {\r\n const has = (f: string) => fs.existsSync(path.join(cwd, f));\r\n let pkgDeps: string[] = [];\r\n try {\r\n const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8'));\r\n pkgDeps = Object.keys({ ...pkg.dependencies, ...pkg.devDependencies });\r\n } catch { /* no package.json */ }\r\n\r\n if (pkgDeps.some(d => ['react-native', 'expo'].includes(d))) return 'mobile';\r\n if (pkgDeps.some(d => ['react', 'next', 'vue', 'svelte', 'angular'].includes(d))) {\r\n if (pkgDeps.some(d => ['express', 'fastify', 'nestjs', 'prisma'].includes(d))) return 'fullstack';\r\n return 'frontend';\r\n }\r\n if (has('Dockerfile') || has('docker-compose.yml') || has('.github/workflows')) return 'devops';\r\n if (pkgDeps.some(d => ['langchain', 'openai', '@anthropic-ai/sdk'].includes(d))) return 'ai-agent';\r\n if (pkgDeps.some(d => ['express', 'fastify', 'koa', 'nestjs'].includes(d))) return 'backend';\r\n return 'fullstack';\r\n}\r\n\r\nfunction activateProfile(cwd: string, profile: string): void {\r\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n if (fs.existsSync(activeDir)) fs.rmSync(activeDir, { recursive: true });\r\n fs.mkdirSync(activeDir, { recursive: true });\r\n\r\n const packs = PROFILES[profile] || [];\r\n const skillsDir = path.join(cwd, SKILLDB_DIR, 'skills');\r\n let copied = 0;\r\n\r\n for (const pack of packs) {\r\n const packDir = path.join(skillsDir, pack);\r\n if (!fs.existsSync(packDir)) continue;\r\n const destDir = path.join(activeDir, pack);\r\n fs.mkdirSync(destDir, { recursive: true });\r\n for (const file of fs.readdirSync(packDir)) {\r\n fs.copyFileSync(path.join(packDir, file), path.join(destDir, file));\r\n copied++;\r\n }\r\n }\r\n\r\n const config = readConfig(cwd);\r\n config.activeProfile = profile;\r\n writeConfig(cwd, config);\r\n\r\n console.log(pc.green(`Profile \"${profile}\" activated`) + pc.dim(` (${copied} skills in .skilldb/active/)`));\r\n if (copied === 0) {\r\n console.log(pc.yellow('No matching skills found locally. Install packs first:'));\r\n for (const pack of packs.slice(0, 3)) {\r\n console.log(pc.dim(` skilldb add ${pack}`));\r\n }\r\n }\r\n}\r\n\r\nexport async function useCommand(profile: string, options: { list?: boolean; current?: boolean }): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n if (options.list) {\r\n console.log(pc.bold('Available profiles:\\n'));\r\n for (const [name, packs] of Object.entries(PROFILES)) {\r\n console.log(` ${pc.cyan(name.padEnd(12))} ${pc.dim(packs.join(', '))}`);\r\n }\r\n console.log(pc.dim('\\nUse \"skilldb use auto\" to auto-detect from project files.'));\r\n return;\r\n }\r\n\r\n if (options.current) {\r\n const config = readConfig(cwd);\r\n if (config.activeProfile) {\r\n console.log(`Active profile: ${pc.cyan(config.activeProfile)}`);\r\n } else {\r\n console.log(pc.dim('No active profile. Run \"skilldb use <profile>\" to activate.'));\r\n }\r\n return;\r\n }\r\n\r\n if (profile === 'none') {\r\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n if (fs.existsSync(activeDir)) fs.rmSync(activeDir, { recursive: true });\r\n const config = readConfig(cwd);\r\n delete config.activeProfile;\r\n writeConfig(cwd, config);\r\n console.log(pc.green('Profile deactivated. Active directory cleared.'));\r\n return;\r\n }\r\n\r\n if (profile === 'auto') {\r\n const detected = autoDetect(cwd);\r\n console.log(pc.dim(`Auto-detected profile: ${detected}`));\r\n activateProfile(cwd, detected);\r\n return;\r\n }\r\n\r\n if (!PROFILES[profile]) {\r\n console.error(pc.red(`Unknown profile \"${profile}\". Use --list to see available profiles.`));\r\n process.exit(1);\r\n }\r\n\r\n activateProfile(cwd, profile);\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\n\r\nconst SKILLDB_DIR = '.skilldb';\r\nconst CONFIG_FILE = 'config.json';\r\nconst ACTIVE_DIR = 'active';\r\nconst TOKENS_PER_LINE = 10; // rough estimate\r\n\r\ninterface Config {\r\n activeProfile?: string;\r\n budget?: { max: number; unit: string };\r\n [key: string]: unknown;\r\n}\r\n\r\nfunction readConfig(cwd: string): Config {\r\n const p = path.join(cwd, SKILLDB_DIR, CONFIG_FILE);\r\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return {}; }\r\n}\r\n\r\nfunction writeConfig(cwd: string, config: Config): void {\r\n const dir = path.join(cwd, SKILLDB_DIR);\r\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\r\n fs.writeFileSync(path.join(dir, CONFIG_FILE), JSON.stringify(config, null, 2) + '\\n');\r\n}\r\n\r\nfunction countActiveSkills(cwd: string): { files: string[]; totalLines: number; totalTokens: number } {\r\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n const files: string[] = [];\r\n let totalLines = 0;\r\n\r\n if (!fs.existsSync(activeDir)) return { files, totalLines, totalTokens: 0 };\r\n\r\n function walk(dir: string): void {\r\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\r\n const full = path.join(dir, entry.name);\r\n if (entry.isDirectory()) { walk(full); continue; }\r\n if (!entry.name.endsWith('.md')) continue;\r\n const content = fs.readFileSync(full, 'utf-8');\r\n const lines = content.split('\\n').length;\r\n files.push(path.relative(path.join(cwd, SKILLDB_DIR), full));\r\n totalLines += lines;\r\n }\r\n }\r\n\r\n walk(activeDir);\r\n return { files, totalLines, totalTokens: totalLines * TOKENS_PER_LINE };\r\n}\r\n\r\nfunction parseBudget(value: string): { max: number; unit: string } {\r\n const lower = value.toLowerCase();\r\n if (lower.endsWith('k')) {\r\n return { max: parseInt(lower) * 1000, unit: 'tokens' };\r\n }\r\n const num = parseInt(value);\r\n if (num > 10000) return { max: num, unit: 'tokens' };\r\n return { max: num, unit: 'lines' };\r\n}\r\n\r\nexport async function budgetCommand(action?: string, value?: string): Promise<void> {\r\n const cwd = process.cwd();\r\n const config = readConfig(cwd);\r\n const usage = countActiveSkills(cwd);\r\n\r\n if (action === 'set' && value) {\r\n const budget = parseBudget(value);\r\n config.budget = budget;\r\n writeConfig(cwd, config);\r\n console.log(pc.green(`Budget set to ${budget.max.toLocaleString()} ${budget.unit}`));\r\n return;\r\n }\r\n\r\n if (action === 'optimize') {\r\n if (!config.budget) {\r\n console.error(pc.red('No budget set. Run \"skilldb budget set <value>\" first.'));\r\n process.exit(1);\r\n }\r\n\r\n const budgetValue = config.budget.unit === 'tokens' ? usage.totalTokens : usage.totalLines;\r\n if (budgetValue <= config.budget.max) {\r\n console.log(pc.green('Already within budget. No changes needed.'));\r\n return;\r\n }\r\n\r\n // Remove skills from active/ until under budget, starting from largest\r\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n const skillFiles: { path: string; lines: number }[] = [];\r\n\r\n function walk(dir: string): void {\r\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\r\n const full = path.join(dir, entry.name);\r\n if (entry.isDirectory()) { walk(full); continue; }\r\n if (!entry.name.endsWith('.md')) continue;\r\n const lines = fs.readFileSync(full, 'utf-8').split('\\n').length;\r\n skillFiles.push({ path: full, lines });\r\n }\r\n }\r\n walk(activeDir);\r\n skillFiles.sort((a, b) => b.lines - a.lines);\r\n\r\n let current = config.budget.unit === 'tokens' ? usage.totalTokens : usage.totalLines;\r\n let removed = 0;\r\n for (const sf of skillFiles) {\r\n if (current <= config.budget.max) break;\r\n fs.unlinkSync(sf.path);\r\n current -= config.budget.unit === 'tokens' ? sf.lines * TOKENS_PER_LINE : sf.lines;\r\n removed++;\r\n console.log(pc.yellow(` removed ${path.basename(sf.path)}`) + pc.dim(` (${sf.lines} lines)`));\r\n }\r\n\r\n console.log(pc.green(`\\nOptimized: removed ${removed} skill(s) to fit budget.`));\r\n return;\r\n }\r\n\r\n // Default: show budget status\r\n console.log(pc.bold('Budget Status\\n'));\r\n console.log(` ${pc.cyan('Active skills:')} ${usage.files.length}`);\r\n console.log(` ${pc.cyan('Total lines:')} ${usage.totalLines.toLocaleString()}`);\r\n console.log(` ${pc.cyan('Est. tokens:')} ${usage.totalTokens.toLocaleString()}`);\r\n\r\n if (config.budget) {\r\n const budgetValue = config.budget.unit === 'tokens' ? usage.totalTokens : usage.totalLines;\r\n const pct = Math.round((budgetValue / config.budget.max) * 100);\r\n const color = pct > 100 ? pc.red : pct > 80 ? pc.yellow : pc.green;\r\n console.log(` ${pc.cyan('Budget:')} ${config.budget.max.toLocaleString()} ${config.budget.unit}`);\r\n console.log(` ${pc.cyan('Usage:')} ${color(`${pct}%`)}`);\r\n } else {\r\n console.log(pc.dim('\\n No budget set. Use \"skilldb budget set <value>\" to set one.'));\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\n\r\nconst SKILLDB_DIR = '.skilldb';\r\nconst ACTIVE_DIR = 'active';\r\nconst SLIM_DIR = 'slim';\r\nconst SKILLS_DIR = 'skills';\r\n\r\nfunction ensureDir(dir: string): void {\r\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\r\n}\r\n\r\nfunction slimContent(content: string, ratio: number): string {\r\n const lines = content.split('\\n');\r\n const kept: string[] = [];\r\n let inCodeBlock = false;\r\n let codeBlockLines = 0;\r\n let skipExplanation = false;\r\n\r\n for (const line of lines) {\r\n // Always keep titles and headers\r\n if (line.startsWith('#')) {\r\n kept.push(line);\r\n skipExplanation = false;\r\n continue;\r\n }\r\n\r\n // Track code blocks — keep short ones, trim long ones\r\n if (line.startsWith('```')) {\r\n if (!inCodeBlock) {\r\n inCodeBlock = true;\r\n codeBlockLines = 0;\r\n kept.push(line);\r\n } else {\r\n inCodeBlock = false;\r\n kept.push(line);\r\n }\r\n continue;\r\n }\r\n\r\n if (inCodeBlock) {\r\n codeBlockLines++;\r\n if (codeBlockLines <= 15) kept.push(line);\r\n else if (codeBlockLines === 16) kept.push(' // ... (trimmed)');\r\n continue;\r\n }\r\n\r\n // Keep checklist items and bullet points\r\n if (line.match(/^[-*]\\s+\\[[ x]\\]/)) { kept.push(line); continue; }\r\n if (line.match(/^[-*]\\s+\\*\\*/)) { kept.push(line); continue; }\r\n if (line.match(/^\\d+\\.\\s+\\*\\*/)) { kept.push(line); continue; }\r\n\r\n // Keep short bullet points (methodology steps)\r\n if (line.match(/^[-*]\\s+/) && line.length < 120) { kept.push(line); continue; }\r\n if (line.match(/^\\d+\\.\\s+/) && line.length < 120) { kept.push(line); continue; }\r\n\r\n // Keep bold/key lines\r\n if (line.match(/^\\*\\*.+\\*\\*/)) { kept.push(line); continue; }\r\n\r\n // Skip verbose explanation paragraphs\r\n if (line.trim() === '') {\r\n if (!skipExplanation) kept.push(line);\r\n continue;\r\n }\r\n\r\n // Keep if within ratio budget\r\n if (kept.length / Math.max(lines.length, 1) < ratio) {\r\n kept.push(line);\r\n } else {\r\n skipExplanation = true;\r\n }\r\n }\r\n\r\n return kept.join('\\n');\r\n}\r\n\r\nfunction processDir(sourceDir: string, destDir: string, ratio: number): number {\r\n ensureDir(destDir);\r\n let count = 0;\r\n\r\n for (const entry of fs.readdirSync(sourceDir, { withFileTypes: true })) {\r\n const srcPath = path.join(sourceDir, entry.name);\r\n if (entry.isDirectory()) {\r\n count += processDir(srcPath, path.join(destDir, entry.name), ratio);\r\n continue;\r\n }\r\n if (!entry.name.endsWith('.md')) continue;\r\n\r\n const content = fs.readFileSync(srcPath, 'utf-8');\r\n const slimmed = slimContent(content, ratio);\r\n const footer = `\\n\\n---\\n*Full skill: \\`skilldb get ${entry.name.replace('.md', '')}\\`*\\n`;\r\n\r\n ensureDir(destDir);\r\n fs.writeFileSync(path.join(destDir, entry.name), slimmed + footer);\r\n count++;\r\n\r\n const origLines = content.split('\\n').length;\r\n const slimLines = slimmed.split('\\n').length;\r\n console.log(\r\n pc.green(` slim ${entry.name}`) +\r\n pc.dim(` ${origLines} → ${slimLines} lines (${Math.round((slimLines / origLines) * 100)}%)`)\r\n );\r\n }\r\n\r\n return count;\r\n}\r\n\r\nexport async function slimCommand(pack?: string, options?: { ratio?: string }): Promise<void> {\r\n const cwd = process.cwd();\r\n const ratio = options?.ratio ? parseFloat(options.ratio) : 0.3;\r\n\r\n if (ratio <= 0 || ratio >= 1) {\r\n console.error(pc.red('Ratio must be between 0 and 1 (e.g. 0.3 for 30%).'));\r\n process.exit(1);\r\n }\r\n\r\n const slimDir = path.join(cwd, SKILLDB_DIR, SLIM_DIR);\r\n console.log(pc.bold(`Generating slim versions (${Math.round(ratio * 100)}% ratio)\\n`));\r\n\r\n let sourceDir: string;\r\n if (pack) {\r\n sourceDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, pack);\r\n if (!fs.existsSync(sourceDir)) {\r\n sourceDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR, pack);\r\n }\r\n if (!fs.existsSync(sourceDir)) {\r\n console.error(pc.red(`Pack \"${pack}\" not found in skills/ or active/.`));\r\n process.exit(1);\r\n }\r\n } else {\r\n sourceDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n if (!fs.existsSync(sourceDir)) {\r\n sourceDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR);\r\n }\r\n }\r\n\r\n if (!fs.existsSync(sourceDir)) {\r\n console.error(pc.red('No skills found. Install skills first with \"skilldb add <pack>\".'));\r\n process.exit(1);\r\n }\r\n\r\n const destDir = pack ? path.join(slimDir, pack) : slimDir;\r\n const count = processDir(sourceDir, destDir, ratio);\r\n console.log(pc.green(`\\n${count} skill(s) slimmed → .skilldb/slim/`));\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { SkillDBClient } from '../client.js';\r\nimport { readManifest, initCache, cacheSkill } from '../cache.js';\r\n\r\nconst TECH_MAP: Record<string, string[]> = {\r\n react: ['react-patterns-skills', 'web-polish-skills'],\r\n next: ['react-patterns-skills', 'web-polish-skills', 'nextjs-skills'],\r\n vue: ['vue-skills', 'web-polish-skills'],\r\n angular: ['angular-skills', 'web-polish-skills'],\r\n express: ['software-skills', 'api-design-skills', 'nodejs-skills'],\r\n fastify: ['software-skills', 'api-design-skills', 'nodejs-skills'],\r\n nestjs: ['software-skills', 'api-design-skills', 'nodejs-skills'],\r\n prisma: ['database-skills', 'software-skills'],\r\n typescript: ['typescript-skills', 'software-skills'],\r\n tailwindcss: ['css-skills', 'web-polish-skills'],\r\n docker: ['devops-skills', 'docker-skills'],\r\n openai: ['ai-agent-skills', 'prompt-engineering-skills'],\r\n '@anthropic-ai/sdk': ['ai-agent-skills', 'prompt-engineering-skills'],\r\n langchain: ['ai-agent-skills', 'llm-skills'],\r\n 'react-native': ['mobile-skills', 'react-native-skills'],\r\n expo: ['mobile-skills', 'react-native-skills'],\r\n jest: ['testing-skills', 'software-skills'],\r\n vitest: ['testing-skills', 'software-skills'],\r\n};\r\n\r\nfunction scanProject(cwd: string): { detected: string[]; packs: Set<string> } {\r\n const detected: string[] = [];\r\n const packs = new Set<string>();\r\n\r\n // Scan package.json\r\n try {\r\n const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8'));\r\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\r\n for (const dep of Object.keys(allDeps)) {\r\n const key = dep.replace(/^@[^/]+\\//, '');\r\n if (TECH_MAP[dep]) {\r\n detected.push(dep);\r\n TECH_MAP[dep].forEach(p => packs.add(p));\r\n } else if (TECH_MAP[key]) {\r\n detected.push(key);\r\n TECH_MAP[key].forEach(p => packs.add(p));\r\n }\r\n }\r\n } catch { /* no package.json */ }\r\n\r\n // Check common files\r\n if (fs.existsSync(path.join(cwd, 'Dockerfile'))) {\r\n detected.push('docker');\r\n (TECH_MAP.docker || []).forEach(p => packs.add(p));\r\n }\r\n if (fs.existsSync(path.join(cwd, 'tsconfig.json'))) {\r\n detected.push('typescript');\r\n (TECH_MAP.typescript || []).forEach(p => packs.add(p));\r\n }\r\n\r\n // Always recommend software-skills as baseline\r\n packs.add('software-skills');\r\n\r\n return { detected, packs };\r\n}\r\n\r\nexport async function recommendCommand(options: { install?: boolean }): Promise<void> {\r\n const cwd = process.cwd();\r\n const manifest = readManifest(cwd);\r\n const installed = new Set(Object.keys(manifest.installed).map(id => id.split('/')[0]));\r\n\r\n console.log(pc.bold('Scanning project...\\n'));\r\n const { detected, packs } = scanProject(cwd);\r\n\r\n if (detected.length > 0) {\r\n console.log(pc.dim('Detected technologies: ') + detected.join(', '));\r\n console.log();\r\n }\r\n\r\n const missing = [...packs].filter(p => !installed.has(p));\r\n const existing = [...packs].filter(p => installed.has(p));\r\n\r\n if (existing.length > 0) {\r\n console.log(pc.green('Already installed:'));\r\n for (const p of existing) {\r\n console.log(pc.dim(` + ${p}`));\r\n }\r\n console.log();\r\n }\r\n\r\n if (missing.length === 0) {\r\n console.log(pc.green('You have all recommended packs installed!'));\r\n return;\r\n }\r\n\r\n console.log(pc.yellow('Recommended packs to install:'));\r\n for (const p of missing) {\r\n console.log(` ${pc.cyan(p)}`);\r\n }\r\n\r\n if (!options.install) {\r\n console.log(pc.dim('\\nRun \"skilldb recommend --install\" to auto-install all.'));\r\n return;\r\n }\r\n\r\n // Auto-install\r\n console.log(pc.bold('\\nInstalling recommended packs...\\n'));\r\n const client = new SkillDBClient();\r\n initCache(cwd);\r\n\r\n for (const pack of missing) {\r\n try {\r\n const res = await client.list({ pack, limit: 500, includeContent: true });\r\n if (res.skills.length === 0) {\r\n console.log(pc.dim(` skip ${pack} (not found)`));\r\n continue;\r\n }\r\n let added = 0;\r\n for (const skill of res.skills) {\r\n cacheSkill(skill, cwd);\r\n added++;\r\n }\r\n console.log(pc.green(` add ${pack}`) + pc.dim(` (${added} skills)`));\r\n } catch (err) {\r\n console.log(pc.red(` fail ${pack}: ${(err as Error).message}`));\r\n }\r\n }\r\n\r\n console.log(pc.green('\\nDone! Run \"skilldb use auto\" to activate a profile.'));\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { readManifest } from '../cache.js';\r\n\r\nconst SKILLDB_DIR = '.skilldb';\r\nconst SKILLS_DIR = 'skills';\r\nconst ACTIVE_DIR = 'active';\r\nconst CONFIG_FILE = 'config.json';\r\nconst TOKENS_PER_LINE = 10;\r\n\r\ninterface Config {\r\n activeProfile?: string;\r\n budget?: { max: number; unit: string };\r\n}\r\n\r\nfunction readConfig(cwd: string): Config {\r\n const p = path.join(cwd, SKILLDB_DIR, CONFIG_FILE);\r\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return {}; }\r\n}\r\n\r\nfunction collectFiles(dir: string): { name: string; lines: number }[] {\r\n const result: { name: string; lines: number }[] = [];\r\n if (!fs.existsSync(dir)) return result;\r\n\r\n function walk(d: string): void {\r\n for (const entry of fs.readdirSync(d, { withFileTypes: true })) {\r\n const full = path.join(d, entry.name);\r\n if (entry.isDirectory()) { walk(full); continue; }\r\n if (!entry.name.endsWith('.md')) continue;\r\n const lines = fs.readFileSync(full, 'utf-8').split('\\n').length;\r\n result.push({ name: path.relative(dir, full), lines });\r\n }\r\n }\r\n\r\n walk(dir);\r\n return result;\r\n}\r\n\r\nexport async function doctorCommand(): Promise<void> {\r\n const cwd = process.cwd();\r\n const manifest = readManifest(cwd);\r\n const config = readConfig(cwd);\r\n let issues = 0;\r\n\r\n console.log(pc.bold('SkillDB Doctor\\n'));\r\n\r\n // Check .skilldb/ exists\r\n const skilldbDir = path.join(cwd, SKILLDB_DIR);\r\n if (!fs.existsSync(skilldbDir)) {\r\n console.log(pc.red(' [!] .skilldb/ not found. Run \"skilldb init\" first.'));\r\n return;\r\n }\r\n console.log(pc.green(' [ok] .skilldb/ directory exists'));\r\n\r\n // Check installed skills\r\n const installedIds = Object.keys(manifest.installed);\r\n const skillsDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR);\r\n const skillFiles = collectFiles(skillsDir);\r\n console.log(pc.green(` [ok] ${installedIds.length} skills in manifest, ${skillFiles.length} files on disk`));\r\n\r\n // Check for orphaned manifest entries (in manifest but file missing)\r\n let orphaned = 0;\r\n for (const id of installedIds) {\r\n const [pack, file] = id.split('/');\r\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-');\r\n const filePath = path.join(skillsDir, pack, `${name}.md`);\r\n if (!fs.existsSync(filePath)) {\r\n orphaned++;\r\n if (orphaned <= 3) console.log(pc.yellow(` [!] Missing file for manifest entry: ${id}`));\r\n }\r\n }\r\n if (orphaned > 3) console.log(pc.yellow(` [!] ...and ${orphaned - 3} more missing files`));\r\n if (orphaned > 0) issues++;\r\n\r\n // Check active profile\r\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n const activeFiles = collectFiles(activeDir);\r\n if (config.activeProfile) {\r\n console.log(pc.green(` [ok] Active profile: ${config.activeProfile} (${activeFiles.length} skills)`));\r\n } else {\r\n console.log(pc.yellow(' [!] No active profile. Run \"skilldb use <profile>\" to set one.'));\r\n issues++;\r\n }\r\n\r\n // Check for unused skills (installed but not in active)\r\n const activeNames = new Set(activeFiles.map(f => f.name));\r\n const unused = skillFiles.filter(f => !activeNames.has(f.name));\r\n if (unused.length > 0 && config.activeProfile) {\r\n console.log(pc.yellow(` [!] ${unused.length} installed skill(s) not in active profile`));\r\n issues++;\r\n }\r\n\r\n // Token/line stats\r\n const totalLines = skillFiles.reduce((sum, f) => sum + f.lines, 0);\r\n const activeLines = activeFiles.reduce((sum, f) => sum + f.lines, 0);\r\n const totalTokens = totalLines * TOKENS_PER_LINE;\r\n const activeTokens = activeLines * TOKENS_PER_LINE;\r\n\r\n console.log(pc.dim('\\n Summary:'));\r\n console.log(` Installed: ${totalLines.toLocaleString()} lines (~${totalTokens.toLocaleString()} tokens)`);\r\n console.log(` Active: ${activeLines.toLocaleString()} lines (~${activeTokens.toLocaleString()} tokens)`);\r\n\r\n // Budget check\r\n if (config.budget) {\r\n const budgetValue = config.budget.unit === 'tokens' ? activeTokens : activeLines;\r\n const pct = Math.round((budgetValue / config.budget.max) * 100);\r\n const color = pct > 100 ? pc.red : pct > 80 ? pc.yellow : pc.green;\r\n console.log(` Budget: ${color(`${pct}%`)} of ${config.budget.max.toLocaleString()} ${config.budget.unit}`);\r\n if (pct > 100) issues++;\r\n }\r\n\r\n // Packs summary\r\n const packs = new Set(installedIds.map(id => id.split('/')[0]));\r\n console.log(` Packs: ${packs.size} installed`);\r\n\r\n console.log(issues === 0\r\n ? pc.green('\\nNo issues found!')\r\n : pc.yellow(`\\n${issues} issue(s) found. Run suggested commands to fix.`)\r\n );\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { SkillDBClient } from '../client.js';\r\nimport { readManifest, cacheSkill } from '../cache.js';\r\n\r\nconst SKILLDB_DIR = '.skilldb';\r\nconst SKILLS_DIR = 'skills';\r\n\r\nexport async function updateCommand(pack?: string): Promise<void> {\r\n const cwd = process.cwd();\r\n const client = new SkillDBClient();\r\n const manifest = readManifest(cwd);\r\n const installedIds = Object.keys(manifest.installed);\r\n\r\n if (installedIds.length === 0) {\r\n console.log(pc.yellow('No skills installed. Use \"skilldb add <pack>\" first.'));\r\n return;\r\n }\r\n\r\n // Filter by pack if specified\r\n const targetIds = pack\r\n ? installedIds.filter(id => id.startsWith(pack + '/'))\r\n : installedIds;\r\n\r\n if (targetIds.length === 0) {\r\n console.error(pc.red(`No installed skills found for pack \"${pack}\".`));\r\n process.exit(1);\r\n }\r\n\r\n console.log(pc.bold(`Updating ${targetIds.length} skill(s)...\\n`));\r\n\r\n // Group by pack for efficient fetching\r\n const packGroups = new Map<string, string[]>();\r\n for (const id of targetIds) {\r\n const p = id.split('/')[0];\r\n if (!packGroups.has(p)) packGroups.set(p, []);\r\n packGroups.get(p)!.push(id);\r\n }\r\n\r\n let updated = 0;\r\n let unchanged = 0;\r\n let failed = 0;\r\n\r\n for (const [packName, ids] of packGroups) {\r\n try {\r\n const res = await client.list({ pack: packName, limit: 500, includeContent: true });\r\n const remoteMap = new Map(res.skills.map(s => [s.id, s]));\r\n\r\n for (const id of ids) {\r\n const remote = remoteMap.get(id);\r\n if (!remote) {\r\n console.log(pc.dim(` skip ${id} (not found on remote)`));\r\n continue;\r\n }\r\n\r\n // Compare content\r\n const localPath = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, packName,\r\n id.split('/')[1].replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-') + '.md');\r\n\r\n let localContent = '';\r\n try { localContent = fs.readFileSync(localPath, 'utf-8'); } catch { /* missing */ }\r\n\r\n if (remote.content && remote.content !== localContent) {\r\n const oldLines = localContent.split('\\n').length;\r\n const newLines = remote.content.split('\\n').length;\r\n const diff = newLines - oldLines;\r\n const diffStr = diff > 0 ? `+${diff}` : `${diff}`;\r\n\r\n cacheSkill(remote, cwd);\r\n updated++;\r\n console.log(\r\n pc.green(` update ${id}`) +\r\n pc.dim(` (${diffStr} lines)`)\r\n );\r\n } else {\r\n unchanged++;\r\n }\r\n }\r\n } catch (err) {\r\n failed += ids.length;\r\n console.log(pc.red(` fail ${packName}: ${(err as Error).message}`));\r\n }\r\n }\r\n\r\n console.log(\r\n `\\n${pc.green(`${updated} updated`)}` +\r\n pc.dim(`, ${unchanged} unchanged`) +\r\n (failed > 0 ? pc.red(`, ${failed} failed`) : '')\r\n );\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { readManifest, writeManifest } from '../cache.js';\r\n\r\nconst SKILLDB_DIR = '.skilldb';\r\nconst SKILLS_DIR = 'skills';\r\nconst ACTIVE_DIR = 'active';\r\n\r\nfunction collectActiveSkills(cwd: string): Set<string> {\r\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n const result = new Set<string>();\r\n if (!fs.existsSync(activeDir)) return result;\r\n\r\n for (const pack of fs.readdirSync(activeDir, { withFileTypes: true })) {\r\n if (!pack.isDirectory()) continue;\r\n for (const file of fs.readdirSync(path.join(activeDir, pack.name))) {\r\n if (file.endsWith('.md')) {\r\n result.add(`${pack.name}/${file}`);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction removeSkillFile(cwd: string, id: string): boolean {\r\n const [pack, file] = id.split('/');\r\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-');\r\n const filePath = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, pack, `${name}.md`);\r\n\r\n if (fs.existsSync(filePath)) {\r\n fs.unlinkSync(filePath);\r\n // Clean up empty pack directory\r\n const packDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, pack);\r\n if (fs.existsSync(packDir) && fs.readdirSync(packDir).length === 0) {\r\n fs.rmdirSync(packDir);\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport async function removeCommand(target: string, options: { unused?: boolean }): Promise<void> {\r\n const cwd = process.cwd();\r\n const manifest = readManifest(cwd);\r\n\r\n if (options.unused) {\r\n const activeSkills = collectActiveSkills(cwd);\r\n const installedIds = Object.keys(manifest.installed);\r\n let removed = 0;\r\n\r\n for (const id of installedIds) {\r\n const [pack, file] = id.split('/');\r\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-') + '.md';\r\n const key = `${pack}/${name}`;\r\n\r\n if (!activeSkills.has(key)) {\r\n removeSkillFile(cwd, id);\r\n delete manifest.installed[id];\r\n removed++;\r\n console.log(pc.yellow(` remove ${id}`));\r\n }\r\n }\r\n\r\n writeManifest(manifest, cwd);\r\n console.log(removed > 0\r\n ? pc.green(`\\n${removed} unused skill(s) removed.`)\r\n : pc.dim('No unused skills found.')\r\n );\r\n return;\r\n }\r\n\r\n // Normalize target\r\n if (!target.includes('/')) {\r\n // Remove entire pack\r\n const packIds = Object.keys(manifest.installed).filter(id => id.startsWith(target + '/'));\r\n\r\n if (packIds.length === 0) {\r\n console.error(pc.red(`No installed skills found for \"${target}\".`));\r\n process.exit(1);\r\n }\r\n\r\n const activeSkills = collectActiveSkills(cwd);\r\n let activeWarning = false;\r\n\r\n for (const id of packIds) {\r\n const [pack, file] = id.split('/');\r\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-') + '.md';\r\n if (activeSkills.has(`${pack}/${name}`)) activeWarning = true;\r\n\r\n removeSkillFile(cwd, id);\r\n delete manifest.installed[id];\r\n console.log(pc.yellow(` remove ${id}`));\r\n }\r\n\r\n writeManifest(manifest, cwd);\r\n console.log(pc.green(`\\n${packIds.length} skill(s) from \"${target}\" removed.`));\r\n if (activeWarning) {\r\n console.log(pc.yellow('Warning: Some removed skills were in your active profile.'));\r\n console.log(pc.yellow('Run \"skilldb use <profile>\" to refresh.'));\r\n }\r\n return;\r\n }\r\n\r\n // Remove single skill\r\n let id = target;\r\n if (!id.includes('.md')) id = id + '.md';\r\n\r\n if (!(id in manifest.installed)) {\r\n console.error(pc.red(`Skill \"${id}\" is not installed.`));\r\n process.exit(1);\r\n }\r\n\r\n const activeSkills = collectActiveSkills(cwd);\r\n const [pack, file] = id.split('/');\r\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-') + '.md';\r\n\r\n removeSkillFile(cwd, id);\r\n delete manifest.installed[id];\r\n writeManifest(manifest, cwd);\r\n\r\n console.log(pc.green(`Removed ${id}`));\r\n if (activeSkills.has(`${pack}/${name}`)) {\r\n console.log(pc.yellow('Warning: This skill was in your active profile. Run \"skilldb use <profile>\" to refresh.'));\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { readManifest, getCachedPath } from '../cache.js';\r\n\r\nconst SKILLDB_DIR = '.skilldb';\r\nconst ACTIVE_DIR = 'active';\r\nconst CONFIG_FILE = 'config.json';\r\n\r\ninterface Config {\r\n activeProfile?: string;\r\n budget?: { max: number; unit: string };\r\n}\r\n\r\nfunction readConfig(cwd: string): Config {\r\n const p = path.join(cwd, SKILLDB_DIR, CONFIG_FILE);\r\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return {}; }\r\n}\r\n\r\nfunction collectActiveSkills(cwd: string): { pack: string; name: string; path: string }[] {\r\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n const result: { pack: string; name: string; path: string }[] = [];\r\n if (!fs.existsSync(activeDir)) return result;\r\n\r\n for (const pack of fs.readdirSync(activeDir, { withFileTypes: true })) {\r\n if (!pack.isDirectory()) continue;\r\n for (const file of fs.readdirSync(path.join(activeDir, pack.name))) {\r\n if (file.endsWith('.md')) {\r\n result.push({\r\n pack: pack.name,\r\n name: file.replace('.md', ''),\r\n path: path.join(activeDir, pack.name, file),\r\n });\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction exportClaude(cwd: string): void {\r\n const skills = collectActiveSkills(cwd);\r\n if (skills.length === 0) {\r\n console.error(pc.red('No active skills. Run \"skilldb use <profile>\" first.'));\r\n process.exit(1);\r\n }\r\n\r\n const lines = ['<!-- skilldb:start -->', '## SkillDB Active Skills\\n'];\r\n lines.push('Reference these skills from `.skilldb/active/` when working on tasks:\\n');\r\n for (const s of skills) {\r\n lines.push(`- \\`.skilldb/active/${s.pack}/${s.name}.md\\``);\r\n }\r\n lines.push('', '<!-- skilldb:end -->');\r\n\r\n const output = lines.join('\\n');\r\n console.log(output);\r\n console.log(pc.dim('\\n--- Copy the above into your CLAUDE.md ---'));\r\n}\r\n\r\nfunction exportCursor(cwd: string): void {\r\n const skills = collectActiveSkills(cwd);\r\n if (skills.length === 0) {\r\n console.error(pc.red('No active skills. Run \"skilldb use <profile>\" first.'));\r\n process.exit(1);\r\n }\r\n\r\n const lines = ['# SkillDB Active Skills', ''];\r\n lines.push('Reference these skills from `.skilldb/active/` when working on tasks:', '');\r\n for (const s of skills) {\r\n lines.push(`@file .skilldb/active/${s.pack}/${s.name}.md`);\r\n }\r\n\r\n const output = lines.join('\\n');\r\n console.log(output);\r\n console.log(pc.dim('\\n--- Copy the above into your .cursorrules ---'));\r\n}\r\n\r\nfunction exportProfile(cwd: string): void {\r\n const config = readConfig(cwd);\r\n const manifest = readManifest(cwd);\r\n\r\n const profile = {\r\n profile: config.activeProfile || 'custom',\r\n budget: config.budget || null,\r\n skills: Object.keys(manifest.installed),\r\n exportedAt: new Date().toISOString(),\r\n };\r\n\r\n const filename = '.skilldb-profile.json';\r\n fs.writeFileSync(path.join(cwd, filename), JSON.stringify(profile, null, 2) + '\\n');\r\n console.log(pc.green(`Exported profile to ${filename}`));\r\n console.log(pc.dim('Share this file and import with \"skilldb use --import .skilldb-profile.json\"'));\r\n}\r\n\r\nfunction exportInject(cwd: string, id: string): void {\r\n if (!id.includes('.md')) id = id + '.md';\r\n\r\n const cachedPath = getCachedPath(id, cwd);\r\n if (!cachedPath) {\r\n console.error(pc.red(`Skill \"${id}\" not found locally. Run \"skilldb get ${id}\" first.`));\r\n process.exit(1);\r\n }\r\n\r\n const content = fs.readFileSync(cachedPath, 'utf-8');\r\n process.stdout.write(content);\r\n}\r\n\r\nexport async function exportCommand(format: string, target?: string): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n switch (format) {\r\n case 'claude':\r\n exportClaude(cwd);\r\n break;\r\n case 'cursor':\r\n exportCursor(cwd);\r\n break;\r\n case 'profile':\r\n exportProfile(cwd);\r\n break;\r\n case 'inject':\r\n if (!target) {\r\n console.error(pc.red('Usage: skilldb export inject <skill-id>'));\r\n process.exit(1);\r\n }\r\n exportInject(cwd, target);\r\n break;\r\n default:\r\n console.error(pc.red(`Unknown format \"${format}\". Use: claude, cursor, profile, inject`));\r\n process.exit(1);\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { readManifest } from '../cache.js';\r\n\r\nconst SKILLDB_DIR = '.skilldb';\r\nconst SKILLS_DIR = 'skills';\r\nconst ACTIVE_DIR = 'active';\r\nconst CONFIG_FILE = 'config.json';\r\nconst TOKENS_PER_LINE = 10;\r\n\r\ninterface Config {\r\n activeProfile?: string;\r\n budget?: { max: number; unit: string };\r\n}\r\n\r\nfunction readConfig(cwd: string): Config {\r\n const p = path.join(cwd, SKILLDB_DIR, CONFIG_FILE);\r\n try { return JSON.parse(fs.readFileSync(p, 'utf-8')); } catch { return {}; }\r\n}\r\n\r\nfunction countDir(dir: string): { files: number; lines: number; packs: Set<string>; categories: Set<string> } {\r\n const result = { files: 0, lines: 0, packs: new Set<string>(), categories: new Set<string>() };\r\n if (!fs.existsSync(dir)) return result;\r\n\r\n for (const pack of fs.readdirSync(dir, { withFileTypes: true })) {\r\n if (!pack.isDirectory()) continue;\r\n result.packs.add(pack.name);\r\n // Derive category from pack name suffix\r\n const cat = pack.name.replace(/-skills$/, '');\r\n result.categories.add(cat);\r\n\r\n for (const file of fs.readdirSync(path.join(dir, pack.name))) {\r\n if (!file.endsWith('.md')) continue;\r\n result.files++;\r\n result.lines += fs.readFileSync(path.join(dir, pack.name, file), 'utf-8').split('\\n').length;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport async function statsCommand(): Promise<void> {\r\n const cwd = process.cwd();\r\n const config = readConfig(cwd);\r\n const manifest = readManifest(cwd);\r\n\r\n const skillsDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR);\r\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n\r\n const installed = countDir(skillsDir);\r\n const active = countDir(activeDir);\r\n\r\n console.log(pc.bold('SkillDB Stats\\n'));\r\n\r\n // Installed\r\n console.log(pc.cyan('Installed:'));\r\n console.log(` Skills: ${installed.files}`);\r\n console.log(` Packs: ${installed.packs.size}` + (installed.packs.size > 0 ? pc.dim(` (${[...installed.packs].join(', ')})`) : ''));\r\n console.log(` Lines: ${installed.lines.toLocaleString()}`);\r\n console.log(` Est tokens: ${(installed.lines * TOKENS_PER_LINE).toLocaleString()}`);\r\n\r\n // Active\r\n console.log(pc.cyan('\\nActive:'));\r\n if (config.activeProfile) {\r\n console.log(` Profile: ${config.activeProfile}`);\r\n } else {\r\n console.log(` Profile: ${pc.dim('none')}`);\r\n }\r\n console.log(` Skills: ${active.files}`);\r\n console.log(` Lines: ${active.lines.toLocaleString()}`);\r\n console.log(` Est tokens: ${(active.lines * TOKENS_PER_LINE).toLocaleString()}`);\r\n\r\n // Budget\r\n if (config.budget) {\r\n const budgetValue = config.budget.unit === 'tokens'\r\n ? active.lines * TOKENS_PER_LINE\r\n : active.lines;\r\n const pct = Math.round((budgetValue / config.budget.max) * 100);\r\n const color = pct > 100 ? pc.red : pct > 80 ? pc.yellow : pc.green;\r\n console.log(pc.cyan('\\nBudget:'));\r\n console.log(` Limit: ${config.budget.max.toLocaleString()} ${config.budget.unit}`);\r\n console.log(` Usage: ${color(`${pct}%`)}`);\r\n }\r\n\r\n // Coverage\r\n console.log(pc.cyan('\\nCoverage:'));\r\n console.log(` Categories: ${installed.categories.size} covered`);\r\n\r\n // Gap analysis\r\n const manifestPacks = new Set(Object.keys(manifest.installed).map(id => id.split('/')[0]));\r\n const activePacks = active.packs;\r\n const unusedPacks = [...manifestPacks].filter(p => !activePacks.has(p));\r\n if (unusedPacks.length > 0) {\r\n console.log(pc.yellow(`\\n Installed but not active: ${unusedPacks.join(', ')}`));\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\nimport { SkillDBClient } from '../client.js';\r\nimport { readManifest } from '../cache.js';\r\n\r\nconst SKILLDB_DIR = '.skilldb';\r\nconst SKILLS_DIR = 'skills';\r\n\r\nfunction diffLines(local: string, remote: string): { added: number; removed: number; changed: boolean } {\r\n const localLines = local.split('\\n');\r\n const remoteLines = remote.split('\\n');\r\n let added = 0;\r\n let removed = 0;\r\n\r\n const localSet = new Set(localLines);\r\n const remoteSet = new Set(remoteLines);\r\n\r\n for (const line of remoteLines) {\r\n if (!localSet.has(line)) added++;\r\n }\r\n for (const line of localLines) {\r\n if (!remoteSet.has(line)) removed++;\r\n }\r\n\r\n return { added, removed, changed: added > 0 || removed > 0 };\r\n}\r\n\r\nfunction showDiff(id: string, local: string, remote: string): void {\r\n const result = diffLines(local, remote);\r\n\r\n if (!result.changed) {\r\n console.log(pc.dim(` ${id}: up to date`));\r\n return;\r\n }\r\n\r\n console.log(pc.bold(` ${id}:`));\r\n if (result.added > 0) console.log(pc.green(` +${result.added} lines added`));\r\n if (result.removed > 0) console.log(pc.red(` -${result.removed} lines removed`));\r\n\r\n // Show first few changed lines\r\n const localLines = local.split('\\n');\r\n const remoteLines = remote.split('\\n');\r\n const localSet = new Set(localLines);\r\n const remoteSet = new Set(remoteLines);\r\n let shown = 0;\r\n\r\n for (const line of remoteLines) {\r\n if (!localSet.has(line) && line.trim()) {\r\n console.log(pc.green(` + ${line.slice(0, 80)}`));\r\n if (++shown >= 3) break;\r\n }\r\n }\r\n shown = 0;\r\n for (const line of localLines) {\r\n if (!remoteSet.has(line) && line.trim()) {\r\n console.log(pc.red(` - ${line.slice(0, 80)}`));\r\n if (++shown >= 3) break;\r\n }\r\n }\r\n}\r\n\r\nexport async function diffCommand(target?: string): Promise<void> {\r\n const cwd = process.cwd();\r\n const client = new SkillDBClient();\r\n const manifest = readManifest(cwd);\r\n const installedIds = Object.keys(manifest.installed);\r\n\r\n if (installedIds.length === 0) {\r\n console.log(pc.yellow('No skills installed.'));\r\n return;\r\n }\r\n\r\n // Single skill diff\r\n if (target) {\r\n let id = target;\r\n if (!id.includes('.md')) id = id + '.md';\r\n\r\n const [pack, file] = id.split('/');\r\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-');\r\n const localPath = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, pack, `${name}.md`);\r\n\r\n if (!fs.existsSync(localPath)) {\r\n console.error(pc.red(`Skill \"${id}\" not found locally.`));\r\n process.exit(1);\r\n }\r\n\r\n console.log(pc.bold('Comparing with remote...\\n'));\r\n\r\n try {\r\n const remote = await client.get(id);\r\n const localContent = fs.readFileSync(localPath, 'utf-8');\r\n\r\n if (!remote.content) {\r\n console.log(pc.yellow('Remote content not available (API key required).'));\r\n return;\r\n }\r\n\r\n showDiff(id, localContent, remote.content);\r\n } catch (err) {\r\n console.error(pc.red(`Error: ${(err as Error).message}`));\r\n process.exit(1);\r\n }\r\n return;\r\n }\r\n\r\n // Diff all installed\r\n console.log(pc.bold(`Comparing ${installedIds.length} skill(s) with remote...\\n`));\r\n\r\n const packGroups = new Map<string, string[]>();\r\n for (const id of installedIds) {\r\n const p = id.split('/')[0];\r\n if (!packGroups.has(p)) packGroups.set(p, []);\r\n packGroups.get(p)!.push(id);\r\n }\r\n\r\n let changed = 0;\r\n let upToDate = 0;\r\n\r\n for (const [packName, ids] of packGroups) {\r\n try {\r\n const res = await client.list({ pack: packName, limit: 500, includeContent: true });\r\n const remoteMap = new Map(res.skills.map(s => [s.id, s]));\r\n\r\n for (const id of ids) {\r\n const remote = remoteMap.get(id);\r\n if (!remote?.content) continue;\r\n\r\n const [pack, file] = id.split('/');\r\n const name = file.replace('.md', '').replace(/[/\\\\:*?\"<>|]/g, '-');\r\n const localPath = path.join(cwd, SKILLDB_DIR, SKILLS_DIR, pack, `${name}.md`);\r\n\r\n let localContent = '';\r\n try { localContent = fs.readFileSync(localPath, 'utf-8'); } catch { continue; }\r\n\r\n const result = diffLines(localContent, remote.content);\r\n if (result.changed) {\r\n showDiff(id, localContent, remote.content);\r\n changed++;\r\n } else {\r\n upToDate++;\r\n }\r\n }\r\n } catch (err) {\r\n console.log(pc.red(` Error fetching ${packName}: ${(err as Error).message}`));\r\n }\r\n }\r\n\r\n console.log(`\\n${pc.green(`${upToDate} up to date`)}` +\r\n (changed > 0 ? pc.yellow(`, ${changed} changed`) : ''));\r\n if (changed > 0) {\r\n console.log(pc.dim('Run \"skilldb update\" to pull latest versions.'));\r\n }\r\n}\r\n"],"mappings":"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","names":["pc","pc","pad","truncate","pc","fs","path","path","fs","pc","pc","pc","pc","pc","fs","path","pc","fs","path","pc","pc","readline","prompt","pc","fs","path","pc","SKILLDB_DIR","fs","path","pc","SKILLDB_DIR","CONFIG_FILE","ACTIVE_DIR","readConfig","writeConfig","walk","fs","path","pc","SKILLDB_DIR","ACTIVE_DIR","SKILLS_DIR","ensureDir","fs","path","pc","fs","path","pc","fs","path","pc","SKILLDB_DIR","SKILLS_DIR","ACTIVE_DIR","CONFIG_FILE","TOKENS_PER_LINE","readConfig","path","fs","pc","fs","path","pc","SKILLDB_DIR","SKILLS_DIR","pc","path","fs","fs","path","pc","SKILLDB_DIR","SKILLS_DIR","ACTIVE_DIR","path","fs","activeSkills","id","pack","file","name","pc","fs","path","pc","SKILLDB_DIR","ACTIVE_DIR","CONFIG_FILE","readConfig","path","fs","collectActiveSkills","pc","fs","path","pc","SKILLDB_DIR","SKILLS_DIR","ACTIVE_DIR","CONFIG_FILE","TOKENS_PER_LINE","readConfig","path","fs","pc","fs","path","pc","SKILLDB_DIR","SKILLS_DIR","pc","path","fs"]}