apero-kit-cli 2.4.7 → 2.5.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/kits/index.ts","../src/utils/paths.ts","../src/utils/copy.ts","../src/utils/hash.ts","../src/utils/state.ts","../src/utils/prompts.ts","../src/commands/init.ts","../src/commands/add.ts","../src/commands/list.ts","../src/commands/update.ts","../src/commands/status.ts","../src/commands/doctor.ts","../src/commands/help.ts","../src/commands/uninstall.ts","../src/utils/git-tags.ts","../src/commands/versions.ts","../src/commands/update-cli.ts","../src/commands/skills.ts","../src/index.ts","../src/cli/command-registry.ts","../src/utils/version-check.ts"],"sourcesContent":["export interface Kit {\n name: string;\n description: string;\n emoji: string;\n color: string;\n agents: string[] | 'all';\n commands: string[] | 'all';\n skills: string[] | 'all';\n workflows: string[] | 'all';\n includeRouter: boolean;\n includeHooks: boolean;\n}\n\nexport const KITS: Record<string, Kit> = {\n engineer: {\n name: 'engineer',\n description: 'Full-stack development kit for building applications',\n emoji: '🛠️',\n color: 'blue',\n agents: [\n 'planner',\n 'debugger',\n 'fullstack-developer',\n 'tester',\n 'code-reviewer',\n 'git-manager',\n 'database-admin'\n ],\n commands: [\n 'plan', 'plan/parallel', 'plan/fast', 'plan/hard',\n 'code', 'code/auto', 'code/parallel',\n 'fix', 'fix/test', 'fix/types', 'fix/fast', 'fix/ci',\n 'test', 'test/ui',\n 'review', 'review/codebase',\n 'scout', 'build', 'lint'\n ],\n skills: [\n 'frontend-development',\n 'backend-development',\n 'databases',\n 'debugging',\n 'code-review',\n 'planning',\n 'problem-solving'\n ],\n workflows: ['feature-development', 'bug-fixing'],\n includeRouter: true,\n includeHooks: true\n },\n\n researcher: {\n name: 'researcher',\n description: 'Research and analysis kit for exploring codebases',\n emoji: '🔬',\n color: 'green',\n agents: [\n 'researcher',\n 'scout',\n 'scout-external',\n 'brainstormer',\n 'docs-manager',\n 'planner'\n ],\n commands: [\n 'scout', 'scout/ext',\n 'investigate', 'brainstorm',\n 'docs', 'docs/init', 'docs/update', 'docs/summarize',\n 'plan', 'ask', 'context'\n ],\n skills: [\n 'research',\n 'planning-with-files',\n 'documentation',\n 'project-index'\n ],\n workflows: [],\n includeRouter: true,\n includeHooks: false\n },\n\n designer: {\n name: 'designer',\n description: 'UI/UX design and frontend development kit',\n emoji: '🎨',\n color: 'magenta',\n agents: [\n 'ui-ux-designer',\n 'fullstack-developer',\n 'code-reviewer'\n ],\n commands: [\n 'code', 'fix', 'fix/ui', 'test/ui', 'review'\n ],\n skills: [\n 'ui-ux-pro-max',\n 'frontend-development',\n 'frontend-design'\n ],\n workflows: [],\n includeRouter: false,\n includeHooks: true\n },\n\n minimal: {\n name: 'minimal',\n description: 'Lightweight kit with essential agents only',\n emoji: '📦',\n color: 'yellow',\n agents: ['planner', 'debugger'],\n commands: ['plan', 'fix', 'code'],\n skills: ['planning', 'debugging'],\n workflows: [],\n includeRouter: false,\n includeHooks: false\n },\n\n full: {\n name: 'full',\n description: 'Complete kit with ALL agents, commands, and skills',\n emoji: '🚀',\n color: 'cyan',\n agents: 'all',\n commands: 'all',\n skills: 'all',\n workflows: 'all',\n includeRouter: true,\n includeHooks: true\n }\n};\n\nexport const getKit = (name: string): Kit | null => KITS[name] || null;\nexport const getKitNames = (): string[] => Object.keys(KITS);\nexport const getKitList = (): Kit[] => Object.values(KITS);\n","import { fileURLToPath } from 'url';\nimport { dirname, join, resolve } from 'path';\nimport { existsSync, statSync } from 'fs';\nimport { homedir } from 'os';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// When bundled with tsup, all code is in dist/index.js, so __dirname is 'dist'\n// When unbundled (dev), this file is in src/utils, so __dirname is 'src/utils'\n// We need to go up one level from dist, or two levels from src/utils\nexport const CLI_ROOT = __dirname.endsWith('dist')\n ? resolve(__dirname, '..')\n : resolve(__dirname, '../..');\nexport const TEMPLATES_DIR = join(CLI_ROOT, 'templates');\n\nexport const TARGETS: Record<string, string> = {\n claude: '.claude',\n gemini: '.gemini',\n discord: '.discord',\n opencode: '.opencode',\n generic: '.agent'\n};\n\nexport type CliTarget = 'claude' | 'gemini' | 'discord';\n\nexport interface SourceInfo {\n path: string;\n type: string;\n claudeDir: string;\n agentsMd: string | null;\n error?: undefined;\n}\n\nexport interface SourceError {\n error: string;\n}\n\n/**\n * Get embedded templates (bundled with CLI)\n */\nexport function getEmbeddedTemplates(): SourceInfo | null {\n if (existsSync(TEMPLATES_DIR)) {\n const agentsMd = join(TEMPLATES_DIR, 'AGENTS.md');\n return {\n path: TEMPLATES_DIR,\n type: 'embedded',\n claudeDir: TEMPLATES_DIR,\n agentsMd: existsSync(agentsMd) ? agentsMd : null\n };\n }\n return null;\n}\n\n/**\n * Get global installation path\n */\nexport function getGlobalInstallPath(): string {\n if (process.platform === 'win32') {\n return join(process.env.APPDATA || join(homedir(), 'AppData', 'Roaming'), 'claude');\n }\n return join(homedir(), '.claude');\n}\n\n/**\n * Check if current directory is an ak project\n */\nexport function isAkProject(dir: string = process.cwd()): boolean {\n const akConfig = join(dir, '.ak', 'state.json');\n const claudeDir = join(dir, '.claude');\n const geminiDir = join(dir, '.gemini');\n const opencodeDir = join(dir, '.opencode');\n const agentDir = join(dir, '.agent');\n\n return existsSync(akConfig) ||\n existsSync(claudeDir) ||\n existsSync(geminiDir) ||\n existsSync(opencodeDir) ||\n existsSync(agentDir);\n}\n\n/**\n * Get target directory path\n */\nexport function getTargetDir(projectDir: string, target: string = 'claude'): string {\n const folder = TARGETS[target] || TARGETS.claude;\n return join(projectDir, folder);\n}\n\n/**\n * Resolve source path (from --source flag or embedded templates)\n * Priority: 1. --source flag 2. Embedded templates\n */\nexport function resolveSource(sourceFlag?: string): SourceInfo | SourceError {\n // 1. If --source flag provided, use it\n if (sourceFlag) {\n const resolved = resolve(sourceFlag);\n if (!existsSync(resolved)) {\n return { error: `Source path not found: ${sourceFlag}` };\n }\n\n // Check if it's a valid source\n const claudeDir = join(resolved, '.claude');\n const opencodeDir = join(resolved, '.opencode');\n\n if (existsSync(claudeDir)) {\n return {\n path: resolved,\n type: 'custom',\n claudeDir,\n agentsMd: existsSync(join(resolved, 'AGENTS.md')) ? join(resolved, 'AGENTS.md') : null\n };\n }\n\n if (existsSync(opencodeDir)) {\n return {\n path: resolved,\n type: 'custom',\n claudeDir: opencodeDir,\n agentsMd: existsSync(join(resolved, 'AGENTS.md')) ? join(resolved, 'AGENTS.md') : null\n };\n }\n\n // If source flag points directly to a templates dir (no .claude wrapper)\n if (existsSync(join(resolved, 'agents')) || existsSync(join(resolved, 'commands'))) {\n return {\n path: resolved,\n type: 'custom',\n claudeDir: resolved,\n agentsMd: existsSync(join(resolved, 'AGENTS.md')) ? join(resolved, 'AGENTS.md') : null\n };\n }\n\n return { error: `No templates found in: ${sourceFlag}` };\n }\n\n // 2. Use embedded templates (bundled with CLI)\n const embedded = getEmbeddedTemplates();\n if (embedded) {\n return embedded;\n }\n\n return {\n error: 'No templates found. Reinstall: npm install -g apero-kit-cli'\n };\n}\n","import fs from 'fs-extra';\nimport { join, basename, dirname } from 'path';\nimport type { CliTarget } from './paths.js';\nimport { CLI_ROOT } from './paths.js';\n\n/**\n * Parse frontmatter from markdown file\n */\nfunction parseFrontmatter(content: string): { description: string; argumentHint: string; body: string } {\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\n if (!frontmatterMatch) {\n return { description: '', argumentHint: '', body: content };\n }\n\n const frontmatter = frontmatterMatch[1];\n const body = frontmatterMatch[2].trim();\n\n const descMatch = frontmatter.match(/description:\\s*(.+)/);\n const argMatch = frontmatter.match(/argument-hint:\\s*(.+)/);\n\n return {\n description: descMatch ? descMatch[1].trim() : '',\n argumentHint: argMatch ? argMatch[1].trim() : '',\n body\n };\n}\n\n/**\n * Escape TOML basic string (single line)\n */\nfunction escapeTomlBasicString(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\t/g, '\\\\t');\n}\n\n/**\n * Convert Claude MD command to Gemini TOML format\n * Uses literal strings (''') for prompts to avoid escape issues\n */\nexport function convertMdToToml(mdContent: string): string {\n const { description, body } = parseFrontmatter(mdContent);\n\n // Convert $ARGUMENTS to {{args}}\n const prompt = body.replace(/\\$ARGUMENTS/g, '{{args}}');\n\n const lines: string[] = [];\n\n if (description) {\n // Use basic string for short description (escape special chars)\n lines.push(`description = \"${escapeTomlBasicString(description)}\"`);\n }\n\n // Use multi-line LITERAL strings (''') for prompt - no escape processing\n // This avoids issues with backslashes in shell commands\n lines.push(`prompt = '''\\n${prompt}\\n'''`);\n\n return lines.join('\\n');\n}\n\nexport interface CopyResult {\n copied: string[];\n skipped: string[];\n errors: Array<{ item: string; error: string }>;\n}\n\nexport interface CopyStatusResult {\n success: boolean;\n error?: string;\n}\n\nexport interface AvailableItem {\n name: string;\n isDir: boolean;\n path: string;\n}\n\n/**\n * Copy specific items from source to destination\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyItems(\n items: string[],\n type: string,\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, type);\n const destTypeDir = join(destDir, type);\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: items, errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const item of items) {\n try {\n // Handle nested paths like \"plan/parallel\"\n const itemPath = join(typeDir, item);\n const itemPathMd = itemPath + '.md';\n\n let srcPath: string;\n if (fs.existsSync(itemPath)) {\n srcPath = itemPath;\n } else if (fs.existsSync(itemPathMd)) {\n srcPath = itemPathMd;\n } else {\n skipped.push(item);\n continue;\n }\n\n // Determine destination path\n const stat = fs.statSync(srcPath);\n if (stat.isDirectory()) {\n await fs.copy(srcPath, join(destTypeDir, item), { overwrite: !mergeMode });\n } else {\n // Preserve directory structure for nested items\n const destPath = srcPath.endsWith('.md')\n ? join(destTypeDir, item + '.md')\n : join(destTypeDir, item);\n await fs.ensureDir(join(destTypeDir, item.split('/').slice(0, -1).join('/')));\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n }\n\n copied.push(item);\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Copy all items of a type\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyAllOfType(\n type: string,\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyStatusResult> {\n const typeDir = join(sourceDir, type);\n const destTypeDir = join(destDir, type);\n\n if (!fs.existsSync(typeDir)) {\n return { success: false, error: `${type} directory not found` };\n }\n\n try {\n await fs.copy(typeDir, destTypeDir, { overwrite: !mergeMode });\n return { success: true };\n } catch (err: any) {\n return { success: false, error: err.message };\n }\n}\n\n/**\n * Copy router directory\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyRouter(\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyStatusResult> {\n const routerDir = join(sourceDir, 'router');\n\n if (!fs.existsSync(routerDir)) {\n return { success: false, error: 'Router directory not found' };\n }\n\n try {\n await fs.copy(routerDir, join(destDir, 'router'), { overwrite: !mergeMode });\n return { success: true };\n } catch (err: any) {\n return { success: false, error: err.message };\n }\n}\n\n/**\n * Copy hooks directory\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyHooks(\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyStatusResult> {\n const hooksDir = join(sourceDir, 'hooks');\n\n if (!fs.existsSync(hooksDir)) {\n return { success: false, error: 'Hooks directory not found' };\n }\n\n try {\n await fs.copy(hooksDir, join(destDir, 'hooks'), { overwrite: !mergeMode });\n return { success: true };\n } catch (err: any) {\n return { success: false, error: err.message };\n }\n}\n\n/**\n * Copy workflows directory\n */\nexport async function copyWorkflows(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string\n): Promise<CopyResult | CopyStatusResult> {\n if (items === 'all') {\n return copyAllOfType('workflows', sourceDir, destDir);\n }\n return copyItems(items, 'workflows', sourceDir, destDir);\n}\n\n/**\n * Copy base files (README, settings, statusline, etc.)\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyBaseFiles(\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<string[]> {\n const baseFiles = ['README.md', 'settings.json', '.env.example', 'statusline.cjs', 'statusline.ps1', 'statusline.sh'];\n const copied: string[] = [];\n\n for (const file of baseFiles) {\n const srcPath = join(sourceDir, file);\n const destPath = join(destDir, file);\n\n // Skip if merge mode and file exists\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n\n if (fs.existsSync(srcPath)) {\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(file);\n }\n }\n\n return copied;\n}\n\n/**\n * Copy a directory (memory, output-styles, scripts, etc.)\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyDirectory(\n dirName: string,\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyStatusResult> {\n const srcPath = join(sourceDir, dirName);\n\n if (!fs.existsSync(srcPath)) {\n return { success: false, error: `${dirName} directory not found` };\n }\n\n try {\n await fs.copy(srcPath, join(destDir, dirName), { overwrite: !mergeMode });\n return { success: true };\n } catch (err: any) {\n return { success: false, error: err.message };\n }\n}\n\n/**\n * Copy AGENTS.md to project root\n * @param {boolean} mergeMode - If true, skip if file exists\n */\nexport async function copyAgentsMd(\n agentsMdPath: string | null,\n projectDir: string,\n mergeMode: boolean = false\n): Promise<boolean> {\n if (!agentsMdPath || !fs.existsSync(agentsMdPath)) {\n return false;\n }\n\n const destPath = join(projectDir, 'AGENTS.md');\n\n // Skip if merge mode and file exists\n if (mergeMode && fs.existsSync(destPath)) {\n return false;\n }\n\n await fs.copy(agentsMdPath, destPath, { overwrite: !mergeMode });\n return true;\n}\n\n/**\n * List available items of a type\n */\nexport function listAvailable(type: string, sourceDir: string): AvailableItem[] {\n const typeDir = join(sourceDir, type);\n\n if (!fs.existsSync(typeDir)) {\n return [];\n }\n\n const items = fs.readdirSync(typeDir);\n return items.map(item => {\n const itemPath = join(typeDir, item);\n const isDir = fs.statSync(itemPath).isDirectory();\n const name = item.replace(/\\.md$/, '');\n return { name, isDir, path: itemPath };\n });\n}\n\n/**\n * Copy commands to Gemini target (converts MD to TOML)\n */\nexport async function copyCommandsForGemini(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'commands');\n const destTypeDir = join(destDir, 'commands');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Get all items if 'all'\n let itemList: string[];\n if (items === 'all') {\n // Get top-level items (files and directories)\n const entries = fs.readdirSync(typeDir);\n itemList = entries.map(e => e.replace(/\\.md$/, ''));\n // Remove duplicates (plan.md and plan/ both become 'plan')\n itemList = [...new Set(itemList)];\n } else {\n itemList = items;\n }\n\n for (const item of itemList) {\n try {\n const srcPathMd = join(typeDir, item + '.md');\n const srcPathDir = join(typeDir, item);\n\n // Handle both file and directory with same name (e.g., plan.md AND plan/)\n let copiedSomething = false;\n\n // 1. Check if .md file exists - convert it\n if (fs.existsSync(srcPathMd) && fs.statSync(srcPathMd).isFile()) {\n const destPath = join(destTypeDir, item + '.toml');\n\n if (!(mergeMode && fs.existsSync(destPath))) {\n await fs.ensureDir(dirname(destPath));\n const mdContent = fs.readFileSync(srcPathMd, 'utf-8');\n const tomlContent = convertMdToToml(mdContent);\n await fs.writeFile(destPath, tomlContent, 'utf-8');\n copiedSomething = true;\n }\n }\n\n // 2. Check if directory exists - convert recursively\n if (fs.existsSync(srcPathDir) && fs.statSync(srcPathDir).isDirectory()) {\n await convertDirectoryToToml(srcPathDir, join(destTypeDir, item), mergeMode);\n copiedSomething = true;\n }\n\n if (copiedSomething) {\n copied.push(item);\n } else {\n skipped.push(item);\n }\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Recursively convert a directory of MD files to TOML\n */\nasync function convertDirectoryToToml(\n srcDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<void> {\n await fs.ensureDir(destDir);\n\n const entries = fs.readdirSync(srcDir);\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry);\n const stat = fs.statSync(srcPath);\n\n if (stat.isDirectory()) {\n await convertDirectoryToToml(srcPath, join(destDir, entry), mergeMode);\n } else if (entry.endsWith('.md')) {\n const destPath = join(destDir, entry.replace(/\\.md$/, '.toml'));\n\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const tomlContent = convertMdToToml(mdContent);\n await fs.writeFile(destPath, tomlContent, 'utf-8');\n } else {\n // Copy non-MD files as-is\n const destPath = join(destDir, entry);\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n }\n }\n}\n\n/**\n * List all files recursively (relative paths)\n */\nfunction listAvailableRecursive(dir: string, base: string = ''): string[] {\n const results: string[] = [];\n const entries = fs.readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const relativePath = base ? `${base}/${entry}` : entry;\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n results.push(...listAvailableRecursive(fullPath, relativePath));\n } else {\n results.push(relativePath);\n }\n }\n\n return results;\n}\n\n/**\n * Convert Claude agent MD to Gemini-compatible format\n * Maps Claude model names to Gemini equivalents\n * Converts tools from string to array format\n */\nfunction convertAgentForGemini(mdContent: string): string {\n // Parse frontmatter\n const frontmatterMatch = mdContent.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!frontmatterMatch) return mdContent;\n\n let frontmatter = frontmatterMatch[1];\n const body = frontmatterMatch[2];\n\n // Map Claude models to Gemini models\n const modelMap: Record<string, string> = {\n 'opus': 'gemini-2.5-pro',\n 'sonnet': 'gemini-2.5-flash',\n 'haiku': 'gemini-2.0-flash-lite',\n 'inherit': '' // Remove inherit, let Gemini use default\n };\n\n // Replace model field\n for (const [claudeModel, geminiModel] of Object.entries(modelMap)) {\n const regex = new RegExp(`^model:\\\\s*${claudeModel}\\\\s*$`, 'm');\n if (geminiModel) {\n frontmatter = frontmatter.replace(regex, `model: ${geminiModel}`);\n } else {\n // Remove the model line if it's 'inherit'\n frontmatter = frontmatter.replace(regex, '');\n }\n }\n\n // Remove tools field - Claude and Gemini have different tool naming\n // Claude: \"Glob, Grep, Read, Bash\"\n // Gemini: \"read_file, grep_search, run_shell_command, write_file\"\n // Let Gemini use default tools instead of trying to map\n frontmatter = frontmatter.replace(/^tools:\\s*.+$/m, '');\n\n // Add kind: local if not present\n if (!frontmatter.includes('kind:')) {\n frontmatter = frontmatter.trim() + '\\nkind: local';\n }\n\n return `---\\n${frontmatter.trim()}\\n---\\n${body}`;\n}\n\n/**\n * Copy agents to Gemini target (converts Claude agent format)\n * Gemini agents: .gemini/agents/*.md\n */\nexport async function copyAgentsForGemini(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'agents');\n const destTypeDir = join(destDir, 'agents');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Get agent files\n let agentList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n agentList = entries\n .filter(e => e.endsWith('.md') && e !== 'README.md')\n .map(e => e.replace(/\\.md$/, ''));\n } else {\n agentList = items;\n }\n\n for (const agent of agentList) {\n try {\n const srcPath = join(typeDir, agent + '.md');\n\n if (!fs.existsSync(srcPath)) {\n skipped.push(agent);\n continue;\n }\n\n const destPath = join(destTypeDir, agent + '.md');\n\n // Skip if merge mode and destination exists\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(agent);\n continue;\n }\n\n // Convert and write\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const convertedContent = convertAgentForGemini(mdContent);\n await fs.writeFile(destPath, convertedContent, 'utf-8');\n copied.push(agent);\n } catch (err: any) {\n errors.push({ item: agent, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Copy skills to Gemini target (skills use same SKILL.md format)\n * Gemini skills: .gemini/skills/<skill-name>/SKILL.md\n */\nexport async function copySkillsForGemini(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'skills');\n const destTypeDir = join(destDir, 'skills');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Get skill directories\n let skillList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n skillList = entries.filter(e => {\n const fullPath = join(typeDir, e);\n return fs.statSync(fullPath).isDirectory() && fs.existsSync(join(fullPath, 'SKILL.md'));\n });\n } else {\n skillList = items;\n }\n\n for (const skill of skillList) {\n try {\n const srcPath = join(typeDir, skill);\n\n // Check if it's a valid skill directory with SKILL.md\n if (!fs.existsSync(srcPath) || !fs.statSync(srcPath).isDirectory()) {\n skipped.push(skill);\n continue;\n }\n\n const skillMdPath = join(srcPath, 'SKILL.md');\n if (!fs.existsSync(skillMdPath)) {\n skipped.push(skill);\n continue;\n }\n\n const destPath = join(destTypeDir, skill);\n\n // Skip if merge mode and destination exists\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(skill);\n continue;\n }\n\n // Copy entire skill directory (SKILL.md + references, assets, etc.)\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(skill);\n } catch (err: any) {\n errors.push({ skill, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Copy Gemini-specific base files (settings.json with plan mode enabled)\n */\nexport async function copyGeminiBaseFiles(\n destDir: string,\n mergeMode: boolean = false\n): Promise<string[]> {\n const geminiTemplates = join(CLI_ROOT, 'templates', 'gemini');\n const copied: string[] = [];\n\n // Copy settings.json if exists\n const settingsPath = join(geminiTemplates, 'settings.json');\n const destSettingsPath = join(destDir, 'settings.json');\n\n if (fs.existsSync(settingsPath)) {\n // Skip if merge mode and file exists\n if (mergeMode && fs.existsSync(destSettingsPath)) {\n return copied;\n }\n\n await fs.copy(settingsPath, destSettingsPath, { overwrite: !mergeMode });\n copied.push('settings.json');\n }\n\n return copied;\n}\n\n/**\n * Copy only unchanged files (for update)\n */\nexport async function copyUnchangedOnly(\n sourceDir: string,\n destDir: string,\n unchangedFiles: string[]\n): Promise<{ copied: string[]; skipped: string[] }> {\n const copied: string[] = [];\n const skipped: string[] = [];\n\n for (const file of unchangedFiles) {\n const srcPath = join(sourceDir, file);\n const destPath = join(destDir, file);\n\n if (fs.existsSync(srcPath)) {\n await fs.ensureDir(join(destDir, file.split('/').slice(0, -1).join('/')));\n await fs.copy(srcPath, destPath, { overwrite: true });\n copied.push(file);\n } else {\n skipped.push(file);\n }\n }\n\n return { copied, skipped };\n}\n\n// ============================================================================\n// Discord/Clawbot Support\n// ============================================================================\n\n/**\n * Convert Claude MD command to Discord/Clawbot JSON5 format\n * Commands become agent \"commands\" config in Clawbot\n */\nfunction convertCommandForDiscord(mdContent: string, commandName: string): {\n name: string;\n description: string;\n prompt: string;\n} {\n const { description, body } = parseFrontmatter(mdContent);\n\n // Convert $ARGUMENTS to {{args}} for consistency\n const prompt = body.replace(/\\$ARGUMENTS/g, '{{args}}');\n\n return {\n name: commandName,\n description: description || `Execute ${commandName} command`,\n prompt\n };\n}\n\n/**\n * Convert Claude agent MD to Discord/Clawbot-compatible format\n * Clawbot agents use similar YAML frontmatter but different model names\n */\nfunction convertAgentForDiscord(mdContent: string): string {\n // Parse frontmatter\n const frontmatterMatch = mdContent.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!frontmatterMatch) return mdContent;\n\n let frontmatter = frontmatterMatch[1];\n const body = frontmatterMatch[2];\n\n // Map Claude models to Clawbot models (uses Claude API via OpenClaw)\n // Clawbot supports: claude-3-opus, claude-3-sonnet, claude-3-haiku\n const modelMap: Record<string, string> = {\n 'opus': 'claude-3-opus',\n 'sonnet': 'claude-3-sonnet',\n 'haiku': 'claude-3-haiku',\n 'inherit': '' // Remove inherit\n };\n\n // Replace model field\n for (const [claudeModel, discordModel] of Object.entries(modelMap)) {\n const regex = new RegExp(`^model:\\\\s*${claudeModel}\\\\s*$`, 'm');\n if (discordModel) {\n frontmatter = frontmatter.replace(regex, `model: ${discordModel}`);\n } else {\n frontmatter = frontmatter.replace(regex, '');\n }\n }\n\n // Remove tools field - Clawbot has different tool naming\n frontmatter = frontmatter.replace(/^tools:\\s*.+$/m, '');\n\n // Add kind: local if not present\n if (!frontmatter.includes('kind:')) {\n frontmatter = frontmatter.trim() + '\\nkind: local';\n }\n\n return `---\\n${frontmatter.trim()}\\n---\\n${body}`;\n}\n\n/**\n * Copy agents to Discord target (converts Claude agent format)\n */\nexport async function copyAgentsForDiscord(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'agents');\n const destTypeDir = join(destDir, 'agents');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Get agent files\n let agentList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n agentList = entries\n .filter(e => e.endsWith('.md') && e !== 'README.md')\n .map(e => e.replace(/\\.md$/, ''));\n } else {\n agentList = items;\n }\n\n for (const agent of agentList) {\n try {\n const srcPath = join(typeDir, agent + '.md');\n\n if (!fs.existsSync(srcPath)) {\n skipped.push(agent);\n continue;\n }\n\n const destPath = join(destTypeDir, agent + '.md');\n\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(agent);\n continue;\n }\n\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const convertedContent = convertAgentForDiscord(mdContent);\n await fs.writeFile(destPath, convertedContent, 'utf-8');\n copied.push(agent);\n } catch (err: any) {\n errors.push({ item: agent, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Copy commands to Discord target\n * Commands are stored as .md files but also generate a commands.json5 for Clawbot\n */\nexport async function copyCommandsForDiscord(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'commands');\n const destTypeDir = join(destDir, 'commands');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Collect commands for JSON5 config\n const commandsConfig: Record<string, { description: string; prompt: string }> = {};\n\n // Get all items if 'all'\n let itemList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n itemList = entries.map(e => e.replace(/\\.md$/, ''));\n itemList = [...new Set(itemList)];\n } else {\n itemList = items;\n }\n\n for (const item of itemList) {\n try {\n const srcPathMd = join(typeDir, item + '.md');\n const srcPathDir = join(typeDir, item);\n\n let copiedSomething = false;\n\n // Handle .md file\n if (fs.existsSync(srcPathMd) && fs.statSync(srcPathMd).isFile()) {\n const destPath = join(destTypeDir, item + '.md');\n\n if (!(mergeMode && fs.existsSync(destPath))) {\n await fs.ensureDir(dirname(destPath));\n const mdContent = fs.readFileSync(srcPathMd, 'utf-8');\n\n // Copy MD as-is (Clawbot can read MD prompts)\n await fs.copy(srcPathMd, destPath, { overwrite: !mergeMode });\n\n // Also add to commands config\n const cmd = convertCommandForDiscord(mdContent, item);\n commandsConfig[item] = {\n description: cmd.description,\n prompt: cmd.prompt\n };\n\n copiedSomething = true;\n }\n }\n\n // Handle directory (nested commands)\n if (fs.existsSync(srcPathDir) && fs.statSync(srcPathDir).isDirectory()) {\n await copyDirectoryForDiscord(srcPathDir, join(destTypeDir, item), mergeMode, commandsConfig, item);\n copiedSomething = true;\n }\n\n if (copiedSomething) {\n copied.push(item);\n } else {\n skipped.push(item);\n }\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n // Write commands.json5 config file for Clawbot\n const configPath = join(destDir, 'commands.json5');\n if (Object.keys(commandsConfig).length > 0 && !(mergeMode && fs.existsSync(configPath))) {\n const json5Content = generateCommandsJson5(commandsConfig);\n await fs.writeFile(configPath, json5Content, 'utf-8');\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Recursively copy directory for Discord\n */\nasync function copyDirectoryForDiscord(\n srcDir: string,\n destDir: string,\n mergeMode: boolean,\n commandsConfig: Record<string, { description: string; prompt: string }>,\n parentName: string\n): Promise<void> {\n await fs.ensureDir(destDir);\n\n const entries = fs.readdirSync(srcDir);\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry);\n const stat = fs.statSync(srcPath);\n\n if (stat.isDirectory()) {\n await copyDirectoryForDiscord(\n srcPath,\n join(destDir, entry),\n mergeMode,\n commandsConfig,\n `${parentName}/${entry}`\n );\n } else if (entry.endsWith('.md')) {\n const destPath = join(destDir, entry);\n\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n\n // Add nested command to config\n const cmdName = `${parentName}/${entry.replace(/\\.md$/, '')}`;\n const cmd = convertCommandForDiscord(mdContent, cmdName);\n commandsConfig[cmdName] = {\n description: cmd.description,\n prompt: cmd.prompt\n };\n } else {\n // Copy non-MD files as-is\n const destPath = join(destDir, entry);\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n }\n }\n}\n\n/**\n * Generate JSON5 config for Clawbot commands\n */\nfunction generateCommandsJson5(\n commands: Record<string, { description: string; prompt: string }>\n): string {\n const lines: string[] = [\n '// Clawbot Commands Configuration',\n '// Generated by Apero Kit CLI',\n '// These commands can be used as slash commands in Discord',\n '{',\n ' \"commands\": {'\n ];\n\n const cmdEntries = Object.entries(commands);\n cmdEntries.forEach(([name, cmd], index) => {\n const safeName = name.replace(/\\//g, ':'); // plan/fast -> plan:fast\n const isLast = index === cmdEntries.length - 1;\n\n lines.push(` \"${safeName}\": {`);\n lines.push(` \"description\": ${JSON.stringify(cmd.description)},`);\n // Use multi-line string for prompt\n lines.push(` \"prompt\": ${JSON.stringify(cmd.prompt)}`);\n lines.push(` }${isLast ? '' : ','}`);\n });\n\n lines.push(' }');\n lines.push('}');\n\n return lines.join('\\n');\n}\n\n/**\n * Copy skills to Discord target (same SKILL.md format)\n */\nexport async function copySkillsForDiscord(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n // Skills use same format, delegate to Gemini function\n return copySkillsForGemini(items, sourceDir, destDir, mergeMode);\n}\n\n/**\n * Copy Discord-specific base files (config.json5, etc.)\n */\nexport async function copyDiscordBaseFiles(\n destDir: string,\n mergeMode: boolean = false\n): Promise<string[]> {\n const discordTemplates = join(CLI_ROOT, 'templates', 'discord');\n const copied: string[] = [];\n\n // List of Discord-specific files to copy\n const filesToCopy = ['config.json5', 'README.md'];\n\n for (const file of filesToCopy) {\n const srcPath = join(discordTemplates, file);\n const destPath = join(destDir, file);\n\n if (fs.existsSync(srcPath)) {\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(file);\n }\n }\n\n return copied;\n}\n\n/**\n * Update Discord config with bot token and optional guild ID\n */\nexport async function updateDiscordConfig(\n destDir: string,\n token: string,\n guildId?: string\n): Promise<void> {\n const configPath = join(destDir, 'config.json5');\n\n if (!fs.existsSync(configPath)) {\n return;\n }\n\n let content = await fs.readFile(configPath, 'utf-8');\n\n // Replace token placeholder with actual token\n content = content.replace(\n '\"token\": \"${DISCORD_BOT_TOKEN}\"',\n `\"token\": \"${token}\"`\n );\n\n // If guild ID is provided, add it to the guilds config\n if (guildId) {\n const guildConfig = `\"${guildId}\": {\n \"requireMention\": true,\n \"users\": [],\n \"roles\": [],\n \"channels\": {}\n }`;\n\n content = content.replace(\n '\"guilds\": {\\n // Example guild configuration',\n `\"guilds\": {\\n ${guildConfig},\\n // Example guild configuration`\n );\n }\n\n await fs.writeFile(configPath, content, 'utf-8');\n}\n\n/**\n * Setup OpenClaw CLI configuration (if available)\n */\nexport async function setupOpenClawConfig(token: string): Promise<{ success: boolean; message: string }> {\n const { execSync } = await import('child_process');\n\n try {\n // Check if openclaw is installed\n execSync('which openclaw', { stdio: 'ignore' });\n } catch {\n return { success: false, message: 'OpenClaw CLI not installed. Run: npm install -g openclaw' };\n }\n\n try {\n // Set Discord token\n execSync(`openclaw config set channels.discord.token '\"${token}\"' --json`, { stdio: 'ignore' });\n\n // Enable Discord channel\n execSync('openclaw config set channels.discord.enabled true --json', { stdio: 'ignore' });\n\n // Set gateway mode to local (required for openclaw gateway to start)\n execSync('openclaw config set gateway.mode local', { stdio: 'ignore' });\n\n return { success: true, message: 'OpenClaw configured successfully!' };\n } catch (error: any) {\n return { success: false, message: `Failed to configure OpenClaw: ${error.message}` };\n }\n}\n\n// ============================================================================\n// OpenClaw Skills Conversion (Commands → Skills)\n// ============================================================================\n\n/**\n * Extract keywords from command content for trigger conditions\n */\nfunction extractKeywords(content: string, commandName: string): string[] {\n const keywords = new Set<string>();\n\n // Add command name variations\n keywords.add(commandName);\n keywords.add(commandName.replace(/-/g, ' '));\n\n // Extract from common patterns\n const keywordPatterns = [\n /keywords?:\\s*([^\\n]+)/gi,\n /when.*(?:says?|mentions?|asks?).*[\"']([^\"']+)[\"']/gi,\n /trigger.*[\"']([^\"']+)[\"']/gi\n ];\n\n for (const pattern of keywordPatterns) {\n const matches = content.matchAll(pattern);\n for (const match of matches) {\n match[1].split(/[,;]/).forEach(k => keywords.add(k.trim().toLowerCase()));\n }\n }\n\n // Common intent keywords based on command name\n const intentMap: Record<string, string[]> = {\n 'plan': ['plan', 'design', 'architect', 'implement', 'create plan'],\n 'brainstorm': ['brainstorm', 'ideas', 'options', 'alternatives', 'think'],\n 'fix': ['fix', 'debug', 'error', 'broken', 'issue', 'bug'],\n 'code': ['code', 'implement', 'build', 'develop', 'write code'],\n 'review': ['review', 'check', 'audit', 'look at'],\n 'test': ['test', 'testing', 'spec', 'unit test'],\n 'cook': ['cook', 'implement', 'build feature', 'develop'],\n 'scout': ['scout', 'search', 'find', 'explore codebase'],\n 'debug': ['debug', 'trace', 'diagnose', 'investigate']\n };\n\n const baseName = commandName.split('/')[0].split(':')[0];\n if (intentMap[baseName]) {\n intentMap[baseName].forEach(k => keywords.add(k));\n }\n\n return Array.from(keywords).slice(0, 10);\n}\n\n/**\n * Convert Claude command MD to OpenClaw SKILL.md format\n */\nfunction convertCommandToSkill(mdContent: string, commandName: string): string {\n const { description, argumentHint, body } = parseFrontmatter(mdContent);\n\n // Convert $ARGUMENTS to {{args}}\n const prompt = body.replace(/\\$ARGUMENTS/g, '{{args}}');\n\n // Extract keywords for trigger conditions\n const keywords = extractKeywords(body, commandName);\n\n // Build SKILL.md content\n const skillContent = `---\nname: ${commandName.replace(/\\//g, '-')}\ndescription: ${description || `Execute ${commandName} task`}\nuser-invocable: true\ndisable-model-invocation: false\nmetadata: {\"openclaw\": {\"always\": true}}\n---\n\n# ${commandName.charAt(0).toUpperCase() + commandName.slice(1).replace(/-/g, ' ')}\n\n## Trigger Conditions\n\nActivate when user mentions:\n${keywords.map(k => `- \"${k}\"`).join('\\n')}\n\n## Input\n${argumentHint ? `Expected input: ${argumentHint.replace('$ARGUMENTS', '{{args}}')}` : 'User provides task description in natural language.'}\n\n## Workflow\n\n${prompt}\n\n## Output Format\n\nProvide clear, actionable response based on the workflow above.\n`;\n\n return skillContent;\n}\n\n/**\n * Convert commands to OpenClaw skills format for Discord\n */\nexport async function convertCommandsToSkills(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'commands');\n const destTypeDir = join(destDir, 'skills');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Get all items if 'all'\n let itemList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n itemList = entries\n .filter(e => e.endsWith('.md') && e !== 'README.md')\n .map(e => e.replace(/\\.md$/, ''));\n // Also get directories (nested commands)\n const dirs = entries.filter(e => {\n const fullPath = join(typeDir, e);\n return fs.statSync(fullPath).isDirectory();\n });\n itemList = [...new Set([...itemList, ...dirs])];\n } else {\n itemList = items;\n }\n\n for (const item of itemList) {\n try {\n const srcPathMd = join(typeDir, item + '.md');\n const srcPathDir = join(typeDir, item);\n\n // Handle .md file → skill directory\n if (fs.existsSync(srcPathMd) && fs.statSync(srcPathMd).isFile()) {\n const skillDir = join(destTypeDir, item.replace(/\\//g, '-'));\n const skillPath = join(skillDir, 'SKILL.md');\n\n if (mergeMode && fs.existsSync(skillPath)) {\n skipped.push(item);\n continue;\n }\n\n await fs.ensureDir(skillDir);\n const mdContent = fs.readFileSync(srcPathMd, 'utf-8');\n const skillContent = convertCommandToSkill(mdContent, item);\n await fs.writeFile(skillPath, skillContent, 'utf-8');\n copied.push(item);\n }\n\n // Handle directory (nested commands) → nested skills\n if (fs.existsSync(srcPathDir) && fs.statSync(srcPathDir).isDirectory()) {\n await convertNestedCommandsToSkills(srcPathDir, destTypeDir, item, mergeMode);\n copied.push(item + '/*');\n }\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Recursively convert nested commands to skills\n */\nasync function convertNestedCommandsToSkills(\n srcDir: string,\n destDir: string,\n parentName: string,\n mergeMode: boolean\n): Promise<void> {\n const entries = fs.readdirSync(srcDir);\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry);\n const stat = fs.statSync(srcPath);\n\n if (stat.isDirectory()) {\n await convertNestedCommandsToSkills(\n srcPath,\n destDir,\n `${parentName}-${entry}`,\n mergeMode\n );\n } else if (entry.endsWith('.md') && entry !== 'README.md') {\n const skillName = `${parentName}-${entry.replace(/\\.md$/, '')}`;\n const skillDir = join(destDir, skillName);\n const skillPath = join(skillDir, 'SKILL.md');\n\n if (mergeMode && fs.existsSync(skillPath)) {\n continue;\n }\n\n await fs.ensureDir(skillDir);\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const skillContent = convertCommandToSkill(mdContent, skillName);\n await fs.writeFile(skillPath, skillContent, 'utf-8');\n }\n }\n}\n\n/**\n * Copy bundled skills (train-prompt, etc.) to Discord target\n */\nexport async function copyBundledSkillsForDiscord(\n destDir: string,\n mergeMode: boolean = false\n): Promise<string[]> {\n const bundledSkillsDir = join(CLI_ROOT, 'templates', 'discord', 'skills');\n const destSkillsDir = join(destDir, 'skills');\n const copied: string[] = [];\n\n if (!fs.existsSync(bundledSkillsDir)) {\n return copied;\n }\n\n await fs.ensureDir(destSkillsDir);\n\n const skills = fs.readdirSync(bundledSkillsDir);\n for (const skill of skills) {\n const srcPath = join(bundledSkillsDir, skill);\n const destPath = join(destSkillsDir, skill);\n\n if (fs.statSync(srcPath).isDirectory()) {\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(skill);\n }\n }\n\n return copied;\n}\n","import { createHash } from 'crypto';\nimport fs from 'fs-extra';\nimport { join, relative } from 'path';\n\n/**\n * Calculate MD5 hash of a file\n */\nexport function hashFile(filePath: string): string | null {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n\n const content = fs.readFileSync(filePath);\n return createHash('md5').update(content).digest('hex');\n}\n\n/**\n * Calculate hashes for all files in a directory\n */\nexport async function hashDirectory(dirPath: string, baseDir: string = dirPath): Promise<Record<string, string>> {\n const hashes: Record<string, string> = {};\n\n if (!fs.existsSync(dirPath)) {\n return hashes;\n }\n\n const items = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const item of items) {\n const itemPath = join(dirPath, item.name);\n const relativePath = relative(baseDir, itemPath);\n\n if (item.isDirectory()) {\n const subHashes = await hashDirectory(itemPath, baseDir);\n Object.assign(hashes, subHashes);\n } else if (item.isFile()) {\n const hash = hashFile(itemPath);\n if (hash) {\n hashes[relativePath] = hash;\n }\n }\n }\n\n return hashes;\n}\n\nexport interface HashComparison {\n unchanged: string[];\n modified: string[];\n added: string[];\n deleted: string[];\n}\n\n/**\n * Compare two hash maps and return differences\n */\nexport function compareHashes(original: Record<string, string>, current: Record<string, string>): HashComparison {\n const result: HashComparison = {\n unchanged: [],\n modified: [],\n added: [],\n deleted: []\n };\n\n // Check original files\n for (const [path, hash] of Object.entries(original)) {\n if (current[path] === undefined) {\n result.deleted.push(path);\n } else if (current[path] !== hash) {\n result.modified.push(path);\n } else {\n result.unchanged.push(path);\n }\n }\n\n // Check for new files\n for (const path of Object.keys(current)) {\n if (original[path] === undefined) {\n result.added.push(path);\n }\n }\n\n return result;\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport { hashDirectory } from './hash.js';\n\nconst STATE_DIR = '.ak';\nconst STATE_FILE = 'state.json';\n\nexport interface ProjectState {\n version: string;\n createdAt: string;\n lastUpdate: string;\n kit: string;\n source: string;\n target: string;\n targets?: string[]; // Multiple CLI targets (claude, gemini)\n installed: {\n agents?: string[];\n skills?: string[];\n commands?: string[];\n workflows?: string[];\n router?: boolean;\n hooks?: boolean;\n };\n originalHashes: Record<string, string>;\n}\n\n/**\n * Get state file path\n */\nexport function getStatePath(projectDir: string): string {\n return join(projectDir, STATE_DIR, STATE_FILE);\n}\n\n/**\n * Load state from .ak/state.json\n */\nexport async function loadState(projectDir: string): Promise<ProjectState | null> {\n const statePath = getStatePath(projectDir);\n\n if (!fs.existsSync(statePath)) {\n return null;\n }\n\n try {\n return await fs.readJson(statePath);\n } catch {\n return null;\n }\n}\n\n/**\n * Save state to .ak/state.json\n */\nexport async function saveState(projectDir: string, state: ProjectState): Promise<void> {\n const stateDir = join(projectDir, STATE_DIR);\n const statePath = join(stateDir, STATE_FILE);\n\n await fs.ensureDir(stateDir);\n await fs.writeJson(statePath, state, { spaces: 2 });\n}\n\nexport interface CreateStateOptions {\n kit: string;\n source: string;\n target: string;\n targets?: string[];\n installed: ProjectState['installed'];\n}\n\n/**\n * Create initial state after init\n */\nexport async function createInitialState(projectDir: string, options: CreateStateOptions): Promise<ProjectState> {\n const { kit, source, target, targets, installed } = options;\n\n // Calculate hashes for all target directories\n const allHashes: Record<string, string> = {};\n const targetList = targets || [target.replace('.', '')]; // fallback to single target\n\n for (const t of targetList) {\n const targetDirName = t.startsWith('.') ? t : `.${t}`;\n const targetDir = join(projectDir, targetDirName);\n if (fs.existsSync(targetDir)) {\n const hashes = await hashDirectory(targetDir);\n // Prefix hashes with target name for uniqueness\n for (const [path, hash] of Object.entries(hashes)) {\n allHashes[`${targetDirName}/${path}`] = hash;\n }\n }\n }\n\n const state: ProjectState = {\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n lastUpdate: new Date().toISOString(),\n kit,\n source,\n target,\n targets,\n installed,\n originalHashes: allHashes\n };\n\n await saveState(projectDir, state);\n return state;\n}\n\n/**\n * Update state after update command\n */\nexport async function updateState(projectDir: string, updates: Partial<ProjectState>): Promise<ProjectState> {\n const state = await loadState(projectDir);\n\n if (!state) {\n throw new Error('No state found. Is this an ak project?');\n }\n\n const targetDir = join(projectDir, state.target || '.claude');\n const newHashes = await hashDirectory(targetDir);\n\n const updatedState: ProjectState = {\n ...state,\n ...updates,\n lastUpdate: new Date().toISOString(),\n originalHashes: newHashes\n };\n\n await saveState(projectDir, updatedState);\n return updatedState;\n}\n\nexport interface FileStatuses {\n state: ProjectState;\n statuses: {\n unchanged: string[];\n modified: string[];\n added: string[];\n deleted: string[];\n };\n targetDir: string;\n}\n\nexport interface FileStatusError {\n error: string;\n}\n\n/**\n * Get file status (unchanged, modified, added, deleted)\n */\nexport async function getFileStatuses(projectDir: string): Promise<FileStatuses | FileStatusError> {\n const state = await loadState(projectDir);\n\n if (!state) {\n return { error: 'No state found' };\n }\n\n const targetDir = join(projectDir, state.target || '.claude');\n const currentHashes = await hashDirectory(targetDir);\n const originalHashes = state.originalHashes || {};\n\n const statuses = {\n unchanged: [] as string[],\n modified: [] as string[],\n added: [] as string[],\n deleted: [] as string[]\n };\n\n // Check original files\n for (const [path, hash] of Object.entries(originalHashes)) {\n if (currentHashes[path] === undefined) {\n statuses.deleted.push(path);\n } else if (currentHashes[path] !== hash) {\n statuses.modified.push(path);\n } else {\n statuses.unchanged.push(path);\n }\n }\n\n // Check for new files\n for (const path of Object.keys(currentHashes)) {\n if (originalHashes[path] === undefined) {\n statuses.added.push(path);\n }\n }\n\n return {\n state,\n statuses,\n targetDir\n };\n}\n","import * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { getKitList } from '../kits/index.js';\nimport { listAvailable } from './copy.js';\nimport type { CliTarget } from './paths.js';\n\nexport async function promptProjectName(): Promise<string> {\n const name = await p.text({\n message: 'Project name:',\n placeholder: 'my-project',\n validate: (value) => {\n if (!value || !value.trim()) return 'Project name is required';\n if (!/^[a-zA-Z0-9-_]+$/.test(String(value))) return 'Only letters, numbers, dashes, underscores';\n }\n });\n if (p.isCancel(name)) process.exit(0);\n return name as string;\n}\n\nexport async function promptKit(): Promise<string> {\n const kits = getKitList();\n const options = [\n ...kits.map((kit) => ({\n value: kit.name,\n label: `${kit.emoji} ${kit.name}`,\n hint: kit.description\n })),\n { value: 'custom', label: '🔧 custom', hint: 'Pick your own agents, skills, and commands' }\n ];\n const kit = await p.select({ message: 'Select a kit:', options });\n if (p.isCancel(kit)) process.exit(0);\n return kit as string;\n}\n\nexport async function promptTarget(): Promise<string> {\n const target = await p.select({\n message: 'Target folder:',\n options: [\n { value: 'claude', label: '.claude/', hint: 'Claude Code' },\n { value: 'gemini', label: '.gemini/', hint: 'Gemini CLI' },\n { value: 'opencode', label: '.opencode/', hint: 'OpenCode' },\n { value: 'generic', label: '.agent/', hint: 'Generic' }\n ]\n });\n if (p.isCancel(target)) process.exit(0);\n return target as string;\n}\n\nexport async function promptCliTargets(): Promise<CliTarget[]> {\n const selection = await p.multiselect({\n message: 'Select AI CLI target(s):',\n options: [\n { value: 'claude', label: 'Claude Code', hint: '.claude/' },\n { value: 'gemini', label: 'Gemini CLI', hint: '.gemini/' },\n { value: 'discord', label: 'Discord + Clawbot', hint: '.discord/' }\n ],\n initialValues: ['claude'],\n required: true\n });\n if (p.isCancel(selection)) process.exit(0);\n\n return selection as CliTarget[];\n}\n\nexport async function promptAgents(sourceDir: string): Promise<string[]> {\n const available = listAvailable('agents', sourceDir);\n if (available.length === 0) return [];\n const selected = await p.multiselect({\n message: 'Select agents:',\n options: available.map((item) => ({\n value: item.name,\n label: item.name,\n hint: ['planner', 'debugger'].includes(item.name) ? '(recommended)' : undefined\n })),\n initialValues: ['planner', 'debugger'].filter(n => available.some((a) => a.name === n))\n });\n if (p.isCancel(selected)) process.exit(0);\n return selected as string[];\n}\n\nexport async function promptSkills(sourceDir: string): Promise<string[]> {\n const available = listAvailable('skills', sourceDir).filter((s) => s.isDir);\n if (available.length === 0) return [];\n const selected = await p.multiselect({\n message: 'Select skills:',\n options: available.map((item) => ({\n value: item.name,\n label: item.name,\n hint: ['planning', 'debugging'].includes(item.name) ? '(recommended)' : undefined\n })),\n initialValues: ['planning', 'debugging'].filter(n => available.some((a) => a.name === n))\n });\n if (p.isCancel(selected)) process.exit(0);\n return selected as string[];\n}\n\nexport async function promptCommands(sourceDir: string): Promise<string[]> {\n const available = listAvailable('commands', sourceDir);\n if (available.length === 0) return [];\n const selected = await p.multiselect({\n message: 'Select commands:',\n options: available.map((item) => ({\n value: item.name,\n label: item.name,\n hint: ['plan', 'fix', 'code'].includes(item.name) ? '(recommended)' : undefined\n })),\n initialValues: ['plan', 'fix', 'code'].filter(n => available.some((a) => a.name === n))\n });\n if (p.isCancel(selected)) process.exit(0);\n return selected as string[];\n}\n\nexport async function promptIncludeRouter(): Promise<boolean> {\n const result = await p.confirm({ message: 'Include router?', initialValue: true });\n if (p.isCancel(result)) process.exit(0);\n return result as boolean;\n}\n\nexport async function promptIncludeHooks(): Promise<boolean> {\n const result = await p.confirm({ message: 'Include hooks?', initialValue: false });\n if (p.isCancel(result)) process.exit(0);\n return result as boolean;\n}\n\nexport async function promptConfirm(message: string, defaultValue: boolean = true): Promise<boolean> {\n const result = await p.confirm({ message, initialValue: defaultValue });\n if (p.isCancel(result)) process.exit(0);\n return result as boolean;\n}\n\nexport async function promptExistingTarget(targetPath: string): Promise<string> {\n const action = await p.select({\n message: `${targetPath} already exists. What do you want to do?`,\n options: [\n { value: 'override', label: 'Override', hint: 'Replace all files' },\n { value: 'merge', label: 'Merge', hint: 'Only add missing files' },\n { value: 'skip', label: 'Skip', hint: 'Do nothing' }\n ]\n });\n if (p.isCancel(action)) process.exit(0);\n return action as string;\n}\n\nexport async function promptUpdateConfirm(updates: { toUpdate: string[]; skipped: string[] }): Promise<boolean> {\n console.log(pc.cyan('\\nChanges to apply:'));\n if (updates.toUpdate.length > 0) {\n console.log(pc.green(' Will update:'));\n updates.toUpdate.slice(0, 10).forEach(f => console.log(pc.green(` ✓ ${f}`)));\n if (updates.toUpdate.length > 10) console.log(pc.gray(` ... and ${updates.toUpdate.length - 10} more`));\n }\n if (updates.skipped.length > 0) {\n console.log(pc.yellow(' Will skip (modified locally):'));\n updates.skipped.slice(0, 5).forEach(f => console.log(pc.yellow(` ~ ${f}`)));\n if (updates.skipped.length > 5) console.log(pc.gray(` ... and ${updates.skipped.length - 5} more`));\n }\n console.log('');\n return promptConfirm('Apply these updates?', true);\n}\n\nexport interface DiscordConfig {\n token: string;\n guildId?: string;\n autoSetup: boolean;\n openclawInstalled: boolean;\n restartOnly?: boolean;\n}\n\nfunction isOpenClawInstalled(): boolean {\n try {\n const { execSync } = require('child_process');\n execSync('which openclaw', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isDiscordConfigured(): boolean {\n try {\n const { execSync } = require('child_process');\n const result = execSync('openclaw config get channels.discord.token 2>/dev/null', { encoding: 'utf-8' });\n return result && result.trim().length > 10;\n } catch {\n return false;\n }\n}\n\nfunction restartGateway(): boolean {\n try {\n const { execSync } = require('child_process');\n console.log(pc.cyan('Restarting OpenClaw gateway...'));\n execSync('openclaw gateway restart', { stdio: 'inherit' });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function installOpenClaw(): Promise<boolean> {\n const { execSync } = require('child_process');\n try {\n console.log(pc.cyan('Installing OpenClaw CLI...'));\n execSync('npm install -g openclaw', { stdio: 'inherit' });\n console.log(pc.green('✓ OpenClaw CLI installed successfully!'));\n console.log('');\n return true;\n } catch (error) {\n console.log(pc.red('✗ Failed to install OpenClaw CLI'));\n console.log(pc.gray(' Try manually: npm install -g openclaw'));\n console.log('');\n return false;\n }\n}\n\nexport async function promptDiscordSetup(): Promise<DiscordConfig> {\n console.log('');\n console.log(pc.cyan('━━━ Discord Bot Setup ━━━'));\n\n // Check if openclaw is installed\n let openclawInstalled = isOpenClawInstalled();\n if (!openclawInstalled) {\n console.log(pc.yellow('⚠ OpenClaw CLI not found.'));\n console.log('');\n\n const shouldInstall = await p.confirm({\n message: 'Install OpenClaw CLI now? (npm install -g openclaw)',\n initialValue: true\n });\n if (p.isCancel(shouldInstall)) process.exit(0);\n\n if (shouldInstall) {\n openclawInstalled = await installOpenClaw();\n }\n }\n\n // Check if Discord is already configured\n if (openclawInstalled && isDiscordConfigured()) {\n console.log(pc.green('✓ Discord bot token already configured.'));\n console.log('');\n\n const action = await p.select({\n message: 'What do you want to do?',\n options: [\n { value: 'restart', label: 'Restart gateway', hint: 'Use existing config' },\n { value: 'reconfigure', label: 'Reconfigure', hint: 'Enter new token' },\n { value: 'skip', label: 'Skip setup', hint: 'Continue without changes' }\n ]\n });\n if (p.isCancel(action)) process.exit(0);\n\n if (action === 'restart') {\n restartGateway();\n return {\n token: '',\n autoSetup: false,\n openclawInstalled: true,\n restartOnly: true\n };\n }\n\n if (action === 'skip') {\n return {\n token: '',\n autoSetup: false,\n openclawInstalled: true,\n restartOnly: true\n };\n }\n }\n\n console.log(pc.gray('Get your bot token from: https://discord.com/developers/applications'));\n console.log('');\n\n const token = await p.password({\n message: 'Discord Bot Token:',\n mask: '*',\n validate: (value) => {\n if (!value || !value.trim()) return 'Bot token is required';\n if (value.length < 50) return 'Invalid token format';\n }\n });\n if (p.isCancel(token)) process.exit(0);\n\n const hasGuild = await p.confirm({\n message: 'Do you have a Discord Server ID to configure?',\n initialValue: false\n });\n if (p.isCancel(hasGuild)) process.exit(0);\n\n let guildId: string | undefined;\n if (hasGuild) {\n const guild = await p.text({\n message: 'Discord Server ID:',\n placeholder: '123456789012345678',\n validate: (value) => {\n if (!value || !value.trim()) return 'Server ID is required';\n if (!/^\\d{17,20}$/.test(String(value))) return 'Invalid Server ID format (should be 17-20 digits)';\n }\n });\n if (p.isCancel(guild)) process.exit(0);\n guildId = guild as string;\n }\n\n // Only ask for auto-setup if openclaw is installed\n let autoSetup = false;\n if (openclawInstalled) {\n const shouldAutoSetup = await p.confirm({\n message: 'Auto-setup OpenClaw config?',\n initialValue: true\n });\n if (p.isCancel(shouldAutoSetup)) process.exit(0);\n autoSetup = shouldAutoSetup as boolean;\n }\n\n return {\n token: token as string,\n guildId,\n autoSetup,\n openclawInstalled\n };\n}\n","import fs from 'fs-extra';\nimport { join, resolve } from 'path';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { KITS, getKit } from '../kits/index.js';\nimport { resolveSource, getTargetDir, TARGETS, getGlobalInstallPath, type CliTarget } from '../utils/paths.js';\nimport { copyItems, copyAllOfType, copyRouter, copyHooks, copyBaseFiles, copyAgentsMd, copyDirectory, copyCommandsForGemini, copySkillsForGemini, copyAgentsForGemini, copyGeminiBaseFiles, copyAgentsForDiscord, copyCommandsForDiscord, copySkillsForDiscord, copyDiscordBaseFiles, convertCommandsToSkills, copyBundledSkillsForDiscord, updateDiscordConfig, setupOpenClawConfig } from '../utils/copy.js';\nimport { createInitialState } from '../utils/state.js';\nimport {\n promptProjectName,\n promptKit,\n promptTarget,\n promptAgents,\n promptSkills,\n promptCommands,\n promptIncludeRouter,\n promptIncludeHooks,\n promptConfirm,\n promptExistingTarget,\n promptCliTargets,\n promptDiscordSetup,\n type DiscordConfig\n} from '../utils/prompts.js';\n\n/**\n * Filter components based on --exclude and --only patterns\n */\nfunction filterComponents(list: string[] | 'all', exclude?: string, only?: string): string[] | 'all' {\n if (!list || list === 'all') return list;\n let filtered = [...list];\n\n if (only) {\n const patterns = only.split(',').map(s => s.trim());\n filtered = filtered.filter(item => patterns.some(p => item.includes(p)));\n }\n\n if (exclude) {\n const patterns = exclude.split(',').map(s => s.trim());\n filtered = filtered.filter(item => !patterns.some(p => item.includes(p)));\n }\n\n return filtered;\n}\n\nconst INIT_PASSWORD = '6702';\n\nexport async function initCommand(projectName: string | undefined, options: Record<string, any>): Promise<void> {\n console.log('');\n\n // Password protection\n if (options.password !== undefined) {\n // Password provided via CLI flag (convert to string for comparison)\n if (String(options.password) !== INIT_PASSWORD) {\n console.log(pc.red('Invalid access code. Access denied.'));\n return;\n }\n } else if (process.stdin.isTTY && !options.yes) {\n // Interactive mode - prompt for password\n const { password } = await import('@clack/prompts').then(p => ({\n password: p.password\n }));\n const inputPassword = await password({\n message: 'Enter access code:',\n mask: '*'\n });\n if (inputPassword !== INIT_PASSWORD) {\n console.log(pc.red('Invalid access code. Access denied.'));\n return;\n }\n } else {\n // Non-interactive mode without password\n console.log(pc.red('Access code required. Use --password <code>'));\n return;\n }\n\n // 1. Get project name (support current directory with \".\" or empty)\n let projectDir: string;\n let isCurrentDir = false;\n\n // Handle --global flag\n if (options.global) {\n projectDir = getGlobalInstallPath();\n isCurrentDir = true;\n console.log(pc.cyan(`Installing globally to ${projectDir}`));\n } else if (!projectName || projectName === '.') {\n // Use current directory\n projectDir = process.cwd();\n projectName = '.';\n isCurrentDir = true;\n console.log(pc.gray(`Initializing in current directory: ${projectDir}`));\n } else {\n projectDir = resolve(process.cwd(), projectName);\n }\n\n // 2. Get CLI targets (Claude, Gemini, Discord, or combination)\n let cliTargets: CliTarget[];\n if (options.target) {\n // Support comma-separated targets: --target claude,gemini,discord\n const targetsFromFlag = options.target.split(',').map((t: string) => t.trim()) as CliTarget[];\n cliTargets = targetsFromFlag.filter(t => t === 'claude' || t === 'gemini' || t === 'discord');\n if (cliTargets.length === 0) {\n console.log(pc.yellow(`Unknown target \"${options.target}\", using \"claude\"`));\n cliTargets = ['claude'];\n }\n } else if (!process.stdin.isTTY || options.yes) {\n cliTargets = ['claude'];\n } else {\n cliTargets = await promptCliTargets();\n }\n\n // Discord setup - prompt for token if Discord is selected\n let discordConfig: DiscordConfig | null = null;\n let openclawSetupSuccess = false;\n if (cliTargets.includes('discord') && process.stdin.isTTY && !options.yes) {\n discordConfig = await promptDiscordSetup();\n }\n\n // Check existing for each target\n let existingAction: string | null = null;\n const existingTargets: string[] = [];\n\n for (const target of cliTargets) {\n const targetDir = getTargetDir(projectDir, target);\n\n // Handle --fresh flag (remove existing installation)\n if (options.fresh && fs.existsSync(targetDir)) {\n await fs.remove(targetDir);\n existingTargets.push(TARGETS[target]);\n } else if (fs.existsSync(targetDir) && !options.force) {\n existingTargets.push(TARGETS[target]);\n }\n }\n\n if (options.fresh && existingTargets.length > 0) {\n const akDir = join(projectDir, '.ak');\n if (fs.existsSync(akDir)) {\n await fs.remove(akDir);\n }\n console.log(pc.cyan(`Fresh install: removed existing files (${existingTargets.join(', ')})`));\n existingAction = null;\n } else if (existingTargets.length > 0 && !options.force) {\n if (!process.stdin.isTTY || options.yes) {\n if (options.yes) {\n existingAction = 'override';\n } else {\n console.log(pc.yellow(`${existingTargets.join(', ')} already exists. Use --force to override.`));\n return;\n }\n } else {\n existingAction = await promptExistingTarget(existingTargets.join(', '));\n\n if (existingAction === 'skip') {\n console.log(pc.yellow('Skipped. No changes made.'));\n return;\n }\n }\n }\n\n // For new project directory, check if it exists\n if (!isCurrentDir && fs.existsSync(projectDir) && !options.force) {\n const files = fs.readdirSync(projectDir);\n if (files.length > 0 && !existingAction) {\n console.log(pc.red(`Directory \"${projectName}\" already exists and is not empty.`));\n console.log(pc.gray('Use --force to overwrite.'));\n return;\n }\n }\n\n // 3. Resolve source\n const source = resolveSource(options.source);\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n return;\n }\n\n console.log(pc.gray(`Source: ${source.path}`));\n\n // 4. Get kit\n let kitName = options.kit;\n if (!kitName && !options.force && !options.yes) {\n kitName = await promptKit();\n } else if (!kitName) {\n kitName = 'engineer'; // Default kit for --force/--yes mode\n }\n\n // 5. Set merge mode based on existing action\n const mergeMode = existingAction === 'merge';\n\n // 6. Prepare what to install\n let toInstall: {\n agents: string[] | 'all';\n commands: string[] | 'all';\n skills: string[] | 'all';\n workflows: string[] | 'all';\n includeRouter: boolean;\n includeHooks: boolean;\n } = {\n agents: [],\n commands: [],\n skills: [],\n workflows: [],\n includeRouter: false,\n includeHooks: false\n };\n\n if (kitName === 'custom' && !options.yes) {\n // Custom mode - prompt for everything (unless --yes is set)\n console.log(pc.cyan('\\nCustom kit configuration:'));\n toInstall.agents = await promptAgents(source.claudeDir);\n toInstall.skills = await promptSkills(source.claudeDir);\n toInstall.commands = await promptCommands(source.claudeDir);\n toInstall.includeRouter = await promptIncludeRouter();\n toInstall.includeHooks = await promptIncludeHooks();\n } else {\n const kit = getKit(kitName);\n if (!kit) {\n console.log(pc.red(`Unknown kit: ${kitName}`));\n console.log(pc.gray(`Available kits: ${Object.keys(KITS).join(', ')}`));\n return;\n }\n\n toInstall = {\n agents: kit.agents,\n commands: kit.commands,\n skills: kit.skills,\n workflows: kit.workflows || [],\n includeRouter: kit.includeRouter,\n includeHooks: kit.includeHooks\n };\n }\n\n // Apply --exclude and --only filters\n if (options.exclude || options.only) {\n toInstall.agents = filterComponents(toInstall.agents, options.exclude, options.only);\n toInstall.skills = filterComponents(toInstall.skills, options.exclude, options.only);\n toInstall.commands = filterComponents(toInstall.commands, options.exclude, options.only);\n toInstall.workflows = filterComponents(toInstall.workflows, options.exclude, options.only);\n }\n\n // 6. Confirm\n console.log(pc.cyan('\\nWill create:'));\n console.log(pc.white(` Project: ${projectName}/`));\n console.log(pc.white(` Targets: ${cliTargets.map(t => TARGETS[t]).join(', ')}/`));\n console.log(pc.white(` Kit: ${kitName}`));\n\n if (Array.isArray(toInstall.agents)) {\n console.log(pc.gray(` Agents: ${toInstall.agents.length}`));\n }\n if (Array.isArray(toInstall.skills)) {\n console.log(pc.gray(` Skills: ${toInstall.skills.length}`));\n }\n if (Array.isArray(toInstall.commands)) {\n console.log(pc.gray(` Commands: ${toInstall.commands.length}`));\n }\n\n console.log('');\n\n // Skip confirmation if --force or --yes is set\n if (!options.force && !options.yes) {\n if (!await promptConfirm('Proceed?')) {\n console.log(pc.yellow('Cancelled.'));\n return;\n }\n }\n\n // 7. Create project\n const spinner = ora('Creating project...').start();\n\n try {\n // Create project directory\n await fs.ensureDir(projectDir);\n\n // Install for each CLI target\n for (const target of cliTargets) {\n const targetDir = getTargetDir(projectDir, target);\n await fs.ensureDir(targetDir);\n\n const targetLabel = target === 'gemini' ? 'Gemini' : target === 'discord' ? 'Discord' : 'Claude';\n\n // Copy agents\n spinner.text = mergeMode ? `Merging agents (${targetLabel})...` : `Copying agents (${targetLabel})...`;\n if (target === 'gemini') {\n // Convert Claude agent format to Gemini (map model names)\n await copyAgentsForGemini(toInstall.agents, source.claudeDir, targetDir, mergeMode);\n } else if (target === 'discord') {\n // Convert Claude agent format to Discord/Clawbot\n await copyAgentsForDiscord(toInstall.agents, source.claudeDir, targetDir, mergeMode);\n } else {\n if (toInstall.agents === 'all') {\n await copyAllOfType('agents', source.claudeDir, targetDir, mergeMode);\n } else if (toInstall.agents.length > 0) {\n await copyItems(toInstall.agents, 'agents', source.claudeDir, targetDir, mergeMode);\n }\n }\n\n // Copy skills\n spinner.text = mergeMode ? `Merging skills (${targetLabel})...` : `Copying skills (${targetLabel})...`;\n if (target === 'gemini') {\n await copySkillsForGemini(toInstall.skills, source.claudeDir, targetDir, mergeMode);\n } else if (target === 'discord') {\n await copySkillsForDiscord(toInstall.skills, source.claudeDir, targetDir, mergeMode);\n } else {\n if (toInstall.skills === 'all') {\n await copyAllOfType('skills', source.claudeDir, targetDir, mergeMode);\n } else if (toInstall.skills.length > 0) {\n await copyItems(toInstall.skills, 'skills', source.claudeDir, targetDir, mergeMode);\n }\n }\n\n // Copy commands\n spinner.text = mergeMode ? `Merging commands (${targetLabel})...` : `Copying commands (${targetLabel})...`;\n if (target === 'gemini') {\n // Convert MD to TOML for Gemini\n await copyCommandsForGemini(toInstall.commands, source.claudeDir, targetDir, mergeMode);\n } else if (target === 'discord') {\n // Convert to Discord/Clawbot format + generate commands.json5\n await copyCommandsForDiscord(toInstall.commands, source.claudeDir, targetDir, mergeMode);\n // Also convert commands to OpenClaw skills format\n spinner.text = mergeMode ? `Converting commands to skills (${targetLabel})...` : `Converting commands to skills (${targetLabel})...`;\n await convertCommandsToSkills(toInstall.commands, source.claudeDir, targetDir, mergeMode);\n // Copy bundled skills (train-prompt, etc.)\n spinner.text = `Copying bundled skills (${targetLabel})...`;\n await copyBundledSkillsForDiscord(targetDir, mergeMode);\n } else {\n if (toInstall.commands === 'all') {\n await copyAllOfType('commands', source.claudeDir, targetDir, mergeMode);\n } else if (toInstall.commands.length > 0) {\n await copyItems(toInstall.commands, 'commands', source.claudeDir, targetDir, mergeMode);\n }\n }\n\n // Copy workflows (Claude only)\n if (target === 'claude') {\n spinner.text = mergeMode ? `Merging workflows (${targetLabel})...` : `Copying workflows (${targetLabel})...`;\n if (toInstall.workflows === 'all') {\n await copyAllOfType('workflows', source.claudeDir, targetDir, mergeMode);\n } else if (toInstall.workflows && toInstall.workflows.length > 0) {\n await copyItems(toInstall.workflows, 'workflows', source.claudeDir, targetDir, mergeMode);\n }\n }\n\n // Copy router (Claude only)\n if (target === 'claude' && toInstall.includeRouter) {\n spinner.text = mergeMode ? `Merging router (${targetLabel})...` : `Copying router (${targetLabel})...`;\n await copyRouter(source.claudeDir, targetDir, mergeMode);\n }\n\n // Copy hooks (Claude only)\n if (target === 'claude' && toInstall.includeHooks) {\n spinner.text = mergeMode ? `Merging hooks (${targetLabel})...` : `Copying hooks (${targetLabel})...`;\n await copyHooks(source.claudeDir, targetDir, mergeMode);\n }\n\n // Copy extra directories and base files\n if (target === 'claude') {\n spinner.text = mergeMode ? `Merging extras (${targetLabel})...` : `Copying extras (${targetLabel})...`;\n await copyDirectory('memory', source.claudeDir, targetDir, mergeMode);\n await copyDirectory('output-styles', source.claudeDir, targetDir, mergeMode);\n await copyDirectory('scripts', source.claudeDir, targetDir, mergeMode);\n // Copy base files (includes statusline files)\n spinner.text = mergeMode ? `Merging base files (${targetLabel})...` : `Copying base files (${targetLabel})...`;\n await copyBaseFiles(source.claudeDir, targetDir, mergeMode);\n } else if (target === 'gemini') {\n // Copy Gemini settings.json (with plan mode & subagents enabled)\n spinner.text = mergeMode ? `Merging settings (${targetLabel})...` : `Copying settings (${targetLabel})...`;\n await copyGeminiBaseFiles(targetDir, mergeMode);\n } else if (target === 'discord') {\n // Copy Discord/Clawbot config files\n spinner.text = mergeMode ? `Merging config (${targetLabel})...` : `Copying config (${targetLabel})...`;\n await copyDiscordBaseFiles(targetDir, mergeMode);\n\n // Apply Discord config if provided (skip if restartOnly)\n if (discordConfig && !discordConfig.restartOnly) {\n spinner.text = 'Configuring Discord bot...';\n await updateDiscordConfig(targetDir, discordConfig.token, discordConfig.guildId);\n\n // Auto-setup OpenClaw if requested\n if (discordConfig.autoSetup) {\n spinner.text = 'Setting up OpenClaw...';\n const result = await setupOpenClawConfig(discordConfig.token);\n openclawSetupSuccess = result.success;\n if (!result.success) {\n console.log(pc.yellow(`\\n Note: ${result.message}`));\n }\n }\n } else if (discordConfig?.restartOnly) {\n openclawSetupSuccess = true; // Already configured\n }\n }\n }\n\n // Copy AGENTS.md (project root)\n if (source.agentsMd && cliTargets.includes('claude')) {\n await copyAgentsMd(source.agentsMd, projectDir, mergeMode);\n }\n\n // Create state file\n spinner.text = 'Saving state...';\n await createInitialState(projectDir, {\n kit: kitName,\n source: source.path,\n targets: cliTargets,\n target: TARGETS[cliTargets[0]], // Keep backward compat\n installed: {\n agents: toInstall.agents === 'all' ? ['all'] : toInstall.agents,\n skills: toInstall.skills === 'all' ? ['all'] : toInstall.skills,\n commands: toInstall.commands === 'all' ? ['all'] : toInstall.commands,\n workflows: toInstall.workflows === 'all' ? ['all'] : (toInstall.workflows || []),\n router: toInstall.includeRouter,\n hooks: toInstall.includeHooks\n }\n });\n\n const actionWord = mergeMode ? 'merged' : (existingAction === 'override' ? 'overridden' : 'created');\n spinner.succeed(pc.green(`Project ${actionWord} successfully!`));\n\n // Print next steps\n console.log('');\n if (!isCurrentDir) {\n console.log(pc.cyan('Next steps:'));\n console.log(pc.white(` cd ${projectName}`));\n }\n\n const targetNames = cliTargets.map(t => {\n if (t === 'gemini') return 'Gemini CLI';\n if (t === 'discord') return 'Discord + Clawbot';\n return 'Claude Code';\n }).join(' & ');\n console.log(pc.cyan(`Ready to code with ${targetNames}!`));\n\n console.log('');\n console.log(pc.gray('Useful commands:'));\n console.log(pc.gray(' ak status - Check file status'));\n console.log(pc.gray(' ak add <item> - Add more agents/skills'));\n console.log(pc.gray(' ak update - Sync from source'));\n\n // Discord-specific next steps\n if (cliTargets.includes('discord')) {\n console.log('');\n console.log(pc.cyan('Discord Bot Setup:'));\n\n // Use openclawInstalled from discordConfig (tracks if user installed during setup)\n const openclawInstalled = discordConfig?.openclawInstalled ?? false;\n\n if (!openclawInstalled) {\n console.log(pc.yellow(' 0. npm install -g openclaw - Install OpenClaw CLI first!'));\n console.log(pc.white(' 1. openclaw gateway - Start the bot'));\n console.log(pc.white(' 2. Invite bot to server - Use OAuth2 URL from Discord Portal'));\n console.log(pc.white(' 3. DM the bot to pair - Approve with: openclaw pairing approve discord <code>'));\n } else {\n if (openclawSetupSuccess) {\n console.log(pc.green(' ✓ OpenClaw installed & configured'));\n } else {\n console.log(pc.green(' ✓ OpenClaw installed'));\n }\n console.log(pc.white(' 1. openclaw gateway - Start the bot'));\n console.log(pc.white(' 2. Invite bot to server - Use OAuth2 URL from Discord Portal'));\n console.log(pc.white(' 3. DM the bot to pair - Approve with: openclaw pairing approve discord <code>'));\n }\n console.log(pc.gray(' See .discord/README.md for full guide'));\n }\n console.log('');\n\n } catch (error: any) {\n spinner.fail(pc.red('Failed to create project'));\n console.error(pc.red(error.message));\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n }\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { resolveSource, isAkProject } from '../utils/paths.js';\nimport { copyItems, listAvailable } from '../utils/copy.js';\nimport { loadState, updateState } from '../utils/state.js';\nimport { hashDirectory } from '../utils/hash.js';\n\nexport async function addCommand(item: string, options: Record<string, any> = {}): Promise<void> {\n // Parse item format: type:name (e.g., skill:databases, agent:debugger)\n const parts = item.split(':');\n if (parts.length !== 2) {\n console.log(pc.red('Invalid format. Use: ak add <type>:<name>'));\n console.log(pc.gray('Examples:'));\n console.log(pc.gray(' ak add skill:databases'));\n console.log(pc.gray(' ak add agent:debugger'));\n console.log(pc.gray(' ak add command:fix/ci'));\n return;\n }\n\n const [type, name] = parts;\n const validTypes = ['agent', 'agents', 'skill', 'skills', 'command', 'commands', 'workflow', 'workflows'];\n\n if (!validTypes.includes(type)) {\n console.log(pc.red(`Invalid type: ${type}`));\n console.log(pc.gray(`Valid types: agent, skill, command, workflow`));\n return;\n }\n\n // Normalize type to plural\n const typeMap: Record<string, string> = {\n agent: 'agents',\n agents: 'agents',\n skill: 'skills',\n skills: 'skills',\n command: 'commands',\n commands: 'commands',\n workflow: 'workflows',\n workflows: 'workflows'\n };\n const normalizedType = typeMap[type];\n\n const projectDir = options.path || process.cwd();\n\n // Check if in ak project\n if (!isAkProject(projectDir)) {\n console.log(pc.red('Not in an ak project.'));\n console.log(pc.gray('Run \"ak init\" first or use --path to specify project directory.'));\n return;\n }\n\n // Load state\n const state = await loadState(projectDir);\n if (!state) {\n console.log(pc.yellow('Warning: No state file found. Creating fresh state after add.'));\n }\n\n // Resolve source\n const sourceFlag = options.source || (state ? state.source : null);\n const source = resolveSource(sourceFlag);\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n return;\n }\n\n // Check if item exists in source\n const available = listAvailable(normalizedType, source.claudeDir);\n const exists = available.some(a => a.name === name);\n\n if (!exists) {\n console.log(pc.red(`${type} \"${name}\" not found in source.`));\n console.log(pc.gray(`Use \"ak list ${normalizedType}\" to see available options.`));\n return;\n }\n\n // Determine target directory\n const targetFolder = state?.target || '.claude';\n const targetDir = join(projectDir, targetFolder);\n\n // Check if already installed\n const destPath = join(targetDir, normalizedType, name);\n const destPathMd = destPath + '.md';\n if (fs.existsSync(destPath) || fs.existsSync(destPathMd)) {\n console.log(pc.yellow(`${type} \"${name}\" already exists in project.`));\n console.log(pc.gray('Use \"ak update\" to refresh from source.'));\n return;\n }\n\n // Copy\n const spinner = ora(`Adding ${type} \"${name}\"...`).start();\n\n try {\n const result = await copyItems([name], normalizedType, source.claudeDir, targetDir);\n\n if (result.copied.length > 0) {\n spinner.succeed(pc.green(`Added ${type}: ${name}`));\n\n // Update state\n if (state) {\n const installed = state.installed || {};\n const typeArray = installed[normalizedType as keyof typeof installed];\n if (!typeArray) {\n (installed as any)[normalizedType] = [name];\n } else if (Array.isArray(typeArray) && !typeArray.includes(name)) {\n typeArray.push(name);\n }\n\n // Recalculate hashes\n const newHashes = await hashDirectory(targetDir);\n\n await updateState(projectDir, {\n installed,\n originalHashes: newHashes\n });\n }\n\n console.log(pc.gray(`Location: ${targetFolder}/${normalizedType}/${name}`));\n } else if (result.skipped.length > 0) {\n spinner.fail(pc.red(`Could not find ${type}: ${name}`));\n } else if (result.errors.length > 0) {\n spinner.fail(pc.red(`Error adding ${type}: ${result.errors[0].error}`));\n }\n } catch (error: any) {\n spinner.fail(pc.red(`Failed to add ${type}`));\n console.error(pc.red(error.message));\n }\n}\n","import pc from 'picocolors';\nimport { getKitList } from '../kits/index.js';\nimport { resolveSource } from '../utils/paths.js';\nimport { listAvailable, type AvailableItem } from '../utils/copy.js';\n\nexport async function listCommand(type: string | undefined, options: Record<string, any> = {}): Promise<void> {\n const validTypes = ['kits', 'agents', 'skills', 'commands', 'workflows'];\n\n // If no type specified, show help\n if (!type) {\n console.log(pc.cyan('\\nAvailable list commands:'));\n console.log(pc.white(' ak list kits - List available kits'));\n console.log(pc.white(' ak list agents - List available agents'));\n console.log(pc.white(' ak list skills - List available skills'));\n console.log(pc.white(' ak list commands - List available commands'));\n console.log(pc.white(' ak list workflows - List available workflows'));\n console.log('');\n return;\n }\n\n // Normalize type\n type = type.toLowerCase();\n if (!validTypes.includes(type)) {\n console.log(pc.red(`Unknown type: ${type}`));\n console.log(pc.gray(`Valid types: ${validTypes.join(', ')}`));\n return;\n }\n\n // List kits (doesn't need source)\n if (type === 'kits') {\n listKits();\n return;\n }\n\n // For other types, need source\n const source = resolveSource(options.source);\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n return;\n }\n\n console.log(pc.gray(`Source: ${source.path}\\n`));\n\n switch (type) {\n case 'agents':\n listAgents(source.claudeDir);\n break;\n case 'skills':\n listSkills(source.claudeDir);\n break;\n case 'commands':\n listCommandsList(source.claudeDir);\n break;\n case 'workflows':\n listWorkflows(source.claudeDir);\n break;\n }\n}\n\nfunction listKits(): void {\n const kits = getKitList();\n\n console.log(pc.bold(pc.cyan('\\nAvailable Kits:\\n')));\n\n for (const kit of kits) {\n const colorFn = (pc as any)[kit.color] || pc.white;\n console.log(` ${kit.emoji} ${colorFn(pc.bold(kit.name.padEnd(12)))} - ${kit.description}`);\n\n // Show details\n if (Array.isArray(kit.agents)) {\n const agentCount = Array.isArray(kit.agents) ? kit.agents.length : 'all';\n const skillCount = Array.isArray(kit.skills) ? kit.skills.length : 'all';\n const cmdCount = Array.isArray(kit.commands) ? kit.commands.length : 'all';\n console.log(pc.gray(` Agents: ${agentCount} | Skills: ${skillCount} | Commands: ${cmdCount}`));\n } else {\n console.log(pc.gray(' Includes: ALL agents, skills, commands'));\n }\n }\n\n console.log(`\\n 🔧 ${pc.bold('custom'.padEnd(12))} - Pick your own agents, skills, and commands`);\n console.log('');\n}\n\nfunction listAgents(sourceDir: string): void {\n const agents = listAvailable('agents', sourceDir);\n\n console.log(pc.bold(pc.cyan(`Available Agents (${agents.length}):\\n`)));\n\n if (agents.length === 0) {\n console.log(pc.gray(' No agents found'));\n return;\n }\n\n // Group into columns\n const cols = 3;\n const rows = Math.ceil(agents.length / cols);\n\n for (let i = 0; i < rows; i++) {\n let line = ' ';\n for (let j = 0; j < cols; j++) {\n const idx = i + j * rows;\n if (idx < agents.length) {\n line += pc.white(agents[idx].name.padEnd(25));\n }\n }\n console.log(line);\n }\n console.log('');\n}\n\nfunction listSkills(sourceDir: string): void {\n const skills = listAvailable('skills', sourceDir).filter(s => s.isDir);\n\n console.log(pc.bold(pc.cyan(`Available Skills (${skills.length}):\\n`)));\n\n if (skills.length === 0) {\n console.log(pc.gray(' No skills found'));\n return;\n }\n\n // Group into columns\n const cols = 2;\n const rows = Math.ceil(skills.length / cols);\n\n for (let i = 0; i < rows; i++) {\n let line = ' ';\n for (let j = 0; j < cols; j++) {\n const idx = i + j * rows;\n if (idx < skills.length) {\n line += pc.white(skills[idx].name.padEnd(35));\n }\n }\n console.log(line);\n }\n console.log('');\n}\n\nfunction listCommandsList(sourceDir: string): void {\n const commands = listAvailable('commands', sourceDir);\n\n console.log(pc.bold(pc.cyan(`Available Commands (${commands.length}):\\n`)));\n\n if (commands.length === 0) {\n console.log(pc.gray(' No commands found'));\n return;\n }\n\n // Separate files and directories\n const files = commands.filter(c => !c.isDir);\n const dirs = commands.filter(c => c.isDir);\n\n // Print main commands (files)\n console.log(pc.gray(' Main commands:'));\n const cols = 4;\n const rows = Math.ceil(files.length / cols);\n\n for (let i = 0; i < rows; i++) {\n let line = ' ';\n for (let j = 0; j < cols; j++) {\n const idx = i + j * rows;\n if (idx < files.length) {\n line += pc.white(('/' + files[idx].name).padEnd(18));\n }\n }\n console.log(line);\n }\n\n // Print command groups (directories)\n if (dirs.length > 0) {\n console.log(pc.gray('\\n Command groups:'));\n for (const dir of dirs) {\n console.log(pc.yellow(` /${dir.name}/`));\n }\n }\n\n console.log('');\n}\n\nfunction listWorkflows(sourceDir: string): void {\n const workflows = listAvailable('workflows', sourceDir);\n\n console.log(pc.bold(pc.cyan(`Available Workflows (${workflows.length}):\\n`)));\n\n if (workflows.length === 0) {\n console.log(pc.gray(' No workflows found'));\n return;\n }\n\n for (const wf of workflows) {\n console.log(pc.white(` • ${wf.name}`));\n }\n console.log('');\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { resolveSource, isAkProject } from '../utils/paths.js';\nimport { loadState, updateState, getFileStatuses } from '../utils/state.js';\nimport { hashFile, hashDirectory } from '../utils/hash.js';\nimport { promptUpdateConfirm } from '../utils/prompts.js';\n\nexport async function updateCommand(options: Record<string, any> = {}): Promise<void> {\n const projectDir = process.cwd();\n\n // Check if in ak project\n if (!isAkProject(projectDir)) {\n console.log(pc.red('Not in an ak project.'));\n console.log(pc.gray('Run \"ak init\" first.'));\n return;\n }\n\n // Load state\n const state = await loadState(projectDir);\n if (!state) {\n console.log(pc.red('No state file found.'));\n console.log(pc.gray('This project may have been created without ak. Run \"ak doctor\" for more info.'));\n return;\n }\n\n // Resolve source\n const sourceFlag = options.source || state.source;\n const source = resolveSource(sourceFlag);\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n return;\n }\n\n console.log(pc.gray(`Source: ${source.path}`));\n console.log(pc.gray(`Target: ${state.target}`));\n console.log('');\n\n const spinner = ora('Checking for updates...').start();\n\n try {\n // Get current file statuses\n const result = await getFileStatuses(projectDir);\n if ('error' in result) {\n spinner.fail(pc.red(result.error));\n return;\n }\n\n const { statuses, targetDir } = result;\n\n // Determine what types to update\n let typesToUpdate = ['agents', 'skills', 'commands', 'workflows'];\n if (options.agents) typesToUpdate = ['agents'];\n if (options.skills) typesToUpdate = ['skills'];\n if (options.commands) typesToUpdate = ['commands'];\n\n // Get source hashes\n const sourceHashes: Record<string, string> = {};\n for (const type of typesToUpdate) {\n const typeDir = join(source.claudeDir, type);\n if (fs.existsSync(typeDir)) {\n const hashes = await hashDirectory(typeDir);\n for (const [path, hash] of Object.entries(hashes)) {\n sourceHashes[`${type}/${path}`] = hash;\n }\n }\n }\n\n // Compare with current\n const toUpdate: string[] = [];\n const skipped: string[] = [];\n const newFiles: string[] = [];\n\n for (const [path, sourceHash] of Object.entries(sourceHashes)) {\n const currentPath = join(targetDir, path);\n const originalHash = state.originalHashes?.[path];\n const currentHash = fs.existsSync(currentPath) ? hashFile(currentPath) : null;\n\n if (!currentHash) {\n // New file from source\n newFiles.push(path);\n } else if (currentHash === originalHash) {\n // File unchanged locally, can update\n if (sourceHash !== currentHash) {\n toUpdate.push(path);\n }\n } else {\n // File modified locally, skip\n if (sourceHash !== originalHash) {\n skipped.push(path);\n }\n }\n }\n\n spinner.stop();\n\n // Show summary\n if (toUpdate.length === 0 && newFiles.length === 0) {\n console.log(pc.green('✓ Already up to date!'));\n if (skipped.length > 0) {\n console.log(pc.yellow(` ${skipped.length} file(s) skipped (modified locally)`));\n }\n return;\n }\n\n console.log(pc.cyan('Updates available:'));\n console.log(pc.green(` ${toUpdate.length} file(s) to update`));\n console.log(pc.blue(` ${newFiles.length} new file(s)`));\n if (skipped.length > 0) {\n console.log(pc.yellow(` ${skipped.length} file(s) skipped (modified locally)`));\n }\n console.log('');\n\n // Dry run mode\n if (options.dryRun) {\n console.log(pc.cyan('Dry run - no changes made'));\n console.log(pc.gray('\\nFiles that would be updated:'));\n [...toUpdate, ...newFiles].forEach(f => console.log(pc.gray(` ${f}`)));\n if (skipped.length > 0) {\n console.log(pc.gray('\\nFiles that would be skipped:'));\n skipped.forEach(f => console.log(pc.yellow(` ~ ${f}`)));\n }\n return;\n }\n\n // Confirm\n if (!options.force) {\n const confirmed = await promptUpdateConfirm({\n toUpdate: [...toUpdate, ...newFiles],\n skipped\n });\n if (!confirmed) {\n console.log(pc.yellow('Cancelled.'));\n return;\n }\n }\n\n // Apply updates\n const updateSpinner = ora('Applying updates...').start();\n\n let updated = 0;\n let failed = 0;\n\n for (const path of [...toUpdate, ...newFiles]) {\n try {\n const srcPath = join(source.claudeDir, path);\n const destPath = join(targetDir, path);\n\n await fs.ensureDir(join(targetDir, path.split('/').slice(0, -1).join('/')));\n await fs.copy(srcPath, destPath, { overwrite: true });\n updated++;\n } catch (err: any) {\n failed++;\n if (process.env.DEBUG) {\n console.error(`Failed to update ${path}: ${err.message}`);\n }\n }\n }\n\n // Update state with new hashes\n const newHashes = await hashDirectory(targetDir);\n await updateState(projectDir, {\n source: source.path,\n originalHashes: newHashes\n });\n\n updateSpinner.succeed(pc.green(`Updated ${updated} file(s)`));\n\n if (failed > 0) {\n console.log(pc.yellow(` ${failed} file(s) failed to update`));\n }\n\n if (skipped.length > 0) {\n console.log(pc.gray(`\\nSkipped files (modified locally):`));\n skipped.slice(0, 5).forEach(f => console.log(pc.yellow(` ~ ${f}`)));\n if (skipped.length > 5) {\n console.log(pc.gray(` ... and ${skipped.length - 5} more`));\n }\n }\n\n } catch (error: any) {\n spinner.fail(pc.red('Update failed'));\n console.error(pc.red(error.message));\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n }\n}\n","import pc from 'picocolors';\nimport { isAkProject } from '../utils/paths.js';\nimport { loadState, getFileStatuses } from '../utils/state.js';\nimport fs from 'fs-extra';\n\nexport async function statusCommand(options: Record<string, any> = {}): Promise<void> {\n const projectDir = process.cwd();\n\n // Check if in ak project\n if (!isAkProject(projectDir)) {\n console.log(pc.red('Not in an ak project.'));\n console.log(pc.gray('Run \"ak init\" first.'));\n return;\n }\n\n // Load state\n const state = await loadState(projectDir);\n if (!state) {\n console.log(pc.yellow('No state file found.'));\n console.log(pc.gray('This project may have been created without ak.'));\n return;\n }\n\n // Print project info\n console.log(pc.bold(pc.cyan('\\nProject Status\\n')));\n console.log(pc.white(` Kit: ${state.kit}`));\n console.log(pc.white(` Target: ${state.target}`));\n console.log(pc.white(` Source: ${state.source}`));\n console.log(pc.gray(` Created: ${new Date(state.createdAt).toLocaleDateString()}`));\n console.log(pc.gray(` Updated: ${new Date(state.lastUpdate).toLocaleDateString()}`));\n console.log('');\n\n // Get file statuses\n const result = await getFileStatuses(projectDir);\n\n if ('error' in result) {\n console.log(pc.red(`Error: ${result.error}`));\n return;\n }\n\n const { statuses } = result;\n\n // Summary\n const total = statuses.unchanged.length + statuses.modified.length + statuses.added.length;\n console.log(pc.cyan('File Status:'));\n console.log(pc.green(` ✓ ${statuses.unchanged.length} unchanged`));\n if (statuses.modified.length > 0) {\n console.log(pc.yellow(` ~ ${statuses.modified.length} modified`));\n }\n if (statuses.added.length > 0) {\n console.log(pc.blue(` + ${statuses.added.length} added locally`));\n }\n if (statuses.deleted.length > 0) {\n console.log(pc.red(` - ${statuses.deleted.length} deleted`));\n }\n console.log(pc.gray(` Total: ${total} files tracked`));\n console.log('');\n\n // Show modified files\n if (statuses.modified.length > 0 && (options.verbose || statuses.modified.length <= 10)) {\n console.log(pc.yellow('Modified files:'));\n for (const file of statuses.modified) {\n console.log(pc.yellow(` ~ ${file}`));\n }\n console.log('');\n } else if (statuses.modified.length > 10) {\n console.log(pc.yellow(`Modified files: (showing first 10, use --verbose for all)`));\n for (const file of statuses.modified.slice(0, 10)) {\n console.log(pc.yellow(` ~ ${file}`));\n }\n console.log(pc.gray(` ... and ${statuses.modified.length - 10} more`));\n console.log('');\n }\n\n // Show added files\n if (statuses.added.length > 0 && (options.verbose || statuses.added.length <= 5)) {\n console.log(pc.blue('Added locally:'));\n for (const file of statuses.added) {\n console.log(pc.blue(` + ${file}`));\n }\n console.log('');\n }\n\n // Installed components\n if (state.installed) {\n console.log(pc.cyan('Installed Components:'));\n const { agents, skills, commands, workflows, router, hooks } = state.installed;\n\n if (agents && agents.length > 0) {\n console.log(pc.gray(` Agents: ${agents.includes('all') ? 'ALL' : agents.length}`));\n }\n if (skills && skills.length > 0) {\n console.log(pc.gray(` Skills: ${skills.includes('all') ? 'ALL' : skills.length}`));\n }\n if (commands && commands.length > 0) {\n console.log(pc.gray(` Commands: ${commands.includes('all') ? 'ALL' : commands.length}`));\n }\n if (workflows && workflows.length > 0) {\n console.log(pc.gray(` Workflows: ${workflows.includes('all') ? 'ALL' : workflows.length}`));\n }\n if (router) console.log(pc.gray(' Router: ✓'));\n if (hooks) console.log(pc.gray(' Hooks: ✓'));\n console.log('');\n }\n\n // Check source availability\n if (state.source && !fs.existsSync(state.source)) {\n console.log(pc.yellow('⚠ Source directory not found. Update may not work.'));\n console.log(pc.gray(` Expected: ${state.source}`));\n console.log('');\n }\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport { isAkProject, resolveSource, TARGETS } from '../utils/paths.js';\nimport { loadState, createInitialState } from '../utils/state.js';\n\ninterface CheckResult {\n name: string;\n label: string;\n passed: boolean;\n severity: 'error' | 'warning';\n fixed?: boolean;\n fixError?: string;\n meta?: Record<string, any>;\n}\n\ninterface Check {\n name: string;\n label: string;\n severity: 'error' | 'warning';\n check: () => boolean | Promise<boolean>;\n fix?: () => void | Promise<void>;\n getMeta?: () => Record<string, any> | Promise<Record<string, any>>;\n}\n\nexport async function doctorCommand(options: Record<string, any> = {}): Promise<{ issues: number; warnings: number }> {\n const projectDir = process.cwd();\n\n // Detect target directory for use across checks\n let targetDir: { name: string; folder: string; dir: string } | null = null;\n for (const [name, folder] of Object.entries(TARGETS)) {\n const dir = join(projectDir, folder);\n if (fs.existsSync(dir)) {\n targetDir = { name, folder, dir };\n break;\n }\n }\n\n // Load state once\n let state = await loadState(projectDir);\n\n // Define all checks\n const checks: Check[] = [\n {\n name: 'project',\n label: 'ak project detected',\n severity: 'error',\n check: () => isAkProject(projectDir),\n fix: async () => {\n await fs.ensureDir(join(projectDir, '.ak'));\n }\n },\n {\n name: 'state',\n label: 'State file (.ak/state.json) exists',\n severity: 'warning',\n check: () => state !== null,\n fix: async () => {\n // Create state with detected values\n const kit = 'unknown';\n const source = '';\n const target = targetDir ? targetDir.folder : '.claude';\n\n // Detect installed components\n const installed: any = {};\n if (targetDir) {\n const dirs = ['agents', 'skills', 'commands', 'workflows'];\n for (const dir of dirs) {\n const fullPath = join(targetDir.dir, dir);\n if (fs.existsSync(fullPath)) {\n const items = fs.readdirSync(fullPath).filter(f => !f.startsWith('.'));\n if (items.length > 0) {\n installed[dir] = items;\n }\n }\n }\n }\n\n await createInitialState(projectDir, { kit, source, target, installed });\n state = await loadState(projectDir); // Reload state\n }\n },\n {\n name: 'target',\n label: 'Target directory exists',\n severity: 'error',\n check: () => targetDir !== null,\n getMeta: () => targetDir ? { folder: targetDir.folder } : {}\n },\n {\n name: 'agents_md',\n label: 'AGENTS.md exists',\n severity: 'warning',\n check: () => fs.existsSync(join(projectDir, 'AGENTS.md'))\n },\n {\n name: 'source',\n label: 'Source directory accessible',\n severity: 'error',\n check: () => {\n if (!state || !state.source) return true; // Skip if no state/source\n return fs.existsSync(state.source);\n },\n getMeta: () => state && state.source ? { source: state.source } : {}\n },\n {\n name: 'subdirs_agents',\n label: 'agents/ exists',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'agents'));\n },\n fix: async () => {\n if (targetDir) {\n await fs.ensureDir(join(targetDir.dir, 'agents'));\n }\n },\n getMeta: () => {\n if (!targetDir) return {};\n const fullPath = join(targetDir.dir, 'agents');\n if (fs.existsSync(fullPath)) {\n const items = fs.readdirSync(fullPath).length;\n return { items };\n }\n return {};\n }\n },\n {\n name: 'subdirs_commands',\n label: 'commands/ exists',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'commands'));\n },\n fix: async () => {\n if (targetDir) {\n await fs.ensureDir(join(targetDir.dir, 'commands'));\n }\n },\n getMeta: () => {\n if (!targetDir) return {};\n const fullPath = join(targetDir.dir, 'commands');\n if (fs.existsSync(fullPath)) {\n const items = fs.readdirSync(fullPath).length;\n return { items };\n }\n return {};\n }\n },\n {\n name: 'subdirs_skills',\n label: 'skills/ exists',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'skills'));\n },\n fix: async () => {\n if (targetDir) {\n await fs.ensureDir(join(targetDir.dir, 'skills'));\n }\n },\n getMeta: () => {\n if (!targetDir) return {};\n const fullPath = join(targetDir.dir, 'skills');\n if (fs.existsSync(fullPath)) {\n const items = fs.readdirSync(fullPath).length;\n return { items };\n }\n return {};\n }\n },\n {\n name: 'subdirs_scripts',\n label: 'scripts/ exists',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'scripts'));\n }\n },\n {\n name: 'subdirs_hooks',\n label: 'hooks/ exists',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'hooks'));\n }\n },\n {\n name: 'statusline',\n label: 'statusline files exist',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'statusline.cjs')) ||\n fs.existsSync(join(targetDir.dir, 'statusline.sh'));\n }\n }\n ];\n\n // Run checks\n const results = await runChecks(checks, options);\n\n // Handle output modes\n if (options.json) {\n await outputJson(projectDir, results);\n return computeSummary(results);\n }\n\n if (options.report) {\n await outputReport(projectDir, results, options);\n }\n\n if (options.checkOnly) {\n const summary = computeSummary(results);\n if (summary.issues > 0) {\n process.exit(1);\n } else {\n process.exit(0);\n }\n }\n\n // Default colored output (backward compatible)\n await outputColored(projectDir, results, state, targetDir);\n\n return computeSummary(results);\n}\n\nasync function runChecks(checks: Check[], options: Record<string, any>): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n for (const c of checks) {\n const passed = await c.check();\n const meta = c.getMeta ? await c.getMeta() : undefined;\n const result: CheckResult = {\n name: c.name,\n label: c.label,\n passed,\n severity: c.severity,\n meta\n };\n\n if (!passed && options.fix && c.fix) {\n try {\n await c.fix();\n result.fixed = true;\n result.passed = true;\n } catch (e: any) {\n result.fixError = e.message;\n }\n }\n\n results.push(result);\n }\n\n return results;\n}\n\nfunction computeSummary(results: CheckResult[]): { issues: number; warnings: number } {\n let issues = 0;\n let warnings = 0;\n\n for (const r of results) {\n if (!r.passed && r.severity === 'error') {\n issues++;\n }\n if (!r.passed && r.severity === 'warning') {\n warnings++;\n }\n }\n\n return { issues, warnings };\n}\n\nasync function outputJson(projectDir: string, results: CheckResult[]): Promise<void> {\n const summary = computeSummary(results);\n const fixed = results.filter(r => r.fixed).length;\n\n const output = {\n project: projectDir,\n timestamp: new Date().toISOString(),\n checks: results,\n summary: {\n total: results.length,\n passed: results.filter(r => r.passed).length,\n failed: results.filter(r => !r.passed).length,\n warnings: summary.warnings,\n fixed\n }\n };\n\n console.log(JSON.stringify(output, null, 2));\n}\n\nasync function outputReport(projectDir: string, results: CheckResult[], options: Record<string, any>): Promise<void> {\n const summary = computeSummary(results);\n const timestamp = new Date().toISOString();\n\n let markdown = `# Apero Kit Doctor Report\\n\\n`;\n markdown += `**Project:** ${projectDir}\\n`;\n markdown += `**Timestamp:** ${timestamp}\\n\\n`;\n\n markdown += `## Summary\\n\\n`;\n markdown += `- Total checks: ${results.length}\\n`;\n markdown += `- Passed: ${results.filter(r => r.passed).length}\\n`;\n markdown += `- Failed: ${results.filter(r => !r.passed).length}\\n`;\n markdown += `- Errors: ${summary.issues}\\n`;\n markdown += `- Warnings: ${summary.warnings}\\n`;\n if (options.fix) {\n markdown += `- Fixed: ${results.filter(r => r.fixed).length}\\n`;\n }\n markdown += `\\n`;\n\n markdown += `## Check Results\\n\\n`;\n for (const r of results) {\n const icon = r.passed ? '✓' : (r.severity === 'error' ? '✗' : '⚠');\n markdown += `### ${icon} ${r.label}\\n\\n`;\n markdown += `- **Status:** ${r.passed ? 'PASS' : 'FAIL'}\\n`;\n markdown += `- **Severity:** ${r.severity}\\n`;\n if (r.fixed) {\n markdown += `- **Fixed:** Yes\\n`;\n }\n if (r.fixError) {\n markdown += `- **Fix Error:** ${r.fixError}\\n`;\n }\n if (r.meta && Object.keys(r.meta).length > 0) {\n markdown += `- **Details:** ${JSON.stringify(r.meta)}\\n`;\n }\n markdown += `\\n`;\n }\n\n markdown += `## Suggestions\\n\\n`;\n const failedChecks = results.filter(r => !r.passed);\n if (failedChecks.length === 0) {\n markdown += `All checks passed! No suggestions.\\n`;\n } else {\n for (const r of failedChecks) {\n if (r.name === 'project') {\n markdown += `- Run \"ak init .\" to initialize this directory\\n`;\n }\n if (r.name === 'state') {\n markdown += `- State file is missing. Re-run \"ak init\" or create manually\\n`;\n }\n if (r.name === 'source' && r.meta?.source) {\n markdown += `- Update source path: ak update --source <new-path>\\n`;\n }\n }\n }\n\n const reportPath = join(projectDir, '.ak', 'doctor-report.md');\n await fs.ensureDir(join(projectDir, '.ak'));\n await fs.writeFile(reportPath, markdown, 'utf-8');\n\n if (!options.json) {\n console.log(pc.green(`\\n✓ Report saved to ${reportPath}\\n`));\n }\n}\n\nasync function outputColored(\n projectDir: string,\n results: CheckResult[],\n state: any,\n targetDir: { name: string; folder: string; dir: string } | null\n): Promise<void> {\n console.log(pc.bold(pc.cyan('\\nApero Kit Doctor\\n')));\n console.log(pc.gray('Checking project health...\\n'));\n\n // Output each check result\n for (const r of results) {\n if (r.passed) {\n let msg = `✓ ${r.label}`;\n if (r.name === 'target' && r.meta?.folder) {\n msg += ` (${r.meta.folder})`;\n }\n if (r.name.startsWith('subdirs_') && r.meta?.items !== undefined) {\n msg += ` (${r.meta.items} items)`;\n }\n console.log(pc.green(msg));\n } else {\n const icon = r.severity === 'error' ? '✗' : '⚠';\n const color = r.severity === 'error' ? pc.red : pc.yellow;\n let msg = `${icon} ${r.label}`;\n if (r.name === 'target') {\n msg = `${icon} No target directory (.claude/, .opencode/, .agent/)`;\n }\n if (r.name === 'agents_md') {\n msg = `${icon} AGENTS.md not found (optional but recommended)`;\n }\n if (r.name === 'source' && r.meta?.source) {\n msg = `${icon} Source directory not found: ${r.meta.source}`;\n }\n if (r.name.startsWith('subdirs_')) {\n const dir = r.name.replace('subdirs_', '');\n msg = `${icon} ${dir}/ not found`;\n }\n console.log(color(msg));\n }\n }\n\n // Source detection (special formatting)\n console.log('');\n console.log(pc.gray('Source detection:'));\n const source = resolveSource();\n if ('error' in source) {\n console.log(pc.yellow(` ⚠ ${source.error}`));\n } else {\n console.log(pc.green(` ✓ Found source: ${source.path}`));\n console.log(pc.gray(` Type: ${source.type || 'unknown'}`));\n }\n\n // Summary\n const summary = computeSummary(results);\n console.log('');\n console.log(pc.cyan('─'.repeat(40)));\n\n if (summary.issues === 0 && summary.warnings === 0) {\n console.log(pc.bold(pc.green('\\n✓ All checks passed!\\n')));\n } else if (summary.issues === 0) {\n console.log(pc.yellow(`\\n⚠ ${summary.warnings} warning(s), no critical issues\\n`));\n } else {\n console.log(pc.red(`\\n✗ ${summary.issues} issue(s), ${summary.warnings} warning(s)\\n`));\n }\n\n // Suggestions\n if (summary.issues > 0 || summary.warnings > 0) {\n console.log(pc.cyan('Suggestions:'));\n\n const isProject = results.find(r => r.name === 'project')?.passed;\n const hasState = results.find(r => r.name === 'state')?.passed;\n\n if (!isProject) {\n console.log(pc.white(' • Run \"ak init .\" to initialize this directory'));\n }\n\n if (!hasState && isProject) {\n console.log(pc.white(' • State file is missing. Re-run \"ak init\" or create manually'));\n }\n\n if (state && state.source && !fs.existsSync(state.source)) {\n console.log(pc.white(' • Update source path: ak update --source <new-path>'));\n }\n\n console.log('');\n }\n}\n","import { exec } from 'child_process';\nimport pc from 'picocolors';\n\nconst HELP_URL = 'https://www.vividkit.dev/vi/guides/what-is-claudekit';\n\nexport async function helpCommand(options: Record<string, any>): Promise<void> {\n console.log(pc.cyan('\\n📚 Opening VividKit documentation...\\n'));\n console.log(pc.green(` ${HELP_URL}\\n`));\n const openCommand = process.platform === 'darwin' ? 'open' :\n process.platform === 'win32' ? 'start' : 'xdg-open';\n exec(`${openCommand} ${HELP_URL}`);\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport * as p from '@clack/prompts';\nimport { getGlobalInstallPath, TARGETS } from '../utils/paths.js';\nimport { loadState } from '../utils/state.js';\n\nconst PRESERVED_FILES = ['CLAUDE.md', 'settings.json', 'AGENTS.md'];\nconst AK_SUBDIRS = ['agents', 'skills', 'commands', 'workflows', 'hooks', 'router'];\n\ninterface UninstallResult {\n removed: string[];\n errors: Array<{ path: string; error: string }>;\n}\n\nexport async function uninstallCommand(options: Record<string, any>): Promise<void> {\n p.intro(pc.bgCyan(pc.black(' AK Uninstall ')));\n\n // Determine scope\n const targets: Array<{ type: string; dir: string }> = [];\n\n if (options.local || (!options.global && !options.local)) {\n targets.push({ type: 'local', dir: process.cwd() });\n }\n if (options.global) {\n targets.push({ type: 'global', dir: getGlobalInstallPath() });\n }\n\n let totalRemoved = 0;\n\n for (const target of targets) {\n const count = await uninstallFromDir(target.type, target.dir, options);\n totalRemoved += count;\n }\n\n if (totalRemoved === 0) {\n p.outro(pc.yellow('No installations found to remove.'));\n } else {\n p.outro(pc.green(`Successfully removed ${totalRemoved} item(s).`));\n }\n}\n\nasync function uninstallFromDir(\n type: string,\n dir: string,\n options: Record<string, any>\n): Promise<number> {\n const spinner = ora(`Scanning ${type} installation at ${pc.dim(dir)}`).start();\n\n // Load state\n const state = await loadState(dir);\n\n // Detect which target directories exist\n const existingTargets: Array<{ name: string; path: string }> = [];\n for (const [name, folder] of Object.entries(TARGETS)) {\n const targetPath = join(dir, folder);\n if (fs.existsSync(targetPath)) {\n existingTargets.push({ name, path: targetPath });\n }\n }\n\n // Check for .ak directory\n const akDir = join(dir, '.ak');\n const hasAkState = fs.existsSync(akDir);\n\n if (existingTargets.length === 0 && !hasAkState) {\n spinner.warn(pc.yellow(`No AK installation found in ${type}`));\n return 0;\n }\n\n spinner.succeed(pc.green(`Found AK installation in ${type}`));\n\n // Build removal list\n const removalList: string[] = [];\n\n // Add all AK-managed subdirectories inside target directories\n for (const target of existingTargets) {\n for (const subdir of AK_SUBDIRS) {\n const subdirPath = join(target.path, subdir);\n if (fs.existsSync(subdirPath)) {\n removalList.push(subdirPath);\n }\n }\n }\n\n // Add .ak state directory\n if (hasAkState) {\n removalList.push(akDir);\n }\n\n if (removalList.length === 0) {\n console.log(pc.yellow(` No files to remove from ${type}`));\n return 0;\n }\n\n // Display what will be removed\n console.log(pc.cyan(`\\n Items to remove from ${type}:`));\n for (const path of removalList) {\n const relativePath = path.replace(dir + '/', '');\n console.log(pc.dim(` • ${relativePath}`));\n }\n\n if (state) {\n console.log(pc.dim(`\\n Kit: ${state.kit}`));\n console.log(pc.dim(` Target: ${state.target}`));\n }\n\n console.log(pc.yellow(`\\n Preserved files: ${PRESERVED_FILES.join(', ')}`));\n\n // Dry run - just preview\n if (options.dryRun) {\n console.log(pc.yellow(`\\n [DRY RUN] Would remove ${removalList.length} item(s)`));\n return 0;\n }\n\n // Confirmation prompt (unless --yes)\n if (!options.yes) {\n const confirmed = await p.confirm({\n message: `Remove ${removalList.length} item(s) from ${type}?`,\n initialValue: false\n });\n\n if (p.isCancel(confirmed) || !confirmed) {\n console.log(pc.dim(' Cancelled.'));\n return 0;\n }\n }\n\n // Perform removal\n const result = await removeItems(removalList, dir);\n\n // Display results\n if (result.removed.length > 0) {\n console.log(pc.green(`\\n ✓ Removed ${result.removed.length} item(s) from ${type}`));\n for (const path of result.removed) {\n const relativePath = path.replace(dir + '/', '');\n console.log(pc.dim(` • ${relativePath}`));\n }\n }\n\n if (result.errors.length > 0) {\n console.log(pc.red(`\\n ✗ Failed to remove ${result.errors.length} item(s):`));\n for (const error of result.errors) {\n const relativePath = error.path.replace(dir + '/', '');\n console.log(pc.red(` • ${relativePath}: ${error.error}`));\n }\n }\n\n return result.removed.length;\n}\n\nasync function removeItems(paths: string[], baseDir: string): Promise<UninstallResult> {\n const result: UninstallResult = {\n removed: [],\n errors: []\n };\n\n for (const path of paths) {\n // Security check: ensure path is within baseDir\n if (!path.startsWith(baseDir)) {\n result.errors.push({\n path,\n error: 'Path outside base directory (security check failed)'\n });\n continue;\n }\n\n // Security check: ensure path contains expected directories\n const isExpectedPath =\n path.includes('/.ak') ||\n AK_SUBDIRS.some(subdir => path.includes(`/${subdir}`));\n\n if (!isExpectedPath) {\n result.errors.push({\n path,\n error: 'Path is not an expected AK directory (security check failed)'\n });\n continue;\n }\n\n try {\n await fs.remove(path);\n result.removed.push(path);\n } catch (error) {\n result.errors.push({\n path,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n\n return result;\n}\n","import { execSync } from 'child_process';\n\nconst REMOTE_REPO_URL = 'https://github.com/Thanhnguyen6702/CK-Internal.git';\n\nexport { REMOTE_REPO_URL };\n\nexport function fetchRemoteTags(repoUrl: string = REMOTE_REPO_URL): string[] {\n const output = execSync(`git ls-remote --tags \"${repoUrl}\"`, {\n encoding: 'utf-8',\n timeout: 15000,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n\n return output.split('\\n')\n .filter(line => line.includes('refs/tags/'))\n .map(line => {\n const tag = line.split('refs/tags/')[1]?.replace('^{}', '');\n return tag;\n })\n .filter(Boolean)\n .filter((v, i, a) => a.indexOf(v) === i); // dedupe\n}\n\nexport function sortSemver(tags: string[]): string[] {\n return [...tags].sort((a, b) => {\n const pa = a.replace(/^v/, '').split(/[.-]/);\n const pb = b.replace(/^v/, '').split(/[.-]/);\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n const na = parseInt(pa[i]) || 0;\n const nb = parseInt(pb[i]) || 0;\n if (na !== nb) return nb - na; // descending\n }\n return 0;\n });\n}\n","import pc from 'picocolors';\nimport ora from 'ora';\nimport { fetchRemoteTags, sortSemver } from '../utils/git-tags.js';\n\nexport async function versionsCommand(options: Record<string, any>): Promise<void> {\n const spinner = ora('Fetching available versions...').start();\n\n try {\n const tags = fetchRemoteTags();\n spinner.stop();\n\n if (!tags || tags.length === 0) {\n console.log(pc.yellow('\\nNo versions found.'));\n return;\n }\n\n // Filter pre-releases unless --all\n let filtered = tags;\n if (!options.all) {\n filtered = tags.filter(tag => !tag.includes('-'));\n }\n\n // Sort by semver\n const sorted = sortSemver(filtered);\n\n // Apply limit\n const limit = options.limit ? parseInt(options.limit, 10) : 10;\n const limited = sorted.slice(0, limit);\n\n console.log(pc.bold('\\nAvailable versions:\\n'));\n\n limited.forEach((tag, index) => {\n const isLatest = index === 0;\n const marker = isLatest ? pc.green(' (latest)') : '';\n console.log(` ${pc.cyan(tag)}${marker}`);\n });\n\n if (sorted.length > limited.length) {\n console.log(pc.gray(`\\n ... and ${sorted.length - limited.length} more (use --limit or --all)`));\n }\n\n console.log('');\n } catch (err: any) {\n spinner.stop();\n console.log(pc.red('\\nFailed to fetch versions.'));\n console.log(pc.gray(err.message));\n\n if (err.message.includes('timeout')) {\n console.log(pc.gray('Network timeout. Check your connection.'));\n }\n }\n}\n","import { execSync } from 'child_process';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { CLI_ROOT } from '../utils/paths.js';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\n\nfunction getCurrentVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(join(CLI_ROOT, 'package.json'), 'utf-8'));\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\nfunction getLatestVersion(): string {\n const output = execSync('npm view apero-kit-cli version', {\n encoding: 'utf-8',\n timeout: 15000,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n return output.trim();\n}\n\nexport async function updateCliCommand(options: Record<string, any>): Promise<void> {\n const current = getCurrentVersion();\n const spinner = ora('Checking for updates...').start();\n\n try {\n const latest = options.version || getLatestVersion();\n spinner.stop();\n\n console.log(`\\n Current: ${pc.gray(current)}`);\n console.log(` Latest: ${pc.green(latest)}`);\n\n if (current === latest && !options.version && !options.force) {\n console.log(pc.green('\\nAlready up to date!'));\n console.log(pc.gray('Use --force to reinstall anyway.'));\n return;\n }\n\n if (options.check) {\n console.log(pc.yellow('\\nUpdate available! Run \"ak update-cli\" to install.'));\n return;\n }\n\n // Install\n const target = options.version || 'latest';\n const installSpinner = ora(`Installing apero-kit-cli@${target}...`).start();\n\n execSync(`npm install -g apero-kit-cli@${target}`, {\n encoding: 'utf-8',\n timeout: 60000,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n\n installSpinner.succeed(pc.green(`Updated to ${target}!`));\n } catch (err: any) {\n spinner.stop();\n console.log(pc.red('\\nUpdate failed.'));\n console.log(pc.gray(err.message));\n console.log(pc.gray('\\nTry manually: npm install -g apero-kit-cli'));\n }\n}\n","import pc from 'picocolors';\nimport fs from 'fs-extra';\nimport { join } from 'path';\nimport * as p from '@clack/prompts';\nimport { resolveSource } from '../utils/paths.js';\nimport { listAvailable } from '../utils/copy.js';\n\n// Map agent types to their skill directories\nconst AGENT_SKILL_PATHS: Record<string, string> = {\n claude: '.claude/skills',\n cursor: '.cursor/rules',\n codex: '.codex/skills',\n};\n\nexport async function skillsCommand(options: Record<string, any>): Promise<void> {\n const { name, agent, list, installed, uninstall, yes } = options;\n\n // List mode - show available skills with installation status\n if (list || (!name && !installed)) {\n await listSkillsWithStatus();\n return;\n }\n\n // Show installed skills only\n if (installed && !name) {\n await showInstalledSkills();\n return;\n }\n\n // Install or uninstall mode requires skill name\n if (!name) {\n console.log(pc.red('Error: --name <skill> is required'));\n console.log(pc.gray('Usage: ak skills --name <skill> [--agent <agents>] [--uninstall]'));\n process.exit(1);\n }\n\n // Parse target agents (default: claude)\n const targetAgents = parseAgents(agent);\n\n // Uninstall mode\n if (uninstall) {\n await uninstallSkill(name, targetAgents, yes);\n return;\n }\n\n // Install mode\n await installSkill(name, targetAgents, yes);\n}\n\n/**\n * List all available skills with installation status per agent\n */\nasync function listSkillsWithStatus(): Promise<void> {\n const source = resolveSource();\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n process.exit(1);\n }\n\n const skills = listAvailable('skills', source.claudeDir).filter(s => s.isDir);\n\n if (skills.length === 0) {\n console.log(pc.yellow('No skills found in source'));\n return;\n }\n\n console.log(pc.bold(pc.cyan(`\\nAvailable Skills (${skills.length}):`)));\n console.log(pc.gray(`Source: ${source.path}\\n`));\n\n // Header\n const header = ' Skill'.padEnd(40) + 'Claude Cursor Codex';\n console.log(pc.bold(header));\n console.log(pc.gray(' ' + '─'.repeat(58)));\n\n // List each skill with installation status\n for (const skill of skills) {\n const claudeInstalled = isSkillInstalled(skill.name, 'claude');\n const cursorInstalled = isSkillInstalled(skill.name, 'cursor');\n const codexInstalled = isSkillInstalled(skill.name, 'codex');\n\n const statusLine =\n ' ' +\n skill.name.padEnd(38) +\n (claudeInstalled ? pc.green('✓') : pc.gray('-')).padEnd(8) +\n (cursorInstalled ? pc.green('✓') : pc.gray('-')).padEnd(8) +\n (codexInstalled ? pc.green('✓') : pc.gray('-'));\n\n console.log(statusLine);\n }\n\n console.log('');\n console.log(pc.gray('Install: ak skills --name <skill> --agent <claude|cursor|codex>'));\n console.log('');\n}\n\n/**\n * Show only installed skills\n */\nasync function showInstalledSkills(): Promise<void> {\n console.log(pc.bold(pc.cyan('\\nInstalled Skills:\\n')));\n\n let hasAny = false;\n\n for (const [agentType, skillPath] of Object.entries(AGENT_SKILL_PATHS)) {\n const installed = getInstalledSkills(agentType);\n if (installed.length > 0) {\n hasAny = true;\n console.log(pc.bold(` ${agentType}:`));\n for (const skill of installed) {\n console.log(pc.white(` • ${skill}`));\n }\n console.log('');\n }\n }\n\n if (!hasAny) {\n console.log(pc.gray(' No skills installed'));\n console.log('');\n }\n}\n\n/**\n * Install a skill to target agents\n */\nasync function installSkill(skillName: string, agents: string[], skipConfirm: boolean): Promise<void> {\n const source = resolveSource();\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n process.exit(1);\n }\n\n // Find skill in source\n const skillPath = join(source.claudeDir, 'skills', skillName);\n if (!fs.existsSync(skillPath)) {\n console.log(pc.red(`Error: Skill \"${skillName}\" not found in source`));\n console.log(pc.gray(`Available skills: ak skills --list`));\n process.exit(1);\n }\n\n // Confirm installation unless --yes\n if (!skipConfirm) {\n const confirm = await p.confirm({\n message: `Install skill \"${skillName}\" to ${agents.join(', ')}?`,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n console.log(pc.gray('Cancelled'));\n process.exit(0);\n }\n }\n\n // Install to each agent\n const results: Array<{ agent: string; success: boolean; error?: string }> = [];\n\n for (const agent of agents) {\n try {\n const targetPath = join(process.cwd(), AGENT_SKILL_PATHS[agent], skillName);\n\n // Ensure target directory exists\n await fs.ensureDir(join(process.cwd(), AGENT_SKILL_PATHS[agent]));\n\n // Copy skill directory\n await fs.copy(skillPath, targetPath, { overwrite: true });\n\n results.push({ agent, success: true });\n } catch (err: any) {\n results.push({ agent, success: false, error: err.message });\n }\n }\n\n // Report results\n console.log('');\n const allSuccess = results.every(r => r.success);\n\n if (allSuccess) {\n console.log(pc.green(`✓ Installed \"${skillName}\" to ${agents.join(', ')}`));\n } else {\n for (const result of results) {\n if (result.success) {\n console.log(pc.green(`✓ ${result.agent}: installed`));\n } else {\n console.log(pc.red(`✗ ${result.agent}: ${result.error}`));\n }\n }\n }\n console.log('');\n}\n\n/**\n * Uninstall a skill from target agents\n */\nasync function uninstallSkill(skillName: string, agents: string[], skipConfirm: boolean): Promise<void> {\n // Check if skill is installed in any target agent\n const installedIn = agents.filter(agent => isSkillInstalled(skillName, agent));\n\n if (installedIn.length === 0) {\n console.log(pc.yellow(`Skill \"${skillName}\" is not installed in ${agents.join(', ')}`));\n process.exit(0);\n }\n\n // Confirm removal unless --yes\n if (!skipConfirm) {\n const confirm = await p.confirm({\n message: `Uninstall skill \"${skillName}\" from ${installedIn.join(', ')}?`,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n console.log(pc.gray('Cancelled'));\n process.exit(0);\n }\n }\n\n // Remove from each agent\n const results: Array<{ agent: string; success: boolean; error?: string }> = [];\n\n for (const agent of installedIn) {\n try {\n const targetPath = join(process.cwd(), AGENT_SKILL_PATHS[agent], skillName);\n await fs.remove(targetPath);\n results.push({ agent, success: true });\n } catch (err: any) {\n results.push({ agent, success: false, error: err.message });\n }\n }\n\n // Report results\n console.log('');\n const allSuccess = results.every(r => r.success);\n\n if (allSuccess) {\n console.log(pc.green(`✓ Uninstalled \"${skillName}\" from ${installedIn.join(', ')}`));\n } else {\n for (const result of results) {\n if (result.success) {\n console.log(pc.green(`✓ ${result.agent}: uninstalled`));\n } else {\n console.log(pc.red(`✗ ${result.agent}: ${result.error}`));\n }\n }\n }\n console.log('');\n}\n\n/**\n * Parse agent flag into array (comma-separated, defaults to claude)\n */\nfunction parseAgents(agentFlag?: string): string[] {\n if (!agentFlag) {\n return ['claude'];\n }\n\n const agents = agentFlag.split(',').map(a => a.trim().toLowerCase());\n const valid = agents.filter(a => a in AGENT_SKILL_PATHS);\n\n if (valid.length === 0) {\n console.log(pc.red('Error: No valid agents specified'));\n console.log(pc.gray('Valid agents: claude, cursor, codex'));\n process.exit(1);\n }\n\n return valid;\n}\n\n/**\n * Check if skill is installed for an agent\n */\nfunction isSkillInstalled(skillName: string, agent: string): boolean {\n const skillPath = join(process.cwd(), AGENT_SKILL_PATHS[agent], skillName);\n return fs.existsSync(skillPath);\n}\n\n/**\n * Get list of installed skills for an agent\n */\nfunction getInstalledSkills(agent: string): string[] {\n const skillsDir = join(process.cwd(), AGENT_SKILL_PATHS[agent]);\n\n if (!fs.existsSync(skillsDir)) {\n return [];\n }\n\n try {\n const items = fs.readdirSync(skillsDir);\n return items.filter(item => {\n const itemPath = join(skillsDir, item);\n return fs.statSync(itemPath).isDirectory();\n });\n } catch {\n return [];\n }\n}\n","#!/usr/bin/env node\nimport cac from 'cac';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport pc from 'picocolors';\nimport { registerCommands } from './cli/command-registry.js';\nimport { getCachedVersionNoFetch, isNewerVersion } from './utils/version-check.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\nconst cli = cac('ak');\nregisterCommands(cli);\ncli.help();\ncli.version(getVersion());\ncli.parse();\n\n// Non-blocking update check (cache-only, no network)\ntry {\n const version = getVersion();\n const cachedLatest = getCachedVersionNoFetch();\n if (cachedLatest && isNewerVersion(version, cachedLatest)) {\n console.log(pc.yellow(`\\n Update available: v${version} → v${cachedLatest}`));\n console.log(pc.gray(' Run \"ak update-cli\" to update\\n'));\n }\n} catch { /* silent */ }\n","import type { CAC } from 'cac';\n\nexport function registerCommands(cli: CAC): void {\n // init\n cli\n .command('init [project-name]', 'Initialize a new project with an agent kit')\n .option('-k, --kit <type>', 'Kit type (engineer, researcher, designer, minimal, full, custom)')\n .option('-t, --target <target>', 'Target CLI (claude, gemini, discord or combination)')\n .option('-s, --source <path>', 'Custom source path for templates')\n .option('-f, --force', 'Overwrite existing directory')\n .option('-g, --global', 'Install to global ~/.claude/ directory')\n .option('--fresh', 'Remove existing installation before re-init')\n .option('-y, --yes', 'Skip prompts, use defaults')\n .option('-p, --password <code>', 'Access code for initialization')\n .option('--exclude <patterns>', 'Exclude components (comma-separated)')\n .option('--only <patterns>', 'Include only matching components (comma-separated)')\n .action(async (projectName: string | undefined, options: Record<string, any>) => {\n const { initCommand } = await import('../commands/init.js');\n await initCommand(projectName, options);\n });\n\n // add\n cli\n .command('add <item>', 'Add agent, skill, or command (e.g., ak add skill:databases)')\n .option('-s, --source <path>', 'Custom source path')\n .option('-p, --path <path>', 'Target project path')\n .action(async (item: string, options: Record<string, any>) => {\n const { addCommand } = await import('../commands/add.js');\n await addCommand(item, options);\n });\n\n // list\n cli\n .command('list [type]', 'List available kits, agents, skills, or commands')\n .option('-s, --source <path>', 'Custom source path')\n .action(async (type: string | undefined, options: Record<string, any>) => {\n const { listCommand } = await import('../commands/list.js');\n await listCommand(type, options);\n });\n\n // update (template sync)\n cli\n .command('update', 'Update/sync from source templates')\n .option('-s, --source <path>', 'Source path to sync from')\n .option('--agents', 'Update only agents')\n .option('--skills', 'Update only skills')\n .option('--commands', 'Update only commands')\n .option('--all', 'Update everything')\n .option('-n, --dry-run', 'Show what would be updated without making changes')\n .option('-f, --force', 'Force update without confirmation')\n .action(async (options: Record<string, any>) => {\n const { updateCommand } = await import('../commands/update.js');\n await updateCommand(options);\n });\n\n // status\n cli\n .command('status', 'Show project status and file changes')\n .option('-v, --verbose', 'Show all files')\n .action(async (options: Record<string, any>) => {\n const { statusCommand } = await import('../commands/status.js');\n await statusCommand(options);\n });\n\n // doctor\n cli\n .command('doctor', 'Check project health and diagnose issues')\n .option('--fix', 'Auto-fix common issues')\n .option('--report', 'Generate diagnostic report')\n .option('--json', 'Output JSON format')\n .option('--check-only', 'CI mode: exit 1 on failures')\n .action(async (options: Record<string, any>) => {\n const { doctorCommand } = await import('../commands/doctor.js');\n await doctorCommand(options);\n });\n\n // kits alias\n cli\n .command('kits', 'List all available kits')\n .action(async () => {\n const { listCommand } = await import('../commands/list.js');\n await listCommand('kits', {});\n });\n\n // help - open docs\n cli\n .command('help', 'Open interactive help documentation in browser')\n .option('-s, --source <path>', 'Custom source path')\n .action(async (options: Record<string, any>) => {\n const { helpCommand } = await import('../commands/help.js');\n await helpCommand(options);\n });\n\n // uninstall\n cli\n .command('uninstall', 'Remove ClaudeKit installations')\n .option('-y, --yes', 'Skip confirmation')\n .option('-l, --local', 'Uninstall only local installation')\n .option('-g, --global', 'Uninstall only global installation')\n .option('--dry-run', 'Preview what would be removed')\n .action(async (options: Record<string, any>) => {\n const { uninstallCommand } = await import('../commands/uninstall.js');\n await uninstallCommand(options);\n });\n\n // versions\n cli\n .command('versions', 'List available versions')\n .option('--kit <kit>', 'Filter by kit')\n .option('--limit <limit>', 'Number of versions to show')\n .option('--all', 'Show all including prereleases')\n .action(async (options: Record<string, any>) => {\n const { versionsCommand } = await import('../commands/versions.js');\n await versionsCommand(options);\n });\n\n // update-cli\n cli\n .command('update-cli', 'Update the CLI itself to latest version')\n .option('--check', 'Check for updates without installing')\n .option('--version <version>', 'Update to specific version')\n .option('-f, --force', 'Force reinstall even if already up to date')\n .action(async (options: Record<string, any>) => {\n const { updateCliCommand } = await import('../commands/update-cli.js');\n await updateCliCommand(options);\n });\n\n // skills\n cli\n .command('skills', 'Manage skills across coding agents')\n .option('-n, --name <skill>', 'Skill name')\n .option('-a, --agent <agents>', 'Target agents')\n .option('-l, --list', 'List available skills')\n .option('--installed', 'Show installed skills')\n .option('-u, --uninstall', 'Uninstall skill')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (options: Record<string, any>) => {\n const { skillsCommand } = await import('../commands/skills.js');\n await skillsCommand(options);\n });\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { execSync } from 'child_process';\n\nconst CACHE_DIR = join(homedir(), '.apero-kit');\nconst CACHE_FILE = join(CACHE_DIR, 'version-check.json');\nconst CACHE_TTL = 7 * 24 * 60 * 60 * 1000; // 7 days\n\ninterface VersionCache {\n version: string;\n timestamp: number;\n}\n\n/**\n * Get latest version from npm, with 7-day cache\n */\nexport function getCachedLatestVersion(): string | null {\n // Try cache first\n try {\n if (existsSync(CACHE_FILE)) {\n const cache: VersionCache = JSON.parse(readFileSync(CACHE_FILE, 'utf-8'));\n if (Date.now() - cache.timestamp < CACHE_TTL) {\n return cache.version;\n }\n }\n } catch { /* ignore corrupt cache */ }\n\n // Fetch fresh from npm\n try {\n const version = execSync('npm view apero-kit-cli version', {\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe']\n }).trim();\n\n // Save to cache\n if (!existsSync(CACHE_DIR)) mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify({ version, timestamp: Date.now() } satisfies VersionCache));\n\n return version;\n } catch {\n return null; // offline or error\n }\n}\n\n/**\n * Read cache only (no network). For non-blocking startup check.\n */\nexport function getCachedVersionNoFetch(): string | null {\n try {\n if (existsSync(CACHE_FILE)) {\n const cache: VersionCache = JSON.parse(readFileSync(CACHE_FILE, 'utf-8'));\n return cache.version;\n }\n } catch { /* ignore */ }\n return null;\n}\n\n/**\n * Compare semver: returns true if latest > current\n */\nexport function isNewerVersion(current: string, latest: string): boolean {\n const c = current.replace(/^v/, '').split('.').map(Number);\n const l = latest.replace(/^v/, '').split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n if ((l[i] || 0) > (c[i] || 0)) return true;\n if ((l[i] || 0) < (c[i] || 0)) return false;\n }\n return false;\n}\n"],"mappings":"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","names":["join","dirname","execSync","fs","join","fs","join","kit","execSync","fs","join","resolve","pc","p","password","fs","join","pc","ora","pc","fs","join","pc","ora","pc","fs","fs","join","pc","pc","fs","join","pc","ora","p","pc","ora","execSync","pc","ora","join","pc","fs","join","p","confirm","readFileSync","fileURLToPath","dirname","join","pc","cli","initCommand","addCommand","listCommand","updateCommand","statusCommand","doctorCommand","helpCommand","uninstallCommand","versionsCommand","updateCliCommand","skillsCommand","join","homedir","existsSync","readFileSync","join","homedir","existsSync","readFileSync","__filename","fileURLToPath","__dirname","dirname","readFileSync","join","pc"]}
1
+ {"version":3,"sources":["../src/kits/index.ts","../src/utils/paths.ts","../src/targets/base-adapter.ts","../src/targets/claude-adapter.ts","../src/targets/gemini-adapter.ts","../src/targets/discord-adapter.ts","../src/targets/index.ts","../src/utils/hash.ts","../src/utils/state.ts","../src/utils/copy.ts","../src/utils/prompts.ts","../src/commands/init.ts","../src/commands/add.ts","../src/commands/list.ts","../src/commands/update.ts","../src/commands/status.ts","../src/commands/doctor.ts","../src/commands/help.ts","../src/commands/uninstall.ts","../src/utils/git-tags.ts","../src/commands/versions.ts","../src/commands/update-cli.ts","../src/commands/skills.ts","../src/index.ts","../src/cli/command-registry.ts","../src/utils/version-check.ts"],"sourcesContent":["/**\n * Kit Definitions\n *\n * Kits are predefined sets of agents, skills, commands, and configurations.\n * Each kit is designed for a specific use case.\n *\n * Note on Target Compatibility:\n * - agents, skills, commands: Supported by ALL targets (claude, gemini, discord)\n * - workflows, router, hooks: Claude-only features\n *\n * When a kit is used with non-Claude targets, Claude-only features are\n * automatically filtered out by the target adapter.\n */\n\nexport interface Kit {\n name: string;\n description: string;\n emoji: string;\n color: string;\n agents: string[] | 'all';\n commands: string[] | 'all';\n skills: string[] | 'all';\n workflows: string[] | 'all'; // Claude-only\n includeRouter: boolean; // Claude-only\n includeHooks: boolean; // Claude-only\n}\n\nexport const KITS: Record<string, Kit> = {\n engineer: {\n name: 'engineer',\n description: 'Full-stack development kit for building applications',\n emoji: '🛠️',\n color: 'blue',\n agents: [\n 'planner',\n 'debugger',\n 'fullstack-developer',\n 'tester',\n 'code-reviewer',\n 'git-manager',\n 'database-admin'\n ],\n commands: [\n 'plan', 'plan/parallel', 'plan/fast', 'plan/hard',\n 'code', 'code/auto', 'code/parallel',\n 'fix', 'fix/test', 'fix/types', 'fix/fast', 'fix/ci',\n 'test', 'test/ui',\n 'review', 'review/codebase',\n 'scout', 'build', 'lint'\n ],\n skills: [\n 'frontend-development',\n 'backend-development',\n 'databases',\n 'debugging',\n 'code-review',\n 'planning',\n 'problem-solving'\n ],\n workflows: ['feature-development', 'bug-fixing'],\n includeRouter: true,\n includeHooks: true\n },\n\n researcher: {\n name: 'researcher',\n description: 'Research and analysis kit for exploring codebases',\n emoji: '🔬',\n color: 'green',\n agents: [\n 'researcher',\n 'scout',\n 'scout-external',\n 'brainstormer',\n 'docs-manager',\n 'planner'\n ],\n commands: [\n 'scout', 'scout/ext',\n 'investigate', 'brainstorm',\n 'docs', 'docs/init', 'docs/update', 'docs/summarize',\n 'plan', 'ask', 'context'\n ],\n skills: [\n 'research',\n 'planning-with-files',\n 'documentation',\n 'project-index'\n ],\n workflows: [],\n includeRouter: true,\n includeHooks: false\n },\n\n designer: {\n name: 'designer',\n description: 'UI/UX design and frontend development kit',\n emoji: '🎨',\n color: 'magenta',\n agents: [\n 'ui-ux-designer',\n 'fullstack-developer',\n 'code-reviewer'\n ],\n commands: [\n 'code', 'fix', 'fix/ui', 'test/ui', 'review'\n ],\n skills: [\n 'ui-ux-pro-max',\n 'frontend-development',\n 'frontend-design'\n ],\n workflows: [],\n includeRouter: false,\n includeHooks: true\n },\n\n minimal: {\n name: 'minimal',\n description: 'Lightweight kit with essential agents only',\n emoji: '📦',\n color: 'yellow',\n agents: ['planner', 'debugger'],\n commands: ['plan', 'fix', 'code'],\n skills: ['planning', 'debugging'],\n workflows: [],\n includeRouter: false,\n includeHooks: false\n },\n\n full: {\n name: 'full',\n description: 'Complete kit with ALL agents, commands, and skills',\n emoji: '🚀',\n color: 'cyan',\n agents: 'all',\n commands: 'all',\n skills: 'all',\n workflows: 'all',\n includeRouter: true,\n includeHooks: true\n }\n};\n\nexport const getKit = (name: string): Kit | null => KITS[name] || null;\nexport const getKitNames = (): string[] => Object.keys(KITS);\nexport const getKitList = (): Kit[] => Object.values(KITS);\n","import { fileURLToPath } from 'url';\nimport { dirname, join, resolve } from 'path';\nimport { existsSync, statSync } from 'fs';\nimport { homedir } from 'os';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// When bundled with tsup, all code is in dist/index.js, so __dirname is 'dist'\n// When unbundled (dev), this file is in src/utils, so __dirname is 'src/utils'\n// We need to go up one level from dist, or two levels from src/utils\nexport const CLI_ROOT = __dirname.endsWith('dist')\n ? resolve(__dirname, '..')\n : resolve(__dirname, '../..');\nexport const TEMPLATES_DIR = join(CLI_ROOT, 'templates');\n\nexport const TARGETS: Record<string, string> = {\n claude: '.claude',\n gemini: '.gemini',\n discord: '.discord',\n opencode: '.opencode',\n generic: '.agent'\n};\n\nexport type CliTarget = 'claude' | 'gemini' | 'discord';\n\nexport interface SourceInfo {\n path: string;\n type: string;\n claudeDir: string;\n agentsMd: string | null;\n error?: undefined;\n}\n\nexport interface SourceError {\n error: string;\n}\n\n/**\n * Get embedded templates (bundled with CLI)\n */\nexport function getEmbeddedTemplates(): SourceInfo | null {\n if (existsSync(TEMPLATES_DIR)) {\n const agentsMd = join(TEMPLATES_DIR, 'AGENTS.md');\n return {\n path: TEMPLATES_DIR,\n type: 'embedded',\n claudeDir: TEMPLATES_DIR,\n agentsMd: existsSync(agentsMd) ? agentsMd : null\n };\n }\n return null;\n}\n\n/**\n * Get global installation path\n */\nexport function getGlobalInstallPath(): string {\n if (process.platform === 'win32') {\n return join(process.env.APPDATA || join(homedir(), 'AppData', 'Roaming'), 'claude');\n }\n return join(homedir(), '.claude');\n}\n\n/**\n * Check if current directory is an ak project\n */\nexport function isAkProject(dir: string = process.cwd()): boolean {\n const akConfig = join(dir, '.ak', 'state.json');\n const claudeDir = join(dir, '.claude');\n const geminiDir = join(dir, '.gemini');\n const opencodeDir = join(dir, '.opencode');\n const agentDir = join(dir, '.agent');\n\n return existsSync(akConfig) ||\n existsSync(claudeDir) ||\n existsSync(geminiDir) ||\n existsSync(opencodeDir) ||\n existsSync(agentDir);\n}\n\n/**\n * Get target directory path\n */\nexport function getTargetDir(projectDir: string, target: string = 'claude'): string {\n const folder = TARGETS[target] || TARGETS.claude;\n return join(projectDir, folder);\n}\n\n/**\n * Resolve source path (from --source flag or embedded templates)\n * Priority: 1. --source flag 2. Embedded templates\n */\nexport function resolveSource(sourceFlag?: string): SourceInfo | SourceError {\n // 1. If --source flag provided, use it\n if (sourceFlag) {\n const resolved = resolve(sourceFlag);\n if (!existsSync(resolved)) {\n return { error: `Source path not found: ${sourceFlag}` };\n }\n\n // Check if it's a valid source\n const claudeDir = join(resolved, '.claude');\n const opencodeDir = join(resolved, '.opencode');\n\n if (existsSync(claudeDir)) {\n return {\n path: resolved,\n type: 'custom',\n claudeDir,\n agentsMd: existsSync(join(resolved, 'AGENTS.md')) ? join(resolved, 'AGENTS.md') : null\n };\n }\n\n if (existsSync(opencodeDir)) {\n return {\n path: resolved,\n type: 'custom',\n claudeDir: opencodeDir,\n agentsMd: existsSync(join(resolved, 'AGENTS.md')) ? join(resolved, 'AGENTS.md') : null\n };\n }\n\n // If source flag points directly to a templates dir (no .claude wrapper)\n if (existsSync(join(resolved, 'agents')) || existsSync(join(resolved, 'commands'))) {\n return {\n path: resolved,\n type: 'custom',\n claudeDir: resolved,\n agentsMd: existsSync(join(resolved, 'AGENTS.md')) ? join(resolved, 'AGENTS.md') : null\n };\n }\n\n return { error: `No templates found in: ${sourceFlag}` };\n }\n\n // 2. Use embedded templates (bundled with CLI)\n const embedded = getEmbeddedTemplates();\n if (embedded) {\n return embedded;\n }\n\n return {\n error: 'No templates found. Reinstall: npm install -g apero-kit-cli'\n };\n}\n","import fs from 'fs-extra';\nimport { join, dirname } from 'path';\nimport type {\n ITargetAdapter,\n TargetConfig,\n TargetFeatures,\n CopyResult,\n InstallItems\n} from './types.js';\n\n/**\n * Abstract base adapter with common functionality\n */\nexport abstract class BaseTargetAdapter implements ITargetAdapter {\n abstract readonly config: TargetConfig;\n\n supports(feature: keyof TargetFeatures): boolean {\n return this.config.features[feature];\n }\n\n getSupportedFeatures(): (keyof TargetFeatures)[] {\n return Object.entries(this.config.features)\n .filter(([_, supported]) => supported)\n .map(([feature]) => feature as keyof TargetFeatures);\n }\n\n filterInstallItems(items: InstallItems): InstallItems {\n return {\n agents: this.supports('agents') ? items.agents : [],\n skills: this.supports('skills') ? items.skills : [],\n commands: this.supports('commands') ? items.commands : [],\n workflows: this.supports('workflows') ? items.workflows : [],\n includeRouter: this.supports('router') && items.includeRouter,\n includeHooks: this.supports('hooks') && items.includeHooks\n };\n }\n\n /**\n * Default: not supported - override in subclass if needed\n */\n async copyWorkflows(\n _items: string[] | 'all',\n _sourceDir: string,\n _targetDir: string,\n _mergeMode: boolean\n ): Promise<CopyResult> {\n return { copied: [], skipped: [], errors: [] };\n }\n\n async copyRouter(\n _sourceDir: string,\n _targetDir: string,\n _mergeMode: boolean\n ): Promise<{ success: boolean; error?: string }> {\n return { success: false, error: 'Router not supported by this target' };\n }\n\n async copyHooks(\n _sourceDir: string,\n _targetDir: string,\n _mergeMode: boolean\n ): Promise<{ success: boolean; error?: string }> {\n return { success: false, error: 'Hooks not supported by this target' };\n }\n\n async copyExtras(\n _sourceDir: string,\n _targetDir: string,\n _mergeMode: boolean\n ): Promise<string[]> {\n return [];\n }\n\n // Abstract methods - must be implemented by each adapter\n abstract copyAgents(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult>;\n\n abstract copySkills(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult>;\n\n abstract copyCommands(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult>;\n\n abstract copyBaseFiles(\n targetDir: string,\n mergeMode: boolean\n ): Promise<string[]>;\n\n // Helper methods for common operations\n protected async copyDirectory(\n dirName: string,\n sourceDir: string,\n destDir: string,\n mergeMode: boolean\n ): Promise<{ success: boolean; error?: string }> {\n const srcPath = join(sourceDir, dirName);\n\n if (!fs.existsSync(srcPath)) {\n return { success: false, error: `${dirName} directory not found` };\n }\n\n try {\n await fs.copy(srcPath, join(destDir, dirName), { overwrite: !mergeMode });\n return { success: true };\n } catch (err: any) {\n return { success: false, error: err.message };\n }\n }\n\n protected async copyFile(\n srcPath: string,\n destPath: string,\n mergeMode: boolean\n ): Promise<boolean> {\n if (mergeMode && fs.existsSync(destPath)) {\n return false;\n }\n\n if (fs.existsSync(srcPath)) {\n await fs.ensureDir(dirname(destPath));\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n return true;\n }\n\n return false;\n }\n\n protected async listItems(typeDir: string, extension?: string): Promise<string[]> {\n if (!fs.existsSync(typeDir)) {\n return [];\n }\n\n const entries = fs.readdirSync(typeDir);\n return entries\n .filter(e => {\n if (extension) {\n return e.endsWith(extension) && e !== 'README.md';\n }\n return e !== 'README.md';\n })\n .map(e => extension ? e.replace(extension, '') : e);\n }\n\n protected getItemList(items: string[] | 'all', typeDir: string, extension?: string): string[] {\n if (items === 'all') {\n return this.listItemsSync(typeDir, extension);\n }\n return items;\n }\n\n private listItemsSync(typeDir: string, extension?: string): string[] {\n if (!fs.existsSync(typeDir)) {\n return [];\n }\n\n const entries = fs.readdirSync(typeDir);\n let result = entries.filter(e => e !== 'README.md');\n\n if (extension) {\n result = result.filter(e => e.endsWith(extension)).map(e => e.replace(extension, ''));\n }\n\n // Remove duplicates (file.md and file/ both become 'file')\n return [...new Set(result.map(e => e.replace(/\\.md$/, '')))];\n }\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport { BaseTargetAdapter } from './base-adapter.js';\nimport type { TargetConfig, CopyResult } from './types.js';\n\n/**\n * Claude Code adapter - full feature support\n */\nexport class ClaudeAdapter extends BaseTargetAdapter {\n readonly config: TargetConfig = {\n name: 'claude',\n displayName: 'Claude Code',\n directory: '.claude',\n features: {\n agents: true,\n skills: true,\n commands: true,\n workflows: true,\n router: true,\n hooks: true,\n memory: true,\n scripts: true,\n 'output-styles': true\n }\n };\n\n async copyAgents(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'agents');\n const destTypeDir = join(targetDir, 'agents');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n if (items === 'all') {\n await fs.copy(typeDir, destTypeDir, { overwrite: !mergeMode });\n const entries = fs.readdirSync(typeDir).filter(e => e.endsWith('.md') && e !== 'README.md');\n return { copied: entries.map(e => e.replace('.md', '')), skipped: [], errors: [] };\n }\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const agent of items) {\n try {\n const srcPath = join(typeDir, agent + '.md');\n\n if (!fs.existsSync(srcPath)) {\n skipped.push(agent);\n continue;\n }\n\n const destPath = join(destTypeDir, agent + '.md');\n\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(agent);\n continue;\n }\n\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(agent);\n } catch (err: any) {\n errors.push({ item: agent, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n }\n\n async copySkills(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'skills');\n const destTypeDir = join(targetDir, 'skills');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n if (items === 'all') {\n await fs.copy(typeDir, destTypeDir, { overwrite: !mergeMode });\n const entries = fs.readdirSync(typeDir).filter(e => {\n const fullPath = join(typeDir, e);\n return fs.statSync(fullPath).isDirectory() && fs.existsSync(join(fullPath, 'SKILL.md'));\n });\n return { copied: entries, skipped: [], errors: [] };\n }\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const skill of items) {\n try {\n const srcPath = join(typeDir, skill);\n\n if (!fs.existsSync(srcPath) || !fs.statSync(srcPath).isDirectory()) {\n skipped.push(skill);\n continue;\n }\n\n if (!fs.existsSync(join(srcPath, 'SKILL.md'))) {\n skipped.push(skill);\n continue;\n }\n\n const destPath = join(destTypeDir, skill);\n\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(skill);\n continue;\n }\n\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(skill);\n } catch (err: any) {\n errors.push({ item: skill, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n }\n\n async copyCommands(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'commands');\n const destTypeDir = join(targetDir, 'commands');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n if (items === 'all') {\n await fs.copy(typeDir, destTypeDir, { overwrite: !mergeMode });\n const entries = fs.readdirSync(typeDir);\n return { copied: [...new Set(entries.map(e => e.replace('.md', '')))], skipped: [], errors: [] };\n }\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const item of items) {\n try {\n const itemPath = join(typeDir, item);\n const itemPathMd = itemPath + '.md';\n\n let srcPath: string | null = null;\n if (fs.existsSync(itemPath)) {\n srcPath = itemPath;\n } else if (fs.existsSync(itemPathMd)) {\n srcPath = itemPathMd;\n }\n\n if (!srcPath) {\n skipped.push(item);\n continue;\n }\n\n const stat = fs.statSync(srcPath);\n const destPath = stat.isDirectory()\n ? join(destTypeDir, item)\n : join(destTypeDir, item + '.md');\n\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(item);\n continue;\n }\n\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(item);\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n }\n\n async copyWorkflows(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'workflows');\n const destTypeDir = join(targetDir, 'workflows');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n if (items === 'all') {\n await fs.copy(typeDir, destTypeDir, { overwrite: !mergeMode });\n const entries = fs.readdirSync(typeDir);\n return { copied: entries.map(e => e.replace('.md', '')), skipped: [], errors: [] };\n }\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const item of items) {\n try {\n const srcPath = join(typeDir, item + '.md');\n\n if (!fs.existsSync(srcPath)) {\n skipped.push(item);\n continue;\n }\n\n const destPath = join(destTypeDir, item + '.md');\n\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(item);\n continue;\n }\n\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(item);\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n }\n\n async copyRouter(\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<{ success: boolean; error?: string }> {\n return this.copyDirectory('router', sourceDir, targetDir, mergeMode);\n }\n\n async copyHooks(\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<{ success: boolean; error?: string }> {\n return this.copyDirectory('hooks', sourceDir, targetDir, mergeMode);\n }\n\n async copyExtras(\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<string[]> {\n const extras = ['memory', 'output-styles', 'scripts'];\n const copied: string[] = [];\n\n for (const extra of extras) {\n const result = await this.copyDirectory(extra, sourceDir, targetDir, mergeMode);\n if (result.success) {\n copied.push(extra);\n }\n }\n\n return copied;\n }\n\n async copyBaseFiles(\n targetDir: string,\n mergeMode: boolean\n ): Promise<string[]> {\n const { CLI_ROOT } = await import('../utils/paths.js');\n const sourceDir = join(CLI_ROOT, 'templates');\n const baseFiles = ['README.md', 'settings.json', '.env.example', 'statusline.cjs', 'statusline.ps1', 'statusline.sh'];\n const copied: string[] = [];\n\n for (const file of baseFiles) {\n const srcPath = join(sourceDir, file);\n const destPath = join(targetDir, file);\n\n if (await this.copyFile(srcPath, destPath, mergeMode)) {\n copied.push(file);\n }\n }\n\n return copied;\n }\n}\n","import fs from 'fs-extra';\nimport { join, dirname } from 'path';\nimport { BaseTargetAdapter } from './base-adapter.js';\nimport type { TargetConfig, CopyResult } from './types.js';\n\n/**\n * Model mapping from Claude to Gemini\n */\nconst MODEL_MAP: Record<string, string> = {\n 'opus': 'gemini-2.5-pro',\n 'sonnet': 'gemini-2.5-flash',\n 'haiku': 'gemini-2.0-flash-lite',\n 'inherit': '' // Remove inherit, let Gemini use default\n};\n\n/**\n * Parse frontmatter from markdown file\n */\nfunction parseFrontmatter(content: string): { frontmatter: string; body: string } {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!match) {\n return { frontmatter: '', body: content };\n }\n return { frontmatter: match[1], body: match[2] };\n}\n\n/**\n * Escape TOML basic string\n */\nfunction escapeTomlString(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\t/g, '\\\\t');\n}\n\n/**\n * Convert Claude agent to Gemini format\n */\nfunction convertAgentToGemini(mdContent: string): string {\n const { frontmatter, body } = parseFrontmatter(mdContent);\n if (!frontmatter) return mdContent;\n\n let converted = frontmatter;\n\n // Map model names\n for (const [claudeModel, geminiModel] of Object.entries(MODEL_MAP)) {\n const regex = new RegExp(`^model:\\\\s*${claudeModel}\\\\s*$`, 'm');\n if (geminiModel) {\n converted = converted.replace(regex, `model: ${geminiModel}`);\n } else {\n converted = converted.replace(regex, '');\n }\n }\n\n // Remove tools field (different naming between Claude and Gemini)\n converted = converted.replace(/^tools:\\s*.+$/m, '');\n\n // Add kind: local if not present\n if (!converted.includes('kind:')) {\n converted = converted.trim() + '\\nkind: local';\n }\n\n return `---\\n${converted.trim()}\\n---\\n${body}`;\n}\n\n/**\n * Convert Claude MD command to Gemini TOML format\n */\nfunction convertCommandToToml(mdContent: string): string {\n const { frontmatter, body } = parseFrontmatter(mdContent);\n\n // Extract description from frontmatter\n const descMatch = frontmatter.match(/description:\\s*(.+)/);\n const description = descMatch ? descMatch[1].trim() : '';\n\n // Convert $ARGUMENTS to {{args}}\n const prompt = body.trim().replace(/\\$ARGUMENTS/g, '{{args}}');\n\n const lines: string[] = [];\n\n if (description) {\n lines.push(`description = \"${escapeTomlString(description)}\"`);\n }\n\n // Use multi-line literal strings (''') for prompt\n lines.push(`prompt = '''\\n${prompt}\\n'''`);\n\n return lines.join('\\n');\n}\n\n/**\n * Gemini CLI adapter - converts Claude format to Gemini\n */\nexport class GeminiAdapter extends BaseTargetAdapter {\n readonly config: TargetConfig = {\n name: 'gemini',\n displayName: 'Gemini CLI',\n directory: '.gemini',\n features: {\n agents: true,\n skills: true,\n commands: true,\n workflows: false,\n router: false,\n hooks: false,\n memory: false,\n scripts: false,\n 'output-styles': false\n }\n };\n\n async copyAgents(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'agents');\n const destTypeDir = join(targetDir, 'agents');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n // Get agent list\n let agentList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n agentList = entries\n .filter(e => e.endsWith('.md') && e !== 'README.md')\n .map(e => e.replace('.md', ''));\n } else {\n agentList = items;\n }\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const agent of agentList) {\n try {\n const srcPath = join(typeDir, agent + '.md');\n\n if (!fs.existsSync(srcPath)) {\n skipped.push(agent);\n continue;\n }\n\n const destPath = join(destTypeDir, agent + '.md');\n\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(agent);\n continue;\n }\n\n // Convert and write\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const convertedContent = convertAgentToGemini(mdContent);\n await fs.writeFile(destPath, convertedContent, 'utf-8');\n copied.push(agent);\n } catch (err: any) {\n errors.push({ item: agent, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n }\n\n async copySkills(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult> {\n // Skills use same SKILL.md format - copy directly\n const typeDir = join(sourceDir, 'skills');\n const destTypeDir = join(targetDir, 'skills');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n // Get skill list\n let skillList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n skillList = entries.filter(e => {\n const fullPath = join(typeDir, e);\n return fs.statSync(fullPath).isDirectory() && fs.existsSync(join(fullPath, 'SKILL.md'));\n });\n } else {\n skillList = items;\n }\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const skill of skillList) {\n try {\n const srcPath = join(typeDir, skill);\n\n if (!fs.existsSync(srcPath) || !fs.statSync(srcPath).isDirectory()) {\n skipped.push(skill);\n continue;\n }\n\n if (!fs.existsSync(join(srcPath, 'SKILL.md'))) {\n skipped.push(skill);\n continue;\n }\n\n const destPath = join(destTypeDir, skill);\n\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(skill);\n continue;\n }\n\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(skill);\n } catch (err: any) {\n errors.push({ item: skill, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n }\n\n async copyCommands(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'commands');\n const destTypeDir = join(targetDir, 'commands');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n // Get item list\n let itemList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n itemList = [...new Set(entries.map(e => e.replace('.md', '')))];\n } else {\n itemList = items;\n }\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const item of itemList) {\n try {\n const srcPathMd = join(typeDir, item + '.md');\n const srcPathDir = join(typeDir, item);\n\n let copiedSomething = false;\n\n // Handle .md file - convert to TOML\n if (fs.existsSync(srcPathMd) && fs.statSync(srcPathMd).isFile()) {\n const destPath = join(destTypeDir, item + '.toml');\n\n if (!(mergeMode && fs.existsSync(destPath))) {\n await fs.ensureDir(dirname(destPath));\n const mdContent = fs.readFileSync(srcPathMd, 'utf-8');\n const tomlContent = convertCommandToToml(mdContent);\n await fs.writeFile(destPath, tomlContent, 'utf-8');\n copiedSomething = true;\n }\n }\n\n // Handle directory - convert recursively\n if (fs.existsSync(srcPathDir) && fs.statSync(srcPathDir).isDirectory()) {\n await this.convertDirectoryToToml(srcPathDir, join(destTypeDir, item), mergeMode);\n copiedSomething = true;\n }\n\n if (copiedSomething) {\n copied.push(item);\n } else {\n skipped.push(item);\n }\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n }\n\n private async convertDirectoryToToml(\n srcDir: string,\n destDir: string,\n mergeMode: boolean\n ): Promise<void> {\n await fs.ensureDir(destDir);\n\n const entries = fs.readdirSync(srcDir);\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry);\n const stat = fs.statSync(srcPath);\n\n if (stat.isDirectory()) {\n await this.convertDirectoryToToml(srcPath, join(destDir, entry), mergeMode);\n } else if (entry.endsWith('.md')) {\n const destPath = join(destDir, entry.replace('.md', '.toml'));\n\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const tomlContent = convertCommandToToml(mdContent);\n await fs.writeFile(destPath, tomlContent, 'utf-8');\n } else {\n // Copy non-MD files as-is\n const destPath = join(destDir, entry);\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n }\n }\n }\n\n async copyBaseFiles(\n targetDir: string,\n mergeMode: boolean\n ): Promise<string[]> {\n const { CLI_ROOT } = await import('../utils/paths.js');\n const geminiTemplates = join(CLI_ROOT, 'templates', 'gemini');\n const copied: string[] = [];\n\n const settingsPath = join(geminiTemplates, 'settings.json');\n const destSettingsPath = join(targetDir, 'settings.json');\n\n if (fs.existsSync(settingsPath)) {\n if (!(mergeMode && fs.existsSync(destSettingsPath))) {\n await fs.copy(settingsPath, destSettingsPath, { overwrite: !mergeMode });\n copied.push('settings.json');\n }\n }\n\n return copied;\n }\n}\n","import fs from 'fs-extra';\nimport { join, dirname } from 'path';\nimport { BaseTargetAdapter } from './base-adapter.js';\nimport type { TargetConfig, CopyResult } from './types.js';\n\n/**\n * Model mapping from Claude to Discord/OpenClaw\n */\nconst MODEL_MAP: Record<string, string> = {\n 'opus': 'claude-3-opus',\n 'sonnet': 'claude-3-sonnet',\n 'haiku': 'claude-3-haiku',\n 'inherit': ''\n};\n\n/**\n * Parse frontmatter from markdown file\n */\nfunction parseFrontmatter(content: string): {\n frontmatter: string;\n body: string;\n description: string;\n argumentHint: string;\n} {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!match) {\n return { frontmatter: '', body: content, description: '', argumentHint: '' };\n }\n\n const frontmatter = match[1];\n const body = match[2].trim();\n const descMatch = frontmatter.match(/description:\\s*(.+)/);\n const argMatch = frontmatter.match(/argument-hint:\\s*(.+)/);\n\n return {\n frontmatter,\n body,\n description: descMatch ? descMatch[1].trim() : '',\n argumentHint: argMatch ? argMatch[1].trim() : ''\n };\n}\n\n/**\n * Convert Claude agent to Discord format\n */\nfunction convertAgentToDiscord(mdContent: string): string {\n const { frontmatter, body } = parseFrontmatter(mdContent);\n if (!frontmatter) return mdContent;\n\n let converted = frontmatter;\n\n // Map model names\n for (const [claudeModel, discordModel] of Object.entries(MODEL_MAP)) {\n const regex = new RegExp(`^model:\\\\s*${claudeModel}\\\\s*$`, 'm');\n if (discordModel) {\n converted = converted.replace(regex, `model: ${discordModel}`);\n } else {\n converted = converted.replace(regex, '');\n }\n }\n\n // Remove tools field\n converted = converted.replace(/^tools:\\s*.+$/m, '');\n\n // Add kind: local if not present\n if (!converted.includes('kind:')) {\n converted = converted.trim() + '\\nkind: local';\n }\n\n return `---\\n${converted.trim()}\\n---\\n${body}`;\n}\n\n/**\n * Extract keywords from command content for trigger conditions\n */\nfunction extractKeywords(content: string, commandName: string): string[] {\n const keywords = new Set<string>();\n\n keywords.add(commandName);\n keywords.add(commandName.replace(/-/g, ' '));\n\n const intentMap: Record<string, string[]> = {\n 'plan': ['plan', 'design', 'architect', 'implement', 'create plan'],\n 'brainstorm': ['brainstorm', 'ideas', 'options', 'alternatives'],\n 'fix': ['fix', 'debug', 'error', 'broken', 'issue', 'bug'],\n 'code': ['code', 'implement', 'build', 'develop', 'write code'],\n 'review': ['review', 'check', 'audit', 'look at'],\n 'test': ['test', 'testing', 'spec', 'unit test'],\n 'scout': ['scout', 'search', 'find', 'explore codebase'],\n 'debug': ['debug', 'trace', 'diagnose', 'investigate']\n };\n\n const baseName = commandName.split('/')[0].split(':')[0];\n if (intentMap[baseName]) {\n intentMap[baseName].forEach(k => keywords.add(k));\n }\n\n return Array.from(keywords).slice(0, 10);\n}\n\n/**\n * Convert command to OpenClaw SKILL.md format\n */\nfunction convertCommandToSkill(mdContent: string, commandName: string): string {\n const { description, argumentHint, body } = parseFrontmatter(mdContent);\n const prompt = body.replace(/\\$ARGUMENTS/g, '{{args}}');\n const keywords = extractKeywords(body, commandName);\n\n return `---\nname: ${commandName.replace(/\\//g, '-')}\ndescription: ${description || `Execute ${commandName} task`}\nuser-invocable: true\ndisable-model-invocation: false\nmetadata: {\"openclaw\": {\"always\": true}}\n---\n\n# ${commandName.charAt(0).toUpperCase() + commandName.slice(1).replace(/-/g, ' ')}\n\n## Trigger Conditions\n\nActivate when user mentions:\n${keywords.map(k => `- \"${k}\"`).join('\\n')}\n\n## Input\n${argumentHint ? `Expected input: ${argumentHint.replace('$ARGUMENTS', '{{args}}')}` : 'User provides task description in natural language.'}\n\n## Workflow\n\n${prompt}\n\n## Output Format\n\nProvide clear, actionable response based on the workflow above.\n`;\n}\n\n/**\n * Discord/OpenClaw adapter\n */\nexport class DiscordAdapter extends BaseTargetAdapter {\n readonly config: TargetConfig = {\n name: 'discord',\n displayName: 'Discord + OpenClaw',\n directory: '.discord',\n features: {\n agents: true,\n skills: true,\n commands: true,\n workflows: false,\n router: false,\n hooks: false,\n memory: false,\n scripts: false,\n 'output-styles': false\n }\n };\n\n async copyAgents(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'agents');\n const destTypeDir = join(targetDir, 'agents');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n let agentList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n agentList = entries\n .filter(e => e.endsWith('.md') && e !== 'README.md')\n .map(e => e.replace('.md', ''));\n } else {\n agentList = items;\n }\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const agent of agentList) {\n try {\n const srcPath = join(typeDir, agent + '.md');\n\n if (!fs.existsSync(srcPath)) {\n skipped.push(agent);\n continue;\n }\n\n const destPath = join(destTypeDir, agent + '.md');\n\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(agent);\n continue;\n }\n\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const convertedContent = convertAgentToDiscord(mdContent);\n await fs.writeFile(destPath, convertedContent, 'utf-8');\n copied.push(agent);\n } catch (err: any) {\n errors.push({ item: agent, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n }\n\n async copySkills(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult> {\n // Skills use same SKILL.md format\n const typeDir = join(sourceDir, 'skills');\n const destTypeDir = join(targetDir, 'skills');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n let skillList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n skillList = entries.filter(e => {\n const fullPath = join(typeDir, e);\n return fs.statSync(fullPath).isDirectory() && fs.existsSync(join(fullPath, 'SKILL.md'));\n });\n } else {\n skillList = items;\n }\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const skill of skillList) {\n try {\n const srcPath = join(typeDir, skill);\n\n if (!fs.existsSync(srcPath) || !fs.statSync(srcPath).isDirectory()) {\n skipped.push(skill);\n continue;\n }\n\n if (!fs.existsSync(join(srcPath, 'SKILL.md'))) {\n skipped.push(skill);\n continue;\n }\n\n const destPath = join(destTypeDir, skill);\n\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(skill);\n continue;\n }\n\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(skill);\n } catch (err: any) {\n errors.push({ item: skill, error: err.message });\n }\n }\n\n // Also copy bundled Discord-specific skills\n const bundledCopied = await this.copyBundledSkills(targetDir, mergeMode);\n copied.push(...bundledCopied);\n\n return { copied, skipped, errors };\n }\n\n async copyCommands(\n items: string[] | 'all',\n sourceDir: string,\n targetDir: string,\n mergeMode: boolean\n ): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'commands');\n const destTypeDir = join(targetDir, 'commands');\n const destSkillsDir = join(targetDir, 'skills');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n await fs.ensureDir(destSkillsDir);\n\n let itemList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n itemList = entries\n .filter(e => e.endsWith('.md') && e !== 'README.md')\n .map(e => e.replace('.md', ''));\n // Also get directories\n const dirs = entries.filter(e => {\n const fullPath = join(typeDir, e);\n return fs.statSync(fullPath).isDirectory();\n });\n itemList = [...new Set([...itemList, ...dirs])];\n } else {\n itemList = items;\n }\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n const commandsConfig: Record<string, { description: string; prompt: string }> = {};\n\n for (const item of itemList) {\n try {\n const srcPathMd = join(typeDir, item + '.md');\n const srcPathDir = join(typeDir, item);\n\n // Handle .md file\n if (fs.existsSync(srcPathMd) && fs.statSync(srcPathMd).isFile()) {\n const destPath = join(destTypeDir, item + '.md');\n const skillDir = join(destSkillsDir, item.replace(/\\//g, '-'));\n const skillPath = join(skillDir, 'SKILL.md');\n\n if (!(mergeMode && fs.existsSync(destPath))) {\n await fs.ensureDir(dirname(destPath));\n const mdContent = fs.readFileSync(srcPathMd, 'utf-8');\n\n // Copy MD as-is\n await fs.copy(srcPathMd, destPath, { overwrite: !mergeMode });\n\n // Also convert to skill\n if (!(mergeMode && fs.existsSync(skillPath))) {\n await fs.ensureDir(skillDir);\n const skillContent = convertCommandToSkill(mdContent, item);\n await fs.writeFile(skillPath, skillContent, 'utf-8');\n }\n\n // Add to commands config\n const { description, body } = parseFrontmatter(mdContent);\n commandsConfig[item] = {\n description: description || `Execute ${item} command`,\n prompt: body.replace(/\\$ARGUMENTS/g, '{{args}}')\n };\n\n copied.push(item);\n } else {\n skipped.push(item);\n }\n }\n\n // Handle directory (nested commands)\n if (fs.existsSync(srcPathDir) && fs.statSync(srcPathDir).isDirectory()) {\n await this.copyNestedCommands(srcPathDir, destTypeDir, destSkillsDir, item, mergeMode, commandsConfig);\n copied.push(item + '/*');\n }\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n // Write commands.json5 config\n const configPath = join(targetDir, 'commands.json5');\n if (Object.keys(commandsConfig).length > 0 && !(mergeMode && fs.existsSync(configPath))) {\n const json5Content = this.generateCommandsJson5(commandsConfig);\n await fs.writeFile(configPath, json5Content, 'utf-8');\n }\n\n return { copied, skipped, errors };\n }\n\n private async copyNestedCommands(\n srcDir: string,\n destDir: string,\n destSkillsDir: string,\n parentName: string,\n mergeMode: boolean,\n commandsConfig: Record<string, { description: string; prompt: string }>\n ): Promise<void> {\n const destTypeDir = join(destDir, parentName);\n await fs.ensureDir(destTypeDir);\n\n const entries = fs.readdirSync(srcDir);\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry);\n const stat = fs.statSync(srcPath);\n\n if (stat.isDirectory()) {\n await this.copyNestedCommands(\n srcPath,\n destTypeDir,\n destSkillsDir,\n entry,\n mergeMode,\n commandsConfig\n );\n } else if (entry.endsWith('.md') && entry !== 'README.md') {\n const destPath = join(destTypeDir, entry);\n const cmdName = `${parentName}/${entry.replace('.md', '')}`;\n const skillName = cmdName.replace(/\\//g, '-');\n const skillDir = join(destSkillsDir, skillName);\n const skillPath = join(skillDir, 'SKILL.md');\n\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n\n // Copy MD\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n\n // Convert to skill\n if (!(mergeMode && fs.existsSync(skillPath))) {\n await fs.ensureDir(skillDir);\n const skillContent = convertCommandToSkill(mdContent, skillName);\n await fs.writeFile(skillPath, skillContent, 'utf-8');\n }\n\n // Add to config\n const { description, body } = parseFrontmatter(mdContent);\n commandsConfig[cmdName] = {\n description: description || `Execute ${cmdName} command`,\n prompt: body.replace(/\\$ARGUMENTS/g, '{{args}}')\n };\n }\n }\n }\n\n private generateCommandsJson5(\n commands: Record<string, { description: string; prompt: string }>\n ): string {\n const lines: string[] = [\n '// Clawbot Commands Configuration',\n '// Generated by Apero Kit CLI',\n '{',\n ' \"commands\": {'\n ];\n\n const cmdEntries = Object.entries(commands);\n cmdEntries.forEach(([name, cmd], index) => {\n const safeName = name.replace(/\\//g, ':');\n const isLast = index === cmdEntries.length - 1;\n\n lines.push(` \"${safeName}\": {`);\n lines.push(` \"description\": ${JSON.stringify(cmd.description)},`);\n lines.push(` \"prompt\": ${JSON.stringify(cmd.prompt)}`);\n lines.push(` }${isLast ? '' : ','}`);\n });\n\n lines.push(' }');\n lines.push('}');\n\n return lines.join('\\n');\n }\n\n private async copyBundledSkills(\n targetDir: string,\n mergeMode: boolean\n ): Promise<string[]> {\n const { CLI_ROOT } = await import('../utils/paths.js');\n const bundledSkillsDir = join(CLI_ROOT, 'templates', 'discord', 'skills');\n const destSkillsDir = join(targetDir, 'skills');\n const copied: string[] = [];\n\n if (!fs.existsSync(bundledSkillsDir)) {\n return copied;\n }\n\n await fs.ensureDir(destSkillsDir);\n\n const skills = fs.readdirSync(bundledSkillsDir);\n for (const skill of skills) {\n const srcPath = join(bundledSkillsDir, skill);\n const destPath = join(destSkillsDir, skill);\n\n if (fs.statSync(srcPath).isDirectory()) {\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(`bundled:${skill}`);\n }\n }\n\n return copied;\n }\n\n async copyBaseFiles(\n targetDir: string,\n mergeMode: boolean\n ): Promise<string[]> {\n const { CLI_ROOT } = await import('../utils/paths.js');\n const discordTemplates = join(CLI_ROOT, 'templates', 'discord');\n const copied: string[] = [];\n\n const filesToCopy = ['config.json5', 'README.md'];\n\n for (const file of filesToCopy) {\n const srcPath = join(discordTemplates, file);\n const destPath = join(targetDir, file);\n\n if (fs.existsSync(srcPath)) {\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(file);\n }\n }\n\n return copied;\n }\n\n /**\n * Update Discord config with bot token\n */\n async updateConfig(\n targetDir: string,\n token: string,\n guildId?: string\n ): Promise<void> {\n const configPath = join(targetDir, 'config.json5');\n\n if (!fs.existsSync(configPath)) {\n return;\n }\n\n let content = await fs.readFile(configPath, 'utf-8');\n\n content = content.replace(\n '\"token\": \"${DISCORD_BOT_TOKEN}\"',\n `\"token\": \"${token}\"`\n );\n\n if (guildId) {\n const guildConfig = `\"${guildId}\": {\n \"requireMention\": true,\n \"users\": [],\n \"roles\": [],\n \"channels\": {}\n }`;\n\n content = content.replace(\n '\"guilds\": {\\n // Example guild configuration',\n `\"guilds\": {\\n ${guildConfig},\\n // Example guild configuration`\n );\n }\n\n await fs.writeFile(configPath, content, 'utf-8');\n }\n\n /**\n * Setup OpenClaw CLI configuration\n */\n async setupOpenClaw(token: string): Promise<{ success: boolean; message: string }> {\n const { execSync } = await import('child_process');\n\n try {\n execSync('which openclaw', { stdio: 'ignore' });\n } catch {\n return { success: false, message: 'OpenClaw CLI not installed. Run: npm install -g openclaw' };\n }\n\n try {\n execSync(`openclaw config set channels.discord.token '\"${token}\"' --json`, { stdio: 'ignore' });\n execSync('openclaw config set channels.discord.enabled true --json', { stdio: 'ignore' });\n execSync('openclaw config set gateway.mode local', { stdio: 'ignore' });\n return { success: true, message: 'OpenClaw configured successfully!' };\n } catch (error: any) {\n return { success: false, message: `Failed to configure OpenClaw: ${error.message}` };\n }\n }\n}\n","/**\n * Target Registry - Central registry for all supported CLI targets\n */\n\nimport type { ITargetAdapter, TargetFeatures } from './types.js';\nimport { ClaudeAdapter } from './claude-adapter.js';\nimport { GeminiAdapter } from './gemini-adapter.js';\nimport { DiscordAdapter } from './discord-adapter.js';\n\nexport type { ITargetAdapter, TargetConfig, TargetFeatures, CopyResult, InstallItems } from './types.js';\nexport { ClaudeAdapter } from './claude-adapter.js';\nexport { GeminiAdapter } from './gemini-adapter.js';\nexport { DiscordAdapter } from './discord-adapter.js';\n\n/**\n * Supported target names\n */\nexport type TargetName = 'claude' | 'gemini' | 'discord';\n\n/**\n * Target registry - singleton instances\n */\nconst adapters: Record<TargetName, ITargetAdapter> = {\n claude: new ClaudeAdapter(),\n gemini: new GeminiAdapter(),\n discord: new DiscordAdapter()\n};\n\n/**\n * Get adapter for a target\n */\nexport function getAdapter(target: TargetName): ITargetAdapter {\n const adapter = adapters[target];\n if (!adapter) {\n throw new Error(`Unknown target: ${target}. Available: ${Object.keys(adapters).join(', ')}`);\n }\n return adapter;\n}\n\n/**\n * Get all available adapters\n */\nexport function getAllAdapters(): Record<TargetName, ITargetAdapter> {\n return { ...adapters };\n}\n\n/**\n * Get list of supported target names\n */\nexport function getSupportedTargets(): TargetName[] {\n return Object.keys(adapters) as TargetName[];\n}\n\n/**\n * Check if a target is supported\n */\nexport function isValidTarget(target: string): target is TargetName {\n return target in adapters;\n}\n\n/**\n * Get target directory name\n */\nexport function getTargetDirectory(target: TargetName): string {\n return adapters[target].config.directory;\n}\n\n/**\n * Get target display name\n */\nexport function getTargetDisplayName(target: TargetName): string {\n return adapters[target].config.displayName;\n}\n\n/**\n * Get feature support matrix for all targets\n */\nexport function getFeatureMatrix(): Record<TargetName, TargetFeatures> {\n const matrix: Record<string, TargetFeatures> = {};\n for (const [name, adapter] of Object.entries(adapters)) {\n matrix[name] = adapter.config.features;\n }\n return matrix as Record<TargetName, TargetFeatures>;\n}\n\n/**\n * Check if a feature is supported by a target\n */\nexport function targetSupports(target: TargetName, feature: keyof TargetFeatures): boolean {\n return adapters[target].supports(feature);\n}\n\n/**\n * Get targets that support a specific feature\n */\nexport function getTargetsWithFeature(feature: keyof TargetFeatures): TargetName[] {\n return Object.entries(adapters)\n .filter(([_, adapter]) => adapter.supports(feature))\n .map(([name]) => name as TargetName);\n}\n","import { createHash } from 'crypto';\nimport fs from 'fs-extra';\nimport { join, relative } from 'path';\n\n/**\n * Calculate MD5 hash of a file\n */\nexport function hashFile(filePath: string): string | null {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n\n const content = fs.readFileSync(filePath);\n return createHash('md5').update(content).digest('hex');\n}\n\n/**\n * Calculate hashes for all files in a directory\n */\nexport async function hashDirectory(dirPath: string, baseDir: string = dirPath): Promise<Record<string, string>> {\n const hashes: Record<string, string> = {};\n\n if (!fs.existsSync(dirPath)) {\n return hashes;\n }\n\n const items = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const item of items) {\n const itemPath = join(dirPath, item.name);\n const relativePath = relative(baseDir, itemPath);\n\n if (item.isDirectory()) {\n const subHashes = await hashDirectory(itemPath, baseDir);\n Object.assign(hashes, subHashes);\n } else if (item.isFile()) {\n const hash = hashFile(itemPath);\n if (hash) {\n hashes[relativePath] = hash;\n }\n }\n }\n\n return hashes;\n}\n\nexport interface HashComparison {\n unchanged: string[];\n modified: string[];\n added: string[];\n deleted: string[];\n}\n\n/**\n * Compare two hash maps and return differences\n */\nexport function compareHashes(original: Record<string, string>, current: Record<string, string>): HashComparison {\n const result: HashComparison = {\n unchanged: [],\n modified: [],\n added: [],\n deleted: []\n };\n\n // Check original files\n for (const [path, hash] of Object.entries(original)) {\n if (current[path] === undefined) {\n result.deleted.push(path);\n } else if (current[path] !== hash) {\n result.modified.push(path);\n } else {\n result.unchanged.push(path);\n }\n }\n\n // Check for new files\n for (const path of Object.keys(current)) {\n if (original[path] === undefined) {\n result.added.push(path);\n }\n }\n\n return result;\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport { hashDirectory } from './hash.js';\n\nconst STATE_DIR = '.ak';\nconst STATE_FILE = 'state.json';\n\nexport interface ProjectState {\n version: string;\n createdAt: string;\n lastUpdate: string;\n kit: string;\n source: string;\n target: string;\n targets?: string[]; // Multiple CLI targets (claude, gemini)\n installed: {\n agents?: string[];\n skills?: string[];\n commands?: string[];\n workflows?: string[];\n router?: boolean;\n hooks?: boolean;\n };\n originalHashes: Record<string, string>;\n}\n\n/**\n * Get state file path\n */\nexport function getStatePath(projectDir: string): string {\n return join(projectDir, STATE_DIR, STATE_FILE);\n}\n\n/**\n * Load state from .ak/state.json\n */\nexport async function loadState(projectDir: string): Promise<ProjectState | null> {\n const statePath = getStatePath(projectDir);\n\n if (!fs.existsSync(statePath)) {\n return null;\n }\n\n try {\n return await fs.readJson(statePath);\n } catch {\n return null;\n }\n}\n\n/**\n * Save state to .ak/state.json\n */\nexport async function saveState(projectDir: string, state: ProjectState): Promise<void> {\n const stateDir = join(projectDir, STATE_DIR);\n const statePath = join(stateDir, STATE_FILE);\n\n await fs.ensureDir(stateDir);\n await fs.writeJson(statePath, state, { spaces: 2 });\n}\n\nexport interface CreateStateOptions {\n kit: string;\n source: string;\n target: string;\n targets?: string[];\n installed: ProjectState['installed'];\n}\n\n/**\n * Create initial state after init\n */\nexport async function createInitialState(projectDir: string, options: CreateStateOptions): Promise<ProjectState> {\n const { kit, source, target, targets, installed } = options;\n\n // Calculate hashes for all target directories\n const allHashes: Record<string, string> = {};\n const targetList = targets || [target.replace('.', '')]; // fallback to single target\n\n for (const t of targetList) {\n const targetDirName = t.startsWith('.') ? t : `.${t}`;\n const targetDir = join(projectDir, targetDirName);\n if (fs.existsSync(targetDir)) {\n const hashes = await hashDirectory(targetDir);\n // Prefix hashes with target name for uniqueness\n for (const [path, hash] of Object.entries(hashes)) {\n allHashes[`${targetDirName}/${path}`] = hash;\n }\n }\n }\n\n const state: ProjectState = {\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n lastUpdate: new Date().toISOString(),\n kit,\n source,\n target,\n targets,\n installed,\n originalHashes: allHashes\n };\n\n await saveState(projectDir, state);\n return state;\n}\n\n/**\n * Update state after update command\n */\nexport async function updateState(projectDir: string, updates: Partial<ProjectState>): Promise<ProjectState> {\n const state = await loadState(projectDir);\n\n if (!state) {\n throw new Error('No state found. Is this an ak project?');\n }\n\n const targetDir = join(projectDir, state.target || '.claude');\n const newHashes = await hashDirectory(targetDir);\n\n const updatedState: ProjectState = {\n ...state,\n ...updates,\n lastUpdate: new Date().toISOString(),\n originalHashes: newHashes\n };\n\n await saveState(projectDir, updatedState);\n return updatedState;\n}\n\nexport interface FileStatuses {\n state: ProjectState;\n statuses: {\n unchanged: string[];\n modified: string[];\n added: string[];\n deleted: string[];\n };\n targetDir: string;\n}\n\nexport interface FileStatusError {\n error: string;\n}\n\n/**\n * Get file status (unchanged, modified, added, deleted)\n */\nexport async function getFileStatuses(projectDir: string): Promise<FileStatuses | FileStatusError> {\n const state = await loadState(projectDir);\n\n if (!state) {\n return { error: 'No state found' };\n }\n\n const targetDir = join(projectDir, state.target || '.claude');\n const currentHashes = await hashDirectory(targetDir);\n const originalHashes = state.originalHashes || {};\n\n const statuses = {\n unchanged: [] as string[],\n modified: [] as string[],\n added: [] as string[],\n deleted: [] as string[]\n };\n\n // Check original files\n for (const [path, hash] of Object.entries(originalHashes)) {\n if (currentHashes[path] === undefined) {\n statuses.deleted.push(path);\n } else if (currentHashes[path] !== hash) {\n statuses.modified.push(path);\n } else {\n statuses.unchanged.push(path);\n }\n }\n\n // Check for new files\n for (const path of Object.keys(currentHashes)) {\n if (originalHashes[path] === undefined) {\n statuses.added.push(path);\n }\n }\n\n return {\n state,\n statuses,\n targetDir\n };\n}\n","import fs from 'fs-extra';\nimport { join, basename, dirname } from 'path';\nimport type { CliTarget } from './paths.js';\nimport { CLI_ROOT } from './paths.js';\n\n/**\n * Parse frontmatter from markdown file\n */\nfunction parseFrontmatter(content: string): { description: string; argumentHint: string; body: string } {\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\n if (!frontmatterMatch) {\n return { description: '', argumentHint: '', body: content };\n }\n\n const frontmatter = frontmatterMatch[1];\n const body = frontmatterMatch[2].trim();\n\n const descMatch = frontmatter.match(/description:\\s*(.+)/);\n const argMatch = frontmatter.match(/argument-hint:\\s*(.+)/);\n\n return {\n description: descMatch ? descMatch[1].trim() : '',\n argumentHint: argMatch ? argMatch[1].trim() : '',\n body\n };\n}\n\n/**\n * Escape TOML basic string (single line)\n */\nfunction escapeTomlBasicString(str: string): string {\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\t/g, '\\\\t');\n}\n\n/**\n * Convert Claude MD command to Gemini TOML format\n * Uses literal strings (''') for prompts to avoid escape issues\n */\nexport function convertMdToToml(mdContent: string): string {\n const { description, body } = parseFrontmatter(mdContent);\n\n // Convert $ARGUMENTS to {{args}}\n const prompt = body.replace(/\\$ARGUMENTS/g, '{{args}}');\n\n const lines: string[] = [];\n\n if (description) {\n // Use basic string for short description (escape special chars)\n lines.push(`description = \"${escapeTomlBasicString(description)}\"`);\n }\n\n // Use multi-line LITERAL strings (''') for prompt - no escape processing\n // This avoids issues with backslashes in shell commands\n lines.push(`prompt = '''\\n${prompt}\\n'''`);\n\n return lines.join('\\n');\n}\n\nexport interface CopyResult {\n copied: string[];\n skipped: string[];\n errors: Array<{ item: string; error: string }>;\n}\n\nexport interface CopyStatusResult {\n success: boolean;\n error?: string;\n}\n\nexport interface AvailableItem {\n name: string;\n isDir: boolean;\n path: string;\n}\n\n/**\n * Copy specific items from source to destination\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyItems(\n items: string[],\n type: string,\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, type);\n const destTypeDir = join(destDir, type);\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: items, errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n for (const item of items) {\n try {\n // Handle nested paths like \"plan/parallel\"\n const itemPath = join(typeDir, item);\n const itemPathMd = itemPath + '.md';\n\n let srcPath: string;\n if (fs.existsSync(itemPath)) {\n srcPath = itemPath;\n } else if (fs.existsSync(itemPathMd)) {\n srcPath = itemPathMd;\n } else {\n skipped.push(item);\n continue;\n }\n\n // Determine destination path\n const stat = fs.statSync(srcPath);\n if (stat.isDirectory()) {\n await fs.copy(srcPath, join(destTypeDir, item), { overwrite: !mergeMode });\n } else {\n // Preserve directory structure for nested items\n const destPath = srcPath.endsWith('.md')\n ? join(destTypeDir, item + '.md')\n : join(destTypeDir, item);\n await fs.ensureDir(join(destTypeDir, item.split('/').slice(0, -1).join('/')));\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n }\n\n copied.push(item);\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Copy all items of a type\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyAllOfType(\n type: string,\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyStatusResult> {\n const typeDir = join(sourceDir, type);\n const destTypeDir = join(destDir, type);\n\n if (!fs.existsSync(typeDir)) {\n return { success: false, error: `${type} directory not found` };\n }\n\n try {\n await fs.copy(typeDir, destTypeDir, { overwrite: !mergeMode });\n return { success: true };\n } catch (err: any) {\n return { success: false, error: err.message };\n }\n}\n\n/**\n * Copy router directory\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyRouter(\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyStatusResult> {\n const routerDir = join(sourceDir, 'router');\n\n if (!fs.existsSync(routerDir)) {\n return { success: false, error: 'Router directory not found' };\n }\n\n try {\n await fs.copy(routerDir, join(destDir, 'router'), { overwrite: !mergeMode });\n return { success: true };\n } catch (err: any) {\n return { success: false, error: err.message };\n }\n}\n\n/**\n * Copy hooks directory\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyHooks(\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyStatusResult> {\n const hooksDir = join(sourceDir, 'hooks');\n\n if (!fs.existsSync(hooksDir)) {\n return { success: false, error: 'Hooks directory not found' };\n }\n\n try {\n await fs.copy(hooksDir, join(destDir, 'hooks'), { overwrite: !mergeMode });\n return { success: true };\n } catch (err: any) {\n return { success: false, error: err.message };\n }\n}\n\n/**\n * Copy workflows directory\n */\nexport async function copyWorkflows(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string\n): Promise<CopyResult | CopyStatusResult> {\n if (items === 'all') {\n return copyAllOfType('workflows', sourceDir, destDir);\n }\n return copyItems(items, 'workflows', sourceDir, destDir);\n}\n\n/**\n * Copy base files (README, settings, statusline, etc.)\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyBaseFiles(\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<string[]> {\n const baseFiles = ['README.md', 'settings.json', '.env.example', 'statusline.cjs', 'statusline.ps1', 'statusline.sh'];\n const copied: string[] = [];\n\n for (const file of baseFiles) {\n const srcPath = join(sourceDir, file);\n const destPath = join(destDir, file);\n\n // Skip if merge mode and file exists\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n\n if (fs.existsSync(srcPath)) {\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(file);\n }\n }\n\n return copied;\n}\n\n/**\n * Copy a directory (memory, output-styles, scripts, etc.)\n * @param {boolean} mergeMode - If true, skip existing files\n */\nexport async function copyDirectory(\n dirName: string,\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyStatusResult> {\n const srcPath = join(sourceDir, dirName);\n\n if (!fs.existsSync(srcPath)) {\n return { success: false, error: `${dirName} directory not found` };\n }\n\n try {\n await fs.copy(srcPath, join(destDir, dirName), { overwrite: !mergeMode });\n return { success: true };\n } catch (err: any) {\n return { success: false, error: err.message };\n }\n}\n\n/**\n * Copy AGENTS.md to project root\n * @param {boolean} mergeMode - If true, skip if file exists\n */\nexport async function copyAgentsMd(\n agentsMdPath: string | null,\n projectDir: string,\n mergeMode: boolean = false\n): Promise<boolean> {\n if (!agentsMdPath || !fs.existsSync(agentsMdPath)) {\n return false;\n }\n\n const destPath = join(projectDir, 'AGENTS.md');\n\n // Skip if merge mode and file exists\n if (mergeMode && fs.existsSync(destPath)) {\n return false;\n }\n\n await fs.copy(agentsMdPath, destPath, { overwrite: !mergeMode });\n return true;\n}\n\n/**\n * List available items of a type\n */\nexport function listAvailable(type: string, sourceDir: string): AvailableItem[] {\n const typeDir = join(sourceDir, type);\n\n if (!fs.existsSync(typeDir)) {\n return [];\n }\n\n const items = fs.readdirSync(typeDir);\n return items.map(item => {\n const itemPath = join(typeDir, item);\n const isDir = fs.statSync(itemPath).isDirectory();\n const name = item.replace(/\\.md$/, '');\n return { name, isDir, path: itemPath };\n });\n}\n\n/**\n * Copy commands to Gemini target (converts MD to TOML)\n */\nexport async function copyCommandsForGemini(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'commands');\n const destTypeDir = join(destDir, 'commands');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Get all items if 'all'\n let itemList: string[];\n if (items === 'all') {\n // Get top-level items (files and directories)\n const entries = fs.readdirSync(typeDir);\n itemList = entries.map(e => e.replace(/\\.md$/, ''));\n // Remove duplicates (plan.md and plan/ both become 'plan')\n itemList = [...new Set(itemList)];\n } else {\n itemList = items;\n }\n\n for (const item of itemList) {\n try {\n const srcPathMd = join(typeDir, item + '.md');\n const srcPathDir = join(typeDir, item);\n\n // Handle both file and directory with same name (e.g., plan.md AND plan/)\n let copiedSomething = false;\n\n // 1. Check if .md file exists - convert it\n if (fs.existsSync(srcPathMd) && fs.statSync(srcPathMd).isFile()) {\n const destPath = join(destTypeDir, item + '.toml');\n\n if (!(mergeMode && fs.existsSync(destPath))) {\n await fs.ensureDir(dirname(destPath));\n const mdContent = fs.readFileSync(srcPathMd, 'utf-8');\n const tomlContent = convertMdToToml(mdContent);\n await fs.writeFile(destPath, tomlContent, 'utf-8');\n copiedSomething = true;\n }\n }\n\n // 2. Check if directory exists - convert recursively\n if (fs.existsSync(srcPathDir) && fs.statSync(srcPathDir).isDirectory()) {\n await convertDirectoryToToml(srcPathDir, join(destTypeDir, item), mergeMode);\n copiedSomething = true;\n }\n\n if (copiedSomething) {\n copied.push(item);\n } else {\n skipped.push(item);\n }\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Recursively convert a directory of MD files to TOML\n */\nasync function convertDirectoryToToml(\n srcDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<void> {\n await fs.ensureDir(destDir);\n\n const entries = fs.readdirSync(srcDir);\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry);\n const stat = fs.statSync(srcPath);\n\n if (stat.isDirectory()) {\n await convertDirectoryToToml(srcPath, join(destDir, entry), mergeMode);\n } else if (entry.endsWith('.md')) {\n const destPath = join(destDir, entry.replace(/\\.md$/, '.toml'));\n\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const tomlContent = convertMdToToml(mdContent);\n await fs.writeFile(destPath, tomlContent, 'utf-8');\n } else {\n // Copy non-MD files as-is\n const destPath = join(destDir, entry);\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n }\n }\n}\n\n/**\n * List all files recursively (relative paths)\n */\nfunction listAvailableRecursive(dir: string, base: string = ''): string[] {\n const results: string[] = [];\n const entries = fs.readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const relativePath = base ? `${base}/${entry}` : entry;\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n results.push(...listAvailableRecursive(fullPath, relativePath));\n } else {\n results.push(relativePath);\n }\n }\n\n return results;\n}\n\n/**\n * Convert Claude agent MD to Gemini-compatible format\n * Maps Claude model names to Gemini equivalents\n * Converts tools from string to array format\n */\nfunction convertAgentForGemini(mdContent: string): string {\n // Parse frontmatter\n const frontmatterMatch = mdContent.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!frontmatterMatch) return mdContent;\n\n let frontmatter = frontmatterMatch[1];\n const body = frontmatterMatch[2];\n\n // Map Claude models to Gemini models\n const modelMap: Record<string, string> = {\n 'opus': 'gemini-2.5-pro',\n 'sonnet': 'gemini-2.5-flash',\n 'haiku': 'gemini-2.0-flash-lite',\n 'inherit': '' // Remove inherit, let Gemini use default\n };\n\n // Replace model field\n for (const [claudeModel, geminiModel] of Object.entries(modelMap)) {\n const regex = new RegExp(`^model:\\\\s*${claudeModel}\\\\s*$`, 'm');\n if (geminiModel) {\n frontmatter = frontmatter.replace(regex, `model: ${geminiModel}`);\n } else {\n // Remove the model line if it's 'inherit'\n frontmatter = frontmatter.replace(regex, '');\n }\n }\n\n // Remove tools field - Claude and Gemini have different tool naming\n // Claude: \"Glob, Grep, Read, Bash\"\n // Gemini: \"read_file, grep_search, run_shell_command, write_file\"\n // Let Gemini use default tools instead of trying to map\n frontmatter = frontmatter.replace(/^tools:\\s*.+$/m, '');\n\n // Add kind: local if not present\n if (!frontmatter.includes('kind:')) {\n frontmatter = frontmatter.trim() + '\\nkind: local';\n }\n\n return `---\\n${frontmatter.trim()}\\n---\\n${body}`;\n}\n\n/**\n * Copy agents to Gemini target (converts Claude agent format)\n * Gemini agents: .gemini/agents/*.md\n */\nexport async function copyAgentsForGemini(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'agents');\n const destTypeDir = join(destDir, 'agents');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Get agent files\n let agentList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n agentList = entries\n .filter(e => e.endsWith('.md') && e !== 'README.md')\n .map(e => e.replace(/\\.md$/, ''));\n } else {\n agentList = items;\n }\n\n for (const agent of agentList) {\n try {\n const srcPath = join(typeDir, agent + '.md');\n\n if (!fs.existsSync(srcPath)) {\n skipped.push(agent);\n continue;\n }\n\n const destPath = join(destTypeDir, agent + '.md');\n\n // Skip if merge mode and destination exists\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(agent);\n continue;\n }\n\n // Convert and write\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const convertedContent = convertAgentForGemini(mdContent);\n await fs.writeFile(destPath, convertedContent, 'utf-8');\n copied.push(agent);\n } catch (err: any) {\n errors.push({ item: agent, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Copy skills to Gemini target (skills use same SKILL.md format)\n * Gemini skills: .gemini/skills/<skill-name>/SKILL.md\n */\nexport async function copySkillsForGemini(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'skills');\n const destTypeDir = join(destDir, 'skills');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Get skill directories\n let skillList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n skillList = entries.filter(e => {\n const fullPath = join(typeDir, e);\n return fs.statSync(fullPath).isDirectory() && fs.existsSync(join(fullPath, 'SKILL.md'));\n });\n } else {\n skillList = items;\n }\n\n for (const skill of skillList) {\n try {\n const srcPath = join(typeDir, skill);\n\n // Check if it's a valid skill directory with SKILL.md\n if (!fs.existsSync(srcPath) || !fs.statSync(srcPath).isDirectory()) {\n skipped.push(skill);\n continue;\n }\n\n const skillMdPath = join(srcPath, 'SKILL.md');\n if (!fs.existsSync(skillMdPath)) {\n skipped.push(skill);\n continue;\n }\n\n const destPath = join(destTypeDir, skill);\n\n // Skip if merge mode and destination exists\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(skill);\n continue;\n }\n\n // Copy entire skill directory (SKILL.md + references, assets, etc.)\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(skill);\n } catch (err: any) {\n errors.push({ item: skill, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Copy Gemini-specific base files (settings.json with plan mode enabled)\n */\nexport async function copyGeminiBaseFiles(\n destDir: string,\n mergeMode: boolean = false\n): Promise<string[]> {\n const geminiTemplates = join(CLI_ROOT, 'templates', 'gemini');\n const copied: string[] = [];\n\n // Copy settings.json if exists\n const settingsPath = join(geminiTemplates, 'settings.json');\n const destSettingsPath = join(destDir, 'settings.json');\n\n if (fs.existsSync(settingsPath)) {\n // Skip if merge mode and file exists\n if (mergeMode && fs.existsSync(destSettingsPath)) {\n return copied;\n }\n\n await fs.copy(settingsPath, destSettingsPath, { overwrite: !mergeMode });\n copied.push('settings.json');\n }\n\n return copied;\n}\n\n/**\n * Copy only unchanged files (for update)\n */\nexport async function copyUnchangedOnly(\n sourceDir: string,\n destDir: string,\n unchangedFiles: string[]\n): Promise<{ copied: string[]; skipped: string[] }> {\n const copied: string[] = [];\n const skipped: string[] = [];\n\n for (const file of unchangedFiles) {\n const srcPath = join(sourceDir, file);\n const destPath = join(destDir, file);\n\n if (fs.existsSync(srcPath)) {\n await fs.ensureDir(join(destDir, file.split('/').slice(0, -1).join('/')));\n await fs.copy(srcPath, destPath, { overwrite: true });\n copied.push(file);\n } else {\n skipped.push(file);\n }\n }\n\n return { copied, skipped };\n}\n\n// ============================================================================\n// Discord/Clawbot Support\n// ============================================================================\n\n/**\n * Convert Claude MD command to Discord/Clawbot JSON5 format\n * Commands become agent \"commands\" config in Clawbot\n */\nfunction convertCommandForDiscord(mdContent: string, commandName: string): {\n name: string;\n description: string;\n prompt: string;\n} {\n const { description, body } = parseFrontmatter(mdContent);\n\n // Convert $ARGUMENTS to {{args}} for consistency\n const prompt = body.replace(/\\$ARGUMENTS/g, '{{args}}');\n\n return {\n name: commandName,\n description: description || `Execute ${commandName} command`,\n prompt\n };\n}\n\n/**\n * Convert Claude agent MD to Discord/Clawbot-compatible format\n * Clawbot agents use similar YAML frontmatter but different model names\n */\nfunction convertAgentForDiscord(mdContent: string): string {\n // Parse frontmatter\n const frontmatterMatch = mdContent.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n if (!frontmatterMatch) return mdContent;\n\n let frontmatter = frontmatterMatch[1];\n const body = frontmatterMatch[2];\n\n // Map Claude models to Clawbot models (uses Claude API via OpenClaw)\n // Clawbot supports: claude-3-opus, claude-3-sonnet, claude-3-haiku\n const modelMap: Record<string, string> = {\n 'opus': 'claude-3-opus',\n 'sonnet': 'claude-3-sonnet',\n 'haiku': 'claude-3-haiku',\n 'inherit': '' // Remove inherit\n };\n\n // Replace model field\n for (const [claudeModel, discordModel] of Object.entries(modelMap)) {\n const regex = new RegExp(`^model:\\\\s*${claudeModel}\\\\s*$`, 'm');\n if (discordModel) {\n frontmatter = frontmatter.replace(regex, `model: ${discordModel}`);\n } else {\n frontmatter = frontmatter.replace(regex, '');\n }\n }\n\n // Remove tools field - Clawbot has different tool naming\n frontmatter = frontmatter.replace(/^tools:\\s*.+$/m, '');\n\n // Add kind: local if not present\n if (!frontmatter.includes('kind:')) {\n frontmatter = frontmatter.trim() + '\\nkind: local';\n }\n\n return `---\\n${frontmatter.trim()}\\n---\\n${body}`;\n}\n\n/**\n * Copy agents to Discord target (converts Claude agent format)\n */\nexport async function copyAgentsForDiscord(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'agents');\n const destTypeDir = join(destDir, 'agents');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Get agent files\n let agentList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n agentList = entries\n .filter(e => e.endsWith('.md') && e !== 'README.md')\n .map(e => e.replace(/\\.md$/, ''));\n } else {\n agentList = items;\n }\n\n for (const agent of agentList) {\n try {\n const srcPath = join(typeDir, agent + '.md');\n\n if (!fs.existsSync(srcPath)) {\n skipped.push(agent);\n continue;\n }\n\n const destPath = join(destTypeDir, agent + '.md');\n\n if (mergeMode && fs.existsSync(destPath)) {\n skipped.push(agent);\n continue;\n }\n\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const convertedContent = convertAgentForDiscord(mdContent);\n await fs.writeFile(destPath, convertedContent, 'utf-8');\n copied.push(agent);\n } catch (err: any) {\n errors.push({ item: agent, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Copy commands to Discord target\n * Commands are stored as .md files but also generate a commands.json5 for Clawbot\n */\nexport async function copyCommandsForDiscord(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'commands');\n const destTypeDir = join(destDir, 'commands');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Collect commands for JSON5 config\n const commandsConfig: Record<string, { description: string; prompt: string }> = {};\n\n // Get all items if 'all'\n let itemList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n itemList = entries.map(e => e.replace(/\\.md$/, ''));\n itemList = [...new Set(itemList)];\n } else {\n itemList = items;\n }\n\n for (const item of itemList) {\n try {\n const srcPathMd = join(typeDir, item + '.md');\n const srcPathDir = join(typeDir, item);\n\n let copiedSomething = false;\n\n // Handle .md file\n if (fs.existsSync(srcPathMd) && fs.statSync(srcPathMd).isFile()) {\n const destPath = join(destTypeDir, item + '.md');\n\n if (!(mergeMode && fs.existsSync(destPath))) {\n await fs.ensureDir(dirname(destPath));\n const mdContent = fs.readFileSync(srcPathMd, 'utf-8');\n\n // Copy MD as-is (Clawbot can read MD prompts)\n await fs.copy(srcPathMd, destPath, { overwrite: !mergeMode });\n\n // Also add to commands config\n const cmd = convertCommandForDiscord(mdContent, item);\n commandsConfig[item] = {\n description: cmd.description,\n prompt: cmd.prompt\n };\n\n copiedSomething = true;\n }\n }\n\n // Handle directory (nested commands)\n if (fs.existsSync(srcPathDir) && fs.statSync(srcPathDir).isDirectory()) {\n await copyDirectoryForDiscord(srcPathDir, join(destTypeDir, item), mergeMode, commandsConfig, item);\n copiedSomething = true;\n }\n\n if (copiedSomething) {\n copied.push(item);\n } else {\n skipped.push(item);\n }\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n // Write commands.json5 config file for Clawbot\n const configPath = join(destDir, 'commands.json5');\n if (Object.keys(commandsConfig).length > 0 && !(mergeMode && fs.existsSync(configPath))) {\n const json5Content = generateCommandsJson5(commandsConfig);\n await fs.writeFile(configPath, json5Content, 'utf-8');\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Recursively copy directory for Discord\n */\nasync function copyDirectoryForDiscord(\n srcDir: string,\n destDir: string,\n mergeMode: boolean,\n commandsConfig: Record<string, { description: string; prompt: string }>,\n parentName: string\n): Promise<void> {\n await fs.ensureDir(destDir);\n\n const entries = fs.readdirSync(srcDir);\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry);\n const stat = fs.statSync(srcPath);\n\n if (stat.isDirectory()) {\n await copyDirectoryForDiscord(\n srcPath,\n join(destDir, entry),\n mergeMode,\n commandsConfig,\n `${parentName}/${entry}`\n );\n } else if (entry.endsWith('.md')) {\n const destPath = join(destDir, entry);\n\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n\n // Add nested command to config\n const cmdName = `${parentName}/${entry.replace(/\\.md$/, '')}`;\n const cmd = convertCommandForDiscord(mdContent, cmdName);\n commandsConfig[cmdName] = {\n description: cmd.description,\n prompt: cmd.prompt\n };\n } else {\n // Copy non-MD files as-is\n const destPath = join(destDir, entry);\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n }\n }\n}\n\n/**\n * Generate JSON5 config for Clawbot commands\n */\nfunction generateCommandsJson5(\n commands: Record<string, { description: string; prompt: string }>\n): string {\n const lines: string[] = [\n '// Clawbot Commands Configuration',\n '// Generated by Apero Kit CLI',\n '// These commands can be used as slash commands in Discord',\n '{',\n ' \"commands\": {'\n ];\n\n const cmdEntries = Object.entries(commands);\n cmdEntries.forEach(([name, cmd], index) => {\n const safeName = name.replace(/\\//g, ':'); // plan/fast -> plan:fast\n const isLast = index === cmdEntries.length - 1;\n\n lines.push(` \"${safeName}\": {`);\n lines.push(` \"description\": ${JSON.stringify(cmd.description)},`);\n // Use multi-line string for prompt\n lines.push(` \"prompt\": ${JSON.stringify(cmd.prompt)}`);\n lines.push(` }${isLast ? '' : ','}`);\n });\n\n lines.push(' }');\n lines.push('}');\n\n return lines.join('\\n');\n}\n\n/**\n * Copy skills to Discord target (same SKILL.md format)\n */\nexport async function copySkillsForDiscord(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n // Skills use same format, delegate to Gemini function\n return copySkillsForGemini(items, sourceDir, destDir, mergeMode);\n}\n\n/**\n * Copy Discord-specific base files (config.json5, etc.)\n */\nexport async function copyDiscordBaseFiles(\n destDir: string,\n mergeMode: boolean = false\n): Promise<string[]> {\n const discordTemplates = join(CLI_ROOT, 'templates', 'discord');\n const copied: string[] = [];\n\n // List of Discord-specific files to copy\n const filesToCopy = ['config.json5', 'README.md'];\n\n for (const file of filesToCopy) {\n const srcPath = join(discordTemplates, file);\n const destPath = join(destDir, file);\n\n if (fs.existsSync(srcPath)) {\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(file);\n }\n }\n\n return copied;\n}\n\n/**\n * Update Discord config with bot token and optional guild ID\n */\nexport async function updateDiscordConfig(\n destDir: string,\n token: string,\n guildId?: string\n): Promise<void> {\n const configPath = join(destDir, 'config.json5');\n\n if (!fs.existsSync(configPath)) {\n return;\n }\n\n let content = await fs.readFile(configPath, 'utf-8');\n\n // Replace token placeholder with actual token\n content = content.replace(\n '\"token\": \"${DISCORD_BOT_TOKEN}\"',\n `\"token\": \"${token}\"`\n );\n\n // If guild ID is provided, add it to the guilds config\n if (guildId) {\n const guildConfig = `\"${guildId}\": {\n \"requireMention\": true,\n \"users\": [],\n \"roles\": [],\n \"channels\": {}\n }`;\n\n content = content.replace(\n '\"guilds\": {\\n // Example guild configuration',\n `\"guilds\": {\\n ${guildConfig},\\n // Example guild configuration`\n );\n }\n\n await fs.writeFile(configPath, content, 'utf-8');\n}\n\n/**\n * Setup OpenClaw CLI configuration (if available)\n */\nexport async function setupOpenClawConfig(token: string): Promise<{ success: boolean; message: string }> {\n const { execSync } = await import('child_process');\n\n try {\n // Check if openclaw is installed\n execSync('which openclaw', { stdio: 'ignore' });\n } catch {\n return { success: false, message: 'OpenClaw CLI not installed. Run: npm install -g openclaw' };\n }\n\n try {\n // Set Discord token\n execSync(`openclaw config set channels.discord.token '\"${token}\"' --json`, { stdio: 'ignore' });\n\n // Enable Discord channel\n execSync('openclaw config set channels.discord.enabled true --json', { stdio: 'ignore' });\n\n // Set gateway mode to local (required for openclaw gateway to start)\n execSync('openclaw config set gateway.mode local', { stdio: 'ignore' });\n\n return { success: true, message: 'OpenClaw configured successfully!' };\n } catch (error: any) {\n return { success: false, message: `Failed to configure OpenClaw: ${error.message}` };\n }\n}\n\n// ============================================================================\n// OpenClaw Skills Conversion (Commands → Skills)\n// ============================================================================\n\n/**\n * Extract keywords from command content for trigger conditions\n */\nfunction extractKeywords(content: string, commandName: string): string[] {\n const keywords = new Set<string>();\n\n // Add command name variations\n keywords.add(commandName);\n keywords.add(commandName.replace(/-/g, ' '));\n\n // Extract from common patterns\n const keywordPatterns = [\n /keywords?:\\s*([^\\n]+)/gi,\n /when.*(?:says?|mentions?|asks?).*[\"']([^\"']+)[\"']/gi,\n /trigger.*[\"']([^\"']+)[\"']/gi\n ];\n\n for (const pattern of keywordPatterns) {\n const matches = content.matchAll(pattern);\n for (const match of matches) {\n match[1].split(/[,;]/).forEach(k => keywords.add(k.trim().toLowerCase()));\n }\n }\n\n // Common intent keywords based on command name\n const intentMap: Record<string, string[]> = {\n 'plan': ['plan', 'design', 'architect', 'implement', 'create plan'],\n 'brainstorm': ['brainstorm', 'ideas', 'options', 'alternatives', 'think'],\n 'fix': ['fix', 'debug', 'error', 'broken', 'issue', 'bug'],\n 'code': ['code', 'implement', 'build', 'develop', 'write code'],\n 'review': ['review', 'check', 'audit', 'look at'],\n 'test': ['test', 'testing', 'spec', 'unit test'],\n 'cook': ['cook', 'implement', 'build feature', 'develop'],\n 'scout': ['scout', 'search', 'find', 'explore codebase'],\n 'debug': ['debug', 'trace', 'diagnose', 'investigate']\n };\n\n const baseName = commandName.split('/')[0].split(':')[0];\n if (intentMap[baseName]) {\n intentMap[baseName].forEach(k => keywords.add(k));\n }\n\n return Array.from(keywords).slice(0, 10);\n}\n\n/**\n * Convert Claude command MD to OpenClaw SKILL.md format\n */\nfunction convertCommandToSkill(mdContent: string, commandName: string): string {\n const { description, argumentHint, body } = parseFrontmatter(mdContent);\n\n // Convert $ARGUMENTS to {{args}}\n const prompt = body.replace(/\\$ARGUMENTS/g, '{{args}}');\n\n // Extract keywords for trigger conditions\n const keywords = extractKeywords(body, commandName);\n\n // Build SKILL.md content\n const skillContent = `---\nname: ${commandName.replace(/\\//g, '-')}\ndescription: ${description || `Execute ${commandName} task`}\nuser-invocable: true\ndisable-model-invocation: false\nmetadata: {\"openclaw\": {\"always\": true}}\n---\n\n# ${commandName.charAt(0).toUpperCase() + commandName.slice(1).replace(/-/g, ' ')}\n\n## Trigger Conditions\n\nActivate when user mentions:\n${keywords.map(k => `- \"${k}\"`).join('\\n')}\n\n## Input\n${argumentHint ? `Expected input: ${argumentHint.replace('$ARGUMENTS', '{{args}}')}` : 'User provides task description in natural language.'}\n\n## Workflow\n\n${prompt}\n\n## Output Format\n\nProvide clear, actionable response based on the workflow above.\n`;\n\n return skillContent;\n}\n\n/**\n * Convert commands to OpenClaw skills format for Discord\n */\nexport async function convertCommandsToSkills(\n items: string[] | 'all',\n sourceDir: string,\n destDir: string,\n mergeMode: boolean = false\n): Promise<CopyResult> {\n const typeDir = join(sourceDir, 'commands');\n const destTypeDir = join(destDir, 'skills');\n\n if (!fs.existsSync(typeDir)) {\n return { copied: [], skipped: [], errors: [] };\n }\n\n await fs.ensureDir(destTypeDir);\n\n const copied: string[] = [];\n const skipped: string[] = [];\n const errors: Array<{ item: string; error: string }> = [];\n\n // Get all items if 'all'\n let itemList: string[];\n if (items === 'all') {\n const entries = fs.readdirSync(typeDir);\n itemList = entries\n .filter(e => e.endsWith('.md') && e !== 'README.md')\n .map(e => e.replace(/\\.md$/, ''));\n // Also get directories (nested commands)\n const dirs = entries.filter(e => {\n const fullPath = join(typeDir, e);\n return fs.statSync(fullPath).isDirectory();\n });\n itemList = [...new Set([...itemList, ...dirs])];\n } else {\n itemList = items;\n }\n\n for (const item of itemList) {\n try {\n const srcPathMd = join(typeDir, item + '.md');\n const srcPathDir = join(typeDir, item);\n\n // Handle .md file → skill directory\n if (fs.existsSync(srcPathMd) && fs.statSync(srcPathMd).isFile()) {\n const skillDir = join(destTypeDir, item.replace(/\\//g, '-'));\n const skillPath = join(skillDir, 'SKILL.md');\n\n if (mergeMode && fs.existsSync(skillPath)) {\n skipped.push(item);\n continue;\n }\n\n await fs.ensureDir(skillDir);\n const mdContent = fs.readFileSync(srcPathMd, 'utf-8');\n const skillContent = convertCommandToSkill(mdContent, item);\n await fs.writeFile(skillPath, skillContent, 'utf-8');\n copied.push(item);\n }\n\n // Handle directory (nested commands) → nested skills\n if (fs.existsSync(srcPathDir) && fs.statSync(srcPathDir).isDirectory()) {\n await convertNestedCommandsToSkills(srcPathDir, destTypeDir, item, mergeMode);\n copied.push(item + '/*');\n }\n } catch (err: any) {\n errors.push({ item, error: err.message });\n }\n }\n\n return { copied, skipped, errors };\n}\n\n/**\n * Recursively convert nested commands to skills\n */\nasync function convertNestedCommandsToSkills(\n srcDir: string,\n destDir: string,\n parentName: string,\n mergeMode: boolean\n): Promise<void> {\n const entries = fs.readdirSync(srcDir);\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry);\n const stat = fs.statSync(srcPath);\n\n if (stat.isDirectory()) {\n await convertNestedCommandsToSkills(\n srcPath,\n destDir,\n `${parentName}-${entry}`,\n mergeMode\n );\n } else if (entry.endsWith('.md') && entry !== 'README.md') {\n const skillName = `${parentName}-${entry.replace(/\\.md$/, '')}`;\n const skillDir = join(destDir, skillName);\n const skillPath = join(skillDir, 'SKILL.md');\n\n if (mergeMode && fs.existsSync(skillPath)) {\n continue;\n }\n\n await fs.ensureDir(skillDir);\n const mdContent = fs.readFileSync(srcPath, 'utf-8');\n const skillContent = convertCommandToSkill(mdContent, skillName);\n await fs.writeFile(skillPath, skillContent, 'utf-8');\n }\n }\n}\n\n/**\n * Copy bundled skills (train-prompt, etc.) to Discord target\n */\nexport async function copyBundledSkillsForDiscord(\n destDir: string,\n mergeMode: boolean = false\n): Promise<string[]> {\n const bundledSkillsDir = join(CLI_ROOT, 'templates', 'discord', 'skills');\n const destSkillsDir = join(destDir, 'skills');\n const copied: string[] = [];\n\n if (!fs.existsSync(bundledSkillsDir)) {\n return copied;\n }\n\n await fs.ensureDir(destSkillsDir);\n\n const skills = fs.readdirSync(bundledSkillsDir);\n for (const skill of skills) {\n const srcPath = join(bundledSkillsDir, skill);\n const destPath = join(destSkillsDir, skill);\n\n if (fs.statSync(srcPath).isDirectory()) {\n if (mergeMode && fs.existsSync(destPath)) {\n continue;\n }\n await fs.copy(srcPath, destPath, { overwrite: !mergeMode });\n copied.push(skill);\n }\n }\n\n return copied;\n}\n","import * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { getKitList } from '../kits/index.js';\nimport { listAvailable } from './copy.js';\nimport type { CliTarget } from './paths.js';\n\nexport async function promptProjectName(): Promise<string> {\n const name = await p.text({\n message: 'Project name:',\n placeholder: 'my-project',\n validate: (value) => {\n if (!value || !value.trim()) return 'Project name is required';\n if (!/^[a-zA-Z0-9-_]+$/.test(String(value))) return 'Only letters, numbers, dashes, underscores';\n }\n });\n if (p.isCancel(name)) process.exit(0);\n return name as string;\n}\n\nexport async function promptKit(): Promise<string> {\n const kits = getKitList();\n const options = [\n ...kits.map((kit) => ({\n value: kit.name,\n label: `${kit.emoji} ${kit.name}`,\n hint: kit.description\n })),\n { value: 'custom', label: '🔧 custom', hint: 'Pick your own agents, skills, and commands' }\n ];\n const kit = await p.select({ message: 'Select a kit:', options });\n if (p.isCancel(kit)) process.exit(0);\n return kit as string;\n}\n\nexport async function promptTarget(): Promise<string> {\n const target = await p.select({\n message: 'Target folder:',\n options: [\n { value: 'claude', label: '.claude/', hint: 'Claude Code' },\n { value: 'gemini', label: '.gemini/', hint: 'Gemini CLI' },\n { value: 'opencode', label: '.opencode/', hint: 'OpenCode' },\n { value: 'generic', label: '.agent/', hint: 'Generic' }\n ]\n });\n if (p.isCancel(target)) process.exit(0);\n return target as string;\n}\n\nexport async function promptCliTargets(): Promise<CliTarget[]> {\n const selection = await p.multiselect({\n message: 'Select AI CLI target(s):',\n options: [\n { value: 'claude', label: 'Claude Code', hint: '.claude/' },\n { value: 'gemini', label: 'Gemini CLI', hint: '.gemini/' },\n { value: 'discord', label: 'Discord + Clawbot', hint: '.discord/' }\n ],\n initialValues: ['claude'],\n required: true\n });\n if (p.isCancel(selection)) process.exit(0);\n\n return selection as CliTarget[];\n}\n\nexport async function promptAgents(sourceDir: string): Promise<string[]> {\n const available = listAvailable('agents', sourceDir);\n if (available.length === 0) return [];\n const selected = await p.multiselect({\n message: 'Select agents:',\n options: available.map((item) => ({\n value: item.name,\n label: item.name,\n hint: ['planner', 'debugger'].includes(item.name) ? '(recommended)' : undefined\n })),\n initialValues: ['planner', 'debugger'].filter(n => available.some((a) => a.name === n))\n });\n if (p.isCancel(selected)) process.exit(0);\n return selected as string[];\n}\n\nexport async function promptSkills(sourceDir: string): Promise<string[]> {\n const available = listAvailable('skills', sourceDir).filter((s) => s.isDir);\n if (available.length === 0) return [];\n const selected = await p.multiselect({\n message: 'Select skills:',\n options: available.map((item) => ({\n value: item.name,\n label: item.name,\n hint: ['planning', 'debugging'].includes(item.name) ? '(recommended)' : undefined\n })),\n initialValues: ['planning', 'debugging'].filter(n => available.some((a) => a.name === n))\n });\n if (p.isCancel(selected)) process.exit(0);\n return selected as string[];\n}\n\nexport async function promptCommands(sourceDir: string): Promise<string[]> {\n const available = listAvailable('commands', sourceDir);\n if (available.length === 0) return [];\n const selected = await p.multiselect({\n message: 'Select commands:',\n options: available.map((item) => ({\n value: item.name,\n label: item.name,\n hint: ['plan', 'fix', 'code'].includes(item.name) ? '(recommended)' : undefined\n })),\n initialValues: ['plan', 'fix', 'code'].filter(n => available.some((a) => a.name === n))\n });\n if (p.isCancel(selected)) process.exit(0);\n return selected as string[];\n}\n\nexport async function promptIncludeRouter(): Promise<boolean> {\n const result = await p.confirm({ message: 'Include router?', initialValue: true });\n if (p.isCancel(result)) process.exit(0);\n return result as boolean;\n}\n\nexport async function promptIncludeHooks(): Promise<boolean> {\n const result = await p.confirm({ message: 'Include hooks?', initialValue: false });\n if (p.isCancel(result)) process.exit(0);\n return result as boolean;\n}\n\nexport async function promptConfirm(message: string, defaultValue: boolean = true): Promise<boolean> {\n const result = await p.confirm({ message, initialValue: defaultValue });\n if (p.isCancel(result)) process.exit(0);\n return result as boolean;\n}\n\nexport async function promptExistingTarget(targetPath: string): Promise<string> {\n const action = await p.select({\n message: `${targetPath} already exists. What do you want to do?`,\n options: [\n { value: 'override', label: 'Override', hint: 'Replace all files' },\n { value: 'merge', label: 'Merge', hint: 'Only add missing files' },\n { value: 'skip', label: 'Skip', hint: 'Do nothing' }\n ]\n });\n if (p.isCancel(action)) process.exit(0);\n return action as string;\n}\n\nexport async function promptUpdateConfirm(updates: { toUpdate: string[]; skipped: string[] }): Promise<boolean> {\n console.log(pc.cyan('\\nChanges to apply:'));\n if (updates.toUpdate.length > 0) {\n console.log(pc.green(' Will update:'));\n updates.toUpdate.slice(0, 10).forEach(f => console.log(pc.green(` ✓ ${f}`)));\n if (updates.toUpdate.length > 10) console.log(pc.gray(` ... and ${updates.toUpdate.length - 10} more`));\n }\n if (updates.skipped.length > 0) {\n console.log(pc.yellow(' Will skip (modified locally):'));\n updates.skipped.slice(0, 5).forEach(f => console.log(pc.yellow(` ~ ${f}`)));\n if (updates.skipped.length > 5) console.log(pc.gray(` ... and ${updates.skipped.length - 5} more`));\n }\n console.log('');\n return promptConfirm('Apply these updates?', true);\n}\n\nexport interface DiscordConfig {\n token: string;\n guildId?: string;\n autoSetup: boolean;\n openclawInstalled: boolean;\n restartOnly?: boolean;\n useGeminiCli?: boolean;\n}\n\nfunction isOpenClawInstalled(): boolean {\n try {\n const { execSync } = require('child_process');\n execSync('which openclaw', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isGeminiCliInstalled(): boolean {\n try {\n const { execSync } = require('child_process');\n execSync('which gemini', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isGeminiCliLoggedIn(): boolean {\n try {\n const fs = require('fs');\n const path = require('path');\n const credsPath = path.join(process.env.HOME || '', '.gemini', 'oauth_creds.json');\n return fs.existsSync(credsPath);\n } catch {\n return false;\n }\n}\n\nasync function setupGeminiCliAuth(): Promise<boolean> {\n const { execSync, spawnSync } = require('child_process');\n try {\n // Login to Gemini CLI if needed\n if (!isGeminiCliLoggedIn()) {\n console.log(pc.cyan('Logging in to Gemini CLI...'));\n spawnSync('gemini', ['auth', 'login'], { stdio: 'inherit' });\n }\n\n // Enable plugin and set as default\n console.log(pc.cyan('Enabling Gemini CLI auth plugin...'));\n execSync('openclaw plugins enable google-gemini-cli-auth', { stdio: 'ignore' });\n\n console.log(pc.cyan('Setting Gemini CLI as default model provider...'));\n execSync('openclaw models auth login --provider google-gemini-cli --set-default', { stdio: 'inherit' });\n\n console.log(pc.green('✓ Gemini CLI OAuth configured successfully!'));\n return true;\n } catch (error) {\n console.log(pc.red('✗ Failed to setup Gemini CLI auth'));\n console.log(pc.gray(' Try manually:'));\n console.log(pc.gray(' 1. gemini auth login'));\n console.log(pc.gray(' 2. openclaw plugins enable google-gemini-cli-auth'));\n console.log(pc.gray(' 3. openclaw models auth login --provider google-gemini-cli --set-default'));\n return false;\n }\n}\n\nasync function installGeminiCli(): Promise<boolean> {\n const { execSync } = require('child_process');\n try {\n console.log(pc.cyan('Installing Gemini CLI...'));\n execSync('npm install -g @anthropic-ai/gemini-cli', { stdio: 'inherit' });\n console.log(pc.green('✓ Gemini CLI installed successfully!'));\n console.log('');\n return true;\n } catch (error) {\n console.log(pc.red('✗ Failed to install Gemini CLI'));\n console.log(pc.gray(' Try manually: npm install -g @anthropic-ai/gemini-cli'));\n console.log('');\n return false;\n }\n}\n\nfunction isDiscordConfigured(): boolean {\n try {\n const { execSync } = require('child_process');\n const result = execSync('openclaw config get channels.discord.token 2>/dev/null', { encoding: 'utf-8' });\n return result && result.trim().length > 10;\n } catch {\n return false;\n }\n}\n\nfunction restartGateway(): boolean {\n try {\n const { execSync } = require('child_process');\n // Ensure gateway.mode is set before restart\n execSync('openclaw config set gateway.mode local', { stdio: 'ignore' });\n console.log(pc.cyan('Starting OpenClaw gateway...'));\n execSync('openclaw gateway', { stdio: 'inherit' });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function installOpenClaw(): Promise<boolean> {\n const { execSync } = require('child_process');\n try {\n console.log(pc.cyan('Installing OpenClaw CLI...'));\n execSync('npm install -g openclaw', { stdio: 'inherit' });\n console.log(pc.green('✓ OpenClaw CLI installed successfully!'));\n console.log('');\n return true;\n } catch (error) {\n console.log(pc.red('✗ Failed to install OpenClaw CLI'));\n console.log(pc.gray(' Try manually: npm install -g openclaw'));\n console.log('');\n return false;\n }\n}\n\nexport async function promptDiscordSetup(): Promise<DiscordConfig> {\n console.log('');\n console.log(pc.cyan('━━━ Discord Bot Setup ━━━'));\n\n // Check if openclaw is installed\n let openclawInstalled = isOpenClawInstalled();\n if (!openclawInstalled) {\n console.log(pc.yellow('⚠ OpenClaw CLI not found.'));\n console.log('');\n\n const shouldInstall = await p.confirm({\n message: 'Install OpenClaw CLI now? (npm install -g openclaw)',\n initialValue: true\n });\n if (p.isCancel(shouldInstall)) process.exit(0);\n\n if (shouldInstall) {\n openclawInstalled = await installOpenClaw();\n }\n }\n\n // Check if Discord is already configured\n if (openclawInstalled && isDiscordConfigured()) {\n console.log(pc.green('✓ Discord bot token already configured.'));\n console.log('');\n\n const action = await p.select({\n message: 'What do you want to do?',\n options: [\n { value: 'restart', label: 'Restart gateway', hint: 'Use existing config' },\n { value: 'gemini-cli', label: 'Setup Gemini CLI OAuth', hint: 'Use Gemini CLI as AI provider' },\n { value: 'reconfigure', label: 'Reconfigure', hint: 'Enter new token' },\n { value: 'skip', label: 'Skip setup', hint: 'Continue without changes' }\n ]\n });\n if (p.isCancel(action)) process.exit(0);\n\n if (action === 'restart') {\n restartGateway();\n return {\n token: '',\n autoSetup: false,\n openclawInstalled: true,\n restartOnly: true\n };\n }\n\n if (action === 'gemini-cli') {\n // Setup Gemini CLI OAuth\n let geminiInstalled = isGeminiCliInstalled();\n if (!geminiInstalled) {\n console.log(pc.yellow('⚠ Gemini CLI not found.'));\n const shouldInstall = await p.confirm({\n message: 'Install Gemini CLI now?',\n initialValue: true\n });\n if (p.isCancel(shouldInstall)) process.exit(0);\n if (shouldInstall) {\n geminiInstalled = await installGeminiCli();\n }\n }\n\n if (geminiInstalled) {\n await setupGeminiCliAuth();\n }\n\n return {\n token: '',\n autoSetup: false,\n openclawInstalled: true,\n restartOnly: true,\n useGeminiCli: true\n };\n }\n\n if (action === 'skip') {\n return {\n token: '',\n autoSetup: false,\n openclawInstalled: true,\n restartOnly: true\n };\n }\n }\n\n // Ask for authentication method\n console.log('');\n console.log(pc.cyan('Choose AI Model Authentication:'));\n const authMethod = await p.select({\n message: 'How do you want to authenticate with AI models?',\n options: [\n { value: 'gemini-cli', label: 'Gemini CLI OAuth', hint: 'Recommended - uses Google OAuth via Gemini CLI' },\n { value: 'api-key', label: 'API Key', hint: 'Use your own API key' }\n ]\n });\n if (p.isCancel(authMethod)) process.exit(0);\n\n let useGeminiCli = false;\n if (authMethod === 'gemini-cli') {\n // Setup Gemini CLI\n let geminiInstalled = isGeminiCliInstalled();\n if (!geminiInstalled) {\n console.log(pc.yellow('⚠ Gemini CLI not found.'));\n const shouldInstall = await p.confirm({\n message: 'Install Gemini CLI now?',\n initialValue: true\n });\n if (p.isCancel(shouldInstall)) process.exit(0);\n if (shouldInstall) {\n geminiInstalled = await installGeminiCli();\n }\n }\n\n if (geminiInstalled && openclawInstalled) {\n const setupSuccess = await setupGeminiCliAuth();\n useGeminiCli = setupSuccess;\n }\n }\n\n console.log('');\n console.log(pc.gray('Get your Discord bot token from: https://discord.com/developers/applications'));\n console.log('');\n\n const token = await p.password({\n message: 'Discord Bot Token:',\n mask: '*',\n validate: (value) => {\n if (!value || !value.trim()) return 'Bot token is required';\n if (value.length < 50) return 'Invalid token format';\n }\n });\n if (p.isCancel(token)) process.exit(0);\n\n const hasGuild = await p.confirm({\n message: 'Do you have a Discord Server ID to configure?',\n initialValue: false\n });\n if (p.isCancel(hasGuild)) process.exit(0);\n\n let guildId: string | undefined;\n if (hasGuild) {\n const guild = await p.text({\n message: 'Discord Server ID:',\n placeholder: '123456789012345678',\n validate: (value) => {\n if (!value || !value.trim()) return 'Server ID is required';\n if (!/^\\d{17,20}$/.test(String(value))) return 'Invalid Server ID format (should be 17-20 digits)';\n }\n });\n if (p.isCancel(guild)) process.exit(0);\n guildId = guild as string;\n }\n\n // Only ask for auto-setup if openclaw is installed and not using Gemini CLI\n let autoSetup = false;\n if (openclawInstalled && !useGeminiCli) {\n const shouldAutoSetup = await p.confirm({\n message: 'Auto-setup OpenClaw config?',\n initialValue: true\n });\n if (p.isCancel(shouldAutoSetup)) process.exit(0);\n autoSetup = shouldAutoSetup as boolean;\n } else if (useGeminiCli) {\n autoSetup = true; // Already configured via Gemini CLI\n }\n\n return {\n token: token as string,\n guildId,\n autoSetup,\n openclawInstalled,\n useGeminiCli\n };\n}\n","import fs from 'fs-extra';\nimport { join, resolve } from 'path';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { KITS, getKit } from '../kits/index.js';\nimport { resolveSource, getGlobalInstallPath } from '../utils/paths.js';\nimport {\n getAdapter,\n isValidTarget,\n getTargetDirectory,\n getTargetDisplayName,\n type TargetName,\n type InstallItems\n} from '../targets/index.js';\nimport { DiscordAdapter } from '../targets/discord-adapter.js';\nimport { createInitialState } from '../utils/state.js';\nimport { copyAgentsMd } from '../utils/copy.js';\nimport {\n promptKit,\n promptAgents,\n promptSkills,\n promptCommands,\n promptIncludeRouter,\n promptIncludeHooks,\n promptConfirm,\n promptExistingTarget,\n promptCliTargets,\n promptDiscordSetup,\n type DiscordConfig\n} from '../utils/prompts.js';\n\n/**\n * Filter components based on --exclude and --only patterns\n */\nfunction filterComponents(list: string[] | 'all', exclude?: string, only?: string): string[] | 'all' {\n if (!list || list === 'all') return list;\n let filtered = [...list];\n\n if (only) {\n const patterns = only.split(',').map(s => s.trim());\n filtered = filtered.filter(item => patterns.some(p => item.includes(p)));\n }\n\n if (exclude) {\n const patterns = exclude.split(',').map(s => s.trim());\n filtered = filtered.filter(item => !patterns.some(p => item.includes(p)));\n }\n\n return filtered;\n}\n\nconst INIT_PASSWORD = '6702';\n\nexport async function initCommand(projectName: string | undefined, options: Record<string, any>): Promise<void> {\n console.log('');\n\n // Password protection\n if (options.password !== undefined) {\n if (String(options.password) !== INIT_PASSWORD) {\n console.log(pc.red('Invalid access code. Access denied.'));\n return;\n }\n } else if (process.stdin.isTTY && !options.yes) {\n const { password } = await import('@clack/prompts').then(p => ({\n password: p.password\n }));\n const inputPassword = await password({\n message: 'Enter access code:',\n mask: '*'\n });\n if (inputPassword !== INIT_PASSWORD) {\n console.log(pc.red('Invalid access code. Access denied.'));\n return;\n }\n } else {\n console.log(pc.red('Access code required. Use --password <code>'));\n return;\n }\n\n // 1. Get project directory\n let projectDir: string;\n let isCurrentDir = false;\n\n if (options.global) {\n projectDir = getGlobalInstallPath();\n isCurrentDir = true;\n console.log(pc.cyan(`Installing globally to ${projectDir}`));\n } else if (!projectName || projectName === '.') {\n projectDir = process.cwd();\n projectName = '.';\n isCurrentDir = true;\n console.log(pc.gray(`Initializing in current directory: ${projectDir}`));\n } else {\n projectDir = resolve(process.cwd(), projectName);\n }\n\n // 2. Get CLI targets\n let cliTargets: TargetName[];\n if (options.target) {\n const targetsFromFlag = options.target.split(',').map((t: string) => t.trim());\n cliTargets = targetsFromFlag.filter((t: string) => isValidTarget(t)) as TargetName[];\n if (cliTargets.length === 0) {\n console.log(pc.yellow(`Unknown target \"${options.target}\", using \"claude\"`));\n cliTargets = ['claude'];\n }\n } else if (!process.stdin.isTTY || options.yes) {\n cliTargets = ['claude'];\n } else {\n cliTargets = await promptCliTargets() as TargetName[];\n }\n\n // Discord setup - prompt for token if Discord is selected\n let discordConfig: DiscordConfig | null = null;\n let openclawSetupSuccess = false;\n if (cliTargets.includes('discord') && process.stdin.isTTY && !options.yes) {\n discordConfig = await promptDiscordSetup();\n }\n\n // Check existing for each target\n let existingAction: string | null = null;\n const existingTargets: string[] = [];\n\n for (const target of cliTargets) {\n const targetDir = join(projectDir, getTargetDirectory(target));\n\n if (options.fresh && fs.existsSync(targetDir)) {\n await fs.remove(targetDir);\n existingTargets.push(getTargetDisplayName(target));\n } else if (fs.existsSync(targetDir) && !options.force) {\n existingTargets.push(getTargetDisplayName(target));\n }\n }\n\n if (options.fresh && existingTargets.length > 0) {\n const akDir = join(projectDir, '.ak');\n if (fs.existsSync(akDir)) {\n await fs.remove(akDir);\n }\n console.log(pc.cyan(`Fresh install: removed existing files (${existingTargets.join(', ')})`));\n existingAction = null;\n } else if (existingTargets.length > 0 && !options.force) {\n if (!process.stdin.isTTY || options.yes) {\n if (options.yes) {\n existingAction = 'override';\n } else {\n console.log(pc.yellow(`${existingTargets.join(', ')} already exists. Use --force to override.`));\n return;\n }\n } else {\n existingAction = await promptExistingTarget(existingTargets.join(', '));\n\n if (existingAction === 'skip') {\n console.log(pc.yellow('Skipped. No changes made.'));\n return;\n }\n }\n }\n\n // For new project directory, check if it exists\n if (!isCurrentDir && fs.existsSync(projectDir) && !options.force) {\n const files = fs.readdirSync(projectDir);\n if (files.length > 0 && !existingAction) {\n console.log(pc.red(`Directory \"${projectName}\" already exists and is not empty.`));\n console.log(pc.gray('Use --force to overwrite.'));\n return;\n }\n }\n\n // 3. Resolve source\n const source = resolveSource(options.source);\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n return;\n }\n\n console.log(pc.gray(`Source: ${source.path}`));\n\n // 4. Get kit\n let kitName = options.kit;\n if (!kitName && !options.force && !options.yes) {\n kitName = await promptKit();\n } else if (!kitName) {\n kitName = 'engineer';\n }\n\n // 5. Set merge mode based on existing action\n const mergeMode = existingAction === 'merge';\n\n // 6. Prepare what to install\n let toInstall: InstallItems = {\n agents: [],\n commands: [],\n skills: [],\n workflows: [],\n includeRouter: false,\n includeHooks: false\n };\n\n if (kitName === 'custom' && !options.yes) {\n console.log(pc.cyan('\\nCustom kit configuration:'));\n toInstall.agents = await promptAgents(source.claudeDir);\n toInstall.skills = await promptSkills(source.claudeDir);\n toInstall.commands = await promptCommands(source.claudeDir);\n\n // Only ask for Claude-only features if Claude is a target\n if (cliTargets.includes('claude')) {\n toInstall.includeRouter = await promptIncludeRouter();\n toInstall.includeHooks = await promptIncludeHooks();\n }\n } else {\n const kit = getKit(kitName);\n if (!kit) {\n console.log(pc.red(`Unknown kit: ${kitName}`));\n console.log(pc.gray(`Available kits: ${Object.keys(KITS).join(', ')}`));\n return;\n }\n\n toInstall = {\n agents: kit.agents,\n commands: kit.commands,\n skills: kit.skills,\n workflows: kit.workflows || [],\n includeRouter: kit.includeRouter,\n includeHooks: kit.includeHooks\n };\n }\n\n // Apply --exclude and --only filters\n if (options.exclude || options.only) {\n toInstall.agents = filterComponents(toInstall.agents, options.exclude, options.only);\n toInstall.skills = filterComponents(toInstall.skills, options.exclude, options.only);\n toInstall.commands = filterComponents(toInstall.commands, options.exclude, options.only);\n toInstall.workflows = filterComponents(toInstall.workflows, options.exclude, options.only);\n }\n\n // 6. Confirm\n console.log(pc.cyan('\\nWill create:'));\n console.log(pc.white(` Project: ${projectName}/`));\n console.log(pc.white(` Targets: ${cliTargets.map(t => getTargetDisplayName(t)).join(', ')}`));\n console.log(pc.white(` Kit: ${kitName}`));\n\n if (Array.isArray(toInstall.agents)) {\n console.log(pc.gray(` Agents: ${toInstall.agents.length}`));\n }\n if (Array.isArray(toInstall.skills)) {\n console.log(pc.gray(` Skills: ${toInstall.skills.length}`));\n }\n if (Array.isArray(toInstall.commands)) {\n console.log(pc.gray(` Commands: ${toInstall.commands.length}`));\n }\n\n console.log('');\n\n // Skip confirmation if --force or --yes is set\n if (!options.force && !options.yes) {\n if (!await promptConfirm('Proceed?')) {\n console.log(pc.yellow('Cancelled.'));\n return;\n }\n }\n\n // 7. Create project using adapters\n const spinner = ora('Creating project...').start();\n\n try {\n await fs.ensureDir(projectDir);\n\n // Install for each CLI target using adapters\n for (const target of cliTargets) {\n const adapter = getAdapter(target);\n const targetDir = join(projectDir, adapter.config.directory);\n await fs.ensureDir(targetDir);\n\n const targetLabel = adapter.config.displayName;\n\n // Filter items based on target capabilities\n const filteredItems = adapter.filterInstallItems(toInstall);\n\n // Copy agents\n spinner.text = mergeMode ? `Merging agents (${targetLabel})...` : `Copying agents (${targetLabel})...`;\n await adapter.copyAgents(filteredItems.agents, source.claudeDir, targetDir, mergeMode);\n\n // Copy skills\n spinner.text = mergeMode ? `Merging skills (${targetLabel})...` : `Copying skills (${targetLabel})...`;\n await adapter.copySkills(filteredItems.skills, source.claudeDir, targetDir, mergeMode);\n\n // Copy commands\n spinner.text = mergeMode ? `Merging commands (${targetLabel})...` : `Copying commands (${targetLabel})...`;\n await adapter.copyCommands(filteredItems.commands, source.claudeDir, targetDir, mergeMode);\n\n // Copy workflows (if supported)\n if (adapter.supports('workflows') && filteredItems.workflows.length > 0) {\n spinner.text = mergeMode ? `Merging workflows (${targetLabel})...` : `Copying workflows (${targetLabel})...`;\n await adapter.copyWorkflows(filteredItems.workflows, source.claudeDir, targetDir, mergeMode);\n }\n\n // Copy router (if supported and requested)\n if (adapter.supports('router') && filteredItems.includeRouter) {\n spinner.text = mergeMode ? `Merging router (${targetLabel})...` : `Copying router (${targetLabel})...`;\n await adapter.copyRouter(source.claudeDir, targetDir, mergeMode);\n }\n\n // Copy hooks (if supported and requested)\n if (adapter.supports('hooks') && filteredItems.includeHooks) {\n spinner.text = mergeMode ? `Merging hooks (${targetLabel})...` : `Copying hooks (${targetLabel})...`;\n await adapter.copyHooks(source.claudeDir, targetDir, mergeMode);\n }\n\n // Copy extras (memory, scripts, output-styles)\n spinner.text = mergeMode ? `Merging extras (${targetLabel})...` : `Copying extras (${targetLabel})...`;\n await adapter.copyExtras(source.claudeDir, targetDir, mergeMode);\n\n // Copy base files\n spinner.text = mergeMode ? `Merging base files (${targetLabel})...` : `Copying base files (${targetLabel})...`;\n await adapter.copyBaseFiles(targetDir, mergeMode);\n\n // Discord-specific setup\n if (target === 'discord' && discordConfig && !discordConfig.restartOnly) {\n const discordAdapter = adapter as DiscordAdapter;\n\n spinner.text = 'Configuring Discord bot...';\n await discordAdapter.updateConfig(targetDir, discordConfig.token, discordConfig.guildId);\n\n if (discordConfig.autoSetup) {\n spinner.text = 'Setting up OpenClaw...';\n const result = await discordAdapter.setupOpenClaw(discordConfig.token);\n openclawSetupSuccess = result.success;\n if (!result.success) {\n console.log(pc.yellow(`\\n Note: ${result.message}`));\n }\n }\n } else if (target === 'discord' && discordConfig?.restartOnly) {\n openclawSetupSuccess = true;\n }\n }\n\n // Copy AGENTS.md (project root) - only if Claude is a target\n if (source.agentsMd && cliTargets.includes('claude')) {\n await copyAgentsMd(source.agentsMd, projectDir, mergeMode);\n }\n\n // Create state file\n spinner.text = 'Saving state...';\n await createInitialState(projectDir, {\n kit: kitName,\n source: source.path,\n targets: cliTargets,\n target: getTargetDirectory(cliTargets[0]),\n installed: {\n agents: toInstall.agents === 'all' ? ['all'] : toInstall.agents,\n skills: toInstall.skills === 'all' ? ['all'] : toInstall.skills,\n commands: toInstall.commands === 'all' ? ['all'] : toInstall.commands,\n workflows: toInstall.workflows === 'all' ? ['all'] : (toInstall.workflows || []),\n router: toInstall.includeRouter,\n hooks: toInstall.includeHooks\n }\n });\n\n const actionWord = mergeMode ? 'merged' : (existingAction === 'override' ? 'overridden' : 'created');\n spinner.succeed(pc.green(`Project ${actionWord} successfully!`));\n\n // Print next steps\n console.log('');\n if (!isCurrentDir) {\n console.log(pc.cyan('Next steps:'));\n console.log(pc.white(` cd ${projectName}`));\n }\n\n const targetNames = cliTargets.map(t => getTargetDisplayName(t)).join(' & ');\n console.log(pc.cyan(`Ready to code with ${targetNames}!`));\n\n console.log('');\n console.log(pc.gray('Useful commands:'));\n console.log(pc.gray(' ak status - Check file status'));\n console.log(pc.gray(' ak add <item> - Add more agents/skills'));\n console.log(pc.gray(' ak update - Sync from source'));\n\n // Discord-specific next steps\n if (cliTargets.includes('discord')) {\n console.log('');\n console.log(pc.cyan('Discord Bot Setup:'));\n\n const openclawInstalled = discordConfig?.openclawInstalled ?? false;\n\n if (!openclawInstalled) {\n console.log(pc.yellow(' 0. npm install -g openclaw - Install OpenClaw CLI first!'));\n console.log(pc.white(' 1. openclaw gateway - Start the bot'));\n console.log(pc.white(' 2. Invite bot to server - Use OAuth2 URL from Discord Portal'));\n console.log(pc.white(' 3. DM the bot to pair - Approve with: openclaw pairing approve discord <code>'));\n } else {\n if (openclawSetupSuccess) {\n console.log(pc.green(' ✓ OpenClaw installed & configured'));\n } else {\n console.log(pc.green(' ✓ OpenClaw installed'));\n }\n console.log(pc.white(' 1. openclaw gateway - Start the bot'));\n console.log(pc.white(' 2. Invite bot to server - Use OAuth2 URL from Discord Portal'));\n console.log(pc.white(' 3. DM the bot to pair - Approve with: openclaw pairing approve discord <code>'));\n }\n console.log(pc.gray(' See .discord/README.md for full guide'));\n }\n console.log('');\n\n } catch (error: any) {\n spinner.fail(pc.red('Failed to create project'));\n console.error(pc.red(error.message));\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n }\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { resolveSource, isAkProject } from '../utils/paths.js';\nimport { copyItems, listAvailable } from '../utils/copy.js';\nimport { loadState, updateState } from '../utils/state.js';\nimport { hashDirectory } from '../utils/hash.js';\n\nexport async function addCommand(item: string, options: Record<string, any> = {}): Promise<void> {\n // Parse item format: type:name (e.g., skill:databases, agent:debugger)\n const parts = item.split(':');\n if (parts.length !== 2) {\n console.log(pc.red('Invalid format. Use: ak add <type>:<name>'));\n console.log(pc.gray('Examples:'));\n console.log(pc.gray(' ak add skill:databases'));\n console.log(pc.gray(' ak add agent:debugger'));\n console.log(pc.gray(' ak add command:fix/ci'));\n return;\n }\n\n const [type, name] = parts;\n const validTypes = ['agent', 'agents', 'skill', 'skills', 'command', 'commands', 'workflow', 'workflows'];\n\n if (!validTypes.includes(type)) {\n console.log(pc.red(`Invalid type: ${type}`));\n console.log(pc.gray(`Valid types: agent, skill, command, workflow`));\n return;\n }\n\n // Normalize type to plural\n const typeMap: Record<string, string> = {\n agent: 'agents',\n agents: 'agents',\n skill: 'skills',\n skills: 'skills',\n command: 'commands',\n commands: 'commands',\n workflow: 'workflows',\n workflows: 'workflows'\n };\n const normalizedType = typeMap[type];\n\n const projectDir = options.path || process.cwd();\n\n // Check if in ak project\n if (!isAkProject(projectDir)) {\n console.log(pc.red('Not in an ak project.'));\n console.log(pc.gray('Run \"ak init\" first or use --path to specify project directory.'));\n return;\n }\n\n // Load state\n const state = await loadState(projectDir);\n if (!state) {\n console.log(pc.yellow('Warning: No state file found. Creating fresh state after add.'));\n }\n\n // Resolve source\n const sourceFlag = options.source || (state ? state.source : null);\n const source = resolveSource(sourceFlag);\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n return;\n }\n\n // Check if item exists in source\n const available = listAvailable(normalizedType, source.claudeDir);\n const exists = available.some(a => a.name === name);\n\n if (!exists) {\n console.log(pc.red(`${type} \"${name}\" not found in source.`));\n console.log(pc.gray(`Use \"ak list ${normalizedType}\" to see available options.`));\n return;\n }\n\n // Determine target directory\n const targetFolder = state?.target || '.claude';\n const targetDir = join(projectDir, targetFolder);\n\n // Check if already installed\n const destPath = join(targetDir, normalizedType, name);\n const destPathMd = destPath + '.md';\n if (fs.existsSync(destPath) || fs.existsSync(destPathMd)) {\n console.log(pc.yellow(`${type} \"${name}\" already exists in project.`));\n console.log(pc.gray('Use \"ak update\" to refresh from source.'));\n return;\n }\n\n // Copy\n const spinner = ora(`Adding ${type} \"${name}\"...`).start();\n\n try {\n const result = await copyItems([name], normalizedType, source.claudeDir, targetDir);\n\n if (result.copied.length > 0) {\n spinner.succeed(pc.green(`Added ${type}: ${name}`));\n\n // Update state\n if (state) {\n const installed = state.installed || {};\n const typeArray = installed[normalizedType as keyof typeof installed];\n if (!typeArray) {\n (installed as any)[normalizedType] = [name];\n } else if (Array.isArray(typeArray) && !typeArray.includes(name)) {\n typeArray.push(name);\n }\n\n // Recalculate hashes\n const newHashes = await hashDirectory(targetDir);\n\n await updateState(projectDir, {\n installed,\n originalHashes: newHashes\n });\n }\n\n console.log(pc.gray(`Location: ${targetFolder}/${normalizedType}/${name}`));\n } else if (result.skipped.length > 0) {\n spinner.fail(pc.red(`Could not find ${type}: ${name}`));\n } else if (result.errors.length > 0) {\n spinner.fail(pc.red(`Error adding ${type}: ${result.errors[0].error}`));\n }\n } catch (error: any) {\n spinner.fail(pc.red(`Failed to add ${type}`));\n console.error(pc.red(error.message));\n }\n}\n","import pc from 'picocolors';\nimport { getKitList } from '../kits/index.js';\nimport { resolveSource } from '../utils/paths.js';\nimport { listAvailable, type AvailableItem } from '../utils/copy.js';\n\nexport async function listCommand(type: string | undefined, options: Record<string, any> = {}): Promise<void> {\n const validTypes = ['kits', 'agents', 'skills', 'commands', 'workflows'];\n\n // If no type specified, show help\n if (!type) {\n console.log(pc.cyan('\\nAvailable list commands:'));\n console.log(pc.white(' ak list kits - List available kits'));\n console.log(pc.white(' ak list agents - List available agents'));\n console.log(pc.white(' ak list skills - List available skills'));\n console.log(pc.white(' ak list commands - List available commands'));\n console.log(pc.white(' ak list workflows - List available workflows'));\n console.log('');\n return;\n }\n\n // Normalize type\n type = type.toLowerCase();\n if (!validTypes.includes(type)) {\n console.log(pc.red(`Unknown type: ${type}`));\n console.log(pc.gray(`Valid types: ${validTypes.join(', ')}`));\n return;\n }\n\n // List kits (doesn't need source)\n if (type === 'kits') {\n listKits();\n return;\n }\n\n // For other types, need source\n const source = resolveSource(options.source);\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n return;\n }\n\n console.log(pc.gray(`Source: ${source.path}\\n`));\n\n switch (type) {\n case 'agents':\n listAgents(source.claudeDir);\n break;\n case 'skills':\n listSkills(source.claudeDir);\n break;\n case 'commands':\n listCommandsList(source.claudeDir);\n break;\n case 'workflows':\n listWorkflows(source.claudeDir);\n break;\n }\n}\n\nfunction listKits(): void {\n const kits = getKitList();\n\n console.log(pc.bold(pc.cyan('\\nAvailable Kits:\\n')));\n\n for (const kit of kits) {\n const colorFn = (pc as any)[kit.color] || pc.white;\n console.log(` ${kit.emoji} ${colorFn(pc.bold(kit.name.padEnd(12)))} - ${kit.description}`);\n\n // Show details\n if (Array.isArray(kit.agents)) {\n const agentCount = Array.isArray(kit.agents) ? kit.agents.length : 'all';\n const skillCount = Array.isArray(kit.skills) ? kit.skills.length : 'all';\n const cmdCount = Array.isArray(kit.commands) ? kit.commands.length : 'all';\n console.log(pc.gray(` Agents: ${agentCount} | Skills: ${skillCount} | Commands: ${cmdCount}`));\n } else {\n console.log(pc.gray(' Includes: ALL agents, skills, commands'));\n }\n }\n\n console.log(`\\n 🔧 ${pc.bold('custom'.padEnd(12))} - Pick your own agents, skills, and commands`);\n console.log('');\n}\n\nfunction listAgents(sourceDir: string): void {\n const agents = listAvailable('agents', sourceDir);\n\n console.log(pc.bold(pc.cyan(`Available Agents (${agents.length}):\\n`)));\n\n if (agents.length === 0) {\n console.log(pc.gray(' No agents found'));\n return;\n }\n\n // Group into columns\n const cols = 3;\n const rows = Math.ceil(agents.length / cols);\n\n for (let i = 0; i < rows; i++) {\n let line = ' ';\n for (let j = 0; j < cols; j++) {\n const idx = i + j * rows;\n if (idx < agents.length) {\n line += pc.white(agents[idx].name.padEnd(25));\n }\n }\n console.log(line);\n }\n console.log('');\n}\n\nfunction listSkills(sourceDir: string): void {\n const skills = listAvailable('skills', sourceDir).filter(s => s.isDir);\n\n console.log(pc.bold(pc.cyan(`Available Skills (${skills.length}):\\n`)));\n\n if (skills.length === 0) {\n console.log(pc.gray(' No skills found'));\n return;\n }\n\n // Group into columns\n const cols = 2;\n const rows = Math.ceil(skills.length / cols);\n\n for (let i = 0; i < rows; i++) {\n let line = ' ';\n for (let j = 0; j < cols; j++) {\n const idx = i + j * rows;\n if (idx < skills.length) {\n line += pc.white(skills[idx].name.padEnd(35));\n }\n }\n console.log(line);\n }\n console.log('');\n}\n\nfunction listCommandsList(sourceDir: string): void {\n const commands = listAvailable('commands', sourceDir);\n\n console.log(pc.bold(pc.cyan(`Available Commands (${commands.length}):\\n`)));\n\n if (commands.length === 0) {\n console.log(pc.gray(' No commands found'));\n return;\n }\n\n // Separate files and directories\n const files = commands.filter(c => !c.isDir);\n const dirs = commands.filter(c => c.isDir);\n\n // Print main commands (files)\n console.log(pc.gray(' Main commands:'));\n const cols = 4;\n const rows = Math.ceil(files.length / cols);\n\n for (let i = 0; i < rows; i++) {\n let line = ' ';\n for (let j = 0; j < cols; j++) {\n const idx = i + j * rows;\n if (idx < files.length) {\n line += pc.white(('/' + files[idx].name).padEnd(18));\n }\n }\n console.log(line);\n }\n\n // Print command groups (directories)\n if (dirs.length > 0) {\n console.log(pc.gray('\\n Command groups:'));\n for (const dir of dirs) {\n console.log(pc.yellow(` /${dir.name}/`));\n }\n }\n\n console.log('');\n}\n\nfunction listWorkflows(sourceDir: string): void {\n const workflows = listAvailable('workflows', sourceDir);\n\n console.log(pc.bold(pc.cyan(`Available Workflows (${workflows.length}):\\n`)));\n\n if (workflows.length === 0) {\n console.log(pc.gray(' No workflows found'));\n return;\n }\n\n for (const wf of workflows) {\n console.log(pc.white(` • ${wf.name}`));\n }\n console.log('');\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { resolveSource, isAkProject } from '../utils/paths.js';\nimport { loadState, updateState, getFileStatuses } from '../utils/state.js';\nimport { hashFile, hashDirectory } from '../utils/hash.js';\nimport { promptUpdateConfirm } from '../utils/prompts.js';\n\nexport async function updateCommand(options: Record<string, any> = {}): Promise<void> {\n const projectDir = process.cwd();\n\n // Check if in ak project\n if (!isAkProject(projectDir)) {\n console.log(pc.red('Not in an ak project.'));\n console.log(pc.gray('Run \"ak init\" first.'));\n return;\n }\n\n // Load state\n const state = await loadState(projectDir);\n if (!state) {\n console.log(pc.red('No state file found.'));\n console.log(pc.gray('This project may have been created without ak. Run \"ak doctor\" for more info.'));\n return;\n }\n\n // Resolve source\n const sourceFlag = options.source || state.source;\n const source = resolveSource(sourceFlag);\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n return;\n }\n\n console.log(pc.gray(`Source: ${source.path}`));\n console.log(pc.gray(`Target: ${state.target}`));\n console.log('');\n\n const spinner = ora('Checking for updates...').start();\n\n try {\n // Get current file statuses\n const result = await getFileStatuses(projectDir);\n if ('error' in result) {\n spinner.fail(pc.red(result.error));\n return;\n }\n\n const { statuses, targetDir } = result;\n\n // Determine what types to update\n let typesToUpdate = ['agents', 'skills', 'commands', 'workflows'];\n if (options.agents) typesToUpdate = ['agents'];\n if (options.skills) typesToUpdate = ['skills'];\n if (options.commands) typesToUpdate = ['commands'];\n\n // Get source hashes\n const sourceHashes: Record<string, string> = {};\n for (const type of typesToUpdate) {\n const typeDir = join(source.claudeDir, type);\n if (fs.existsSync(typeDir)) {\n const hashes = await hashDirectory(typeDir);\n for (const [path, hash] of Object.entries(hashes)) {\n sourceHashes[`${type}/${path}`] = hash;\n }\n }\n }\n\n // Compare with current\n const toUpdate: string[] = [];\n const skipped: string[] = [];\n const newFiles: string[] = [];\n\n for (const [path, sourceHash] of Object.entries(sourceHashes)) {\n const currentPath = join(targetDir, path);\n const originalHash = state.originalHashes?.[path];\n const currentHash = fs.existsSync(currentPath) ? hashFile(currentPath) : null;\n\n if (!currentHash) {\n // New file from source\n newFiles.push(path);\n } else if (currentHash === originalHash) {\n // File unchanged locally, can update\n if (sourceHash !== currentHash) {\n toUpdate.push(path);\n }\n } else {\n // File modified locally, skip\n if (sourceHash !== originalHash) {\n skipped.push(path);\n }\n }\n }\n\n spinner.stop();\n\n // Show summary\n if (toUpdate.length === 0 && newFiles.length === 0) {\n console.log(pc.green('✓ Already up to date!'));\n if (skipped.length > 0) {\n console.log(pc.yellow(` ${skipped.length} file(s) skipped (modified locally)`));\n }\n return;\n }\n\n console.log(pc.cyan('Updates available:'));\n console.log(pc.green(` ${toUpdate.length} file(s) to update`));\n console.log(pc.blue(` ${newFiles.length} new file(s)`));\n if (skipped.length > 0) {\n console.log(pc.yellow(` ${skipped.length} file(s) skipped (modified locally)`));\n }\n console.log('');\n\n // Dry run mode\n if (options.dryRun) {\n console.log(pc.cyan('Dry run - no changes made'));\n console.log(pc.gray('\\nFiles that would be updated:'));\n [...toUpdate, ...newFiles].forEach(f => console.log(pc.gray(` ${f}`)));\n if (skipped.length > 0) {\n console.log(pc.gray('\\nFiles that would be skipped:'));\n skipped.forEach(f => console.log(pc.yellow(` ~ ${f}`)));\n }\n return;\n }\n\n // Confirm\n if (!options.force) {\n const confirmed = await promptUpdateConfirm({\n toUpdate: [...toUpdate, ...newFiles],\n skipped\n });\n if (!confirmed) {\n console.log(pc.yellow('Cancelled.'));\n return;\n }\n }\n\n // Apply updates\n const updateSpinner = ora('Applying updates...').start();\n\n let updated = 0;\n let failed = 0;\n\n for (const path of [...toUpdate, ...newFiles]) {\n try {\n const srcPath = join(source.claudeDir, path);\n const destPath = join(targetDir, path);\n\n await fs.ensureDir(join(targetDir, path.split('/').slice(0, -1).join('/')));\n await fs.copy(srcPath, destPath, { overwrite: true });\n updated++;\n } catch (err: any) {\n failed++;\n if (process.env.DEBUG) {\n console.error(`Failed to update ${path}: ${err.message}`);\n }\n }\n }\n\n // Update state with new hashes\n const newHashes = await hashDirectory(targetDir);\n await updateState(projectDir, {\n source: source.path,\n originalHashes: newHashes\n });\n\n updateSpinner.succeed(pc.green(`Updated ${updated} file(s)`));\n\n if (failed > 0) {\n console.log(pc.yellow(` ${failed} file(s) failed to update`));\n }\n\n if (skipped.length > 0) {\n console.log(pc.gray(`\\nSkipped files (modified locally):`));\n skipped.slice(0, 5).forEach(f => console.log(pc.yellow(` ~ ${f}`)));\n if (skipped.length > 5) {\n console.log(pc.gray(` ... and ${skipped.length - 5} more`));\n }\n }\n\n } catch (error: any) {\n spinner.fail(pc.red('Update failed'));\n console.error(pc.red(error.message));\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n }\n}\n","import pc from 'picocolors';\nimport { isAkProject } from '../utils/paths.js';\nimport { loadState, getFileStatuses } from '../utils/state.js';\nimport fs from 'fs-extra';\n\nexport async function statusCommand(options: Record<string, any> = {}): Promise<void> {\n const projectDir = process.cwd();\n\n // Check if in ak project\n if (!isAkProject(projectDir)) {\n console.log(pc.red('Not in an ak project.'));\n console.log(pc.gray('Run \"ak init\" first.'));\n return;\n }\n\n // Load state\n const state = await loadState(projectDir);\n if (!state) {\n console.log(pc.yellow('No state file found.'));\n console.log(pc.gray('This project may have been created without ak.'));\n return;\n }\n\n // Print project info\n console.log(pc.bold(pc.cyan('\\nProject Status\\n')));\n console.log(pc.white(` Kit: ${state.kit}`));\n console.log(pc.white(` Target: ${state.target}`));\n console.log(pc.white(` Source: ${state.source}`));\n console.log(pc.gray(` Created: ${new Date(state.createdAt).toLocaleDateString()}`));\n console.log(pc.gray(` Updated: ${new Date(state.lastUpdate).toLocaleDateString()}`));\n console.log('');\n\n // Get file statuses\n const result = await getFileStatuses(projectDir);\n\n if ('error' in result) {\n console.log(pc.red(`Error: ${result.error}`));\n return;\n }\n\n const { statuses } = result;\n\n // Summary\n const total = statuses.unchanged.length + statuses.modified.length + statuses.added.length;\n console.log(pc.cyan('File Status:'));\n console.log(pc.green(` ✓ ${statuses.unchanged.length} unchanged`));\n if (statuses.modified.length > 0) {\n console.log(pc.yellow(` ~ ${statuses.modified.length} modified`));\n }\n if (statuses.added.length > 0) {\n console.log(pc.blue(` + ${statuses.added.length} added locally`));\n }\n if (statuses.deleted.length > 0) {\n console.log(pc.red(` - ${statuses.deleted.length} deleted`));\n }\n console.log(pc.gray(` Total: ${total} files tracked`));\n console.log('');\n\n // Show modified files\n if (statuses.modified.length > 0 && (options.verbose || statuses.modified.length <= 10)) {\n console.log(pc.yellow('Modified files:'));\n for (const file of statuses.modified) {\n console.log(pc.yellow(` ~ ${file}`));\n }\n console.log('');\n } else if (statuses.modified.length > 10) {\n console.log(pc.yellow(`Modified files: (showing first 10, use --verbose for all)`));\n for (const file of statuses.modified.slice(0, 10)) {\n console.log(pc.yellow(` ~ ${file}`));\n }\n console.log(pc.gray(` ... and ${statuses.modified.length - 10} more`));\n console.log('');\n }\n\n // Show added files\n if (statuses.added.length > 0 && (options.verbose || statuses.added.length <= 5)) {\n console.log(pc.blue('Added locally:'));\n for (const file of statuses.added) {\n console.log(pc.blue(` + ${file}`));\n }\n console.log('');\n }\n\n // Installed components\n if (state.installed) {\n console.log(pc.cyan('Installed Components:'));\n const { agents, skills, commands, workflows, router, hooks } = state.installed;\n\n if (agents && agents.length > 0) {\n console.log(pc.gray(` Agents: ${agents.includes('all') ? 'ALL' : agents.length}`));\n }\n if (skills && skills.length > 0) {\n console.log(pc.gray(` Skills: ${skills.includes('all') ? 'ALL' : skills.length}`));\n }\n if (commands && commands.length > 0) {\n console.log(pc.gray(` Commands: ${commands.includes('all') ? 'ALL' : commands.length}`));\n }\n if (workflows && workflows.length > 0) {\n console.log(pc.gray(` Workflows: ${workflows.includes('all') ? 'ALL' : workflows.length}`));\n }\n if (router) console.log(pc.gray(' Router: ✓'));\n if (hooks) console.log(pc.gray(' Hooks: ✓'));\n console.log('');\n }\n\n // Check source availability\n if (state.source && !fs.existsSync(state.source)) {\n console.log(pc.yellow('⚠ Source directory not found. Update may not work.'));\n console.log(pc.gray(` Expected: ${state.source}`));\n console.log('');\n }\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport { isAkProject, resolveSource, TARGETS } from '../utils/paths.js';\nimport { loadState, createInitialState } from '../utils/state.js';\n\ninterface CheckResult {\n name: string;\n label: string;\n passed: boolean;\n severity: 'error' | 'warning';\n fixed?: boolean;\n fixError?: string;\n meta?: Record<string, any>;\n}\n\ninterface Check {\n name: string;\n label: string;\n severity: 'error' | 'warning';\n check: () => boolean | Promise<boolean>;\n fix?: () => void | Promise<void>;\n getMeta?: () => Record<string, any> | Promise<Record<string, any>>;\n}\n\nexport async function doctorCommand(options: Record<string, any> = {}): Promise<{ issues: number; warnings: number }> {\n const projectDir = process.cwd();\n\n // Detect target directory for use across checks\n let targetDir: { name: string; folder: string; dir: string } | null = null;\n for (const [name, folder] of Object.entries(TARGETS)) {\n const dir = join(projectDir, folder);\n if (fs.existsSync(dir)) {\n targetDir = { name, folder, dir };\n break;\n }\n }\n\n // Load state once\n let state = await loadState(projectDir);\n\n // Define all checks\n const checks: Check[] = [\n {\n name: 'project',\n label: 'ak project detected',\n severity: 'error',\n check: () => isAkProject(projectDir),\n fix: async () => {\n await fs.ensureDir(join(projectDir, '.ak'));\n }\n },\n {\n name: 'state',\n label: 'State file (.ak/state.json) exists',\n severity: 'warning',\n check: () => state !== null,\n fix: async () => {\n // Create state with detected values\n const kit = 'unknown';\n const source = '';\n const target = targetDir ? targetDir.folder : '.claude';\n\n // Detect installed components\n const installed: any = {};\n if (targetDir) {\n const dirs = ['agents', 'skills', 'commands', 'workflows'];\n for (const dir of dirs) {\n const fullPath = join(targetDir.dir, dir);\n if (fs.existsSync(fullPath)) {\n const items = fs.readdirSync(fullPath).filter(f => !f.startsWith('.'));\n if (items.length > 0) {\n installed[dir] = items;\n }\n }\n }\n }\n\n await createInitialState(projectDir, { kit, source, target, installed });\n state = await loadState(projectDir); // Reload state\n }\n },\n {\n name: 'target',\n label: 'Target directory exists',\n severity: 'error',\n check: () => targetDir !== null,\n getMeta: () => targetDir ? { folder: targetDir.folder } : {}\n },\n {\n name: 'agents_md',\n label: 'AGENTS.md exists',\n severity: 'warning',\n check: () => fs.existsSync(join(projectDir, 'AGENTS.md'))\n },\n {\n name: 'source',\n label: 'Source directory accessible',\n severity: 'error',\n check: () => {\n if (!state || !state.source) return true; // Skip if no state/source\n return fs.existsSync(state.source);\n },\n getMeta: () => state && state.source ? { source: state.source } : {}\n },\n {\n name: 'subdirs_agents',\n label: 'agents/ exists',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'agents'));\n },\n fix: async () => {\n if (targetDir) {\n await fs.ensureDir(join(targetDir.dir, 'agents'));\n }\n },\n getMeta: () => {\n if (!targetDir) return {};\n const fullPath = join(targetDir.dir, 'agents');\n if (fs.existsSync(fullPath)) {\n const items = fs.readdirSync(fullPath).length;\n return { items };\n }\n return {};\n }\n },\n {\n name: 'subdirs_commands',\n label: 'commands/ exists',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'commands'));\n },\n fix: async () => {\n if (targetDir) {\n await fs.ensureDir(join(targetDir.dir, 'commands'));\n }\n },\n getMeta: () => {\n if (!targetDir) return {};\n const fullPath = join(targetDir.dir, 'commands');\n if (fs.existsSync(fullPath)) {\n const items = fs.readdirSync(fullPath).length;\n return { items };\n }\n return {};\n }\n },\n {\n name: 'subdirs_skills',\n label: 'skills/ exists',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'skills'));\n },\n fix: async () => {\n if (targetDir) {\n await fs.ensureDir(join(targetDir.dir, 'skills'));\n }\n },\n getMeta: () => {\n if (!targetDir) return {};\n const fullPath = join(targetDir.dir, 'skills');\n if (fs.existsSync(fullPath)) {\n const items = fs.readdirSync(fullPath).length;\n return { items };\n }\n return {};\n }\n },\n {\n name: 'subdirs_scripts',\n label: 'scripts/ exists',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'scripts'));\n }\n },\n {\n name: 'subdirs_hooks',\n label: 'hooks/ exists',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'hooks'));\n }\n },\n {\n name: 'statusline',\n label: 'statusline files exist',\n severity: 'warning',\n check: () => {\n if (!targetDir) return false;\n return fs.existsSync(join(targetDir.dir, 'statusline.cjs')) ||\n fs.existsSync(join(targetDir.dir, 'statusline.sh'));\n }\n }\n ];\n\n // Run checks\n const results = await runChecks(checks, options);\n\n // Handle output modes\n if (options.json) {\n await outputJson(projectDir, results);\n return computeSummary(results);\n }\n\n if (options.report) {\n await outputReport(projectDir, results, options);\n }\n\n if (options.checkOnly) {\n const summary = computeSummary(results);\n if (summary.issues > 0) {\n process.exit(1);\n } else {\n process.exit(0);\n }\n }\n\n // Default colored output (backward compatible)\n await outputColored(projectDir, results, state, targetDir);\n\n return computeSummary(results);\n}\n\nasync function runChecks(checks: Check[], options: Record<string, any>): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n for (const c of checks) {\n const passed = await c.check();\n const meta = c.getMeta ? await c.getMeta() : undefined;\n const result: CheckResult = {\n name: c.name,\n label: c.label,\n passed,\n severity: c.severity,\n meta\n };\n\n if (!passed && options.fix && c.fix) {\n try {\n await c.fix();\n result.fixed = true;\n result.passed = true;\n } catch (e: any) {\n result.fixError = e.message;\n }\n }\n\n results.push(result);\n }\n\n return results;\n}\n\nfunction computeSummary(results: CheckResult[]): { issues: number; warnings: number } {\n let issues = 0;\n let warnings = 0;\n\n for (const r of results) {\n if (!r.passed && r.severity === 'error') {\n issues++;\n }\n if (!r.passed && r.severity === 'warning') {\n warnings++;\n }\n }\n\n return { issues, warnings };\n}\n\nasync function outputJson(projectDir: string, results: CheckResult[]): Promise<void> {\n const summary = computeSummary(results);\n const fixed = results.filter(r => r.fixed).length;\n\n const output = {\n project: projectDir,\n timestamp: new Date().toISOString(),\n checks: results,\n summary: {\n total: results.length,\n passed: results.filter(r => r.passed).length,\n failed: results.filter(r => !r.passed).length,\n warnings: summary.warnings,\n fixed\n }\n };\n\n console.log(JSON.stringify(output, null, 2));\n}\n\nasync function outputReport(projectDir: string, results: CheckResult[], options: Record<string, any>): Promise<void> {\n const summary = computeSummary(results);\n const timestamp = new Date().toISOString();\n\n let markdown = `# Apero Kit Doctor Report\\n\\n`;\n markdown += `**Project:** ${projectDir}\\n`;\n markdown += `**Timestamp:** ${timestamp}\\n\\n`;\n\n markdown += `## Summary\\n\\n`;\n markdown += `- Total checks: ${results.length}\\n`;\n markdown += `- Passed: ${results.filter(r => r.passed).length}\\n`;\n markdown += `- Failed: ${results.filter(r => !r.passed).length}\\n`;\n markdown += `- Errors: ${summary.issues}\\n`;\n markdown += `- Warnings: ${summary.warnings}\\n`;\n if (options.fix) {\n markdown += `- Fixed: ${results.filter(r => r.fixed).length}\\n`;\n }\n markdown += `\\n`;\n\n markdown += `## Check Results\\n\\n`;\n for (const r of results) {\n const icon = r.passed ? '✓' : (r.severity === 'error' ? '✗' : '⚠');\n markdown += `### ${icon} ${r.label}\\n\\n`;\n markdown += `- **Status:** ${r.passed ? 'PASS' : 'FAIL'}\\n`;\n markdown += `- **Severity:** ${r.severity}\\n`;\n if (r.fixed) {\n markdown += `- **Fixed:** Yes\\n`;\n }\n if (r.fixError) {\n markdown += `- **Fix Error:** ${r.fixError}\\n`;\n }\n if (r.meta && Object.keys(r.meta).length > 0) {\n markdown += `- **Details:** ${JSON.stringify(r.meta)}\\n`;\n }\n markdown += `\\n`;\n }\n\n markdown += `## Suggestions\\n\\n`;\n const failedChecks = results.filter(r => !r.passed);\n if (failedChecks.length === 0) {\n markdown += `All checks passed! No suggestions.\\n`;\n } else {\n for (const r of failedChecks) {\n if (r.name === 'project') {\n markdown += `- Run \"ak init .\" to initialize this directory\\n`;\n }\n if (r.name === 'state') {\n markdown += `- State file is missing. Re-run \"ak init\" or create manually\\n`;\n }\n if (r.name === 'source' && r.meta?.source) {\n markdown += `- Update source path: ak update --source <new-path>\\n`;\n }\n }\n }\n\n const reportPath = join(projectDir, '.ak', 'doctor-report.md');\n await fs.ensureDir(join(projectDir, '.ak'));\n await fs.writeFile(reportPath, markdown, 'utf-8');\n\n if (!options.json) {\n console.log(pc.green(`\\n✓ Report saved to ${reportPath}\\n`));\n }\n}\n\nasync function outputColored(\n projectDir: string,\n results: CheckResult[],\n state: any,\n targetDir: { name: string; folder: string; dir: string } | null\n): Promise<void> {\n console.log(pc.bold(pc.cyan('\\nApero Kit Doctor\\n')));\n console.log(pc.gray('Checking project health...\\n'));\n\n // Output each check result\n for (const r of results) {\n if (r.passed) {\n let msg = `✓ ${r.label}`;\n if (r.name === 'target' && r.meta?.folder) {\n msg += ` (${r.meta.folder})`;\n }\n if (r.name.startsWith('subdirs_') && r.meta?.items !== undefined) {\n msg += ` (${r.meta.items} items)`;\n }\n console.log(pc.green(msg));\n } else {\n const icon = r.severity === 'error' ? '✗' : '⚠';\n const color = r.severity === 'error' ? pc.red : pc.yellow;\n let msg = `${icon} ${r.label}`;\n if (r.name === 'target') {\n msg = `${icon} No target directory (.claude/, .opencode/, .agent/)`;\n }\n if (r.name === 'agents_md') {\n msg = `${icon} AGENTS.md not found (optional but recommended)`;\n }\n if (r.name === 'source' && r.meta?.source) {\n msg = `${icon} Source directory not found: ${r.meta.source}`;\n }\n if (r.name.startsWith('subdirs_')) {\n const dir = r.name.replace('subdirs_', '');\n msg = `${icon} ${dir}/ not found`;\n }\n console.log(color(msg));\n }\n }\n\n // Source detection (special formatting)\n console.log('');\n console.log(pc.gray('Source detection:'));\n const source = resolveSource();\n if ('error' in source) {\n console.log(pc.yellow(` ⚠ ${source.error}`));\n } else {\n console.log(pc.green(` ✓ Found source: ${source.path}`));\n console.log(pc.gray(` Type: ${source.type || 'unknown'}`));\n }\n\n // Summary\n const summary = computeSummary(results);\n console.log('');\n console.log(pc.cyan('─'.repeat(40)));\n\n if (summary.issues === 0 && summary.warnings === 0) {\n console.log(pc.bold(pc.green('\\n✓ All checks passed!\\n')));\n } else if (summary.issues === 0) {\n console.log(pc.yellow(`\\n⚠ ${summary.warnings} warning(s), no critical issues\\n`));\n } else {\n console.log(pc.red(`\\n✗ ${summary.issues} issue(s), ${summary.warnings} warning(s)\\n`));\n }\n\n // Suggestions\n if (summary.issues > 0 || summary.warnings > 0) {\n console.log(pc.cyan('Suggestions:'));\n\n const isProject = results.find(r => r.name === 'project')?.passed;\n const hasState = results.find(r => r.name === 'state')?.passed;\n\n if (!isProject) {\n console.log(pc.white(' • Run \"ak init .\" to initialize this directory'));\n }\n\n if (!hasState && isProject) {\n console.log(pc.white(' • State file is missing. Re-run \"ak init\" or create manually'));\n }\n\n if (state && state.source && !fs.existsSync(state.source)) {\n console.log(pc.white(' • Update source path: ak update --source <new-path>'));\n }\n\n console.log('');\n }\n}\n","import { exec } from 'child_process';\nimport pc from 'picocolors';\n\nconst HELP_URL = 'https://www.vividkit.dev/vi/guides/what-is-claudekit';\n\nexport async function helpCommand(options: Record<string, any>): Promise<void> {\n console.log(pc.cyan('\\n📚 Opening VividKit documentation...\\n'));\n console.log(pc.green(` ${HELP_URL}\\n`));\n const openCommand = process.platform === 'darwin' ? 'open' :\n process.platform === 'win32' ? 'start' : 'xdg-open';\n exec(`${openCommand} ${HELP_URL}`);\n}\n","import fs from 'fs-extra';\nimport { join } from 'path';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport * as p from '@clack/prompts';\nimport { getGlobalInstallPath, TARGETS } from '../utils/paths.js';\nimport { loadState } from '../utils/state.js';\n\nconst PRESERVED_FILES = ['CLAUDE.md', 'settings.json', 'AGENTS.md'];\nconst AK_SUBDIRS = ['agents', 'skills', 'commands', 'workflows', 'hooks', 'router'];\n\ninterface UninstallResult {\n removed: string[];\n errors: Array<{ path: string; error: string }>;\n}\n\nexport async function uninstallCommand(options: Record<string, any>): Promise<void> {\n p.intro(pc.bgCyan(pc.black(' AK Uninstall ')));\n\n // Determine scope\n const targets: Array<{ type: string; dir: string }> = [];\n\n if (options.local || (!options.global && !options.local)) {\n targets.push({ type: 'local', dir: process.cwd() });\n }\n if (options.global) {\n targets.push({ type: 'global', dir: getGlobalInstallPath() });\n }\n\n let totalRemoved = 0;\n\n for (const target of targets) {\n const count = await uninstallFromDir(target.type, target.dir, options);\n totalRemoved += count;\n }\n\n if (totalRemoved === 0) {\n p.outro(pc.yellow('No installations found to remove.'));\n } else {\n p.outro(pc.green(`Successfully removed ${totalRemoved} item(s).`));\n }\n}\n\nasync function uninstallFromDir(\n type: string,\n dir: string,\n options: Record<string, any>\n): Promise<number> {\n const spinner = ora(`Scanning ${type} installation at ${pc.dim(dir)}`).start();\n\n // Load state\n const state = await loadState(dir);\n\n // Detect which target directories exist\n const existingTargets: Array<{ name: string; path: string }> = [];\n for (const [name, folder] of Object.entries(TARGETS)) {\n const targetPath = join(dir, folder);\n if (fs.existsSync(targetPath)) {\n existingTargets.push({ name, path: targetPath });\n }\n }\n\n // Check for .ak directory\n const akDir = join(dir, '.ak');\n const hasAkState = fs.existsSync(akDir);\n\n if (existingTargets.length === 0 && !hasAkState) {\n spinner.warn(pc.yellow(`No AK installation found in ${type}`));\n return 0;\n }\n\n spinner.succeed(pc.green(`Found AK installation in ${type}`));\n\n // Build removal list\n const removalList: string[] = [];\n\n // Add all AK-managed subdirectories inside target directories\n for (const target of existingTargets) {\n for (const subdir of AK_SUBDIRS) {\n const subdirPath = join(target.path, subdir);\n if (fs.existsSync(subdirPath)) {\n removalList.push(subdirPath);\n }\n }\n }\n\n // Add .ak state directory\n if (hasAkState) {\n removalList.push(akDir);\n }\n\n if (removalList.length === 0) {\n console.log(pc.yellow(` No files to remove from ${type}`));\n return 0;\n }\n\n // Display what will be removed\n console.log(pc.cyan(`\\n Items to remove from ${type}:`));\n for (const path of removalList) {\n const relativePath = path.replace(dir + '/', '');\n console.log(pc.dim(` • ${relativePath}`));\n }\n\n if (state) {\n console.log(pc.dim(`\\n Kit: ${state.kit}`));\n console.log(pc.dim(` Target: ${state.target}`));\n }\n\n console.log(pc.yellow(`\\n Preserved files: ${PRESERVED_FILES.join(', ')}`));\n\n // Dry run - just preview\n if (options.dryRun) {\n console.log(pc.yellow(`\\n [DRY RUN] Would remove ${removalList.length} item(s)`));\n return 0;\n }\n\n // Confirmation prompt (unless --yes)\n if (!options.yes) {\n const confirmed = await p.confirm({\n message: `Remove ${removalList.length} item(s) from ${type}?`,\n initialValue: false\n });\n\n if (p.isCancel(confirmed) || !confirmed) {\n console.log(pc.dim(' Cancelled.'));\n return 0;\n }\n }\n\n // Perform removal\n const result = await removeItems(removalList, dir);\n\n // Display results\n if (result.removed.length > 0) {\n console.log(pc.green(`\\n ✓ Removed ${result.removed.length} item(s) from ${type}`));\n for (const path of result.removed) {\n const relativePath = path.replace(dir + '/', '');\n console.log(pc.dim(` • ${relativePath}`));\n }\n }\n\n if (result.errors.length > 0) {\n console.log(pc.red(`\\n ✗ Failed to remove ${result.errors.length} item(s):`));\n for (const error of result.errors) {\n const relativePath = error.path.replace(dir + '/', '');\n console.log(pc.red(` • ${relativePath}: ${error.error}`));\n }\n }\n\n return result.removed.length;\n}\n\nasync function removeItems(paths: string[], baseDir: string): Promise<UninstallResult> {\n const result: UninstallResult = {\n removed: [],\n errors: []\n };\n\n for (const path of paths) {\n // Security check: ensure path is within baseDir\n if (!path.startsWith(baseDir)) {\n result.errors.push({\n path,\n error: 'Path outside base directory (security check failed)'\n });\n continue;\n }\n\n // Security check: ensure path contains expected directories\n const isExpectedPath =\n path.includes('/.ak') ||\n AK_SUBDIRS.some(subdir => path.includes(`/${subdir}`));\n\n if (!isExpectedPath) {\n result.errors.push({\n path,\n error: 'Path is not an expected AK directory (security check failed)'\n });\n continue;\n }\n\n try {\n await fs.remove(path);\n result.removed.push(path);\n } catch (error) {\n result.errors.push({\n path,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n\n return result;\n}\n","import { execSync } from 'child_process';\n\nconst REMOTE_REPO_URL = 'https://github.com/Thanhnguyen6702/CK-Internal.git';\n\nexport { REMOTE_REPO_URL };\n\nexport function fetchRemoteTags(repoUrl: string = REMOTE_REPO_URL): string[] {\n const output = execSync(`git ls-remote --tags \"${repoUrl}\"`, {\n encoding: 'utf-8',\n timeout: 15000,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n\n return output.split('\\n')\n .filter(line => line.includes('refs/tags/'))\n .map(line => {\n const tag = line.split('refs/tags/')[1]?.replace('^{}', '');\n return tag;\n })\n .filter(Boolean)\n .filter((v, i, a) => a.indexOf(v) === i); // dedupe\n}\n\nexport function sortSemver(tags: string[]): string[] {\n return [...tags].sort((a, b) => {\n const pa = a.replace(/^v/, '').split(/[.-]/);\n const pb = b.replace(/^v/, '').split(/[.-]/);\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n const na = parseInt(pa[i]) || 0;\n const nb = parseInt(pb[i]) || 0;\n if (na !== nb) return nb - na; // descending\n }\n return 0;\n });\n}\n","import pc from 'picocolors';\nimport ora from 'ora';\nimport { fetchRemoteTags, sortSemver } from '../utils/git-tags.js';\n\nexport async function versionsCommand(options: Record<string, any>): Promise<void> {\n const spinner = ora('Fetching available versions...').start();\n\n try {\n const tags = fetchRemoteTags();\n spinner.stop();\n\n if (!tags || tags.length === 0) {\n console.log(pc.yellow('\\nNo versions found.'));\n return;\n }\n\n // Filter pre-releases unless --all\n let filtered = tags;\n if (!options.all) {\n filtered = tags.filter(tag => !tag.includes('-'));\n }\n\n // Sort by semver\n const sorted = sortSemver(filtered);\n\n // Apply limit\n const limit = options.limit ? parseInt(options.limit, 10) : 10;\n const limited = sorted.slice(0, limit);\n\n console.log(pc.bold('\\nAvailable versions:\\n'));\n\n limited.forEach((tag, index) => {\n const isLatest = index === 0;\n const marker = isLatest ? pc.green(' (latest)') : '';\n console.log(` ${pc.cyan(tag)}${marker}`);\n });\n\n if (sorted.length > limited.length) {\n console.log(pc.gray(`\\n ... and ${sorted.length - limited.length} more (use --limit or --all)`));\n }\n\n console.log('');\n } catch (err: any) {\n spinner.stop();\n console.log(pc.red('\\nFailed to fetch versions.'));\n console.log(pc.gray(err.message));\n\n if (err.message.includes('timeout')) {\n console.log(pc.gray('Network timeout. Check your connection.'));\n }\n }\n}\n","import { execSync } from 'child_process';\nimport pc from 'picocolors';\nimport ora from 'ora';\nimport { CLI_ROOT } from '../utils/paths.js';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\n\nfunction getCurrentVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(join(CLI_ROOT, 'package.json'), 'utf-8'));\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\nfunction getLatestVersion(): string {\n const output = execSync('npm view apero-kit-cli version', {\n encoding: 'utf-8',\n timeout: 15000,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n return output.trim();\n}\n\nexport async function updateCliCommand(options: Record<string, any>): Promise<void> {\n const current = getCurrentVersion();\n const spinner = ora('Checking for updates...').start();\n\n try {\n const latest = options.version || getLatestVersion();\n spinner.stop();\n\n console.log(`\\n Current: ${pc.gray(current)}`);\n console.log(` Latest: ${pc.green(latest)}`);\n\n if (current === latest && !options.version && !options.force) {\n console.log(pc.green('\\nAlready up to date!'));\n console.log(pc.gray('Use --force to reinstall anyway.'));\n return;\n }\n\n if (options.check) {\n console.log(pc.yellow('\\nUpdate available! Run \"ak update-cli\" to install.'));\n return;\n }\n\n // Install\n const target = options.version || 'latest';\n const installSpinner = ora(`Installing apero-kit-cli@${target}...`).start();\n\n execSync(`npm install -g apero-kit-cli@${target}`, {\n encoding: 'utf-8',\n timeout: 60000,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n\n installSpinner.succeed(pc.green(`Updated to ${target}!`));\n } catch (err: any) {\n spinner.stop();\n console.log(pc.red('\\nUpdate failed.'));\n console.log(pc.gray(err.message));\n console.log(pc.gray('\\nTry manually: npm install -g apero-kit-cli'));\n }\n}\n","import pc from 'picocolors';\nimport fs from 'fs-extra';\nimport { join } from 'path';\nimport * as p from '@clack/prompts';\nimport { resolveSource } from '../utils/paths.js';\nimport { listAvailable } from '../utils/copy.js';\n\n// Map agent types to their skill directories\nconst AGENT_SKILL_PATHS: Record<string, string> = {\n claude: '.claude/skills',\n cursor: '.cursor/rules',\n codex: '.codex/skills',\n};\n\nexport async function skillsCommand(options: Record<string, any>): Promise<void> {\n const { name, agent, list, installed, uninstall, yes } = options;\n\n // List mode - show available skills with installation status\n if (list || (!name && !installed)) {\n await listSkillsWithStatus();\n return;\n }\n\n // Show installed skills only\n if (installed && !name) {\n await showInstalledSkills();\n return;\n }\n\n // Install or uninstall mode requires skill name\n if (!name) {\n console.log(pc.red('Error: --name <skill> is required'));\n console.log(pc.gray('Usage: ak skills --name <skill> [--agent <agents>] [--uninstall]'));\n process.exit(1);\n }\n\n // Parse target agents (default: claude)\n const targetAgents = parseAgents(agent);\n\n // Uninstall mode\n if (uninstall) {\n await uninstallSkill(name, targetAgents, yes);\n return;\n }\n\n // Install mode\n await installSkill(name, targetAgents, yes);\n}\n\n/**\n * List all available skills with installation status per agent\n */\nasync function listSkillsWithStatus(): Promise<void> {\n const source = resolveSource();\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n process.exit(1);\n }\n\n const skills = listAvailable('skills', source.claudeDir).filter(s => s.isDir);\n\n if (skills.length === 0) {\n console.log(pc.yellow('No skills found in source'));\n return;\n }\n\n console.log(pc.bold(pc.cyan(`\\nAvailable Skills (${skills.length}):`)));\n console.log(pc.gray(`Source: ${source.path}\\n`));\n\n // Header\n const header = ' Skill'.padEnd(40) + 'Claude Cursor Codex';\n console.log(pc.bold(header));\n console.log(pc.gray(' ' + '─'.repeat(58)));\n\n // List each skill with installation status\n for (const skill of skills) {\n const claudeInstalled = isSkillInstalled(skill.name, 'claude');\n const cursorInstalled = isSkillInstalled(skill.name, 'cursor');\n const codexInstalled = isSkillInstalled(skill.name, 'codex');\n\n const statusLine =\n ' ' +\n skill.name.padEnd(38) +\n (claudeInstalled ? pc.green('✓') : pc.gray('-')).padEnd(8) +\n (cursorInstalled ? pc.green('✓') : pc.gray('-')).padEnd(8) +\n (codexInstalled ? pc.green('✓') : pc.gray('-'));\n\n console.log(statusLine);\n }\n\n console.log('');\n console.log(pc.gray('Install: ak skills --name <skill> --agent <claude|cursor|codex>'));\n console.log('');\n}\n\n/**\n * Show only installed skills\n */\nasync function showInstalledSkills(): Promise<void> {\n console.log(pc.bold(pc.cyan('\\nInstalled Skills:\\n')));\n\n let hasAny = false;\n\n for (const [agentType, skillPath] of Object.entries(AGENT_SKILL_PATHS)) {\n const installed = getInstalledSkills(agentType);\n if (installed.length > 0) {\n hasAny = true;\n console.log(pc.bold(` ${agentType}:`));\n for (const skill of installed) {\n console.log(pc.white(` • ${skill}`));\n }\n console.log('');\n }\n }\n\n if (!hasAny) {\n console.log(pc.gray(' No skills installed'));\n console.log('');\n }\n}\n\n/**\n * Install a skill to target agents\n */\nasync function installSkill(skillName: string, agents: string[], skipConfirm: boolean): Promise<void> {\n const source = resolveSource();\n if ('error' in source) {\n console.log(pc.red(`Error: ${source.error}`));\n process.exit(1);\n }\n\n // Find skill in source\n const skillPath = join(source.claudeDir, 'skills', skillName);\n if (!fs.existsSync(skillPath)) {\n console.log(pc.red(`Error: Skill \"${skillName}\" not found in source`));\n console.log(pc.gray(`Available skills: ak skills --list`));\n process.exit(1);\n }\n\n // Confirm installation unless --yes\n if (!skipConfirm) {\n const confirm = await p.confirm({\n message: `Install skill \"${skillName}\" to ${agents.join(', ')}?`,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n console.log(pc.gray('Cancelled'));\n process.exit(0);\n }\n }\n\n // Install to each agent\n const results: Array<{ agent: string; success: boolean; error?: string }> = [];\n\n for (const agent of agents) {\n try {\n const targetPath = join(process.cwd(), AGENT_SKILL_PATHS[agent], skillName);\n\n // Ensure target directory exists\n await fs.ensureDir(join(process.cwd(), AGENT_SKILL_PATHS[agent]));\n\n // Copy skill directory\n await fs.copy(skillPath, targetPath, { overwrite: true });\n\n results.push({ agent, success: true });\n } catch (err: any) {\n results.push({ agent, success: false, error: err.message });\n }\n }\n\n // Report results\n console.log('');\n const allSuccess = results.every(r => r.success);\n\n if (allSuccess) {\n console.log(pc.green(`✓ Installed \"${skillName}\" to ${agents.join(', ')}`));\n } else {\n for (const result of results) {\n if (result.success) {\n console.log(pc.green(`✓ ${result.agent}: installed`));\n } else {\n console.log(pc.red(`✗ ${result.agent}: ${result.error}`));\n }\n }\n }\n console.log('');\n}\n\n/**\n * Uninstall a skill from target agents\n */\nasync function uninstallSkill(skillName: string, agents: string[], skipConfirm: boolean): Promise<void> {\n // Check if skill is installed in any target agent\n const installedIn = agents.filter(agent => isSkillInstalled(skillName, agent));\n\n if (installedIn.length === 0) {\n console.log(pc.yellow(`Skill \"${skillName}\" is not installed in ${agents.join(', ')}`));\n process.exit(0);\n }\n\n // Confirm removal unless --yes\n if (!skipConfirm) {\n const confirm = await p.confirm({\n message: `Uninstall skill \"${skillName}\" from ${installedIn.join(', ')}?`,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n console.log(pc.gray('Cancelled'));\n process.exit(0);\n }\n }\n\n // Remove from each agent\n const results: Array<{ agent: string; success: boolean; error?: string }> = [];\n\n for (const agent of installedIn) {\n try {\n const targetPath = join(process.cwd(), AGENT_SKILL_PATHS[agent], skillName);\n await fs.remove(targetPath);\n results.push({ agent, success: true });\n } catch (err: any) {\n results.push({ agent, success: false, error: err.message });\n }\n }\n\n // Report results\n console.log('');\n const allSuccess = results.every(r => r.success);\n\n if (allSuccess) {\n console.log(pc.green(`✓ Uninstalled \"${skillName}\" from ${installedIn.join(', ')}`));\n } else {\n for (const result of results) {\n if (result.success) {\n console.log(pc.green(`✓ ${result.agent}: uninstalled`));\n } else {\n console.log(pc.red(`✗ ${result.agent}: ${result.error}`));\n }\n }\n }\n console.log('');\n}\n\n/**\n * Parse agent flag into array (comma-separated, defaults to claude)\n */\nfunction parseAgents(agentFlag?: string): string[] {\n if (!agentFlag) {\n return ['claude'];\n }\n\n const agents = agentFlag.split(',').map(a => a.trim().toLowerCase());\n const valid = agents.filter(a => a in AGENT_SKILL_PATHS);\n\n if (valid.length === 0) {\n console.log(pc.red('Error: No valid agents specified'));\n console.log(pc.gray('Valid agents: claude, cursor, codex'));\n process.exit(1);\n }\n\n return valid;\n}\n\n/**\n * Check if skill is installed for an agent\n */\nfunction isSkillInstalled(skillName: string, agent: string): boolean {\n const skillPath = join(process.cwd(), AGENT_SKILL_PATHS[agent], skillName);\n return fs.existsSync(skillPath);\n}\n\n/**\n * Get list of installed skills for an agent\n */\nfunction getInstalledSkills(agent: string): string[] {\n const skillsDir = join(process.cwd(), AGENT_SKILL_PATHS[agent]);\n\n if (!fs.existsSync(skillsDir)) {\n return [];\n }\n\n try {\n const items = fs.readdirSync(skillsDir);\n return items.filter(item => {\n const itemPath = join(skillsDir, item);\n return fs.statSync(itemPath).isDirectory();\n });\n } catch {\n return [];\n }\n}\n","#!/usr/bin/env node\nimport cac from 'cac';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport pc from 'picocolors';\nimport { registerCommands } from './cli/command-registry.js';\nimport { getCachedVersionNoFetch, isNewerVersion } from './utils/version-check.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\nconst cli = cac('ak');\nregisterCommands(cli);\ncli.help();\ncli.version(getVersion());\ncli.parse();\n\n// Non-blocking update check (cache-only, no network)\ntry {\n const version = getVersion();\n const cachedLatest = getCachedVersionNoFetch();\n if (cachedLatest && isNewerVersion(version, cachedLatest)) {\n console.log(pc.yellow(`\\n Update available: v${version} → v${cachedLatest}`));\n console.log(pc.gray(' Run \"ak update-cli\" to update\\n'));\n }\n} catch { /* silent */ }\n","import type { CAC } from 'cac';\n\nexport function registerCommands(cli: CAC): void {\n // init\n cli\n .command('init [project-name]', 'Initialize a new project with an agent kit')\n .option('-k, --kit <type>', 'Kit type (engineer, researcher, designer, minimal, full, custom)')\n .option('-t, --target <target>', 'Target CLI (claude, gemini, discord or combination)')\n .option('-s, --source <path>', 'Custom source path for templates')\n .option('-f, --force', 'Overwrite existing directory')\n .option('-g, --global', 'Install to global ~/.claude/ directory')\n .option('--fresh', 'Remove existing installation before re-init')\n .option('-y, --yes', 'Skip prompts, use defaults')\n .option('-p, --password <code>', 'Access code for initialization')\n .option('--exclude <patterns>', 'Exclude components (comma-separated)')\n .option('--only <patterns>', 'Include only matching components (comma-separated)')\n .action(async (projectName: string | undefined, options: Record<string, any>) => {\n const { initCommand } = await import('../commands/init.js');\n await initCommand(projectName, options);\n });\n\n // add\n cli\n .command('add <item>', 'Add agent, skill, or command (e.g., ak add skill:databases)')\n .option('-s, --source <path>', 'Custom source path')\n .option('-p, --path <path>', 'Target project path')\n .action(async (item: string, options: Record<string, any>) => {\n const { addCommand } = await import('../commands/add.js');\n await addCommand(item, options);\n });\n\n // list\n cli\n .command('list [type]', 'List available kits, agents, skills, or commands')\n .option('-s, --source <path>', 'Custom source path')\n .action(async (type: string | undefined, options: Record<string, any>) => {\n const { listCommand } = await import('../commands/list.js');\n await listCommand(type, options);\n });\n\n // update (template sync)\n cli\n .command('update', 'Update/sync from source templates')\n .option('-s, --source <path>', 'Source path to sync from')\n .option('--agents', 'Update only agents')\n .option('--skills', 'Update only skills')\n .option('--commands', 'Update only commands')\n .option('--all', 'Update everything')\n .option('-n, --dry-run', 'Show what would be updated without making changes')\n .option('-f, --force', 'Force update without confirmation')\n .action(async (options: Record<string, any>) => {\n const { updateCommand } = await import('../commands/update.js');\n await updateCommand(options);\n });\n\n // status\n cli\n .command('status', 'Show project status and file changes')\n .option('-v, --verbose', 'Show all files')\n .action(async (options: Record<string, any>) => {\n const { statusCommand } = await import('../commands/status.js');\n await statusCommand(options);\n });\n\n // doctor\n cli\n .command('doctor', 'Check project health and diagnose issues')\n .option('--fix', 'Auto-fix common issues')\n .option('--report', 'Generate diagnostic report')\n .option('--json', 'Output JSON format')\n .option('--check-only', 'CI mode: exit 1 on failures')\n .action(async (options: Record<string, any>) => {\n const { doctorCommand } = await import('../commands/doctor.js');\n await doctorCommand(options);\n });\n\n // kits alias\n cli\n .command('kits', 'List all available kits')\n .action(async () => {\n const { listCommand } = await import('../commands/list.js');\n await listCommand('kits', {});\n });\n\n // help - open docs\n cli\n .command('help', 'Open interactive help documentation in browser')\n .option('-s, --source <path>', 'Custom source path')\n .action(async (options: Record<string, any>) => {\n const { helpCommand } = await import('../commands/help.js');\n await helpCommand(options);\n });\n\n // uninstall\n cli\n .command('uninstall', 'Remove ClaudeKit installations')\n .option('-y, --yes', 'Skip confirmation')\n .option('-l, --local', 'Uninstall only local installation')\n .option('-g, --global', 'Uninstall only global installation')\n .option('--dry-run', 'Preview what would be removed')\n .action(async (options: Record<string, any>) => {\n const { uninstallCommand } = await import('../commands/uninstall.js');\n await uninstallCommand(options);\n });\n\n // versions\n cli\n .command('versions', 'List available versions')\n .option('--kit <kit>', 'Filter by kit')\n .option('--limit <limit>', 'Number of versions to show')\n .option('--all', 'Show all including prereleases')\n .action(async (options: Record<string, any>) => {\n const { versionsCommand } = await import('../commands/versions.js');\n await versionsCommand(options);\n });\n\n // update-cli\n cli\n .command('update-cli', 'Update the CLI itself to latest version')\n .option('--check', 'Check for updates without installing')\n .option('--version <version>', 'Update to specific version')\n .option('-f, --force', 'Force reinstall even if already up to date')\n .action(async (options: Record<string, any>) => {\n const { updateCliCommand } = await import('../commands/update-cli.js');\n await updateCliCommand(options);\n });\n\n // skills\n cli\n .command('skills', 'Manage skills across coding agents')\n .option('-n, --name <skill>', 'Skill name')\n .option('-a, --agent <agents>', 'Target agents')\n .option('-l, --list', 'List available skills')\n .option('--installed', 'Show installed skills')\n .option('-u, --uninstall', 'Uninstall skill')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (options: Record<string, any>) => {\n const { skillsCommand } = await import('../commands/skills.js');\n await skillsCommand(options);\n });\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { execSync } from 'child_process';\n\nconst CACHE_DIR = join(homedir(), '.apero-kit');\nconst CACHE_FILE = join(CACHE_DIR, 'version-check.json');\nconst CACHE_TTL = 7 * 24 * 60 * 60 * 1000; // 7 days\n\ninterface VersionCache {\n version: string;\n timestamp: number;\n}\n\n/**\n * Get latest version from npm, with 7-day cache\n */\nexport function getCachedLatestVersion(): string | null {\n // Try cache first\n try {\n if (existsSync(CACHE_FILE)) {\n const cache: VersionCache = JSON.parse(readFileSync(CACHE_FILE, 'utf-8'));\n if (Date.now() - cache.timestamp < CACHE_TTL) {\n return cache.version;\n }\n }\n } catch { /* ignore corrupt cache */ }\n\n // Fetch fresh from npm\n try {\n const version = execSync('npm view apero-kit-cli version', {\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe']\n }).trim();\n\n // Save to cache\n if (!existsSync(CACHE_DIR)) mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify({ version, timestamp: Date.now() } satisfies VersionCache));\n\n return version;\n } catch {\n return null; // offline or error\n }\n}\n\n/**\n * Read cache only (no network). For non-blocking startup check.\n */\nexport function getCachedVersionNoFetch(): string | null {\n try {\n if (existsSync(CACHE_FILE)) {\n const cache: VersionCache = JSON.parse(readFileSync(CACHE_FILE, 'utf-8'));\n return cache.version;\n }\n } catch { /* ignore */ }\n return null;\n}\n\n/**\n * Compare semver: returns true if latest > current\n */\nexport function isNewerVersion(current: string, latest: string): boolean {\n const c = current.replace(/^v/, '').split('.').map(Number);\n const l = latest.replace(/^v/, '').split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n if ((l[i] || 0) > (c[i] || 0)) return true;\n if ((l[i] || 0) < (c[i] || 0)) return false;\n }\n return false;\n}\n"],"mappings":"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","names":["join","dirname","fs","join","CLI_ROOT","fs","join","dirname","CLI_ROOT","fs","join","dirname","parseFrontmatter","MODEL_MAP","CLI_ROOT","execSync","fs","join","fs","join","fs","join","dirname","kit","execSync","fs","fs","join","resolve","pc","p","password","fs","join","pc","ora","pc","fs","join","pc","ora","pc","fs","fs","join","pc","pc","fs","join","pc","ora","p","pc","ora","execSync","pc","ora","join","pc","fs","join","p","confirm","readFileSync","fileURLToPath","dirname","join","pc","cli","initCommand","addCommand","listCommand","updateCommand","statusCommand","doctorCommand","helpCommand","uninstallCommand","versionsCommand","updateCliCommand","skillsCommand","join","homedir","existsSync","readFileSync","join","homedir","existsSync","readFileSync","__filename","fileURLToPath","__dirname","dirname","readFileSync","join","pc"]}