skilldb 0.5.2 → 0.6.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 +13 -7
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +12 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +129 -6
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
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","../src/commands/purge.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\nimport { purgeCommand } from './commands/purge.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, choose install mode)')\r\n .option('-t, --target <mode>', 'Install mode: mcp, skills-dir, claude-md, hybrid')\r\n .action((opts: { target?: string }) => initCommand(opts));\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 skills (use --target to choose where)')\r\n .option('-t, --target <mode>', 'Where to install: cache (default), skills-dir, hybrid')\r\n .action((pack: string, opts: { target?: string }) => addCommand(pack, opts));\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\r\n .command('purge')\r\n .description('Remove cached skills to free disk space')\r\n .option('-a, --all', 'Remove ALL cached skills (including active)')\r\n .option('-i, --inactive', 'Remove only inactive skills')\r\n .option('-s, --slim', 'Also remove slim summaries')\r\n .option('-n, --dry-run', 'Show what would be removed without deleting')\r\n .option('-f, --force', 'Skip confirmation prompt')\r\n .action((opts: { all?: boolean; inactive?: boolean; slim?: boolean; dryRun?: boolean; force?: boolean }) => {\r\n purgeCommand(opts);\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 fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\nimport { initCache, cacheSkill, isCached } from '../cache.js';\n\nfunction getConfig(): Record<string, unknown> {\n try {\n return JSON.parse(fs.readFileSync(path.join(process.cwd(), '.skilldb', 'config.json'), 'utf-8'));\n } catch { return {}; }\n}\n\nfunction getSkillsDir(): string | null {\n const config = getConfig();\n const dir = config.skillsDir as string | undefined;\n if (dir && fs.existsSync(path.dirname(dir))) return dir;\n\n // Auto-detect\n const cwd = process.cwd();\n if (fs.existsSync(path.join(cwd, '.claude'))) return path.join(cwd, '.claude', 'skills', 'skilldb');\n if (fs.existsSync(path.join(cwd, '.cursor'))) return path.join(cwd, '.cursor', 'rules', 'skilldb');\n if (fs.existsSync(path.join(cwd, '.codex'))) return path.join(cwd, '.codex', 'skills', 'skilldb');\n return null;\n}\n\nexport async function addCommand(packName: string, options?: { target?: string }): Promise<void> {\n const client = new SkillDBClient();\n const target = options?.target || getConfig().installMode as string || 'cache';\n\n console.log(pc.bold(`Adding pack: ${packName}`));\n\n // Determine where to install\n const useSkillsDir = target === 'skills-dir' || target === 'hybrid';\n const skillsDir = useSkillsDir ? getSkillsDir() : null;\n\n if (useSkillsDir && !skillsDir) {\n console.error(pc.red('No IDE skills directory found. Run \"skilldb init\" first.'));\n process.exit(1);\n }\n\n if (useSkillsDir && skillsDir) {\n console.log(`Target: ${pc.cyan(skillsDir)} ${pc.dim('(IDE auto-loads these)')}`);\n } else {\n console.log(`Target: ${pc.dim('.skilldb/skills/ (cache)')}`);\n }\n\n initCache();\n\n try {\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 // Always cache\n if (!isCached(skill.id)) {\n cacheSkill(skill);\n }\n\n // Also install to IDE skills directory if requested\n if (useSkillsDir && skillsDir && skill.content) {\n const packDir = path.join(skillsDir, skill.pack);\n fs.mkdirSync(packDir, { recursive: true });\n const skillFile = path.join(packDir, skill.name + '.md');\n\n if (fs.existsSync(skillFile)) {\n skipped++;\n console.log(pc.dim(` skip ${skill.id} (already installed)`));\n } else {\n fs.writeFileSync(skillFile, skill.content);\n added++;\n console.log(pc.green(` add ${skill.id}`) + pc.dim(` → ${path.relative(process.cwd(), skillFile)}`));\n }\n } else if (!useSkillsDir) {\n if (isCached(skill.id)) {\n skipped++;\n console.log(pc.dim(` skip ${skill.id} (already cached)`));\n } else {\n added++;\n console.log(pc.green(` add ${skill.id}`));\n }\n }\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 (useSkillsDir && skillsDir) {\n console.log(pc.dim(`\\nSkills installed to ${path.relative(process.cwd(), skillsDir)}`));\n console.log(pc.dim('Your IDE will auto-load them — no CLAUDE.md changes needed.'));\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';\ntype InstallMode = 'mcp' | 'skills-dir' | 'claude-md' | 'hybrid';\n\ninterface Detection {\n ide: IDE;\n label: string;\n skillsDir: string; // IDE-native skills directory\n configFile: string; // CLAUDE.md / .cursorrules / codex.md\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 if (fs.existsSync(path.join(cwd, 'CLAUDE.md')) || fs.existsSync(path.join(cwd, '.claude'))) {\n return {\n ide: 'claude-code', label: 'Claude Code',\n skillsDir: path.join(cwd, '.claude', 'skills', 'skilldb'),\n configFile: path.join(cwd, 'CLAUDE.md'),\n };\n }\n if (fs.existsSync(path.join(cwd, '.cursor')) || fs.existsSync(path.join(cwd, '.cursorrules'))) {\n return {\n ide: 'cursor', label: 'Cursor',\n skillsDir: path.join(cwd, '.cursor', 'rules', 'skilldb'),\n configFile: fs.existsSync(path.join(cwd, '.cursorrules'))\n ? path.join(cwd, '.cursorrules')\n : path.join(cwd, '.cursor', 'rules', 'skilldb.md'),\n };\n }\n if (fs.existsSync(path.join(cwd, 'codex.md')) || fs.existsSync(path.join(cwd, '.codex'))) {\n return {\n ide: 'codex', label: 'Codex CLI',\n skillsDir: path.join(cwd, '.codex', 'skills', 'skilldb'),\n configFile: path.join(cwd, 'codex.md'),\n };\n }\n return null;\n}\n\nconst IDE_SKILLS_DIRS: Record<IDE, string> = {\n 'claude-code': '.claude/skills/skilldb',\n 'cursor': '.cursor/rules/skilldb',\n 'codex': '.codex/skills/skilldb',\n};\n\nexport async function initCommand(options?: { target?: string }): 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) { console.log(pc.red('Invalid choice.')); process.exit(1); }\n\n detection = {\n ide, label: ide === 'claude-code' ? 'Claude Code' : ide === 'cursor' ? 'Cursor' : 'Codex CLI',\n skillsDir: path.join(cwd, IDE_SKILLS_DIRS[ide]),\n configFile: path.join(cwd, ide === 'claude-code' ? 'CLAUDE.md' : ide === 'cursor' ? '.cursorrules' : 'codex.md'),\n };\n }\n\n // Choose install mode\n const targetArg = options?.target;\n let mode: InstallMode;\n\n if (targetArg === 'mcp') mode = 'mcp';\n else if (targetArg === 'skills-dir') mode = 'skills-dir';\n else if (targetArg === 'claude-md' || targetArg === 'config') mode = 'claude-md';\n else {\n console.log(`\\nWhere should skills be loaded from?\\n`);\n console.log(` 1) ${pc.cyan('MCP Server')} ${pc.dim('— agent fetches on demand, nothing added to files (recommended)')}`);\n console.log(` 2) ${pc.cyan('Skills directory')} ${pc.dim(`— installed to ${IDE_SKILLS_DIRS[detection.ide]}, auto-loaded by IDE`)}`);\n console.log(` 3) ${pc.cyan('Hybrid')} ${pc.dim('— MCP for search + skills dir for always-on core skills')}`);\n console.log(` 4) ${pc.cyan(path.basename(detection.configFile))} ${pc.dim('— append to config file (legacy, can bloat)')}`);\n const modeChoice = await prompt('\\nChoice (1-4): ');\n mode = { '1': 'mcp' as const, '2': 'skills-dir' as const, '3': 'hybrid' as const, '4': 'claude-md' as const }[modeChoice] || 'hybrid';\n }\n\n // Create .skilldb/ cache directory\n const cacheDir = initCache(cwd);\n console.log(`\\nCreated ${pc.dim(cacheDir)}`);\n\n // Update .gitignore\n updateGitignore(cwd);\n\n // ─── Mode: MCP ───\n if (mode === 'mcp' || mode === 'hybrid') {\n console.log(`\\n${pc.cyan('MCP Server setup:')}`);\n console.log(` Install globally: ${pc.dim('npm install -g skilldb')}`);\n\n if (detection.ide === 'claude-code') {\n console.log(` Add to Claude: ${pc.dim('claude mcp add skilldb -- skilldb-mcp')}`);\n } else if (detection.ide === 'cursor') {\n console.log(` Add to Cursor: ${pc.dim('Add to .cursor/mcp.json:')}`);\n console.log(pc.dim(` { \"mcpServers\": { \"skilldb\": { \"command\": \"skilldb-mcp\" } } }`));\n } else {\n console.log(` Run: ${pc.dim('skilldb-mcp')}`);\n }\n\n // Add minimal reference to config file\n const marker = '<!-- skilldb:start -->';\n const snippet = `\\n\\n${marker}\\n## SkillDB\\nSkills available via MCP server. Use \\`skilldb_search\\` to find skills and \\`skilldb_get\\` to load them.\\n<!-- skilldb:end -->\\n`;\n const configFile = detection.configFile;\n let existing = '';\n if (fs.existsSync(configFile)) existing = fs.readFileSync(configFile, 'utf-8');\n if (!existing.includes('skilldb:start')) {\n fs.mkdirSync(path.dirname(configFile), { recursive: true });\n fs.writeFileSync(configFile, existing + snippet);\n console.log(`\\n Added MCP reference to ${pc.cyan(path.basename(configFile))} ${pc.dim('(2 lines, no bloat)')}`);\n }\n }\n\n // ─── Mode: Skills Directory ───\n if (mode === 'skills-dir' || mode === 'hybrid') {\n const skillsDir = detection.skillsDir;\n fs.mkdirSync(skillsDir, { recursive: true });\n console.log(`\\n${pc.cyan('Skills directory:')} ${pc.dim(skillsDir)}`);\n console.log(` Skills installed here are auto-loaded by ${detection.label}.`);\n console.log(` Add skills: ${pc.dim('skilldb add software-skills --target skills-dir')}`);\n\n // Write a README to the skills dir\n fs.writeFileSync(path.join(skillsDir, 'README.md'), `# SkillDB Skills\\n\\nSkills in this directory are automatically loaded by ${detection.label}.\\n\\nManage with:\\n- \\`skilldb add <pack> --target skills-dir\\`\\n- \\`skilldb remove <pack>\\`\\n- \\`skilldb use <profile>\\`\\n\\nBrowse: https://skilldb.dev\\n`);\n }\n\n // ─── Mode: Config File (legacy) ───\n if (mode === 'claude-md') {\n const marker = '<!-- skilldb:start -->';\n const endMarker = '<!-- skilldb:end -->';\n const content = `\\n## SkillDB Skills\\n\\nLocal skills: \\`.skilldb/skills/\\`. Use as reference for tasks.\\nSearch: \\`skilldb search <query>\\`\\nDownload: \\`skilldb add <pack>\\`\\n`;\n const snippet = `\\n\\n${marker}${content}${endMarker}\\n`;\n const configFile = detection.configFile;\n let existing = '';\n if (fs.existsSync(configFile)) existing = fs.readFileSync(configFile, 'utf-8');\n if (!existing.includes('skilldb:start')) {\n fs.mkdirSync(path.dirname(configFile), { recursive: true });\n fs.writeFileSync(configFile, existing + snippet);\n console.log(`\\nAdded SkillDB snippet to ${pc.cyan(path.basename(configFile))}`);\n }\n console.log(pc.yellow('\\n⚠ Config-file mode can bloat over time. Consider --target mcp or --target skills-dir.'));\n }\n\n // Save mode preference\n const configPath = path.join(cwd, '.skilldb', 'config.json');\n let config: Record<string, unknown> = {};\n try { config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch {}\n config.installMode = mode;\n config.ide = detection.ide;\n config.skillsDir = detection.skillsDir;\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2));\n\n console.log(pc.green('\\n✓ Done! Next steps:'));\n if (mode === 'mcp' || mode === 'hybrid') {\n console.log(` ${pc.dim('$')} npm install -g skilldb`);\n if (detection.ide === 'claude-code') {\n console.log(` ${pc.dim('$')} claude mcp add skilldb -- skilldb-mcp`);\n }\n console.log(` Then ask your agent: ${pc.dim('\"Search SkillDB for code review skills\"')}`);\n }\n if (mode === 'skills-dir' || mode === 'hybrid') {\n console.log(` ${pc.dim('$')} skilldb add software-skills --target skills-dir`);\n }\n if (mode === 'claude-md') {\n console.log(` ${pc.dim('$')} skilldb add software-skills`);\n }\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","import fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport readline from 'node:readline';\nimport { readManifest, writeManifest } from '../cache.js';\n\nconst SKILLDB_DIR = '.skilldb';\nconst SKILLS_DIR = 'skills';\nconst ACTIVE_DIR = 'active';\nconst SLIM_DIR = 'slim';\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 => { rl.close(); resolve(answer.trim()); });\n });\n}\n\ninterface PurgeStats {\n skillsRemoved: number;\n packsRemoved: number;\n slimRemoved: number;\n bytesFreed: number;\n activeKept: number;\n}\n\nfunction getDirectorySize(dir: string): number {\n if (!fs.existsSync(dir)) return 0;\n let size = 0;\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) size += getDirectorySize(full);\n else size += fs.statSync(full).size;\n }\n return size;\n}\n\nfunction collectAllSkills(dir: string): string[] {\n const skills: string[] = [];\n if (!fs.existsSync(dir)) return skills;\n for (const pack of fs.readdirSync(dir, { withFileTypes: true })) {\n if (!pack.isDirectory()) continue;\n for (const file of fs.readdirSync(path.join(dir, pack.name))) {\n if (file.endsWith('.md')) skills.push(`${pack.name}/${file}`);\n }\n }\n return skills;\n}\n\nfunction collectActivePacks(cwd: string): Set<string> {\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n const packs = new Set<string>();\n if (!fs.existsSync(activeDir)) return packs;\n for (const entry of fs.readdirSync(activeDir, { withFileTypes: true })) {\n if (entry.isDirectory()) packs.add(entry.name);\n }\n return packs;\n}\n\nexport async function purgeCommand(options?: {\n all?: boolean;\n inactive?: boolean;\n slim?: boolean;\n dryRun?: boolean;\n force?: boolean;\n}): Promise<void> {\n const cwd = process.cwd();\n const skillsDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR);\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\n const slimDir = path.join(cwd, SKILLDB_DIR, SLIM_DIR);\n\n if (!fs.existsSync(path.join(cwd, SKILLDB_DIR))) {\n console.log(pc.red('No .skilldb/ directory found. Run \"skilldb init\" first.'));\n process.exit(1);\n }\n\n const allSkills = collectAllSkills(skillsDir);\n const activePacks = collectActivePacks(cwd);\n const activeSkills = new Set<string>();\n\n // Collect active skill IDs\n if (fs.existsSync(activeDir)) {\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')) activeSkills.add(`${pack.name}/${file}`);\n }\n }\n }\n\n const inactiveSkills = allSkills.filter(s => !activeSkills.has(s));\n const slimSkills = collectAllSkills(slimDir);\n\n const totalSize = getDirectorySize(path.join(cwd, SKILLDB_DIR));\n const skillsSize = getDirectorySize(skillsDir);\n const slimSize = getDirectorySize(slimDir);\n\n console.log(pc.bold('\\nSkillDB Purge\\n'));\n console.log(` Total skills cached: ${pc.cyan(String(allSkills.length))}`);\n console.log(` Active skills: ${pc.green(String(activeSkills.size))}`);\n console.log(` Inactive skills: ${pc.yellow(String(inactiveSkills.length))}`);\n console.log(` Slim summaries: ${pc.dim(String(slimSkills.length))}`);\n console.log(` Total disk usage: ${pc.cyan((totalSize / 1024).toFixed(0) + ' KB')}`);\n console.log();\n\n if (allSkills.length === 0 && slimSkills.length === 0) {\n console.log(pc.dim('Nothing to purge.'));\n return;\n }\n\n const stats: PurgeStats = { skillsRemoved: 0, packsRemoved: 0, slimRemoved: 0, bytesFreed: 0, activeKept: activeSkills.size };\n\n // Determine what to purge\n let toPurge: string[] = [];\n let purgeSlim = options?.slim || options?.all || false;\n\n if (options?.all) {\n toPurge = [...allSkills];\n purgeSlim = true;\n console.log(pc.red(`Will remove ALL ${allSkills.length} cached skills + ${slimSkills.length} slim summaries`));\n } else if (options?.inactive) {\n toPurge = inactiveSkills;\n console.log(pc.yellow(`Will remove ${inactiveSkills.length} inactive skills (keeping ${activeSkills.size} active)`));\n } else {\n // Default: purge inactive + slim\n toPurge = inactiveSkills;\n purgeSlim = true;\n console.log(pc.yellow(`Will remove ${inactiveSkills.length} inactive skills + ${slimSkills.length} slim summaries`));\n console.log(pc.green(` Keeping ${activeSkills.size} active skills`));\n }\n\n if (toPurge.length === 0 && !purgeSlim) {\n console.log(pc.dim('\\nNothing to purge — all skills are active.'));\n return;\n }\n\n // Confirm\n if (!options?.force && !options?.dryRun) {\n const answer = await prompt(`\\n Continue? (y/N) `);\n if (answer.toLowerCase() !== 'y') {\n console.log(pc.dim('Cancelled.'));\n return;\n }\n }\n\n if (options?.dryRun) {\n console.log(pc.dim('\\n (Dry run — no files will be deleted)\\n'));\n for (const skill of toPurge.slice(0, 20)) {\n console.log(pc.dim(` would remove: ${skill}`));\n }\n if (toPurge.length > 20) console.log(pc.dim(` ... and ${toPurge.length - 20} more`));\n return;\n }\n\n // Purge cached skills\n const manifest = readManifest(cwd);\n for (const skillId of toPurge) {\n const [pack, file] = skillId.split('/');\n const filePath = path.join(skillsDir, pack, file);\n if (fs.existsSync(filePath)) {\n stats.bytesFreed += fs.statSync(filePath).size;\n fs.unlinkSync(filePath);\n stats.skillsRemoved++;\n }\n // Remove from manifest\n if (manifest.installed[skillId]) {\n delete manifest.installed[skillId];\n }\n // Clean empty pack dirs\n const packDir = path.join(skillsDir, pack);\n if (fs.existsSync(packDir) && fs.readdirSync(packDir).length === 0) {\n fs.rmdirSync(packDir);\n stats.packsRemoved++;\n }\n }\n\n // Purge slim summaries\n if (purgeSlim && fs.existsSync(slimDir)) {\n for (const pack of fs.readdirSync(slimDir, { withFileTypes: true })) {\n if (!pack.isDirectory()) continue;\n const packPath = path.join(slimDir, pack.name);\n for (const file of fs.readdirSync(packPath)) {\n const filePath = path.join(packPath, file);\n stats.bytesFreed += fs.statSync(filePath).size;\n fs.unlinkSync(filePath);\n stats.slimRemoved++;\n }\n if (fs.readdirSync(packPath).length === 0) fs.rmdirSync(packPath);\n }\n }\n\n // If purging all, also clear active\n if (options?.all && fs.existsSync(activeDir)) {\n for (const pack of fs.readdirSync(activeDir, { withFileTypes: true })) {\n if (!pack.isDirectory()) continue;\n const packPath = path.join(activeDir, pack.name);\n for (const file of fs.readdirSync(packPath)) {\n fs.unlinkSync(path.join(packPath, file));\n }\n fs.rmdirSync(packPath);\n }\n stats.activeKept = 0;\n }\n\n writeManifest(cwd, manifest);\n\n console.log(pc.green(`\\n ✓ Purge complete`));\n console.log(` Skills removed: ${stats.skillsRemoved}`);\n console.log(` Slim removed: ${stats.slimRemoved}`);\n console.log(` Packs cleaned: ${stats.packsRemoved}`);\n console.log(` Space freed: ${(stats.bytesFreed / 1024).toFixed(0)} KB`);\n console.log(` Active kept: ${stats.activeKept}`);\n}\n"],"mappings":"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","names":["pc","pc","pad","truncate","fs","path","pc","fs","path","path","fs","fs","path","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","fs","path","pc","readline","SKILLDB_DIR","SKILLS_DIR","ACTIVE_DIR","SLIM_DIR","prompt","readline","fs","path","pc"]}
|
|
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","../src/commands/purge.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\nimport { purgeCommand } from './commands/purge.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, choose install mode)')\r\n .option('-t, --target <mode>', 'Install mode: mcp, skills-dir, claude-md, hybrid')\r\n .action((opts: { target?: string }) => initCommand(opts));\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 skills (use --target to choose where)')\r\n .option('-t, --target <mode>', 'Where to install: cache (default), skills-dir, hybrid')\r\n .action((pack: string, opts: { target?: string }) => addCommand(pack, opts));\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\r\n .command('purge')\r\n .description('Remove cached skills to free disk space')\r\n .option('-a, --all', 'Remove ALL cached skills (including active)')\r\n .option('-i, --inactive', 'Remove only inactive skills')\r\n .option('-s, --slim', 'Also remove slim summaries')\r\n .option('-n, --dry-run', 'Show what would be removed without deleting')\r\n .option('-f, --force', 'Skip confirmation prompt')\r\n .action((opts: { all?: boolean; inactive?: boolean; slim?: boolean; dryRun?: boolean; force?: boolean }) => {\r\n purgeCommand(opts);\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 /** Make an authenticated request to any endpoint (used by MCP tools for private skills). */\n public async rawRequest(endpoint: string, init?: RequestInit): Promise<Response> {\n const url = `${this.baseUrl}${endpoint}`;\n const headers = { ...this.headers(), ...(init?.headers || {}) };\n return fetch(url, { ...init, headers });\n }\n\n\n private async typedRequest<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.typedRequest<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.typedRequest<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.typedRequest<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.typedRequest<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.typedRequest('/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 fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { SkillDBClient } from '../client.js';\nimport { initCache, cacheSkill, isCached } from '../cache.js';\n\nfunction getConfig(): Record<string, unknown> {\n try {\n return JSON.parse(fs.readFileSync(path.join(process.cwd(), '.skilldb', 'config.json'), 'utf-8'));\n } catch { return {}; }\n}\n\nfunction getSkillsDir(): string | null {\n const config = getConfig();\n const dir = config.skillsDir as string | undefined;\n if (dir && fs.existsSync(path.dirname(dir))) return dir;\n\n // Auto-detect\n const cwd = process.cwd();\n if (fs.existsSync(path.join(cwd, '.claude'))) return path.join(cwd, '.claude', 'skills', 'skilldb');\n if (fs.existsSync(path.join(cwd, '.cursor'))) return path.join(cwd, '.cursor', 'rules', 'skilldb');\n if (fs.existsSync(path.join(cwd, '.codex'))) return path.join(cwd, '.codex', 'skills', 'skilldb');\n return null;\n}\n\nexport async function addCommand(packName: string, options?: { target?: string }): Promise<void> {\n const client = new SkillDBClient();\n const target = options?.target || getConfig().installMode as string || 'cache';\n\n console.log(pc.bold(`Adding pack: ${packName}`));\n\n // Determine where to install\n const useSkillsDir = target === 'skills-dir' || target === 'hybrid';\n const skillsDir = useSkillsDir ? getSkillsDir() : null;\n\n if (useSkillsDir && !skillsDir) {\n console.error(pc.red('No IDE skills directory found. Run \"skilldb init\" first.'));\n process.exit(1);\n }\n\n if (useSkillsDir && skillsDir) {\n console.log(`Target: ${pc.cyan(skillsDir)} ${pc.dim('(IDE auto-loads these)')}`);\n } else {\n console.log(`Target: ${pc.dim('.skilldb/skills/ (cache)')}`);\n }\n\n initCache();\n\n try {\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 // Always cache\n if (!isCached(skill.id)) {\n cacheSkill(skill);\n }\n\n // Also install to IDE skills directory if requested\n if (useSkillsDir && skillsDir && skill.content) {\n const packDir = path.join(skillsDir, skill.pack);\n fs.mkdirSync(packDir, { recursive: true });\n const skillFile = path.join(packDir, skill.name + '.md');\n\n if (fs.existsSync(skillFile)) {\n skipped++;\n console.log(pc.dim(` skip ${skill.id} (already installed)`));\n } else {\n fs.writeFileSync(skillFile, skill.content);\n added++;\n console.log(pc.green(` add ${skill.id}`) + pc.dim(` → ${path.relative(process.cwd(), skillFile)}`));\n }\n } else if (!useSkillsDir) {\n if (isCached(skill.id)) {\n skipped++;\n console.log(pc.dim(` skip ${skill.id} (already cached)`));\n } else {\n added++;\n console.log(pc.green(` add ${skill.id}`));\n }\n }\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 (useSkillsDir && skillsDir) {\n console.log(pc.dim(`\\nSkills installed to ${path.relative(process.cwd(), skillsDir)}`));\n console.log(pc.dim('Your IDE will auto-load them — no CLAUDE.md changes needed.'));\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';\ntype InstallMode = 'mcp' | 'skills-dir' | 'claude-md' | 'hybrid';\n\ninterface Detection {\n ide: IDE;\n label: string;\n skillsDir: string; // IDE-native skills directory\n configFile: string; // CLAUDE.md / .cursorrules / codex.md\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 if (fs.existsSync(path.join(cwd, 'CLAUDE.md')) || fs.existsSync(path.join(cwd, '.claude'))) {\n return {\n ide: 'claude-code', label: 'Claude Code',\n skillsDir: path.join(cwd, '.claude', 'skills', 'skilldb'),\n configFile: path.join(cwd, 'CLAUDE.md'),\n };\n }\n if (fs.existsSync(path.join(cwd, '.cursor')) || fs.existsSync(path.join(cwd, '.cursorrules'))) {\n return {\n ide: 'cursor', label: 'Cursor',\n skillsDir: path.join(cwd, '.cursor', 'rules', 'skilldb'),\n configFile: fs.existsSync(path.join(cwd, '.cursorrules'))\n ? path.join(cwd, '.cursorrules')\n : path.join(cwd, '.cursor', 'rules', 'skilldb.md'),\n };\n }\n if (fs.existsSync(path.join(cwd, 'codex.md')) || fs.existsSync(path.join(cwd, '.codex'))) {\n return {\n ide: 'codex', label: 'Codex CLI',\n skillsDir: path.join(cwd, '.codex', 'skills', 'skilldb'),\n configFile: path.join(cwd, 'codex.md'),\n };\n }\n return null;\n}\n\nconst IDE_SKILLS_DIRS: Record<IDE, string> = {\n 'claude-code': '.claude/skills/skilldb',\n 'cursor': '.cursor/rules/skilldb',\n 'codex': '.codex/skills/skilldb',\n};\n\nexport async function initCommand(options?: { target?: string }): 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) { console.log(pc.red('Invalid choice.')); process.exit(1); }\n\n detection = {\n ide, label: ide === 'claude-code' ? 'Claude Code' : ide === 'cursor' ? 'Cursor' : 'Codex CLI',\n skillsDir: path.join(cwd, IDE_SKILLS_DIRS[ide]),\n configFile: path.join(cwd, ide === 'claude-code' ? 'CLAUDE.md' : ide === 'cursor' ? '.cursorrules' : 'codex.md'),\n };\n }\n\n // Choose install mode\n const targetArg = options?.target;\n let mode: InstallMode;\n\n if (targetArg === 'mcp') mode = 'mcp';\n else if (targetArg === 'skills-dir') mode = 'skills-dir';\n else if (targetArg === 'claude-md' || targetArg === 'config') mode = 'claude-md';\n else {\n console.log(`\\nWhere should skills be loaded from?\\n`);\n console.log(` 1) ${pc.cyan('MCP Server')} ${pc.dim('— agent fetches on demand, nothing added to files (recommended)')}`);\n console.log(` 2) ${pc.cyan('Skills directory')} ${pc.dim(`— installed to ${IDE_SKILLS_DIRS[detection.ide]}, auto-loaded by IDE`)}`);\n console.log(` 3) ${pc.cyan('Hybrid')} ${pc.dim('— MCP for search + skills dir for always-on core skills')}`);\n console.log(` 4) ${pc.cyan(path.basename(detection.configFile))} ${pc.dim('— append to config file (legacy, can bloat)')}`);\n const modeChoice = await prompt('\\nChoice (1-4): ');\n mode = { '1': 'mcp' as const, '2': 'skills-dir' as const, '3': 'hybrid' as const, '4': 'claude-md' as const }[modeChoice] || 'hybrid';\n }\n\n // Create .skilldb/ cache directory\n const cacheDir = initCache(cwd);\n console.log(`\\nCreated ${pc.dim(cacheDir)}`);\n\n // Update .gitignore\n updateGitignore(cwd);\n\n // ─── Mode: MCP ───\n if (mode === 'mcp' || mode === 'hybrid') {\n console.log(`\\n${pc.cyan('MCP Server setup:')}`);\n console.log(` Install globally: ${pc.dim('npm install -g skilldb')}`);\n\n if (detection.ide === 'claude-code') {\n console.log(` Add to Claude: ${pc.dim('claude mcp add skilldb -- skilldb-mcp')}`);\n } else if (detection.ide === 'cursor') {\n console.log(` Add to Cursor: ${pc.dim('Add to .cursor/mcp.json:')}`);\n console.log(pc.dim(` { \"mcpServers\": { \"skilldb\": { \"command\": \"skilldb-mcp\" } } }`));\n } else {\n console.log(` Run: ${pc.dim('skilldb-mcp')}`);\n }\n\n // Add minimal reference to config file\n const marker = '<!-- skilldb:start -->';\n const snippet = `\\n\\n${marker}\\n## SkillDB\\nSkills available via MCP server. Use \\`skilldb_search\\` to find skills and \\`skilldb_get\\` to load them.\\n<!-- skilldb:end -->\\n`;\n const configFile = detection.configFile;\n let existing = '';\n if (fs.existsSync(configFile)) existing = fs.readFileSync(configFile, 'utf-8');\n if (!existing.includes('skilldb:start')) {\n fs.mkdirSync(path.dirname(configFile), { recursive: true });\n fs.writeFileSync(configFile, existing + snippet);\n console.log(`\\n Added MCP reference to ${pc.cyan(path.basename(configFile))} ${pc.dim('(2 lines, no bloat)')}`);\n }\n }\n\n // ─── Mode: Skills Directory ───\n if (mode === 'skills-dir' || mode === 'hybrid') {\n const skillsDir = detection.skillsDir;\n fs.mkdirSync(skillsDir, { recursive: true });\n console.log(`\\n${pc.cyan('Skills directory:')} ${pc.dim(skillsDir)}`);\n console.log(` Skills installed here are auto-loaded by ${detection.label}.`);\n console.log(` Add skills: ${pc.dim('skilldb add software-skills --target skills-dir')}`);\n\n // Write a README to the skills dir\n fs.writeFileSync(path.join(skillsDir, 'README.md'), `# SkillDB Skills\\n\\nSkills in this directory are automatically loaded by ${detection.label}.\\n\\nManage with:\\n- \\`skilldb add <pack> --target skills-dir\\`\\n- \\`skilldb remove <pack>\\`\\n- \\`skilldb use <profile>\\`\\n\\nBrowse: https://skilldb.dev\\n`);\n }\n\n // ─── Mode: Config File (legacy) ───\n if (mode === 'claude-md') {\n const marker = '<!-- skilldb:start -->';\n const endMarker = '<!-- skilldb:end -->';\n const content = `\\n## SkillDB Skills\\n\\nLocal skills: \\`.skilldb/skills/\\`. Use as reference for tasks.\\nSearch: \\`skilldb search <query>\\`\\nDownload: \\`skilldb add <pack>\\`\\n`;\n const snippet = `\\n\\n${marker}${content}${endMarker}\\n`;\n const configFile = detection.configFile;\n let existing = '';\n if (fs.existsSync(configFile)) existing = fs.readFileSync(configFile, 'utf-8');\n if (!existing.includes('skilldb:start')) {\n fs.mkdirSync(path.dirname(configFile), { recursive: true });\n fs.writeFileSync(configFile, existing + snippet);\n console.log(`\\nAdded SkillDB snippet to ${pc.cyan(path.basename(configFile))}`);\n }\n console.log(pc.yellow('\\n⚠ Config-file mode can bloat over time. Consider --target mcp or --target skills-dir.'));\n }\n\n // Save mode preference\n const configPath = path.join(cwd, '.skilldb', 'config.json');\n let config: Record<string, unknown> = {};\n try { config = JSON.parse(fs.readFileSync(configPath, 'utf-8')); } catch {}\n config.installMode = mode;\n config.ide = detection.ide;\n config.skillsDir = detection.skillsDir;\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2));\n\n console.log(pc.green('\\n✓ Done! Next steps:'));\n if (mode === 'mcp' || mode === 'hybrid') {\n console.log(` ${pc.dim('$')} npm install -g skilldb`);\n if (detection.ide === 'claude-code') {\n console.log(` ${pc.dim('$')} claude mcp add skilldb -- skilldb-mcp`);\n }\n console.log(` Then ask your agent: ${pc.dim('\"Search SkillDB for code review skills\"')}`);\n }\n if (mode === 'skills-dir' || mode === 'hybrid') {\n console.log(` ${pc.dim('$')} skilldb add software-skills --target skills-dir`);\n }\n if (mode === 'claude-md') {\n console.log(` ${pc.dim('$')} skilldb add software-skills`);\n }\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","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport pc from 'picocolors';\r\nimport readline from 'node:readline';\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\nconst SLIM_DIR = 'slim';\r\n\r\nfunction prompt(question: string): Promise<string> {\r\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\r\n return new Promise(resolve => {\r\n rl.question(question, answer => { rl.close(); resolve(answer.trim()); });\r\n });\r\n}\r\n\r\ninterface PurgeStats {\r\n skillsRemoved: number;\r\n packsRemoved: number;\r\n slimRemoved: number;\r\n bytesFreed: number;\r\n activeKept: number;\r\n}\r\n\r\nfunction getDirectorySize(dir: string): number {\r\n if (!fs.existsSync(dir)) return 0;\r\n let size = 0;\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()) size += getDirectorySize(full);\r\n else size += fs.statSync(full).size;\r\n }\r\n return size;\r\n}\r\n\r\nfunction collectAllSkills(dir: string): string[] {\r\n const skills: string[] = [];\r\n if (!fs.existsSync(dir)) return skills;\r\n for (const pack of fs.readdirSync(dir, { withFileTypes: true })) {\r\n if (!pack.isDirectory()) continue;\r\n for (const file of fs.readdirSync(path.join(dir, pack.name))) {\r\n if (file.endsWith('.md')) skills.push(`${pack.name}/${file}`);\r\n }\r\n }\r\n return skills;\r\n}\r\n\r\nfunction collectActivePacks(cwd: string): Set<string> {\r\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n const packs = new Set<string>();\r\n if (!fs.existsSync(activeDir)) return packs;\r\n for (const entry of fs.readdirSync(activeDir, { withFileTypes: true })) {\r\n if (entry.isDirectory()) packs.add(entry.name);\r\n }\r\n return packs;\r\n}\r\n\r\nexport async function purgeCommand(options?: {\r\n all?: boolean;\r\n inactive?: boolean;\r\n slim?: boolean;\r\n dryRun?: boolean;\r\n force?: boolean;\r\n}): Promise<void> {\r\n const cwd = process.cwd();\r\n const skillsDir = path.join(cwd, SKILLDB_DIR, SKILLS_DIR);\r\n const activeDir = path.join(cwd, SKILLDB_DIR, ACTIVE_DIR);\r\n const slimDir = path.join(cwd, SKILLDB_DIR, SLIM_DIR);\r\n\r\n if (!fs.existsSync(path.join(cwd, SKILLDB_DIR))) {\r\n console.log(pc.red('No .skilldb/ directory found. Run \"skilldb init\" first.'));\r\n process.exit(1);\r\n }\r\n\r\n const allSkills = collectAllSkills(skillsDir);\r\n const activePacks = collectActivePacks(cwd);\r\n const activeSkills = new Set<string>();\r\n\r\n // Collect active skill IDs\r\n if (fs.existsSync(activeDir)) {\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')) activeSkills.add(`${pack.name}/${file}`);\r\n }\r\n }\r\n }\r\n\r\n const inactiveSkills = allSkills.filter(s => !activeSkills.has(s));\r\n const slimSkills = collectAllSkills(slimDir);\r\n\r\n const totalSize = getDirectorySize(path.join(cwd, SKILLDB_DIR));\r\n const skillsSize = getDirectorySize(skillsDir);\r\n const slimSize = getDirectorySize(slimDir);\r\n\r\n console.log(pc.bold('\\nSkillDB Purge\\n'));\r\n console.log(` Total skills cached: ${pc.cyan(String(allSkills.length))}`);\r\n console.log(` Active skills: ${pc.green(String(activeSkills.size))}`);\r\n console.log(` Inactive skills: ${pc.yellow(String(inactiveSkills.length))}`);\r\n console.log(` Slim summaries: ${pc.dim(String(slimSkills.length))}`);\r\n console.log(` Total disk usage: ${pc.cyan((totalSize / 1024).toFixed(0) + ' KB')}`);\r\n console.log();\r\n\r\n if (allSkills.length === 0 && slimSkills.length === 0) {\r\n console.log(pc.dim('Nothing to purge.'));\r\n return;\r\n }\r\n\r\n const stats: PurgeStats = { skillsRemoved: 0, packsRemoved: 0, slimRemoved: 0, bytesFreed: 0, activeKept: activeSkills.size };\r\n\r\n // Determine what to purge\r\n let toPurge: string[] = [];\r\n let purgeSlim = options?.slim || options?.all || false;\r\n\r\n if (options?.all) {\r\n toPurge = [...allSkills];\r\n purgeSlim = true;\r\n console.log(pc.red(`Will remove ALL ${allSkills.length} cached skills + ${slimSkills.length} slim summaries`));\r\n } else if (options?.inactive) {\r\n toPurge = inactiveSkills;\r\n console.log(pc.yellow(`Will remove ${inactiveSkills.length} inactive skills (keeping ${activeSkills.size} active)`));\r\n } else {\r\n // Default: purge inactive + slim\r\n toPurge = inactiveSkills;\r\n purgeSlim = true;\r\n console.log(pc.yellow(`Will remove ${inactiveSkills.length} inactive skills + ${slimSkills.length} slim summaries`));\r\n console.log(pc.green(` Keeping ${activeSkills.size} active skills`));\r\n }\r\n\r\n if (toPurge.length === 0 && !purgeSlim) {\r\n console.log(pc.dim('\\nNothing to purge — all skills are active.'));\r\n return;\r\n }\r\n\r\n // Confirm\r\n if (!options?.force && !options?.dryRun) {\r\n const answer = await prompt(`\\n Continue? (y/N) `);\r\n if (answer.toLowerCase() !== 'y') {\r\n console.log(pc.dim('Cancelled.'));\r\n return;\r\n }\r\n }\r\n\r\n if (options?.dryRun) {\r\n console.log(pc.dim('\\n (Dry run — no files will be deleted)\\n'));\r\n for (const skill of toPurge.slice(0, 20)) {\r\n console.log(pc.dim(` would remove: ${skill}`));\r\n }\r\n if (toPurge.length > 20) console.log(pc.dim(` ... and ${toPurge.length - 20} more`));\r\n return;\r\n }\r\n\r\n // Purge cached skills\r\n const manifest = readManifest(cwd);\r\n for (const skillId of toPurge) {\r\n const [pack, file] = skillId.split('/');\r\n const filePath = path.join(skillsDir, pack, file);\r\n if (fs.existsSync(filePath)) {\r\n stats.bytesFreed += fs.statSync(filePath).size;\r\n fs.unlinkSync(filePath);\r\n stats.skillsRemoved++;\r\n }\r\n // Remove from manifest\r\n if (manifest.installed[skillId]) {\r\n delete manifest.installed[skillId];\r\n }\r\n // Clean empty pack dirs\r\n const packDir = path.join(skillsDir, pack);\r\n if (fs.existsSync(packDir) && fs.readdirSync(packDir).length === 0) {\r\n fs.rmdirSync(packDir);\r\n stats.packsRemoved++;\r\n }\r\n }\r\n\r\n // Purge slim summaries\r\n if (purgeSlim && fs.existsSync(slimDir)) {\r\n for (const pack of fs.readdirSync(slimDir, { withFileTypes: true })) {\r\n if (!pack.isDirectory()) continue;\r\n const packPath = path.join(slimDir, pack.name);\r\n for (const file of fs.readdirSync(packPath)) {\r\n const filePath = path.join(packPath, file);\r\n stats.bytesFreed += fs.statSync(filePath).size;\r\n fs.unlinkSync(filePath);\r\n stats.slimRemoved++;\r\n }\r\n if (fs.readdirSync(packPath).length === 0) fs.rmdirSync(packPath);\r\n }\r\n }\r\n\r\n // If purging all, also clear active\r\n if (options?.all && fs.existsSync(activeDir)) {\r\n for (const pack of fs.readdirSync(activeDir, { withFileTypes: true })) {\r\n if (!pack.isDirectory()) continue;\r\n const packPath = path.join(activeDir, pack.name);\r\n for (const file of fs.readdirSync(packPath)) {\r\n fs.unlinkSync(path.join(packPath, file));\r\n }\r\n fs.rmdirSync(packPath);\r\n }\r\n stats.activeKept = 0;\r\n }\r\n\r\n writeManifest(manifest, cwd);\r\n\r\n console.log(pc.green(`\\n ✓ Purge complete`));\r\n console.log(` Skills removed: ${stats.skillsRemoved}`);\r\n console.log(` Slim removed: ${stats.slimRemoved}`);\r\n console.log(` Packs cleaned: ${stats.packsRemoved}`);\r\n console.log(` Space freed: ${(stats.bytesFreed / 1024).toFixed(0)} KB`);\r\n console.log(` Active kept: ${stats.activeKept}`);\r\n}\r\n"],"mappings":"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","names":["pc","pc","pad","truncate","fs","path","pc","fs","path","path","fs","fs","path","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","fs","path","pc","readline","SKILLDB_DIR","SKILLS_DIR","ACTIVE_DIR","SLIM_DIR","prompt","readline","fs","path","pc"]}
|