@tdsoft-tech/aikit 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/utils/paths.ts","../src/utils/version.ts","../src/core/config.ts","../src/utils/logger.ts","../src/core/memory.ts","../src/core/tools/figma-mcp.ts","../src/core/tools/figma-screen-developer.ts","../src/core/beads.ts","../src/core/sessions.ts","../src/core/tool-config.ts","../src/core/auth/figma-oauth.ts","../src/cli.ts","../src/cli/index.ts","../src/index.ts","../src/core/skills.ts","../src/core/agents.ts","../src/core/commands.ts","../src/core/commands/index.ts","../src/core/commands/types.ts","../src/core/commands/core.ts","../src/core/commands/quick.ts","../src/core/commands/research.ts","../src/core/commands/design.ts","../src/core/commands/git.ts","../src/core/commands/utility.ts","../src/core/commands/checkpoint.ts","../src/core/commands/sessions.ts","../src/core/commands/drawio.ts","../src/core/tools.ts","../src/core/plugins.ts","../src/core/anti-hallucination.ts","../src/cli/commands/index.ts","../src/cli/commands/init.ts","../src/utils/cli-detector.ts","../src/cli/helpers.ts","../src/platform/adapters.ts","../src/platform/opencode-adapter.ts","../src/platform/claude-adapter.ts","../src/cli/commands/install.ts","../src/cli/commands/sync.ts","../src/core/sync-engine.ts","../src/core/version-manager.ts","../src/core/backup-manager.ts","../src/core/migration-manager.ts","../src/cli/commands/skills.ts","../src/cli/commands/misc.ts","../src/cli/commands/session.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\n/**\n * Path utilities for AIKit configuration and data directories\n */\nexport const paths = {\n /**\n * Get the global AIKit configuration directory\n * ~/.config/aikit/ on Unix, %APPDATA%/aikit/ on Windows\n */\n globalConfig(): string {\n const base = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.config');\n return join(base, 'aikit');\n },\n\n /**\n * Get the project-level AIKit configuration directory\n */\n projectConfig(projectPath?: string): string {\n const base = projectPath || process.cwd();\n return join(base, '.aikit');\n },\n\n /**\n * Get the OpenCode configuration directory\n */\n opencodeConfig(): string {\n const base = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.config');\n return join(base, 'opencode');\n },\n\n /**\n * Get the Beads directory for the current project\n */\n beadsDir(projectPath?: string): string {\n const base = projectPath || process.cwd();\n return join(base, '.beads');\n },\n\n /**\n * Check if a project has AIKit initialized\n */\n hasProjectConfig(projectPath?: string): boolean {\n return existsSync(this.projectConfig(projectPath));\n },\n\n /**\n * Check if global AIKit is initialized\n */\n hasGlobalConfig(): boolean {\n return existsSync(this.globalConfig());\n },\n\n /**\n * Get effective config path (project takes precedence over global)\n */\n effectiveConfig(projectPath?: string): string | null {\n if (this.hasProjectConfig(projectPath)) {\n return this.projectConfig(projectPath);\n }\n if (this.hasGlobalConfig()) {\n return this.globalConfig();\n }\n return null;\n },\n\n /**\n * Get skills directory\n */\n skills(configPath: string): string {\n return join(configPath, 'skills');\n },\n\n /**\n * Get agents directory\n */\n agents(configPath: string): string {\n return join(configPath, 'agents');\n },\n\n /**\n * Get commands directory\n */\n commands(configPath: string): string {\n return join(configPath, 'commands');\n },\n\n /**\n * Get tools directory\n */\n tools(configPath: string): string {\n return join(configPath, 'tools');\n },\n\n /**\n * Get plugins directory\n */\n plugins(configPath: string): string {\n return join(configPath, 'plugins');\n },\n\n /**\n * Get memory directory\n */\n memory(configPath: string): string {\n return join(configPath, 'memory');\n },\n\n /**\n * Get the Claude Code CLI configuration directory\n */\n claudeConfig(scope?: 'user' | 'project'): string {\n if (scope === 'project') {\n return join(process.cwd(), '.claude');\n }\n const base = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.claude');\n return base;\n },\n\n /**\n * Get Claude Code CLI commands directory\n */\n claudeCommands(project?: boolean): string {\n return join(this.claudeConfig(project ? 'project' : 'user'), 'commands');\n },\n\n /**\n * Get Claude Code CLI skills directory\n */\n claudeSkills(project?: boolean): string {\n return join(this.claudeConfig(project ? 'project' : 'user'), 'skills');\n },\n\n /**\n * Get Claude Code CLI agents directory\n */\n claudeAgents(project?: boolean): string {\n return join(this.claudeConfig(project ? 'project' : 'user'), 'agents');\n },\n};\n","import { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\n/**\n * Get package version from package.json\n * This is the single source of truth for version\n */\nexport function getVersion(): string {\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const packageJsonPath = join(__dirname, '..', 'package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n return packageJson.version;\n } catch (error) {\n // Fallback to 0.0.0 if can't read package.json\n console.warn('Warning: Could not read version from package.json, using fallback');\n return '0.0.0';\n }\n}\n\n","import { readFile, access, constants } from 'fs/promises';\nimport { join } from 'path';\nimport { z } from 'zod';\nimport { paths } from '../utils/paths.js';\nimport { getVersion } from '../utils/version.js';\n\n/**\n * AIKit Configuration Schema\n */\nconst ConfigSchema = z.object({\n version: z.string(),\n skills: z.object({\n enabled: z.boolean().default(true),\n directory: z.string().optional(),\n }).default({}),\n agents: z.object({\n enabled: z.boolean().default(true),\n default: z.string().default('build'),\n }).default({}),\n commands: z.object({\n enabled: z.boolean().default(true),\n }).default({}),\n tools: z.object({\n enabled: z.boolean().default(true),\n }).default({}),\n plugins: z.object({\n enabled: z.boolean().default(true),\n autoload: z.array(z.string()).optional(),\n }).default({}),\n memory: z.object({\n enabled: z.boolean().default(true),\n maxSize: z.number().optional(),\n }).default({}),\n beads: z.object({\n enabled: z.boolean().default(true),\n autoInit: z.boolean().default(false),\n }).default({}),\n antiHallucination: z.object({\n enabled: z.boolean().default(true),\n specFile: z.string().default('spec.md'),\n reviewFile: z.string().default('review.md'),\n }).default({}),\n mcp: z.object({\n context7: z.boolean().default(false),\n githubGrep: z.boolean().default(false),\n gkg: z.boolean().default(false),\n }).optional(),\n mode: z.string().default('build').optional(),\n});\n\nexport type AIKitConfig = z.infer<typeof ConfigSchema> & {\n configPath: string;\n projectPath: string;\n};\n\n/**\n * Configuration manager for AIKit\n */\nexport class Config {\n private config: AIKitConfig;\n\n constructor(config: AIKitConfig) {\n this.config = config;\n }\n\n get(): AIKitConfig {\n return this.config;\n }\n\n get skills() {\n return this.config.skills;\n }\n\n get agents() {\n return this.config.agents;\n }\n\n get commands() {\n return this.config.commands;\n }\n\n get tools() {\n return this.config.tools;\n }\n\n get plugins() {\n return this.config.plugins;\n }\n\n get memory() {\n return this.config.memory;\n }\n\n get beads() {\n return this.config.beads;\n }\n\n get antiHallucination() {\n return this.config.antiHallucination;\n }\n\n get mode() {\n return this.config.mode;\n }\n\n get configPath(): string {\n return this.config.configPath;\n }\n\n get projectPath(): string {\n return this.config.projectPath;\n }\n\n /**\n * Get path to a specific resource\n */\n getPath(resource: 'skills' | 'agents' | 'commands' | 'tools' | 'plugins' | 'memory'): string {\n return paths[resource](this.configPath);\n }\n}\n\n/**\n * Load AIKit configuration\n * Merges project-level config with global config (project takes precedence)\n */\nexport async function loadConfig(projectPath?: string): Promise<Config> {\n const project = projectPath || process.cwd();\n \n // Try project config first, then global\n const projectConfigPath = paths.projectConfig(project);\n const globalConfigPath = paths.globalConfig();\n \n let configPath: string;\n let configData: Record<string, unknown> = {};\n \n // Load global config first (as base)\n try {\n await access(join(globalConfigPath, 'aikit.json'), constants.R_OK);\n const globalContent = await readFile(join(globalConfigPath, 'aikit.json'), 'utf-8');\n configData = JSON.parse(globalContent);\n configPath = globalConfigPath;\n } catch {\n // No global config\n configPath = projectConfigPath;\n }\n \n // Merge project config on top\n try {\n await access(join(projectConfigPath, 'aikit.json'), constants.R_OK);\n const projectContent = await readFile(join(projectConfigPath, 'aikit.json'), 'utf-8');\n const projectData = JSON.parse(projectContent);\n configData = deepMerge(configData, projectData);\n configPath = projectConfigPath;\n } catch {\n // No project config, use global or defaults\n }\n \n // Add default version if not present\n if (!configData.version) {\n configData.version = getVersion();\n }\n\n // Parse and validate config\n const parsed = ConfigSchema.parse(configData);\n\n return new Config({\n ...parsed,\n configPath,\n projectPath: project,\n });\n}\n\n/**\n * Deep merge two objects\n */\nfunction deepMerge<T extends Record<string, unknown>>(base: T, override: Partial<T>): T {\n const result = { ...base };\n \n for (const key in override) {\n const baseValue = base[key];\n const overrideValue = override[key];\n \n if (\n typeof baseValue === 'object' &&\n baseValue !== null &&\n typeof overrideValue === 'object' &&\n overrideValue !== null &&\n !Array.isArray(baseValue) &&\n !Array.isArray(overrideValue)\n ) {\n result[key] = deepMerge(\n baseValue as Record<string, unknown>,\n overrideValue as Record<string, unknown>\n ) as T[Extract<keyof T, string>];\n } else if (overrideValue !== undefined) {\n result[key] = overrideValue as T[Extract<keyof T, string>];\n }\n }\n \n return result;\n}\n","import chalk from 'chalk';\n\n/**\n * Simple logger with colored output\n */\nexport const logger = {\n info(...args: unknown[]): void {\n console.log(chalk.blue('ℹ'), ...args);\n },\n\n success(...args: unknown[]): void {\n console.log(chalk.green('✓'), ...args);\n },\n\n warn(...args: unknown[]): void {\n console.log(chalk.yellow('⚠'), ...args);\n },\n\n error(...args: unknown[]): void {\n console.error(chalk.red('✖'), ...args);\n },\n\n debug(...args: unknown[]): void {\n if (process.env.DEBUG || process.env.AIKIT_DEBUG) {\n console.log(chalk.gray('⋯'), ...args);\n }\n },\n\n step(step: number, total: number, message: string): void {\n console.log(chalk.cyan(`[${step}/${total}]`), message);\n },\n\n header(message: string): void {\n console.log(chalk.bold.underline(`\\n${message}\\n`));\n },\n\n list(items: string[], prefix = '•'): void {\n for (const item of items) {\n console.log(` ${prefix} ${item}`);\n }\n },\n};\n","import { readFile, writeFile, mkdir, access, constants } from 'fs/promises';\nimport { join } from 'path';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\n\n/**\n * Memory entry structure\n */\nexport interface Memory {\n key: string;\n content: string;\n summary: string;\n createdAt: Date;\n updatedAt: Date;\n type: 'observation' | 'handoff' | 'research' | 'template' | 'custom';\n}\n\n/**\n * Memory Manager - Persistent context across sessions\n */\nexport class MemoryManager {\n private config: Config;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * List all memory entries\n */\n async list(): Promise<Memory[]> {\n const memories: Memory[] = [];\n const memoryPath = paths.memory(this.config.configPath);\n \n const subDirs = ['observations', 'handoffs', 'research'];\n \n for (const subDir of subDirs) {\n const dirPath = join(memoryPath, subDir);\n try {\n const { readdir } = await import('fs/promises');\n const files = await readdir(dirPath);\n \n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n \n const content = await readFile(join(dirPath, file), 'utf-8');\n const summary = this.extractSummary(content);\n \n memories.push({\n key: `${subDir}/${file.replace('.md', '')}`,\n content,\n summary,\n createdAt: new Date(), // Would get from file stats\n updatedAt: new Date(),\n type: subDir as Memory['type'],\n });\n }\n } catch {\n // Directory doesn't exist\n }\n }\n \n return memories;\n }\n\n /**\n * Read a memory entry\n */\n async read(key: string): Promise<string | null> {\n const memoryPath = paths.memory(this.config.configPath);\n \n // Check if key includes subdirectory\n let filePath: string;\n if (key.includes('/')) {\n filePath = join(memoryPath, `${key}.md`);\n } else {\n // Search in all subdirectories\n const subDirs = ['observations', 'handoffs', 'research', '_templates'];\n for (const subDir of subDirs) {\n const testPath = join(memoryPath, subDir, `${key}.md`);\n try {\n await access(testPath, constants.R_OK);\n filePath = testPath;\n break;\n } catch {\n continue;\n }\n }\n filePath = filePath! || join(memoryPath, `${key}.md`);\n }\n \n try {\n return await readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n }\n\n /**\n * Update a memory entry\n */\n async update(key: string, content: string, options?: {\n append?: boolean;\n type?: Memory['type'];\n }): Promise<void> {\n const memoryPath = paths.memory(this.config.configPath);\n const type = options?.type || 'custom';\n \n // Determine file path based on type\n let filePath: string;\n if (key.includes('/')) {\n filePath = join(memoryPath, `${key}.md`);\n } else {\n const subDir = type === 'observation' ? 'observations' \n : type === 'handoff' ? 'handoffs'\n : type === 'research' ? 'research'\n : '';\n filePath = join(memoryPath, subDir, `${key}.md`);\n }\n \n // Ensure directory exists\n const { dirname } = await import('path');\n await mkdir(dirname(filePath), { recursive: true });\n \n // Handle append mode\n if (options?.append) {\n try {\n const existing = await readFile(filePath, 'utf-8');\n const timestamp = new Date().toISOString();\n content = `${existing}\\n\\n---\\n_Updated: ${timestamp}_\\n\\n${content}`;\n } catch {\n // File doesn't exist, create new\n }\n }\n \n await writeFile(filePath, content);\n }\n\n /**\n * Create a handoff bundle\n */\n async createHandoff(summary: {\n completed: string[];\n inProgress: string[];\n remaining: string[];\n context: string;\n nextSteps: string[];\n }): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const key = `handoffs/${timestamp}`;\n \n const content = `# Handoff: ${new Date().toLocaleString()}\n\n## Completed\n${summary.completed.map(item => `- [x] ${item}`).join('\\n') || '- None'}\n\n## In Progress\n${summary.inProgress.map(item => `- [ ] ${item}`).join('\\n') || '- None'}\n\n## Remaining\n${summary.remaining.map(item => `- [ ] ${item}`).join('\\n') || '- None'}\n\n## Context\n${summary.context || 'No additional context.'}\n\n## Next Steps\n${summary.nextSteps.map((step, i) => `${i + 1}. ${step}`).join('\\n') || '- Continue from where left off'}\n`;\n \n await this.update(key, content, { type: 'handoff' });\n return key;\n }\n\n /**\n * Get the latest handoff\n */\n async getLatestHandoff(): Promise<Memory | null> {\n const memories = await this.list();\n const handoffs = memories.filter(m => m.type === 'handoff');\n \n if (handoffs.length === 0) return null;\n \n // Sort by key (which includes timestamp)\n handoffs.sort((a, b) => b.key.localeCompare(a.key));\n return handoffs[0];\n }\n\n /**\n * Create an observation\n */\n async createObservation(title: string, observation: {\n what: string;\n why: string;\n impact: string;\n tags?: string[];\n }): Promise<string> {\n const slug = title.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const key = `observations/${slug}`;\n \n const content = `# ${title}\n\n## What\n${observation.what}\n\n## Why\n${observation.why}\n\n## Impact\n${observation.impact}\n\n${observation.tags?.length ? `## Tags\\n${observation.tags.map(t => `- ${t}`).join('\\n')}` : ''}\n\n---\n_Created: ${new Date().toISOString()}_\n`;\n \n await this.update(key, content, { type: 'observation' });\n return key;\n }\n\n /**\n * Save research findings\n */\n async saveResearch(topic: string, findings: {\n summary: string;\n sources: string[];\n recommendations: string[];\n codeExamples?: string;\n }): Promise<string> {\n const slug = topic.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const key = `research/${slug}`;\n \n const content = `# Research: ${topic}\n\n## Summary\n${findings.summary}\n\n## Sources\n${findings.sources.map(s => `- ${s}`).join('\\n')}\n\n## Recommendations\n${findings.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\\n')}\n\n${findings.codeExamples ? `## Code Examples\\n\\`\\`\\`\\n${findings.codeExamples}\\n\\`\\`\\`` : ''}\n\n---\n_Researched: ${new Date().toISOString()}_\n`;\n \n await this.update(key, content, { type: 'research' });\n return key;\n }\n\n /**\n * Extract a summary from content (first paragraph or heading)\n */\n private extractSummary(content: string): string {\n const lines = content.split('\\n').filter(l => l.trim());\n \n // Find first non-heading line\n for (const line of lines) {\n if (!line.startsWith('#') && line.trim().length > 0) {\n return line.slice(0, 100) + (line.length > 100 ? '...' : '');\n }\n }\n \n // Fall back to first heading\n if (lines[0]?.startsWith('#')) {\n return lines[0].replace(/^#+\\s*/, '');\n }\n \n return 'No summary available';\n }\n}\n","import { ToolConfigManager } from '../tool-config.js';\nimport { logger } from '../../utils/logger.js';\nimport { writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\n/**\n * Figma API response types\n */\nexport interface FigmaFile {\n document: FigmaNode;\n components: Record<string, FigmaComponent>;\n styles: Record<string, FigmaStyle>;\n}\n\nexport interface FigmaNode {\n id: string;\n name: string;\n type: string;\n children?: FigmaNode[];\n fills?: FigmaFill[];\n strokes?: FigmaFill[];\n effects?: FigmaEffect[];\n absoluteBoundingBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n style?: {\n fontFamily?: string;\n fontSize?: number;\n fontWeight?: number;\n lineHeightPx?: number;\n letterSpacing?: number;\n };\n characters?: string;\n layoutMode?: 'HORIZONTAL' | 'VERTICAL';\n paddingLeft?: number;\n paddingRight?: number;\n paddingTop?: number;\n paddingBottom?: number;\n itemSpacing?: number;\n}\n\nexport interface FigmaFill {\n type: string;\n color?: {\n r: number;\n g: number;\n b: number;\n a: number;\n };\n imageRef?: string;\n}\n\nexport interface FigmaEffect {\n type: string;\n visible: boolean;\n radius?: number;\n color?: {\n r: number;\n g: number;\n b: number;\n a: number;\n };\n}\n\nexport interface FigmaComponent {\n key: string;\n name: string;\n description: string;\n}\n\nexport interface FigmaStyle {\n key: string;\n name: string;\n styleType: 'FILL' | 'TEXT' | 'EFFECT' | 'GRID';\n}\n\n/**\n * Extracted design tokens\n */\nexport interface DesignTokens {\n colors: Array<{\n name: string;\n hex: string;\n rgba: string;\n }>;\n typography: Array<{\n name: string;\n fontFamily: string;\n fontSize: number;\n fontWeight: number;\n lineHeight: number;\n letterSpacing?: number;\n }>;\n spacing: {\n unit: number;\n scale: number[];\n };\n components: Array<{\n name: string;\n type: string;\n description?: string;\n }>;\n screens: Array<{\n id: string;\n name: string;\n width: number;\n height: number;\n type: string;\n description?: string;\n childrenCount?: number;\n }>;\n breakpoints: number[];\n structure?: {\n nodes: Array<{\n id: string;\n name: string;\n type: string;\n content?: string;\n position?: { x: number; y: number; width: number; height: number };\n styles?: {\n backgroundColor?: string;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number;\n color?: string;\n padding?: { top: number; right: number; bottom: number; left: number };\n margin?: { top: number; right: number; bottom: number; left: number };\n layout?: 'HORIZONTAL' | 'VERTICAL' | 'NONE';\n gap?: number;\n };\n children?: string[]; // IDs of child nodes\n }>;\n hierarchy: string; // Tree structure representation\n };\n assets?: Array<{\n nodeId: string;\n nodeName: string;\n nodeType: string;\n format: 'png' | 'svg' | 'jpg';\n path: string;\n url: string;\n width?: number;\n height?: number;\n }>;\n}\n\n/**\n * Figma MCP Client\n * \n * Wrapper for figma-developer-mcp to extract design data\n */\nexport class FigmaMcpClient {\n private apiKey: string;\n\n constructor(apiKey: string, _configManager: ToolConfigManager) {\n this.apiKey = apiKey;\n }\n\n /**\n * Fetch helper with simple retry/backoff for 429/5xx\n */\n private async fetchWithRetry(\n url: string,\n options: RequestInit,\n label: string,\n retries: number = 3,\n backoffMs: number = 1500\n ): Promise<Response> {\n let attempt = 0;\n let lastError: any;\n\n while (attempt <= retries) {\n try {\n const res = await fetch(url, options);\n if (res.ok) return res;\n\n // Retry on throttling or server errors\n if (res.status === 429 || res.status >= 500) {\n const retryAfter = Number(res.headers.get('retry-after')) || 0;\n const delay = retryAfter > 0 ? retryAfter * 1000 : backoffMs * (attempt + 1);\n logger.warn(`${label} failed (status ${res.status}), retrying in ${Math.round(delay / 1000)}s...`);\n await new Promise((r) => setTimeout(r, delay));\n attempt += 1;\n continue;\n }\n\n const text = await res.text();\n throw new Error(`${label} error: ${res.status} ${res.statusText}\\n${text}`);\n } catch (err) {\n lastError = err;\n // Retry network errors\n logger.warn(`${label} network error, attempt ${attempt + 1}/${retries + 1}: ${err instanceof Error ? err.message : String(err)}`);\n if (attempt >= retries) break;\n await new Promise((r) => setTimeout(r, backoffMs * (attempt + 1)));\n attempt += 1;\n }\n }\n\n throw lastError instanceof Error\n ? lastError\n : new Error(`${label} failed after retries`);\n }\n\n /**\n * Extract file key from Figma URL\n */\n private extractFileKey(url: string): string | null {\n // URL format: https://www.figma.com/design/{fileKey}/...\n const match = url.match(/figma\\.com\\/design\\/([a-zA-Z0-9]+)/);\n return match ? match[1] : null;\n }\n\n /**\n * Extract node ID from Figma URL\n */\n private extractNodeId(url: string): string | null {\n // URL format: ...?node-id={nodeId} or ...&node-id={nodeId}\n // Node ID can be in format: 0-1, 1-2, etc. (page-frame format)\n const match = url.match(/[?&]node-id=([^&]+)/);\n if (!match) return null;\n \n // Decode and handle different formats\n let nodeId = decodeURIComponent(match[1]);\n \n // If it's in format \"0-1\", convert to \"0:1\" for API\n // Figma API uses colon separator, not dash\n if (nodeId.includes('-') && !nodeId.includes(':')) {\n nodeId = nodeId.replace(/-/g, ':');\n }\n \n return nodeId;\n }\n\n /**\n * Get Figma file data using API\n */\n async getFileData(url: string): Promise<FigmaFile> {\n const fileKey = this.extractFileKey(url);\n if (!fileKey) {\n throw new Error(`Invalid Figma URL: ${url}`);\n }\n\n const nodeId = this.extractNodeId(url);\n const apiUrl = nodeId\n ? `https://api.figma.com/v1/files/${fileKey}/nodes?ids=${encodeURIComponent(nodeId)}`\n : `https://api.figma.com/v1/files/${fileKey}`;\n\n const response = await this.fetchWithRetry(apiUrl, {\n headers: {\n 'X-Figma-Token': this.apiKey,\n },\n }, 'Figma file fetch');\n\n const data = await response.json() as { nodes?: Record<string, { document: FigmaNode }> };\n\n if (nodeId) {\n // Return specific node data\n const nodes = data.nodes as Record<string, { document: FigmaNode }>;\n const nodeData = Object.values(nodes)[0];\n if (!nodeData) {\n throw new Error(`Node not found: ${nodeId}`);\n }\n return {\n document: nodeData.document,\n components: {},\n styles: {},\n };\n }\n\n return data as FigmaFile;\n }\n\n /**\n * Extract design tokens from Figma file\n */\n async extractDesignTokens(url: string, downloadAssets: boolean = true, assetsDir?: string): Promise<DesignTokens> {\n const fileData = await this.getFileData(url);\n const fileKey = this.extractFileKey(url);\n if (!fileKey) {\n throw new Error(`Invalid Figma URL: ${url}`);\n }\n\n const tokens: DesignTokens = {\n colors: [],\n typography: [],\n spacing: {\n unit: 8, // Default 8px grid\n scale: [],\n },\n components: [],\n screens: [],\n breakpoints: [375, 768, 1024, 1280, 1920], // Common breakpoints\n };\n\n // Extract colors\n const colorMap = new Map<string, string>();\n this.extractColors(fileData.document, colorMap);\n tokens.colors = Array.from(colorMap.entries()).map(([name, hex]) => ({\n name,\n hex,\n rgba: hex, // Simplified\n }));\n\n // Extract typography\n const typographyMap = new Map<string, any>();\n this.extractTypography(fileData.document, typographyMap);\n tokens.typography = Array.from(typographyMap.values());\n\n // Extract components\n Object.values(fileData.components).forEach(component => {\n tokens.components.push({\n name: component.name,\n type: 'component',\n description: component.description,\n });\n });\n\n // Extract screens/frames\n this.extractScreens(fileData.document, tokens.screens);\n\n // Extract structure and content\n tokens.structure = this.extractStructure(fileData.document);\n\n // Download assets if requested\n if (downloadAssets && tokens.structure) {\n try {\n tokens.assets = await this.downloadAssets(\n fileKey,\n fileData.document,\n assetsDir || './assets/images'\n );\n } catch (error) {\n logger.warn(`Failed to download assets: ${error instanceof Error ? error.message : String(error)}`);\n // Continue without assets\n }\n }\n\n return tokens;\n }\n\n /**\n * Recursively extract colors from nodes\n */\n private extractColors(node: FigmaNode, colorMap: Map<string, string>): void {\n // Extract fills\n if (node.fills && Array.isArray(node.fills)) {\n node.fills.forEach(fill => {\n if (fill.type === 'SOLID' && fill.color) {\n const { r, g, b, a } = fill.color;\n const hex = this.rgbaToHex(r, g, b, a);\n if (!colorMap.has(hex)) {\n colorMap.set(hex, hex);\n }\n }\n });\n }\n\n // Extract strokes\n if (node.strokes && Array.isArray(node.strokes)) {\n node.strokes.forEach(stroke => {\n if (stroke.type === 'SOLID' && stroke.color) {\n const { r, g, b, a } = stroke.color;\n const hex = this.rgbaToHex(r, g, b, a);\n if (!colorMap.has(hex)) {\n colorMap.set(hex, hex);\n }\n }\n });\n }\n\n // Recurse children\n if (node.children) {\n node.children.forEach(child => this.extractColors(child, colorMap));\n }\n }\n\n /**\n * Recursively extract typography from nodes\n */\n private extractTypography(node: FigmaNode, typographyMap: Map<string, any>): void {\n if (node.type === 'TEXT' && node.style) {\n const key = `${node.style.fontFamily}-${node.style.fontSize}-${node.style.fontWeight}`;\n if (!typographyMap.has(key)) {\n typographyMap.set(key, {\n name: `${node.style.fontSize}px ${node.style.fontFamily}`,\n fontFamily: node.style.fontFamily || 'Inter',\n fontSize: node.style.fontSize || 16,\n fontWeight: node.style.fontWeight || 400,\n lineHeight: node.style.lineHeightPx || node.style.fontSize || 16,\n letterSpacing: node.style.letterSpacing,\n });\n }\n }\n\n if (node.children) {\n node.children.forEach(child => this.extractTypography(child, typographyMap));\n }\n }\n\n /**\n * Extract screens/frames with detailed information\n */\n private extractScreens(\n node: FigmaNode, \n screens: Array<{\n id: string;\n name: string;\n width: number;\n height: number;\n type: string;\n description?: string;\n childrenCount?: number;\n }>\n ): void {\n if (node.type === 'FRAME' || node.type === 'COMPONENT') {\n if (node.absoluteBoundingBox) {\n // Only include main screens (skip nested frames that are too small or decorative)\n const isMainScreen = node.absoluteBoundingBox.width >= 800 && \n node.absoluteBoundingBox.height >= 400;\n \n if (isMainScreen) {\n screens.push({\n id: node.id,\n name: node.name,\n width: node.absoluteBoundingBox.width,\n height: node.absoluteBoundingBox.height,\n type: node.type,\n childrenCount: node.children?.length || 0,\n });\n }\n }\n }\n\n if (node.children) {\n node.children.forEach(child => this.extractScreens(child, screens));\n }\n }\n\n /**\n * Extract structure, content, and layout from nodes\n */\n private extractStructure(node: FigmaNode, depth: number = 0): {\n nodes: Array<{\n id: string;\n name: string;\n type: string;\n content?: string;\n position?: { x: number; y: number; width: number; height: number };\n styles?: {\n backgroundColor?: string;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number;\n color?: string;\n padding?: { top: number; right: number; bottom: number; left: number };\n margin?: { top: number; right: number; bottom: number; left: number };\n layout?: 'HORIZONTAL' | 'VERTICAL' | 'NONE';\n gap?: number;\n };\n children?: string[];\n }>;\n hierarchy: string;\n } {\n const nodes: Array<{\n id: string;\n name: string;\n type: string;\n content?: string;\n position?: { x: number; y: number; width: number; height: number };\n styles?: any;\n children?: string[];\n }> = [];\n const hierarchyLines: string[] = [];\n\n const processNode = (n: FigmaNode, level: number = 0): string[] => {\n const indent = ' '.repeat(level);\n const childIds: string[] = [];\n\n // Extract node data\n const nodeData: any = {\n id: n.id,\n name: n.name || 'Unnamed',\n type: n.type,\n };\n\n // Extract position\n if (n.absoluteBoundingBox) {\n nodeData.position = {\n x: n.absoluteBoundingBox.x,\n y: n.absoluteBoundingBox.y,\n width: n.absoluteBoundingBox.width,\n height: n.absoluteBoundingBox.height,\n };\n }\n\n // Extract text content\n if (n.type === 'TEXT' && n.characters) {\n nodeData.content = n.characters;\n }\n\n // Extract styles\n const styles: any = {};\n \n // Background color\n if (n.fills && Array.isArray(n.fills)) {\n const solidFill = n.fills.find(f => f.type === 'SOLID' && f.color);\n if (solidFill && solidFill.color) {\n const { r, g, b, a } = solidFill.color;\n styles.backgroundColor = this.rgbaToHex(r, g, b, a);\n }\n }\n\n // Text styles\n if (n.style) {\n if (n.style.fontFamily) styles.fontFamily = n.style.fontFamily;\n if (n.style.fontSize) styles.fontSize = n.style.fontSize;\n if (n.style.fontWeight) styles.fontWeight = n.style.fontWeight;\n if (n.style.lineHeightPx) styles.lineHeight = n.style.lineHeightPx;\n \n // Text color from fills\n if (n.fills && Array.isArray(n.fills)) {\n const textFill = n.fills.find(f => f.type === 'SOLID' && f.color);\n if (textFill && textFill.color) {\n const { r, g, b, a } = textFill.color;\n styles.color = this.rgbaToHex(r, g, b, a);\n }\n }\n }\n\n // Layout properties\n if (n.layoutMode) {\n styles.layout = n.layoutMode;\n }\n if (n.itemSpacing !== undefined) {\n styles.gap = n.itemSpacing;\n }\n\n // Padding\n if (n.paddingLeft || n.paddingRight || n.paddingTop || n.paddingBottom) {\n styles.padding = {\n top: n.paddingTop || 0,\n right: n.paddingRight || 0,\n bottom: n.paddingBottom || 0,\n left: n.paddingLeft || 0,\n };\n }\n\n if (Object.keys(styles).length > 0) {\n nodeData.styles = styles;\n }\n\n // Process children\n if (n.children && n.children.length > 0) {\n n.children.forEach(child => {\n const childNodeIds = processNode(child, level + 1);\n childIds.push(child.id);\n childIds.push(...childNodeIds);\n });\n nodeData.children = n.children.map(c => c.id);\n }\n\n nodes.push(nodeData);\n\n // Build hierarchy string\n const typeLabel = n.type.toLowerCase();\n const nameLabel = n.name || 'Unnamed';\n const contentPreview = n.type === 'TEXT' && n.characters \n ? `: \"${n.characters.substring(0, 50)}${n.characters.length > 50 ? '...' : ''}\"`\n : '';\n const sizeLabel = n.absoluteBoundingBox\n ? ` [${Math.round(n.absoluteBoundingBox.width)}×${Math.round(n.absoluteBoundingBox.height)}]`\n : '';\n \n hierarchyLines.push(`${indent}${typeLabel} \"${nameLabel}\"${contentPreview}${sizeLabel}`);\n\n return [n.id, ...childIds];\n };\n\n processNode(node, depth);\n\n return {\n nodes,\n hierarchy: hierarchyLines.join('\\n'),\n };\n }\n\n /**\n * Find all nodes that can be exported as images (optionally filtered by screen)\n */\n private findImageNodes(\n node: FigmaNode, \n imageNodes: Array<{ id: string; name: string; type: string; width?: number; height?: number }> = [],\n screenId?: string,\n isWithinScreen: boolean = false\n ): void {\n // Check if we're within the target screen\n const currentIsScreen = node.id === screenId;\n const nowWithinScreen = isWithinScreen || currentIsScreen;\n \n // If screenId is specified and we're not within that screen, skip\n if (screenId && !nowWithinScreen && node.type !== 'PAGE') {\n // Continue searching children\n if (node.children) {\n node.children.forEach(child => this.findImageNodes(child, imageNodes, screenId, false));\n }\n return;\n }\n // Exportable node types\n const exportableTypes = ['VECTOR', 'COMPONENT', 'INSTANCE', 'FRAME', 'GROUP', 'RECTANGLE', 'ELLIPSE'];\n \n // Check if node has image fills or is exportable\n const hasImageFill = node.fills?.some(fill => fill.type === 'IMAGE' || fill.imageRef);\n const isExportable = exportableTypes.includes(node.type) || hasImageFill;\n\n if (isExportable && node.absoluteBoundingBox) {\n // Skip very small nodes (likely decorative)\n const minSize = 16;\n if (node.absoluteBoundingBox.width >= minSize && node.absoluteBoundingBox.height >= minSize) {\n imageNodes.push({\n id: node.id,\n name: node.name || 'Unnamed',\n type: node.type,\n width: node.absoluteBoundingBox.width,\n height: node.absoluteBoundingBox.height,\n });\n }\n }\n\n // Recurse children\n if (node.children) {\n node.children.forEach(child => this.findImageNodes(child, imageNodes, screenId, nowWithinScreen));\n }\n }\n\n /**\n * Download images/assets from Figma (optionally filtered by screen)\n */\n async downloadAssets(\n fileKey: string,\n rootNode: FigmaNode,\n assetsDir: string,\n screenId?: string // Optional: only download assets for specific screen\n ): Promise<Array<{\n nodeId: string;\n nodeName: string;\n nodeType: string;\n format: 'png' | 'svg' | 'jpg';\n path: string;\n url: string;\n width?: number;\n height?: number;\n }>> {\n // Find all image nodes (optionally filtered by screen)\n const imageNodes: Array<{ id: string; name: string; type: string; width?: number; height?: number }> = [];\n this.findImageNodes(rootNode, imageNodes, screenId);\n\n if (imageNodes.length === 0) {\n logger.info('No image nodes found to download');\n return [];\n }\n\n logger.info(`Found ${imageNodes.length} image nodes to download`);\n\n // Limit to first 50 nodes to avoid API limits\n const nodesToDownload = imageNodes.slice(0, 50);\n const nodeIds = nodesToDownload.map(n => n.id).join(',');\n\n // Request image URLs from Figma API\n // Use PNG format by default, SVG for vectors\n const imageUrl = `https://api.figma.com/v1/images/${fileKey}?ids=${encodeURIComponent(nodeIds)}&format=png&scale=2`;\n \n const response = await this.fetchWithRetry(imageUrl, {\n headers: {\n 'X-Figma-Token': this.apiKey,\n },\n }, 'Figma images listing');\n\n const imageData = await response.json() as { images?: Record<string, string> };\n const images = imageData.images as Record<string, string>;\n\n // Ensure assets directory exists\n const fullAssetsDir = assetsDir.startsWith('/') ? assetsDir : join(process.cwd(), assetsDir);\n if (!existsSync(fullAssetsDir)) {\n await mkdir(fullAssetsDir, { recursive: true });\n }\n\n // Download each image\n const downloadedAssets: Array<{\n nodeId: string;\n nodeName: string;\n nodeType: string;\n format: 'png' | 'svg' | 'jpg';\n path: string;\n url: string;\n width?: number;\n height?: number;\n }> = [];\n\n for (const node of nodesToDownload) {\n const imageUrl = images[node.id];\n if (!imageUrl) {\n logger.warn(`No image URL returned for node ${node.id} (${node.name})`);\n continue;\n }\n\n try {\n // Download image\n const imageResponse = await this.fetchWithRetry(\n imageUrl,\n {},\n `Download image ${node.id}`\n );\n\n const imageBuffer = await imageResponse.arrayBuffer();\n \n // Generate safe filename\n const safeName = node.name\n .replace(/[^a-z0-9]/gi, '_')\n .toLowerCase()\n .substring(0, 50);\n const extension = 'png'; // PNG format\n const filename = `${safeName}_${node.id.substring(0, 8)}.${extension}`;\n const filePath = join(fullAssetsDir, filename);\n\n // Write file\n await writeFile(filePath, Buffer.from(imageBuffer));\n\n downloadedAssets.push({\n nodeId: node.id,\n nodeName: node.name,\n nodeType: node.type,\n format: extension as 'png',\n path: filePath,\n url: imageUrl,\n width: node.width,\n height: node.height,\n });\n\n logger.info(`Downloaded: ${filename} (${node.name})`);\n } catch (error) {\n logger.warn(`Error downloading image for node ${node.id}: ${error instanceof Error ? error.message : String(error)}`);\n // Continue with other images\n }\n }\n\n logger.info(`Downloaded ${downloadedAssets.length} assets to ${fullAssetsDir}`);\n return downloadedAssets;\n }\n\n /**\n * Convert RGBA to hex\n */\n private rgbaToHex(r: number, g: number, b: number, a: number = 1): string {\n const toHex = (n: number) => {\n const hex = Math.round(n * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}${a < 1 ? toHex(a) : ''}`;\n }\n}\n\n","import { logger } from '../../utils/logger.js';\nimport { readFile, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\n/**\n * Check current source code status\n */\nexport async function checkCurrentCodeStatus(projectPath: string = process.cwd()): Promise<{\n hasHTML: boolean;\n htmlFile?: string;\n hasCSS: boolean;\n cssFiles: string[];\n hasAssets: boolean;\n assetCount: number;\n sections: string[];\n}> {\n const status = {\n hasHTML: false,\n htmlFile: undefined as string | undefined,\n hasCSS: false,\n cssFiles: [] as string[],\n hasAssets: false,\n assetCount: 0,\n sections: [] as string[],\n };\n\n try {\n // Check for HTML files\n const htmlFiles = ['index.html', 'index.htm', 'main.html'].filter(file => \n existsSync(join(projectPath, file))\n );\n if (htmlFiles.length > 0) {\n status.hasHTML = true;\n status.htmlFile = htmlFiles[0];\n \n // Try to read HTML to extract sections\n try {\n const htmlContent = await readFile(join(projectPath, htmlFiles[0]), 'utf-8');\n // Extract section IDs and classes\n const sectionMatches = htmlContent.match(/<(section|div|header|footer|main|article|aside)[^>]*(?:id|class)=[\"']([^\"']+)[\"']/gi);\n if (sectionMatches) {\n status.sections = sectionMatches.map(match => {\n const idMatch = match.match(/id=[\"']([^\"']+)[\"']/i);\n const classMatch = match.match(/class=[\"']([^\"']+)[\"']/i);\n return idMatch ? idMatch[1] : (classMatch ? classMatch[1].split(' ')[0] : '');\n }).filter(Boolean);\n }\n } catch (e) {\n // Ignore read errors\n }\n }\n\n // Check for CSS files\n const stylesDir = join(projectPath, 'styles');\n if (existsSync(stylesDir)) {\n try {\n const files = await readdir(stylesDir);\n const cssFiles = files.filter(f => f.endsWith('.css'));\n if (cssFiles.length > 0) {\n status.hasCSS = true;\n status.cssFiles = cssFiles.map(f => join(stylesDir, f));\n }\n } catch (e) {\n // Ignore read errors\n }\n }\n\n // Check for assets\n const assetsDir = join(projectPath, 'assets', 'images');\n if (existsSync(assetsDir)) {\n try {\n const files = await readdir(assetsDir);\n const imageFiles = files.filter(f => /\\.(png|jpg|jpeg|svg|webp)$/i.test(f));\n if (imageFiles.length > 0) {\n status.hasAssets = true;\n status.assetCount = imageFiles.length;\n }\n } catch (e) {\n // Ignore read errors\n }\n }\n } catch (error) {\n logger.warn(`Error checking code status: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return status;\n}\n\n/**\n * Compare current code with Figma design to identify what needs to be implemented\n */\nexport async function compareCodeWithFigma(\n figmaTokens: any,\n selectedScreenId: string,\n projectPath: string = process.cwd()\n): Promise<{\n missingSections: string[];\n missingAssets: string[];\n needsUpdate: boolean;\n recommendations: string[];\n}> {\n const codeStatus = await checkCurrentCodeStatus(projectPath);\n const result = {\n missingSections: [] as string[],\n missingAssets: [] as string[],\n needsUpdate: false,\n recommendations: [] as string[],\n };\n\n // Find selected screen\n const selectedScreen = figmaTokens.screens?.find((s: any) => s.id === selectedScreenId);\n if (!selectedScreen) {\n result.recommendations.push('Selected screen not found in Figma design');\n return result;\n }\n\n // Extract sections from Figma structure\n const figmaSections: string[] = [];\n if (figmaTokens.structure?.nodes) {\n const screenNode = figmaTokens.structure.nodes.find((n: any) => n.id === selectedScreenId);\n if (screenNode?.children) {\n // Extract main sections from children\n screenNode.children.forEach((childId: string) => {\n const childNode = figmaTokens.structure.nodes.find((n: any) => n.id === childId);\n if (childNode && (childNode.type === 'FRAME' || childNode.type === 'COMPONENT')) {\n const sectionName = childNode.name.toLowerCase()\n .replace(/[^a-z0-9]/g, '-')\n .replace(/-+/g, '-');\n figmaSections.push(sectionName);\n }\n });\n }\n }\n\n // Compare sections\n const existingSections = codeStatus.sections.map(s => s.toLowerCase());\n result.missingSections = figmaSections.filter(s => \n !existingSections.some(existing => existing.includes(s) || s.includes(existing))\n );\n\n // Check assets\n if (codeStatus.assetCount === 0) {\n result.missingAssets.push('All assets need to be downloaded');\n result.needsUpdate = true;\n }\n\n // Generate recommendations\n if (!codeStatus.hasHTML) {\n result.recommendations.push('Create index.html with HTML5 structure');\n }\n if (!codeStatus.hasCSS) {\n result.recommendations.push('Create CSS files (variables.css, base.css, components.css)');\n }\n if (result.missingSections.length > 0) {\n result.recommendations.push(`Implement missing sections: ${result.missingSections.join(', ')}`);\n }\n if (result.missingAssets.length > 0) {\n result.recommendations.push('Download required assets from Figma');\n }\n\n return result;\n}\n\n\n\n\n","import { readFile, writeFile, readdir, access, constants, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { paths } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Bead task structure\n */\nexport interface Bead {\n id: string;\n title: string;\n description: string;\n status: 'todo' | 'in-progress' | 'completed' | 'blocked';\n type?: 'feature' | 'pattern' | 'decision' | 'knowledge';\n createdAt: Date;\n updatedAt: Date;\n notes: string[];\n subtasks?: string[];\n}\n\n/**\n * Beads integration status\n */\nexport interface BeadsStatus {\n installed: boolean;\n version?: string;\n initialized: boolean;\n activeTasks: number;\n completedTasks: number;\n currentTask?: string;\n}\n\n/**\n * Beads Integration - Task tracking with hard quality gates\n */\nexport class BeadsIntegration {\n private projectPath: string;\n\n constructor(projectPath?: string) {\n this.projectPath = projectPath || process.cwd();\n }\n\n /**\n * Check if Beads CLI is installed\n */\n async isInstalled(): Promise<boolean> {\n try {\n await execAsync('bd --version');\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get Beads version\n */\n async getVersion(): Promise<string | null> {\n try {\n const { stdout } = await execAsync('bd --version');\n const match = stdout.match(/bd version (\\S+)/);\n return match?.[1] || null;\n } catch {\n return null;\n }\n }\n\n /**\n * Check if Beads is initialized in project\n */\n async isInitialized(): Promise<boolean> {\n const beadsDir = paths.beadsDir(this.projectPath);\n try {\n await access(beadsDir, constants.R_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Install Beads CLI globally\n */\n async install(): Promise<boolean> {\n try {\n await execAsync('npm install -g beads');\n return true;\n } catch (error) {\n logger.error('Failed to install Beads CLI:', error);\n return false;\n }\n }\n\n /**\n * Initialize Beads in project using bd CLI\n */\n async init(): Promise<boolean> {\n try {\n await execAsync('bd init', { cwd: this.projectPath });\n logger.success('Beads initialized');\n return true;\n } catch (error) {\n logger.error('Failed to initialize Beads:', error);\n return false;\n }\n }\n\n /**\n * Initialize local .beads directory (works without global beads CLI)\n */\n async initLocal(): Promise<boolean> {\n try {\n const beadsDir = paths.beadsDir(this.projectPath);\n await mkdir(beadsDir, { recursive: true });\n\n // Create README for .beads directory\n const readmeContent = `# Beads - Task Tracking\n\nThis directory contains task beads for tracking work items.\n\n## How it works\n- Each file is a task bead (bead-001.md, bead-002.md, etc.)\n- Status: todo, in-progress, completed, blocked\n- Use \\`/create\\` command to create new tasks\n- Use \\`/finish\\` command to complete tasks with quality gates\n\n## Beads CLI\nFor full functionality, install beads globally:\n\\`\\`\\`bash\nnpm install -g beads\nbd init\n\\`\\`\\`\n\n## Available Commands\n- \\`bd ready\\` - Show available work\n- \\`bd show <id>\\` - View task details\n- \\`bd update <id> --status in_progress\\` - Update task status\n- \\`bd close <id>\\` - Complete task\n- \\`bd sync\\` - Sync with git\n`;\n\n await writeFile(join(beadsDir, 'README.md'), readmeContent);\n return true;\n } catch (error) {\n logger.error('Failed to initialize .beads directory:', error);\n return false;\n }\n }\n\n /**\n * Setup git hooks\n */\n async setupGitHooks(): Promise<boolean> {\n try {\n const gitHooksDir = join(this.projectPath, '.git', 'hooks');\n\n // Check if .git directory exists (skip if not a git repo)\n \n if (!existsSync(gitHooksDir)) {\n logger.info('Not a git repository, skipping git hooks setup');\n return true;\n }\n\n const preCommitHook = join(gitHooksDir, 'pre-commit');\n\n // Pre-commit hook content\n const hookContent = `#!/bin/sh\n#\n# bd (beads) pre-commit hook\n#\n# This hook ensures that any pending bd issue changes are flushed to\n# .beads/issues.jsonl before the commit is created, preventing a\n# race condition where daemon auto-flush fires after the commit.\n#\n\n# Check if bd is available\nif ! command -v bd >/dev/null 2>&1; then\n echo \"Warning: bd command not found, skipping pre-commit flush\" >&2\n exit 0\nfi\n\n# Check if we're in a bd workspace\nBEADS_DIR=\"\"\nif [ -d \".beads\" ]; then\n BEADS_DIR=\".beads\"\nfi\n\nif [ -z \"$BEADS_DIR\" ]; then\n # Not a bd workspace, nothing to do\n exit 0\nfi\n\n# Check if bd is actually initialized (has beads.db or config.yaml)\n# This prevents errors if .beads/ exists but bd was never initialized\nif [ ! -f \"$BEADS_DIR/beads.db\" ] && [ ! -f \"$BEADS_DIR/config.yaml\" ]; then\n # .beads/ exists but bd is not initialized, skip bd operations\n exit 0\nfi\n\n# Flush pending changes to JSONL\n# Use --flush-only to skip git operations (we're already in a git hook)\n# Suppress output unless there's an error\nif ! bd sync --flush-only >/dev/null 2>&1; then\n echo \"Error: Failed to flush bd changes to JSONL\" >&2\n echo \"Run 'bd sync --flush-only' manually to diagnose\" >&2\n exit 1\nfi\n\nexit 0\n`;\n\n // Write hook file\n await writeFile(preCommitHook, hookContent, { mode: 0o755 });\n return true;\n } catch (error) {\n logger.error('Failed to setup git hooks:', error);\n return false;\n }\n }\n\n /**\n * Get current status\n */\n async getStatus(): Promise<BeadsStatus> {\n const installed = await this.isInstalled();\n const version = await this.getVersion();\n const initialized = await this.isInitialized();\n \n let activeTasks = 0;\n let completedTasks = 0;\n let currentTask: string | undefined;\n \n if (initialized) {\n const beads = await this.listBeads();\n activeTasks = beads.filter(b => b.status === 'in-progress' || b.status === 'todo').length;\n completedTasks = beads.filter(b => b.status === 'completed').length;\n \n const active = beads.find(b => b.status === 'in-progress');\n currentTask = active?.title;\n }\n \n return {\n installed,\n version: version || undefined,\n initialized,\n activeTasks,\n completedTasks,\n currentTask,\n };\n }\n\n /**\n * List all beads in project\n */\n async listBeads(): Promise<Bead[]> {\n const beadsDir = paths.beadsDir(this.projectPath);\n const beads: Bead[] = [];\n \n try {\n const files = await readdir(beadsDir);\n \n for (const file of files) {\n if (!file.match(/^bead-\\d+\\.md$/)) continue;\n \n const content = await readFile(join(beadsDir, file), 'utf-8');\n const bead = this.parseBeadFile(file, content);\n if (bead) beads.push(bead);\n }\n } catch {\n // No beads directory\n }\n \n return beads.sort((a, b) => a.id.localeCompare(b.id));\n }\n\n /**\n * Get a specific bead\n */\n async getBead(id: string): Promise<Bead | null> {\n const beadsDir = paths.beadsDir(this.projectPath);\n const fileName = id.endsWith('.md') ? id : `${id}.md`;\n \n try {\n const content = await readFile(join(beadsDir, fileName), 'utf-8');\n return this.parseBeadFile(fileName, content);\n } catch {\n return null;\n }\n }\n\n /**\n * Create a new bead\n */\n async createBead(title: string, description: string): Promise<Bead> {\n const beadsDir = paths.beadsDir(this.projectPath);\n await mkdir(beadsDir, { recursive: true });\n \n // Get next bead ID\n const beads = await this.listBeads();\n const maxId = beads.reduce((max, b) => {\n const num = parseInt(b.id.replace('bead-', ''), 10);\n return num > max ? num : max;\n }, 0);\n \n const id = `bead-${String(maxId + 1).padStart(3, '0')}`;\n const now = new Date().toISOString();\n \n const content = `---\nid: ${id}\ntitle: ${title}\nstatus: in-progress\ncreated: ${now}\nupdated: ${now}\n---\n\n# ${title}\n\n## Description\n${description}\n\n## Notes\n\n`;\n\n await writeFile(join(beadsDir, `${id}.md`), content);\n \n return {\n id,\n title,\n description,\n status: 'in-progress',\n createdAt: new Date(now),\n updatedAt: new Date(now),\n notes: [],\n };\n }\n\n /**\n * Update bead status\n */\n async updateBeadStatus(id: string, status: Bead['status']): Promise<boolean> {\n const beadsDir = paths.beadsDir(this.projectPath);\n const fileName = id.endsWith('.md') ? id : `${id}.md`;\n const filePath = join(beadsDir, fileName);\n \n try {\n let content = await readFile(filePath, 'utf-8');\n \n // Update status in frontmatter\n content = content.replace(\n /status:\\s*\\w+/,\n `status: ${status}`\n );\n \n // Update timestamp\n content = content.replace(\n /updated:\\s*.+/,\n `updated: ${new Date().toISOString()}`\n );\n \n await writeFile(filePath, content);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Add note to bead\n */\n async addNote(id: string, note: string): Promise<boolean> {\n const beadsDir = paths.beadsDir(this.projectPath);\n const fileName = id.endsWith('.md') ? id : `${id}.md`;\n const filePath = join(beadsDir, fileName);\n \n try {\n let content = await readFile(filePath, 'utf-8');\n \n // Find notes section and add note\n const notesMatch = content.match(/## Notes\\n([\\s\\S]*?)(?=\\n##|$)/);\n if (notesMatch) {\n const timestamp = new Date().toLocaleString();\n const newNote = `- [${timestamp}] ${note}`;\n content = content.replace(\n notesMatch[0],\n `## Notes\\n${notesMatch[1]}${newNote}\\n`\n );\n }\n \n // Update timestamp\n content = content.replace(\n /updated:\\s*.+/,\n `updated: ${new Date().toISOString()}`\n );\n \n await writeFile(filePath, content);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Update bead type\n */\n async updateBeadType(id: string, type: Bead['type']): Promise<boolean> {\n const beadsDir = paths.beadsDir(this.projectPath);\n const fileName = id.endsWith('.md') ? id : `${id}.md`;\n const filePath = join(beadsDir, fileName);\n\n try {\n let content = await readFile(filePath, 'utf-8');\n\n // Check if type field already exists\n const typeMatch = content.match(/^type:\\s*.+/m);\n if (typeMatch) {\n // Update existing type\n content = content.replace(typeMatch[0], `type: ${type}`);\n } else {\n // Add type field after status\n content = content.replace(/^---\\n([\\s\\S]*?)\\n---/, (match) => {\n return match.replace(/^---\\n/, `---\\ntype: ${type}\\n`);\n });\n }\n\n // Update timestamp\n content = content.replace(\n /updated:\\s*.+/,\n `updated: ${new Date().toISOString()}`\n );\n\n await writeFile(filePath, content);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Complete a bead with quality gates\n */\n async completeBead(id: string): Promise<{\n success: boolean;\n gates: { name: string; passed: boolean; error?: string }[];\n handoffCreated: boolean;\n }> {\n // Run quality gates\n const gates = [\n { name: 'Type Check', command: 'npm run typecheck' },\n { name: 'Tests', command: 'npm run test' },\n { name: 'Lint', command: 'npm run lint' },\n { name: 'Build', command: 'npm run build' },\n ];\n \n const results: { name: string; passed: boolean; error?: string }[] = [];\n \n for (const gate of gates) {\n try {\n await execAsync(gate.command, { cwd: this.projectPath });\n results.push({ name: gate.name, passed: true });\n logger.success(`${gate.name}: passed`);\n } catch (error) {\n results.push({\n name: gate.name,\n passed: false,\n error: error instanceof Error ? error.message.slice(0, 200) : 'Failed',\n });\n logger.error(`${gate.name}: failed`);\n }\n }\n \n const allPassed = results.every(r => r.passed);\n \n if (allPassed) {\n await this.updateBeadStatus(id, 'completed');\n await this.addNote(id, 'Task completed - all quality gates passed');\n \n // Auto-generate handoff for session continuity\n const { MemoryManager } = await import('./memory.js');\n const { loadConfig } = await import('./config.js');\n const config = await loadConfig(this.projectPath);\n const memory = new MemoryManager(config);\n \n await memory.createHandoff({\n completed: [id],\n inProgress: [],\n remaining: [],\n context: `Auto-generated handoff for completed task: ${id}`,\n nextSteps: ['Review completed work', 'Start new task if needed'],\n });\n } else {\n await this.addNote(id, 'Completion attempted but quality gates failed');\n }\n \n return {\n success: allPassed,\n gates: results,\n handoffCreated: allPassed,\n };\n }\n\n /**\n * Get current active bead\n */\n async getCurrentBead(): Promise<Bead | null> {\n const beads = await this.listBeads();\n return beads.find(b => b.status === 'in-progress') || null;\n }\n\n /**\n * Parse a bead file\n */\n private parseBeadFile(fileName: string, content: string): Bead | null {\n try {\n const id = fileName.replace('.md', '');\n \n // Extract frontmatter\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n const frontmatter = frontmatterMatch?.[1] || '';\n \n const getValue = (key: string): string => {\n const match = frontmatter.match(new RegExp(`${key}:\\\\s*(.+)`));\n return match?.[1]?.trim() || '';\n };\n \n // Parse title\n const titleMatch = content.match(/^# (.+)/m);\n const title = getValue('title') || titleMatch?.[1] || id;\n \n // Parse description\n const descMatch = content.match(/## Description\\n([\\s\\S]*?)(?=\\n##|$)/);\n const description = descMatch?.[1]?.trim() || '';\n \n // Parse notes\n const notesMatch = content.match(/## Notes\\n([\\s\\S]*?)(?=\\n##|$)/);\n const notesContent = notesMatch?.[1] || '';\n const notes = notesContent\n .split('\\n')\n .filter(line => line.trim().startsWith('-'))\n .map(line => line.replace(/^-\\s*/, '').trim());\n \n // Parse type\n const type = getValue('type') as Bead['type'] | undefined;\n \n return {\n id,\n title,\n description,\n status: (getValue('status') as Bead['status']) || 'todo',\n type,\n createdAt: new Date(getValue('created') || Date.now()),\n updatedAt: new Date(getValue('updated') || Date.now()),\n notes,\n };\n } catch {\n return null;\n }\n }\n}","import { readFile, writeFile, readdir, mkdir, access } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport matter from 'gray-matter';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\n/**\n * Session update structure\n */\nexport interface SessionUpdate {\n timestamp: string;\n notes?: string;\n gitBranch?: string;\n gitCommits?: number;\n modifiedFiles?: string[];\n beadsTask?: {\n id: string;\n status: string;\n };\n}\n\n/**\n * Session data structure\n */\nexport interface Session {\n id: string;\n name: string;\n startTime: string;\n endTime?: string;\n goals: string[];\n updates: SessionUpdate[];\n status: 'active' | 'ended';\n}\n\n/**\n * Session Manager\n * Handles session lifecycle for development tracking\n */\nexport class SessionManager {\n private sessionsDir: string;\n private projectPath: string;\n\n constructor(projectPath?: string) {\n this.projectPath = projectPath || process.cwd();\n this.sessionsDir = join(this.projectPath, '.aikit', 'sessions');\n }\n\n /**\n * Initialize sessions directory\n */\n async init(): Promise<void> {\n await mkdir(this.sessionsDir, { recursive: true });\n }\n\n /**\n * Start a new session\n */\n async startSession(name?: string, goals?: string[]): Promise<Session> {\n await this.init();\n\n // Generate session ID\n const now = new Date();\n const date = now.toISOString().split('T')[0].replace(/-/g, '');\n const time = now.toTimeString().split(' ')[0].replace(/:/g, '');\n const nameSuffix = name ? `-${name.replace(/\\s+/g, '-').toLowerCase()}` : '';\n const id = `${date}-${time}${nameSuffix}`;\n\n // Create session object\n const session: Session = {\n id,\n name: name || 'Untitled Session',\n startTime: now.toISOString(),\n goals: goals || [],\n updates: [],\n status: 'active',\n };\n\n // Get initial git state\n const gitState = await this.getGitState();\n\n // Create initial update\n session.updates.push({\n timestamp: now.toISOString(),\n notes: name ? `Started session: ${name}` : 'Started new session',\n gitBranch: gitState.branch,\n gitCommits: 0,\n });\n\n // Save session file\n await this.saveSession(session);\n\n // Update active session tracker\n await this.setActiveSession(id);\n\n return session;\n }\n\n /**\n * Update current session with notes\n */\n async updateSession(notes?: string): Promise<Session | null> {\n const sessionId = await this.getActiveSessionId();\n if (!sessionId) {\n throw new Error('No active session. Use startSession() first.');\n }\n\n const session = await this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n // Get current git state\n const gitState = await this.getGitState();\n const modifiedFiles = await this.getModifiedFiles();\n\n // Create update\n const update: SessionUpdate = {\n timestamp: new Date().toISOString(),\n notes: notes || 'Session updated',\n gitBranch: gitState.branch,\n gitCommits: gitState.commits || 0,\n modifiedFiles,\n };\n\n // Check for active Beads task\n const beadsTask = await this.getCurrentBeadsTask();\n if (beadsTask) {\n update.beadsTask = beadsTask;\n }\n\n session.updates.push(update);\n\n // Save session\n await this.saveSession(session);\n\n return session;\n }\n\n /**\n * End current session and generate summary\n */\n async endSession(): Promise<Session | null> {\n const sessionId = await this.getActiveSessionId();\n if (!sessionId) {\n throw new Error('No active session. Use startSession() first.');\n }\n\n const session = await this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n // Set end time\n session.endTime = new Date().toISOString();\n session.status = 'ended';\n\n // Add final update with summary\n const gitState = await this.getGitState();\n const modifiedFiles = await this.getModifiedFiles();\n\n session.updates.push({\n timestamp: session.endTime,\n notes: 'Session ended',\n gitBranch: gitState.branch,\n gitCommits: gitState.commits || 0,\n modifiedFiles,\n });\n\n // Save session\n await this.saveSession(session);\n\n // Clear active session\n await this.clearActiveSession();\n\n return session;\n }\n\n /**\n * Get current active session\n */\n async getCurrentSession(): Promise<Session | null> {\n const sessionId = await this.getActiveSessionId();\n if (!sessionId) return null;\n return this.getSession(sessionId);\n }\n\n /**\n * Get all sessions\n */\n async listSessions(): Promise<Session[]> {\n try {\n const files = await readdir(this.sessionsDir);\n const sessions: Session[] = [];\n\n for (const file of files) {\n if (file === '.current-session' || !file.endsWith('.md')) continue;\n\n const sessionId = file.replace('.md', '');\n const session = await this.getSession(sessionId);\n if (session) {\n sessions.push(session);\n }\n }\n\n // Sort by start time, newest first\n return sessions.sort((a, b) =>\n new Date(b.startTime).getTime() - new Date(a.startTime).getTime()\n );\n } catch {\n return [];\n }\n }\n\n /**\n * Get specific session\n */\n async getSession(id: string): Promise<Session | null> {\n const filePath = join(this.sessionsDir, `${id}.md`);\n\n try {\n const content = await readFile(filePath, 'utf-8');\n const { data, content: body } = matter(content);\n\n // Parse updates from body\n const updates = this.parseUpdates(body);\n\n return {\n id: data.id as string || id,\n name: data.name as string || 'Untitled',\n startTime: data.startTime as string,\n endTime: data.endTime as string | undefined,\n goals: (data.goals as string[]) || [],\n updates,\n status: (data.status as 'active' | 'ended') || 'active',\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Search sessions by keyword\n */\n async searchSessions(query: string): Promise<Session[]> {\n const sessions = await this.listSessions();\n const lowerQuery = query.toLowerCase();\n\n return sessions.filter((session) =>\n session.name.toLowerCase().includes(lowerQuery) ||\n session.id.toLowerCase().includes(lowerQuery) ||\n session.goals.some((g) => g.toLowerCase().includes(lowerQuery)) ||\n session.updates.some((u) => u.notes?.toLowerCase().includes(lowerQuery))\n );\n }\n\n /**\n * Get active session ID\n */\n private async getActiveSessionId(): Promise<string | null> {\n const trackerPath = join(this.sessionsDir, '.current-session');\n\n try {\n const content = await readFile(trackerPath, 'utf-8');\n return content.trim();\n } catch {\n return null;\n }\n }\n\n /**\n * Set active session\n */\n private async setActiveSession(id: string): Promise<void> {\n const trackerPath = join(this.sessionsDir, '.current-session');\n await writeFile(trackerPath, id);\n }\n\n /**\n * Clear active session\n */\n private async clearActiveSession(): Promise<void> {\n const trackerPath = join(this.sessionsDir, '.current-session');\n\n try {\n await writeFile(trackerPath, '');\n } catch {\n // Ignore if file doesn't exist\n }\n }\n\n /**\n * Save session to file\n */\n private async saveSession(session: Session): Promise<void> {\n const filePath = join(this.sessionsDir, `${session.id}.md`);\n\n // Build updates section\n const updatesMarkdown = session.updates\n .map((update) => {\n const date = new Date(update.timestamp);\n const dateStr = date.toLocaleString();\n const sections: string[] = [`### ${dateStr}`];\n\n if (update.notes) {\n sections.push(update.notes);\n }\n\n if (update.gitBranch) {\n sections.push(`**Git Branch:** ${update.gitBranch}`);\n }\n\n if (update.modifiedFiles && update.modifiedFiles.length > 0) {\n sections.push(\n `**Modified Files:** ${update.modifiedFiles.length} files`,\n update.modifiedFiles.map((f) => ` - ${f}`).join('\\n')\n );\n }\n\n if (update.beadsTask) {\n sections.push(`**Beads Task:** ${update.beadsTask.id} (${update.beadsTask.status})`);\n }\n\n return sections.join('\\n');\n })\n .join('\\n\\n');\n\n // Build frontmatter (filter out undefined values)\n const frontmatter: Record<string, any> = {\n id: session.id,\n name: session.name,\n startTime: session.startTime,\n status: session.status,\n goals: session.goals,\n };\n\n // Only include endTime if it exists\n if (session.endTime) {\n frontmatter.endTime = session.endTime;\n }\n\n // Build content\n const content = `# Development Session - ${session.name}\n\n**Started:** ${new Date(session.startTime).toLocaleString()}\n**Status:** ${session.status}\n${session.endTime ? `**Ended:** ${new Date(session.endTime).toLocaleString()}` : ''}\n\n## Goals\n${session.goals.map((g, i) => `- [ ] ${g}`).join('\\n')}\n\n## Progress\n\n${updatesMarkdown}\n\n## Summary\n${this.generateSummary(session)}\n`;\n\n // Write file\n const fileContent = matter.stringify(content, frontmatter);\n await writeFile(filePath, fileContent);\n }\n\n /**\n * Generate session summary\n */\n private generateSummary(session: Session): string {\n if (session.status === 'active') {\n return '*Session in progress...*';\n }\n\n const duration = session.endTime\n ? new Date(session.endTime).getTime() - new Date(session.startTime).getTime()\n : 0;\n const durationMinutes = Math.floor(duration / 60000);\n const hours = Math.floor(durationMinutes / 60);\n const minutes = durationMinutes % 60;\n\n let summary = `**Duration:** ${hours}h ${minutes}m\\n\\n`;\n\n // Goals completion\n const totalGoals = session.goals.length;\n summary += `**Goals:** ${totalGoals} defined\\n\\n`;\n\n // Count updates\n summary += `**Updates:** ${session.updates.length} progress notes\\n\\n`;\n\n // Git summary\n const lastUpdate = session.updates[session.updates.length - 1];\n if (lastUpdate?.gitCommits !== undefined) {\n summary += `**Git Commits:** ${lastUpdate.gitCommits} commits\\n\\n`;\n }\n\n if (lastUpdate?.modifiedFiles && lastUpdate.modifiedFiles.length > 0) {\n summary += `**Files Modified:** ${lastUpdate.modifiedFiles.length} files\\n\\n`;\n }\n\n summary += `**Total Updates:** ${session.updates.length}`;\n\n return summary;\n }\n\n /**\n * Parse updates from markdown body\n */\n private parseUpdates(body: string): SessionUpdate[] {\n const updates: SessionUpdate[] = [];\n const lines = body.split('\\n');\n let currentUpdate: Partial<SessionUpdate> | null = null;\n let notesLines: string[] = [];\n\n for (const line of lines) {\n // Check for update header (### YYYY-MM-DD HH:MM)\n const updateMatch = line.match(/^### (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})/);\n if (updateMatch) {\n // Save previous update\n if (currentUpdate) {\n currentUpdate.notes = notesLines.join('\\n').trim();\n updates.push(currentUpdate as SessionUpdate);\n }\n\n // Start new update\n currentUpdate = {\n timestamp: updateMatch[1],\n };\n notesLines = [];\n continue;\n }\n\n if (!currentUpdate) continue;\n\n // Parse git branch\n const gitBranchMatch = line.match(/\\*\\*Git Branch:\\*\\* (.+)/);\n if (gitBranchMatch) {\n currentUpdate.gitBranch = gitBranchMatch[1];\n continue;\n }\n\n // Parse commits\n const commitsMatch = line.match(/\\*\\*Git Commits:\\*\\* (\\d+)/);\n if (commitsMatch) {\n currentUpdate.gitCommits = parseInt(commitsMatch[1], 10);\n continue;\n }\n\n // Parse modified files\n if (line.includes('**Modified Files:**')) {\n continue;\n }\n\n // Parse file list items\n if (line.trim().startsWith('- ') && currentUpdate) {\n if (!currentUpdate.modifiedFiles) {\n currentUpdate.modifiedFiles = [];\n }\n currentUpdate.modifiedFiles.push(line.trim().substring(2));\n continue;\n }\n\n // Parse Beads task\n const beadsMatch = line.match(/\\*\\*Beads Task:\\*\\* ([\\w-]+) \\((\\w+)\\)/);\n if (beadsMatch) {\n currentUpdate.beadsTask = {\n id: beadsMatch[1],\n status: beadsMatch[2],\n };\n continue;\n }\n\n // Collect notes (non-metadata lines)\n if (!line.startsWith('**') && !line.startsWith('#')) {\n notesLines.push(line);\n }\n }\n\n // Save last update\n if (currentUpdate) {\n currentUpdate.notes = notesLines.join('\\n').trim();\n updates.push(currentUpdate as SessionUpdate);\n }\n\n return updates;\n }\n\n /**\n * Get git state\n */\n private async getGitState(): Promise<{ branch: string; commits?: number }> {\n try {\n // Get branch name\n const { stdout: branch } = await execAsync('git rev-parse --abbrev-ref HEAD');\n\n // Get commit count since session start (approximate)\n const { stdout: log } = await execAsync('git log --oneline | wc -l');\n\n return {\n branch: branch.trim(),\n commits: parseInt(log.trim(), 10),\n };\n } catch {\n // Not a git repository or git not available\n return { branch: 'main' };\n }\n }\n\n /**\n * Get modified files\n */\n private async getModifiedFiles(): Promise<string[]> {\n try {\n const { stdout } = await execAsync('git status --porcelain');\n const lines = stdout.trim().split('\\n');\n return lines\n .filter((line) => line.trim())\n .map((line) => line.substring(3));\n } catch {\n return [];\n }\n }\n\n /**\n * Get current Beads task\n */\n private async getCurrentBeadsTask(): Promise<{ id: string; status: string } | null> {\n const beadsDir = join(this.projectPath, '.beads');\n try {\n const files = await readdir(beadsDir);\n const beadFiles = files.filter((f) => f.startsWith('bead-') && f.endsWith('.md'));\n\n for (const file of beadFiles) {\n const content = await readFile(join(beadsDir, file), 'utf-8');\n const statusMatch = content.match(/^status:\\s*(\\w+)/m);\n const id = file.replace('.md', '');\n\n if (statusMatch && (statusMatch[1] === 'in-progress' || statusMatch[1] === 'todo')) {\n return {\n id,\n status: statusMatch[1],\n };\n }\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Format session for display\n */\nexport function formatSession(session: Session): string {\n const startDate = new Date(session.startTime);\n const endDate = session.endTime ? new Date(session.endTime) : null;\n\n return `\n${session.id}\n Name: ${session.name}\n Status: ${session.status}\n Started: ${startDate.toLocaleString()}\n ${endDate ? `Ended: ${endDate.toLocaleString()}` : ''}\n Goals: ${session.goals.length}\n Updates: ${session.updates.length}\n`;\n}\n","import { readFile, writeFile, mkdir, access, constants } from 'fs/promises';\nimport { join } from 'path';\nimport { z } from 'zod';\nimport { Config } from './config.js';\n\n/**\n * Tool configuration status\n */\nexport type ToolStatus = 'ready' | 'needs_config' | 'error';\n\n/**\n * Configuration method\n */\nexport type ConfigMethod = 'oauth' | 'manual' | 'none';\n\n/**\n * Tool configuration schema\n */\nconst ToolConfigSchema = z.object({\n name: z.string(),\n status: z.enum(['ready', 'needs_config', 'error']),\n description: z.string(),\n configMethod: z.enum(['oauth', 'manual', 'none']),\n config: z.record(z.unknown()).optional(),\n errorMessage: z.string().optional(),\n});\n\nexport type ToolConfig = z.infer<typeof ToolConfigSchema>;\n\n/**\n * Tools registry with configuration\n */\nconst REGISTERED_TOOLS: Omit<ToolConfig, 'status' | 'config' | 'errorMessage'>[] = [\n {\n name: 'figma-analysis',\n description: 'Analyze Figma designs and extract design tokens using Figma API',\n configMethod: 'oauth',\n },\n // Add more tools here as needed\n];\n\n/**\n * Tool Configuration Manager\n */\nexport class ToolConfigManager {\n private config: Config;\n private toolsConfigPath: string;\n\n constructor(config: Config) {\n this.config = config;\n this.toolsConfigPath = join(this.config.configPath, 'config', 'tools.json');\n }\n\n /**\n * Get all registered tools with their current status\n */\n async listTools(): Promise<ToolConfig[]> {\n const savedConfigs = await this.loadConfigs();\n const tools: ToolConfig[] = [];\n\n for (const tool of REGISTERED_TOOLS) {\n const saved = savedConfigs[tool.name];\n const toolConfig: ToolConfig = {\n ...tool,\n status: this.determineStatus(tool, saved),\n config: saved?.config,\n errorMessage: saved?.errorMessage,\n };\n tools.push(toolConfig);\n }\n\n return tools;\n }\n\n /**\n * Get configuration for a specific tool\n */\n async getToolConfig(toolName: string): Promise<ToolConfig | null> {\n const tools = await this.listTools();\n return tools.find(t => t.name === toolName) || null;\n }\n\n /**\n * Update tool configuration\n */\n async updateToolConfig(toolName: string, updates: {\n config?: Record<string, unknown>;\n status?: ToolStatus;\n errorMessage?: string;\n }): Promise<void> {\n const savedConfigs = await this.loadConfigs();\n const tool = REGISTERED_TOOLS.find(t => t.name === toolName);\n\n if (!tool) {\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n const existing = savedConfigs[toolName] || {};\n savedConfigs[toolName] = {\n ...existing,\n ...updates,\n };\n\n await this.saveConfigs(savedConfigs);\n }\n\n /**\n * Check if a tool is ready to use\n */\n async isToolReady(toolName: string): Promise<boolean> {\n const toolConfig = await this.getToolConfig(toolName);\n return toolConfig?.status === 'ready';\n }\n\n /**\n * Get API key for a tool (if configured)\n */\n async getApiKey(toolName: string): Promise<string | null> {\n const toolConfig = await this.getToolConfig(toolName);\n if (toolConfig?.config?.apiKey && typeof toolConfig.config.apiKey === 'string') {\n return toolConfig.config.apiKey;\n }\n return null;\n }\n\n /**\n * Determine tool status based on configuration\n */\n private determineStatus(\n tool: Omit<ToolConfig, 'status' | 'config' | 'errorMessage'>,\n saved?: { config?: Record<string, unknown>; errorMessage?: string }\n ): ToolStatus {\n if (tool.configMethod === 'none') {\n return 'ready';\n }\n\n if (saved?.errorMessage) {\n return 'error';\n }\n\n if (tool.configMethod === 'oauth' || tool.configMethod === 'manual') {\n // Check if API key is configured\n if (saved?.config?.apiKey && typeof saved.config.apiKey === 'string' && saved.config.apiKey.length > 0) {\n return 'ready';\n }\n return 'needs_config';\n }\n\n return 'needs_config';\n }\n\n /**\n * Load saved configurations\n */\n private async loadConfigs(): Promise<Record<string, { config?: Record<string, unknown>; errorMessage?: string }>> {\n try {\n await access(this.toolsConfigPath, constants.R_OK);\n const content = await readFile(this.toolsConfigPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n /**\n * Save configurations\n */\n private async saveConfigs(configs: Record<string, unknown>): Promise<void> {\n const configDir = join(this.config.configPath, 'config');\n await mkdir(configDir, { recursive: true });\n await writeFile(this.toolsConfigPath, JSON.stringify(configs, null, 2));\n }\n}\n\n","import open from 'open';\nimport { ToolConfigManager } from '../tool-config.js';\nimport { logger } from '../../utils/logger.js';\n\n/**\n * Figma OAuth Configuration\n * \n * Note: Figma uses Personal Access Tokens, not OAuth 2.0\n * For OAuth-like experience, we'll guide user through browser\n * to create a token, then they paste it back\n */\nexport class FigmaOAuth {\n private configManager: ToolConfigManager;\n\n constructor(configManager: ToolConfigManager) {\n this.configManager = configManager;\n }\n\n /**\n * Start OAuth flow for Figma\n * \n * Since Figma uses Personal Access Tokens (not OAuth 2.0),\n * we'll open browser to token creation page and guide user\n */\n async authenticate(): Promise<string> {\n console.log('\\n🔐 Figma Authentication\\n');\n console.log('Figma uses Personal Access Tokens for API access.');\n console.log('We will open your browser to create a token.\\n');\n\n // Open Figma token creation page\n const tokenUrl = 'https://www.figma.com/developers/api#access-tokens';\n console.log(`Opening: ${tokenUrl}`);\n \n try {\n await open(tokenUrl);\n } catch (error) {\n console.log('\\n⚠️ Could not open browser automatically.');\n console.log(`Please visit: ${tokenUrl}`);\n }\n\n console.log('\\n📋 Instructions:');\n console.log('1. In the browser, scroll to \"Personal access tokens\" section');\n console.log('2. Click \"Create new token\"');\n console.log('3. Give it a name (e.g., \"AIKit\")');\n console.log('4. Copy the token (you won\\'t see it again!)');\n console.log('5. Paste it here when prompted\\n');\n\n // Use inquirer to get token from user\n const { default: inquirer } = await import('inquirer');\n \n const { token } = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: 'Paste your Figma Personal Access Token:',\n validate: (input: string) => {\n if (!input || input.trim().length === 0) {\n return 'Token cannot be empty';\n }\n if (input.length < 20) {\n return 'Token seems too short. Please check and try again.';\n }\n return true;\n },\n },\n ]);\n\n // Validate token format (Figma tokens are typically long alphanumeric strings)\n const trimmedToken = token.trim();\n \n // Save token\n await this.configManager.updateToolConfig('figma-analysis', {\n config: {\n apiKey: trimmedToken,\n },\n status: 'ready',\n });\n\n logger.success('Figma token saved successfully!');\n return trimmedToken;\n }\n\n /**\n * Alternative: Manual token input\n */\n async authenticateManual(): Promise<string> {\n const { default: inquirer } = await import('inquirer');\n \n console.log('\\n🔐 Figma Authentication (Manual)\\n');\n console.log('To get your Figma Personal Access Token:');\n console.log('1. Visit: https://www.figma.com/developers/api#access-tokens');\n console.log('2. Scroll to \"Personal access tokens\"');\n console.log('3. Click \"Create new token\"');\n console.log('4. Copy the token and paste it below\\n');\n\n const { token } = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: 'Enter your Figma Personal Access Token:',\n validate: (input: string) => {\n if (!input || input.trim().length === 0) {\n return 'Token cannot be empty';\n }\n return true;\n },\n },\n ]);\n\n const trimmedToken = token.trim();\n \n await this.configManager.updateToolConfig('figma-analysis', {\n config: {\n apiKey: trimmedToken,\n },\n status: 'ready',\n });\n\n logger.success('Figma token saved successfully!');\n return trimmedToken;\n }\n\n /**\n * Test if token is valid by making a simple API call\n */\n async validateToken(token: string): Promise<boolean> {\n try {\n // Try to get user info from Figma API\n const response = await fetch('https://api.figma.com/v1/me', {\n headers: {\n 'X-Figma-Token': token,\n },\n });\n\n if (response.ok) {\n const data = await response.json() as { email?: string };\n logger.success(`Token validated! Logged in as: ${data.email || 'Unknown'}`);\n return true;\n } else {\n logger.error(`Token validation failed: ${response.status} ${response.statusText}`);\n return false;\n }\n } catch (error) {\n logger.error(`Token validation error: ${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n}\n\n","/**\n * AIKit CLI\n * \n * This file serves as the entry point for the CLI.\n * All command implementations are in src/cli/ directory.\n * \n * Structure:\n * - src/cli/index.ts - Main entry point with program setup\n * - src/cli/commands/ - Individual command implementations\n * - src/cli/helpers.ts - Helper functions for commands\n */\n\n// Re-export everything from the CLI module\nexport * from './cli/index.js';\n\n// The actual CLI is started in src/cli/index.ts\n// This file just serves as the build entry point\nimport './cli/index.js';\n","/**\n * AIKit CLI - Main Entry Point\n * \n * Open-source AI coding agent toolkit for OpenCode\n */\n\nimport { Command } from 'commander';\nimport { VERSION } from '../index.js';\n\nimport {\n registerInitCommand,\n registerInstallCommand,\n registerSyncCommand,\n registerSkillsCommand,\n registerAgentsCommand,\n registerCommandsCommand,\n registerModeCommand,\n registerToolsCommand,\n registerPluginsCommand,\n registerMemoryCommand,\n registerBeadsCommand,\n registerStatusCommand,\n registerSessionCommand,\n} from './commands/index.js';\n\nconst program = new Command();\n\nprogram\n .name('aikit')\n .description('Open-source AI coding agent toolkit for OpenCode')\n .version(VERSION());\n\n// Register all commands\nregisterInitCommand(program);\nregisterInstallCommand(program);\nregisterSyncCommand(program);\nregisterSkillsCommand(program);\nregisterAgentsCommand(program);\nregisterCommandsCommand(program);\nregisterModeCommand(program);\nregisterToolsCommand(program);\nregisterPluginsCommand(program);\nregisterMemoryCommand(program);\nregisterBeadsCommand(program);\nregisterSessionCommand(program);\nregisterStatusCommand(program);\n\n// Run CLI\nprogram.parse();\n\n\n\n\n","/**\n * AIKit - Open-source AI coding agent toolkit for OpenCode\n * \n * Provides skills, agents, commands, tools, and plugins for enhanced AI-assisted development.\n */\n\n// Core exports\nexport { Config, loadConfig, type AIKitConfig } from './core/config.js';\nexport { SkillEngine, type Skill } from './core/skills.js';\nexport { AgentManager, type Agent, type AgentType } from './core/agents.js';\nexport { CommandRunner, type Command } from './core/commands.js';\nexport { ToolRegistry, type Tool, defineTool } from './core/tools.js';\nexport { PluginSystem, type Plugin, type PluginEvent } from './core/plugins.js';\nexport { MemoryManager, type Memory } from './core/memory.js';\nexport { BeadsIntegration } from './core/beads.js';\nexport { AntiHallucination } from './core/anti-hallucination.js';\n\n// Utilities\nexport { logger } from './utils/logger.js';\nexport { paths } from './utils/paths.js';\nexport { getVersion as VERSION } from './utils/version.js';\n","import { readFile, readdir, writeFile, mkdir } from 'fs/promises';\nimport { join, basename, extname } from 'path';\nimport matter from 'gray-matter';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Skill definition\n */\nexport interface Skill {\n name: string;\n description: string;\n useWhen: string;\n category: string;\n tags: string[];\n content: string;\n filePath: string;\n}\n\n/**\n * Skill frontmatter schema\n */\ninterface SkillFrontmatter {\n name?: string;\n description?: string;\n useWhen?: string;\n category?: string;\n tags?: string[];\n}\n\n/**\n * Skill Engine - Manages workflow skills for AI agents\n * \n * Skills are mandatory workflow instructions that agents must follow.\n * They enforce structured processes like TDD, systematic debugging, etc.\n */\nexport class SkillEngine {\n private config: Config;\n private skillsCache: Map<string, Skill> = new Map();\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * List all available skills\n */\n async listSkills(): Promise<Skill[]> {\n const skills: Skill[] = [];\n \n // Load from global config\n const globalSkillsPath = paths.skills(paths.globalConfig());\n try {\n const globalSkills = await this.loadSkillsFromDir(globalSkillsPath);\n skills.push(...globalSkills);\n } catch {\n // No global skills\n }\n \n // Load from project config (override global)\n const projectSkillsPath = paths.skills(this.config.configPath);\n if (projectSkillsPath !== globalSkillsPath) {\n try {\n const projectSkills = await this.loadSkillsFromDir(projectSkillsPath);\n // Override global skills with project skills\n for (const skill of projectSkills) {\n const existingIndex = skills.findIndex(s => s.name === skill.name);\n if (existingIndex >= 0) {\n skills[existingIndex] = skill;\n } else {\n skills.push(skill);\n }\n }\n } catch {\n // No project skills\n }\n }\n \n return skills.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Get a specific skill by name\n */\n async getSkill(name: string): Promise<Skill | null> {\n // Check cache first\n if (this.skillsCache.has(name)) {\n return this.skillsCache.get(name)!;\n }\n \n const skills = await this.listSkills();\n const skill = skills.find(s => s.name === name);\n \n if (skill) {\n this.skillsCache.set(name, skill);\n }\n \n return skill || null;\n }\n\n /**\n * Find skills matching a query\n */\n async findSkills(query?: string): Promise<Skill[]> {\n const skills = await this.listSkills();\n \n if (!query) {\n return skills;\n }\n \n const lowerQuery = query.toLowerCase();\n return skills.filter(skill =>\n skill.name.toLowerCase().includes(lowerQuery) ||\n skill.description.toLowerCase().includes(lowerQuery) ||\n skill.tags.some(tag => tag.toLowerCase().includes(lowerQuery)) ||\n skill.category.toLowerCase().includes(lowerQuery)\n );\n }\n\n /**\n * Create a new skill\n */\n async createSkill(name: string, options?: {\n description?: string;\n useWhen?: string;\n category?: string;\n tags?: string[];\n content?: string;\n global?: boolean;\n }): Promise<Skill> {\n const configPath = options?.global ? paths.globalConfig() : this.config.configPath;\n const skillsDir = paths.skills(configPath);\n \n await mkdir(skillsDir, { recursive: true });\n \n const fileName = `${name.replace(/\\s+/g, '-').toLowerCase()}.md`;\n const filePath = join(skillsDir, fileName);\n \n const frontmatter: SkillFrontmatter = {\n name,\n description: options?.description || `Use when you need to ${name}`,\n useWhen: options?.useWhen || `The user asks you to ${name}`,\n category: options?.category || 'custom',\n tags: options?.tags || ['custom'],\n };\n \n const content = options?.content || `## ${name}\n\n### Overview\nDescribe what this skill does.\n\n### Workflow\n\n#### Step 1: Understand the Task\n- Gather context\n- Clarify requirements\n\n#### Step 2: Plan the Approach\n- Break down into sub-tasks\n- Identify dependencies\n\n#### Step 3: Execute\n- Follow TDD principles\n- Write tests first\n\n#### Step 4: Verify\n- Run all tests\n- Check for regressions\n\n### Checklist\n- [ ] Requirements understood\n- [ ] Tests written\n- [ ] Implementation complete\n- [ ] All tests passing\n- [ ] Code reviewed\n`;\n\n const fileContent = matter.stringify(content, frontmatter);\n await writeFile(filePath, fileContent);\n \n const skill: Skill = {\n name,\n description: frontmatter.description!,\n useWhen: frontmatter.useWhen!,\n category: frontmatter.category!,\n tags: frontmatter.tags!,\n content,\n filePath,\n };\n \n this.skillsCache.set(name, skill);\n \n return skill;\n }\n\n /**\n * Sync global skills to project directory\n */\n async syncSkillsToProject(): Promise<{ count: number; synced: string[] }> {\n const globalSkillsPath = paths.skills(paths.globalConfig());\n const projectSkillsPath = paths.skills(this.config.configPath);\n \n if (globalSkillsPath === projectSkillsPath) {\n return { count: 0, synced: [] };\n }\n \n // Check if global skills directory exists before trying to load\n let globalSkills: Skill[] = [];\n try {\n globalSkills = await this.loadSkillsFromDir(globalSkillsPath);\n } catch (error) {\n // Global skills directory doesn't exist or can't be read\n logger.warn('Global skills directory not found. Skipping sync.');\n return { count: 0, synced: [] };\n }\n \n if (globalSkills.length === 0) {\n logger.info('No global skills to sync.');\n return { count: 0, synced: [] };\n }\n \n await mkdir(projectSkillsPath, { recursive: true });\n \n const synced: string[] = [];\n \n for (const skill of globalSkills) {\n const fileName = `${skill.name.replace(/\\s+/g, '-').toLowerCase()}.md`;\n const destPath = join(projectSkillsPath, fileName);\n const srcContent = await readFile(skill.filePath, 'utf-8');\n await writeFile(destPath, srcContent);\n synced.push(skill.name);\n }\n \n return { count: synced.length, synced };\n }\n\n /**\n * Format skill for agent consumption\n */\n formatForAgent(skill: Skill): string {\n return `# Skill: ${skill.name}\n\n## When to Use\n${skill.useWhen}\n\n## Description\n${skill.description}\n\n## Workflow\n${skill.content}\n\n---\n**IMPORTANT**: Follow this workflow step by step. Do not skip steps.\n`;\n }\n\n /**\n * Load skills from a directory\n */\n private async loadSkillsFromDir(dir: string): Promise<Skill[]> {\n const files = await readdir(dir);\n const skills: Skill[] = [];\n \n for (const file of files) {\n if (extname(file) !== '.md') continue;\n \n const filePath = join(dir, file);\n const content = await readFile(filePath, 'utf-8');\n const { data, content: body } = matter(content);\n \n const frontmatter = data as SkillFrontmatter;\n const name = frontmatter.name || basename(file, '.md');\n \n skills.push({\n name,\n description: frontmatter.description || '',\n useWhen: frontmatter.useWhen || '',\n category: frontmatter.category || 'general',\n tags: frontmatter.tags || [],\n content: body.trim(),\n filePath,\n });\n }\n \n return skills;\n }\n}\n","import { Config } from './config.js';\n\n/**\n * Agent types available in AIKit\n */\nexport type AgentType = 'planner' | 'build' | 'rush' | 'review' | 'scout' | 'explore' | 'vision' | 'one-shot';\n\n/**\n * Agent definition\n */\nexport interface Agent {\n name: AgentType;\n displayName: string;\n description: string;\n useWhen: string;\n capabilities: string[];\n systemPrompt: string;\n delegatesTo: AgentType[];\n}\n\n/**\n * Default agent definitions\n */\nconst DEFAULT_AGENTS: Agent[] = [\n {\n name: 'planner',\n displayName: '@planner',\n description: 'Strategic planning and multi-agent coordination',\n useWhen: 'Complex tasks requiring architecture decisions, multi-step planning, or coordination between specialists',\n capabilities: [\n 'Break down complex tasks into sub-tasks',\n 'Coordinate between specialist agents',\n 'Make architecture decisions',\n 'Create implementation plans',\n ],\n systemPrompt: `You are a strategic planner agent. Your role is to:\n\n1. ANALYZE the task and understand the full scope\n2. BREAK DOWN complex tasks into smaller, manageable sub-tasks\n3. DELEGATE to appropriate specialist agents\n4. COORDINATE the overall workflow\n5. VERIFY completion of the overall goal\n\nWhen delegating:\n- Use @build for implementation tasks\n- Use @scout for external research\n- Use @review for code review and security audits\n- Use @explore for codebase navigation\n- Use @vision for visual analysis\n\nAlways create a clear plan before delegating. Track progress and ensure all sub-tasks complete successfully.`,\n delegatesTo: ['build', 'scout', 'review', 'explore', 'vision'],\n },\n {\n name: 'build',\n displayName: '@build',\n description: 'Primary execution agent for implementing features',\n useWhen: 'Implementing features, writing code, making changes to the codebase',\n capabilities: [\n 'Write production code',\n 'Write tests',\n 'Refactor code',\n 'Fix bugs',\n 'Implement features',\n ],\n systemPrompt: `You are the build agent. Your role is to implement code changes.\n\nFollow these principles:\n1. TEST-DRIVEN DEVELOPMENT: Write tests before implementation\n2. INCREMENTAL CHANGES: Make small, focused commits\n3. VERIFY: Run tests and type checks after each change\n4. DOCUMENT: Add comments for complex logic\n\nBefore starting:\n- Understand the requirements fully\n- Check existing patterns in the codebase\n- Plan the implementation approach\n\nAfter completing:\n- Ensure all tests pass\n- Run linting and type checks\n- Create a clear commit message`,\n delegatesTo: ['review', 'explore'],\n },\n {\n name: 'rush',\n displayName: '@rush',\n description: 'Fast execution with minimal planning',\n useWhen: 'Quick fixes, hotfixes, simple edits that need minimal planning',\n capabilities: [\n 'Quick bug fixes',\n 'Simple refactoring',\n 'Minor changes',\n 'Hotfixes',\n ],\n systemPrompt: `You are the rush agent. Your role is to make quick, focused changes.\n\nGuidelines:\n1. ACT FAST: Minimal planning, direct execution\n2. FOCUS: One change at a time\n3. VERIFY: Quick sanity check after change\n4. MINIMAL SCOPE: Don't expand beyond the immediate task\n\nUse for:\n- Typo fixes\n- Simple bug fixes\n- Minor adjustments\n- Urgent hotfixes`,\n delegatesTo: [],\n },\n {\n name: 'review',\n displayName: '@review',\n description: 'Code review, debugging, and security audits',\n useWhen: 'Reviewing code quality, finding bugs, security review, debugging issues',\n capabilities: [\n 'Code review',\n 'Security audit',\n 'Performance analysis',\n 'Bug finding',\n 'Best practices enforcement',\n ],\n systemPrompt: `You are the review agent. Your role is to review and improve code quality.\n\nReview checklist:\n1. CORRECTNESS: Does the code do what it's supposed to?\n2. SECURITY: Are there any security vulnerabilities?\n3. PERFORMANCE: Are there performance issues?\n4. MAINTAINABILITY: Is the code clean and readable?\n5. TESTS: Are there adequate tests?\n6. PATTERNS: Does it follow project conventions?\n\nWhen reviewing:\n- Be specific about issues\n- Suggest fixes, not just problems\n- Prioritize by severity\n- Check for edge cases`,\n delegatesTo: [],\n },\n {\n name: 'scout',\n displayName: '@scout',\n description: 'External research - library docs, GitHub patterns, frameworks',\n useWhen: 'Researching external libraries, finding code patterns on GitHub, learning about frameworks',\n capabilities: [\n 'Web research',\n 'GitHub code search',\n 'Documentation lookup',\n 'Framework exploration',\n 'Best practices research',\n ],\n systemPrompt: `You are the scout agent. Your role is to research external resources.\n\nResearch strategy:\n1. UNDERSTAND what information is needed\n2. SEARCH appropriate sources (docs, GitHub, web)\n3. EVALUATE quality and relevance of findings\n4. SUMMARIZE key findings concisely\n5. PROVIDE actionable recommendations\n\nSources to use:\n- Official documentation\n- GitHub code examples\n- Stack Overflow (verified answers)\n- Framework guides\n- Community best practices\n\nAlways cite your sources and verify information accuracy.`,\n delegatesTo: [],\n },\n {\n name: 'explore',\n displayName: '@explore',\n description: 'Fast codebase navigation and pattern search',\n useWhen: 'Finding files, understanding codebase structure, searching for patterns in code',\n capabilities: [\n 'File discovery',\n 'Pattern search',\n 'Codebase navigation',\n 'Structure analysis',\n 'Dependency mapping',\n ],\n systemPrompt: `You are the explore agent. Your role is to navigate and understand the codebase.\n\nExploration techniques:\n1. FILE STRUCTURE: Understand project organization\n2. GREP SEARCH: Find specific patterns or usages\n3. DEPENDENCY ANALYSIS: Map relationships between modules\n4. PATTERN DISCOVERY: Find existing patterns to follow\n5. QUICK CONTEXT: Gather just enough context for the task\n\nFocus on speed and accuracy. Provide concise summaries of findings.`,\n delegatesTo: [],\n },\n {\n name: 'vision',\n displayName: '@vision',\n description: 'Multimodal analysis - mockups, PDFs, diagrams',\n useWhen: 'Analyzing images, mockups, screenshots, PDFs, or diagrams',\n capabilities: [\n 'Image analysis',\n 'Mockup interpretation',\n 'PDF extraction',\n 'Diagram understanding',\n 'UI/UX analysis',\n ],\n systemPrompt: `You are the vision agent. Your role is to analyze visual content.\n\nAnalysis approach:\n1. OBSERVE: Carefully examine the visual content\n2. EXTRACT: Identify key information, text, structure\n3. INTERPRET: Understand the intent and requirements\n4. TRANSLATE: Convert visual specs to actionable tasks\n5. VALIDATE: Ensure accurate interpretation\n\nFor mockups:\n- Identify components and layout\n- Note colors, spacing, typography\n- Extract interaction patterns\n\nFor diagrams:\n- Understand relationships\n- Map to code structure\n- Note data flow`,\n delegatesTo: [],\n },\n {\n name: 'one-shot',\n displayName: '@one-shot',\n description: 'End-to-end autonomous task execution (beta)',\n useWhen: 'Complete tasks autonomously from start to finish with minimal intervention',\n capabilities: [\n 'Gather requirements interactively',\n 'Create detailed implementation plans',\n 'Execute tasks with dynamic agent selection',\n 'Run quality gates until all pass',\n 'Multi-level verification',\n 'Auto-recovery from failures',\n 'Generate completion proof',\n ],\n systemPrompt: `You are the one-shot agent. Your role is to execute tasks autonomously from start to finish.\n\n## Workflow Phases\n\n1. **REQUIREMENTS**: Gather task type, scope, dependencies, success criteria\n2. **PLANNING**: Create detailed plan with @planner, recommend skills/tools\n3. **COMPLEXITY**: Auto-split large tasks (>30min, >10 files, >500 lines)\n4. **EXECUTION**: Execute with parallel tasks, dynamic agent delegation\n5. **TESTING**: Run quality gates (typecheck, test, lint, build) until all pass\n6. **VERIFICATION**: Multi-level verification (gates + manual + deployment)\n7. **COMPLETION**: Generate proof, update tracking, collect feedback\n\n## Quality Gates (Must ALL Pass)\n- npm run typecheck - No type errors\n- npm run test - All tests pass\n- npm run lint - No linting errors\n- npm run build - Build succeeds\n\n## Error Recovery (3 Levels)\n- Level 1: Auto-fix (type errors, lint --fix)\n- Level 2: Alternative approach via @review\n- Level 3: User intervention + follow-up task creation\n\n## Best Practices\n- Use for straightforward tasks first\n- Consider /plan + /implement for complex features\n- Review changes before final approval\n\n⚠️ This mode is experimental. Start with simpler tasks.`,\n delegatesTo: ['planner', 'build', 'review', 'scout', 'explore', 'vision'],\n },\n];\n\n/**\n * Agent delegation result\n */\nexport interface DelegationDecision {\n agent: Agent;\n reason: string;\n shouldDelegate: boolean;\n subTasks?: string[];\n}\n\n/**\n * Agent Manager - Handles agent selection and delegation\n */\nexport class AgentManager {\n private config: Config;\n private agents: Map<AgentType, Agent>;\n\n constructor(config: Config) {\n this.config = config;\n this.agents = new Map();\n \n // Initialize default agents\n for (const agent of DEFAULT_AGENTS) {\n this.agents.set(agent.name, agent);\n }\n }\n\n /**\n * List all available agents\n */\n listAgents(): Agent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Get a specific agent\n */\n getAgent(name: AgentType): Agent | undefined {\n return this.agents.get(name);\n }\n\n /**\n * Get the default agent\n */\n getDefaultAgent(): Agent {\n const defaultName = this.config.agents.default as AgentType;\n return this.agents.get(defaultName) || this.agents.get('build')!;\n }\n\n /**\n * Decide which agent should handle a task\n */\n decideAgent(task: string, _context?: string): DelegationDecision {\n const lowerTask = task.toLowerCase();\n \n // Check for explicit agent mentions\n for (const [name, agent] of this.agents) {\n if (lowerTask.includes(`@${name}`)) {\n return {\n agent,\n reason: `Explicitly requested @${name}`,\n shouldDelegate: false,\n };\n }\n }\n \n // Keyword-based delegation\n if (this.matchesKeywords(lowerTask, ['plan', 'architect', 'design', 'coordinate', 'complex'])) {\n return {\n agent: this.agents.get('planner')!,\n reason: 'Task requires planning and coordination',\n shouldDelegate: true,\n };\n }\n \n if (this.matchesKeywords(lowerTask, ['research', 'docs', 'documentation', 'library', 'framework', 'how to'])) {\n return {\n agent: this.agents.get('scout')!,\n reason: 'Task requires external research',\n shouldDelegate: false,\n };\n }\n \n if (this.matchesKeywords(lowerTask, ['review', 'audit', 'security', 'check', 'debug'])) {\n return {\n agent: this.agents.get('review')!,\n reason: 'Task requires code review or debugging',\n shouldDelegate: false,\n };\n }\n \n if (this.matchesKeywords(lowerTask, ['find', 'search', 'where', 'locate', 'explore'])) {\n return {\n agent: this.agents.get('explore')!,\n reason: 'Task requires codebase exploration',\n shouldDelegate: false,\n };\n }\n \n if (this.matchesKeywords(lowerTask, ['image', 'mockup', 'screenshot', 'pdf', 'diagram', 'visual'])) {\n return {\n agent: this.agents.get('vision')!,\n reason: 'Task requires visual analysis',\n shouldDelegate: false,\n };\n }\n \n if (this.matchesKeywords(lowerTask, ['fix quickly', 'hotfix', 'urgent', 'quick fix', 'typo'])) {\n return {\n agent: this.agents.get('rush')!,\n reason: 'Task is a quick fix',\n shouldDelegate: false,\n };\n }\n \n // Default to build agent\n return {\n agent: this.agents.get('build')!,\n reason: 'Default to build agent for implementation',\n shouldDelegate: false,\n };\n }\n\n /**\n * Format agent instructions for prompt\n */\n formatAgentPrompt(agent: Agent): string {\n return `# Agent: ${agent.displayName}\n\n${agent.systemPrompt}\n\n## Capabilities\n${agent.capabilities.map(c => `- ${c}`).join('\\n')}\n\n${agent.delegatesTo.length > 0 ? `## Can Delegate To\n${agent.delegatesTo.map(a => `- @${a}`).join('\\n')}` : ''}\n`;\n }\n\n private matchesKeywords(text: string, keywords: string[]): boolean {\n return keywords.some(kw => text.includes(kw));\n }\n}\n","/**\n * This file re-exports the modular commands structure for backward compatibility.\n * The actual implementation is in the commands/ directory.\n *\n * @deprecated Import directly from './commands/index.js' instead\n */\n\nexport {\n CommandRunner,\n Command,\n COMMAND_CATEGORIES,\n type CommandFrontmatter,\n type DefaultCommand,\n} from './commands/index.js';\n","import { readFile, readdir, writeFile, mkdir } from 'fs/promises';\nimport { join, basename, extname } from 'path';\nimport matter from 'gray-matter';\nimport { Config } from '../config.js';\nimport { paths } from '../../utils/paths.js';\nimport { Command, CommandFrontmatter, DefaultCommand, COMMAND_CATEGORIES } from './types.js';\nimport { CORE_COMMANDS } from './core.js';\nimport { QUICK_COMMANDS } from './quick.js';\nimport { RESEARCH_COMMANDS } from './research.js';\nimport { DESIGN_COMMANDS } from './design.js';\nimport { GIT_COMMANDS } from './git.js';\nimport { UTILITY_COMMANDS } from './utility.js';\nimport { CHECKPOINT_COMMANDS } from './checkpoint.js';\nimport { SESSION_COMMANDS } from './sessions.js';\nimport { DRAWIO_COMMANDS } from './drawio.js';\n\n/**\n * Aggregate all default commands from separate modules\n */\nconst DEFAULT_COMMANDS: DefaultCommand[] = [\n ...CORE_COMMANDS,\n ...QUICK_COMMANDS,\n ...RESEARCH_COMMANDS,\n ...DESIGN_COMMANDS,\n ...GIT_COMMANDS,\n ...UTILITY_COMMANDS,\n ...CHECKPOINT_COMMANDS,\n ...SESSION_COMMANDS,\n ...DRAWIO_COMMANDS,\n];\n\n/**\n * Command Runner - Manages and executes slash commands\n */\nexport class CommandRunner {\n private config: Config;\n private commandsCache: Map<string, Command> = new Map();\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * List all available commands\n */\n async listCommands(): Promise<Command[]> {\n const commands: Command[] = [];\n\n // Add default commands\n for (const cmd of DEFAULT_COMMANDS) {\n commands.push({\n ...cmd,\n filePath: 'built-in',\n });\n }\n\n // Load custom commands from global config\n const globalCommandsPath = paths.commands(paths.globalConfig());\n try {\n const globalCommands = await this.loadCommandsFromDir(globalCommandsPath);\n commands.push(...globalCommands);\n } catch {\n // No global commands\n }\n\n // Load custom commands from project config\n const projectCommandsPath = paths.commands(this.config.configPath);\n if (projectCommandsPath !== globalCommandsPath) {\n try {\n const projectCommands = await this.loadCommandsFromDir(projectCommandsPath);\n // Override with project commands\n for (const cmd of projectCommands) {\n const existingIndex = commands.findIndex(c => c.name === cmd.name);\n if (existingIndex >= 0) {\n commands[existingIndex] = cmd;\n } else {\n commands.push(cmd);\n }\n }\n } catch {\n // No project commands\n }\n }\n\n return commands.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Get a specific command\n */\n async getCommand(name: string): Promise<Command | null> {\n if (this.commandsCache.has(name)) {\n return this.commandsCache.get(name)!;\n }\n\n const commands = await this.listCommands();\n const command = commands.find(c => c.name === name);\n\n if (command) {\n this.commandsCache.set(name, command);\n }\n\n return command || null;\n }\n\n /**\n * Create a custom command\n */\n async createCommand(name: string, options?: {\n description?: string;\n category?: string;\n usage?: string;\n examples?: string[];\n content?: string;\n global?: boolean;\n }): Promise<Command> {\n const configPath = options?.global ? paths.globalConfig() : this.config.configPath;\n const category = options?.category || 'utility';\n const commandsDir = join(paths.commands(configPath), category);\n\n await mkdir(commandsDir, { recursive: true });\n\n const fileName = `${name}.md`;\n const filePath = join(commandsDir, fileName);\n\n const frontmatter: CommandFrontmatter = {\n name,\n description: options?.description || `Custom command: ${name}`,\n category,\n usage: options?.usage || `/${name}`,\n examples: options?.examples || [`/${name}`],\n };\n\n const content = options?.content || `## /${name}\n\nDescribe what this command does.\n\n## Workflow\n1. Step 1\n2. Step 2\n3. Step 3\n`;\n\n const fileContent = matter.stringify(content, frontmatter);\n await writeFile(filePath, fileContent);\n\n const command: Command = {\n name,\n description: frontmatter.description!,\n category,\n usage: frontmatter.usage!,\n examples: frontmatter.examples!,\n content,\n filePath,\n };\n\n this.commandsCache.set(name, command);\n\n return command;\n }\n\n /**\n * Format command for agent consumption\n */\n formatForAgent(command: Command, args?: string): string {\n let content = command.content;\n\n if (args && args.trim()) {\n const argParts = args.trim().split(/\\s+/);\n\n content = content\n .replace(/\\$ARGUMENTS/g, args.trim())\n .replace(/\\$1/g, argParts[0] || '')\n .replace(/\\$2/g, argParts[1] || '')\n .replace(/\\$3/g, argParts[2] || '')\n .replace(/\\$4/g, argParts[3] || '')\n .replace(/\\$5/g, argParts[4] || '');\n }\n\n let output = `# Command: /${command.name}\n\n## Usage\n\\`${command.usage}\\`\n\n## Description\n${command.description}\n\n## Examples\n${command.examples.map(e => `- \\`${e}\\``).join('\\n')}\n\n## Workflow\n${content}\n`;\n\n if (args && args.trim()) {\n output += `\nUser arguments are : ${args.trim()}\n`;\n }\n\n return output;\n }\n\n /**\n * Load commands from directory (recursively)\n */\n private async loadCommandsFromDir(dir: string): Promise<Command[]> {\n const commands: Command[] = [];\n\n const processDir = async (currentDir: string, category: string) => {\n try {\n const entries = await readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n await processDir(fullPath, entry.name);\n } else if (extname(entry.name) === '.md') {\n const content = await readFile(fullPath, 'utf-8');\n const { data, content: body } = matter(content);\n const frontmatter = data as CommandFrontmatter;\n const name = frontmatter.name || basename(entry.name, '.md');\n\n commands.push({\n name,\n description: frontmatter.description || '',\n category: frontmatter.category || category,\n usage: frontmatter.usage || `/${name}`,\n examples: frontmatter.examples || [],\n content: body.trim(),\n filePath: fullPath,\n });\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n return;\n }\n };\n\n await processDir(dir, 'custom');\n return commands;\n }\n}\n\n// Re-export types and constants\nexport { Command, DefaultCommand, COMMAND_CATEGORIES };\nexport type { CommandFrontmatter };\n","/**\n * Command definition\n */\nexport interface Command {\n name: string;\n description: string;\n category: string;\n usage: string;\n examples: string[];\n content: string;\n filePath: string;\n}\n\n/**\n * Command frontmatter schema\n */\nexport interface CommandFrontmatter {\n name?: string;\n description?: string;\n category?: string;\n usage?: string;\n examples?: string[];\n}\n\n/**\n * Command categories\n */\nexport const COMMAND_CATEGORIES = {\n core: 'Core Workflow',\n quick: 'Quick Actions',\n research: 'Research & Analysis',\n design: 'Design & Planning',\n git: 'Git & Version Control',\n utility: 'Utilities',\n checkpoint: 'Checkpoints',\n session: 'Sessions',\n} as const;\n\n/**\n * Default command (without filePath)\n */\nexport type DefaultCommand = Omit<Command, 'filePath'>;\n","import { DefaultCommand } from './types';\n\n/**\n * Core Workflow Commands (Beads integration)\n */\nexport const CORE_COMMANDS: DefaultCommand[] = [\n {\n name: 'create',\n description: 'Create a new Beads task for tracking',\n category: 'core',\n usage: '/create <task description>',\n examples: ['/create Add user authentication', '/create Fix navigation bug'],\n content: `Create a new task in the Beads system (.beads/ directory).\n\n## Workflow\n\nTask description: $ARGUMENTS\n\n1. Create a new bead file with unique ID\n2. Add task description, status, and notes\n3. Set status to \"in-progress\"\n4. Initialize working notes section\n\n## Required Output\n- Task ID for reference\n- Confirmation of task creation\n- Next steps`,\n },\n {\n name: 'plan',\n description: 'Create a detailed implementation plan',\n category: 'core',\n usage: '/plan <feature or task>',\n examples: ['/plan user authentication system', '/plan refactor database layer'],\n content: `Create a comprehensive plan before implementation.\n\n## Workflow\n\nFeature or task to plan: $ARGUMENTS\n\n1. UNDERSTAND: Clarify requirements through Socratic questioning\n2. RESEARCH: Check existing patterns and dependencies\n3. BREAK DOWN: Create 2-5 minute sub-tasks with:\n - Exact file paths\n - Expected changes\n - Verification steps\n4. DOCUMENT: Write plan to memory/plans/\n\n## Output Format\n\\`\\`\\`markdown\n# Plan: [Feature Name]\n\n## Overview\nBrief description of the goal.\n\n## Tasks\n1. [ ] Task 1 - file.ts\n2. [ ] Task 2 - component.tsx\n...\n\n## Dependencies\n- List dependencies\n\n## Risks\n- Potential issues\n\n## Verification\n- How to verify completion\n\\`\\`\\``,\n },\n {\n name: 'implement',\n description: 'Implement a planned task with TDD',\n category: 'core',\n usage: '/implement <task reference>',\n examples: ['/implement task-001', '/implement \"add login form\"'],\n content: `Implement a task following TDD principles.\n\n## Workflow\n\nTask reference or description: $ARGUMENTS\n\n1. LOAD: Get task details from .beads/ or plan\n2. TEST: Write failing tests first (RED)\n3. IMPLEMENT: Write minimal code to pass (GREEN)\n4. REFACTOR: Clean up while keeping tests green\n5. VERIFY: Run full test suite\n\n## Hard Gates\nBefore marking complete:\n- [ ] All new tests pass\n- [ ] No regressions\n- [ ] Type check passes\n- [ ] Linting passes`,\n },\n {\n name: 'finish',\n description: 'Complete a task with quality gates',\n category: 'core',\n usage: '/finish [task-id]',\n examples: ['/finish', '/finish task-001'],\n content: `Complete the current task with mandatory quality checks.\n\n## Hard Gates (Must ALL Pass)\n1. \\`npm run typecheck\\` - No type errors\n2. \\`npm run test\\` - All tests pass\n3. \\`npm run lint\\` - No linting errors\n4. \\`npm run build\\` - Build succeeds\n\n## Workflow\n1. Run all quality gates\n2. If any fail, report issues and stop\n3. If all pass, update task status to \"completed\"\n4. Create summary of changes\n5. Suggest commit message`,\n },\n {\n name: 'handoff',\n description: 'Create handoff bundle for session continuity',\n category: 'core',\n usage: '/handoff',\n examples: ['/handoff'],\n content: `Create a handoff bundle for context transfer to next session.\n\n## Workflow\n1. Summarize current progress\n2. Document:\n - What was completed\n - What remains\n - Current blockers\n - Key decisions made\n3. Save to memory/handoffs/[timestamp].md\n\n## Output Format\n\\`\\`\\`markdown\n# Handoff: [Date/Time]\n\n## Completed\n- List of completed items\n\n## In Progress\n- Current work state\n\n## Remaining\n- What still needs to be done\n\n## Context\n- Important context for next session\n\n## Next Steps\n- Recommended actions\n\\`\\`\\``,\n },\n {\n name: 'resume',\n description: 'Resume from last handoff',\n category: 'core',\n usage: '/resume',\n examples: ['/resume'],\n content: `Resume work from the most recent handoff.\n\n## Workflow\n1. Load latest handoff from memory/handoffs/\n2. Display summary to user\n3. Propose next actions\n4. Continue from where left off`,\n },\n {\n name: 'one-shot',\n description: 'End-to-end autonomous task execution (beta)',\n category: 'core',\n usage: '/one-shot <task description>',\n examples: ['/one-shot Add user authentication', '/one-shot Fix navigation bug'],\n content: `One-Shot Mode (beta) - End-to-end autonomous task execution.\n\n⚠️ This mode is experimental. Use for straightforward tasks first.\n\n## Workflow\n\nTask description: $ARGUMENTS\n\n**Phase 1: Requirements Gathering**\n- Interactive selection of task type (Feature, Bug Fix, Refactoring, etc.)\n- Scope clarification\n- Dependencies identification\n- Success criteria definition\n- User selects progress level (Minimal/Moderate/Detailed/Quiet)\n\n**Phase 2: Planning**\n- Delegate to @planner agent\n- Create detailed implementation plan\n- Recommend relevant skills and tools\n- Create Beads task for tracking\n\n**Phase 3: Complexity Check & Auto-Split**\n- Analyze task complexity\n- Split into multiple beads if needed:\n * Time > 30 minutes\n * >10 files affected\n * >500 lines to change\n * Touches >2 sub-systems\n\n**Phase 4: Execution**\n- Build dependency graph\n- Execute tasks in parallel (max 3 concurrent)\n- Dynamic agent selection (@build → @review → @scout → ...)\n- Integrate skills (TDD, debugging, etc.)\n- Smart terminal access (auto-allow/ask/forbid)\n\n**Phase 5: Enhanced Testing & Validation**\n- Auto-generate test scripts for new functionality\n- Run quality gates: typecheck, test, lint, build\n- Execute sample commands (with user approval)\n- Validate logs semantically with historical comparison\n- Retry loop (max 3 attempts) with:\n * Auto-fix type errors, lint errors\n * Alternative approaches from @review\n * User intervention on final failure\n\n**Phase 6: Multi-Level Verification**\n- All quality gates passed ✓\n- Manual verification confirmation\n- Deployment approval (if needed)\n- Rollback confirmation (if verification fails)\n\n**Phase 7: Completion**\n- Generate proof of completion\n * Files changed\n * Test results\n * Build output\n * Deployment status\n- Update Beads task → completed\n- Store proof in bead notes\n- Collect beta feedback\n\n## Quality Gates (Must ALL Pass)\n- \\`npm run typecheck\\` - No type errors\n- \\`npm run test\\` - All tests pass\n- \\`npm run lint\\` - No linting errors\n- \\`npm run build\\` - Build succeeds\n\n## Success Criteria\n- All tests passing\n- No regressions\n- Manual verification\n- Deployment complete (if applicable)\n- Beads task completed with proof\n\n## Error Handling\n- **Level 1**: Auto-fix (type errors, lint --fix)\n- **Level 2**: Alternative approach (@review delegation)\n- **Level 3**: User intervention + follow-up bead creation\n\n## Tips\n✓ Use for straightforward tasks first\n✓ Consider /plan + /implement for complex features\n✓ Review changes before final approval`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Quick Actions Commands\n */\nexport const QUICK_COMMANDS: DefaultCommand[] = [\n {\n name: 'fix',\n description: 'Quick fix for an issue',\n category: 'quick',\n usage: '/fix <issue description>',\n examples: ['/fix button not clickable', '/fix type error in auth.ts'],\n content: `Quick fix with minimal ceremony.\n\n## Workflow\n\nIssue description: $ARGUMENTS\n\n1. Identify issue\n2. Make minimal change to fix\n3. Verify fix works\n4. Run affected tests`,\n },\n {\n name: 'fix-types',\n description: 'Fix TypeScript type errors',\n category: 'quick',\n usage: '/fix-types [file]',\n examples: ['/fix-types', '/fix-types src/auth.ts'],\n content: `Fix TypeScript type errors systematically.\n\n## Workflow\n\nOptional file argument: $ARGUMENTS\n\n1. Run \\`npm run typecheck\\`\n2. Parse error output\n3. Fix each error in dependency order\n4. Verify all types pass`,\n },\n {\n name: 'fix-ci',\n description: 'Fix CI/CD pipeline failures',\n category: 'quick',\n usage: '/fix-ci',\n examples: ['/fix-ci'],\n content: `Diagnose and fix CI failures.\n\n## Workflow\n1. Check CI logs for errors\n2. Reproduce locally if possible\n3. Fix issues in order:\n - Type errors\n - Test failures\n - Lint errors\n - Build errors\n4. Verify full CI pipeline locally`,\n },\n {\n name: 'commit',\n description: 'Create a well-formatted commit',\n category: 'quick',\n usage: '/commit [message]',\n examples: ['/commit', '/commit \"feat: add login\"'],\n content: `Create a conventional commit.\n\n## Workflow\n\nOptional commit message: $ARGUMENTS\n\n1. Stage changes: \\`git add -A\\`\n2. Generate commit message following conventional commits:\n - feat: New feature\n - fix: Bug fix\n - docs: Documentation\n - refactor: Code refactoring\n - test: Adding tests\n - chore: Maintenance\n3. Commit with message`,\n },\n {\n name: 'pr',\n description: 'Create a pull request',\n category: 'quick',\n usage: '/pr [title]',\n examples: ['/pr', '/pr \"Add user authentication\"'],\n content: `Create a pull request with proper description.\n\n## Workflow\n\nOptional PR title: $ARGUMENTS\n\n1. Push current branch\n2. Generate PR description:\n - Summary of changes\n - Related issues\n - Testing done\n - Screenshots if UI changes\n3. Create PR via GitHub CLI or provide URL`,\n },\n {\n name: 'refactor',\n description: 'Refactor code to improve structure without changing behavior',\n category: 'quick',\n usage: '/refactor [file or pattern]',\n examples: ['/refactor src/utils.ts', '/refactor duplicate code'],\n content: `Refactor code following best practices.\n\n## Workflow\n\nOptional file or pattern: $ARGUMENTS\n\n1. Ensure tests are in place\n2. Identify refactoring opportunities\n3. Apply refactoring incrementally\n4. Run tests after each change\n5. Verify no behavior changes`,\n },\n {\n name: 'lint',\n description: 'Run linter and fix issues',\n category: 'quick',\n usage: '/lint [--fix]',\n examples: ['/lint', '/lint --fix'],\n content: `Run linter and optionally fix issues.\n\n## Workflow\n\nOptional flags: $ARGUMENTS\n\n1. Run linter: \\`npm run lint\\`\n2. Parse errors and warnings\n3. If --fix flag, run auto-fix\n4. Report remaining issues\n5. Suggest manual fixes if needed`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Research & Analysis Commands\n */\nexport const RESEARCH_COMMANDS: DefaultCommand[] = [\n {\n name: 'research',\n description: 'Deep research on a topic',\n category: 'research',\n usage: '/research <topic>',\n examples: ['/research React Server Components', '/research OAuth 2.0 best practices'],\n content: `Conduct thorough research and document findings.\n\n## Workflow\n\nResearch topic: $ARGUMENTS\n\n1. Search documentation and resources\n2. Find code examples and patterns\n3. Evaluate options and trade-offs\n4. Document findings in memory/research/\n\n## Output\n- Summary of findings\n- Recommended approach\n- Code examples\n- Links to resources`,\n },\n {\n name: 'analyze-project',\n description: 'Analyze project structure and patterns',\n category: 'research',\n usage: '/analyze-project',\n examples: ['/analyze-project'],\n content: `Comprehensive project analysis.\n\n## Workflow\n1. Scan directory structure\n2. Identify:\n - Tech stack\n - Architecture patterns\n - Key dependencies\n - Coding conventions\n3. Document findings in AGENTS.md`,\n },\n {\n name: 'review-codebase',\n description: 'Review codebase quality',\n category: 'research',\n usage: '/review-codebase [path]',\n examples: ['/review-codebase', '/review-codebase src/'],\n content: `Review codebase for quality issues.\n\n## Workflow\n\nOptional path: $ARGUMENTS\n\n1. Check code quality metrics\n2. Identify:\n - Code smells\n - Security issues\n - Performance concerns\n - Test coverage gaps\n3. Prioritize findings\n4. Suggest improvements`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Design & Planning Commands\n */\nexport const DESIGN_COMMANDS: DefaultCommand[] = [\n {\n name: 'design',\n description: 'Design a feature or system',\n category: 'design',\n usage: '/design <feature>',\n examples: ['/design notification system', '/design API gateway'],\n content: `Design a feature with thorough planning.\n\n## Workflow\n\nFeature to design: $ARGUMENTS\n\n1. Requirements gathering (Socratic questioning)\n2. Research existing solutions\n3. Design options with trade-offs\n4. Choose approach\n5. Document design in memory/\n\n## Output\n- Design document\n- Architecture diagrams (described)\n- API contracts\n- Data models`,\n },\n {\n name: 'brainstorm',\n description: 'Brainstorm ideas for a problem',\n category: 'design',\n usage: '/brainstorm <problem>',\n examples: ['/brainstorm user retention', '/brainstorm performance optimization'],\n content: `Collaborative brainstorming session.\n\n## Workflow\n\nProblem to brainstorm: $ARGUMENTS\n\n1. Define problem clearly\n2. Generate diverse ideas (no judgement)\n3. Group related ideas\n4. Evaluate feasibility\n5. Select top candidates`,\n },\n {\n name: 'analyze-figma',\n description: 'Analyze Figma design and extract design tokens using Figma API',\n category: 'design',\n usage: '/analyze-figma <figma-url>',\n examples: [\n '/analyze-figma https://www.figma.com/design/...',\n '/analyze-figma [figma-url]',\n ],\n content: `Analyze a Figma design and extract all design tokens automatically using Figma API.\n\n## Workflow\n\n**Step 1: Extract URL from User Input**\n\nThe Figma URL is provided in the SAME message as the command. Extract it:\n- Check the full user input message\n- Look for URL pattern: \\`https://www.figma.com/design/...\\` or \\`http://www.figma.com/design/...\\`\n- Extract the ENTIRE URL including all query parameters\n- If URL not found in current message, check previous messages\n\n**Step 2: Check Tool Configuration**\n\nBefore calling the tool, verify that Figma tool is configured:\n- If not configured, inform user to run: \\`aikit skills figma-analysis config\\`\n- The tool requires a Figma Personal Access Token\n\n**Step 3: Call MCP Tool**\n\n**CRITICAL**: You MUST use the MCP tool \\`tool_read_figma_design\\`, NOT web fetch!\n\n**The correct tool name is**: \\`tool_read_figma_design\\` (exposed via MCP)\n\n**DO NOT use**:\n- ❌ \\`read_figma_design\\` (wrong - missing \"tool_\" prefix)\n- ❌ \\`figma-analysis/read_figma_design\\` (wrong format)\n- ❌ Web fetch (file requires authentication)\n\n**DO use**:\n- ✅ \\`tool_read_figma_design\\` (correct MCP tool name)\n\nUse the MCP tool:\n\\`\\`\\`\nUse MCP tool: tool_read_figma_design\nArguments: { \"url\": \"[extracted URL]\" }\n\\`\\`\\`\n\nThe tool has the Figma API token configured and will authenticate automatically.\n\nThis tool will:\n1. Validate the Figma URL format\n2. Check if Figma tool is configured\n3. Call Figma API to fetch design data\n4. Extract design tokens:\n - Colors (from fills and strokes)\n - Typography (font families, sizes, weights, line heights)\n - Spacing system (8px grid detection)\n - Components (from Figma components)\n - Screens/Frames (dimensions and names)\n - Breakpoints (common responsive breakpoints)\n5. Return formatted markdown with all extracted tokens\n\n**Step 4: Format and Save**\n\nFormat extracted tokens as structured markdown:\n\\`\\`\\`markdown\n# Figma Design Analysis\n\n**Source**: [Figma URL]\n**Analyzed**: [Date]\n\n## Screens/Pages\n- [List all screens]\n\n## Color Palette\n### Primary Colors\n- Color Name: #hexcode\n[Continue for all colors]\n\n## Typography\n### Font Families\n- Primary: Font Name\n[Continue]\n\n### Font Sizes\n- Heading 1: 48px\n[Continue for all sizes]\n\n## Spacing System\n- Base unit: 8px\n- Values used: [list]\n\n## Component Structure\n- Header: [description]\n[Continue for all components]\n\n## Layout Grid\n- Container max-width: [value]\n- Columns: [value]\n\n## Responsive Breakpoints\n- Mobile: [range]\n- Tablet: [range]\n- Desktop: [range]\n\n## Assets Needed\n### Images\n- [List]\n\n### Icons\n- [List]\n\n### Fonts\n- [List]\n\\`\\`\\`\n\nSave to memory using memory-update tool:\n\\`\\`\\`\nUse tool: memory-update\nArguments: {\n \"key\": \"research/figma-analysis\",\n \"content\": \"[formatted markdown]\"\n}\n\\`\\`\\`\n\n**Step 5: Report Results**\n\nSummarize what was extracted:\n- Number of colors found\n- Number of typography styles\n- Number of components\n- Number of screens/frames\n- Confirm save location: \\`memory/research/figma-analysis.md\\`\n\n## Important Notes\n\n- **DO NOT** ask user to provide URL again - extract it from input\n- **DO NOT** wait - start immediately after extracting URL\n- The URL is in the SAME message as the command\n- The tool uses Figma API, so the file must be accessible with your API token\n- If the tool returns an error about configuration, guide user to run: \\`aikit skills figma-analysis config\\`\n- If the tool returns an error about access, verify the file is accessible with your token\n\nThe analysis will be saved automatically for later reference.`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Git & Version Control Commands\n */\nexport const GIT_COMMANDS: DefaultCommand[] = [\n {\n name: 'branch',\n description: 'Create a new feature branch',\n category: 'git',\n usage: '/branch <name>',\n examples: ['/branch feat/auth', '/branch fix/navigation-bug'],\n content: `Create and switch to a new branch.\n\n## Workflow\n\nBranch name: $ARGUMENTS\n\n1. Ensure clean working directory\n2. Pull latest main/master\n3. Create branch with naming convention:\n - feat/* for features\n - fix/* for bug fixes\n - refactor/* for refactoring\n - docs/* for documentation\n4. Switch to new branch`,\n },\n {\n name: 'merge',\n description: 'Merge current branch to target',\n category: 'git',\n usage: '/merge [target]',\n examples: ['/merge', '/merge main'],\n content: `Merge current branch to target.\n\n## Workflow\n\nOptional target branch: $ARGUMENTS\n\n1. Run quality gates first\n2. Commit any pending changes\n3. Switch to target branch\n4. Pull latest\n5. Merge feature branch\n6. Resolve conflicts if any\n7. Push`,\n },\n {\n name: 'git:ignore-init',\n description: 'Initialize AI-safe .gitignore patterns',\n category: 'git',\n usage: '/git:ignore-init',\n examples: ['/git:ignore-init'],\n content: `Initialize AI-safe .gitignore patterns to prevent AI from accessing sensitive files.\n\n## Workflow\n\n1. **Check Existing .gitignore**: See if .gitignore exists\n2. **Backup**: Create .gitignore.backup if file exists\n3. **Append Patterns**: Add AI-specific ignore patterns\n4. **Verify**: Confirm patterns added successfully\n\n## Patterns Added\n\n**AI-Sensitive Files:**\n\\`\\`\\`\n# AIKit - AI Agent Protection\n.env\n.env.local\n.env.*.local\n*.key\n*.pem\nsecrets/\ncredentials/\n.aws/\n.ssh/\nconfig/secrets.json\n\n# AI Working Directories\n.aikit/memory/\n.aikit/checkpoints/\n.aikit/sessions/\n\n# Claude Code\n.claude/settings.json\n.claude/local_history.json\n\n# OpenCode\n.opencode/config.json\n.opencode/state.json\n\n# Agent-Specific\n.agentignore\n.aiignore\n\n# Logs and Debug\n*.log\nlogs/\ndebug.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Temporary Files\n*.tmp\n*.temp\n.cache/\ntemp/\ntmp/\n\\`\\`\\`\n\n**Explanation of Each Pattern:**\n- **Credentials**: API keys, tokens, certificates\n- **Config**: Sensitive configuration files\n- **Memory**: AI conversation history and context\n- **Sessions**: Active AI session data\n- **Logs**: Debug and error logs\n- **Temp**: Temporary processing files\n\n**Why These Patterns?**\n- Prevent AI from reading API keys and secrets\n- Avoid exposing sensitive user data\n- Reduce AI context noise (logs, cache)\n- Protect privacy\n- Comply with security best practices\n\n## Verification\n\n**After Running Command:**\n\\`\\`\\`\n✓ AI-safe patterns added to .gitignore\n✓ Backup created: .gitignore.backup\n✓ Protected: API keys, secrets, memory, logs\n✓ Safe to commit code\n\\`\\`\\`\n\n## Notes\n- Patterns appended to existing .gitignore\n- Doesn't remove existing patterns\n- Can be manually customized after creation\n- Recommend reviewing before committing`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Utility Commands\n */\nexport const UTILITY_COMMANDS: DefaultCommand[] = [\n {\n name: 'status',\n description: 'Show current status overview',\n category: 'utility',\n usage: '/status',\n examples: ['/status'],\n content: `Display comprehensive status.\n\n## Shows\n- Current task (from Beads)\n- Git status\n- Active branch\n- Pending changes\n- Test status\n- Recent activity`,\n },\n {\n name: 'help',\n description: 'Show available commands',\n category: 'utility',\n usage: '/help [command]',\n examples: ['/help', '/help plan'],\n content: `Display help information.\n\nIf no command specified, list all available commands.\nIf command specified, show detailed help for that command.`,\n },\n {\n name: 'test',\n description: 'Run tests and show results',\n category: 'utility',\n usage: '/test [pattern]',\n examples: ['/test', '/test auth', '/test --watch'],\n content: `Run test suite and display results.\n\n## Workflow\n\nOptional pattern: $ARGUMENTS\n\n1. Run test command: \\`npm run test\\`\n2. Parse and display results\n3. Show coverage if available\n4. Highlight failures\n5. Suggest fixes for failures`,\n },\n {\n name: 'deploy',\n description: 'Deploy application to production',\n category: 'utility',\n usage: '/deploy [environment]',\n examples: ['/deploy', '/deploy staging', '/deploy production'],\n content: `Deploy application with quality checks.\n\n## Workflow\n\nOptional environment: $ARGUMENTS\n\n1. Run quality gates (test, lint, build)\n2. Check for uncommitted changes\n3. Build production bundle\n4. Deploy to target environment\n5. Verify deployment success`,\n },\n {\n name: 'rollback',\n description: 'Rollback to previous deployment',\n category: 'utility',\n usage: '/rollback [version]',\n examples: ['/rollback', '/rollback v1.2.3'],\n content: `Rollback to previous version.\n\n## Workflow\n\nOptional version: $ARGUMENTS\n\n1. Identify current version\n2. List available versions\n3. Confirm rollback target\n4. Execute rollback\n5. Verify rollback success`,\n },\n {\n name: 'logs',\n description: 'View application logs',\n category: 'utility',\n usage: '/logs [--tail] [--follow]',\n examples: ['/logs', '/logs --tail 100', '/logs --follow'],\n content: `View and filter application logs.\n\n## Workflow\n\nOptional flags: $ARGUMENTS\n\n1. Determine log location\n2. Apply filters if specified\n3. Display logs\n4. If --follow, stream updates\n5. Format for readability`,\n },\n {\n name: 'create-agent',\n description: 'Create a custom AI agent with specific capabilities',\n category: 'utility',\n usage: '/create-agent <name> [description]',\n examples: ['/create-agent security \"Security audit agent\"', '/create-agent writer'],\n content: `Create a custom AI agent for specialized tasks.\n\n## Workflow\n\nAgent name: $ARGUMENTS\n\n1. **Determine Agent Purpose**: Ask user clarifying questions:\n - What specific tasks will this agent handle?\n - What expertise should it have?\n - What tools should it have access to?\n - Any specific behaviors or constraints?\n\n2. **Generate Agent Configuration**:\n - System prompt with instructions\n - Recommended tools/skills\n - Preferred models\n - Interaction patterns\n\n3. **Create Agent File**: Save to .aikit/agents/<name>.md\n - Frontmatter with metadata\n - System prompt\n - Tool recommendations\n - Usage examples\n\n4. **Verify Creation**: Confirm agent created successfully\n\n## Agent Template\n\n**Frontmatter:**\n\\`\\`\\`yaml\n---\nname: <agent-name>\ndescription: <what this agent does>\nuseWhen: <when to use this agent>\nmode: subagent\ntools: [list of tools]\nskills: [list of skills]\n---\n\\`\\`\\`\n\n**System Prompt:**\n\\`\\`\\`\n# Agent Name\n\nYou are a specialized AI agent for <specific domain>.\n\n## Your Expertise\n- Expertise area 1\n- Expertise area 2\n- Expertise area 3\n\n## Your Role\n1. Primary responsibility\n2. Secondary tasks\n3. Collaboration with other agents\n\n## Guidelines\n- How to approach tasks\n- What to focus on\n- What to avoid\n\n## Tools You Have Access To\n- Tool 1: description\n- Tool 2: description\n\n## Output Format\n- Preferred response format\n- Code style (if applicable)\n- Explanation style\n\\`\\`\\`\n\n## Example Agents\n\n**Security Agent:**\n- Focuses on code security vulnerabilities\n- Tools: static analysis, dependency checker\n- Skills: security-audit, code-review\n\n**Performance Agent:**\n- Focuses on optimization\n- Tools: profiler, benchmark\n- Skills: performance-optimization\n\n**Documentation Agent:**\n- Focuses on writing clear docs\n- Tools: markdown formatter\n- Skills: documentation\n\n## Notes\n- Agents are saved as markdown files\n- Can be customized after creation\n- Used with /agent or agent delegation\n- Appear in agent selector in OpenCode`,\n },\n {\n name: 'list-agents',\n description: 'List all available custom agents',\n category: 'utility',\n usage: '/list-agents',\n examples: ['/list-agents'],\n content: `List all available custom agents with descriptions.\n\n## Workflow\n\n1. **Scan Agents Directory**: Find all agent files in .aikit/agents/\n2. **Parse Metadata**: Extract agent descriptions and use cases\n3. **Categorize**: Group by type/purpose\n4. **Display**: Show formatted list with details\n\n## Output Format\n\n\\`\\`\\`\nAvailable Agents:\n\n### Development Agents\n• security - Security vulnerability scanner\n Use when: Reviewing code for security issues\n Skills: security-audit, code-review\n Tools: static-analysis, dependency-checker\n\n• performance - Performance optimization specialist\n Use when: Optimizing slow code or databases\n Skills: performance-optimization, database-design\n Tools: profiler, query-analyzer\n\n### Documentation Agents\n• writer - Technical documentation writer\n Use when: Creating or updating docs\n Skills: documentation\n Tools: markdown-formatter\n\n### Design Agents\n• ui-ux - UI/UX design reviewer\n Use when: Reviewing interface designs\n Skills: accessibility, frontend-aesthetics\n\nTotal: 4 agents\n\nCreate a new agent: /create-agent <name>\n\\`\\`\\`\n\n## Agent Information Shown\n- Agent name\n- Description\n- When to use it\n- Required skills\n- Available tools\n- Category/type\n\n## Notes\n- Built-in agents (plan, build, review, etc.) also shown\n- Custom agents appear after built-in ones\n- Use /agent <name> to invoke specific agent\n- Can view full agent file for details`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Checkpoint Commands\n */\nexport const CHECKPOINT_COMMANDS: DefaultCommand[] = [\n {\n name: 'checkpoint:create',\n description: 'Save current state as a checkpoint',\n category: 'checkpoint',\n usage: '/checkpoint:create [message]',\n examples: ['/checkpoint:create', '/checkpoint:create \"Before refactoring\"'],\n content: `Create a checkpoint of the current working state.\n\n## Workflow\n\nOptional message: $ARGUMENTS\n\n1. **Check Git Status**: Verify clean or staged state\n2. **Create Checkpoint**:\n - Generate checkpoint ID (timestamp-based)\n - Save git diff or uncommitted changes\n - Save current branch name\n - Save list of modified files\n - Save user's message (if provided)\n3. **Store Checkpoint**: Save to .aikit/checkpoints/checkpoint-{id}.json\n4. **Confirm**: Display checkpoint ID and summary\n\n## Checkpoint Contents\n- Timestamp\n- Git branch\n- Git commit hash (if any)\n- Uncommitted changes (diff)\n- Modified files list\n- User message\n- Beads task state (if active)\n\n## Example Output\n\\`\\`\\`\nCheckpoint created: checkpoint-20250102-143022\nMessage: Before refactoring\nFiles modified: 5 files\n\\`\\`\\`\n\n## Notes\n- Checkpoints are stored locally in .aikit/checkpoints/\n- Git changes are preserved (not committed)\n- Use for experimentation - safely restore if things go wrong\n- Checkpoints include full state, not just git`,\n },\n {\n name: 'checkpoint:restore',\n description: 'Restore to a previous checkpoint',\n category: 'checkpoint',\n usage: '/checkpoint:restore [checkpoint-id]',\n examples: ['/checkpoint:restore', '/checkpoint:restore checkpoint-20250102-143022', '/checkpoint:restore latest'],\n content: `Restore the project state from a checkpoint.\n\n## Workflow\n\nCheckpoint ID: $ARGUMENTS (default: latest)\n\n1. **Find Checkpoint**:\n - If no ID provided, find latest checkpoint\n - Verify checkpoint file exists\n2. **Display Summary**: Show what will be restored\n3. **Confirm with User**: Ask for confirmation before proceeding\n4. **Restore State**:\n - Clean working directory (remove uncommitted changes)\n - Checkout git commit from checkpoint\n - Apply uncommitted changes from checkpoint\n - Restore Beads task state if available\n5. **Verify**: Confirm restoration successful\n\n## Safety Checks\n- Warn if current changes will be lost\n- Show diff between current and checkpoint\n- Require explicit user confirmation\n- Backup current state before restoring\n\n## Example Output\n\\`\\`\\`\nRestoring checkpoint: checkpoint-20250102-143022\nMessage: Before refactoring\nFiles modified: 5 files\n\n⚠️ Warning: Uncommitted changes will be lost\nProceed? (yes/no)\n\n✓ Restored successfully\n\\`\\`\\`\n\n## Notes\n- Current uncommitted changes will be lost\n- Git history is preserved\n- Beads tasks will be restored to checkpointed state`,\n },\n {\n name: 'checkpoint:list',\n description: 'List all available checkpoints',\n category: 'checkpoint',\n usage: '/checkpoint:list',\n examples: ['/checkpoint:list'],\n content: `List all saved checkpoints with details.\n\n## Workflow\n\n1. **Scan Checkpoints Directory**: Find all checkpoint files in .aikit/checkpoints/\n2. **Sort by Date**: Most recent first\n3. **Display Summary**: Show table/list of checkpoints\n\n## Output Format\n\\`\\`\\`\nAvailable Checkpoints:\n\n1. checkpoint-20250102-143022\n Date: 2025-01-02 14:30:22\n Message: Before refactoring\n Branch: feature/user-auth\n Files: 5 modified\n Size: 2.3MB\n\n2. checkpoint-20250102-120815\n Date: 2025-01-02 12:08:15\n Message: Initial implementation\n Branch: main\n Files: 12 modified\n Size: 5.1MB\n\nTotal: 2 checkpoints\n\\`\\`\\`\n\n## Filtering Options (future)\n- Filter by branch\n- Filter by date range\n- Filter by message content\n- Show only checkpoints with specific files\n\n## Notes\n- Checkpoints are stored in .aikit/checkpoints/\n- Older checkpoints can be manually deleted\n- Use /checkpoint:restore <id> to restore\n- Use /checkpoint:restore latest for most recent`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Session Management Commands\n */\nexport const SESSION_COMMANDS: DefaultCommand[] = [\n {\n name: 'session:start',\n description: 'Start a new development session',\n category: 'session',\n usage: '/session:start [name]',\n examples: [\n '/session:start',\n '/session:start authentication-refactor',\n '/session:start \"Add user profile feature\"',\n ],\n content: `Start a new development session to track your work.\n\n## Workflow\n\nSession name: $ARGUMENTS\n\n1. **Create Session:**\n - Generate session ID with timestamp\n - Create session file in .aikit/sessions/\n - Track active session in .current-session\n - Capture initial git state\n\n2. **Set Goals:**\n - Ask user for session goals if not provided\n - Document what you want to accomplish\n - Link to Beads task if active\n\n3. **Session Started:**\n - Session ID: YYYY-MM-DD-HHMM[-name]\n - Status: active\n - Ready for updates\n\n## What Gets Tracked\n- Session start time\n- Git branch and commits\n- Modified files\n- Progress notes\n- Linked Beads task\n\n## Session File Location\n.aikit/sessions/YYYY-MM-DD-HHMM[-name].md\n\n## Examples\n\nStart unnamed session:\n\\`\\`\\`\n/session:start\n\\`\\`\\`\n\nStart with descriptive name:\n\\`\\`\\`\n/session:start auth-refactor\n\\`\\`\\`\n\nStart with goal:\n\\`\\`\\`\n/session:start \"Implement OAuth 2.0\"\nGoals:\n- Add Google OAuth\n- Add JWT token handling\n\\`\\`\\`\n\n## Notes\n- Session files are markdown with frontmatter\n- Sessions persist across AI conversations\n- Use /session:update to add progress notes\n- Use /session:end to close and summarize`,\n },\n {\n name: 'session:update',\n description: 'Add progress notes to current session',\n category: 'session',\n usage: '/session:update [notes]',\n examples: [\n '/session:update',\n '/session:update Fixed authentication bug',\n '/session:update \"Added JWT middleware\"',\n ],\n content: `Update the current session with progress notes.\n\n## Workflow\n\nProgress notes: $ARGUMENTS\n\n1. **Check Active Session:**\n - Verify there's an active session\n - Load session file\n\n2. **Capture Current State:**\n - Get current git branch\n - Count git commits\n - List modified files\n - Check active Beads task\n\n3. **Add Update:**\n - Add timestamped update entry\n - Include your notes (or auto-generate)\n - Include git state\n - Include Beads task if active\n\n4. **Save Session:**\n - Update session file\n - Confirm update added\n\n## What Gets Captured\n- Timestamp of update\n- Your progress notes\n- Current git branch\n- Number of commits\n- List of modified files\n- Active Beads task (if any)\n\n## Examples\n\nAuto-update (no notes):\n\\`\\`\\`\n/session:update\n\\`\\`\\`\n*Auto-generates summary of recent work*\n\nWith specific notes:\n\\`\\`\\`\n/session:update Fixed Next.js params issue\n\\`\\`\\`\n\nWith detailed notes:\n\\`\\`\\`\n/session:update \"Implemented OAuth flow with Google provider. Added callback handler and token validation.\"\n\\`\\`\\`\n\n## Notes\n- Must have active session first\n- Updates are timestamped\n- Git state automatically captured\n- Beads task automatically linked`,\n },\n {\n name: 'session:end',\n description: 'End current session with summary',\n category: 'session',\n usage: '/session:end',\n examples: ['/session:end'],\n content: `End the current session and generate a comprehensive summary.\n\n## Workflow\n\n1. **Check Active Session:**\n - Verify there's an active session\n - Load session data\n\n2. **Generate Summary:**\n - Calculate session duration\n - Review all progress notes\n - Check goals completion\n - Count git commits\n - List modified files\n - Identify key accomplishments\n\n3. **Create Summary Section:**\n - Duration\n - Goals status\n - Total updates\n - Git summary\n - Key accomplishments\n - Problems solved\n - Lessons learned\n\n4. **Close Session:**\n - Mark session as ended\n - Set end time\n - Save session file\n - Clear .current-session tracker\n\n## Summary Includes\n\n**Session Info:**\n- Duration (hours and minutes)\n- Start and end times\n- Session name\n\n**Goals:**\n- List of all goals\n- Completion status\n\n**Progress:**\n- Number of updates\n- Key accomplishments\n- Problems and solutions\n\n**Git Activity:**\n- Total commits\n- Files modified\n- Branch worked on\n\n**Beads Task:**\n- Linked task ID and status\n\n## Example Output\n\\`\\`\\`\nSession ended: 2025-01-02-1430-auth-refactor\nDuration: 2h 30m\n\nGoals:\n- Refactor OAuth flow ✅\n- Add JWT support ✅\n\nUpdates: 5\nCommits: 3\nFiles Modified: 7\n\nSummary:\nSuccessfully refactored authentication system with OAuth 2.0\nand JWT token support. Resolved Next.js 15 async issues.\n\nLessons:\n- Next.js 15 requires await for params\n- JWT middleware order matters\n\\`\\`\\`\n\n## Notes\n- Session cannot be updated after ending\n- Summary is automatically generated\n- Session file persists for future reference\n- Can start new session after ending`,\n },\n {\n name: 'session:current',\n description: 'Show current active session',\n category: 'session',\n usage: '/session:current',\n examples: ['/session:current'],\n content: `Display information about the current active session.\n\n## Workflow\n\n1. **Check Active Session:**\n - Read .current-session file\n - Load session data\n\n2. **Display Session Info:**\n - Session name and ID\n - How long session has been active\n - Session goals\n - Recent updates (last 3)\n - Current git state\n - Active Beads task\n\n3. **Show Actions:**\n - Available session commands\n - Quick reminder to update/end\n\n## Example Output\n\\`\\`\\`\n📍 Current Session\n\nSession: authentication-refactor\nID: 2025-01-02-1430-auth-refactor\nStarted: 2 hours ago\n\nGoals:\n- [ ] Refactor OAuth flow\n- [x] Add JWT support\n\nRecent Updates:\n15:45 - Implemented OAuth 2.0 with Google\n16:20 - Added JWT token generation\n\nGit:\n- Branch: feature/auth\n- Commits: 3\n- Modified: 5 files\n\nBeads Task:\n- bead-001 (in-progress)\n\nCommands:\n/session:update [notes] - Add progress\n/session:end - Close session\n\\`\\`\\`\n\n## Notes\n- Shows error if no active session\n- Use to quickly check session status\n- Displays recent progress`,\n },\n {\n name: 'session:list',\n description: 'List all sessions',\n category: 'session',\n usage: '/session:list',\n examples: ['/session:list'],\n content: `List all development sessions with summaries.\n\n## Workflow\n\n1. **Scan Sessions Directory:**\n - Find all .md files in .aikit/sessions/\n - Exclude .current-session\n\n2. **Sort by Date:**\n - Newest sessions first\n\n3. **Display Summary:**\n - Session ID and name\n - Start and end times\n - Status (active/ended)\n - Number of updates\n - Session goals\n\n## Example Output\n\\`\\`\\`\n📚 All Sessions\n\n1. 2025-01-02-1430-auth-refactor\n Status: Active\n Started: 2 hours ago\n Updates: 5\n Goals: Refactor OAuth, Add JWT\n\n2. 2025-01-02-1200-bug-fix\n Status: Ended\n Started: Today 12:00\n Ended: Today 13:30 (1h 30m)\n Updates: 3\n Goals: Fix email bounce handling\n\n3. 2025-01-01-1530-feature-user-profile\n Status: Ended\n Started: Yesterday 15:30\n Ended: Yesterday 18:45 (3h 15m)\n Updates: 8\n Goals: Add user profile page\n\nTotal: 3 sessions\n\\`\\`\\`\n\n## Notes\n- Shows both active and ended sessions\n- Most recent sessions first\n- Active session highlighted\n- Use /session:show <id> for details`,\n },\n {\n name: 'session:show',\n description: 'Show details of a specific session',\n category: 'session',\n usage: '/session:show <session-id>',\n examples: [\n '/session:show 2025-01-02-1430',\n '/session:show 2025-01-02-1430-auth-refactor',\n ],\n content: `Display full details of a specific session.\n\n## Workflow\n\nSession ID: $ARGUMENTS\n\n1. **Load Session:**\n - Find session file\n - Parse session data\n\n2. **Display Details:**\n - Session metadata\n - All progress notes\n - Git activity timeline\n - Summary (if ended)\n\n3. **Format Output:**\n - Readable markdown format\n - Chronological updates\n - Key accomplishments\n\n## Example Output\n\\`\\`\\`\n📄 Session: 2025-01-02-1430-auth-refactor\n\nStatus: Ended\nStarted: 2025-01-02 14:30\nEnded: 2025-01-02 17:00\nDuration: 2h 30m\n\nGoals:\n- [x] Refactor OAuth flow\n- [x] Add JWT support\n\n## Progress\n\n### 2025-01-02 14:30\nStarted session: authentication-refactor\nGit Branch: feature/auth\n\n### 2025-01-02 15:45\nImplemented OAuth 2.0 flow with Google provider\nAdded callback handler and token validation\nGit Branch: feature/auth\n\n### 2025-01-02 16:20\nAdded JWT token generation and validation\nCreated middleware for protected routes\nGit Branch: feature/auth\n\n### 2025-01-02 17:00\nSession ended\n\n## Summary\nDuration: 2h 30m\nGoals: 2\nUpdates: 4\nGit Commits: 3\nFiles Modified: 7\n\nSuccessfully refactored authentication system...\n\\`\\`\\`\n\n## Notes\n- Use session ID or partial ID\n- Shows all updates chronologically\n- Full session details displayed`,\n },\n {\n name: 'session:search',\n description: 'Search sessions by keyword',\n category: 'session',\n usage: '/session:search <query>',\n examples: [\n '/session:search oauth',\n '/session:search \"jwt\"',\n '/session:search authentication',\n ],\n content: `Search for sessions matching a keyword.\n\n## Workflow\n\nSearch query: $ARGUMENTS\n\n1. **Search Sessions:**\n - Search in session names\n - Search in session IDs\n - Search in goals\n - Search in update notes\n\n2. **Display Results:**\n - Matching sessions\n - Highlight match context\n - Sort by date\n\n3. **Show Actions:**\n - List matching sessions\n - Suggest /session:show for details\n\n## Example Output\n\\`\\`\\`\n🔍 Search Results: \"oauth\"\n\nFound 2 sessions:\n\n1. 2025-01-02-1430-auth-refactor\n Match: Name contains \"oauth\" (case-insensitive)\n Started: 2 hours ago\n Status: Active\n Goals: Refactor OAuth flow, Add JWT\n\n2. 2025-01-01-1200-oauth-fix\n Match: Goals contain \"OAuth\"\n Started: Yesterday\n Status: Ended\n Goals: Fix OAuth callback\n\nTotal: 2 matching sessions\n\\`\\`\\`\n\n## Notes\n- Case-insensitive search\n- Searches name, goals, and notes\n- Shows matching context\n- Use partial IDs too`,\n },\n {\n name: 'session:resume',\n description: 'Resume a past session (load context)',\n category: 'session',\n usage: '/session:resume <session-id>',\n examples: [\n '/session:resume latest',\n '/session:resume 2025-01-02-1430',\n '/session:resume 2025-01-02-1430-auth-refactor',\n ],\n content: `Load context from a past session to resume work.\n\n## Workflow\n\nSession ID: $ARGUMENTS (or \"latest\")\n\n1. **Find Session:**\n - If \"latest\", load most recent session\n - Otherwise, load specified session\n\n2. **Load Context:**\n - Display session summary\n - Show what was accomplished\n - Show what's remaining\n - List key decisions made\n\n3. **Suggest Next Actions:**\n - Based on session goals\n - Based on remaining tasks\n - Based on session end notes\n\n4. **Display Session:**\n - Full session details\n - All progress notes\n - Git activity\n - Summary and lessons\n\n## Example Output\n\\`\\`\\`\n🔄 Resuming Session: 2025-01-02-1430-auth-refactor\n\n## What Was Done\n✓ Refactored OAuth flow\n✓ Added JWT middleware\n✓ Fixed Next.js 15 issues\n\n## What Remains\n○ Add refresh token support\n○ Write tests for auth module\n○ Update documentation\n\n## Key Decisions\n- Used next-auth for OAuth\n- JWT middleware order: auth → validate → route\n- Next.js 15 requires async params\n\n## Problems Solved\n- Next.js 15 params Promise issue\n- Cookie domain configuration\n- JWT secret from env var\n\n## Suggested Next Steps\n1. Add refresh token rotation\n2. Write unit tests for auth\n3. Update API documentation\n4. Deploy to staging for testing\n\nSession context loaded! Ready to continue.\n\\`\\`\\`\n\n## Notes\n- Use \"latest\" for most recent session\n- Loads full context for continuity\n- Suggests next actions based on goals\n- Great for picking up after a break`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Draw.io Diagram Commands\n */\nexport const DRAWIO_COMMANDS: DefaultCommand[] = [\n {\n name: 'drawio-interact',\n description: 'Create/edit diagrams with AI + Draw.io + auto-sync',\n category: 'design',\n usage: '/drawio-interact <create|modify|list|start-sync|stop-sync> [diagram-name]',\n examples: [\n '/drawio-interact create login-flow',\n '/drawio-interact modify login-flow',\n '/drawio-interact list',\n '/drawio-interact start-sync',\n '/drawio-interact stop-sync',\n ],\n content: `Interactive diagram workflow with AI + Draw.io + background sync.\n\n**User provided**: $ARGUMENTS\n\n## File Locations\n\n**NEW STRUCTURE**:\n- **Mermaid files**: \\`mermaid/[name].mmd\\` (project root, version control)\n- **Draw.io files**: \\`.aikit/assets/drawio/[name].drawio\\` (visual editing)\n\n**Background Sync**:\n- Auto-syncs changes between both formats\n- Runs as background service\n- Detects changes in real-time\n\n## Workflow\n\n### Step 1: Parse User Intent\n\nCheck if user wants to:\n- **create** - Generate new diagram and open in Draw.io\n- **modify** - Manual sync (if background sync not running)\n- **list** - Show all existing diagrams\n- **start-sync** - Start background sync service\n- **stop-sync** - Stop background sync service\n\n### Step 2: Create Diagram (if \"create\")\n\n**Action**: Generate diagram from description, create files, open in Draw.io\n\n1. **Extract diagram name** from arguments\n - \"create login-flow\" → name = \"login-flow\"\n - If no name provided, ask user\n\n2. **Generate Mermaid code** based on description:\n - Login/auth → Flowchart with authentication\n - Order/purchase → Flowchart with payment\n - API/request → Sequence diagram\n - Generic → Basic flowchart\n\n3. **Create files**:\n - \\`mermaid/[name].mmd\\` - Mermaid source\n - \\`.aikit/assets/drawio/[name].drawio\\` - Draw.io XML\n\n4. **Open in Draw.io with auto-sync**:\n - Use lifecycle manager for automatic sync start/stop\n - Sync starts when Draw.io opens\n - Sync stops when Draw.io closes\n - No manual intervention needed!\n\n**Implementation**: Use lifecycle manager\n\n\\`\\`\\`javascript\nimport { openDrawioWithAutoSync } from '.aikit/tools/drawio-sync/lifecycle-manager.js';\nimport { join } from 'path';\n\nconst projectRoot = process.cwd();\nconst drawioPath = join(projectRoot, '.aikit/assets/drawio', \\`\\${name}.drawio\\`);\n\n// This will:\n// 1. Start sync service automatically\n// 2. Open Draw.io app\n// 3. Monitor Draw.io process\n// 4. Stop sync when Draw.io closes\nawait openDrawioWithAutoSync(drawioPath);\n\\`\\`\\`\n\n**What happens**:\n- ✅ Sync service starts automatically\n- ✅ Draw.io opens\n- ✅ Files stay in sync while editing\n- ✅ Sync stops automatically when Draw.io closes\n- ✅ Zero manual intervention!\n\n5. **Report success**:\n - Show generated Mermaid code\n - Confirm file locations\n - Confirm Draw.io opened with auto-sync\n - Inform user: \"Sync will stop automatically when you close Draw.io\"\n\n### Step 3: Modify Diagram (if \"modify\")\n\n**Action**: Manual one-time sync (use if background sync not running)\n\n1. **Extract diagram name**\n2. **Read files**:\n - \\`mermaid/[name].mmd\\`\n - \\`.aikit/assets/drawio/[name].drawio\\`\n\n3. **Convert Draw.io → Mermaid**\n4. **Detect changes**\n5. **Update Mermaid file**\n6. **Report changes**\n\n**Note**: If background sync is running, this is automatic!\n\n### Step 4: List Diagrams (if \"list\")\n\n**Action**: Show all diagrams\n\n\\`\\`\\`bash\nls mermaid/*.mmd 2>/dev/null | sed 's/mermaid\\\\///' | sed 's/.mmd$//'\n\\`\\`\\`\n\nFormat as numbered list with file info.\n\n### Step 5: Start Sync (if \"start-sync\")\n\n**Action**: Start background sync service\n\n1. **Check if service already running**\n2. **Start Chokidar file watcher**:\n - Watch \\`mermaid/*.mmd\\`\n - Watch \\`.aikit/assets/drawio/*.drawio\\`\n3. **Auto-sync on change**:\n - Debounce: 500ms\n - Lock files during sync to prevent loops\n - Log all changes\n4. **Report**: \"Background sync running\"\n\n**Implementation**: Use .aikit/tools/drawio-sync/sync-service.js\n\n\\`\\`\\`javascript\nimport { startSyncService } from '.aikit/tools/drawio-sync/sync-service.js';\nstartSyncService();\n\\`\\`\\`\n\n### Step 6: Stop Sync (if \"stop-sync\")\n\n**Action**: Stop background sync service\n\n\\`\\`\\`javascript\nimport { stopSyncService } from '.aikit/tools/drawio-sync/sync-service.js';\nstopSyncService();\n\\`\\`\\`\n\n## Conversion Tools\n\n**Location**: \\`.aikit/tools/drawio-sync/\\`\n\n**Modules**:\n- \\`mermaid-to-drawio.js\\` - Mermaid → Draw.io conversion\n- \\`drawio-to-mermaid.js\\` - Draw.io → Mermaid conversion\n- \\`sync-service.js\\` - Background sync service\n- \\`lifecycle-manager.js\\` - **NEW!** Automatic lifecycle (start/stop sync with Draw.io)\n\n**Lifecycle Manager Usage** (recommended for \"create\" command):\n\\`\\`\\`javascript\nimport { openDrawioWithAutoSync } from '.aikit/tools/drawio-sync/lifecycle-manager.js';\nimport { join } from 'path';\n\nconst drawioPath = join(process.cwd(), '.aikit/assets/drawio', name + '.drawio');\n\n// Automatically:\n// - Starts sync when Draw.io opens\n// - Stops sync when Draw.io closes\nawait openDrawioWithAutoSync(drawioPath);\n\\`\\`\\`\n\n**Manual Conversion** (for \"modify\" command):\n\\`\\`\\`javascript\nimport { convertMermaidToDrawio } from '.aikit/tools/drawio-sync/mermaid-to-drawio.js';\nimport { convertDrawioToMermaid } from '.aikit/tools/drawio-sync/drawio-to-mermaid.js';\n\n// Mermaid → Draw.io\nconst result = convertMermaidToDrawio(mermaidCode, diagramName);\nfs.writeFileSync('.aikit/assets/drawio/name.drawio', result.xml, 'utf-8');\n\n// Draw.io → Mermaid\nconst result = convertDrawioToMermaid(drawioXML);\nfs.writeFileSync('mermaid/name.mmd', result.code, 'utf-8');\n\\`\\`\\`\n\n## Error Handling\n\n**If sync fails**:\n1. Log error to console\n2. Show notification: \"Sync failed for [name]\"\n3. **Ask user**:\n - Ignore this error?\n - Retry sync?\n - Let AI fix it?\n\n**AI Fix Option**:\n- Analyze error\n- Attempt to fix common issues:\n - Malformed Mermaid syntax\n - Invalid XML characters\n - Encoding issues\n - Missing nodes\n- Retry sync after fix\n- Report result\n\n## Example Session\n\n\\`\\`\\`\nUser: /drawio-interact create user-authentication\n\nAI: Creating diagram: user-authentication\n\n📄 Generated Mermaid Code:\ngraph TD\n User[User] -->|Login| Login[Login Page]\n Login -->|Success| Dashboard[Dashboard]\n\n✅ Files created:\n - mermaid/user-authentication.mmd\n - .aikit/assets/drawio/user-authentication.drawio\n\n🔄 Starting background sync service...\n✅ Sync service running\n\n🎨 Opening Draw.io...\n👀 Monitoring Draw.io app (sync will stop when Draw.io closes)\n\n---\n\n[User edits in Draw.io, adds \"Password Recovery\", saves]\n\n🔄 Background sync detected changes:\n • Added nodes: Recovery, ResetEmail\n • Modified connections: Login → Recovery\n\n✅ Updated: mermaid/user-authentication.mmd\n\n[Or user edits mermaid/user-authentication.mmd directly]\n\n🔄 Background sync detected changes:\n • Modified Mermaid syntax\n\n✅ Updated: .aikit/assets/drawio/user-authentication.drawio\n\n---\n\n[User closes Draw.io app]\n\n🎨 Draw.io closed - stopping sync service\n✅ Sync service stopped\n\\`\\`\\`\n\n**Key Point**: Sync starts automatically when Draw.io opens, and stops automatically when Draw.io closes. No manual commands needed!\n\n## Important Notes\n\n- **Auto-sync lifecycle** - Sync starts when Draw.io opens, stops when it closes\n- **Zero manual intervention** - No need to run start/stop commands\n- **Draw.io app** opens automatically on \"create\"\n- **Both formats** stay in sync automatically while Draw.io is open\n- **Mermaid files** are in project root for version control\n- **Draw.io files** are in .aikit/assets (can be .gitignored)\n- **Manual commands** (start-sync/stop-sync) only needed for special cases\n\n## Auto-Open Commands\n\n**IMPORTANT**: Always use absolute paths!\n\n**Example code**:\n\\`\\`\\`javascript\nconst platform = process.platform;\nconst projectRoot = process.cwd(); // Get absolute project root\nconst filePath = join(projectRoot, '.aikit/assets/drawio', name + '.drawio');\n\nif (platform === 'darwin') {\n // macOS: Use double quotes for path with spaces\n execSync('open -a \"Draw.io\" \"' + filePath + '\"');\n} else if (platform === 'linux') {\n // Linux\n execSync('xdg-open \"' + filePath + '\"');\n} else if (platform === 'win32') {\n // Windows\n execSync('start \"\" \"' + filePath + '\"', { shell: true });\n}\n\\`\\`\\`\n\n**Why absolute paths?**\n- Relative paths depend on current working directory\n- Claude/AI might execute from wrong directory\n- Absolute paths always work correctly\n\n**Fallback**: If Draw.io app not found, open https://app.diagrams.net/\n\n## Directory Setup\n\nEnsure directories exist:\n\\`\\`\\`bash\nmkdir -p mermaid\nmkdir -p .aikit/assets/drawio\n\\`\\`\\``,\n },\n];\n","import { readdir, writeFile, mkdir } from 'fs/promises';\nimport { join, extname } from 'path';\nimport { z } from 'zod';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Tool argument schema\n */\nexport const ToolArgSchema = z.object({\n type: z.enum(['string', 'number', 'boolean', 'array', 'object']),\n description: z.string(),\n required: z.boolean().optional().default(true),\n default: z.any().optional(),\n});\n\nexport type ToolArg = z.infer<typeof ToolArgSchema>;\n\n/**\n * Tool definition\n */\nexport interface Tool {\n name: string;\n description: string;\n args: Record<string, ToolArg>;\n execute: (args: Record<string, unknown>, context?: { config?: Config; toolConfigManager?: any }) => Promise<string>;\n filePath?: string;\n}\n\n/**\n * Tool definition helper for type safety\n */\nexport function defineTool(config: {\n name: string;\n description: string;\n args: Record<string, ToolArg>;\n execute: (args: Record<string, unknown>) => Promise<string>;\n}): Tool {\n return config;\n}\n\n/**\n * Built-in tools\n */\nconst BUILT_IN_TOOLS: Tool[] = [\n {\n name: 'websearch',\n description: 'Search the web for documentation, articles, and current information',\n args: {\n query: {\n type: 'string',\n description: 'The search query',\n required: true,\n },\n numResults: {\n type: 'number',\n description: 'Number of results to return (default: 5)',\n required: false,\n default: 5,\n },\n },\n async execute({ query }) {\n // This would integrate with a search API (Exa, Tavily, etc.)\n // For now, return placeholder\n return `Web search results for: \"${query}\"\\n\\nNote: Configure a search provider in AIKit settings for actual results.`;\n },\n },\n {\n name: 'codesearch',\n description: 'Search GitHub for code patterns and examples across millions of repositories',\n args: {\n query: {\n type: 'string',\n description: 'The code pattern or search query',\n required: true,\n },\n language: {\n type: 'string',\n description: 'Programming language to filter by',\n required: false,\n },\n },\n async execute({ query, language }) {\n // This would integrate with GitHub code search\n const langFilter = language ? ` in ${language}` : '';\n return `GitHub code search for: \"${query}\"${langFilter}\\n\\nNote: Configure GitHub integration in AIKit settings for actual results.`;\n },\n },\n {\n name: 'memory-read',\n description: 'Read from persistent memory (project or global)',\n args: {\n key: {\n type: 'string',\n description: 'The memory key to read',\n required: true,\n },\n },\n async execute({ key }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n try {\n const { MemoryManager } = await import('./memory.js');\n const memory = new MemoryManager(config);\n const content = await memory.read(key as string);\n\n if (!content) {\n return `Memory entry not found: ${key as string}\\n\\nAvailable keys (use \\`list_session\\` or \\`aikit memory list\\`):\\n- handoffs/\\n- observations/\\n- research/\\n- _templates/`;\n }\n\n return content;\n } catch (error) {\n return `Error reading memory: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'memory-update',\n description: 'Update persistent memory with new information',\n args: {\n key: {\n type: 'string',\n description: 'The memory key to update',\n required: true,\n },\n content: {\n type: 'string',\n description: 'The content to write',\n required: true,\n },\n append: {\n type: 'boolean',\n description: 'Whether to append to existing content (default: true)',\n required: false,\n default: true,\n },\n },\n async execute({ key, content, append = true }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (typeof content !== 'string') {\n return 'Error: content must be a string';\n }\n\n try {\n const { MemoryManager } = await import('./memory.js');\n const memory = new MemoryManager(config);\n await memory.update(key as string, content as string, { append: append as boolean | undefined });\n return `✓ Saved to memory: ${key as string}${append ? ' (appended)' : ' (overwrote)'}`;\n } catch (error) {\n return `Error updating memory: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'find_skills',\n description: 'Find available workflow skills',\n args: {\n query: {\n type: 'string',\n description: 'Optional search query to filter skills',\n required: false,\n },\n },\n async execute({ query }) {\n // Implemented by SkillEngine integration\n return `Skills matching: ${query || 'all'}`;\n },\n },\n {\n name: 'use_skill',\n description: 'Load and use a specific skill workflow',\n args: {\n name: {\n type: 'string',\n description: 'Name of the skill to use',\n required: true,\n },\n },\n async execute({ name }) {\n // Implemented by SkillEngine integration\n return `Loading skill: ${name}`;\n },\n },\n {\n name: 'read_figma_design',\n description: 'Read and analyze a Figma design using Figma API. Extracts design tokens including colors, typography, spacing, components, and layout.',\n args: {\n url: {\n type: 'string',\n description: 'Figma design URL to analyze (must start with https://www.figma.com/design/)',\n required: true,\n },\n },\n async execute({ url }, context?: { toolConfigManager?: import('./tool-config.js').ToolConfigManager }) {\n // Validate Figma URL\n if (!url || typeof url !== 'string') {\n return 'Error: Invalid URL provided';\n }\n \n if (!url.startsWith('https://www.figma.com/design/') && !url.startsWith('http://www.figma.com/design/')) {\n return `Error: Invalid Figma URL format. URL must start with https://www.figma.com/design/\\n\\nProvided URL: ${url}`;\n }\n\n // Check if Figma tool is configured\n const configManager = context?.toolConfigManager;\n if (!configManager) {\n return `Error: Tool configuration manager not available. This usually means the MCP server isn't properly initialized. Please restart OpenCode.\\n\\nIf the issue persists, configure Figma tool manually: aikit skills figma-analysis config`;\n }\n\n const isReady = await configManager.isToolReady('figma-analysis');\n if (!isReady) {\n // Provide more helpful error message\n const toolConfig = await configManager.getToolConfig('figma-analysis');\n if (toolConfig?.status === 'error') {\n return `Error: Figma tool configuration error: ${toolConfig.errorMessage || 'Unknown error'}\\n\\nPlease reconfigure: aikit skills figma-analysis config`;\n }\n return `Error: Figma tool is not configured. Please run: aikit skills figma-analysis config\\n\\nThis will guide you through setting up your Figma Personal Access Token.`;\n }\n\n const apiKey = await configManager.getApiKey('figma-analysis');\n if (!apiKey) {\n return `Error: Figma API key not found. Please run: aikit skills figma-analysis config`;\n }\n\n try {\n // Use Figma MCP client to extract design tokens\n const { FigmaMcpClient } = await import('./tools/figma-mcp.js');\n const client = new FigmaMcpClient(apiKey, configManager);\n \n // Determine assets directory (use project root or current working directory)\n const assetsDir = './assets/images';\n \n // Extract design tokens (without downloading assets yet - will do after screen selection)\n const tokens = await client.extractDesignTokens(url, false, assetsDir);\n\n // Format results\n let result = `# Figma Design Analysis\\n\\n`;\n result += `**URL**: ${url}\\n\\n`;\n \n result += `## Design Structure & Content\\n\\n`;\n \n // Structure hierarchy\n if (tokens.structure) {\n result += `### Node Hierarchy (${tokens.structure.nodes.length} nodes)\\n\\n`;\n result += `\\`\\`\\`\\n${tokens.structure.hierarchy}\\n\\`\\`\\`\\n\\n`;\n \n // Key elements with content\n const textNodes = tokens.structure.nodes.filter(n => n.type === 'TEXT' && n.content);\n if (textNodes.length > 0) {\n result += `### Text Content (${textNodes.length} text elements)\\n\\n`;\n textNodes.slice(0, 20).forEach(node => {\n const preview = node.content && node.content.length > 100 \n ? node.content.substring(0, 100) + '...' \n : node.content;\n result += `- **${node.name}**: \"${preview}\"\\n`;\n if (node.styles) {\n result += ` - Style: ${node.styles.fontFamily || 'N/A'} ${node.styles.fontSize || 'N/A'}px, weight ${node.styles.fontWeight || 'N/A'}\\n`;\n }\n });\n if (textNodes.length > 20) {\n result += `\\n... and ${textNodes.length - 20} more text elements\\n`;\n }\n result += `\\n`;\n }\n\n // Layout structure\n const frameNodes = tokens.structure.nodes.filter(n => n.type === 'FRAME' || n.type === 'COMPONENT');\n if (frameNodes.length > 0) {\n result += `### Layout Structure (${frameNodes.length} frames/components)\\n\\n`;\n frameNodes.slice(0, 15).forEach(node => {\n result += `- **${node.name}** (${node.type})\\n`;\n if (node.position) {\n result += ` - Position: x=${Math.round(node.position.x)}, y=${Math.round(node.position.y)}\\n`;\n result += ` - Size: ${Math.round(node.position.width)}×${Math.round(node.position.height)}px\\n`;\n }\n if (node.styles?.layout) {\n result += ` - Layout: ${node.styles.layout}${node.styles.gap ? `, gap: ${node.styles.gap}px` : ''}\\n`;\n }\n if (node.children && node.children.length > 0) {\n result += ` - Children: ${node.children.length}\\n`;\n }\n });\n if (frameNodes.length > 15) {\n result += `\\n... and ${frameNodes.length - 15} more frames/components\\n`;\n }\n result += `\\n`;\n }\n }\n \n result += `## Design Tokens\\n\\n`;\n \n // Colors\n if (tokens.colors.length > 0) {\n result += `### Colors (${tokens.colors.length} found)\\n\\n`;\n tokens.colors.slice(0, 30).forEach(color => {\n result += `- \\`${color.hex}\\`\\n`;\n });\n if (tokens.colors.length > 30) {\n result += `\\n... and ${tokens.colors.length - 30} more colors\\n`;\n }\n result += `\\n`;\n }\n\n // Typography\n if (tokens.typography.length > 0) {\n result += `### Typography (${tokens.typography.length} styles)\\n\\n`;\n tokens.typography.forEach(typography => {\n result += `- **${typography.name}**: ${typography.fontFamily}, ${typography.fontSize}px, weight ${typography.fontWeight}, line-height ${typography.lineHeight}px\\n`;\n });\n result += `\\n`;\n }\n\n // Spacing\n result += `### Spacing System\\n\\n`;\n result += `- Base unit: ${tokens.spacing.unit}px\\n`;\n result += `- Scale: ${tokens.spacing.scale.length > 0 ? tokens.spacing.scale.join(', ') : 'Not detected'}\\n\\n`;\n\n // Components\n if (tokens.components.length > 0) {\n result += `### Components (${tokens.components.length} found)\\n\\n`;\n tokens.components.forEach(component => {\n result += `- **${component.name}**: ${component.type}${component.description ? ` - ${component.description}` : ''}\\n`;\n });\n result += `\\n`;\n }\n\n // Screens - Show with selection prompt\n if (tokens.screens.length > 0) {\n result += `## Available Screens/Frames (${tokens.screens.length} found)\\n\\n`;\n result += `**Please confirm which screen(s) you want to develop:**\\n\\n`;\n tokens.screens.forEach((screen, index) => {\n result += `${index + 1}. **${screen.name}**\\n`;\n result += ` - Size: ${screen.width}×${screen.height}px\\n`;\n result += ` - Type: ${screen.type}\\n`;\n if (screen.childrenCount) {\n result += ` - Components: ${screen.childrenCount}\\n`;\n }\n result += ` - ID: \\`${screen.id}\\`\\n\\n`;\n });\n result += `\\n**To proceed, simply reply with the screen number(s) or name(s) you want to develop.**\\n`;\n result += `Example: \"1\" or \"Main Page\" or \"1, 2, 3\"\\n\\n`;\n }\n\n // Breakpoints\n result += `### Responsive Breakpoints\\n\\n`;\n result += `- ${tokens.breakpoints.join('px, ')}px\\n\\n`;\n\n // Assets\n if (tokens.assets && tokens.assets.length > 0) {\n result += `## Downloaded Assets (${tokens.assets.length} files)\\n\\n`;\n result += `All assets have been downloaded to: \\`${tokens.assets[0].path.split('/').slice(0, -1).join('/')}\\`\\n\\n`;\n result += `### Image Files\\n\\n`;\n tokens.assets.forEach(asset => {\n const relativePath = asset.path.replace(process.cwd() + '/', '');\n result += `- **${asset.nodeName}** (${asset.nodeType})\\n`;\n result += ` - File: \\`${relativePath}\\`\\n`;\n if (asset.width && asset.height) {\n result += ` - Size: ${Math.round(asset.width)}×${Math.round(asset.height)}px\\n`;\n }\n result += ` - Format: ${asset.format.toUpperCase()}\\n`;\n result += ` - Usage: \\`<img src=\"${relativePath}\" alt=\"${asset.nodeName}\" />\\`\\n\\n`;\n });\n }\n\n result += `## Implementation Guide\\n\\n`;\n result += `### Structure Analysis\\n`;\n result += `The design contains ${tokens.structure?.nodes.length || 0} nodes organized in a hierarchical structure.\\n`;\n result += `Use the node hierarchy above to understand:\\n`;\n result += `1. **Component structure** - How elements are organized\\n`;\n result += `2. **Text content** - All text content from TEXT nodes\\n`;\n result += `3. **Layout properties** - Flex direction, gaps, padding\\n`;\n result += `4. **Positioning** - Exact x, y, width, height values\\n\\n`;\n result += `### Next Steps\\n\\n`;\n result += `1. Review the structure hierarchy to understand component organization\\n`;\n result += `2. Extract text content from TEXT nodes for HTML content\\n`;\n result += `3. Use position and size data for pixel-perfect CSS\\n`;\n result += `4. Use layout properties (HORIZONTAL/VERTICAL) for flexbox/grid\\n`;\n result += `5. Use extracted design tokens (colors, typography) for styling\\n`;\n result += `6. Save this analysis: \\`memory-update(\"research/figma-analysis\", \"[this analysis]\")\\`\\n`;\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return `Error analyzing Figma design: ${errorMessage}\\n\\nPlease check:\\n1. The Figma URL is correct and accessible\\n2. Your Figma API token has proper permissions\\n3. The design file is shared with your account`;\n }\n },\n },\n {\n name: 'analyze_figma',\n description: 'Analyze a Figma design URL and extract all design tokens automatically. The URL should be provided in the user input after the command.',\n args: {\n url: {\n type: 'string',\n description: 'Figma design URL to analyze',\n required: true,\n },\n },\n async execute({ url }) {\n // This tool will be used by agents to analyze Figma\n // The actual analysis will be done by @vision agent\n return `Figma analysis tool called for: ${url}\\n\\nNext steps:\\n1. Use @vision agent to analyze the design\\n2. Extract all design tokens\\n3. Save to memory/research/figma-analysis.md`;\n },\n },\n {\n name: 'develop_figma_screen',\n description: 'Smart workflow to develop a specific Figma screen: check current code, pull needed assets, plan, and develop. User just needs to confirm the screen number/name.',\n args: {\n figmaUrl: {\n type: 'string',\n description: 'Figma design URL',\n required: true,\n },\n screenId: {\n type: 'string',\n description: 'Screen ID or name to develop (from read_figma_design output)',\n required: true,\n },\n },\n async execute({ figmaUrl, screenId }, context?: { toolConfigManager?: import('./tool-config.js').ToolConfigManager }) {\n const configManager = context?.toolConfigManager;\n if (!configManager) {\n return 'Error: Tool configuration manager not available.';\n }\n\n const isReady = await configManager.isToolReady('figma-analysis');\n if (!isReady) {\n return 'Error: Figma tool is not configured. Please run: aikit skills figma-analysis config';\n }\n\n const apiKey = await configManager.getApiKey('figma-analysis');\n if (!apiKey) {\n return 'Error: Figma API key not found.';\n }\n\n try {\n const { FigmaMcpClient } = await import('./tools/figma-mcp.js');\n const { checkCurrentCodeStatus, compareCodeWithFigma } = await import('./tools/figma-screen-developer.js');\n \n const client = new FigmaMcpClient(apiKey, configManager);\n \n // Step 1: Extract design tokens\n const tokens = await client.extractDesignTokens(figmaUrl as string, false, './assets/images');\n \n // Step 2: Find selected screen\n const screenIdStr = String(screenId);\n const selectedScreen = tokens.screens?.find((s: any) => \n s.id === screenIdStr || s.name.toLowerCase() === screenIdStr.toLowerCase()\n );\n \n if (!selectedScreen) {\n return `Error: Screen \"${screenId}\" not found. Available screens:\\n${tokens.screens?.map((s: any, i: number) => `${i + 1}. ${s.name} (ID: ${s.id})`).join('\\n') || 'None'}`;\n }\n\n // Step 3: Check current code status\n const codeStatus = await checkCurrentCodeStatus();\n \n // Step 4: Compare with Figma\n const comparison = await compareCodeWithFigma(tokens, selectedScreen.id);\n \n // Step 5: Download assets for this screen only\n let downloadedAssets: any[] = [];\n const fileKey = (client as any).extractFileKey(figmaUrl as string);\n if (fileKey) {\n try {\n const fileData = await (client as any).getFileData(figmaUrl as string);\n // Use absolute path for assets directory\n const projectPath = process.cwd();\n const assetsDir = join(projectPath, 'assets', 'images');\n const assets = await (client as any).downloadAssets(fileKey, fileData.document, assetsDir, selectedScreen.id);\n downloadedAssets = assets || [];\n logger.info(`Downloaded ${downloadedAssets.length} assets for screen ${selectedScreen.name}`);\n } catch (error) {\n logger.warn(`Failed to download assets: ${error instanceof Error ? error.message : String(error)}`);\n downloadedAssets = [];\n }\n }\n\n // Step 6: Generate detailed plan\n let result = `# Development Plan for Screen: ${selectedScreen.name}\\n\\n`;\n result += `## Current Code Status\\n\\n`;\n result += `- HTML: ${codeStatus.hasHTML ? `✅ ${codeStatus.htmlFile}` : '❌ Not found'}\\n`;\n result += `- CSS: ${codeStatus.hasCSS ? `✅ ${codeStatus.cssFiles.length} files` : '❌ Not found'}\\n`;\n result += `- Assets: ${codeStatus.hasAssets ? `✅ ${codeStatus.assetCount} files` : '❌ Not found'}\\n`;\n result += `- Existing Sections: ${codeStatus.sections.length > 0 ? codeStatus.sections.join(', ') : 'None'}\\n\\n`;\n \n result += `## Comparison with Figma Design\\n\\n`;\n result += `- Missing Sections: ${comparison.missingSections.length > 0 ? comparison.missingSections.join(', ') : 'None'}\\n`;\n result += `- Missing Assets: ${comparison.missingAssets.length > 0 ? comparison.missingAssets.join(', ') : 'None'}\\n`;\n result += `- Needs Update: ${comparison.needsUpdate ? 'Yes' : 'No'}\\n\\n`;\n \n result += `## Recommendations\\n\\n`;\n comparison.recommendations.forEach((rec, i) => {\n result += `${i + 1}. ${rec}\\n`;\n });\n result += `\\n`;\n \n result += `## Downloaded Assets (${downloadedAssets.length})\\n\\n`;\n if (downloadedAssets.length > 0) {\n downloadedAssets.forEach((asset: any) => {\n const relativePath = asset.path.replace(process.cwd() + '/', '');\n result += `- **${asset.nodeName}** (${asset.nodeType})\\n`;\n result += ` - File: \\`${relativePath}\\`\\n`;\n if (asset.width && asset.height) {\n result += ` - Size: ${Math.round(asset.width)}×${Math.round(asset.height)}px\\n`;\n }\n result += ` - Usage: \\`<img src=\"${relativePath}\" alt=\"${asset.nodeName}\" />\\`\\n\\n`;\n });\n \n // Add critical instruction to use downloaded assets\n result += `\\n**⚠️ IMPORTANT: Use downloaded assets above instead of placeholder images!**\\n`;\n result += `Replace all Unsplash/placeholder image URLs with the downloaded asset paths.\\n\\n`;\n } else {\n result += `**No assets downloaded.** This may indicate:\\n`;\n result += `1. The screen doesn't contain exportable image nodes\\n`;\n result += `2. Assets download failed (check logs)\\n`;\n result += `3. Figma API permissions issue\\n\\n`;\n }\n \n result += `\\n## Next Steps\\n\\n`;\n result += `1. Review the plan above\\n`;\n result += `2. Use @build agent to implement missing sections\\n`;\n result += `3. Use extracted design tokens for CSS variables\\n`;\n result += `4. Use downloaded assets in HTML\\n`;\n result += `5. Verify pixel-perfect match with Figma design\\n`;\n\n return result;\n } catch (error) {\n return `Error: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'list_session',\n description: 'List previous sessions to discover what happened and when. Use this before read_session to find the right context.',\n args: {\n limit: {\n type: 'number',\n description: 'Maximum number of sessions to return (default: 10)',\n required: false,\n default: 10,\n },\n },\n async execute({ limit = 10 }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n \n // Ensure limit is a number\n const limitNum = typeof limit === 'number' ? limit : 10;\n \n try {\n const { MemoryManager } = await import('./memory.js');\n const memory = new MemoryManager(config);\n const memories = await memory.list();\n \n // Filter handoffs (sessions)\n const handoffs = memories\n .filter(m => m.type === 'handoff')\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\n .slice(0, limitNum);\n \n if (handoffs.length === 0) {\n return 'No previous sessions found. Use /handoff to create a session handoff.';\n }\n \n let result = `# Previous Sessions (${handoffs.length})\\n\\n`;\n handoffs.forEach((handoff, index) => {\n const sessionId = handoff.key.replace('handoffs/', '');\n result += `${index + 1}. **${sessionId}**\\n`;\n result += ` - Updated: ${handoff.updatedAt.toLocaleString()}\\n`;\n result += ` - Summary: ${handoff.summary}\\n\\n`;\n });\n \n result += `\\nUse \\`read_session\\` with a session ID to load full context.`;\n return result;\n } catch (error) {\n return `Error listing sessions: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'read_session',\n description: 'Load context from a previous session. Returns session summary, user tasks, and file changes.',\n args: {\n sessionId: {\n type: 'string',\n description: 'Session ID from list_session (e.g., \"2024-01-15T10-30-00\")',\n required: true,\n },\n },\n async execute({ sessionId }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n \n try {\n const { MemoryManager } = await import('./memory.js');\n const memory = new MemoryManager(config);\n const content = await memory.read(`handoffs/${sessionId}`);\n \n if (!content) {\n return `Session not found: ${sessionId}\\n\\nUse \\`list_session\\` to see available sessions.`;\n }\n \n return `# Session Context: ${sessionId}\\n\\n${content}\\n\\n---\\n\\nThis context has been loaded. Use /resume to continue from this point.`;\n } catch (error) {\n return `Error reading session: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'bead-create',\n description: 'Create a new bead/task for tracking work',\n args: {\n title: {\n type: 'string',\n description: 'Title of bead/task',\n required: true,\n },\n description: {\n type: 'string',\n description: 'Description of what needs to be done',\n required: true,\n },\n },\n async execute({ title, description }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (typeof title !== 'string' || typeof description !== 'string') {\n return 'Error: title and description must be strings';\n }\n\n try {\n const { BeadsIntegration } = await import('./beads.js');\n const beads = new BeadsIntegration(config.projectPath);\n const bead = await beads.createBead(title, description);\n return `✓ Created bead: ${bead.id}\\n\\nTitle: ${bead.title}\\nDescription: ${description}\\n\\nUse \\`bead-update-status\\` to change status or \\`bead-complete\\` to finish with quality gates.`;\n } catch (error) {\n return `Error creating bead: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'bead-update-status',\n description: 'Update bead status (todo, in-progress, completed, blocked)',\n args: {\n id: {\n type: 'string',\n description: 'Bead ID (e.g., \"bead-001\")',\n required: true,\n },\n status: {\n type: 'string',\n description: 'New status: todo, in-progress, completed, blocked',\n required: true,\n },\n },\n async execute({ id, status }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (typeof id !== 'string' || typeof status !== 'string') {\n return 'Error: id and status must be strings';\n }\n\n const validStatuses = ['todo', 'in-progress', 'completed', 'blocked'];\n if (!validStatuses.includes(status)) {\n return `Error: Invalid status \"${status}\". Valid statuses: ${validStatuses.join(', ')}`;\n }\n\n try {\n const { BeadsIntegration } = await import('./beads.js');\n const beads = new BeadsIntegration(config.projectPath);\n const success = await beads.updateBeadStatus(id, status as any);\n if (success) {\n return `✓ Updated bead ${id} to status: ${status}`;\n } else {\n return `Error: Bead ${id} not found`;\n }\n } catch (error) {\n return `Error updating bead status: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'bead-complete',\n description: 'Complete a bead with quality gates (typecheck, test, lint, build)',\n args: {\n id: {\n type: 'string',\n description: 'Bead ID (e.g., \"bead-001\")',\n required: true,\n },\n },\n async execute({ id }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (typeof id !== 'string') {\n return 'Error: id must be a string';\n }\n\n try {\n const { BeadsIntegration } = await import('./beads.js');\n const beads = new BeadsIntegration(config.projectPath);\n const result = await beads.completeBead(id);\n\n if (!result.success) {\n let errorReport = `❌ Quality gates failed for bead ${id}:\\n\\n`;\n result.gates.forEach(gate => {\n const status = gate.passed ? '✓' : '✗';\n errorReport += `${status} ${gate.name}`;\n if (gate.error) {\n errorReport += `\\n Error: ${gate.error}`;\n }\n errorReport += '\\n';\n });\n return errorReport;\n }\n\n return `✓ Bead ${id} completed successfully!\\n\\nAll quality gates passed:\\n${result.gates.map(g => ` ✓ ${g.name}`).join('\\n')}`;\n } catch (error) {\n return `Error completing bead: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'bead-list',\n description: 'List all beads in the project',\n args: {\n filter: {\n type: 'string',\n description: 'Filter by status: todo, in-progress, completed, blocked (optional)',\n required: false,\n },\n },\n async execute({ filter }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (filter !== undefined && typeof filter !== 'string') {\n return 'Error: filter must be a string';\n }\n\n try {\n const { BeadsIntegration } = await import('./beads.js');\n const beads = new BeadsIntegration(config.projectPath);\n const allBeads = await beads.listBeads();\n\n let filtered = allBeads;\n if (filter && ['todo', 'in-progress', 'completed', 'blocked'].includes(filter)) {\n filtered = allBeads.filter(b => b.status === filter);\n }\n\n if (filtered.length === 0) {\n return `No beads found${filter ? ` with status \"${filter}\"` : ''}`;\n }\n\n let result = `# Beads (${filtered.length})\\n\\n`;\n filtered.forEach(bead => {\n const statusEmoji = {\n 'todo': '⏸️',\n 'in-progress': '🔄',\n 'completed': '✅',\n 'blocked': '🚫'\n }[bead.status] || '❓';\n\n result += `${statusEmoji} **${bead.id}**: ${bead.title}\\n`;\n result += ` Status: ${bead.status}\\n`;\n result += ` Updated: ${bead.updatedAt.toLocaleString()}\\n`;\n if (bead.description) {\n const desc = bead.description.length > 100 ? bead.description.slice(0, 100) + '...' : bead.description;\n result += ` Description: ${desc}\\n`;\n }\n result += '\\n';\n });\n\n return result.trim();\n } catch (error) {\n return `Error listing beads: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'bead-update-type',\n description: 'Update the type of an existing bead (feature, pattern, decision, knowledge)',\n args: {\n id: {\n type: 'string',\n description: 'Bead ID (e.g., \"bead-001\")',\n required: true,\n },\n type: {\n type: 'string',\n description: 'New type: feature, pattern, decision, or knowledge',\n required: true,\n },\n },\n async execute({ id, type }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (typeof id !== 'string') {\n return 'Error: id must be a string';\n }\n if (typeof type !== 'string') {\n return 'Error: type must be a string';\n }\n\n const validTypes = ['feature', 'pattern', 'decision', 'knowledge'];\n if (!validTypes.includes(type)) {\n return `Error: Invalid type \"${type}\". Valid types: ${validTypes.join(', ')}`;\n }\n\n try {\n const { BeadsIntegration } = await import('./beads.js');\n const beads = new BeadsIntegration(config.projectPath);\n const success = await beads.updateBeadType(id, type as any);\n if (success) {\n return `✓ Updated bead ${id} type to: ${type}`;\n } else {\n return `Error: Bead ${id} not found`;\n }\n } catch (error) {\n return `Error updating bead type: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n];\n\n/**\n * Tool Registry - Manages custom tools for AI agents\n */\nexport class ToolRegistry {\n private config: Config;\n private tools: Map<string, Tool> = new Map();\n private toolConfigManager?: import('./tool-config.js').ToolConfigManager;\n\n constructor(config: Config) {\n this.config = config;\n \n // Register built-in tools\n for (const tool of BUILT_IN_TOOLS) {\n this.tools.set(tool.name, tool);\n }\n }\n\n /**\n * Set tool config manager (for tools that need configuration)\n */\n setToolConfigManager(manager: import('./tool-config.js').ToolConfigManager): void {\n this.toolConfigManager = manager;\n }\n\n /**\n * List all available tools\n */\n async listTools(): Promise<Tool[]> {\n // Load custom tools\n await this.loadCustomTools();\n return Array.from(this.tools.values());\n }\n\n /**\n * Get a specific tool\n */\n getTool(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Register a new tool\n */\n registerTool(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Execute a tool\n */\n async executeTool(name: string, args: Record<string, unknown>, context?: { toolConfigManager?: import('./tool-config.js').ToolConfigManager }): Promise<string> {\n const tool = this.tools.get(name);\n if (!tool) {\n throw new Error(`Tool not found: ${name}`);\n }\n\n // Validate required arguments\n for (const [argName, argDef] of Object.entries(tool.args)) {\n if (argDef.required && args[argName] === undefined) {\n throw new Error(`Missing required argument: ${argName}`);\n }\n }\n\n // Merge context with config and toolConfigManager from registry\n const mergedContext = {\n ...context,\n config: this.config,\n toolConfigManager: context?.toolConfigManager || this.toolConfigManager,\n };\n\n // Check if tool.execute accepts context parameter\n if (tool.execute.length === 2) {\n return await (tool.execute as (args: Record<string, unknown>, context?: any) => Promise<string>)(args, mergedContext);\n }\n\n return await tool.execute(args);\n }\n\n /**\n * Create a custom tool\n */\n async createTool(name: string, options: {\n description: string;\n args: Record<string, ToolArg>;\n code: string;\n global?: boolean;\n }): Promise<void> {\n const configPath = options.global ? paths.globalConfig() : this.config.configPath;\n const toolsDir = paths.tools(configPath);\n \n await mkdir(toolsDir, { recursive: true });\n \n const fileName = `${name}.ts`;\n const filePath = join(toolsDir, fileName);\n \n const argsSchema = Object.entries(options.args)\n .map(([argName, arg]) => ` ${argName}: {\n type: '${arg.type}',\n description: '${arg.description}',\n required: ${arg.required ?? true},\n }`)\n .join(',\\n');\n \n const content = `import { defineTool } from 'aikit';\n\nexport default defineTool({\n name: '${name}',\n description: '${options.description}',\n args: {\n${argsSchema}\n },\n async execute(args) {\n${options.code}\n }\n});\n`;\n \n await writeFile(filePath, content);\n }\n\n /**\n * Format tool for agent consumption\n */\n formatForAgent(tool: Tool): string {\n const argsDesc = Object.entries(tool.args)\n .map(([name, arg]) => ` - ${name} (${arg.type}${arg.required ? ', required' : ''}): ${arg.description}`)\n .join('\\n');\n \n return `## Tool: ${tool.name}\n\n${tool.description}\n\n### Arguments\n${argsDesc}\n`;\n }\n\n /**\n * Load custom tools from disk\n */\n private async loadCustomTools(): Promise<void> {\n // Load from global config\n const globalToolsPath = paths.tools(paths.globalConfig());\n await this.loadToolsFromDir(globalToolsPath);\n \n // Load from project config (override global)\n const projectToolsPath = paths.tools(this.config.configPath);\n if (projectToolsPath !== globalToolsPath) {\n await this.loadToolsFromDir(projectToolsPath);\n }\n }\n\n private async loadToolsFromDir(dir: string): Promise<void> {\n let files: string[];\n try {\n files = await readdir(dir);\n } catch {\n return; // Directory doesn't exist\n }\n \n for (const file of files) {\n if (extname(file) !== '.ts' && extname(file) !== '.js') continue;\n \n const filePath = join(dir, file);\n \n try {\n // Dynamic import of custom tool\n const toolModule = await import(`file://${filePath}`);\n const tool = toolModule.default as Tool;\n \n if (tool?.name && typeof tool.execute === 'function') {\n tool.filePath = filePath;\n this.tools.set(tool.name, tool);\n }\n } catch (error) {\n // Failed to load tool, skip\n logger.warn(`Failed to load tool from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n}\n","import { readdir, writeFile, mkdir } from 'fs/promises';\nimport { join, basename, extname } from 'path';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Plugin event types\n */\nexport type PluginEventType =\n | 'session.idle'\n | 'session.created'\n | 'session.error'\n | 'tool.execute.before'\n | 'tool.execute.after'\n | 'file.edited'\n | 'file.watcher.updated'\n | 'message.updated'\n | 'message.removed';\n\n/**\n * Plugin event payload\n */\nexport interface PluginEvent {\n type: PluginEventType;\n timestamp: Date;\n properties?: Record<string, unknown>;\n}\n\n/**\n * Plugin context passed to plugins\n */\nexport interface PluginContext {\n project: {\n path: string;\n name: string;\n };\n config: Config;\n emit: (event: PluginEvent) => Promise<void>;\n}\n\n/**\n * Plugin handler return type\n */\nexport interface PluginHandlers {\n event?: (event: PluginEvent) => Promise<void>;\n 'tool.execute.before'?: (input: unknown) => Promise<unknown>;\n 'tool.execute.after'?: (input: unknown, output: unknown) => Promise<unknown>;\n}\n\n/**\n * Plugin definition function type\n */\nexport type PluginFactory = (context: PluginContext) => Promise<PluginHandlers>;\n\n/**\n * Plugin metadata\n */\nexport interface PluginInfo {\n name: string;\n description: string;\n enabled: boolean;\n filePath: string;\n handlers?: PluginHandlers;\n}\n\n/**\n * Plugin definition helper\n */\nexport type Plugin = PluginFactory;\n\n/**\n * Plugin System - Manages event-driven plugins\n */\nexport class PluginSystem {\n private config: Config;\n private plugins: Map<string, PluginInfo> = new Map();\n private loadedPlugins: Map<string, PluginHandlers> = new Map();\n private eventQueue: PluginEvent[] = [];\n private processing = false;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * Initialize and load all plugins\n */\n async initialize(): Promise<void> {\n await this.loadPlugins();\n \n // Initialize each plugin\n for (const [name, info] of this.plugins) {\n if (info.enabled) {\n try {\n const handlers = await this.initializePlugin(info);\n this.loadedPlugins.set(name, handlers);\n info.handlers = handlers;\n } catch (error) {\n logger.warn(`Failed to initialize plugin ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n\n /**\n * List all available plugins\n */\n async listPlugins(): Promise<PluginInfo[]> {\n await this.loadPlugins();\n return Array.from(this.plugins.values());\n }\n\n /**\n * Enable a plugin\n */\n async enablePlugin(name: string): Promise<void> {\n const plugin = this.plugins.get(name);\n if (plugin) {\n plugin.enabled = true;\n if (!this.loadedPlugins.has(name)) {\n const handlers = await this.initializePlugin(plugin);\n this.loadedPlugins.set(name, handlers);\n plugin.handlers = handlers;\n }\n }\n }\n\n /**\n * Disable a plugin\n */\n disablePlugin(name: string): void {\n const plugin = this.plugins.get(name);\n if (plugin) {\n plugin.enabled = false;\n this.loadedPlugins.delete(name);\n plugin.handlers = undefined;\n }\n }\n\n /**\n * Emit an event to all plugins\n */\n async emit(event: PluginEvent): Promise<void> {\n this.eventQueue.push(event);\n \n if (!this.processing) {\n await this.processEventQueue();\n }\n }\n\n /**\n * Execute before hooks for tool execution\n */\n async executeBeforeHooks(_toolName: string, input: unknown): Promise<unknown> {\n let result = input;\n \n for (const handlers of this.loadedPlugins.values()) {\n if (handlers['tool.execute.before']) {\n result = await handlers['tool.execute.before'](result);\n }\n }\n \n return result;\n }\n\n /**\n * Execute after hooks for tool execution\n */\n async executeAfterHooks(_toolName: string, input: unknown, output: unknown): Promise<unknown> {\n let result = output;\n \n for (const handlers of this.loadedPlugins.values()) {\n if (handlers['tool.execute.after']) {\n result = await handlers['tool.execute.after'](input, result);\n }\n }\n \n return result;\n }\n\n /**\n * Create a new plugin\n */\n async createPlugin(name: string, options: {\n description?: string;\n code: string;\n global?: boolean;\n }): Promise<void> {\n const configPath = options.global ? paths.globalConfig() : this.config.configPath;\n const pluginsDir = paths.plugins(configPath);\n \n await mkdir(pluginsDir, { recursive: true });\n \n const fileName = `${name}.ts`;\n const filePath = join(pluginsDir, fileName);\n \n const content = `import { Plugin } from 'aikit';\n\n/**\n * ${options.description || `Custom plugin: ${name}`}\n */\nexport const ${toPascalCase(name)}Plugin: Plugin = async ({ project, config, emit }) => {\n return {\n event: async ({ event }) => {\n${options.code}\n }\n };\n};\n\nexport default ${toPascalCase(name)}Plugin;\n`;\n \n await writeFile(filePath, content);\n }\n\n /**\n * Process event queue\n */\n private async processEventQueue(): Promise<void> {\n this.processing = true;\n \n while (this.eventQueue.length > 0) {\n const event = this.eventQueue.shift()!;\n \n for (const handlers of this.loadedPlugins.values()) {\n if (handlers.event) {\n try {\n await handlers.event(event);\n } catch (error) {\n logger.warn(`Plugin error handling event ${event.type}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n \n this.processing = false;\n }\n\n /**\n * Load plugins from disk\n */\n private async loadPlugins(): Promise<void> {\n // Load built-in plugins\n this.registerBuiltInPlugins();\n \n // Load from global config\n const globalPluginsPath = paths.plugins(paths.globalConfig());\n await this.loadPluginsFromDir(globalPluginsPath);\n \n // Load from project config\n const projectPluginsPath = paths.plugins(this.config.configPath);\n if (projectPluginsPath !== globalPluginsPath) {\n await this.loadPluginsFromDir(projectPluginsPath);\n }\n }\n\n private registerBuiltInPlugins(): void {\n // Enforcer plugin - warns about abandoned work\n this.plugins.set('enforcer', {\n name: 'enforcer',\n description: 'Warns when session idles with TODO items remaining',\n enabled: true,\n filePath: 'built-in',\n });\n \n // Compactor plugin - warns about context overflow\n this.plugins.set('compactor', {\n name: 'compactor',\n description: 'Warns when context usage reaches 70%, 85%, 95%',\n enabled: true,\n filePath: 'built-in',\n });\n \n // Truncator plugin - auto-truncates large outputs\n this.plugins.set('truncator', {\n name: 'truncator',\n description: 'Auto-truncates tool output to preserve context space',\n enabled: true,\n filePath: 'built-in',\n });\n \n // Notification plugin - OS notifications when session completes\n this.plugins.set('notification', {\n name: 'notification',\n description: 'OS notifications when OpenCode completes a session',\n enabled: true,\n filePath: 'built-in',\n });\n \n // Session Management plugin - cross-session context transfer\n this.plugins.set('session-management', {\n name: 'session-management',\n description: 'Cross-session context transfer based on handoffs',\n enabled: true,\n filePath: 'built-in',\n });\n }\n\n private async loadPluginsFromDir(dir: string): Promise<void> {\n let files: string[];\n try {\n files = await readdir(dir);\n } catch {\n return;\n }\n \n for (const file of files) {\n if (extname(file) !== '.ts' && extname(file) !== '.js') continue;\n \n const filePath = join(dir, file);\n const name = basename(file, extname(file));\n \n this.plugins.set(name, {\n name,\n description: `Custom plugin: ${name}`,\n enabled: true,\n filePath,\n });\n }\n }\n\n private async initializePlugin(info: PluginInfo): Promise<PluginHandlers> {\n if (info.filePath === 'built-in') {\n return this.getBuiltInPluginHandlers(info.name);\n }\n \n try {\n const pluginModule = await import(`file://${info.filePath}`);\n const factory = pluginModule.default as PluginFactory;\n \n const context: PluginContext = {\n project: {\n path: this.config.projectPath,\n name: basename(this.config.projectPath),\n },\n config: this.config,\n emit: this.emit.bind(this),\n };\n \n return await factory(context);\n } catch (error) {\n logger.warn(`Failed to load plugin ${info.name}: ${error instanceof Error ? error.message : String(error)}`);\n return {};\n }\n }\n\n private getBuiltInPluginHandlers(name: string): PluginHandlers {\n switch (name) {\n case 'enforcer':\n return {\n event: async (event) => {\n if (event.type === 'session.idle') {\n // Check for remaining TODOs and warn\n logger.info('[Enforcer] Session idle - check for remaining work');\n }\n },\n };\n \n case 'compactor':\n return {\n event: async (event) => {\n // Monitor context usage\n const usage = event.properties?.contextUsage as number | undefined;\n if (usage && usage > 70) {\n logger.info(`[Compactor] Context usage at ${usage}%`);\n }\n },\n };\n \n case 'truncator':\n return {\n 'tool.execute.after': async (_input, output) => {\n if (typeof output === 'string' && output.length > 50000) {\n return output.slice(0, 50000) + '\\n\\n[Output truncated - exceeded 50KB limit]';\n }\n return output;\n },\n };\n \n case 'notification':\n return {\n event: async (event) => {\n if (event.type === 'session.idle') {\n // Send OS notification when session completes\n try {\n const { exec } = await import('child_process');\n const { promisify } = await import('util');\n const execAsync = promisify(exec);\n \n const platform = process.platform;\n const summary = event.properties?.summary as string | undefined || 'Session completed';\n \n if (platform === 'darwin') {\n // macOS\n await execAsync(`osascript -e 'display notification \"${summary}\" with title \"OpenCode Session Complete\"'`);\n } else if (platform === 'linux') {\n // Linux\n await execAsync(`notify-send \"OpenCode Session Complete\" \"${summary}\"`);\n } else if (platform === 'win32') {\n // Windows\n await execAsync(`powershell -Command \"New-BurntToastNotification -Text 'OpenCode Session Complete', '${summary}'\"`);\n }\n } catch (error) {\n // Notification failed, but don't break the workflow\n logger.warn(`[Notification] Failed to send notification: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n },\n };\n \n case 'session-management':\n return {\n event: async (event) => {\n if (event.type === 'session.idle') {\n // Session management is handled via tools (list_session, read_session)\n // This plugin just ensures session data is properly saved\n logger.info('[Session Management] Session idle - context saved for next session');\n }\n },\n };\n \n default:\n return {};\n }\n }\n}\n\n/**\n * Convert string to PascalCase\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n","import { readFile, writeFile, readdir, access, constants } from 'fs/promises';\nimport { join } from 'path';\nimport { Config } from './config.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Spec violation\n */\nexport interface SpecViolation {\n rule: string;\n description: string;\n severity: 'error' | 'warning';\n location?: string;\n}\n\n/**\n * Review item\n */\nexport interface ReviewItem {\n type: 'change' | 'skip' | 'inconsistency';\n description: string;\n files?: string[];\n}\n\n/**\n * Anti-Hallucination System\n * \n * Prevents AI from inventing APIs, assuming features, and losing track of requirements.\n * Implements three validation layers:\n * 1. Task Validation (.beads/ tracking)\n * 2. Spec Enforcement (spec.md constraints)\n * 3. Review Gates (review.md documentation)\n */\nexport class AntiHallucination {\n private config: Config;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * Layer 1: Validate task exists before work begins\n */\n async validateTask(taskId?: string): Promise<{\n valid: boolean;\n task?: {\n id: string;\n description: string;\n status: string;\n };\n error?: string;\n }> {\n const beadsDir = join(this.config.projectPath, '.beads');\n \n try {\n await access(beadsDir, constants.R_OK);\n } catch {\n return {\n valid: false,\n error: 'No .beads directory found. Run \"bd init\" to initialize task tracking.',\n };\n }\n \n if (!taskId) {\n // Check for any active task\n const files = await readdir(beadsDir);\n const beadFiles = files.filter(f => f.match(/^bead-\\d+\\.md$/));\n \n if (beadFiles.length === 0) {\n return {\n valid: false,\n error: 'No tasks found. Create a task with /create before starting work.',\n };\n }\n \n // Find in-progress task\n for (const file of beadFiles) {\n const content = await readFile(join(beadsDir, file), 'utf-8');\n if (content.includes('status: in-progress') || content.includes('Status: In Progress')) {\n const id = file.replace('.md', '');\n const descMatch = content.match(/description:\\s*(.+)/i) || content.match(/# (.+)/);\n return {\n valid: true,\n task: {\n id,\n description: descMatch?.[1] || 'Unknown task',\n status: 'in-progress',\n },\n };\n }\n }\n \n return {\n valid: false,\n error: 'No active task found. Start a task with /create or /implement.',\n };\n }\n \n // Check specific task\n const taskFile = join(beadsDir, `${taskId}.md`);\n try {\n const content = await readFile(taskFile, 'utf-8');\n const statusMatch = content.match(/status:\\s*(\\w+)/i);\n const descMatch = content.match(/description:\\s*(.+)/i) || content.match(/# (.+)/);\n \n return {\n valid: true,\n task: {\n id: taskId,\n description: descMatch?.[1] || 'Unknown task',\n status: statusMatch?.[1] || 'unknown',\n },\n };\n } catch {\n return {\n valid: false,\n error: `Task not found: ${taskId}`,\n };\n }\n }\n\n /**\n * Layer 2: Check spec constraints\n */\n async checkSpec(): Promise<{\n hasSpec: boolean;\n constraints?: {\n naming: string[];\n forbidden: string[];\n required: string[];\n };\n }> {\n const specFile = this.config.antiHallucination.specFile;\n const specPath = join(this.config.projectPath, specFile);\n \n try {\n const content = await readFile(specPath, 'utf-8');\n \n const constraints = {\n naming: this.extractConstraints(content, 'Naming'),\n forbidden: this.extractConstraints(content, 'Forbidden'),\n required: this.extractConstraints(content, 'Required'),\n };\n \n return { hasSpec: true, constraints };\n } catch {\n return { hasSpec: false };\n }\n }\n\n /**\n * Validate code against spec constraints\n */\n async validateAgainstSpec(code: string, filePath: string): Promise<SpecViolation[]> {\n const spec = await this.checkSpec();\n const violations: SpecViolation[] = [];\n \n if (!spec.hasSpec || !spec.constraints) {\n return violations;\n }\n \n // Check forbidden patterns\n for (const forbidden of spec.constraints.forbidden) {\n const pattern = this.patternToRegex(forbidden);\n if (pattern && pattern.test(code)) {\n violations.push({\n rule: 'Forbidden Pattern',\n description: forbidden,\n severity: 'error',\n location: filePath,\n });\n }\n }\n \n return violations;\n }\n\n /**\n * Layer 3: Create review documentation\n */\n async createReview(changes: {\n filesChanged: string[];\n functionsAdded: string[];\n testsAdded: string[];\n skipped?: string[];\n inconsistencies?: string[];\n }): Promise<string> {\n const reviewFile = this.config.antiHallucination.reviewFile;\n const reviewPath = join(this.config.projectPath, reviewFile);\n \n const content = `# Code Review\n\n_Generated: ${new Date().toISOString()}_\n\n## What Changed\n\n### Files Modified\n${changes.filesChanged.map(f => `- ${f}`).join('\\n') || '- None'}\n\n### Functions Added\n${changes.functionsAdded.map(f => `- ${f}`).join('\\n') || '- None'}\n\n### Tests Added\n${changes.testsAdded.map(t => `- ${t}`).join('\\n') || '- None'}\n\n## What Was Skipped\n${changes.skipped?.map(s => `- ${s}`).join('\\n') || '- Nothing skipped'}\n\n## Inconsistencies\n${changes.inconsistencies?.map(i => `- ⚠️ ${i}`).join('\\n') || '- None found'}\n\n## Verification\n- [ ] All tests pass\n- [ ] Type check passes\n- [ ] Linting passes\n- [ ] Build succeeds\n- [ ] Manual testing completed\n`;\n \n await writeFile(reviewPath, content);\n return reviewPath;\n }\n\n /**\n * Verify completion (hard gates)\n */\n async verifyCompletion(): Promise<{\n passed: boolean;\n gates: {\n name: string;\n passed: boolean;\n error?: string;\n }[];\n }> {\n const { exec } = await import('child_process');\n const { promisify } = await import('util');\n const execAsync = promisify(exec);\n \n const gates = [\n { name: 'Type Check', command: 'npm run typecheck' },\n { name: 'Tests', command: 'npm run test' },\n { name: 'Lint', command: 'npm run lint' },\n { name: 'Build', command: 'npm run build' },\n ];\n \n const results: { name: string; passed: boolean; error?: string }[] = [];\n \n for (const gate of gates) {\n try {\n await execAsync(gate.command, { cwd: this.config.projectPath });\n results.push({ name: gate.name, passed: true });\n } catch (error) {\n results.push({\n name: gate.name,\n passed: false,\n error: error instanceof Error ? error.message : 'Failed',\n });\n }\n }\n \n return {\n passed: results.every(r => r.passed),\n gates: results,\n };\n }\n\n /**\n * Recovery: Check for context loss\n */\n async checkContextLoss(): Promise<{\n hasHandoff: boolean;\n latestHandoff?: string;\n }> {\n const handoffsDir = join(this.config.configPath, 'memory', 'handoffs');\n \n try {\n const files = await readdir(handoffsDir);\n const handoffs = files.filter(f => f.endsWith('.md')).sort().reverse();\n \n if (handoffs.length > 0) {\n return {\n hasHandoff: true,\n latestHandoff: handoffs[0],\n };\n }\n } catch {\n // No handoffs directory\n }\n \n return { hasHandoff: false };\n }\n\n /**\n * Initialize spec.md template\n */\n async initSpec(): Promise<void> {\n const specPath = join(this.config.projectPath, this.config.antiHallucination.specFile);\n \n try {\n await access(specPath, constants.R_OK);\n logger.info('spec.md already exists');\n return;\n } catch {\n // Create template\n }\n \n const template = `# Project Specification\n\n## Constraints\n\n### Naming\n- Components: PascalCase\n- Files: kebab-case\n- Variables: camelCase\n- Constants: SCREAMING_SNAKE_CASE\n\n### Forbidden\n- No inline styles\n- No \\`any\\` types\n- No console.log in production code\n- No hardcoded secrets\n- No disabled ESLint rules\n\n### Required\n- JSDoc on all exported functions\n- Input validation on API routes\n- Error handling for async operations\n- Unit tests for business logic\n\n## Architecture\n\nDescribe your project architecture here.\n\n## Dependencies\n\nList approved dependencies here.\n`;\n \n await writeFile(specPath, template);\n logger.success('Created spec.md template');\n }\n\n /**\n * Extract constraints from a section\n */\n private extractConstraints(content: string, section: string): string[] {\n const sectionMatch = content.match(new RegExp(`### ${section}[\\\\s\\\\S]*?(?=###|$)`, 'i'));\n if (!sectionMatch) return [];\n \n const lines = sectionMatch[0].split('\\n');\n return lines\n .filter(line => line.trim().startsWith('-'))\n .map(line => line.replace(/^-\\s*/, '').trim());\n }\n\n /**\n * Convert a constraint description to a regex pattern\n */\n private patternToRegex(description: string): RegExp | null {\n // Simple pattern matching\n if (description.includes('console.log')) {\n return /console\\.log/;\n }\n if (description.includes('any') && description.includes('type')) {\n return /:\\s*any\\b/;\n }\n if (description.includes('inline style')) {\n return /style=\\{/;\n }\n return null;\n }\n}\n","/**\n * CLI Commands Index\n *\n * Export all command registration functions\n */\n\nexport { registerInitCommand } from './init.js';\nexport { registerInstallCommand } from './install.js';\nexport { registerSyncCommand } from './sync.js';\nexport { registerSkillsCommand } from './skills.js';\nexport {\n registerAgentsCommand,\n registerCommandsCommand,\n registerModeCommand,\n registerToolsCommand,\n registerPluginsCommand,\n registerMemoryCommand,\n registerBeadsCommand,\n registerStatusCommand,\n} from './misc.js';\nexport { registerSessionCommand } from './session.js';\n\n\n\n\n","/**\n * Init Command\n *\n * Initialize AIKit configuration for a specific platform\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\n\nimport { loadConfig } from '../../core/config.js';\nimport { SkillEngine } from '../../core/skills.js';\nimport { BeadsIntegration } from '../../core/beads.js';\nimport { CliDetector, CliTool, CliPlatform } from '../../utils/cli-detector.js';\nimport { logger } from '../../utils/logger.js';\nimport { paths } from '../../utils/paths.js';\nimport { initializeConfig, installCliTool } from '../helpers.js';\nimport { AgentManager } from '../../core/agents.js';\nimport { CommandRunner } from '../../core/commands.js';\nimport { createAdapter } from '../../platform/adapters.js';\n\nexport function registerInitCommand(program: Command): void {\n program\n .command('init [platform]')\n .description('Initialize AIKit configuration for a specific platform')\n .option('-g, --global', 'Initialize global configuration')\n .option('-p, --project', 'Initialize project-level configuration')\n .action(async (platformArg, options) => {\n const configDir = options.global ? paths.globalConfig() : paths.projectConfig();\n\n console.log(chalk.bold('\\n🚀 AIKit Setup\\n'));\n logger.info(`Initializing AIKit in ${configDir}...`);\n\n try {\n // Step 1: Initialize config\n await initializeConfig(configDir, options.global);\n logger.success('✓ Configuration created');\n\n if (!options.global) {\n // Step 2: Platform selection\n let selectedPlatform: CliPlatform;\n\n if (platformArg) {\n selectedPlatform = CliDetector.matchPlatform(platformArg);\n } else {\n const platforms = await CliDetector.detectPlatforms();\n const installed = CliDetector.filterInstalledPlatforms(platforms);\n\n console.log(chalk.bold('\\n🔍 Available CLI Tools\\n'));\n for (const p of platforms) {\n const status = p.installed ? chalk.green('✓') : chalk.gray('○');\n console.log(` ${status} ${p.displayName}`);\n }\n\n const { platform } = await inquirer.prompt([\n {\n type: 'list',\n name: 'platform',\n message: 'Which CLI tool do you want to configure AIKit for?',\n choices: platforms.map(p => ({\n name: p.displayName,\n value: p.platform,\n })),\n default: installed[0]?.platform || CliPlatform.OPENCODE,\n },\n ]);\n\n selectedPlatform = platform;\n }\n\n logger.info(`Selected platform: ${selectedPlatform}`);\n\n // Step 3: Sync skills\n const config = await loadConfig();\n const engine = new SkillEngine(config);\n const result = await engine.syncSkillsToProject();\n if (result.count > 0) {\n logger.success(`✓ Synced ${result.count} skills`);\n }\n\n // Step 4: Install CLI tool if needed\n if (selectedPlatform === CliPlatform.CLAUDE) {\n const cliTools = await CliDetector.checkAll();\n const claudeTool = cliTools.find(t => t.name === CliTool.CLAUDE);\n if (claudeTool && !claudeTool.installed) {\n const { installClaude } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'installClaude',\n message: 'Claude Code CLI is not installed. Install now?',\n default: true,\n },\n ]);\n\n if (installClaude) {\n await installCliTool(claudeTool);\n }\n }\n }\n\n // Step 5: Initialize beads\n const beads = new BeadsIntegration();\n const beadsStatus = await beads.getStatus();\n\n if (!beadsStatus.initialized) {\n logger.info('Initializing .beads directory...');\n await beads.initLocal();\n logger.success('✓ .beads directory created');\n\n if (!beadsStatus.installed) {\n logger.info('Tip: Install Beads CLI globally for full functionality: npm install -g beads');\n }\n } else {\n logger.info('Beads already initialized');\n }\n\n // Step 5.5: Setup git hooks\n logger.info('Setting up git hooks...');\n await beads.setupGitHooks();\n logger.success('✓ Git hooks configured');\n\n // Step 6: Install platform-specific commands\n const adapter = createAdapter(selectedPlatform);\n logger.info(`Installing AIKit for ${adapter.displayName}...`);\n await installToPlatform(adapter, config);\n\n console.log(chalk.bold('\\n✨ AIKit is ready!\\n'));\n\n // Show platform-specific usage\n if (selectedPlatform === CliPlatform.OPENCODE) {\n showOpenCodeUsage();\n } else if (selectedPlatform === CliPlatform.CLAUDE) {\n showClaudeUsage();\n }\n }\n } catch (error) {\n logger.error('Failed to initialize AIKit:', error);\n process.exit(1);\n }\n });\n}\n\nasync function installToPlatform(\n adapter: any,\n config: any\n): Promise<void> {\n const skillEngine = new SkillEngine(config);\n const commandRunner = new CommandRunner(config);\n const agentManager = new AgentManager(config);\n\n const skills = await skillEngine.listSkills();\n const commands = await commandRunner.listCommands();\n const agents = await agentManager.listAgents();\n\n // Install commands\n logger.info(`Installing ${commands.length} commands...`);\n for (const command of commands) {\n const { name, content } = await adapter.transformCommand(command);\n await adapter.installCommand(name, content);\n logger.info(` ✓ Created ${name} command`);\n }\n\n // Install skills\n logger.info(`Installing ${skills.length} skills...`);\n for (const skill of skills) {\n const { name, directory, files } = await adapter.transformSkill(skill);\n await adapter.installSkill(name, directory, files);\n logger.info(` ✓ Created ${name} skill`);\n }\n\n // Install agents\n logger.info(`Installing ${agents.length} agents...`);\n for (const agent of agents) {\n const { name, content } = await adapter.transformAgent(agent);\n await adapter.installAgent(name, content);\n logger.info(` ✓ Created ${name} agent`);\n }\n}\n\nfunction showOpenCodeUsage(): void {\n console.log('Usage in OpenCode:');\n console.log(chalk.cyan(' /skills') + ' - List all available skills');\n console.log(chalk.cyan(' /plan') + ' - Create implementation plan');\n console.log(chalk.cyan(' /tdd') + ' - Test-driven development');\n console.log(chalk.cyan(' /debug') + ' - Systematic debugging');\n console.log(chalk.cyan(' /review') + ' - Code review checklist');\n console.log(chalk.cyan(' /git') + ' - Git workflow');\n console.log(chalk.cyan(' /frontend-aesthetics') + ' - UI/UX guidelines');\n console.log('\\nPress ' + chalk.bold('Ctrl+K') + ' in OpenCode to see all commands.\\n');\n}\n\nfunction showClaudeUsage(): void {\n console.log('Usage in Claude Code CLI:');\n console.log(chalk.cyan(' /help') + ' - List all available commands');\n console.log(chalk.cyan(' /plan') + ' - Create implementation plan');\n console.log(chalk.cyan(' /implement') + ' - Implement a task');\n console.log(chalk.cyan(' /test') + ' - Run tests');\n console.log('\\nType ' + chalk.bold('\"/help\"') + ' in Claude to see all commands.\\n');\n}\n\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\n/**\n * Supported CLI tools\n */\nexport enum CliTool {\n OPENCODE = 'opencode',\n CLAUDE = 'claude',\n GITHUB = 'github',\n}\n\n/**\n * Supported CLI platforms\n */\nexport enum CliPlatform {\n OPENCODE = 'opencode',\n CLAUDE = 'claude',\n CODEX = 'codex',\n}\n\n/**\n * CLI tool info\n */\nexport interface CliToolInfo {\n name: CliTool;\n displayName: string;\n detected: boolean;\n installed: boolean;\n version?: string;\n configPath?: string;\n}\n\n/**\n * Platform info\n */\nexport interface PlatformInfo {\n platform: CliPlatform;\n displayName: string;\n installed: boolean;\n configPath: string;\n}\n\n/**\n * Detect and check CLI tools\n */\nexport class CliDetector {\n /**\n * Check if OpenCode is installed\n */\n static async checkOpenCode(): Promise<CliToolInfo> {\n try {\n const opencodePath = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.config');\n const opencodeConfig = join(opencodePath, 'opencode', 'opencode.json');\n let installed = existsSync(opencodeConfig);\n \n // Verify opencode is actually runnable by checking command\n let version: string | undefined;\n if (installed) {\n try {\n execSync('opencode --version', { stdio: 'ignore' });\n version = 'installed';\n } catch (error) {\n // Command check failed - check if config file still exists\n if (existsSync(opencodeConfig)) {\n version = 'installed (config exists)';\n } else {\n // Config file doesn't exist anymore\n installed = false;\n }\n }\n }\n \n return {\n name: CliTool.OPENCODE,\n displayName: 'OpenCode',\n detected: true,\n installed,\n version,\n configPath: opencodeConfig,\n };\n } catch {\n return {\n name: CliTool.OPENCODE,\n displayName: 'OpenCode',\n detected: false,\n installed: false,\n };\n }\n }\n\n /**\n * Check if Claude CLI is installed\n */\n static async checkClaude(): Promise<CliToolInfo> {\n try {\n execSync('claude --version', { stdio: 'ignore' });\n \n return {\n name: CliTool.CLAUDE,\n displayName: 'Claude CLI',\n detected: true,\n installed: true,\n version: 'installed',\n };\n } catch {\n return {\n name: CliTool.CLAUDE,\n displayName: 'Claude CLI',\n detected: true,\n installed: false,\n };\n }\n }\n\n /**\n * Check if GitHub CLI is installed\n */\n static async checkGitHub(): Promise<CliToolInfo> {\n try {\n const output = execSync('gh --version', { stdio: 'pipe', encoding: 'utf-8' });\n const match = output.match(/gh version ([\\d.]+)/);\n const version = match?.[1];\n \n return {\n name: CliTool.GITHUB,\n displayName: 'GitHub CLI',\n detected: true,\n installed: true,\n version,\n };\n } catch {\n return {\n name: CliTool.GITHUB,\n displayName: 'GitHub CLI',\n detected: true,\n installed: false,\n };\n }\n }\n\n /**\n * Check all supported CLIs\n */\n static async checkAll(): Promise<CliToolInfo[]> {\n const results: CliToolInfo[] = [];\n \n results.push(await this.checkOpenCode());\n results.push(await this.checkClaude());\n results.push(await this.checkGitHub());\n \n return results;\n }\n\n /**\n * Filter tools by installation status\n */\n static filterInstalled(tools: CliToolInfo[]): CliToolInfo[] {\n return tools.filter(t => !t.installed && t.detected);\n }\n\n /**\n * Filter tools that can be installed\n */\n static filterInstallable(tools: CliToolInfo[]): CliToolInfo[] {\n return tools.filter(t => t.detected && !t.installed);\n }\n\n /**\n * Detect available platforms\n */\n static async detectPlatforms(): Promise<PlatformInfo[]> {\n const platforms: PlatformInfo[] = [];\n \n // Check OpenCode\n const opencodePath = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.config');\n platforms.push({\n platform: CliPlatform.OPENCODE,\n displayName: 'OpenCode',\n installed: existsSync(join(opencodePath, 'opencode', 'opencode.json')),\n configPath: opencodePath,\n });\n \n // Check Claude Code CLI\n const claudePath = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.claude');\n platforms.push({\n platform: CliPlatform.CLAUDE,\n displayName: 'Claude Code CLI',\n installed: existsSync(claudePath),\n configPath: claudePath,\n });\n \n return platforms;\n }\n\n /**\n * Filter installed platforms\n */\n static filterInstalledPlatforms(platforms: PlatformInfo[]): PlatformInfo[] {\n return platforms.filter(p => p.installed);\n }\n\n /**\n * Match platform name to CliPlatform enum\n */\n static matchPlatform(name: string): CliPlatform {\n const normalized = name.toLowerCase();\n if (normalized === 'opencode' || normalized === 'open-code') {\n return CliPlatform.OPENCODE;\n } else if (normalized === 'claude' || normalized === 'claude-code' || normalized === 'claude-code-cli') {\n return CliPlatform.CLAUDE;\n } else if (normalized === 'codex') {\n return CliPlatform.CODEX;\n }\n throw new Error(`Unknown platform: ${name}`);\n }\n}\n\n","/**\n * CLI Helper Functions\n * \n * Contains utility functions for CLI commands:\n * - initializeConfig: Create AIKit configuration\n * - configureMcpServer: Configure MCP server for OpenCode\n * - installCliTool: Install CLI tools\n * - installToOpenCode: Install AIKit to OpenCode\n */\n\nimport { existsSync } from 'fs';\nimport { mkdir, writeFile, readFile, access } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport { homedir } from 'os';\nimport { fileURLToPath } from 'url';\nimport { execSync } from 'child_process';\n\nimport { VERSION } from '../index.js';\nimport { loadConfig } from '../core/config.js';\nimport { SkillEngine } from '../core/skills.js';\nimport { CommandRunner } from '../core/commands.js';\nimport { CliTool, CliToolInfo } from '../utils/cli-detector.js';\nimport { logger } from '../utils/logger.js';\nimport { paths } from '../utils/paths.js';\n\n/**\n * Initialize AIKit configuration in a directory\n */\nexport async function initializeConfig(configDir: string, _isGlobal?: boolean): Promise<void> {\n // Create directory structure\n const dirs = [\n '',\n 'skills',\n 'agents',\n 'commands',\n 'commands/build',\n 'commands/git',\n 'commands/plan',\n 'commands/research',\n 'tools',\n 'plugins',\n 'memory',\n 'memory/_templates',\n 'memory/handoffs',\n 'memory/observations',\n 'memory/research',\n ];\n \n for (const dir of dirs) {\n await mkdir(join(configDir, dir), { recursive: true });\n }\n \n // Create default config file\n const defaultConfig = {\n version: VERSION(),\n skills: { enabled: true },\n agents: { enabled: true, default: 'build' },\n commands: { enabled: true },\n tools: { enabled: true },\n plugins: { enabled: true },\n memory: { enabled: true },\n beads: { enabled: true },\n antiHallucination: { enabled: true },\n };\n \n await writeFile(\n join(configDir, 'aikit.json'),\n JSON.stringify(defaultConfig, null, 2)\n );\n \n // Create AGENTS.md template\n const agentsMd = `# AIKit Agent Rules\n\n## Build Commands\n- \\`npm run build\\` - Build the project\n- \\`npm run test\\` - Run tests\n- \\`npm run lint\\` - Run linting\n\n## Code Style\n- Use 2 spaces for indentation\n- Use single quotes for strings\n- Add trailing commas\n\n## Naming Conventions\n- Variables: camelCase\n- Components: PascalCase\n- Files: kebab-case\n\n## Project-Specific Rules\nAdd your project-specific rules here.\n`;\n \n await writeFile(join(configDir, 'AGENTS.md'), agentsMd);\n}\n\n/**\n * Configure MCP server for OpenCode\n */\nexport async function configureMcpServer(projectPath: string): Promise<void> {\n // Get absolute path to MCP server\n const currentFile = fileURLToPath(import.meta.url);\n const currentDir = dirname(currentFile);\n const aikitPath = join(currentDir, '..', '..');\n const mcpServerPath = join(aikitPath, 'dist', 'mcp-server.js');\n \n // OpenCode config locations (try multiple)\n const configLocations = [\n // Global config (most common)\n join(homedir(), '.config', 'opencode', 'opencode.json'),\n // Project-level config\n join(projectPath, '.opencode', 'opencode.json'),\n // Alternative global location\n join(homedir(), '.opencode', 'opencode.json'),\n ];\n \n // OpenCode MCP server configuration\n const mcpServerConfig = {\n type: 'local',\n command: ['node', mcpServerPath],\n environment: {},\n };\n \n // Try to update OpenCode config\n for (const configPath of configLocations) {\n try {\n const configDir = join(configPath, '..');\n await mkdir(configDir, { recursive: true });\n \n // Read existing config or create new\n let config: any = {};\n if (existsSync(configPath)) {\n try {\n const existing = await readFile(configPath, 'utf-8');\n config = JSON.parse(existing);\n } catch {\n config = {};\n }\n }\n \n // OpenCode uses \"mcp\" key, not \"mcpServers\"\n if (!config.mcp) {\n config.mcp = {};\n }\n \n // Add or update aikit MCP server\n config.mcp.aikit = mcpServerConfig;\n \n await writeFile(configPath, JSON.stringify(config, null, 2));\n logger.success(`\\n✅ MCP server configured: ${configPath}`);\n logger.info(` Server: node ${mcpServerPath}`);\n return;\n } catch {\n // Try next location\n continue;\n }\n }\n \n // If all locations failed, create instructions file\n const instructionsPath = join(projectPath, '.opencode', 'MCP_SETUP.md');\n await mkdir(join(projectPath, '.opencode'), { recursive: true });\n await writeFile(instructionsPath, `# AIKit MCP Server Configuration\n\n## Automatic Setup Failed\n\nPlease manually configure the MCP server in OpenCode.\n\n## Configuration\n\nAdd this to your OpenCode configuration file (\\`~/.config/opencode/opencode.json\\`):\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"aikit\": {\n \"command\": \"node\",\n \"args\": [\"${mcpServerPath}\"],\n \"env\": {}\n }\n }\n}\n\\`\\`\\`\n\n## After Configuration\n\n1. Restart OpenCode completely\n2. OpenCode will automatically start the MCP server\n3. Tools will be available via MCP protocol\n4. You can use tools like \\`tool_read_figma_design\\` directly\n\n## Verify\n\nAfter restarting OpenCode, check:\n- MCP server is running (check OpenCode settings)\n- Tools are discoverable (OpenCode should list them)\n- You can call tools via MCP protocol\n`);\n logger.warn(`\\n⚠️ Could not auto-configure MCP server. See: ${instructionsPath}`);\n}\n\n/**\n * Install a CLI tool\n */\nexport async function installCliTool(tool: CliToolInfo): Promise<boolean> {\n try {\n logger.info(`Installing ${tool.displayName}...`);\n \n switch (tool.name) {\n case CliTool.OPENCODE:\n await installToOpenCode(paths.opencodeConfig());\n break;\n \n case CliTool.CLAUDE:\n // Use native install script (recommended by Claude)\n // Defer platform check to avoid cwd issues\n let platform: string;\n try {\n platform = process.platform;\n } catch {\n platform = 'darwin'; // Default to macOS if platform detection fails\n }\n\n if (platform === 'darwin') {\n // macOS\n execSync('curl -fsSL https://claude.ai/install.sh | bash', { stdio: 'inherit' });\n } else if (platform === 'win32') {\n // Windows\n execSync('powershell -Command \"irm https://claude.ai/install.ps1 | iex\"', { stdio: 'inherit' });\n } else {\n // Linux/WSL\n execSync('curl -fsSL https://claude.ai/install.sh | bash', { stdio: 'inherit' });\n }\n break;\n \n case CliTool.GITHUB:\n execSync('npm install -g gh', { stdio: 'inherit' });\n break;\n }\n \n return true;\n } catch (error) {\n logger.error(`Failed to install ${tool.displayName}:`, error);\n return false;\n }\n}\n\n/**\n * Agent files for OpenCode\n * NOTE: DO NOT create agents named 'build' or 'planner' - these conflict with\n * OpenCode's default modes (Plan, Planner, Build). Use @-mention for subagents instead.\n */\nconst AGENT_FILES: Record<string, string> = {\n rush: `---\ndescription: Fast execution for small/urgent changes with minimal planning.\nmode: subagent\ntools:\n \"*\": true\n---\n\nUse for quick fixes, hotfixes, or tiny edits. Keep scope minimal and verify quickly.`,\n review: `---\ndescription: Code review and quality/security auditing agent.\nmode: subagent\ntools:\n \"*\": true\n---\n\nUse to review correctness, security, performance, maintainability, and tests. Be specific\nabout issues and suggest concrete fixes.`,\n scout: `---\ndescription: Research agent for external docs, patterns, and references.\nmode: subagent\ntools:\n \"*\": true\n---\n\nUse to look up docs, examples, best practices. Summarize findings concisely and cite sources.`,\n explore: `---\ndescription: Codebase navigation agent (search, grep, structure understanding).\nmode: subagent\ntools:\n \"*\": true\n---\n\nUse to locate files, patterns, dependencies, and gather quick context in the repo.`,\n vision: `---\ndescription: Visual analysis agent for mockups, screenshots, PDFs, diagrams.\nmode: subagent\ntools:\n \"*\": true\n---\n\nUse to interpret visual assets (components, layout, colors, typography) and translate to tasks.`,\n 'one-shot': `---\ndescription: End-to-end autonomous task execution (beta). Complete tasks from start to finish.\nmode: subagent\ntools:\n \"*\": true\n---\n\n⚠️ BETA: This mode is experimental. Use for straightforward tasks first.\n\n## One-Shot Mode - Autonomous Task Execution\n\nExecute tasks end-to-end with minimal intervention:\n\n### Workflow Phases\n1. **REQUIREMENTS** - Gather task type, scope, dependencies, success criteria\n2. **PLANNING** - Create detailed plan, recommend skills/tools, create tracking bead\n3. **COMPLEXITY** - Auto-split if: >30min, >10 files, >500 lines, >2 sub-systems\n4. **EXECUTION** - Parallel tasks (max 3), dynamic agent delegation\n5. **TESTING** - Run until pass: typecheck → test → lint → build (max 3 retries)\n6. **VERIFICATION** - Quality gates ✓ → Manual verification → Deployment approval\n7. **COMPLETION** - Generate proof, update tracking, collect feedback\n\n### Quality Gates (ALL must pass)\n- \\`npm run typecheck\\` - No type errors\n- \\`npm run test\\` - All tests pass\n- \\`npm run lint\\` - No lint errors\n- \\`npm run build\\` - Build succeeds\n\n### Error Recovery (3 Levels)\n- **Level 1**: Auto-fix (type errors, lint --fix)\n- **Level 2**: Alternative approach via @review\n- **Level 3**: User intervention + follow-up task\n\n### Delegates To\n@planner for planning, @build for implementation, @review for code review,\n@scout for research, @explore for navigation, @vision for visual analysis.\n\n### Best Use Cases\n- Straightforward features with clear scope\n- Bug fixes with known reproduction steps\n- Refactoring with defined boundaries\n\n### Consider Alternatives For\n- Complex multi-system features → Use /plan + /implement\n- Exploratory research → Use /research first\n- Critical production changes → Manual with /review`,\n};\n\n/**\n * Generate analyze-figma command content\n */\nfunction generateAnalyzeFigmaCommand(): string {\n return `# Command: /analyze-figma\n\n## Description\nAnalyze a Figma design and extract design tokens\n\n## Usage\n\\`/analyze-figma <figma-url>\\`\n\n## Examples\n- \\`/analyze-figma https://www.figma.com/design/...\\`\n\n## ⚠️ CRITICAL: Extract URL FIRST!\n\n**BEFORE ANYTHING ELSE**: Look at the user's FULL input message (all lines) and find the Figma URL. It's ALWAYS there - never ask for it!\n\n**The URL pattern**: Look for text containing \\`figma.com/design/\\` anywhere in the user's message.\n\n**Example of what user input looks like**:\n\\`\\`\\`\n/analyze-figma https://www.figma.com/design/lC34qpTSy2MYalTIOsj8S2/\nOnline-Education-Website-Free-Template--Community-?t=7G5yzTiEtJlIZBtY-0\n\\`\\`\\`\n\n**Extract the complete URL** (combine if split):\n\\`https://www.figma.com/design/lC34qpTSy2MYalTIOsj8S2/Online-Education-Website-Free-Template--Community-?t=7G5yzTiEtJlIZBtY-0\\`\n\n## Workflow\n\n**IMPORTANT**: When user provides a Figma URL, you MUST immediately:\n\n**Step 1: Extract URL from User Input**\n\n**CRITICAL**: The URL is ALWAYS in the user's input message! DO NOT ask for it - just extract it!\n\n**MANDATORY**: You MUST extract the URL before proceeding. This is not optional!\n\n**How to Extract**:\n1. **Read the ENTIRE user input message** - look at ALL lines, not just the first line\n2. **Search for ANY text containing** \\`figma.com/design/\\` - this is the URL\n3. **URL may appear in different formats**:\n - On same line: \\`/analyze-figma https://www.figma.com/design/...\\`\n - Split across lines\n4. **Extract the COMPLETE URL**:\n - Start from \\`https://\\` or \\`http://\\`\n - Include everything until the end of the line or next whitespace\n - If URL is split, combine ALL parts into one complete URL\n5. **Include ALL query parameters**: \\`?node-id=...\\`, \\`&t=...\\`, etc.\n\n**CRITICAL RULES**:\n- ✅ DO: Read the ENTIRE user message (all lines)\n- ✅ DO: Look for \\`figma.com/design/\\` anywhere in the message\n- ✅ DO: Combine split lines into one URL\n- ❌ DO NOT: Ask user for URL - it's ALWAYS in the input\n- ❌ DO NOT: Skip this step - URL extraction is MANDATORY\n- ❌ DO NOT: Proceed without extracting URL first\n\n**Step 2: Check Tool Configuration**\n\nBefore calling the tool, verify that Figma tool is configured:\n- If not configured, inform user to run: \\`aikit skills figma-analysis config\\`\n- The tool requires a Figma Personal Access Token\n\n**Step 3: Call MCP Tool read_figma_design**\n\nUse the MCP tool \\`read_figma_design\\` with the extracted URL:\n\\`\\`\\`\nUse tool: read_figma_design\nArguments: { \"url\": \"[extracted URL]\" }\n\\`\\`\\`\n\n**Step 4: Format and Save**\n\nFormat extracted tokens as structured markdown and save using memory-update tool.\n\n**Step 5: Report Results**\n\nReport what was extracted:\n- Number of screens found\n- Number of colors in palette\n- Typography styles found\n- Components identified\n\n## Critical Instructions\n\n- **DO NOT** ask user to \"share the Figma URL\" - they already provided it in the command\n- **DO NOT** wait for confirmation - just start analyzing immediately\n- **DO** extract URL from full user input message\n- **DO** call MCP tool \\`read_figma_design\\` immediately\n- **DO** save to memory automatically`;\n}\n\n/**\n * Install AIKit to OpenCode\n */\nexport async function installToOpenCode(_opencodePath: string): Promise<void> {\n // Get current working directory for project-level installation\n const projectPath = process.cwd();\n const opencodeCommandDir = join(projectPath, '.opencode', 'command');\n const aikitDir = join(projectPath, '.aikit');\n const opencodeAgentDir = join(paths.opencodeConfig(), 'agent');\n \n // Ensure directories exist\n await mkdir(opencodeCommandDir, { recursive: true });\n await mkdir(join(aikitDir, 'skills'), { recursive: true });\n await mkdir(opencodeAgentDir, { recursive: true });\n\n // Install agent files\n for (const [name, content] of Object.entries(AGENT_FILES)) {\n const filePath = join(opencodeAgentDir, `${name}.md`);\n try {\n await access(filePath);\n // File exists - check if it has mode: subagent\n const existingContent = await readFile(filePath, 'utf8');\n if (!existingContent.includes('mode: subagent')) {\n // Missing mode: subagent - add it to preserve user edits but ensure critical config\n const matter = await import('gray-matter');\n const { data: frontmatter, content: body } = matter.default(existingContent);\n frontmatter.mode = 'subagent';\n const updatedContent = matter.default.stringify(body, frontmatter);\n await writeFile(filePath, updatedContent, 'utf8');\n }\n // File exists and has mode: subagent - keep user edits\n } catch {\n // File doesn't exist - create it\n await writeFile(filePath, content, 'utf8');\n }\n }\n \n // Load config to get skills and commands\n const config = await loadConfig();\n const skillEngine = new SkillEngine(config);\n const commandRunner = new CommandRunner(config);\n \n const skills = await skillEngine.listSkills();\n const commands = await commandRunner.listCommands();\n \n const opencodeCommands: Record<string, string> = {};\n \n // Create /skills command that lists all available skills\n const skillsList = skills.map(s => `| \\`/ak_sk_${s.name.replace(/\\s+/g, '-')}\\` | ${s.description} |`).join('\\n');\n opencodeCommands['ak_cm_skills'] = `List all available AIKit skills and how to use them.\n\nREAD .aikit/AGENTS.md\n\n## Available Skills\n\n| Command | Description |\n|---------|-------------|\n${skillsList}\n\nType any command to use that skill. For example: \\`/ak_sk_test-driven-development\\``;\n \n // Generate commands from skills\n for (const skill of skills) {\n const commandName = `ak_sk_${skill.name.replace(/\\s+/g, '-').toLowerCase()}`;\n const skillPath = skill.filePath;\n const relativePath = skillPath.startsWith(projectPath) \n ? skillPath.replace(projectPath, '').replace(/\\\\/g, '/').replace(/^\\//, '')\n : `.aikit/skills/${skill.name.replace(/\\s+/g, '-').toLowerCase()}.md`;\n \n const useWhen = skill.useWhen || `The user asks you to ${skill.name}`;\n \n opencodeCommands[commandName] = `Use the **${skill.name} skill** ${useWhen.toLowerCase()}.\n\nREAD ${relativePath}\n\n## Description\n${skill.description}\n\n## When to Use\n${useWhen}\n\n## Workflow\n${skill.content.split('\\n').slice(0, 20).join('\\n')}${skill.content.split('\\n').length > 20 ? '\\n\\n... (see full skill file for complete workflow)' : ''}\n\n**IMPORTANT**: Follow this skill's workflow step by step. Do not skip steps.\nComplete the checklist at the end of the skill.`;\n }\n \n // Generate commands from slash commands\n for (const cmd of commands) {\n // Skip if already exists as a skill command\n if (opencodeCommands[cmd.name]) continue;\n\n const commandName = `ak_cm_${cmd.name.replace(/\\//g, '').replace(/\\s+/g, '-')}`;\n const examples = cmd.examples.map(e => {\n const prefixed = e.replace(/\\//g, '/ak_cm_');\n return `- \\`${prefixed}\\``;\n }).join('\\n');\n\n // Special handling for analyze-figma command\n if (cmd.name === 'analyze-figma') {\n opencodeCommands[commandName] = generateAnalyzeFigmaCommand();\n } else {\n opencodeCommands[commandName] = `# Command: /ak_cm_${cmd.name}\n\n## Description\n${cmd.description}\n\n## Usage\n\\`${cmd.usage.replace(/\\//g, '/ak_cm_')}\\`\n\n## Examples\n${examples}\n\n## ⚠️ CRITICAL: The User Has Already Provided Arguments!\n\n**The user has provided arguments with this command!**\n\nThe arguments are available in this command response - look at the command workflow below, which now includes explicit instructions to use the provided arguments.\n\n**YOUR JOB**:\n1. Follow the command workflow steps\n2. The workflow will tell you to look at \"Arguments Provided\" section\n3. Use those arguments - do NOT ask the user for this information!\n4. They have already provided it - extract and use it!\n\n**Example Scenario**:\n- User runs: \\`/ak_cm_${cmd.name} snake game with html & css\\`\n- Command: \\`/ak_cm_${cmd.name}\\`\n- Arguments to use: \\`snake game with html & css\\`\n- You must use \"snake game with html & css\" as provided in the workflow!\n\n**DO NOT**: Ask \"Please provide a task description\"\n**DO**: Follow the workflow and use the arguments provided in it!\n\n## Workflow\n${cmd.content}\n\n**Category**: ${cmd.category}`;\n }\n }\n \n // Write all command files\n let count = 0;\n for (const [name, content] of Object.entries(opencodeCommands)) {\n const filePath = join(opencodeCommandDir, `${name}.md`);\n await writeFile(filePath, content.trim());\n logger.info(` ✓ Created /${name} command`);\n count++;\n }\n\n logger.success(`\\nCreated ${count} OpenCode commands in .opencode/command/`);\n\n // Configure MCP server\n await configureMcpServer(projectPath);\n\n logger.info('\\nUsage in OpenCode:');\n logger.info(' Press Ctrl+K to open command picker');\n logger.info(' Or type /ak_cm_skills to see all available skills');\n logger.info(` Available: ${skills.length} skills (ak_sk_*), ${commands.length} commands (ak_cm_*)`);\n logger.info(' MCP server configured - tools available via MCP protocol');\n}\n\n/**\n * Group array by key function\n */\nexport function groupBy<T>(array: T[], keyFn: (item: T) => string): Record<string, T[]> {\n return array.reduce((acc, item) => {\n const key = keyFn(item);\n if (!acc[key]) acc[key] = [];\n acc[key].push(item);\n return acc;\n }, {} as Record<string, T[]>);\n}\n\n/**\n * Create a checkpoint\n */\nexport async function createCheckpoint(message?: string): Promise<void> {\n try {\n const { CheckpointManager } = await import('../core/checkpoints.js');\n const manager = new CheckpointManager();\n const checkpoint = await manager.create(message);\n\n logger.success('✓ Checkpoint created');\n console.log(` ID: ${checkpoint.id}`);\n console.log(` Message: ${checkpoint.message || 'No message'}`);\n console.log(` Branch: ${checkpoint.branch}`);\n console.log(` Files: ${checkpoint.files.length} modified`);\n } catch (error) {\n logger.error('Failed to create checkpoint:', error);\n }\n}\n\n/**\n * Restore a checkpoint\n */\nexport async function restoreCheckpoint(checkpointId?: string): Promise<void> {\n try {\n const { CheckpointManager } = await import('../core/checkpoints.js');\n const manager = new CheckpointManager();\n\n // If no ID provided, get latest\n const id = checkpointId || (await manager.getLatest())?.id;\n if (!id) {\n logger.error('No checkpoints found');\n return;\n }\n\n logger.info(`Restoring checkpoint: ${id}`);\n\n const success = await manager.restore(id);\n if (success) {\n logger.success('✓ Checkpoint restored successfully');\n } else {\n logger.error('Failed to restore checkpoint');\n }\n } catch (error) {\n logger.error('Failed to restore checkpoint:', error);\n }\n}\n\n/**\n * List checkpoints\n */\nexport async function listCheckpoints(): Promise<void> {\n try {\n const { CheckpointManager } = await import('../core/checkpoints.js');\n const manager = new CheckpointManager();\n const checkpoints = await manager.list();\n\n if (checkpoints.length === 0) {\n logger.info('No checkpoints found');\n return;\n }\n\n console.log('\\nAvailable Checkpoints:');\n console.log('━'.repeat(60));\n\n for (const checkpoint of checkpoints) {\n const date = new Date(checkpoint.timestamp).toLocaleString();\n console.log(`\\n${checkpoint.id}`);\n console.log(` Date: ${date}`);\n console.log(` Message: ${checkpoint.message || 'No message'}`);\n console.log(` Branch: ${checkpoint.branch}`);\n console.log(` Files: ${checkpoint.files.length} modified`);\n }\n\n console.log('\\n' + '━'.repeat(60));\n console.log(`\\nTotal: ${checkpoints.length} checkpoint${checkpoints.length > 1 ? 's' : ''}\\n`);\n console.log('Restore with: /checkpoint:restore <id>');\n console.log('Latest: /checkpoint:restore latest\\n');\n } catch (error) {\n logger.error('Failed to list checkpoints:', error);\n }\n}\n\n/**\n * Create a custom agent\n */\nexport async function createCustomAgent(name: string, description?: string): Promise<void> {\n try {\n const { AgentManager: CustomAgentManager } = await import('../core/agentManager.js');\n const manager = new CustomAgentManager();\n const agent = await manager.createAgent(name, description);\n\n logger.success(`✓ Agent \"${name}\" created successfully`);\n console.log(`\\nFile: ${agent.filePath}`);\n console.log(`Description: ${agent.description}`);\n console.log(`\\nYou can now use this agent with /agent ${name}\\n`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('already exists')) {\n logger.error(`Agent \"${name}\" already exists`);\n } else {\n logger.error('Failed to create agent:', error);\n }\n }\n}\n\n/**\n * List all agents\n */\nexport async function listAgents(): Promise<void> {\n try {\n const { AgentManager: CustomAgentManager } = await import('../core/agentManager.js');\n const manager = new CustomAgentManager();\n const agents = await manager.listAgents();\n\n if (agents.length === 0) {\n logger.info('No agents found');\n return;\n }\n\n // Group by type/category\n const builtIn = agents.filter(a => !a.filePath.includes('.aikit/agents'));\n const custom = agents.filter(a => a.filePath.includes('.aikit/agents'));\n\n console.log('\\nAvailable Agents:');\n console.log('━'.repeat(60));\n\n if (builtIn.length > 0) {\n console.log('\\n### Built-in Agents');\n builtIn.forEach(agent => {\n console.log(`\\n• ${agent.name} - ${agent.description}`);\n console.log(` Use when: ${agent.useWhen}`);\n });\n }\n\n if (custom.length > 0) {\n console.log('\\n### Custom Agents');\n custom.forEach(agent => {\n console.log(`\\n• ${agent.name} - ${agent.description}`);\n console.log(` Use when: ${agent.useWhen}`);\n });\n }\n\n console.log('\\n' + '━'.repeat(60));\n console.log(`\\nTotal: ${agents.length} agent${agents.length > 1 ? 's' : ''}\\n`);\n console.log('Create a new agent: /create-agent <name> [description]\\n');\n } catch (error) {\n logger.error('Failed to list agents:', error);\n }\n}\n\n/**\n * Initialize AI-safe git ignore patterns\n */\nexport async function initGitIgnore(): Promise<void> {\n try {\n const { initAISafeGitignore } = await import('../utils/git-ignore.js');\n const initialized = await initAISafeGitignore();\n\n if (initialized) {\n logger.success('✓ AI-safe .gitignore patterns added');\n console.log('\\nProtected:');\n console.log(' • API keys and secrets (.env, *.key)');\n console.log(' • AI working directories (.aikit/memory/)');\n console.log(' • Configuration files (.claude/settings.json)');\n console.log(' • Logs and temporary files');\n console.log('\\n✓ Safe to commit code\\n');\n } else {\n logger.info('AI-safe patterns already exist in .gitignore');\n }\n } catch (error) {\n logger.error('Failed to initialize .gitignore:', error);\n }\n}\n\n/**\n * Start a new development session\n */\nexport async function startSession(name?: string, goals?: string[]): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const session = await manager.startSession(name, goals);\n\n logger.success('✓ Session started');\n console.log(` ID: ${session.id}`);\n console.log(` Name: ${session.name}`);\n console.log(` Started: ${new Date(session.startTime).toLocaleString()}`);\n if (session.goals.length > 0) {\n console.log(` Goals:`);\n session.goals.forEach(goal => console.log(` - ${goal}`));\n }\n console.log('\\nCommands:');\n console.log(' /session:update [notes] - Add progress notes');\n console.log(' /session:end - End session with summary');\n console.log(' /session:current - Show session status\\n');\n } catch (error) {\n logger.error('Failed to start session:', error);\n }\n}\n\n/**\n * Update current session with progress notes\n */\nexport async function updateSession(notes?: string): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const session = await manager.updateSession(notes);\n\n if (session) {\n logger.success('✓ Session updated');\n console.log(` Session: ${session.id}`);\n console.log(` Notes: ${notes || 'Auto-generated'}`);\n console.log(` Time: ${new Date().toLocaleString()}`);\n if (session.updates[session.updates.length - 1]?.modifiedFiles) {\n const files = session.updates[session.updates.length - 1].modifiedFiles;\n console.log(` Modified: ${files?.length} files`);\n }\n console.log();\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('No active session')) {\n logger.error('No active session. Use /session:start first');\n } else {\n logger.error('Failed to update session:', error);\n }\n }\n}\n\n/**\n * End current session with summary\n */\nexport async function endSession(): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const session = await manager.endSession();\n\n if (session) {\n const duration = session.endTime\n ? Math.floor((new Date(session.endTime).getTime() - new Date(session.startTime).getTime()) / 60000)\n : 0;\n\n logger.success('✓ Session ended');\n console.log(`\\nSession: ${session.id}`);\n console.log(`Name: ${session.name}`);\n console.log(`Duration: ${Math.floor(duration / 60)}h ${duration % 60}m`);\n console.log(`Updates: ${session.updates.length}`);\n\n if (session.goals.length > 0) {\n console.log(`\\nGoals:`);\n session.goals.forEach(goal => console.log(` - ${goal}`));\n }\n\n const lastUpdate = session.updates[session.updates.length - 1];\n if (lastUpdate?.gitCommits) {\n console.log(`\\nGit Activity:`);\n console.log(` Commits: ${lastUpdate.gitCommits}`);\n if (lastUpdate.modifiedFiles && lastUpdate.modifiedFiles.length > 0) {\n console.log(` Files Modified: ${lastUpdate.modifiedFiles.length}`);\n }\n }\n\n console.log(`\\nUse /session:show ${session.id} for details\\n`);\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('No active session')) {\n logger.error('No active session. Use /session:start first');\n } else {\n logger.error('Failed to end session:', error);\n }\n }\n}\n\n/**\n * Show current active session\n */\nexport async function showCurrentSession(): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const session = await manager.getCurrentSession();\n\n if (!session) {\n logger.info('No active session');\n console.log('Start a session: /session:start [name]\\n');\n return;\n }\n\n const duration = Math.floor((Date.now() - new Date(session.startTime).getTime()) / 60000);\n\n console.log('\\n📍 Current Session');\n console.log('━'.repeat(60));\n console.log(`\\nSession: ${session.name}`);\n console.log(`ID: ${session.id}`);\n console.log(`Started: ${Math.floor(duration / 60)}h ${duration % 60}m ago`);\n\n if (session.goals.length > 0) {\n console.log(`\\nGoals:`);\n session.goals.forEach(goal => console.log(` - ${goal}`));\n }\n\n if (session.updates.length > 0) {\n console.log(`\\nRecent Updates (last 3):`);\n const recent = session.updates.slice(-3);\n recent.forEach(update => {\n const date = new Date(update.timestamp);\n console.log(` ${date.toLocaleTimeString()} - ${update.notes || 'Update'}`);\n });\n }\n\n const lastUpdate = session.updates[session.updates.length - 1];\n if (lastUpdate?.gitBranch || lastUpdate?.gitCommits) {\n console.log(`\\nGit:`);\n if (lastUpdate.gitBranch) console.log(` Branch: ${lastUpdate.gitBranch}`);\n if (lastUpdate.gitCommits) console.log(` Commits: ${lastUpdate.gitCommits}`);\n if (lastUpdate.modifiedFiles && lastUpdate.modifiedFiles.length > 0) {\n console.log(` Modified: ${lastUpdate.modifiedFiles.length} files`);\n }\n }\n\n if (lastUpdate?.beadsTask) {\n console.log(`\\nBeads Task:`);\n console.log(` ${lastUpdate.beadsTask.id} (${lastUpdate.beadsTask.status})`);\n }\n\n console.log('\\nCommands:');\n console.log(' /session:update [notes] - Add progress');\n console.log(' /session:end - Close session');\n console.log('━'.repeat(60) + '\\n');\n } catch (error) {\n logger.error('Failed to show current session:', error);\n }\n}\n\n/**\n * List all sessions\n */\nexport async function listSessions(): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const sessions = await manager.listSessions();\n\n if (sessions.length === 0) {\n logger.info('No sessions found');\n console.log('Start a session: /session:start [name]\\n');\n return;\n }\n\n console.log('\\n📚 All Sessions');\n console.log('━'.repeat(60));\n\n sessions.forEach((session, index) => {\n const startDate = new Date(session.startTime);\n const endDate = session.endTime ? new Date(session.endTime) : null;\n const duration = endDate\n ? Math.floor((endDate.getTime() - startDate.getTime()) / 60000)\n : null;\n\n console.log(`\\n${index + 1}. ${session.id}`);\n console.log(` Status: ${session.status === 'active' ? '🟢 Active' : 'Ended'}`);\n console.log(` Name: ${session.name}`);\n console.log(` Started: ${startDate.toLocaleString()}`);\n\n if (endDate && duration) {\n console.log(` Ended: ${endDate.toLocaleString()} (${Math.floor(duration / 60)}h ${duration % 60}m)`);\n }\n\n if (session.goals.length > 0) {\n console.log(` Goals: ${session.goals.slice(0, 2).join(', ')}${session.goals.length > 2 ? '...' : ''}`);\n }\n\n console.log(` Updates: ${session.updates.length}`);\n });\n\n console.log('\\n' + '━'.repeat(60));\n console.log(`\\nTotal: ${sessions.length} session${sessions.length > 1 ? 's' : ''}\\n`);\n console.log('Commands:');\n console.log(' /session:show <id> - View session details');\n console.log(' /session:resume <id> - Resume session');\n console.log(' /session:search <query> - Search sessions\\n');\n } catch (error) {\n logger.error('Failed to list sessions:', error);\n }\n}\n\n/**\n * Show specific session details\n */\nexport async function showSession(sessionId: string): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const sessions = await manager.listSessions();\n\n // Find matching session (supports partial ID)\n const session = sessions.find(s => s.id.startsWith(sessionId) || s.id === sessionId);\n\n if (!session) {\n logger.error(`Session not found: ${sessionId}`);\n console.log('Use /session:list to see all sessions\\n');\n return;\n }\n\n const startDate = new Date(session.startTime);\n const endDate = session.endTime ? new Date(session.endTime) : null;\n const duration = endDate\n ? Math.floor((endDate.getTime() - startDate.getTime()) / 60000)\n : null;\n\n console.log('\\n📄 Session: ' + session.id);\n console.log('━'.repeat(60));\n console.log(`\\nStatus: ${session.status === 'active' ? '🟢 Active' : 'Ended'}`);\n console.log(`Name: ${session.name}`);\n console.log(`Started: ${startDate.toLocaleString()}`);\n if (endDate && duration) {\n console.log(`Ended: ${endDate.toLocaleString()}`);\n console.log(`Duration: ${Math.floor(duration / 60)}h ${duration % 60}m`);\n }\n\n if (session.goals.length > 0) {\n console.log(`\\nGoals:`);\n session.goals.forEach(goal => console.log(` ${session.status === 'ended' ? '✓' : '○'} ${goal}`));\n }\n\n console.log(`\\n## Progress (${session.updates.length} updates)`);\n session.updates.forEach(update => {\n const date = new Date(update.timestamp);\n console.log(`\\n### ${date.toLocaleString()}`);\n if (update.notes) console.log(`${update.notes}`);\n if (update.gitBranch) console.log(`**Git Branch:** ${update.gitBranch}`);\n if (update.modifiedFiles && update.modifiedFiles.length > 0) {\n console.log(`**Modified Files:** ${update.modifiedFiles.length} files`);\n }\n if (update.beadsTask) {\n console.log(`**Beads Task:** ${update.beadsTask.id} (${update.beadsTask.status})`);\n }\n });\n\n if (session.status === 'ended') {\n console.log(`\\n## Summary`);\n console.log(`Duration: ${duration ? Math.floor(duration / 60) + 'h ' + (duration % 60) + 'm' : 'N/A'}`);\n console.log(`Updates: ${session.updates.length}`);\n if (session.updates[session.updates.length - 1]?.gitCommits) {\n console.log(`Git Commits: ${session.updates[session.updates.length - 1].gitCommits}`);\n }\n }\n\n console.log('\\n' + '━'.repeat(60) + '\\n');\n } catch (error) {\n logger.error('Failed to show session:', error);\n }\n}\n\n/**\n * Search sessions by keyword\n */\nexport async function searchSessions(query: string): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const sessions = await manager.searchSessions(query);\n\n if (sessions.length === 0) {\n logger.info(`No sessions found matching: ${query}`);\n console.log('Use /session:list to see all sessions\\n');\n return;\n }\n\n console.log(`\\n🔍 Search Results: \"${query}\"`);\n console.log('━'.repeat(60));\n console.log(`\\nFound ${sessions.length} session${sessions.length > 1 ? 's' : ''}:\\n`);\n\n sessions.forEach((session, index) => {\n const startDate = new Date(session.startTime);\n console.log(`${index + 1}. ${session.id}`);\n console.log(` Name: ${session.name}`);\n console.log(` Started: ${startDate.toLocaleString()}`);\n console.log(` Status: ${session.status === 'active' ? '🟢 Active' : 'Ended'}`);\n\n if (session.goals.length > 0) {\n console.log(` Goals: ${session.goals.slice(0, 2).join(', ')}${session.goals.length > 2 ? '...' : ''}`);\n }\n console.log();\n });\n\n console.log('━'.repeat(60));\n console.log(`\\nTotal: ${sessions.length} matching session${sessions.length > 1 ? 's' : ''}\\n`);\n console.log('Commands:');\n console.log(' /session:show <id> - View session details');\n console.log(' /session:resume <id> - Resume session\\n');\n } catch (error) {\n logger.error('Failed to search sessions:', error);\n }\n}\n\n","import { CliPlatform } from '../utils/cli-detector.js';\nimport { OpenCodeAdapter } from './opencode-adapter.js';\nimport { ClaudeAdapter } from './claude-adapter.js';\nimport { PlatformAdapter } from './types.js';\n\nexport function createAdapter(platform: CliPlatform): PlatformAdapter {\n switch (platform) {\n case CliPlatform.OPENCODE:\n return new OpenCodeAdapter();\n case CliPlatform.CLAUDE:\n return new ClaudeAdapter();\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport const SUPPORTED_PLATFORMS = [\n { platform: CliPlatform.OPENCODE, name: 'OpenCode' },\n { platform: CliPlatform.CLAUDE, name: 'Claude Code CLI' },\n] as const;\n","import { PlatformAdapter } from './types.js';\nimport { Command } from '../core/commands.js';\nimport { Skill } from '../core/skills.js';\nimport { Agent } from '../core/agents.js';\nimport { CliPlatform } from '../utils/cli-detector.js';\nimport { paths } from '../utils/paths.js';\nimport { readFile, writeFile, mkdir, access } from 'fs/promises';\nimport { join } from 'path';\n\ninterface TransformedSkill {\n name: string;\n directory: string;\n files: Record<string, string>;\n}\n\n/**\n * OpenCode Platform Adapter\n * Transforms aikit commands/skills/agents to OpenCode format\n */\nexport class OpenCodeAdapter implements PlatformAdapter {\n readonly platform = CliPlatform.OPENCODE;\n readonly displayName = 'OpenCode';\n\n getCommandsDir(): string {\n return join(process.cwd(), '.opencode', 'command');\n }\n\n getSkillsDir(): string {\n return join(process.cwd(), '.opencode', 'skill');\n }\n\n getAgentsDir(): string {\n return join(paths.opencodeConfig(), 'agent');\n }\n\n async transformCommand(command: Command): Promise<{ name: string; content: string }> {\n const name = `ak_cm_${command.name}`;\n const content = this.generateCommandContent(command);\n return { name, content };\n }\n\n async transformSkill(skill: Skill): Promise<TransformedSkill> {\n const skillName = `ak_sk_${skill.name}`;\n const skillContent = this.generateSkillContent(skill);\n const result: TransformedSkill = {\n name: skillName,\n directory: '',\n files: { [`${skillName}.md`]: skillContent },\n };\n return result;\n }\n\n async transformAgent(agent: Agent): Promise<{ name: string; content: string }> {\n // Rename build and planner to avoid conflicts with OpenCode's default modes\n const name = (agent.name === 'build' || agent.name === 'planner')\n ? `aikit${agent.name}`\n : agent.name;\n const content = this.generateAgentContent(agent, name);\n return { name, content };\n }\n\n async installCommand(name: string, content: string): Promise<void> {\n const dir = this.getCommandsDir();\n await mkdir(dir, { recursive: true });\n await writeFile(join(dir, `${name}.md`), content);\n }\n\n async installSkill(_name: string, directory: string, files: Record<string, string>): Promise<void> {\n const baseDir = this.getSkillsDir();\n const targetDir = directory ? join(baseDir, directory) : baseDir;\n await mkdir(targetDir, { recursive: true });\n for (const [filename, content] of Object.entries(files)) {\n await writeFile(join(targetDir, filename), content);\n }\n }\n\n async installAgent(name: string, content: string): Promise<void> {\n const dir = this.getAgentsDir();\n await mkdir(dir, { recursive: true });\n const filePath = join(dir, `${name}.md`);\n\n try {\n await access(filePath);\n // File exists - check if it has mode: subagent\n const existingContent = await readFile(filePath, 'utf-8');\n if (!existingContent.includes('mode: subagent')) {\n // Missing mode: subagent - add it to preserve user edits but ensure critical config\n const matter = await import('gray-matter');\n const { data: frontmatter, content: body } = matter.default(existingContent);\n frontmatter.mode = 'subagent';\n const updatedContent = matter.default.stringify(body, frontmatter);\n await writeFile(filePath, updatedContent, 'utf-8');\n }\n // File exists and has mode: subagent - keep user edits\n } catch {\n // File doesn't exist - create it\n await writeFile(filePath, content, 'utf-8');\n }\n }\n\n private generateCommandContent(command: Command): string {\n const examples = command.examples.map(e => {\n const prefixed = e.replace(/\\//g, '/ak_cm_');\n return `- \\`${prefixed}\\``;\n }).join('\\n');\n\n return `# Command: /ak_cm_${command.name}\n\n## Description\n${command.description}\n\n## Usage\n\\`${command.usage.replace(/\\//g, '/ak_cm_')}\\`\n\n## Examples\n${examples}\n\n## ⚠️ CRITICAL: The User Has Already Provided Arguments!\n\n**The user has provided arguments with this command!**\n\nThe arguments are available in this command response - look at the command workflow below, which now includes explicit instructions to use the provided arguments.\n\n**YOUR JOB**:\n1. Follow the command workflow steps\n2. The workflow will tell you to look at \"Arguments Provided\" section\n3. Use those arguments - do NOT ask the user for this information!\n4. They have already provided it - extract and use it!\n\n**Example Scenario**:\n- User runs: \\`/ak_cm_${command.name} snake game with html & css\\`\n- Command: \\`/ak_cm_${command.name}\\`\n- Arguments to use: \\`snake game with html & css\\`\n- You must use \"snake game with html & css\" as provided in the workflow!\n\n**DO NOT**: Ask \"Please provide a task description\"\n**DO**: Follow the workflow and use the arguments provided in it!\n\n## Workflow\n${command.content}\n\n**Category**: ${command.category}`;\n }\n\n private generateSkillContent(skill: Skill): string {\n const relativePath = skill.filePath.startsWith(process.cwd())\n ? skill.filePath.replace(process.cwd(), '').replace(/\\\\/g, '/').replace(/^\\//, '')\n : `.aikit/skills/${skill.name}.md`;\n\n return `Use the **${skill.name} skill** ${skill.useWhen.toLowerCase()}.\n\nREAD ${relativePath}\n\n## Description\n${skill.description}\n\n## When to Use\n${skill.useWhen}\n\n## Workflow\n${skill.content.split('\\n').slice(0, 20).join('\\n')}${skill.content.split('\\n').length > 20 ? '\\n\\n... (see full skill file for complete workflow)' : ''}\n\n**IMPORTANT**: Follow this skill's workflow step by step. Do not skip steps.\nComplete the checklist at the end of the skill.`;\n }\n\n private generateAgentContent(agent: Agent, nameOverride?: string): string {\n // All agents (including renamed ones) should have mode: subagent for tab switching\n return `---\nname: ${nameOverride || agent.name}\nmode: subagent\n---\n\n${agent.systemPrompt}`;\n }\n}\n","import { PlatformAdapter } from './types.js';\nimport { Command } from '../core/commands.js';\nimport { Skill } from '../core/skills.js';\nimport { Agent } from '../core/agents.js';\nimport { CliPlatform } from '../utils/cli-detector.js';\nimport { paths } from '../utils/paths.js';\nimport { writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport matter from 'gray-matter';\n\n/**\n * Claude Code CLI Platform Adapter\n * Transforms aikit commands/skills/agents to Claude Code CLI format\n */\nexport class ClaudeAdapter implements PlatformAdapter {\n readonly platform = CliPlatform.CLAUDE;\n readonly displayName = 'Claude Code CLI';\n\n getCommandsDir(): string {\n return paths.claudeCommands(true); // project scope\n }\n\n getSkillsDir(): string {\n return paths.claudeSkills(true); // project scope\n }\n\n getAgentsDir(): string {\n return paths.claudeAgents(true); // project scope\n }\n\n async transformCommand(command: Command): Promise<{ name: string; content: string }> {\n const name = command.name; // No prefix\n const content = this.generateCommandContent(command);\n return { name, content };\n }\n\n async transformSkill(skill: Skill): Promise<{ name: string; directory: string; files: Record<string, string> }> {\n const name = skill.name; // No prefix\n const content = this.generateSkillContent(skill);\n return {\n name,\n directory: name,\n files: { 'SKILL.md': content },\n };\n }\n\n async transformAgent(agent: Agent): Promise<{ name: string; content: string }> {\n const name = agent.name;\n const content = this.generateAgentContent(agent);\n return { name, content };\n }\n\n async installCommand(name: string, content: string): Promise<void> {\n const dir = this.getCommandsDir();\n await mkdir(dir, { recursive: true });\n await writeFile(join(dir, `${name}.md`), content);\n }\n\n async installSkill(_name: string, directory: string, files: Record<string, string>): Promise<void> {\n const baseDir = this.getSkillsDir();\n const targetDir = join(baseDir, directory);\n await mkdir(targetDir, { recursive: true });\n for (const [filename, content] of Object.entries(files)) {\n await writeFile(join(targetDir, filename), content);\n }\n }\n\n async installAgent(name: string, content: string): Promise<void> {\n const dir = this.getAgentsDir();\n await mkdir(dir, { recursive: true });\n await writeFile(join(dir, `${name}.md`), content);\n }\n\n private generateCommandContent(command: Command): string {\n // Remove OpenCode-specific headers and formatting\n let workflow = command.content;\n\n // Remove OpenCode-specific sections\n workflow = workflow\n .replace(/## ⚠️ CRITICAL: The User Has Already Provided Arguments!.*?(?![\\n])?.*/gs, '')\n .replace(/\\*\\*The user has provided arguments with this command!\\*\\*/g, '')\n .replace(/\\*\\*The arguments are available in this command response.*?\\*\\*/g, '')\n .replace(/\\*\\*YOUR JOB\\*\\*:.*/gs, '')\n .replace(/1\\. Follow command workflow steps.*?\\n2\\. The workflow will tell you.*?\\n3\\. Use those arguments.*?\\n4\\. They have already provided it.*?\\n5\\. DO NOT ask.*?\\n6\\. DO: Follow workflow.*?\\n+\\**Example Scenario\\*\\*:.*/gs, '')\n .replace(/\\*\\*User runs:.*?\\*\\*:\\n.*?\\n+- Command:.*?\\n+- Arguments to use:.*?\\n+- You must use.*?\\n+- DO NOT:.*?\\n+- DO:.*?\\n+\\*\\*\\*/g, '')\n .replace(/\\*\\*\\*/g, '');\n\n // Remove OpenCode command header\n workflow = workflow.replace(/^# Command: \\/ak_cm_[\\s-]+\\n+/g, '');\n\n // Transform $ARGUMENTS to Claude format\n workflow = workflow\n .replace(/\\$ARGUMENTS/g, '$ARGUMENTS')\n .replace(/\\$1/g, '$1')\n .replace(/\\$2/g, '$2');\n\n // Generate frontmatter\n const frontmatter = {\n description: command.description,\n argumentHint: command.usage.replace(/^\\//, '').replace(/<[^>]+>/g, '[args]'),\n };\n\n return matter.stringify(workflow, frontmatter);\n }\n\n private generateSkillContent(skill: Skill): string {\n // Transform to Claude skill format\n const frontmatter = {\n name: skill.name,\n description: `${skill.description}. ${skill.useWhen}`,\n };\n\n const content = `# ${skill.name}\n\n## When to Use\n${skill.useWhen}\n\n## Description\n${skill.description}\n\n## Workflow\n${skill.content}\n\n## Tips\n- Use this skill when: ${skill.useWhen.toLowerCase()}\n- Category: ${skill.category}\n- Tags: ${skill.tags.join(', ')}`;\n\n return matter.stringify(content, frontmatter);\n }\n\n private generateAgentContent(agent: Agent): string {\n // Transform to Claude agent format\n const frontmatter = {\n name: agent.name,\n description: agent.useWhen,\n tools: ['Read', 'Edit', 'Bash', 'Grep', 'Glob'], // Default tools\n };\n\n return matter.stringify(agent.systemPrompt, frontmatter);\n }\n}\n","/**\n * Install Command\n *\n * Install AIKit to specific CLI tool configuration\n */\n\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\n\nimport { logger } from '../../utils/logger.js';\nimport { CliDetector, CliPlatform } from '../../utils/cli-detector.js';\nimport { createAdapter } from '../../platform/adapters.js';\nimport { loadConfig } from '../../core/config.js';\nimport { AgentManager } from '../../core/agents.js';\nimport { CommandRunner } from '../../core/commands.js';\nimport { SkillEngine } from '../../core/skills.js';\n\nexport function registerInstallCommand(program: Command): void {\n program\n .command('install [platform]')\n .description('Install AIKit to specific CLI tool configuration')\n .action(async (platformArg) => {\n try {\n let selectedPlatform: CliPlatform;\n\n if (platformArg) {\n selectedPlatform = CliDetector.matchPlatform(platformArg);\n if (!selectedPlatform) {\n logger.error(`Unknown platform: ${platformArg}`);\n logger.info(`Supported platforms: ${Object.values(CliPlatform).join(', ')}`);\n process.exit(1);\n }\n } else {\n const platforms = await CliDetector.detectPlatforms();\n \n // Smart default: prefer already installed platform\n const installedPlatforms = CliDetector.filterInstalledPlatforms(platforms);\n const defaultPlatform = installedPlatforms.length > 0\n ? installedPlatforms[0].platform\n : platforms[0]?.platform;\n\n const { platform } = await inquirer.prompt([\n {\n type: 'list',\n name: 'platform',\n message: 'Which CLI tool do you want to install AIKit for?',\n choices: platforms.map(p => ({\n name: p.displayName,\n value: p.platform,\n })),\n default: defaultPlatform,\n },\n ]);\n\n selectedPlatform = platform;\n }\n\n logger.info(`Installing AIKit for ${selectedPlatform}...`);\n\n const config = await loadConfig();\n const adapter = createAdapter(selectedPlatform);\n\n const skillEngine = config.skills.enabled ? new SkillEngine(config) : null;\n const commandRunner = config.commands.enabled ? new CommandRunner(config) : null;\n const agentManager = config.agents.enabled ? new AgentManager(config) : null;\n\n // Install commands\n if (commandRunner) {\n const commands = await commandRunner.listCommands();\n logger.info(`Installing ${commands.length} commands...`);\n for (const command of commands) {\n const { name, content } = await adapter.transformCommand(command);\n await adapter.installCommand(name, content);\n logger.info(` ✓ Created ${name} command`);\n }\n }\n\n // Install skills\n if (skillEngine) {\n const skills = await skillEngine.listSkills();\n logger.info(`Installing ${skills.length} skills...`);\n for (const skill of skills) {\n const { name, directory, files } = await adapter.transformSkill(skill);\n await adapter.installSkill(name, directory, files);\n logger.info(` ✓ Created ${name} skill`);\n }\n }\n\n // Install agents\n if (agentManager) {\n const agents = await agentManager.listAgents();\n logger.info(`Installing ${agents.length} agents...`);\n for (const agent of agents) {\n const { name, content } = await adapter.transformAgent(agent);\n await adapter.installAgent(name, content);\n logger.info(` ✓ Created ${name} agent`);\n }\n }\n\n logger.success(`\\n✓ AIKit installed to ${adapter.displayName}!`);\n } catch (error) {\n logger.error('Failed to install:', error);\n process.exit(1);\n }\n });\n}\n\n","/**\n * Sync Command\n * \n * Update AIKit to latest version\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nimport { loadConfig } from '../../core/config.js';\nimport { SyncEngine } from '../../core/sync-engine.js';\nimport { logger } from '../../utils/logger.js';\n\nexport function registerSyncCommand(program: Command): void {\n program\n .command('sync [subcommand]')\n .description('Update AIKit to latest version')\n .option('--dry-run', 'Preview changes without applying')\n .option('-f, --force', 'Skip confirmation prompts')\n .option('--no-backup', 'Skip creating backup')\n .action(async (subcommand, options) => {\n const config = await loadConfig();\n const syncEngine = new SyncEngine(config);\n\n if (!subcommand) {\n // Default: check and apply\n await syncEngine.applyUpdate(options);\n } else {\n switch (subcommand) {\n case 'check':\n await syncEngine.checkForUpdates();\n break;\n case 'preview':\n await syncEngine.previewUpdate();\n break;\n case 'apply':\n await syncEngine.applyUpdate(options);\n break;\n case 'rollback':\n await syncEngine.rollback();\n break;\n default:\n logger.error(`Unknown subcommand: ${subcommand}`);\n console.log(chalk.gray('Available subcommands: check, preview, apply, rollback'));\n process.exit(1);\n }\n }\n });\n}\n\n\n\n\n","import { readFile, writeFile, copyFile, mkdir } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport { VersionManager, UpdateChanges, SkillConflict, SkillHash } from './version-manager.js';\nimport { BackupManager } from './backup-manager.js';\nimport { MigrationManager } from './migration-manager.js';\nimport { logger } from '../utils/logger.js';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\n\n/**\n * Sync options\n */\nexport interface SyncOptions {\n dryRun?: boolean;\n force?: boolean;\n backup?: boolean;\n}\n\n/**\n * Sync result\n */\nexport interface SyncResult {\n success: boolean;\n backupId?: string;\n newSkills: string[];\n updatedSkills: string[];\n removedSkills: string[];\n migrationsRun: string[];\n}\n\n/**\n * Sync Engine - Orchestrates update process\n */\nexport class SyncEngine {\n private versionManager: VersionManager;\n private backupManager: BackupManager;\n private migrationManager: MigrationManager;\n\n constructor(config: Config) {\n this.versionManager = new VersionManager(config);\n this.backupManager = new BackupManager(config.configPath);\n this.migrationManager = new MigrationManager(config.configPath);\n }\n\n /**\n * Check for updates without applying\n */\n async checkForUpdates(): Promise<UpdateChanges | null> {\n try {\n const changes = await this.versionManager.checkForUpdates();\n\n if (changes.hasUpdate) {\n this.displayUpdateInfo(changes);\n } else {\n console.log(chalk.green('✓ Your AIKit is up to date'));\n console.log(` Installed: ${changes.fromVersion}`);\n console.log(` Latest: ${changes.toVersion}`);\n }\n\n return changes;\n } catch (error) {\n logger.error('Failed to check for updates:', error);\n return null;\n }\n }\n\n /**\n * Preview changes without applying\n */\n async previewUpdate(): Promise<boolean> {\n try {\n console.log(chalk.bold('\\n🔍 Previewing update...\\n'));\n\n const changes = await this.versionManager.checkForUpdates();\n\n if (!changes.hasUpdate) {\n console.log(chalk.green('✓ No updates available'));\n return false;\n }\n\n await this.displayChanges(changes);\n\n console.log(chalk.yellow('\\n⚠️ This is a preview - no changes will be made.'));\n console.log(chalk.gray('Use `aikit sync apply` to apply these changes.'));\n\n return true;\n } catch (error) {\n logger.error('Failed to preview update:', error);\n return false;\n }\n }\n\n /**\n * Apply update\n */\n async applyUpdate(options: SyncOptions = {}): Promise<SyncResult> {\n try {\n // Step 1: Check for updates\n const changes = await this.versionManager.checkForUpdates();\n\n if (!changes.hasUpdate) {\n console.log(chalk.green('✓ Already up to date'));\n return {\n success: true,\n newSkills: [],\n updatedSkills: [],\n removedSkills: [],\n migrationsRun: []\n };\n }\n\n // Step 2: Display changes\n await this.displayChanges(changes);\n\n // Step 3: Confirm\n if (!options.force) {\n const { confirmed } = await inquirer.prompt([{\n type: 'confirm',\n name: 'confirmed',\n message: 'Continue with update?',\n default: false\n }]);\n\n if (!confirmed) {\n console.log(chalk.yellow('Update cancelled'));\n return {\n success: false,\n newSkills: [],\n updatedSkills: [],\n removedSkills: [],\n migrationsRun: []\n };\n }\n }\n\n // Step 4: Create backup (unless dry run)\n let backupId: string | undefined = undefined;\n\n if (!options.dryRun && options.backup !== false) {\n console.log(chalk.bold('\\n📦 Creating backup...'));\n const backupResult = await this.backupManager.createBackup(\n changes.fromVersion,\n changes.toVersion\n );\n\n if (!backupResult) {\n throw new Error('Failed to create backup');\n }\n backupId = backupResult;\n }\n\n // Step 5: Resolve conflicts\n for (const conflict of changes.conflicts) {\n await this.resolveConflict(conflict);\n }\n\n // Step 6: Run migrations\n console.log(chalk.bold('\\n🔄 Running migrations...'));\n const migrationResult = await this.migrationManager.runPendingMigrations();\n\n if (!migrationResult.success) {\n throw new Error(`Migration failed: ${migrationResult.failed.join(', ')}`);\n }\n\n // Step 7: Update skills\n console.log(chalk.bold('\\n📝 Updating skills...'));\n const updateResult = await this.updateSkills(changes, options);\n\n // Step 8: Update version\n await this.versionManager.updateVersion(changes.toVersion);\n\n // Update installed skills tracking\n if (backupId) {\n const allSkills = await this.versionManager.loadSkillHashes(paths.skills(paths.globalConfig()));\n await this.versionManager.saveInstalledSkills(allSkills);\n }\n\n console.log(chalk.green('\\n✅ Update complete!'));\n this.displaySummary({\n success: true,\n backupId,\n ...updateResult,\n migrationsRun: migrationResult.applied\n });\n\n return {\n success: true,\n backupId,\n ...updateResult,\n migrationsRun: migrationResult.applied\n };\n } catch (error) {\n logger.error('Update failed:', error);\n console.log(chalk.red('\\n❌ Update failed'));\n\n // TODO: Implement automatic rollback\n return {\n success: false,\n newSkills: [],\n updatedSkills: [],\n removedSkills: [],\n migrationsRun: []\n };\n }\n }\n\n /**\n * Rollback to previous backup\n */\n async rollback(backupId?: string): Promise<boolean> {\n try {\n console.log(chalk.bold('\\n🔄 Rollback...\\n'));\n\n // List backups if no ID provided\n if (!backupId) {\n const backups = await this.backupManager.listBackups();\n\n if (backups.length === 0) {\n console.log(chalk.yellow('No backups available'));\n return false;\n }\n\n const { selectedBackup } = await inquirer.prompt([{\n type: 'list',\n name: 'selectedBackup',\n message: 'Select backup to restore:',\n choices: backups.map((b) => ({\n name: `${b.manifest.backupId} (${b.manifest.fromVersion} → ${b.manifest.toVersion})`,\n value: b.manifest.backupId\n }))\n }]);\n\n backupId = selectedBackup;\n }\n\n if (!backupId) {\n console.log(chalk.yellow('No backup ID provided'));\n return false;\n }\n\n const success = await this.backupManager.restoreBackup(backupId);\n\n if (success) {\n console.log(chalk.green('✓ Rollback complete'));\n return true;\n }\n\n return false;\n } catch (error) {\n logger.error('Rollback failed:', error);\n return false;\n }\n }\n\n /**\n * Display update information\n */\n private displayUpdateInfo(changes: UpdateChanges): void {\n console.log(chalk.bold('\\n📢 New version available!\\n'));\n console.log(` ${chalk.cyan('Current:')} ${changes.fromVersion}`);\n console.log(` ${chalk.cyan('Latest:')} ${changes.toVersion}\\n`);\n }\n\n /**\n * Display changes summary\n */\n private async displayChanges(changes: UpdateChanges): Promise<void> {\n console.log(chalk.bold('📊 Changes detected:\\n'));\n\n if (changes.newSkills.length > 0) {\n console.log(chalk.green(' New Skills:'));\n changes.newSkills.forEach((skill) => {\n console.log(` + ${skill.name} (${skill.category})`);\n });\n }\n\n if (changes.modifiedSkills.length > 0) {\n console.log(chalk.yellow(' Updated Skills:'));\n changes.modifiedSkills.forEach((skill) => {\n console.log(` ~ ${skill.name}`);\n });\n }\n\n if (changes.removedSkills.length > 0) {\n console.log(chalk.red(' Removed Skills:'));\n changes.removedSkills.forEach((skill) => {\n console.log(` - ${skill.name}`);\n });\n }\n\n if (changes.conflicts.length > 0) {\n console.log(chalk.bold.red(' ⚠️ Conflicts:'));\n changes.conflicts.forEach((conflict) => {\n console.log(` ! ${conflict.skillName} (user modified)`);\n });\n }\n }\n\n /**\n * Resolve a conflict\n */\n private async resolveConflict(conflict: SkillConflict): Promise<void> {\n console.log(chalk.bold.red(`\\n⚠️ Conflict detected: ${conflict.skillName}\\n`));\n console.log(chalk.yellow('Your version differs from official version.'));\n\n const { action } = await inquirer.prompt([{\n type: 'list',\n name: 'action',\n message: 'Choose action:',\n choices: [\n {\n name: 'Keep your version (will be renamed to -custom.md)',\n value: 'preserve'\n },\n {\n name: 'Overwrite with official version',\n value: 'overwrite'\n },\n {\n name: 'Skip this skill',\n value: 'skip'\n }\n ]\n }]);\n\n if (action === 'skip') {\n return;\n }\n\n if (action === 'overwrite') {\n // User chose to overwrite - do nothing, sync will overwrite\n return;\n }\n\n // Preserve - rename user's version to -custom\n // TODO: Implement this logic\n console.log(chalk.yellow(' Your version will be preserved as -custom.md'));\n }\n\n /**\n * Update skills based on changes\n */\n private async updateSkills(\n changes: UpdateChanges,\n options: SyncOptions\n ): Promise<{\n newSkills: string[];\n updatedSkills: string[];\n removedSkills: string[];\n }> {\n const globalSkillsPath = paths.skills(paths.globalConfig());\n const projectSkillsPath = paths.skills(this.versionManager['config'].configPath);\n const newSkills: string[] = [];\n const updatedSkills: string[] = [];\n const removedSkills: string[] = [];\n\n // Install new skills\n for (const skill of changes.newSkills) {\n if (!options.dryRun) {\n await this.installSkill(globalSkillsPath, skill, projectSkillsPath);\n }\n newSkills.push(skill.name);\n console.log(chalk.green(` + ${skill.name}`));\n }\n\n // Update modified skills\n for (const skill of changes.modifiedSkills) {\n if (!options.dryRun) {\n await this.installSkill(globalSkillsPath, skill, projectSkillsPath);\n }\n updatedSkills.push(skill.name);\n console.log(chalk.yellow(` ~ ${skill.name}`));\n }\n\n // Handle removed skills (archive them)\n for (const skill of changes.removedSkills) {\n if (!options.dryRun) {\n await this.archiveSkill(projectSkillsPath, skill);\n }\n removedSkills.push(skill.name);\n console.log(chalk.red(` - ${skill.name} (archived)`));\n }\n\n return {\n newSkills,\n updatedSkills,\n removedSkills\n };\n }\n\n /**\n * Install a skill\n */\n private async installSkill(\n sourceDir: string,\n skill: SkillHash,\n targetDir: string\n ): Promise<void> {\n const sourcePath = join(sourceDir, skill.category, `${skill.name}.md`);\n const targetPath = join(targetDir, skill.category, `${skill.name}.md`);\n\n // Create target directory\n await mkdir(dirname(targetPath), { recursive: true });\n\n // Copy file\n await copyFile(sourcePath, targetPath);\n }\n\n /**\n * Archive a removed skill\n */\n private async archiveSkill(\n targetDir: string,\n skill: SkillHash\n ): Promise<void> {\n const sourcePath = join(targetDir, skill.category, `${skill.name}.md`);\n const targetPath = join(targetDir, skill.category, `${skill.name}-deprecated.md`);\n\n try {\n // Read original content\n const content = await readFile(sourcePath, 'utf-8');\n\n // Add deprecation notice\n const deprecatedNotice = `---\n⚠️ DEPRECATED: This skill has been removed\n\nDeprecation date: ${new Date().toISOString()}\nReason: Check release notes for replacement\n---\n\n${content}`;\n\n // Create target directory\n await mkdir(dirname(targetPath), { recursive: true });\n\n await writeFile(targetPath, deprecatedNotice);\n } catch (error) {\n // If source file doesn't exist, skip archiving\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n console.log(chalk.yellow(` - ${skill.name} (not found, skipping)`));\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Display sync summary\n */\n private displaySummary(result: SyncResult): void {\n console.log(chalk.bold('\\n📋 Summary:\\n'));\n console.log(` Updated from: ${chalk.cyan(result.backupId || 'N/A')}`);\n console.log(` Updated to: ${chalk.cyan('current')}`);\n console.log();\n\n if (result.newSkills.length > 0) {\n console.log(chalk.green(` ${result.newSkills.length} new skills installed`));\n }\n if (result.updatedSkills.length > 0) {\n console.log(chalk.yellow(` ${result.updatedSkills.length} skills updated`));\n }\n if (result.removedSkills.length > 0) {\n console.log(chalk.red(` ${result.removedSkills.length} skills archived`));\n }\n if (result.migrationsRun.length > 0) {\n console.log(chalk.blue(` ${result.migrationsRun.length} migrations run`));\n }\n\n if (result.backupId) {\n console.log(chalk.gray(`\\n Rollback available: aikit sync rollback ${result.backupId}`));\n }\n }\n}\n","import { readFile, readdir, writeFile, stat } from 'fs/promises';\nimport { join } from 'path';\nimport { createHash } from 'crypto';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Version information\n */\nexport interface VersionInfo {\n installedVersion: string;\n lastSynced: string;\n packageVersion: string;\n migrationHistory: MigrationHistoryEntry[];\n}\n\n/**\n * Migration history entry\n */\nexport interface MigrationHistoryEntry {\n from: string;\n to: string;\n timestamp: string;\n status: 'completed' | 'failed' | 'rolled-back';\n}\n\n/**\n * Skill hash information\n */\nexport interface SkillHash {\n path: string;\n name: string;\n hash: string;\n category: string;\n}\n\n/**\n * Update changes detected\n */\nexport interface UpdateChanges {\n hasUpdate: boolean;\n fromVersion: string;\n toVersion: string;\n newSkills: SkillHash[];\n modifiedSkills: SkillHash[];\n removedSkills: SkillHash[];\n conflicts: SkillConflict[];\n configChanges: string[];\n}\n\n/**\n * Skill conflict information\n */\nexport interface SkillConflict {\n skillName: string;\n userHash: string;\n sourceHash: string;\n installedHash: string;\n userModified: boolean;\n sourceModified: boolean;\n}\n\n/**\n * Version Manager - Handles version tracking and update detection\n */\nexport class VersionManager {\n private config: Config;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * Get current installed version\n */\n async getCurrentVersion(): Promise<VersionInfo | null> {\n const versionPath = join(paths.globalConfig(), '.version.json');\n\n try {\n const content = await readFile(versionPath, 'utf-8');\n return JSON.parse(content) as VersionInfo;\n } catch {\n return null;\n }\n }\n\n /**\n * Get package version from package.json\n */\n getPackageVersion(): string {\n try {\n const packageJson = require(join(process.cwd(), 'package.json'));\n return packageJson.version || '0.0.0';\n } catch {\n return '0.0.0';\n }\n }\n\n /**\n * Check for updates\n */\n async checkForUpdates(): Promise<UpdateChanges> {\n const installed = await this.getCurrentVersion();\n const packageVersion = this.getPackageVersion();\n\n // If no version file exists, treat as fresh install\n if (!installed) {\n return {\n hasUpdate: true,\n fromVersion: 'none',\n toVersion: packageVersion,\n newSkills: [],\n modifiedSkills: [],\n removedSkills: [],\n conflicts: [],\n configChanges: ['Initial version tracking']\n };\n }\n\n // Compare versions (simple string comparison for now)\n const hasUpdate = installed.installedVersion !== packageVersion;\n\n if (!hasUpdate) {\n return {\n hasUpdate: false,\n fromVersion: installed.installedVersion,\n toVersion: packageVersion,\n newSkills: [],\n modifiedSkills: [],\n removedSkills: [],\n conflicts: [],\n configChanges: []\n };\n }\n\n // Detect changes\n const changes = await this.detectChanges();\n\n return {\n hasUpdate: true,\n fromVersion: installed.installedVersion,\n toVersion: packageVersion,\n ...changes\n };\n }\n\n /**\n * Detect changes between versions\n */\n async detectChanges(): Promise<{\n newSkills: SkillHash[];\n modifiedSkills: SkillHash[];\n removedSkills: SkillHash[];\n conflicts: SkillConflict[];\n configChanges: string[];\n }> {\n const globalSkillsPath = paths.skills(paths.globalConfig());\n const projectSkillsPath = paths.skills(this.config.configPath);\n\n // Get all skills from both locations\n const sourceSkills = await this.loadSkillHashes(globalSkillsPath);\n const userSkills = await this.loadSkillHashes(projectSkillsPath);\n\n const newSkills: SkillHash[] = [];\n const modifiedSkills: SkillHash[] = [];\n const removedSkills: SkillHash[] = [];\n const conflicts: SkillConflict[] = [];\n const installedSkills = new Map<string, SkillHash>();\n\n // Load installed versions (for comparison)\n const installedPath = join(paths.globalConfig(), '.installed-skills.json');\n try {\n const installedData = await readFile(installedPath, 'utf-8');\n const installedList = JSON.parse(installedData) as SkillHash[];\n installedList.forEach(skill => {\n installedSkills.set(skill.name, skill);\n });\n } catch {\n // No installed skills file yet\n }\n\n // Detect new and modified skills\n for (const sourceSkill of sourceSkills) {\n const installed = installedSkills.get(sourceSkill.name);\n const user = userSkills.find(s => s.name === sourceSkill.name);\n\n if (!installed) {\n // New skill\n newSkills.push(sourceSkill);\n } else if (installed.hash !== sourceSkill.hash) {\n // Modified skill\n modifiedSkills.push(sourceSkill);\n\n // Check for conflicts\n if (user && user.hash !== installed.hash) {\n conflicts.push({\n skillName: sourceSkill.name,\n userHash: user.hash,\n sourceHash: sourceSkill.hash,\n installedHash: installed.hash,\n userModified: user.hash !== installed.hash,\n sourceModified: sourceSkill.hash !== installed.hash\n });\n }\n }\n }\n\n // Detect removed skills\n for (const [name, installedSkill] of installedSkills.entries()) {\n const existsInSource = sourceSkills.find(s => s.name === name);\n if (!existsInSource) {\n removedSkills.push(installedSkill);\n }\n }\n\n return {\n newSkills,\n modifiedSkills,\n removedSkills,\n conflicts,\n configChanges: [] // Will be detected separately\n };\n }\n\n /**\n * Load skill hashes from directory\n */\n async loadSkillHashes(skillsPath: string): Promise<SkillHash[]> {\n const hashes: SkillHash[] = [];\n\n try {\n const loadFromDir = async (dir: string) => {\n const files = await readdir(dir);\n\n for (const file of files) {\n const filePath = join(dir, file);\n const stats = await stat(filePath);\n\n if (stats.isDirectory()) {\n // Recursively load subdirectories\n await loadFromDir(filePath);\n } else if (file.endsWith('.md')) {\n // Calculate hash for markdown file\n const hash = await this.calculateSkillHash(filePath);\n hashes.push({\n path: filePath,\n name: file.replace('.md', ''),\n hash,\n category: this.extractCategory(dir, skillsPath)\n });\n }\n }\n };\n\n await loadFromDir(skillsPath);\n } catch (error) {\n // Skills directory might not exist\n logger.debug(`Could not load skills from ${skillsPath}:`, error);\n }\n\n return hashes;\n }\n\n /**\n * Calculate hash for a skill file\n */\n async calculateSkillHash(filePath: string): Promise<string> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return createHash('sha256').update(content).digest('hex');\n } catch {\n return '';\n }\n }\n\n /**\n * Extract category from path\n */\n private extractCategory(filePath: string, basePath: string): string {\n const relative = filePath.replace(basePath + '/', '');\n const parts = relative.split('/');\n\n if (parts.length > 1) {\n return parts[0]; // First directory is category\n }\n\n return 'uncategorized';\n }\n\n /**\n * Save installed skills info\n */\n async saveInstalledSkills(skills: SkillHash[]): Promise<void> {\n const installedPath = join(paths.globalConfig(), '.installed-skills.json');\n\n try {\n await writeFile(installedPath, JSON.stringify(skills, null, 2));\n } catch (error) {\n logger.error('Failed to save installed skills info:', error);\n }\n }\n\n /**\n * Update version file\n */\n async updateVersion(version: string, migration?: MigrationHistoryEntry): Promise<void> {\n const current = await this.getCurrentVersion() || {\n installedVersion: '0.0.0',\n lastSynced: new Date().toISOString(),\n packageVersion: '0.0.0',\n migrationHistory: []\n };\n\n const updated: VersionInfo = {\n installedVersion: version,\n lastSynced: new Date().toISOString(),\n packageVersion: this.getPackageVersion(),\n migrationHistory: migration\n ? [...current.migrationHistory, migration]\n : current.migrationHistory\n };\n\n const versionPath = join(paths.globalConfig(), '.version.json');\n await writeFile(versionPath, JSON.stringify(updated, null, 2));\n }\n\n /**\n * Check if migration is needed\n */\n async needsMigration(): Promise<boolean> {\n const current = await this.getCurrentVersion();\n const packageVersion = this.getPackageVersion();\n\n // Simple version comparison\n // In a real implementation, use semver for proper comparison\n return current?.installedVersion !== packageVersion;\n }\n}\n","import { readFile, writeFile, readdir, stat, unlink, mkdir } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport { createHash } from 'crypto';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Backup manifest\n */\nexport interface BackupManifest {\n backupId: string;\n fromVersion: string;\n toVersion: string;\n timestamp: string;\n files: BackupFile[];\n success: boolean;\n}\n\n/**\n * Backup file entry\n */\nexport interface BackupFile {\n path: string;\n hash: string;\n size: number;\n}\n\n/**\n * Backup information\n */\nexport interface BackupInfo {\n manifest: BackupManifest;\n path: string;\n size: number;\n}\n\n/**\n * Backup Manager - Handles creating and restoring backups\n */\nexport class BackupManager {\n private configPath: string;\n private backupsDir: string;\n private maxBackups: number;\n\n constructor(configPath: string, maxBackups: number = 5) {\n this.configPath = configPath;\n this.backupsDir = join(configPath, '.backups');\n this.maxBackups = maxBackups;\n }\n\n /**\n * Create backup before update\n */\n async createBackup(fromVersion: string, toVersion: string): Promise<string | null> {\n try {\n await mkdir(this.backupsDir, { recursive: true });\n\n const backupId = `${new Date().toISOString().replace(/[:.]/g, '-')}`;\n const backupPath = join(this.backupsDir, `${backupId}-v${toVersion}`);\n\n await mkdir(backupPath, { recursive: true });\n\n logger.info(`Creating backup: ${backupPath}`);\n\n const files: BackupFile[] = [];\n\n // Backup critical files\n const backupItems = [\n 'skills/',\n 'aikit.json',\n 'AGENTS.md',\n 'config/',\n ];\n\n for (const item of backupItems) {\n const files = await this.backupItem(this.configPath, item, backupPath);\n files.push(...files);\n }\n\n // Create manifest\n const manifest: BackupManifest = {\n backupId,\n fromVersion,\n toVersion,\n timestamp: new Date().toISOString(),\n files,\n success: true\n };\n\n const manifestPath = join(backupPath, 'backup-manifest.json');\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n\n // Cleanup old backups\n await this.cleanupOldBackups();\n\n logger.success(`✓ Backup created: ${backupId}`);\n return backupId;\n } catch (error) {\n logger.error('Failed to create backup:', error);\n return null;\n }\n }\n\n /**\n * Backup a file or directory\n */\n async backupItem(\n sourceDir: string,\n item: string,\n targetDir: string\n ): Promise<BackupFile[]> {\n const sourcePath = join(sourceDir, item);\n const targetPath = join(targetDir, item);\n const files: BackupFile[] = [];\n\n try {\n const stats = await stat(sourcePath);\n\n if (stats.isDirectory()) {\n await mkdir(targetPath, { recursive: true });\n const entries = await readdir(sourcePath);\n\n for (const entry of entries) {\n const entryFiles = await this.backupItem(sourcePath, entry, targetPath);\n files.push(...entryFiles);\n }\n } else if (stats.isFile()) {\n await mkdir(dirname(targetPath), { recursive: true });\n await this.copyFile(sourcePath, targetPath);\n\n const hash = await this.calculateHash(targetPath);\n files.push({\n path: item,\n hash,\n size: stats.size\n });\n }\n } catch (error) {\n logger.debug(`Could not backup ${item}:`, error);\n }\n\n return files;\n }\n\n /**\n * Copy file with hash calculation\n */\n private async copyFile(source: string, target: string): Promise<void> {\n const content = await readFile(source);\n await writeFile(target, content);\n }\n\n /**\n * Calculate file hash\n */\n private async calculateHash(filePath: string): Promise<string> {\n try {\n const content = await readFile(filePath);\n return createHash('sha256').update(content).digest('hex');\n } catch {\n return '';\n }\n }\n\n /**\n * List available backups\n */\n async listBackups(): Promise<BackupInfo[]> {\n try {\n const entries = await readdir(this.backupsDir);\n const backups: BackupInfo[] = [];\n\n for (const entry of entries) {\n const backupPath = join(this.backupsDir, entry);\n const manifestPath = join(backupPath, 'backup-manifest.json');\n\n try {\n const manifestContent = await readFile(manifestPath, 'utf-8');\n const manifest = JSON.parse(manifestContent) as BackupManifest;\n\n const size = await this.calculateBackupSize(backupPath);\n\n backups.push({\n manifest,\n path: backupPath,\n size\n });\n } catch {\n // Invalid backup, skip\n }\n }\n\n // Sort by timestamp (newest first)\n backups.sort((a, b) =>\n new Date(b.manifest.timestamp).getTime() - new Date(a.manifest.timestamp).getTime()\n );\n\n return backups;\n } catch {\n return [];\n }\n }\n\n /**\n * Calculate backup directory size\n */\n private async calculateBackupSize(backupPath: string): Promise<number> {\n let totalSize = 0;\n\n try {\n const calculate = async (dir: string): Promise<void> => {\n const entries = await readdir(dir);\n\n for (const entry of entries) {\n const entryPath = join(dir, entry);\n const stats = await stat(entryPath);\n\n if (stats.isDirectory()) {\n await calculate(entryPath);\n } else {\n totalSize += stats.size;\n }\n }\n };\n\n await calculate(backupPath);\n } catch {\n // Return 0 if calculation fails\n }\n\n return totalSize;\n }\n\n /**\n * Restore from backup\n */\n async restoreBackup(backupId: string): Promise<boolean> {\n try {\n const backups = await this.listBackups();\n const backup = backups.find(b => b.manifest.backupId === backupId);\n\n if (!backup) {\n logger.error(`Backup not found: ${backupId}`);\n return false;\n }\n\n logger.info(`Restoring from backup: ${backupId}`);\n\n // Validate backup integrity\n const isValid = await this.validateBackup(backup);\n if (!isValid) {\n logger.error('Backup validation failed');\n return false;\n }\n\n // Restore each file\n for (const file of backup.manifest.files) {\n const sourcePath = join(backup.path, file.path);\n const targetPath = join(this.configPath, file.path);\n\n await mkdir(dirname(targetPath), { recursive: true });\n await this.copyFile(sourcePath, targetPath);\n }\n\n logger.success(`✓ Backup restored: ${backupId}`);\n return true;\n } catch (error) {\n logger.error('Failed to restore backup:', error);\n return false;\n }\n }\n\n /**\n * Validate backup integrity\n */\n async validateBackup(backup: BackupInfo): Promise<boolean> {\n try {\n // Check manifest exists and is valid JSON\n const manifestPath = join(backup.path, 'backup-manifest.json');\n await readFile(manifestPath, 'utf-8');\n\n // Check if all files exist\n for (const file of backup.manifest.files) {\n const filePath = join(backup.path, file.path);\n await stat(filePath);\n\n // Verify hash\n const currentHash = await this.calculateHash(filePath);\n if (currentHash !== file.hash) {\n logger.warn(`File hash mismatch: ${file.path}`);\n return false;\n }\n }\n\n return true;\n } catch (error) {\n logger.debug('Backup validation failed:', error);\n return false;\n }\n }\n\n /**\n * Delete backup\n */\n async deleteBackup(backupId: string): Promise<boolean> {\n try {\n const backups = await this.listBackups();\n const backup = backups.find(b => b.manifest.backupId === backupId);\n\n if (!backup) {\n return false;\n }\n\n // Remove all files in backup directory\n const entries = await readdir(backup.path);\n for (const entry of entries) {\n const entryPath = join(backup.path, entry);\n const stats = await stat(entryPath);\n\n if (stats.isDirectory()) {\n // Remove recursively\n await this.removeDirectory(entryPath);\n } else {\n await unlink(entryPath);\n }\n }\n\n logger.success(`✓ Backup deleted: ${backupId}`);\n return true;\n } catch (error) {\n logger.error('Failed to delete backup:', error);\n return false;\n }\n }\n\n /**\n * Remove directory recursively\n */\n private async removeDirectory(dirPath: string): Promise<void> {\n const entries = await readdir(dirPath);\n\n for (const entry of entries) {\n const entryPath = join(dirPath, entry);\n const stats = await stat(entryPath);\n\n if (stats.isDirectory()) {\n await this.removeDirectory(entryPath);\n } else {\n await unlink(entryPath);\n }\n }\n\n await unlink(dirPath);\n }\n\n /**\n * Cleanup old backups (keep only maxBackups)\n */\n async cleanupOldBackups(): Promise<void> {\n try {\n const backups = await this.listBackups();\n\n if (backups.length <= this.maxBackups) {\n return;\n }\n\n const toDelete = backups.slice(this.maxBackups);\n\n for (const backup of toDelete) {\n await this.deleteBackup(backup.manifest.backupId);\n }\n\n logger.info(`Cleaned up ${toDelete.length} old backup(s)`);\n } catch (error) {\n logger.error('Failed to cleanup old backups:', error);\n }\n }\n\n /**\n * Format backup size for display\n */\n formatSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(2)} ${units[unitIndex]}`;\n }\n}\n","import { readFile, writeFile, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Migration interface\n */\nexport interface Migration {\n version: string;\n description: string;\n up(): Promise<void>;\n down(): Promise<void>;\n}\n\n/**\n * Migration history entry\n */\nexport interface MigrationHistoryEntry {\n from: string;\n to: string;\n timestamp: string;\n status: 'completed' | 'failed' | 'rolled-back';\n}\n\n/**\n * Migration Manager - Handles version migrations\n */\nexport class MigrationManager {\n private configPath: string;\n private migrationsDir: string;\n\n constructor(configPath: string) {\n this.configPath = configPath;\n this.migrationsDir = join(process.cwd(), 'src/core/migrations');\n }\n\n /**\n * Load all available migrations\n */\n async loadMigrations(): Promise<Migration[]> {\n const migrations: Migration[] = [];\n\n try {\n const files = await readdir(this.migrationsDir);\n\n for (const file of files) {\n if (file.endsWith('.js') && file.startsWith('migrate-')) {\n try {\n const module = await import(join(this.migrationsDir, file));\n // Default export or named export 'migration'\n const migration: Migration = module.default || module.migration;\n if (migration) {\n migrations.push(migration);\n }\n } catch (error) {\n logger.warn(`Failed to load migration ${file}:`, error);\n }\n }\n }\n } catch (error) {\n logger.debug('Could not load migrations:', error);\n }\n\n return migrations.sort((a, b) => a.version.localeCompare(b.version));\n }\n\n /**\n * Get applied migrations\n */\n async getAppliedMigrations(): Promise<string[]> {\n const migrationHistoryPath = join(this.configPath, '.migration-history.json');\n\n try {\n const content = await readFile(migrationHistoryPath, 'utf-8');\n const history = JSON.parse(content) as MigrationHistoryEntry[];\n\n return history\n .filter(m => m.status === 'completed')\n .map(m => m.to);\n } catch {\n return [];\n }\n }\n\n /**\n * Run pending migrations\n */\n async runPendingMigrations(): Promise<{\n success: boolean;\n applied: string[];\n failed: string[];\n }> {\n const appliedMigrations = await this.getAppliedMigrations();\n const allMigrations = await this.loadMigrations();\n\n const pendingMigrations = allMigrations.filter(\n m => !appliedMigrations.includes(m.version)\n );\n\n if (pendingMigrations.length === 0) {\n logger.info('No pending migrations');\n return { success: true, applied: [], failed: [] };\n }\n\n logger.info(`Running ${pendingMigrations.length} pending migration(s)...`);\n\n const applied: string[] = [];\n const failed: string[] = [];\n const migrationHistory: MigrationHistoryEntry[] = [];\n\n for (const migration of pendingMigrations) {\n try {\n logger.info(`Running migration: ${migration.version}`);\n logger.info(` ${migration.description}`);\n\n await migration.up();\n\n applied.push(migration.version);\n migrationHistory.push({\n from: 'previous',\n to: migration.version,\n timestamp: new Date().toISOString(),\n status: 'completed'\n });\n\n logger.success(`✓ Migration completed: ${migration.version}`);\n } catch (error) {\n logger.error(`✗ Migration failed: ${migration.version}`, error);\n failed.push(migration.version);\n\n migrationHistory.push({\n from: 'previous',\n to: migration.version,\n timestamp: new Date().toISOString(),\n status: 'failed'\n });\n\n // Stop on first failure\n break;\n }\n }\n\n // Update migration history\n await this.updateMigrationHistory(migrationHistory);\n\n return {\n success: failed.length === 0,\n applied,\n failed\n };\n }\n\n /**\n * Rollback migration\n */\n async rollbackMigration(version: string): Promise<boolean> {\n try {\n const applied = await this.getAppliedMigrations();\n\n if (!applied.includes(version)) {\n logger.error(`Migration not found in applied list: ${version}`);\n return false;\n }\n\n const allMigrations = await this.loadMigrations();\n const migration = allMigrations.find(m => m.version === version);\n\n if (!migration) {\n logger.error(`Migration file not found: ${version}`);\n return false;\n }\n\n logger.info(`Rolling back migration: ${version}`);\n\n await migration.down();\n\n // Update migration history\n await this.updateMigrationHistoryStatus(version, 'rolled-back');\n\n logger.success(`✓ Migration rolled back: ${version}`);\n return true;\n } catch (error) {\n logger.error('Failed to rollback migration:', error);\n return false;\n }\n }\n\n /**\n * Update migration history\n */\n private async updateMigrationHistory(\n entries: MigrationHistoryEntry[]\n ): Promise<void> {\n const historyPath = join(this.configPath, '.migration-history.json');\n\n try {\n let history: MigrationHistoryEntry[] = [];\n\n try {\n const content = await readFile(historyPath, 'utf-8');\n history = JSON.parse(content);\n } catch {\n // File doesn't exist yet\n }\n\n history.push(...entries);\n\n await writeFile(historyPath, JSON.stringify(history, null, 2));\n } catch (error) {\n logger.error('Failed to update migration history:', error);\n }\n }\n\n /**\n * Update migration history status\n */\n private async updateMigrationHistoryStatus(\n version: string,\n status: 'completed' | 'failed' | 'rolled-back'\n ): Promise<void> {\n const historyPath = join(this.configPath, '.migration-history.json');\n\n try {\n const content = await readFile(historyPath, 'utf-8');\n const history = JSON.parse(content) as MigrationHistoryEntry[];\n\n // Update status for matching migration\n const updated = history.map(m =>\n m.to === version ? { ...m, status } : m\n );\n\n await writeFile(historyPath, JSON.stringify(updated, null, 2));\n } catch (error) {\n logger.error('Failed to update migration history status:', error);\n }\n }\n\n /**\n * Get migration history\n */\n async getMigrationHistory(): Promise<MigrationHistoryEntry[]> {\n const historyPath = join(this.configPath, '.migration-history.json');\n\n try {\n const content = await readFile(historyPath, 'utf-8');\n return JSON.parse(content) as MigrationHistoryEntry[];\n } catch {\n return [];\n }\n }\n\n /**\n * Check if migration is needed for version\n */\n async needsMigration(_fromVersion: string): Promise<boolean> {\n const applied = await this.getAppliedMigrations();\n const allMigrations = await this.loadMigrations();\n\n // Check if there are migrations for this version range\n const pendingMigrations = allMigrations.filter(\n m => !applied.includes(m.version)\n );\n\n return pendingMigrations.length > 0;\n }\n}\n","/**\n * Skills Command Group\n * \n * Manage skills and tool configurations\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nimport { loadConfig } from '../../core/config.js';\nimport { SkillEngine } from '../../core/skills.js';\nimport { logger } from '../../utils/logger.js';\n\nexport function registerSkillsCommand(program: Command): Command {\n const skillsCmd = program\n .command('skills')\n .description('Manage skills');\n\n skillsCmd\n .command('list')\n .description('List available skills and tools with their configuration status')\n .action(async () => {\n const config = await loadConfig();\n const engine = new SkillEngine(config);\n const skills = await engine.listSkills();\n \n // Import tool config manager\n const { ToolConfigManager } = await import('../../core/tool-config.js');\n const toolConfigManager = new ToolConfigManager(config);\n const tools = await toolConfigManager.listTools();\n \n console.log(chalk.bold('\\n📚 Available Skills:\\n'));\n \n for (const skill of skills) {\n console.log(` ${chalk.cyan(skill.name)} - ${skill.description}`);\n }\n \n console.log(chalk.bold('\\n🔧 Available Tools:\\n'));\n \n for (const tool of tools) {\n let statusIcon = ' ';\n let statusText = '';\n \n if (tool.status === 'ready') {\n statusIcon = chalk.green('✓');\n statusText = chalk.gray('(ready)');\n } else if (tool.status === 'needs_config') {\n statusIcon = chalk.yellow('⚠');\n statusText = chalk.yellow('(needs config)');\n } else if (tool.status === 'error') {\n statusIcon = chalk.red('✗');\n statusText = chalk.red('(error)');\n }\n \n console.log(` ${statusIcon} ${chalk.cyan(tool.name)} - ${tool.description} ${statusText}`);\n \n if (tool.errorMessage) {\n console.log(` ${chalk.red('Error:')} ${tool.errorMessage}`);\n }\n }\n \n console.log();\n console.log(chalk.gray('Tip: Use \"aikit skills <tool-name> config\" to configure a tool\\n'));\n });\n\n skillsCmd\n .command('show <name>')\n .description('Show skill details')\n .action(async (name: string) => {\n const config = await loadConfig();\n const engine = new SkillEngine(config);\n const skill = await engine.getSkill(name);\n \n if (!skill) {\n logger.error(`Skill not found: ${name}`);\n process.exit(1);\n }\n \n console.log(chalk.bold(`\\n📖 Skill: ${skill.name}\\n`));\n console.log(chalk.gray(skill.description));\n console.log(chalk.bold('\\nWorkflow:'));\n console.log(skill.content);\n });\n\n skillsCmd\n .command('create <name>')\n .description('Create a new skill')\n .action(async (name: string) => {\n const config = await loadConfig();\n const engine = new SkillEngine(config);\n await engine.createSkill(name);\n logger.success(`Skill created: ${name}`);\n });\n\n skillsCmd\n .command('sync')\n .description('Sync global skills to project')\n .action(async () => {\n const config = await loadConfig();\n const engine = new SkillEngine(config);\n const result = await engine.syncSkillsToProject();\n \n if (result.count === 0) {\n logger.info('Skills already in sync or no global skills to sync');\n } else {\n console.log(chalk.bold(`\\n✓ Synced ${result.count} skills to project:\\n`));\n for (const skill of result.synced) {\n console.log(` ${chalk.cyan('•')} ${skill}`);\n }\n console.log();\n }\n });\n\n // Tool configuration command - supports \"config <tool-name>\"\n skillsCmd\n .command('config <tool-name>')\n .description('Configure a tool (e.g., config figma-analysis)')\n .action(async (toolName: string) => {\n await configureToolAction(toolName);\n });\n\n // Tool configuration command - supports \"<tool-name> config\" pattern\n skillsCmd\n .command('*')\n .description('Configure a tool (e.g., figma-analysis config)')\n .allowUnknownOption()\n .action(async () => {\n // Parse arguments manually from process.argv\n const args = process.argv.slice(process.argv.indexOf('skills') + 1);\n const toolName = args[0];\n const action = args[1];\n \n // Only handle if action is 'config', otherwise show error\n if (action === 'config' && toolName) {\n await configureToolAction(toolName);\n } else {\n // Not a tool config command, show help\n logger.error(`Unknown command: ${toolName || 'unknown'} ${action || ''}`);\n console.log(chalk.gray('\\nAvailable commands:'));\n console.log(' aikit skills list - List all skills and tools');\n console.log(' aikit skills show <name> - Show skill details');\n console.log(' aikit skills config <tool-name> - Configure a tool');\n console.log(' aikit skills <tool-name> config - Configure a tool (alternative syntax)');\n console.log();\n process.exit(1);\n }\n });\n\n return skillsCmd;\n}\n\n/**\n * Configure a tool action\n */\nasync function configureToolAction(toolName: string): Promise<void> {\n const config = await loadConfig();\n const { ToolConfigManager } = await import('../../core/tool-config.js');\n const toolConfigManager = new ToolConfigManager(config);\n \n const tool = await toolConfigManager.getToolConfig(toolName);\n \n if (!tool) {\n logger.error(`Tool not found: ${toolName}`);\n console.log(chalk.gray('\\nAvailable tools:'));\n const tools = await toolConfigManager.listTools();\n for (const t of tools) {\n console.log(` - ${chalk.cyan(t.name)}`);\n }\n console.log();\n console.log(chalk.gray('Tip: If you meant to show a skill, use: aikit skills show <name>'));\n console.log();\n process.exit(1);\n }\n \n console.log(chalk.bold(`\\n🔧 Configuring: ${tool.name}\\n`));\n console.log(chalk.gray(tool.description));\n console.log();\n \n if (tool.configMethod === 'oauth') {\n // Use OAuth flow\n if (toolName === 'figma-analysis') {\n const { FigmaOAuth } = await import('../../core/auth/figma-oauth.js');\n const oauth = new FigmaOAuth(toolConfigManager);\n \n try {\n const token = await oauth.authenticate();\n \n // Validate token\n console.log(chalk.gray('\\nValidating token...'));\n const isValid = await oauth.validateToken(token);\n \n if (isValid) {\n logger.success(`\\n✅ ${tool.name} configured successfully!`);\n console.log(chalk.gray('\\nYou can now use the /analyze-figma command in OpenCode.\\n'));\n } else {\n await toolConfigManager.updateToolConfig(toolName, {\n status: 'error',\n errorMessage: 'Token validation failed',\n });\n logger.error('Token validation failed. Please try again.');\n process.exit(1);\n }\n } catch (error) {\n await toolConfigManager.updateToolConfig(toolName, {\n status: 'error',\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n logger.error(`Configuration failed: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n } else {\n logger.error(`OAuth flow not implemented for tool: ${toolName}`);\n process.exit(1);\n }\n } else if (tool.configMethod === 'manual') {\n // Manual configuration\n logger.info('Manual configuration not yet implemented');\n process.exit(1);\n } else {\n logger.info(`Tool ${tool.name} does not require configuration`);\n }\n}\n\n\n\n\n","/**\n * Miscellaneous Commands\n * \n * Contains smaller command groups:\n * - agents: Manage agents\n * - commands: Manage commands\n * - mode: Manage AIKit mode\n * - tools: Manage custom tools\n * - plugins: Manage plugins\n * - memory: Manage persistent memory\n * - beads: Beads task management\n * - status: Show AIKit status\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { readFile, writeFile } from 'fs/promises';\nimport { join } from 'path';\n\nimport { VERSION } from '../../index.js';\nimport { loadConfig } from '../../core/config.js';\nimport { AgentManager } from '../../core/agents.js';\nimport { CommandRunner } from '../../core/commands.js';\nimport { ToolRegistry } from '../../core/tools.js';\nimport { PluginSystem } from '../../core/plugins.js';\nimport { MemoryManager } from '../../core/memory.js';\nimport { BeadsIntegration } from '../../core/beads.js';\nimport { SkillEngine } from '../../core/skills.js';\nimport { logger } from '../../utils/logger.js';\nimport { groupBy } from '../helpers.js';\n\n/**\n * Register agents command group\n */\nexport function registerAgentsCommand(program: Command): Command {\n const agentsCmd = program\n .command('agents')\n .description('Manage agents');\n\n agentsCmd\n .command('list')\n .description('List available agents')\n .action(async () => {\n const config = await loadConfig();\n const manager = new AgentManager(config);\n const agents = manager.listAgents();\n \n console.log(chalk.bold('\\n🤖 Available Agents:\\n'));\n \n for (const agent of agents) {\n console.log(` ${chalk.cyan(`@${agent.name}`)} - ${agent.description}`);\n console.log(chalk.gray(` Use when: ${agent.useWhen}`));\n }\n console.log();\n });\n\n return agentsCmd;\n}\n\n/**\n * Register commands command group\n */\nexport function registerCommandsCommand(program: Command): Command {\n const commandsCmd = program\n .command('commands')\n .description('Manage commands');\n\n commandsCmd\n .command('list')\n .description('List available commands')\n .action(async () => {\n const config = await loadConfig();\n const runner = new CommandRunner(config);\n const commands = await runner.listCommands();\n \n console.log(chalk.bold('\\n⚡ Available Commands:\\n'));\n \n const groups = groupBy(commands, (c) => c.category);\n for (const [category, cmds] of Object.entries(groups)) {\n console.log(chalk.bold.yellow(`\\n ${category}:`));\n for (const cmd of cmds) {\n console.log(` ${chalk.cyan(`/${cmd.name}`)} - ${cmd.description}`);\n }\n }\n console.log();\n });\n\n return commandsCmd;\n}\n\n/**\n * Register mode command group\n */\nexport function registerModeCommand(program: Command): Command {\n const modeCmd = program\n .command('mode')\n .description('Manage AIKit mode');\n\n modeCmd\n .command('get')\n .description('Get current AIKit mode')\n .action(async () => {\n const config = await loadConfig();\n const { mode } = config;\n \n console.log(chalk.bold('\\n📋 Current Mode:\\n'));\n console.log(` ${chalk.cyan(mode || 'build')}`);\n console.log();\n \n console.log(chalk.bold('Available Modes:\\n'));\n console.log(` ${chalk.cyan('plan')} - Create detailed implementation plans`);\n console.log(` ${chalk.cyan('build')} - Direct execution mode`);\n console.log(` ${chalk.cyan('one-shot')} - End-to-end autonomous execution`);\n console.log();\n \n console.log(chalk.gray('Use \"aikit mode set <mode>\" to change mode.'));\n });\n\n modeCmd\n .command('set <mode>')\n .description('Set AIKit mode (plan, build, one-shot)')\n .action(async (mode) => {\n const config = await loadConfig();\n const configPath = config.configPath;\n \n try {\n // Validate mode\n const validModes = ['plan', 'build', 'one-shot'];\n if (!validModes.includes(mode)) {\n console.log(chalk.red(`Invalid mode. Available modes: ${validModes.join(', ')}`));\n return;\n }\n \n // Update config\n const configData = JSON.parse(await readFile(join(configPath, 'aikit.json'), 'utf-8'));\n configData.mode = mode;\n await writeFile(join(configPath, 'aikit.json'), JSON.stringify(configData, null, 2));\n \n console.log(chalk.green(`✓ Mode set to: ${mode}`));\n console.log(chalk.gray(`Configuration updated at: ${configPath}/aikit.json`));\n } catch (error) {\n console.log(chalk.red(`Failed to set mode: ${error instanceof Error ? error.message : String(error)}`));\n }\n });\n\n return modeCmd;\n}\n\n/**\n * Register tools command group\n */\nexport function registerToolsCommand(program: Command): Command {\n const toolsCmd = program\n .command('tools')\n .description('Manage custom tools');\n\n toolsCmd\n .command('list')\n .description('List available tools')\n .action(async () => {\n const config = await loadConfig();\n const registry = new ToolRegistry(config);\n const tools = await registry.listTools();\n \n console.log(chalk.bold('\\n🔧 Available Tools:\\n'));\n \n for (const tool of tools) {\n console.log(` ${chalk.cyan(tool.name)} - ${tool.description}`);\n }\n console.log();\n });\n\n return toolsCmd;\n}\n\n/**\n * Register plugins command group\n */\nexport function registerPluginsCommand(program: Command): Command {\n const pluginsCmd = program\n .command('plugins')\n .description('Manage plugins');\n\n pluginsCmd\n .command('list')\n .description('List available plugins')\n .action(async () => {\n const config = await loadConfig();\n const system = new PluginSystem(config);\n const plugins = await system.listPlugins();\n \n console.log(chalk.bold('\\n🔌 Available Plugins:\\n'));\n \n for (const plugin of plugins) {\n const status = plugin.enabled ? chalk.green('✓') : chalk.gray('○');\n console.log(` ${status} ${chalk.cyan(plugin.name)} - ${plugin.description}`);\n }\n console.log();\n });\n\n return pluginsCmd;\n}\n\n/**\n * Register memory command group\n */\nexport function registerMemoryCommand(program: Command): Command {\n const memoryCmd = program\n .command('memory')\n .description('Manage persistent memory');\n\n memoryCmd\n .command('list')\n .description('List memory entries')\n .action(async () => {\n const config = await loadConfig();\n const memory = new MemoryManager(config);\n const entries = await memory.list();\n \n console.log(chalk.bold('\\n🧠 Memory Entries:\\n'));\n \n for (const entry of entries) {\n console.log(` ${chalk.cyan(entry.key)} - ${entry.summary}`);\n console.log(chalk.gray(` Updated: ${entry.updatedAt}`));\n }\n console.log();\n });\n\n memoryCmd\n .command('read <key>')\n .description('Read a memory entry')\n .action(async (key: string) => {\n const config = await loadConfig();\n const memory = new MemoryManager(config);\n const content = await memory.read(key);\n \n if (!content) {\n logger.error(`Memory entry not found: ${key}`);\n process.exit(1);\n }\n \n console.log(content);\n });\n\n return memoryCmd;\n}\n\n/**\n * Register beads command group\n */\nexport function registerBeadsCommand(program: Command): Command {\n const beadsCmd = program\n .command('beads')\n .description('Beads task management integration');\n\n beadsCmd\n .command('status')\n .description('Show current Beads status')\n .action(async () => {\n const beads = new BeadsIntegration();\n const status = await beads.getStatus();\n \n console.log(chalk.bold('\\n📿 Beads Status:\\n'));\n console.log(` Active tasks: ${status.activeTasks}`);\n console.log(` Completed: ${status.completedTasks}`);\n console.log(` Current: ${status.currentTask || 'None'}`);\n console.log();\n });\n\n return beadsCmd;\n}\n\n/**\n * Register status command\n */\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Show AIKit status')\n .action(async () => {\n console.log(chalk.bold(`\\n🚀 AIKit v${VERSION()}\\n`));\n \n try {\n const config = await loadConfig();\n console.log(chalk.green('✓ Configuration loaded'));\n \n const skillEngine = new SkillEngine(config);\n const skills = await skillEngine.listSkills();\n console.log(` Skills: ${skills.length}`);\n \n const agentManager = new AgentManager(config);\n const agents = agentManager.listAgents();\n console.log(` Agents: ${agents.length}`);\n \n const commandRunner = new CommandRunner(config);\n const commands = await commandRunner.listCommands();\n console.log(` Commands: ${commands.length}`);\n \n const toolRegistry = new ToolRegistry(config);\n const tools = await toolRegistry.listTools();\n console.log(` Tools: ${tools.length}`);\n \n const beads = new BeadsIntegration();\n const beadsStatus = await beads.isInstalled();\n console.log(` Beads: ${beadsStatus ? chalk.green('Installed') : chalk.yellow('Not installed')}`);\n \n } catch (error) {\n console.log(chalk.yellow('⚠ AIKit not initialized. Run \"aikit init\" to get started.'));\n }\n \n console.log();\n });\n}\n\n","/**\n * Session Commands\n *\n * Manages development sessions for tracking work progress\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nimport {\n startSession,\n updateSession,\n endSession,\n showCurrentSession,\n listSessions,\n showSession,\n searchSessions,\n} from '../helpers.js';\n\n/**\n * Register session command group\n */\nexport function registerSessionCommand(program: Command): Command {\n const sessionCmd = program\n .command('session')\n .description('Manage development sessions');\n\n // Start a new session\n sessionCmd\n .command('start [name]')\n .description('Start a new development session')\n .option('-g, --goals <goals...>', 'Session goals')\n .action(async (name, options) => {\n await startSession(name, options.goals);\n });\n\n // Update current session\n sessionCmd\n .command('update [notes]')\n .description('Add progress notes to current session')\n .action(async (notes) => {\n await updateSession(notes);\n });\n\n // End current session\n sessionCmd\n .command('end')\n .description('End current session with summary')\n .action(async () => {\n await endSession();\n });\n\n // Show current session\n sessionCmd\n .command('current')\n .description('Show current active session')\n .action(async () => {\n await showCurrentSession();\n });\n\n // List all sessions\n sessionCmd\n .command('list')\n .description('List all sessions')\n .action(async () => {\n await listSessions();\n });\n\n // Show specific session\n sessionCmd\n .command('show <sessionId>')\n .description('Show details of a specific session')\n .action(async (sessionId) => {\n await showSession(sessionId);\n });\n\n // Search sessions\n sessionCmd\n .command('search <query>')\n .description('Search sessions by keyword')\n .action(async (query) => {\n await searchSessions(query);\n });\n\n return sessionCmd;\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["fileURLToPath","join","__filename","__dirname","join","readFile","writeFile","mkdir","access","constants","join","readdir","dirname","writeFile","mkdir","join","existsSync","imageUrl","readFile","readdir","join","existsSync","readFile","writeFile","readdir","access","constants","mkdir","existsSync","join","MemoryManager","loadConfig","readFile","writeFile","readdir","mkdir","join","matter","exec","promisify","execAsync","readFile","writeFile","mkdir","access","constants","join","z","inquirer","Command","readFile","join","readFile","readdir","writeFile","mkdir","join","basename","extname","matter","join","mkdir","matter","writeFile","readdir","extname","readFile","basename","readdir","writeFile","mkdir","join","extname","z","MemoryManager","FigmaMcpClient","checkCurrentCodeStatus","compareCodeWithFigma","join","BeadsIntegration","mkdir","writeFile","readdir","extname","readdir","writeFile","mkdir","join","basename","extname","exec","promisify","execAsync","chalk","existsSync","join","homedir","CliPlatform","join","homedir","existsSync","existsSync","mkdir","writeFile","readFile","access","join","dirname","homedir","fileURLToPath","execSync","mkdir","join","writeFile","fileURLToPath","dirname","homedir","existsSync","readFile","execSync","access","matter","SessionManager","readFile","writeFile","mkdir","access","join","matter","writeFile","mkdir","join","matter","program","chalk","inquirer","program","inquirer","chalk","readFile","writeFile","mkdir","join","dirname","inquirer","chalk","readFile","readdir","writeFile","join","join","readFile","readdir","writeFile","readFile","writeFile","readdir","stat","mkdir","join","dirname","createHash","files","readFile","writeFile","readdir","join","chalk","inquirer","join","mkdir","dirname","readFile","writeFile","program","chalk","chalk","program","ToolConfigManager","chalk","FigmaOAuth","chalk","readFile","writeFile","join","program","chalk","readFile","join","writeFile","program","Command"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/utils/paths.ts","../src/utils/version.ts","../src/core/config.ts","../src/utils/logger.ts","../src/core/memory.ts","../src/core/tools/figma-mcp.ts","../src/core/tools/figma-screen-developer.ts","../src/core/beads.ts","../src/core/sessions.ts","../src/core/tool-config.ts","../src/core/auth/figma-oauth.ts","../src/cli.ts","../src/cli/index.ts","../src/index.ts","../src/core/skills.ts","../src/core/agents.ts","../src/core/commands.ts","../src/core/commands/index.ts","../src/core/commands/types.ts","../src/core/commands/core.ts","../src/core/commands/quick.ts","../src/core/commands/research.ts","../src/core/commands/design.ts","../src/core/commands/git.ts","../src/core/commands/utility.ts","../src/core/commands/checkpoint.ts","../src/core/commands/sessions.ts","../src/core/commands/drawio.ts","../src/core/tools.ts","../src/core/plugins.ts","../src/core/anti-hallucination.ts","../src/cli/commands/index.ts","../src/cli/commands/init.ts","../src/utils/cli-detector.ts","../src/cli/helpers.ts","../src/platform/adapters.ts","../src/platform/opencode-adapter.ts","../src/platform/claude-adapter.ts","../src/cli/commands/install.ts","../src/cli/commands/sync.ts","../src/core/sync-engine.ts","../src/core/version-manager.ts","../src/core/backup-manager.ts","../src/core/migration-manager.ts","../src/cli/commands/skills.ts","../src/cli/commands/misc.ts","../src/cli/commands/session.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\n/**\n * Path utilities for AIKit configuration and data directories\n */\nexport const paths = {\n /**\n * Get the global AIKit configuration directory\n * ~/.config/aikit/ on Unix, %APPDATA%/aikit/ on Windows\n */\n globalConfig(): string {\n const base = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.config');\n return join(base, 'aikit');\n },\n\n /**\n * Get the project-level AIKit configuration directory\n */\n projectConfig(projectPath?: string): string {\n const base = projectPath || process.cwd();\n return join(base, '.aikit');\n },\n\n /**\n * Get the OpenCode configuration directory\n */\n opencodeConfig(): string {\n const base = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.config');\n return join(base, 'opencode');\n },\n\n /**\n * Get the Beads directory for the current project\n */\n beadsDir(projectPath?: string): string {\n const base = projectPath || process.cwd();\n return join(base, '.beads');\n },\n\n /**\n * Check if a project has AIKit initialized\n */\n hasProjectConfig(projectPath?: string): boolean {\n return existsSync(this.projectConfig(projectPath));\n },\n\n /**\n * Check if global AIKit is initialized\n */\n hasGlobalConfig(): boolean {\n return existsSync(this.globalConfig());\n },\n\n /**\n * Get effective config path (project takes precedence over global)\n */\n effectiveConfig(projectPath?: string): string | null {\n if (this.hasProjectConfig(projectPath)) {\n return this.projectConfig(projectPath);\n }\n if (this.hasGlobalConfig()) {\n return this.globalConfig();\n }\n return null;\n },\n\n /**\n * Get skills directory\n */\n skills(configPath: string): string {\n return join(configPath, 'skills');\n },\n\n /**\n * Get agents directory\n */\n agents(configPath: string): string {\n return join(configPath, 'agents');\n },\n\n /**\n * Get commands directory\n */\n commands(configPath: string): string {\n return join(configPath, 'commands');\n },\n\n /**\n * Get tools directory\n */\n tools(configPath: string): string {\n return join(configPath, 'tools');\n },\n\n /**\n * Get plugins directory\n */\n plugins(configPath: string): string {\n return join(configPath, 'plugins');\n },\n\n /**\n * Get memory directory\n */\n memory(configPath: string): string {\n return join(configPath, 'memory');\n },\n\n /**\n * Get the Claude Code CLI configuration directory\n */\n claudeConfig(scope?: 'user' | 'project'): string {\n if (scope === 'project') {\n return join(process.cwd(), '.claude');\n }\n const base = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.claude');\n return base;\n },\n\n /**\n * Get Claude Code CLI commands directory\n */\n claudeCommands(project?: boolean): string {\n return join(this.claudeConfig(project ? 'project' : 'user'), 'commands');\n },\n\n /**\n * Get Claude Code CLI skills directory\n */\n claudeSkills(project?: boolean): string {\n return join(this.claudeConfig(project ? 'project' : 'user'), 'skills');\n },\n\n /**\n * Get Claude Code CLI agents directory\n */\n claudeAgents(project?: boolean): string {\n return join(this.claudeConfig(project ? 'project' : 'user'), 'agents');\n },\n};\n","import { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\n/**\n * Get package version from package.json\n * This is the single source of truth for version\n */\nexport function getVersion(): string {\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const packageJsonPath = join(__dirname, '..', 'package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n return packageJson.version;\n } catch (error) {\n // Fallback to 0.0.0 if can't read package.json\n console.warn('Warning: Could not read version from package.json, using fallback');\n return '0.0.0';\n }\n}\n\n","import { readFile, access, constants } from 'fs/promises';\nimport { join } from 'path';\nimport { z } from 'zod';\nimport { paths } from '../utils/paths.js';\nimport { getVersion } from '../utils/version.js';\n\n/**\n * AIKit Configuration Schema\n */\nconst ConfigSchema = z.object({\n version: z.string(),\n skills: z.object({\n enabled: z.boolean().default(true),\n directory: z.string().optional(),\n }).default({}),\n agents: z.object({\n enabled: z.boolean().default(true),\n default: z.string().default('build'),\n }).default({}),\n commands: z.object({\n enabled: z.boolean().default(true),\n }).default({}),\n tools: z.object({\n enabled: z.boolean().default(true),\n }).default({}),\n plugins: z.object({\n enabled: z.boolean().default(true),\n autoload: z.array(z.string()).optional(),\n }).default({}),\n memory: z.object({\n enabled: z.boolean().default(true),\n maxSize: z.number().optional(),\n }).default({}),\n beads: z.object({\n enabled: z.boolean().default(true),\n autoInit: z.boolean().default(false),\n }).default({}),\n antiHallucination: z.object({\n enabled: z.boolean().default(true),\n specFile: z.string().default('spec.md'),\n reviewFile: z.string().default('review.md'),\n }).default({}),\n mcp: z.object({\n context7: z.boolean().default(false),\n githubGrep: z.boolean().default(false),\n gkg: z.boolean().default(false),\n }).optional(),\n mode: z.string().default('build').optional(),\n});\n\nexport type AIKitConfig = z.infer<typeof ConfigSchema> & {\n configPath: string;\n projectPath: string;\n};\n\n/**\n * Configuration manager for AIKit\n */\nexport class Config {\n private config: AIKitConfig;\n\n constructor(config: AIKitConfig) {\n this.config = config;\n }\n\n get(): AIKitConfig {\n return this.config;\n }\n\n get skills() {\n return this.config.skills;\n }\n\n get agents() {\n return this.config.agents;\n }\n\n get commands() {\n return this.config.commands;\n }\n\n get tools() {\n return this.config.tools;\n }\n\n get plugins() {\n return this.config.plugins;\n }\n\n get memory() {\n return this.config.memory;\n }\n\n get beads() {\n return this.config.beads;\n }\n\n get antiHallucination() {\n return this.config.antiHallucination;\n }\n\n get mode() {\n return this.config.mode;\n }\n\n get configPath(): string {\n return this.config.configPath;\n }\n\n get projectPath(): string {\n return this.config.projectPath;\n }\n\n /**\n * Get path to a specific resource\n */\n getPath(resource: 'skills' | 'agents' | 'commands' | 'tools' | 'plugins' | 'memory'): string {\n return paths[resource](this.configPath);\n }\n}\n\n/**\n * Load AIKit configuration\n * Merges project-level config with global config (project takes precedence)\n */\nexport async function loadConfig(projectPath?: string): Promise<Config> {\n const project = projectPath || process.cwd();\n \n // Try project config first, then global\n const projectConfigPath = paths.projectConfig(project);\n const globalConfigPath = paths.globalConfig();\n \n let configPath: string;\n let configData: Record<string, unknown> = {};\n \n // Load global config first (as base)\n try {\n await access(join(globalConfigPath, 'aikit.json'), constants.R_OK);\n const globalContent = await readFile(join(globalConfigPath, 'aikit.json'), 'utf-8');\n configData = JSON.parse(globalContent);\n configPath = globalConfigPath;\n } catch {\n // No global config\n configPath = projectConfigPath;\n }\n \n // Merge project config on top\n try {\n await access(join(projectConfigPath, 'aikit.json'), constants.R_OK);\n const projectContent = await readFile(join(projectConfigPath, 'aikit.json'), 'utf-8');\n const projectData = JSON.parse(projectContent);\n configData = deepMerge(configData, projectData);\n configPath = projectConfigPath;\n } catch {\n // No project config, use global or defaults\n }\n \n // Add default version if not present\n if (!configData.version) {\n configData.version = getVersion();\n }\n\n // Parse and validate config\n const parsed = ConfigSchema.parse(configData);\n\n return new Config({\n ...parsed,\n configPath,\n projectPath: project,\n });\n}\n\n/**\n * Deep merge two objects\n */\nfunction deepMerge<T extends Record<string, unknown>>(base: T, override: Partial<T>): T {\n const result = { ...base };\n \n for (const key in override) {\n const baseValue = base[key];\n const overrideValue = override[key];\n \n if (\n typeof baseValue === 'object' &&\n baseValue !== null &&\n typeof overrideValue === 'object' &&\n overrideValue !== null &&\n !Array.isArray(baseValue) &&\n !Array.isArray(overrideValue)\n ) {\n result[key] = deepMerge(\n baseValue as Record<string, unknown>,\n overrideValue as Record<string, unknown>\n ) as T[Extract<keyof T, string>];\n } else if (overrideValue !== undefined) {\n result[key] = overrideValue as T[Extract<keyof T, string>];\n }\n }\n \n return result;\n}\n","import chalk from 'chalk';\n\n/**\n * Simple logger with colored output\n */\nexport const logger = {\n info(...args: unknown[]): void {\n console.log(chalk.blue('ℹ'), ...args);\n },\n\n success(...args: unknown[]): void {\n console.log(chalk.green('✓'), ...args);\n },\n\n warn(...args: unknown[]): void {\n console.log(chalk.yellow('⚠'), ...args);\n },\n\n error(...args: unknown[]): void {\n console.error(chalk.red('✖'), ...args);\n },\n\n debug(...args: unknown[]): void {\n if (process.env.DEBUG || process.env.AIKIT_DEBUG) {\n console.log(chalk.gray('⋯'), ...args);\n }\n },\n\n step(step: number, total: number, message: string): void {\n console.log(chalk.cyan(`[${step}/${total}]`), message);\n },\n\n header(message: string): void {\n console.log(chalk.bold.underline(`\\n${message}\\n`));\n },\n\n list(items: string[], prefix = '•'): void {\n for (const item of items) {\n console.log(` ${prefix} ${item}`);\n }\n },\n};\n","import { readFile, writeFile, mkdir, access, constants } from 'fs/promises';\nimport { join } from 'path';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\n\n/**\n * Memory entry structure\n */\nexport interface Memory {\n key: string;\n content: string;\n summary: string;\n createdAt: Date;\n updatedAt: Date;\n type: 'observation' | 'handoff' | 'research' | 'template' | 'custom';\n}\n\n/**\n * Memory Manager - Persistent context across sessions\n */\nexport class MemoryManager {\n private config: Config;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * List all memory entries\n */\n async list(): Promise<Memory[]> {\n const memories: Memory[] = [];\n const memoryPath = paths.memory(this.config.configPath);\n \n const subDirs = ['observations', 'handoffs', 'research'];\n \n for (const subDir of subDirs) {\n const dirPath = join(memoryPath, subDir);\n try {\n const { readdir } = await import('fs/promises');\n const files = await readdir(dirPath);\n \n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n \n const content = await readFile(join(dirPath, file), 'utf-8');\n const summary = this.extractSummary(content);\n \n memories.push({\n key: `${subDir}/${file.replace('.md', '')}`,\n content,\n summary,\n createdAt: new Date(), // Would get from file stats\n updatedAt: new Date(),\n type: subDir as Memory['type'],\n });\n }\n } catch {\n // Directory doesn't exist\n }\n }\n \n return memories;\n }\n\n /**\n * Read a memory entry\n */\n async read(key: string): Promise<string | null> {\n const memoryPath = paths.memory(this.config.configPath);\n \n // Check if key includes subdirectory\n let filePath: string;\n if (key.includes('/')) {\n filePath = join(memoryPath, `${key}.md`);\n } else {\n // Search in all subdirectories\n const subDirs = ['observations', 'handoffs', 'research', '_templates'];\n for (const subDir of subDirs) {\n const testPath = join(memoryPath, subDir, `${key}.md`);\n try {\n await access(testPath, constants.R_OK);\n filePath = testPath;\n break;\n } catch {\n continue;\n }\n }\n filePath = filePath! || join(memoryPath, `${key}.md`);\n }\n \n try {\n return await readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n }\n\n /**\n * Update a memory entry\n */\n async update(key: string, content: string, options?: {\n append?: boolean;\n type?: Memory['type'];\n }): Promise<void> {\n const memoryPath = paths.memory(this.config.configPath);\n const type = options?.type || 'custom';\n \n // Determine file path based on type\n let filePath: string;\n if (key.includes('/')) {\n filePath = join(memoryPath, `${key}.md`);\n } else {\n const subDir = type === 'observation' ? 'observations' \n : type === 'handoff' ? 'handoffs'\n : type === 'research' ? 'research'\n : '';\n filePath = join(memoryPath, subDir, `${key}.md`);\n }\n \n // Ensure directory exists\n const { dirname } = await import('path');\n await mkdir(dirname(filePath), { recursive: true });\n \n // Handle append mode\n if (options?.append) {\n try {\n const existing = await readFile(filePath, 'utf-8');\n const timestamp = new Date().toISOString();\n content = `${existing}\\n\\n---\\n_Updated: ${timestamp}_\\n\\n${content}`;\n } catch {\n // File doesn't exist, create new\n }\n }\n \n await writeFile(filePath, content);\n }\n\n /**\n * Create a handoff bundle\n */\n async createHandoff(summary: {\n completed: string[];\n inProgress: string[];\n remaining: string[];\n context: string;\n nextSteps: string[];\n }): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const key = `handoffs/${timestamp}`;\n \n const content = `# Handoff: ${new Date().toLocaleString()}\n\n## Completed\n${summary.completed.map(item => `- [x] ${item}`).join('\\n') || '- None'}\n\n## In Progress\n${summary.inProgress.map(item => `- [ ] ${item}`).join('\\n') || '- None'}\n\n## Remaining\n${summary.remaining.map(item => `- [ ] ${item}`).join('\\n') || '- None'}\n\n## Context\n${summary.context || 'No additional context.'}\n\n## Next Steps\n${summary.nextSteps.map((step, i) => `${i + 1}. ${step}`).join('\\n') || '- Continue from where left off'}\n`;\n \n await this.update(key, content, { type: 'handoff' });\n return key;\n }\n\n /**\n * Get the latest handoff\n */\n async getLatestHandoff(): Promise<Memory | null> {\n const memories = await this.list();\n const handoffs = memories.filter(m => m.type === 'handoff');\n \n if (handoffs.length === 0) return null;\n \n // Sort by key (which includes timestamp)\n handoffs.sort((a, b) => b.key.localeCompare(a.key));\n return handoffs[0];\n }\n\n /**\n * Create an observation\n */\n async createObservation(title: string, observation: {\n what: string;\n why: string;\n impact: string;\n tags?: string[];\n }): Promise<string> {\n const slug = title.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const key = `observations/${slug}`;\n \n const content = `# ${title}\n\n## What\n${observation.what}\n\n## Why\n${observation.why}\n\n## Impact\n${observation.impact}\n\n${observation.tags?.length ? `## Tags\\n${observation.tags.map(t => `- ${t}`).join('\\n')}` : ''}\n\n---\n_Created: ${new Date().toISOString()}_\n`;\n \n await this.update(key, content, { type: 'observation' });\n return key;\n }\n\n /**\n * Save research findings\n */\n async saveResearch(topic: string, findings: {\n summary: string;\n sources: string[];\n recommendations: string[];\n codeExamples?: string;\n }): Promise<string> {\n const slug = topic.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const key = `research/${slug}`;\n \n const content = `# Research: ${topic}\n\n## Summary\n${findings.summary}\n\n## Sources\n${findings.sources.map(s => `- ${s}`).join('\\n')}\n\n## Recommendations\n${findings.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\\n')}\n\n${findings.codeExamples ? `## Code Examples\\n\\`\\`\\`\\n${findings.codeExamples}\\n\\`\\`\\`` : ''}\n\n---\n_Researched: ${new Date().toISOString()}_\n`;\n \n await this.update(key, content, { type: 'research' });\n return key;\n }\n\n /**\n * Extract a summary from content (first paragraph or heading)\n */\n private extractSummary(content: string): string {\n const lines = content.split('\\n').filter(l => l.trim());\n \n // Find first non-heading line\n for (const line of lines) {\n if (!line.startsWith('#') && line.trim().length > 0) {\n return line.slice(0, 100) + (line.length > 100 ? '...' : '');\n }\n }\n \n // Fall back to first heading\n if (lines[0]?.startsWith('#')) {\n return lines[0].replace(/^#+\\s*/, '');\n }\n \n return 'No summary available';\n }\n}\n","import { ToolConfigManager } from '../tool-config.js';\nimport { logger } from '../../utils/logger.js';\nimport { writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\n/**\n * Figma API response types\n */\nexport interface FigmaFile {\n document: FigmaNode;\n components: Record<string, FigmaComponent>;\n styles: Record<string, FigmaStyle>;\n}\n\nexport interface FigmaNode {\n id: string;\n name: string;\n type: string;\n children?: FigmaNode[];\n fills?: FigmaFill[];\n strokes?: FigmaFill[];\n effects?: FigmaEffect[];\n absoluteBoundingBox?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n style?: {\n fontFamily?: string;\n fontSize?: number;\n fontWeight?: number;\n lineHeightPx?: number;\n letterSpacing?: number;\n };\n characters?: string;\n layoutMode?: 'HORIZONTAL' | 'VERTICAL';\n paddingLeft?: number;\n paddingRight?: number;\n paddingTop?: number;\n paddingBottom?: number;\n itemSpacing?: number;\n}\n\nexport interface FigmaFill {\n type: string;\n color?: {\n r: number;\n g: number;\n b: number;\n a: number;\n };\n imageRef?: string;\n}\n\nexport interface FigmaEffect {\n type: string;\n visible: boolean;\n radius?: number;\n color?: {\n r: number;\n g: number;\n b: number;\n a: number;\n };\n}\n\nexport interface FigmaComponent {\n key: string;\n name: string;\n description: string;\n}\n\nexport interface FigmaStyle {\n key: string;\n name: string;\n styleType: 'FILL' | 'TEXT' | 'EFFECT' | 'GRID';\n}\n\n/**\n * Extracted design tokens\n */\nexport interface DesignTokens {\n colors: Array<{\n name: string;\n hex: string;\n rgba: string;\n }>;\n typography: Array<{\n name: string;\n fontFamily: string;\n fontSize: number;\n fontWeight: number;\n lineHeight: number;\n letterSpacing?: number;\n }>;\n spacing: {\n unit: number;\n scale: number[];\n };\n components: Array<{\n name: string;\n type: string;\n description?: string;\n }>;\n screens: Array<{\n id: string;\n name: string;\n width: number;\n height: number;\n type: string;\n description?: string;\n childrenCount?: number;\n }>;\n breakpoints: number[];\n structure?: {\n nodes: Array<{\n id: string;\n name: string;\n type: string;\n content?: string;\n position?: { x: number; y: number; width: number; height: number };\n styles?: {\n backgroundColor?: string;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number;\n color?: string;\n padding?: { top: number; right: number; bottom: number; left: number };\n margin?: { top: number; right: number; bottom: number; left: number };\n layout?: 'HORIZONTAL' | 'VERTICAL' | 'NONE';\n gap?: number;\n };\n children?: string[]; // IDs of child nodes\n }>;\n hierarchy: string; // Tree structure representation\n };\n assets?: Array<{\n nodeId: string;\n nodeName: string;\n nodeType: string;\n format: 'png' | 'svg' | 'jpg';\n path: string;\n url: string;\n width?: number;\n height?: number;\n }>;\n}\n\n/**\n * Figma MCP Client\n * \n * Wrapper for figma-developer-mcp to extract design data\n */\nexport class FigmaMcpClient {\n private apiKey: string;\n\n constructor(apiKey: string, _configManager: ToolConfigManager) {\n this.apiKey = apiKey;\n }\n\n /**\n * Fetch helper with simple retry/backoff for 429/5xx\n */\n private async fetchWithRetry(\n url: string,\n options: RequestInit,\n label: string,\n retries: number = 3,\n backoffMs: number = 1500\n ): Promise<Response> {\n let attempt = 0;\n let lastError: any;\n\n while (attempt <= retries) {\n try {\n const res = await fetch(url, options);\n if (res.ok) return res;\n\n // Retry on throttling or server errors\n if (res.status === 429 || res.status >= 500) {\n const retryAfter = Number(res.headers.get('retry-after')) || 0;\n const delay = retryAfter > 0 ? retryAfter * 1000 : backoffMs * (attempt + 1);\n logger.warn(`${label} failed (status ${res.status}), retrying in ${Math.round(delay / 1000)}s...`);\n await new Promise((r) => setTimeout(r, delay));\n attempt += 1;\n continue;\n }\n\n const text = await res.text();\n throw new Error(`${label} error: ${res.status} ${res.statusText}\\n${text}`);\n } catch (err) {\n lastError = err;\n // Retry network errors\n logger.warn(`${label} network error, attempt ${attempt + 1}/${retries + 1}: ${err instanceof Error ? err.message : String(err)}`);\n if (attempt >= retries) break;\n await new Promise((r) => setTimeout(r, backoffMs * (attempt + 1)));\n attempt += 1;\n }\n }\n\n throw lastError instanceof Error\n ? lastError\n : new Error(`${label} failed after retries`);\n }\n\n /**\n * Extract file key from Figma URL\n */\n private extractFileKey(url: string): string | null {\n // URL format: https://www.figma.com/design/{fileKey}/...\n const match = url.match(/figma\\.com\\/design\\/([a-zA-Z0-9]+)/);\n return match ? match[1] : null;\n }\n\n /**\n * Extract node ID from Figma URL\n */\n private extractNodeId(url: string): string | null {\n // URL format: ...?node-id={nodeId} or ...&node-id={nodeId}\n // Node ID can be in format: 0-1, 1-2, etc. (page-frame format)\n const match = url.match(/[?&]node-id=([^&]+)/);\n if (!match) return null;\n \n // Decode and handle different formats\n let nodeId = decodeURIComponent(match[1]);\n \n // If it's in format \"0-1\", convert to \"0:1\" for API\n // Figma API uses colon separator, not dash\n if (nodeId.includes('-') && !nodeId.includes(':')) {\n nodeId = nodeId.replace(/-/g, ':');\n }\n \n return nodeId;\n }\n\n /**\n * Get Figma file data using API\n */\n async getFileData(url: string): Promise<FigmaFile> {\n const fileKey = this.extractFileKey(url);\n if (!fileKey) {\n throw new Error(`Invalid Figma URL: ${url}`);\n }\n\n const nodeId = this.extractNodeId(url);\n const apiUrl = nodeId\n ? `https://api.figma.com/v1/files/${fileKey}/nodes?ids=${encodeURIComponent(nodeId)}`\n : `https://api.figma.com/v1/files/${fileKey}`;\n\n const response = await this.fetchWithRetry(apiUrl, {\n headers: {\n 'X-Figma-Token': this.apiKey,\n },\n }, 'Figma file fetch');\n\n const data = await response.json() as { nodes?: Record<string, { document: FigmaNode }> };\n\n if (nodeId) {\n // Return specific node data\n const nodes = data.nodes as Record<string, { document: FigmaNode }>;\n const nodeData = Object.values(nodes)[0];\n if (!nodeData) {\n throw new Error(`Node not found: ${nodeId}`);\n }\n return {\n document: nodeData.document,\n components: {},\n styles: {},\n };\n }\n\n return data as FigmaFile;\n }\n\n /**\n * Extract design tokens from Figma file\n */\n async extractDesignTokens(url: string, downloadAssets: boolean = true, assetsDir?: string): Promise<DesignTokens> {\n const fileData = await this.getFileData(url);\n const fileKey = this.extractFileKey(url);\n if (!fileKey) {\n throw new Error(`Invalid Figma URL: ${url}`);\n }\n\n const tokens: DesignTokens = {\n colors: [],\n typography: [],\n spacing: {\n unit: 8, // Default 8px grid\n scale: [],\n },\n components: [],\n screens: [],\n breakpoints: [375, 768, 1024, 1280, 1920], // Common breakpoints\n };\n\n // Extract colors\n const colorMap = new Map<string, string>();\n this.extractColors(fileData.document, colorMap);\n tokens.colors = Array.from(colorMap.entries()).map(([name, hex]) => ({\n name,\n hex,\n rgba: hex, // Simplified\n }));\n\n // Extract typography\n const typographyMap = new Map<string, any>();\n this.extractTypography(fileData.document, typographyMap);\n tokens.typography = Array.from(typographyMap.values());\n\n // Extract components\n Object.values(fileData.components).forEach(component => {\n tokens.components.push({\n name: component.name,\n type: 'component',\n description: component.description,\n });\n });\n\n // Extract screens/frames\n this.extractScreens(fileData.document, tokens.screens);\n\n // Extract structure and content\n tokens.structure = this.extractStructure(fileData.document);\n\n // Download assets if requested\n if (downloadAssets && tokens.structure) {\n try {\n tokens.assets = await this.downloadAssets(\n fileKey,\n fileData.document,\n assetsDir || './assets/images'\n );\n } catch (error) {\n logger.warn(`Failed to download assets: ${error instanceof Error ? error.message : String(error)}`);\n // Continue without assets\n }\n }\n\n return tokens;\n }\n\n /**\n * Recursively extract colors from nodes\n */\n private extractColors(node: FigmaNode, colorMap: Map<string, string>): void {\n // Extract fills\n if (node.fills && Array.isArray(node.fills)) {\n node.fills.forEach(fill => {\n if (fill.type === 'SOLID' && fill.color) {\n const { r, g, b, a } = fill.color;\n const hex = this.rgbaToHex(r, g, b, a);\n if (!colorMap.has(hex)) {\n colorMap.set(hex, hex);\n }\n }\n });\n }\n\n // Extract strokes\n if (node.strokes && Array.isArray(node.strokes)) {\n node.strokes.forEach(stroke => {\n if (stroke.type === 'SOLID' && stroke.color) {\n const { r, g, b, a } = stroke.color;\n const hex = this.rgbaToHex(r, g, b, a);\n if (!colorMap.has(hex)) {\n colorMap.set(hex, hex);\n }\n }\n });\n }\n\n // Recurse children\n if (node.children) {\n node.children.forEach(child => this.extractColors(child, colorMap));\n }\n }\n\n /**\n * Recursively extract typography from nodes\n */\n private extractTypography(node: FigmaNode, typographyMap: Map<string, any>): void {\n if (node.type === 'TEXT' && node.style) {\n const key = `${node.style.fontFamily}-${node.style.fontSize}-${node.style.fontWeight}`;\n if (!typographyMap.has(key)) {\n typographyMap.set(key, {\n name: `${node.style.fontSize}px ${node.style.fontFamily}`,\n fontFamily: node.style.fontFamily || 'Inter',\n fontSize: node.style.fontSize || 16,\n fontWeight: node.style.fontWeight || 400,\n lineHeight: node.style.lineHeightPx || node.style.fontSize || 16,\n letterSpacing: node.style.letterSpacing,\n });\n }\n }\n\n if (node.children) {\n node.children.forEach(child => this.extractTypography(child, typographyMap));\n }\n }\n\n /**\n * Extract screens/frames with detailed information\n */\n private extractScreens(\n node: FigmaNode, \n screens: Array<{\n id: string;\n name: string;\n width: number;\n height: number;\n type: string;\n description?: string;\n childrenCount?: number;\n }>\n ): void {\n if (node.type === 'FRAME' || node.type === 'COMPONENT') {\n if (node.absoluteBoundingBox) {\n // Only include main screens (skip nested frames that are too small or decorative)\n const isMainScreen = node.absoluteBoundingBox.width >= 800 && \n node.absoluteBoundingBox.height >= 400;\n \n if (isMainScreen) {\n screens.push({\n id: node.id,\n name: node.name,\n width: node.absoluteBoundingBox.width,\n height: node.absoluteBoundingBox.height,\n type: node.type,\n childrenCount: node.children?.length || 0,\n });\n }\n }\n }\n\n if (node.children) {\n node.children.forEach(child => this.extractScreens(child, screens));\n }\n }\n\n /**\n * Extract structure, content, and layout from nodes\n */\n private extractStructure(node: FigmaNode, depth: number = 0): {\n nodes: Array<{\n id: string;\n name: string;\n type: string;\n content?: string;\n position?: { x: number; y: number; width: number; height: number };\n styles?: {\n backgroundColor?: string;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number;\n color?: string;\n padding?: { top: number; right: number; bottom: number; left: number };\n margin?: { top: number; right: number; bottom: number; left: number };\n layout?: 'HORIZONTAL' | 'VERTICAL' | 'NONE';\n gap?: number;\n };\n children?: string[];\n }>;\n hierarchy: string;\n } {\n const nodes: Array<{\n id: string;\n name: string;\n type: string;\n content?: string;\n position?: { x: number; y: number; width: number; height: number };\n styles?: any;\n children?: string[];\n }> = [];\n const hierarchyLines: string[] = [];\n\n const processNode = (n: FigmaNode, level: number = 0): string[] => {\n const indent = ' '.repeat(level);\n const childIds: string[] = [];\n\n // Extract node data\n const nodeData: any = {\n id: n.id,\n name: n.name || 'Unnamed',\n type: n.type,\n };\n\n // Extract position\n if (n.absoluteBoundingBox) {\n nodeData.position = {\n x: n.absoluteBoundingBox.x,\n y: n.absoluteBoundingBox.y,\n width: n.absoluteBoundingBox.width,\n height: n.absoluteBoundingBox.height,\n };\n }\n\n // Extract text content\n if (n.type === 'TEXT' && n.characters) {\n nodeData.content = n.characters;\n }\n\n // Extract styles\n const styles: any = {};\n \n // Background color\n if (n.fills && Array.isArray(n.fills)) {\n const solidFill = n.fills.find(f => f.type === 'SOLID' && f.color);\n if (solidFill && solidFill.color) {\n const { r, g, b, a } = solidFill.color;\n styles.backgroundColor = this.rgbaToHex(r, g, b, a);\n }\n }\n\n // Text styles\n if (n.style) {\n if (n.style.fontFamily) styles.fontFamily = n.style.fontFamily;\n if (n.style.fontSize) styles.fontSize = n.style.fontSize;\n if (n.style.fontWeight) styles.fontWeight = n.style.fontWeight;\n if (n.style.lineHeightPx) styles.lineHeight = n.style.lineHeightPx;\n \n // Text color from fills\n if (n.fills && Array.isArray(n.fills)) {\n const textFill = n.fills.find(f => f.type === 'SOLID' && f.color);\n if (textFill && textFill.color) {\n const { r, g, b, a } = textFill.color;\n styles.color = this.rgbaToHex(r, g, b, a);\n }\n }\n }\n\n // Layout properties\n if (n.layoutMode) {\n styles.layout = n.layoutMode;\n }\n if (n.itemSpacing !== undefined) {\n styles.gap = n.itemSpacing;\n }\n\n // Padding\n if (n.paddingLeft || n.paddingRight || n.paddingTop || n.paddingBottom) {\n styles.padding = {\n top: n.paddingTop || 0,\n right: n.paddingRight || 0,\n bottom: n.paddingBottom || 0,\n left: n.paddingLeft || 0,\n };\n }\n\n if (Object.keys(styles).length > 0) {\n nodeData.styles = styles;\n }\n\n // Process children\n if (n.children && n.children.length > 0) {\n n.children.forEach(child => {\n const childNodeIds = processNode(child, level + 1);\n childIds.push(child.id);\n childIds.push(...childNodeIds);\n });\n nodeData.children = n.children.map(c => c.id);\n }\n\n nodes.push(nodeData);\n\n // Build hierarchy string\n const typeLabel = n.type.toLowerCase();\n const nameLabel = n.name || 'Unnamed';\n const contentPreview = n.type === 'TEXT' && n.characters \n ? `: \"${n.characters.substring(0, 50)}${n.characters.length > 50 ? '...' : ''}\"`\n : '';\n const sizeLabel = n.absoluteBoundingBox\n ? ` [${Math.round(n.absoluteBoundingBox.width)}×${Math.round(n.absoluteBoundingBox.height)}]`\n : '';\n \n hierarchyLines.push(`${indent}${typeLabel} \"${nameLabel}\"${contentPreview}${sizeLabel}`);\n\n return [n.id, ...childIds];\n };\n\n processNode(node, depth);\n\n return {\n nodes,\n hierarchy: hierarchyLines.join('\\n'),\n };\n }\n\n /**\n * Find all nodes that can be exported as images (optionally filtered by screen)\n */\n private findImageNodes(\n node: FigmaNode, \n imageNodes: Array<{ id: string; name: string; type: string; width?: number; height?: number }> = [],\n screenId?: string,\n isWithinScreen: boolean = false\n ): void {\n // Check if we're within the target screen\n const currentIsScreen = node.id === screenId;\n const nowWithinScreen = isWithinScreen || currentIsScreen;\n \n // If screenId is specified and we're not within that screen, skip\n if (screenId && !nowWithinScreen && node.type !== 'PAGE') {\n // Continue searching children\n if (node.children) {\n node.children.forEach(child => this.findImageNodes(child, imageNodes, screenId, false));\n }\n return;\n }\n // Exportable node types\n const exportableTypes = ['VECTOR', 'COMPONENT', 'INSTANCE', 'FRAME', 'GROUP', 'RECTANGLE', 'ELLIPSE'];\n \n // Check if node has image fills or is exportable\n const hasImageFill = node.fills?.some(fill => fill.type === 'IMAGE' || fill.imageRef);\n const isExportable = exportableTypes.includes(node.type) || hasImageFill;\n\n if (isExportable && node.absoluteBoundingBox) {\n // Skip very small nodes (likely decorative)\n const minSize = 16;\n if (node.absoluteBoundingBox.width >= minSize && node.absoluteBoundingBox.height >= minSize) {\n imageNodes.push({\n id: node.id,\n name: node.name || 'Unnamed',\n type: node.type,\n width: node.absoluteBoundingBox.width,\n height: node.absoluteBoundingBox.height,\n });\n }\n }\n\n // Recurse children\n if (node.children) {\n node.children.forEach(child => this.findImageNodes(child, imageNodes, screenId, nowWithinScreen));\n }\n }\n\n /**\n * Download images/assets from Figma (optionally filtered by screen)\n */\n async downloadAssets(\n fileKey: string,\n rootNode: FigmaNode,\n assetsDir: string,\n screenId?: string // Optional: only download assets for specific screen\n ): Promise<Array<{\n nodeId: string;\n nodeName: string;\n nodeType: string;\n format: 'png' | 'svg' | 'jpg';\n path: string;\n url: string;\n width?: number;\n height?: number;\n }>> {\n // Find all image nodes (optionally filtered by screen)\n const imageNodes: Array<{ id: string; name: string; type: string; width?: number; height?: number }> = [];\n this.findImageNodes(rootNode, imageNodes, screenId);\n\n if (imageNodes.length === 0) {\n logger.info('No image nodes found to download');\n return [];\n }\n\n logger.info(`Found ${imageNodes.length} image nodes to download`);\n\n // Limit to first 50 nodes to avoid API limits\n const nodesToDownload = imageNodes.slice(0, 50);\n const nodeIds = nodesToDownload.map(n => n.id).join(',');\n\n // Request image URLs from Figma API\n // Use PNG format by default, SVG for vectors\n const imageUrl = `https://api.figma.com/v1/images/${fileKey}?ids=${encodeURIComponent(nodeIds)}&format=png&scale=2`;\n \n const response = await this.fetchWithRetry(imageUrl, {\n headers: {\n 'X-Figma-Token': this.apiKey,\n },\n }, 'Figma images listing');\n\n const imageData = await response.json() as { images?: Record<string, string> };\n const images = imageData.images as Record<string, string>;\n\n // Ensure assets directory exists\n const fullAssetsDir = assetsDir.startsWith('/') ? assetsDir : join(process.cwd(), assetsDir);\n if (!existsSync(fullAssetsDir)) {\n await mkdir(fullAssetsDir, { recursive: true });\n }\n\n // Download each image\n const downloadedAssets: Array<{\n nodeId: string;\n nodeName: string;\n nodeType: string;\n format: 'png' | 'svg' | 'jpg';\n path: string;\n url: string;\n width?: number;\n height?: number;\n }> = [];\n\n for (const node of nodesToDownload) {\n const imageUrl = images[node.id];\n if (!imageUrl) {\n logger.warn(`No image URL returned for node ${node.id} (${node.name})`);\n continue;\n }\n\n try {\n // Download image\n const imageResponse = await this.fetchWithRetry(\n imageUrl,\n {},\n `Download image ${node.id}`\n );\n\n const imageBuffer = await imageResponse.arrayBuffer();\n \n // Generate safe filename\n const safeName = node.name\n .replace(/[^a-z0-9]/gi, '_')\n .toLowerCase()\n .substring(0, 50);\n const extension = 'png'; // PNG format\n const filename = `${safeName}_${node.id.substring(0, 8)}.${extension}`;\n const filePath = join(fullAssetsDir, filename);\n\n // Write file\n await writeFile(filePath, Buffer.from(imageBuffer));\n\n downloadedAssets.push({\n nodeId: node.id,\n nodeName: node.name,\n nodeType: node.type,\n format: extension as 'png',\n path: filePath,\n url: imageUrl,\n width: node.width,\n height: node.height,\n });\n\n logger.info(`Downloaded: ${filename} (${node.name})`);\n } catch (error) {\n logger.warn(`Error downloading image for node ${node.id}: ${error instanceof Error ? error.message : String(error)}`);\n // Continue with other images\n }\n }\n\n logger.info(`Downloaded ${downloadedAssets.length} assets to ${fullAssetsDir}`);\n return downloadedAssets;\n }\n\n /**\n * Convert RGBA to hex\n */\n private rgbaToHex(r: number, g: number, b: number, a: number = 1): string {\n const toHex = (n: number) => {\n const hex = Math.round(n * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}${a < 1 ? toHex(a) : ''}`;\n }\n}\n\n","import { logger } from '../../utils/logger.js';\nimport { readFile, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\n/**\n * Check current source code status\n */\nexport async function checkCurrentCodeStatus(projectPath: string = process.cwd()): Promise<{\n hasHTML: boolean;\n htmlFile?: string;\n hasCSS: boolean;\n cssFiles: string[];\n hasAssets: boolean;\n assetCount: number;\n sections: string[];\n}> {\n const status = {\n hasHTML: false,\n htmlFile: undefined as string | undefined,\n hasCSS: false,\n cssFiles: [] as string[],\n hasAssets: false,\n assetCount: 0,\n sections: [] as string[],\n };\n\n try {\n // Check for HTML files\n const htmlFiles = ['index.html', 'index.htm', 'main.html'].filter(file => \n existsSync(join(projectPath, file))\n );\n if (htmlFiles.length > 0) {\n status.hasHTML = true;\n status.htmlFile = htmlFiles[0];\n \n // Try to read HTML to extract sections\n try {\n const htmlContent = await readFile(join(projectPath, htmlFiles[0]), 'utf-8');\n // Extract section IDs and classes\n const sectionMatches = htmlContent.match(/<(section|div|header|footer|main|article|aside)[^>]*(?:id|class)=[\"']([^\"']+)[\"']/gi);\n if (sectionMatches) {\n status.sections = sectionMatches.map(match => {\n const idMatch = match.match(/id=[\"']([^\"']+)[\"']/i);\n const classMatch = match.match(/class=[\"']([^\"']+)[\"']/i);\n return idMatch ? idMatch[1] : (classMatch ? classMatch[1].split(' ')[0] : '');\n }).filter(Boolean);\n }\n } catch (e) {\n // Ignore read errors\n }\n }\n\n // Check for CSS files\n const stylesDir = join(projectPath, 'styles');\n if (existsSync(stylesDir)) {\n try {\n const files = await readdir(stylesDir);\n const cssFiles = files.filter(f => f.endsWith('.css'));\n if (cssFiles.length > 0) {\n status.hasCSS = true;\n status.cssFiles = cssFiles.map(f => join(stylesDir, f));\n }\n } catch (e) {\n // Ignore read errors\n }\n }\n\n // Check for assets\n const assetsDir = join(projectPath, 'assets', 'images');\n if (existsSync(assetsDir)) {\n try {\n const files = await readdir(assetsDir);\n const imageFiles = files.filter(f => /\\.(png|jpg|jpeg|svg|webp)$/i.test(f));\n if (imageFiles.length > 0) {\n status.hasAssets = true;\n status.assetCount = imageFiles.length;\n }\n } catch (e) {\n // Ignore read errors\n }\n }\n } catch (error) {\n logger.warn(`Error checking code status: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return status;\n}\n\n/**\n * Compare current code with Figma design to identify what needs to be implemented\n */\nexport async function compareCodeWithFigma(\n figmaTokens: any,\n selectedScreenId: string,\n projectPath: string = process.cwd()\n): Promise<{\n missingSections: string[];\n missingAssets: string[];\n needsUpdate: boolean;\n recommendations: string[];\n}> {\n const codeStatus = await checkCurrentCodeStatus(projectPath);\n const result = {\n missingSections: [] as string[],\n missingAssets: [] as string[],\n needsUpdate: false,\n recommendations: [] as string[],\n };\n\n // Find selected screen\n const selectedScreen = figmaTokens.screens?.find((s: any) => s.id === selectedScreenId);\n if (!selectedScreen) {\n result.recommendations.push('Selected screen not found in Figma design');\n return result;\n }\n\n // Extract sections from Figma structure\n const figmaSections: string[] = [];\n if (figmaTokens.structure?.nodes) {\n const screenNode = figmaTokens.structure.nodes.find((n: any) => n.id === selectedScreenId);\n if (screenNode?.children) {\n // Extract main sections from children\n screenNode.children.forEach((childId: string) => {\n const childNode = figmaTokens.structure.nodes.find((n: any) => n.id === childId);\n if (childNode && (childNode.type === 'FRAME' || childNode.type === 'COMPONENT')) {\n const sectionName = childNode.name.toLowerCase()\n .replace(/[^a-z0-9]/g, '-')\n .replace(/-+/g, '-');\n figmaSections.push(sectionName);\n }\n });\n }\n }\n\n // Compare sections\n const existingSections = codeStatus.sections.map(s => s.toLowerCase());\n result.missingSections = figmaSections.filter(s => \n !existingSections.some(existing => existing.includes(s) || s.includes(existing))\n );\n\n // Check assets\n if (codeStatus.assetCount === 0) {\n result.missingAssets.push('All assets need to be downloaded');\n result.needsUpdate = true;\n }\n\n // Generate recommendations\n if (!codeStatus.hasHTML) {\n result.recommendations.push('Create index.html with HTML5 structure');\n }\n if (!codeStatus.hasCSS) {\n result.recommendations.push('Create CSS files (variables.css, base.css, components.css)');\n }\n if (result.missingSections.length > 0) {\n result.recommendations.push(`Implement missing sections: ${result.missingSections.join(', ')}`);\n }\n if (result.missingAssets.length > 0) {\n result.recommendations.push('Download required assets from Figma');\n }\n\n return result;\n}\n\n\n\n\n","import { readFile, writeFile, readdir, access, constants, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { paths } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Bead task structure\n */\nexport interface Bead {\n id: string;\n title: string;\n description: string;\n status: 'todo' | 'in-progress' | 'completed' | 'blocked';\n type?: 'feature' | 'pattern' | 'decision' | 'knowledge';\n createdAt: Date;\n updatedAt: Date;\n notes: string[];\n subtasks?: string[];\n}\n\n/**\n * Beads integration status\n */\nexport interface BeadsStatus {\n installed: boolean;\n version?: string;\n initialized: boolean;\n activeTasks: number;\n completedTasks: number;\n currentTask?: string;\n}\n\n/**\n * Beads Integration - Task tracking with hard quality gates\n */\nexport class BeadsIntegration {\n private projectPath: string;\n\n constructor(projectPath?: string) {\n this.projectPath = projectPath || process.cwd();\n }\n\n /**\n * Check if Beads CLI is installed\n */\n async isInstalled(): Promise<boolean> {\n try {\n await execAsync('bd --version');\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get Beads version\n */\n async getVersion(): Promise<string | null> {\n try {\n const { stdout } = await execAsync('bd --version');\n const match = stdout.match(/bd version (\\S+)/);\n return match?.[1] || null;\n } catch {\n return null;\n }\n }\n\n /**\n * Check if Beads is initialized in project\n */\n async isInitialized(): Promise<boolean> {\n const beadsDir = paths.beadsDir(this.projectPath);\n try {\n await access(beadsDir, constants.R_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Install Beads CLI globally\n */\n async install(): Promise<boolean> {\n try {\n await execAsync('npm install -g beads');\n return true;\n } catch (error) {\n logger.error('Failed to install Beads CLI:', error);\n return false;\n }\n }\n\n /**\n * Initialize Beads in project using bd CLI\n */\n async init(): Promise<boolean> {\n try {\n await execAsync('bd init', { cwd: this.projectPath });\n logger.success('Beads initialized');\n return true;\n } catch (error) {\n logger.error('Failed to initialize Beads:', error);\n return false;\n }\n }\n\n /**\n * Initialize local .beads directory (works without global beads CLI)\n * Creates a fully functional beads workspace for OpenCode/Claude Code\n */\n async initLocal(): Promise<boolean> {\n try {\n const beadsDir = paths.beadsDir(this.projectPath);\n await mkdir(beadsDir, { recursive: true });\n\n // Create config.yaml\n const configYaml = `# Beads Configuration File\n# This file configures default behavior for all bd commands in this repository\n# All settings can also be set via environment variables (BD_* prefix)\n# or overridden with command-line flags\n\n# Issue prefix for this repository (used by bd init)\n# If not set, bd init will auto-detect from directory name\n# issue-prefix: \"\"\n\n# Use no-db mode: load from JSONL, no SQLite, write back after each command\n# When true, bd will use .beads/issues.jsonl as the source of truth\n# instead of SQLite database\n# no-db: false\n\n# Disable daemon for RPC communication (forces direct database access)\n# no-daemon: false\n\n# Disable auto-flush of database to JSONL after mutations\n# no-auto-flush: false\n\n# Disable auto-import from JSONL when it's newer than database\n# no-auto-import: false\n\n# Enable JSON output by default\n# json: false\n\n# Default actor for audit trails (overridden by BD_ACTOR or --actor)\n# actor: \"\"\n\n# Path to database (overridden by BEADS_DB or --db)\n# db: \"\"\n\n# Auto-start daemon if not running (can also use BEADS_AUTO_START_DAEMON)\n# auto-start-daemon: true\n\n# Debounce interval for auto-flush (can also use BEADS_FLUSH_DEBOUNCE)\n# flush-debounce: \"5s\"\n\n# Git branch for beads commits (bd sync will commit to this branch)\n# IMPORTANT: Set this for team projects so all clones use the same sync branch.\n# sync-branch: \"beads-sync\"\n`;\n await writeFile(join(beadsDir, 'config.yaml'), configYaml);\n\n // Create metadata.json\n const metadata = {\n database: \"beads.db\",\n jsonl_export: \"issues.jsonl\"\n };\n await writeFile(join(beadsDir, 'metadata.json'), JSON.stringify(metadata, null, 2));\n\n // Create .gitignore\n const gitignore = `# SQLite databases\n*.db\n*.db?*\n*.db-journal\n*.db-wal\n*.db-shm\n\n# Daemon runtime files\ndaemon.lock\ndaemon.log\ndaemon.pid\nbd.sock\n\n# Local version tracking (prevents upgrade notification spam after git ops)\n.local_version\n\n# Legacy database files\ndb.sqlite\nbd.db\n\n# Merge artifacts (temporary files from 3-way merge)\nbeads.base.jsonl\nbeads.base.meta.json\nbeads.left.jsonl\nbeads.left.meta.json\nbeads.right.jsonl\nbeads.right.meta.json\n\n# Keep JSONL exports and config (source of truth for git)\n!issues.jsonl\n!metadata.json\n!config.json\n`;\n await writeFile(join(beadsDir, '.gitignore'), gitignore);\n\n // Create .local_version (with placeholder version)\n await writeFile(join(beadsDir, '.local_version'), '0.32.1\\n');\n\n // Create README for .beads directory\n const readmeContent = `# Beads - Task Tracking\n\nThis directory contains task beads for tracking work items.\n\n## How it works\n- Each file is a task bead (bead-001.md, bead-002.md, etc.)\n- Status: todo, in-progress, completed, blocked\n- Use \\`/create\\` command to create new tasks\n- Use \\`/finish\\` command to complete tasks with quality gates\n\n## Automatic Setup\nThis directory was automatically initialized by AIKit for use with OpenCode/Claude Code.\nNo manual setup required - it's ready to use!\n\n## Beads CLI (Optional)\nFor advanced functionality, you can install the beads CLI globally:\n\\`\\`\\`bash\nnpm install -g beads\n\\`\\`\\`\n\nThen you can use commands like:\n- \\`bd ready\\` - Show available work\n- \\`bd show <id>\\` - View task details\n- \\`bd update <id> --status in_progress\\` - Update task status\n- \\`bd close <id>\\` - Complete task\n- \\`bd sync\\` - Sync with git\n`;\n\n await writeFile(join(beadsDir, 'README.md'), readmeContent);\n\n return true;\n } catch (error) {\n logger.error('Failed to initialize .beads directory:', error);\n return false;\n }\n }\n\n /**\n * Setup git hooks\n */\n async setupGitHooks(): Promise<boolean> {\n try {\n const gitHooksDir = join(this.projectPath, '.git', 'hooks');\n\n // Check if .git directory exists (skip if not a git repo)\n \n if (!existsSync(gitHooksDir)) {\n logger.info('Not a git repository, skipping git hooks setup');\n return true;\n }\n\n const preCommitHook = join(gitHooksDir, 'pre-commit');\n\n // Pre-commit hook content\n const hookContent = `#!/bin/sh\n#\n# bd (beads) pre-commit hook\n#\n# This hook ensures that any pending bd issue changes are flushed to\n# .beads/issues.jsonl before the commit is created, preventing a\n# race condition where daemon auto-flush fires after the commit.\n#\n\n# Check if bd is available\nif ! command -v bd >/dev/null 2>&1; then\n echo \"Warning: bd command not found, skipping pre-commit flush\" >&2\n exit 0\nfi\n\n# Check if we're in a bd workspace\nBEADS_DIR=\"\"\nif [ -d \".beads\" ]; then\n BEADS_DIR=\".beads\"\nfi\n\nif [ -z \"$BEADS_DIR\" ]; then\n # Not a bd workspace, nothing to do\n exit 0\nfi\n\n# Check if bd is actually initialized (has beads.db or config.yaml)\n# This prevents errors if .beads/ exists but bd was never initialized\nif [ ! -f \"$BEADS_DIR/beads.db\" ] && [ ! -f \"$BEADS_DIR/config.yaml\" ]; then\n # .beads/ exists but bd is not initialized, skip bd operations\n exit 0\nfi\n\n# Flush pending changes to JSONL\n# Use --flush-only to skip git operations (we're already in a git hook)\n# Suppress output unless there's an error\nif ! bd sync --flush-only >/dev/null 2>&1; then\n echo \"Error: Failed to flush bd changes to JSONL\" >&2\n echo \"Run 'bd sync --flush-only' manually to diagnose\" >&2\n exit 1\nfi\n\nexit 0\n`;\n\n // Write hook file\n await writeFile(preCommitHook, hookContent, { mode: 0o755 });\n return true;\n } catch (error) {\n logger.error('Failed to setup git hooks:', error);\n return false;\n }\n }\n\n /**\n * Get current status\n */\n async getStatus(): Promise<BeadsStatus> {\n const installed = await this.isInstalled();\n const version = await this.getVersion();\n const initialized = await this.isInitialized();\n \n let activeTasks = 0;\n let completedTasks = 0;\n let currentTask: string | undefined;\n \n if (initialized) {\n const beads = await this.listBeads();\n activeTasks = beads.filter(b => b.status === 'in-progress' || b.status === 'todo').length;\n completedTasks = beads.filter(b => b.status === 'completed').length;\n \n const active = beads.find(b => b.status === 'in-progress');\n currentTask = active?.title;\n }\n \n return {\n installed,\n version: version || undefined,\n initialized,\n activeTasks,\n completedTasks,\n currentTask,\n };\n }\n\n /**\n * List all beads in project\n */\n async listBeads(): Promise<Bead[]> {\n const beadsDir = paths.beadsDir(this.projectPath);\n const beads: Bead[] = [];\n \n try {\n const files = await readdir(beadsDir);\n \n for (const file of files) {\n if (!file.match(/^bead-\\d+\\.md$/)) continue;\n \n const content = await readFile(join(beadsDir, file), 'utf-8');\n const bead = this.parseBeadFile(file, content);\n if (bead) beads.push(bead);\n }\n } catch {\n // No beads directory\n }\n \n return beads.sort((a, b) => a.id.localeCompare(b.id));\n }\n\n /**\n * Get a specific bead\n */\n async getBead(id: string): Promise<Bead | null> {\n const beadsDir = paths.beadsDir(this.projectPath);\n const fileName = id.endsWith('.md') ? id : `${id}.md`;\n \n try {\n const content = await readFile(join(beadsDir, fileName), 'utf-8');\n return this.parseBeadFile(fileName, content);\n } catch {\n return null;\n }\n }\n\n /**\n * Create a new bead\n */\n async createBead(title: string, description: string): Promise<Bead> {\n const beadsDir = paths.beadsDir(this.projectPath);\n await mkdir(beadsDir, { recursive: true });\n \n // Get next bead ID\n const beads = await this.listBeads();\n const maxId = beads.reduce((max, b) => {\n const num = parseInt(b.id.replace('bead-', ''), 10);\n return num > max ? num : max;\n }, 0);\n \n const id = `bead-${String(maxId + 1).padStart(3, '0')}`;\n const now = new Date().toISOString();\n \n const content = `---\nid: ${id}\ntitle: ${title}\nstatus: in-progress\ncreated: ${now}\nupdated: ${now}\n---\n\n# ${title}\n\n## Description\n${description}\n\n## Notes\n\n`;\n\n await writeFile(join(beadsDir, `${id}.md`), content);\n \n return {\n id,\n title,\n description,\n status: 'in-progress',\n createdAt: new Date(now),\n updatedAt: new Date(now),\n notes: [],\n };\n }\n\n /**\n * Update bead status\n */\n async updateBeadStatus(id: string, status: Bead['status']): Promise<boolean> {\n const beadsDir = paths.beadsDir(this.projectPath);\n const fileName = id.endsWith('.md') ? id : `${id}.md`;\n const filePath = join(beadsDir, fileName);\n \n try {\n let content = await readFile(filePath, 'utf-8');\n \n // Update status in frontmatter\n content = content.replace(\n /status:\\s*\\w+/,\n `status: ${status}`\n );\n \n // Update timestamp\n content = content.replace(\n /updated:\\s*.+/,\n `updated: ${new Date().toISOString()}`\n );\n \n await writeFile(filePath, content);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Add note to bead\n */\n async addNote(id: string, note: string): Promise<boolean> {\n const beadsDir = paths.beadsDir(this.projectPath);\n const fileName = id.endsWith('.md') ? id : `${id}.md`;\n const filePath = join(beadsDir, fileName);\n \n try {\n let content = await readFile(filePath, 'utf-8');\n \n // Find notes section and add note\n const notesMatch = content.match(/## Notes\\n([\\s\\S]*?)(?=\\n##|$)/);\n if (notesMatch) {\n const timestamp = new Date().toLocaleString();\n const newNote = `- [${timestamp}] ${note}`;\n content = content.replace(\n notesMatch[0],\n `## Notes\\n${notesMatch[1]}${newNote}\\n`\n );\n }\n \n // Update timestamp\n content = content.replace(\n /updated:\\s*.+/,\n `updated: ${new Date().toISOString()}`\n );\n \n await writeFile(filePath, content);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Update bead type\n */\n async updateBeadType(id: string, type: Bead['type']): Promise<boolean> {\n const beadsDir = paths.beadsDir(this.projectPath);\n const fileName = id.endsWith('.md') ? id : `${id}.md`;\n const filePath = join(beadsDir, fileName);\n\n try {\n let content = await readFile(filePath, 'utf-8');\n\n // Check if type field already exists\n const typeMatch = content.match(/^type:\\s*.+/m);\n if (typeMatch) {\n // Update existing type\n content = content.replace(typeMatch[0], `type: ${type}`);\n } else {\n // Add type field after status\n content = content.replace(/^---\\n([\\s\\S]*?)\\n---/, (match) => {\n return match.replace(/^---\\n/, `---\\ntype: ${type}\\n`);\n });\n }\n\n // Update timestamp\n content = content.replace(\n /updated:\\s*.+/,\n `updated: ${new Date().toISOString()}`\n );\n\n await writeFile(filePath, content);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Complete a bead with quality gates\n */\n async completeBead(id: string): Promise<{\n success: boolean;\n gates: { name: string; passed: boolean; error?: string }[];\n handoffCreated: boolean;\n }> {\n // Run quality gates\n const gates = [\n { name: 'Type Check', command: 'npm run typecheck' },\n { name: 'Tests', command: 'npm run test' },\n { name: 'Lint', command: 'npm run lint' },\n { name: 'Build', command: 'npm run build' },\n ];\n \n const results: { name: string; passed: boolean; error?: string }[] = [];\n \n for (const gate of gates) {\n try {\n await execAsync(gate.command, { cwd: this.projectPath });\n results.push({ name: gate.name, passed: true });\n logger.success(`${gate.name}: passed`);\n } catch (error) {\n results.push({\n name: gate.name,\n passed: false,\n error: error instanceof Error ? error.message.slice(0, 200) : 'Failed',\n });\n logger.error(`${gate.name}: failed`);\n }\n }\n \n const allPassed = results.every(r => r.passed);\n \n if (allPassed) {\n await this.updateBeadStatus(id, 'completed');\n await this.addNote(id, 'Task completed - all quality gates passed');\n \n // Auto-generate handoff for session continuity\n const { MemoryManager } = await import('./memory.js');\n const { loadConfig } = await import('./config.js');\n const config = await loadConfig(this.projectPath);\n const memory = new MemoryManager(config);\n \n await memory.createHandoff({\n completed: [id],\n inProgress: [],\n remaining: [],\n context: `Auto-generated handoff for completed task: ${id}`,\n nextSteps: ['Review completed work', 'Start new task if needed'],\n });\n } else {\n await this.addNote(id, 'Completion attempted but quality gates failed');\n }\n \n return {\n success: allPassed,\n gates: results,\n handoffCreated: allPassed,\n };\n }\n\n /**\n * Get current active bead\n */\n async getCurrentBead(): Promise<Bead | null> {\n const beads = await this.listBeads();\n return beads.find(b => b.status === 'in-progress') || null;\n }\n\n /**\n * Parse a bead file\n */\n private parseBeadFile(fileName: string, content: string): Bead | null {\n try {\n const id = fileName.replace('.md', '');\n \n // Extract frontmatter\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n const frontmatter = frontmatterMatch?.[1] || '';\n \n const getValue = (key: string): string => {\n const match = frontmatter.match(new RegExp(`${key}:\\\\s*(.+)`));\n return match?.[1]?.trim() || '';\n };\n \n // Parse title\n const titleMatch = content.match(/^# (.+)/m);\n const title = getValue('title') || titleMatch?.[1] || id;\n \n // Parse description\n const descMatch = content.match(/## Description\\n([\\s\\S]*?)(?=\\n##|$)/);\n const description = descMatch?.[1]?.trim() || '';\n \n // Parse notes\n const notesMatch = content.match(/## Notes\\n([\\s\\S]*?)(?=\\n##|$)/);\n const notesContent = notesMatch?.[1] || '';\n const notes = notesContent\n .split('\\n')\n .filter(line => line.trim().startsWith('-'))\n .map(line => line.replace(/^-\\s*/, '').trim());\n \n // Parse type\n const type = getValue('type') as Bead['type'] | undefined;\n \n return {\n id,\n title,\n description,\n status: (getValue('status') as Bead['status']) || 'todo',\n type,\n createdAt: new Date(getValue('created') || Date.now()),\n updatedAt: new Date(getValue('updated') || Date.now()),\n notes,\n };\n } catch {\n return null;\n }\n }\n}","import { readFile, writeFile, readdir, mkdir, access } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport matter from 'gray-matter';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\n/**\n * Session update structure\n */\nexport interface SessionUpdate {\n timestamp: string;\n notes?: string;\n gitBranch?: string;\n gitCommits?: number;\n modifiedFiles?: string[];\n beadsTask?: {\n id: string;\n status: string;\n };\n}\n\n/**\n * Session data structure\n */\nexport interface Session {\n id: string;\n name: string;\n startTime: string;\n endTime?: string;\n goals: string[];\n updates: SessionUpdate[];\n status: 'active' | 'ended';\n}\n\n/**\n * Session Manager\n * Handles session lifecycle for development tracking\n */\nexport class SessionManager {\n private sessionsDir: string;\n private projectPath: string;\n\n constructor(projectPath?: string) {\n this.projectPath = projectPath || process.cwd();\n this.sessionsDir = join(this.projectPath, '.aikit', 'sessions');\n }\n\n /**\n * Initialize sessions directory\n */\n async init(): Promise<void> {\n await mkdir(this.sessionsDir, { recursive: true });\n }\n\n /**\n * Start a new session\n */\n async startSession(name?: string, goals?: string[]): Promise<Session> {\n await this.init();\n\n // Generate session ID\n const now = new Date();\n const date = now.toISOString().split('T')[0].replace(/-/g, '');\n const time = now.toTimeString().split(' ')[0].replace(/:/g, '');\n const nameSuffix = name ? `-${name.replace(/\\s+/g, '-').toLowerCase()}` : '';\n const id = `${date}-${time}${nameSuffix}`;\n\n // Create session object\n const session: Session = {\n id,\n name: name || 'Untitled Session',\n startTime: now.toISOString(),\n goals: goals || [],\n updates: [],\n status: 'active',\n };\n\n // Get initial git state\n const gitState = await this.getGitState();\n\n // Create initial update\n session.updates.push({\n timestamp: now.toISOString(),\n notes: name ? `Started session: ${name}` : 'Started new session',\n gitBranch: gitState.branch,\n gitCommits: 0,\n });\n\n // Save session file\n await this.saveSession(session);\n\n // Update active session tracker\n await this.setActiveSession(id);\n\n return session;\n }\n\n /**\n * Update current session with notes\n */\n async updateSession(notes?: string): Promise<Session | null> {\n const sessionId = await this.getActiveSessionId();\n if (!sessionId) {\n throw new Error('No active session. Use startSession() first.');\n }\n\n const session = await this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n // Get current git state\n const gitState = await this.getGitState();\n const modifiedFiles = await this.getModifiedFiles();\n\n // Create update\n const update: SessionUpdate = {\n timestamp: new Date().toISOString(),\n notes: notes || 'Session updated',\n gitBranch: gitState.branch,\n gitCommits: gitState.commits || 0,\n modifiedFiles,\n };\n\n // Check for active Beads task\n const beadsTask = await this.getCurrentBeadsTask();\n if (beadsTask) {\n update.beadsTask = beadsTask;\n }\n\n session.updates.push(update);\n\n // Save session\n await this.saveSession(session);\n\n return session;\n }\n\n /**\n * End current session and generate summary\n */\n async endSession(): Promise<Session | null> {\n const sessionId = await this.getActiveSessionId();\n if (!sessionId) {\n throw new Error('No active session. Use startSession() first.');\n }\n\n const session = await this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n // Set end time\n session.endTime = new Date().toISOString();\n session.status = 'ended';\n\n // Add final update with summary\n const gitState = await this.getGitState();\n const modifiedFiles = await this.getModifiedFiles();\n\n session.updates.push({\n timestamp: session.endTime,\n notes: 'Session ended',\n gitBranch: gitState.branch,\n gitCommits: gitState.commits || 0,\n modifiedFiles,\n });\n\n // Save session\n await this.saveSession(session);\n\n // Clear active session\n await this.clearActiveSession();\n\n return session;\n }\n\n /**\n * Get current active session\n */\n async getCurrentSession(): Promise<Session | null> {\n const sessionId = await this.getActiveSessionId();\n if (!sessionId) return null;\n return this.getSession(sessionId);\n }\n\n /**\n * Get all sessions\n */\n async listSessions(): Promise<Session[]> {\n try {\n const files = await readdir(this.sessionsDir);\n const sessions: Session[] = [];\n\n for (const file of files) {\n if (file === '.current-session' || !file.endsWith('.md')) continue;\n\n const sessionId = file.replace('.md', '');\n const session = await this.getSession(sessionId);\n if (session) {\n sessions.push(session);\n }\n }\n\n // Sort by start time, newest first\n return sessions.sort((a, b) =>\n new Date(b.startTime).getTime() - new Date(a.startTime).getTime()\n );\n } catch {\n return [];\n }\n }\n\n /**\n * Get specific session\n */\n async getSession(id: string): Promise<Session | null> {\n const filePath = join(this.sessionsDir, `${id}.md`);\n\n try {\n const content = await readFile(filePath, 'utf-8');\n const { data, content: body } = matter(content);\n\n // Parse updates from body\n const updates = this.parseUpdates(body);\n\n return {\n id: data.id as string || id,\n name: data.name as string || 'Untitled',\n startTime: data.startTime as string,\n endTime: data.endTime as string | undefined,\n goals: (data.goals as string[]) || [],\n updates,\n status: (data.status as 'active' | 'ended') || 'active',\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Search sessions by keyword\n */\n async searchSessions(query: string): Promise<Session[]> {\n const sessions = await this.listSessions();\n const lowerQuery = query.toLowerCase();\n\n return sessions.filter((session) =>\n session.name.toLowerCase().includes(lowerQuery) ||\n session.id.toLowerCase().includes(lowerQuery) ||\n session.goals.some((g) => g.toLowerCase().includes(lowerQuery)) ||\n session.updates.some((u) => u.notes?.toLowerCase().includes(lowerQuery))\n );\n }\n\n /**\n * Get active session ID\n */\n private async getActiveSessionId(): Promise<string | null> {\n const trackerPath = join(this.sessionsDir, '.current-session');\n\n try {\n const content = await readFile(trackerPath, 'utf-8');\n return content.trim();\n } catch {\n return null;\n }\n }\n\n /**\n * Set active session\n */\n private async setActiveSession(id: string): Promise<void> {\n const trackerPath = join(this.sessionsDir, '.current-session');\n await writeFile(trackerPath, id);\n }\n\n /**\n * Clear active session\n */\n private async clearActiveSession(): Promise<void> {\n const trackerPath = join(this.sessionsDir, '.current-session');\n\n try {\n await writeFile(trackerPath, '');\n } catch {\n // Ignore if file doesn't exist\n }\n }\n\n /**\n * Save session to file\n */\n private async saveSession(session: Session): Promise<void> {\n const filePath = join(this.sessionsDir, `${session.id}.md`);\n\n // Build updates section\n const updatesMarkdown = session.updates\n .map((update) => {\n const date = new Date(update.timestamp);\n const dateStr = date.toLocaleString();\n const sections: string[] = [`### ${dateStr}`];\n\n if (update.notes) {\n sections.push(update.notes);\n }\n\n if (update.gitBranch) {\n sections.push(`**Git Branch:** ${update.gitBranch}`);\n }\n\n if (update.modifiedFiles && update.modifiedFiles.length > 0) {\n sections.push(\n `**Modified Files:** ${update.modifiedFiles.length} files`,\n update.modifiedFiles.map((f) => ` - ${f}`).join('\\n')\n );\n }\n\n if (update.beadsTask) {\n sections.push(`**Beads Task:** ${update.beadsTask.id} (${update.beadsTask.status})`);\n }\n\n return sections.join('\\n');\n })\n .join('\\n\\n');\n\n // Build frontmatter (filter out undefined values)\n const frontmatter: Record<string, any> = {\n id: session.id,\n name: session.name,\n startTime: session.startTime,\n status: session.status,\n goals: session.goals,\n };\n\n // Only include endTime if it exists\n if (session.endTime) {\n frontmatter.endTime = session.endTime;\n }\n\n // Build content\n const content = `# Development Session - ${session.name}\n\n**Started:** ${new Date(session.startTime).toLocaleString()}\n**Status:** ${session.status}\n${session.endTime ? `**Ended:** ${new Date(session.endTime).toLocaleString()}` : ''}\n\n## Goals\n${session.goals.map((g, i) => `- [ ] ${g}`).join('\\n')}\n\n## Progress\n\n${updatesMarkdown}\n\n## Summary\n${this.generateSummary(session)}\n`;\n\n // Write file\n const fileContent = matter.stringify(content, frontmatter);\n await writeFile(filePath, fileContent);\n }\n\n /**\n * Generate session summary\n */\n private generateSummary(session: Session): string {\n if (session.status === 'active') {\n return '*Session in progress...*';\n }\n\n const duration = session.endTime\n ? new Date(session.endTime).getTime() - new Date(session.startTime).getTime()\n : 0;\n const durationMinutes = Math.floor(duration / 60000);\n const hours = Math.floor(durationMinutes / 60);\n const minutes = durationMinutes % 60;\n\n let summary = `**Duration:** ${hours}h ${minutes}m\\n\\n`;\n\n // Goals completion\n const totalGoals = session.goals.length;\n summary += `**Goals:** ${totalGoals} defined\\n\\n`;\n\n // Count updates\n summary += `**Updates:** ${session.updates.length} progress notes\\n\\n`;\n\n // Git summary\n const lastUpdate = session.updates[session.updates.length - 1];\n if (lastUpdate?.gitCommits !== undefined) {\n summary += `**Git Commits:** ${lastUpdate.gitCommits} commits\\n\\n`;\n }\n\n if (lastUpdate?.modifiedFiles && lastUpdate.modifiedFiles.length > 0) {\n summary += `**Files Modified:** ${lastUpdate.modifiedFiles.length} files\\n\\n`;\n }\n\n summary += `**Total Updates:** ${session.updates.length}`;\n\n return summary;\n }\n\n /**\n * Parse updates from markdown body\n */\n private parseUpdates(body: string): SessionUpdate[] {\n const updates: SessionUpdate[] = [];\n const lines = body.split('\\n');\n let currentUpdate: Partial<SessionUpdate> | null = null;\n let notesLines: string[] = [];\n\n for (const line of lines) {\n // Check for update header (### YYYY-MM-DD HH:MM)\n const updateMatch = line.match(/^### (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})/);\n if (updateMatch) {\n // Save previous update\n if (currentUpdate) {\n currentUpdate.notes = notesLines.join('\\n').trim();\n updates.push(currentUpdate as SessionUpdate);\n }\n\n // Start new update\n currentUpdate = {\n timestamp: updateMatch[1],\n };\n notesLines = [];\n continue;\n }\n\n if (!currentUpdate) continue;\n\n // Parse git branch\n const gitBranchMatch = line.match(/\\*\\*Git Branch:\\*\\* (.+)/);\n if (gitBranchMatch) {\n currentUpdate.gitBranch = gitBranchMatch[1];\n continue;\n }\n\n // Parse commits\n const commitsMatch = line.match(/\\*\\*Git Commits:\\*\\* (\\d+)/);\n if (commitsMatch) {\n currentUpdate.gitCommits = parseInt(commitsMatch[1], 10);\n continue;\n }\n\n // Parse modified files\n if (line.includes('**Modified Files:**')) {\n continue;\n }\n\n // Parse file list items\n if (line.trim().startsWith('- ') && currentUpdate) {\n if (!currentUpdate.modifiedFiles) {\n currentUpdate.modifiedFiles = [];\n }\n currentUpdate.modifiedFiles.push(line.trim().substring(2));\n continue;\n }\n\n // Parse Beads task\n const beadsMatch = line.match(/\\*\\*Beads Task:\\*\\* ([\\w-]+) \\((\\w+)\\)/);\n if (beadsMatch) {\n currentUpdate.beadsTask = {\n id: beadsMatch[1],\n status: beadsMatch[2],\n };\n continue;\n }\n\n // Collect notes (non-metadata lines)\n if (!line.startsWith('**') && !line.startsWith('#')) {\n notesLines.push(line);\n }\n }\n\n // Save last update\n if (currentUpdate) {\n currentUpdate.notes = notesLines.join('\\n').trim();\n updates.push(currentUpdate as SessionUpdate);\n }\n\n return updates;\n }\n\n /**\n * Get git state\n */\n private async getGitState(): Promise<{ branch: string; commits?: number }> {\n try {\n // Get branch name\n const { stdout: branch } = await execAsync('git rev-parse --abbrev-ref HEAD');\n\n // Get commit count since session start (approximate)\n const { stdout: log } = await execAsync('git log --oneline | wc -l');\n\n return {\n branch: branch.trim(),\n commits: parseInt(log.trim(), 10),\n };\n } catch {\n // Not a git repository or git not available\n return { branch: 'main' };\n }\n }\n\n /**\n * Get modified files\n */\n private async getModifiedFiles(): Promise<string[]> {\n try {\n const { stdout } = await execAsync('git status --porcelain');\n const lines = stdout.trim().split('\\n');\n return lines\n .filter((line) => line.trim())\n .map((line) => line.substring(3));\n } catch {\n return [];\n }\n }\n\n /**\n * Get current Beads task\n */\n private async getCurrentBeadsTask(): Promise<{ id: string; status: string } | null> {\n const beadsDir = join(this.projectPath, '.beads');\n try {\n const files = await readdir(beadsDir);\n const beadFiles = files.filter((f) => f.startsWith('bead-') && f.endsWith('.md'));\n\n for (const file of beadFiles) {\n const content = await readFile(join(beadsDir, file), 'utf-8');\n const statusMatch = content.match(/^status:\\s*(\\w+)/m);\n const id = file.replace('.md', '');\n\n if (statusMatch && (statusMatch[1] === 'in-progress' || statusMatch[1] === 'todo')) {\n return {\n id,\n status: statusMatch[1],\n };\n }\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Format session for display\n */\nexport function formatSession(session: Session): string {\n const startDate = new Date(session.startTime);\n const endDate = session.endTime ? new Date(session.endTime) : null;\n\n return `\n${session.id}\n Name: ${session.name}\n Status: ${session.status}\n Started: ${startDate.toLocaleString()}\n ${endDate ? `Ended: ${endDate.toLocaleString()}` : ''}\n Goals: ${session.goals.length}\n Updates: ${session.updates.length}\n`;\n}\n","import { readFile, writeFile, mkdir, access, constants } from 'fs/promises';\nimport { join } from 'path';\nimport { z } from 'zod';\nimport { Config } from './config.js';\n\n/**\n * Tool configuration status\n */\nexport type ToolStatus = 'ready' | 'needs_config' | 'error';\n\n/**\n * Configuration method\n */\nexport type ConfigMethod = 'oauth' | 'manual' | 'none';\n\n/**\n * Tool configuration schema\n */\nconst ToolConfigSchema = z.object({\n name: z.string(),\n status: z.enum(['ready', 'needs_config', 'error']),\n description: z.string(),\n configMethod: z.enum(['oauth', 'manual', 'none']),\n config: z.record(z.unknown()).optional(),\n errorMessage: z.string().optional(),\n});\n\nexport type ToolConfig = z.infer<typeof ToolConfigSchema>;\n\n/**\n * Tools registry with configuration\n */\nconst REGISTERED_TOOLS: Omit<ToolConfig, 'status' | 'config' | 'errorMessage'>[] = [\n {\n name: 'figma-analysis',\n description: 'Analyze Figma designs and extract design tokens using Figma API',\n configMethod: 'oauth',\n },\n // Add more tools here as needed\n];\n\n/**\n * Tool Configuration Manager\n */\nexport class ToolConfigManager {\n private config: Config;\n private toolsConfigPath: string;\n\n constructor(config: Config) {\n this.config = config;\n this.toolsConfigPath = join(this.config.configPath, 'config', 'tools.json');\n }\n\n /**\n * Get all registered tools with their current status\n */\n async listTools(): Promise<ToolConfig[]> {\n const savedConfigs = await this.loadConfigs();\n const tools: ToolConfig[] = [];\n\n for (const tool of REGISTERED_TOOLS) {\n const saved = savedConfigs[tool.name];\n const toolConfig: ToolConfig = {\n ...tool,\n status: this.determineStatus(tool, saved),\n config: saved?.config,\n errorMessage: saved?.errorMessage,\n };\n tools.push(toolConfig);\n }\n\n return tools;\n }\n\n /**\n * Get configuration for a specific tool\n */\n async getToolConfig(toolName: string): Promise<ToolConfig | null> {\n const tools = await this.listTools();\n return tools.find(t => t.name === toolName) || null;\n }\n\n /**\n * Update tool configuration\n */\n async updateToolConfig(toolName: string, updates: {\n config?: Record<string, unknown>;\n status?: ToolStatus;\n errorMessage?: string;\n }): Promise<void> {\n const savedConfigs = await this.loadConfigs();\n const tool = REGISTERED_TOOLS.find(t => t.name === toolName);\n\n if (!tool) {\n throw new Error(`Tool not found: ${toolName}`);\n }\n\n const existing = savedConfigs[toolName] || {};\n savedConfigs[toolName] = {\n ...existing,\n ...updates,\n };\n\n await this.saveConfigs(savedConfigs);\n }\n\n /**\n * Check if a tool is ready to use\n */\n async isToolReady(toolName: string): Promise<boolean> {\n const toolConfig = await this.getToolConfig(toolName);\n return toolConfig?.status === 'ready';\n }\n\n /**\n * Get API key for a tool (if configured)\n */\n async getApiKey(toolName: string): Promise<string | null> {\n const toolConfig = await this.getToolConfig(toolName);\n if (toolConfig?.config?.apiKey && typeof toolConfig.config.apiKey === 'string') {\n return toolConfig.config.apiKey;\n }\n return null;\n }\n\n /**\n * Determine tool status based on configuration\n */\n private determineStatus(\n tool: Omit<ToolConfig, 'status' | 'config' | 'errorMessage'>,\n saved?: { config?: Record<string, unknown>; errorMessage?: string }\n ): ToolStatus {\n if (tool.configMethod === 'none') {\n return 'ready';\n }\n\n if (saved?.errorMessage) {\n return 'error';\n }\n\n if (tool.configMethod === 'oauth' || tool.configMethod === 'manual') {\n // Check if API key is configured\n if (saved?.config?.apiKey && typeof saved.config.apiKey === 'string' && saved.config.apiKey.length > 0) {\n return 'ready';\n }\n return 'needs_config';\n }\n\n return 'needs_config';\n }\n\n /**\n * Load saved configurations\n */\n private async loadConfigs(): Promise<Record<string, { config?: Record<string, unknown>; errorMessage?: string }>> {\n try {\n await access(this.toolsConfigPath, constants.R_OK);\n const content = await readFile(this.toolsConfigPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n /**\n * Save configurations\n */\n private async saveConfigs(configs: Record<string, unknown>): Promise<void> {\n const configDir = join(this.config.configPath, 'config');\n await mkdir(configDir, { recursive: true });\n await writeFile(this.toolsConfigPath, JSON.stringify(configs, null, 2));\n }\n}\n\n","import open from 'open';\nimport { ToolConfigManager } from '../tool-config.js';\nimport { logger } from '../../utils/logger.js';\n\n/**\n * Figma OAuth Configuration\n * \n * Note: Figma uses Personal Access Tokens, not OAuth 2.0\n * For OAuth-like experience, we'll guide user through browser\n * to create a token, then they paste it back\n */\nexport class FigmaOAuth {\n private configManager: ToolConfigManager;\n\n constructor(configManager: ToolConfigManager) {\n this.configManager = configManager;\n }\n\n /**\n * Start OAuth flow for Figma\n * \n * Since Figma uses Personal Access Tokens (not OAuth 2.0),\n * we'll open browser to token creation page and guide user\n */\n async authenticate(): Promise<string> {\n console.log('\\n🔐 Figma Authentication\\n');\n console.log('Figma uses Personal Access Tokens for API access.');\n console.log('We will open your browser to create a token.\\n');\n\n // Open Figma token creation page\n const tokenUrl = 'https://www.figma.com/developers/api#access-tokens';\n console.log(`Opening: ${tokenUrl}`);\n \n try {\n await open(tokenUrl);\n } catch (error) {\n console.log('\\n⚠️ Could not open browser automatically.');\n console.log(`Please visit: ${tokenUrl}`);\n }\n\n console.log('\\n📋 Instructions:');\n console.log('1. In the browser, scroll to \"Personal access tokens\" section');\n console.log('2. Click \"Create new token\"');\n console.log('3. Give it a name (e.g., \"AIKit\")');\n console.log('4. Copy the token (you won\\'t see it again!)');\n console.log('5. Paste it here when prompted\\n');\n\n // Use inquirer to get token from user\n const { default: inquirer } = await import('inquirer');\n \n const { token } = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: 'Paste your Figma Personal Access Token:',\n validate: (input: string) => {\n if (!input || input.trim().length === 0) {\n return 'Token cannot be empty';\n }\n if (input.length < 20) {\n return 'Token seems too short. Please check and try again.';\n }\n return true;\n },\n },\n ]);\n\n // Validate token format (Figma tokens are typically long alphanumeric strings)\n const trimmedToken = token.trim();\n \n // Save token\n await this.configManager.updateToolConfig('figma-analysis', {\n config: {\n apiKey: trimmedToken,\n },\n status: 'ready',\n });\n\n logger.success('Figma token saved successfully!');\n return trimmedToken;\n }\n\n /**\n * Alternative: Manual token input\n */\n async authenticateManual(): Promise<string> {\n const { default: inquirer } = await import('inquirer');\n \n console.log('\\n🔐 Figma Authentication (Manual)\\n');\n console.log('To get your Figma Personal Access Token:');\n console.log('1. Visit: https://www.figma.com/developers/api#access-tokens');\n console.log('2. Scroll to \"Personal access tokens\"');\n console.log('3. Click \"Create new token\"');\n console.log('4. Copy the token and paste it below\\n');\n\n const { token } = await inquirer.prompt([\n {\n type: 'password',\n name: 'token',\n message: 'Enter your Figma Personal Access Token:',\n validate: (input: string) => {\n if (!input || input.trim().length === 0) {\n return 'Token cannot be empty';\n }\n return true;\n },\n },\n ]);\n\n const trimmedToken = token.trim();\n \n await this.configManager.updateToolConfig('figma-analysis', {\n config: {\n apiKey: trimmedToken,\n },\n status: 'ready',\n });\n\n logger.success('Figma token saved successfully!');\n return trimmedToken;\n }\n\n /**\n * Test if token is valid by making a simple API call\n */\n async validateToken(token: string): Promise<boolean> {\n try {\n // Try to get user info from Figma API\n const response = await fetch('https://api.figma.com/v1/me', {\n headers: {\n 'X-Figma-Token': token,\n },\n });\n\n if (response.ok) {\n const data = await response.json() as { email?: string };\n logger.success(`Token validated! Logged in as: ${data.email || 'Unknown'}`);\n return true;\n } else {\n logger.error(`Token validation failed: ${response.status} ${response.statusText}`);\n return false;\n }\n } catch (error) {\n logger.error(`Token validation error: ${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n}\n\n","/**\n * AIKit CLI\n * \n * This file serves as the entry point for the CLI.\n * All command implementations are in src/cli/ directory.\n * \n * Structure:\n * - src/cli/index.ts - Main entry point with program setup\n * - src/cli/commands/ - Individual command implementations\n * - src/cli/helpers.ts - Helper functions for commands\n */\n\n// Re-export everything from the CLI module\nexport * from './cli/index.js';\n\n// The actual CLI is started in src/cli/index.ts\n// This file just serves as the build entry point\nimport './cli/index.js';\n","/**\n * AIKit CLI - Main Entry Point\n * \n * Open-source AI coding agent toolkit for OpenCode\n */\n\nimport { Command } from 'commander';\nimport { VERSION } from '../index.js';\n\nimport {\n registerInitCommand,\n registerInstallCommand,\n registerSyncCommand,\n registerSkillsCommand,\n registerAgentsCommand,\n registerCommandsCommand,\n registerModeCommand,\n registerToolsCommand,\n registerPluginsCommand,\n registerMemoryCommand,\n registerBeadsCommand,\n registerStatusCommand,\n registerSessionCommand,\n} from './commands/index.js';\n\nconst program = new Command();\n\nprogram\n .name('aikit')\n .description('Open-source AI coding agent toolkit for OpenCode')\n .version(VERSION());\n\n// Register all commands\nregisterInitCommand(program);\nregisterInstallCommand(program);\nregisterSyncCommand(program);\nregisterSkillsCommand(program);\nregisterAgentsCommand(program);\nregisterCommandsCommand(program);\nregisterModeCommand(program);\nregisterToolsCommand(program);\nregisterPluginsCommand(program);\nregisterMemoryCommand(program);\nregisterBeadsCommand(program);\nregisterSessionCommand(program);\nregisterStatusCommand(program);\n\n// Run CLI\nprogram.parse();\n\n\n\n\n","/**\n * AIKit - Open-source AI coding agent toolkit for OpenCode\n * \n * Provides skills, agents, commands, tools, and plugins for enhanced AI-assisted development.\n */\n\n// Core exports\nexport { Config, loadConfig, type AIKitConfig } from './core/config.js';\nexport { SkillEngine, type Skill } from './core/skills.js';\nexport { AgentManager, type Agent, type AgentType } from './core/agents.js';\nexport { CommandRunner, type Command } from './core/commands.js';\nexport { ToolRegistry, type Tool, defineTool } from './core/tools.js';\nexport { PluginSystem, type Plugin, type PluginEvent } from './core/plugins.js';\nexport { MemoryManager, type Memory } from './core/memory.js';\nexport { BeadsIntegration } from './core/beads.js';\nexport { AntiHallucination } from './core/anti-hallucination.js';\n\n// Utilities\nexport { logger } from './utils/logger.js';\nexport { paths } from './utils/paths.js';\nexport { getVersion as VERSION } from './utils/version.js';\n","import { readFile, readdir, writeFile, mkdir } from 'fs/promises';\nimport { join, basename, extname } from 'path';\nimport matter from 'gray-matter';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Skill definition\n */\nexport interface Skill {\n name: string;\n description: string;\n useWhen: string;\n category: string;\n tags: string[];\n content: string;\n filePath: string;\n}\n\n/**\n * Skill frontmatter schema\n */\ninterface SkillFrontmatter {\n name?: string;\n description?: string;\n useWhen?: string;\n category?: string;\n tags?: string[];\n}\n\n/**\n * Skill Engine - Manages workflow skills for AI agents\n * \n * Skills are mandatory workflow instructions that agents must follow.\n * They enforce structured processes like TDD, systematic debugging, etc.\n */\nexport class SkillEngine {\n private config: Config;\n private skillsCache: Map<string, Skill> = new Map();\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * List all available skills\n */\n async listSkills(): Promise<Skill[]> {\n const skills: Skill[] = [];\n \n // Load from global config\n const globalSkillsPath = paths.skills(paths.globalConfig());\n try {\n const globalSkills = await this.loadSkillsFromDir(globalSkillsPath);\n skills.push(...globalSkills);\n } catch {\n // No global skills\n }\n \n // Load from project config (override global)\n const projectSkillsPath = paths.skills(this.config.configPath);\n if (projectSkillsPath !== globalSkillsPath) {\n try {\n const projectSkills = await this.loadSkillsFromDir(projectSkillsPath);\n // Override global skills with project skills\n for (const skill of projectSkills) {\n const existingIndex = skills.findIndex(s => s.name === skill.name);\n if (existingIndex >= 0) {\n skills[existingIndex] = skill;\n } else {\n skills.push(skill);\n }\n }\n } catch {\n // No project skills\n }\n }\n \n return skills.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Get a specific skill by name\n */\n async getSkill(name: string): Promise<Skill | null> {\n // Check cache first\n if (this.skillsCache.has(name)) {\n return this.skillsCache.get(name)!;\n }\n \n const skills = await this.listSkills();\n const skill = skills.find(s => s.name === name);\n \n if (skill) {\n this.skillsCache.set(name, skill);\n }\n \n return skill || null;\n }\n\n /**\n * Find skills matching a query\n */\n async findSkills(query?: string): Promise<Skill[]> {\n const skills = await this.listSkills();\n \n if (!query) {\n return skills;\n }\n \n const lowerQuery = query.toLowerCase();\n return skills.filter(skill =>\n skill.name.toLowerCase().includes(lowerQuery) ||\n skill.description.toLowerCase().includes(lowerQuery) ||\n skill.tags.some(tag => tag.toLowerCase().includes(lowerQuery)) ||\n skill.category.toLowerCase().includes(lowerQuery)\n );\n }\n\n /**\n * Create a new skill\n */\n async createSkill(name: string, options?: {\n description?: string;\n useWhen?: string;\n category?: string;\n tags?: string[];\n content?: string;\n global?: boolean;\n }): Promise<Skill> {\n const configPath = options?.global ? paths.globalConfig() : this.config.configPath;\n const skillsDir = paths.skills(configPath);\n \n await mkdir(skillsDir, { recursive: true });\n \n const fileName = `${name.replace(/\\s+/g, '-').toLowerCase()}.md`;\n const filePath = join(skillsDir, fileName);\n \n const frontmatter: SkillFrontmatter = {\n name,\n description: options?.description || `Use when you need to ${name}`,\n useWhen: options?.useWhen || `The user asks you to ${name}`,\n category: options?.category || 'custom',\n tags: options?.tags || ['custom'],\n };\n \n const content = options?.content || `## ${name}\n\n### Overview\nDescribe what this skill does.\n\n### Workflow\n\n#### Step 1: Understand the Task\n- Gather context\n- Clarify requirements\n\n#### Step 2: Plan the Approach\n- Break down into sub-tasks\n- Identify dependencies\n\n#### Step 3: Execute\n- Follow TDD principles\n- Write tests first\n\n#### Step 4: Verify\n- Run all tests\n- Check for regressions\n\n### Checklist\n- [ ] Requirements understood\n- [ ] Tests written\n- [ ] Implementation complete\n- [ ] All tests passing\n- [ ] Code reviewed\n`;\n\n const fileContent = matter.stringify(content, frontmatter);\n await writeFile(filePath, fileContent);\n \n const skill: Skill = {\n name,\n description: frontmatter.description!,\n useWhen: frontmatter.useWhen!,\n category: frontmatter.category!,\n tags: frontmatter.tags!,\n content,\n filePath,\n };\n \n this.skillsCache.set(name, skill);\n \n return skill;\n }\n\n /**\n * Sync global skills to project directory\n */\n async syncSkillsToProject(): Promise<{ count: number; synced: string[] }> {\n const globalSkillsPath = paths.skills(paths.globalConfig());\n const projectSkillsPath = paths.skills(this.config.configPath);\n \n if (globalSkillsPath === projectSkillsPath) {\n return { count: 0, synced: [] };\n }\n \n // Check if global skills directory exists before trying to load\n let globalSkills: Skill[] = [];\n try {\n globalSkills = await this.loadSkillsFromDir(globalSkillsPath);\n } catch (error) {\n // Global skills directory doesn't exist or can't be read\n logger.warn('Global skills directory not found. Skipping sync.');\n return { count: 0, synced: [] };\n }\n \n if (globalSkills.length === 0) {\n logger.info('No global skills to sync.');\n return { count: 0, synced: [] };\n }\n \n await mkdir(projectSkillsPath, { recursive: true });\n \n const synced: string[] = [];\n \n for (const skill of globalSkills) {\n const fileName = `${skill.name.replace(/\\s+/g, '-').toLowerCase()}.md`;\n const destPath = join(projectSkillsPath, fileName);\n const srcContent = await readFile(skill.filePath, 'utf-8');\n await writeFile(destPath, srcContent);\n synced.push(skill.name);\n }\n \n return { count: synced.length, synced };\n }\n\n /**\n * Format skill for agent consumption\n */\n formatForAgent(skill: Skill): string {\n return `# Skill: ${skill.name}\n\n## When to Use\n${skill.useWhen}\n\n## Description\n${skill.description}\n\n## Workflow\n${skill.content}\n\n---\n**IMPORTANT**: Follow this workflow step by step. Do not skip steps.\n`;\n }\n\n /**\n * Load skills from a directory\n */\n private async loadSkillsFromDir(dir: string): Promise<Skill[]> {\n const files = await readdir(dir);\n const skills: Skill[] = [];\n \n for (const file of files) {\n if (extname(file) !== '.md') continue;\n \n const filePath = join(dir, file);\n const content = await readFile(filePath, 'utf-8');\n const { data, content: body } = matter(content);\n \n const frontmatter = data as SkillFrontmatter;\n const name = frontmatter.name || basename(file, '.md');\n \n skills.push({\n name,\n description: frontmatter.description || '',\n useWhen: frontmatter.useWhen || '',\n category: frontmatter.category || 'general',\n tags: frontmatter.tags || [],\n content: body.trim(),\n filePath,\n });\n }\n \n return skills;\n }\n}\n","import { Config } from './config.js';\n\n/**\n * Agent types available in AIKit\n */\nexport type AgentType = 'planner' | 'build' | 'rush' | 'review' | 'scout' | 'explore' | 'vision' | 'one-shot';\n\n/**\n * Agent definition\n */\nexport interface Agent {\n name: AgentType;\n displayName: string;\n description: string;\n useWhen: string;\n capabilities: string[];\n systemPrompt: string;\n delegatesTo: AgentType[];\n}\n\n/**\n * Default agent definitions\n */\nconst DEFAULT_AGENTS: Agent[] = [\n {\n name: 'planner',\n displayName: '@planner',\n description: 'Strategic planning and multi-agent coordination',\n useWhen: 'Complex tasks requiring architecture decisions, multi-step planning, or coordination between specialists',\n capabilities: [\n 'Break down complex tasks into sub-tasks',\n 'Coordinate between specialist agents',\n 'Make architecture decisions',\n 'Create implementation plans',\n ],\n systemPrompt: `You are a strategic planner agent. Your role is to:\n\n1. ANALYZE the task and understand the full scope\n2. BREAK DOWN complex tasks into smaller, manageable sub-tasks\n3. DELEGATE to appropriate specialist agents\n4. COORDINATE the overall workflow\n5. VERIFY completion of the overall goal\n\nWhen delegating:\n- Use @build for implementation tasks\n- Use @scout for external research\n- Use @review for code review and security audits\n- Use @explore for codebase navigation\n- Use @vision for visual analysis\n\nAlways create a clear plan before delegating. Track progress and ensure all sub-tasks complete successfully.`,\n delegatesTo: ['build', 'scout', 'review', 'explore', 'vision'],\n },\n {\n name: 'build',\n displayName: '@build',\n description: 'Primary execution agent for implementing features',\n useWhen: 'Implementing features, writing code, making changes to the codebase',\n capabilities: [\n 'Write production code',\n 'Write tests',\n 'Refactor code',\n 'Fix bugs',\n 'Implement features',\n ],\n systemPrompt: `You are the build agent. Your role is to implement code changes.\n\nFollow these principles:\n1. TEST-DRIVEN DEVELOPMENT: Write tests before implementation\n2. INCREMENTAL CHANGES: Make small, focused commits\n3. VERIFY: Run tests and type checks after each change\n4. DOCUMENT: Add comments for complex logic\n\nBefore starting:\n- Understand the requirements fully\n- Check existing patterns in the codebase\n- Plan the implementation approach\n\nAfter completing:\n- Ensure all tests pass\n- Run linting and type checks\n- Create a clear commit message`,\n delegatesTo: ['review', 'explore'],\n },\n {\n name: 'rush',\n displayName: '@rush',\n description: 'Fast execution with minimal planning',\n useWhen: 'Quick fixes, hotfixes, simple edits that need minimal planning',\n capabilities: [\n 'Quick bug fixes',\n 'Simple refactoring',\n 'Minor changes',\n 'Hotfixes',\n ],\n systemPrompt: `You are the rush agent. Your role is to make quick, focused changes.\n\nGuidelines:\n1. ACT FAST: Minimal planning, direct execution\n2. FOCUS: One change at a time\n3. VERIFY: Quick sanity check after change\n4. MINIMAL SCOPE: Don't expand beyond the immediate task\n\nUse for:\n- Typo fixes\n- Simple bug fixes\n- Minor adjustments\n- Urgent hotfixes`,\n delegatesTo: [],\n },\n {\n name: 'review',\n displayName: '@review',\n description: 'Code review, debugging, and security audits',\n useWhen: 'Reviewing code quality, finding bugs, security review, debugging issues',\n capabilities: [\n 'Code review',\n 'Security audit',\n 'Performance analysis',\n 'Bug finding',\n 'Best practices enforcement',\n ],\n systemPrompt: `You are the review agent. Your role is to review and improve code quality.\n\nReview checklist:\n1. CORRECTNESS: Does the code do what it's supposed to?\n2. SECURITY: Are there any security vulnerabilities?\n3. PERFORMANCE: Are there performance issues?\n4. MAINTAINABILITY: Is the code clean and readable?\n5. TESTS: Are there adequate tests?\n6. PATTERNS: Does it follow project conventions?\n\nWhen reviewing:\n- Be specific about issues\n- Suggest fixes, not just problems\n- Prioritize by severity\n- Check for edge cases`,\n delegatesTo: [],\n },\n {\n name: 'scout',\n displayName: '@scout',\n description: 'External research - library docs, GitHub patterns, frameworks',\n useWhen: 'Researching external libraries, finding code patterns on GitHub, learning about frameworks',\n capabilities: [\n 'Web research',\n 'GitHub code search',\n 'Documentation lookup',\n 'Framework exploration',\n 'Best practices research',\n ],\n systemPrompt: `You are the scout agent. Your role is to research external resources.\n\nResearch strategy:\n1. UNDERSTAND what information is needed\n2. SEARCH appropriate sources (docs, GitHub, web)\n3. EVALUATE quality and relevance of findings\n4. SUMMARIZE key findings concisely\n5. PROVIDE actionable recommendations\n\nSources to use:\n- Official documentation\n- GitHub code examples\n- Stack Overflow (verified answers)\n- Framework guides\n- Community best practices\n\nAlways cite your sources and verify information accuracy.`,\n delegatesTo: [],\n },\n {\n name: 'explore',\n displayName: '@explore',\n description: 'Fast codebase navigation and pattern search',\n useWhen: 'Finding files, understanding codebase structure, searching for patterns in code',\n capabilities: [\n 'File discovery',\n 'Pattern search',\n 'Codebase navigation',\n 'Structure analysis',\n 'Dependency mapping',\n ],\n systemPrompt: `You are the explore agent. Your role is to navigate and understand the codebase.\n\nExploration techniques:\n1. FILE STRUCTURE: Understand project organization\n2. GREP SEARCH: Find specific patterns or usages\n3. DEPENDENCY ANALYSIS: Map relationships between modules\n4. PATTERN DISCOVERY: Find existing patterns to follow\n5. QUICK CONTEXT: Gather just enough context for the task\n\nFocus on speed and accuracy. Provide concise summaries of findings.`,\n delegatesTo: [],\n },\n {\n name: 'vision',\n displayName: '@vision',\n description: 'Multimodal analysis - mockups, PDFs, diagrams',\n useWhen: 'Analyzing images, mockups, screenshots, PDFs, or diagrams',\n capabilities: [\n 'Image analysis',\n 'Mockup interpretation',\n 'PDF extraction',\n 'Diagram understanding',\n 'UI/UX analysis',\n ],\n systemPrompt: `You are the vision agent. Your role is to analyze visual content.\n\nAnalysis approach:\n1. OBSERVE: Carefully examine the visual content\n2. EXTRACT: Identify key information, text, structure\n3. INTERPRET: Understand the intent and requirements\n4. TRANSLATE: Convert visual specs to actionable tasks\n5. VALIDATE: Ensure accurate interpretation\n\nFor mockups:\n- Identify components and layout\n- Note colors, spacing, typography\n- Extract interaction patterns\n\nFor diagrams:\n- Understand relationships\n- Map to code structure\n- Note data flow`,\n delegatesTo: [],\n },\n {\n name: 'one-shot',\n displayName: '@one-shot',\n description: 'End-to-end autonomous task execution (beta)',\n useWhen: 'Complete tasks autonomously from start to finish with minimal intervention',\n capabilities: [\n 'Gather requirements interactively',\n 'Create detailed implementation plans',\n 'Execute tasks with dynamic agent selection',\n 'Run quality gates until all pass',\n 'Multi-level verification',\n 'Auto-recovery from failures',\n 'Generate completion proof',\n ],\n systemPrompt: `You are the one-shot agent. Your role is to execute tasks autonomously from start to finish.\n\n## Workflow Phases\n\n1. **REQUIREMENTS**: Gather task type, scope, dependencies, success criteria\n2. **PLANNING**: Create detailed plan with @planner, recommend skills/tools\n3. **COMPLEXITY**: Auto-split large tasks (>30min, >10 files, >500 lines)\n4. **EXECUTION**: Execute with parallel tasks, dynamic agent delegation\n5. **TESTING**: Run quality gates (typecheck, test, lint, build) until all pass\n6. **VERIFICATION**: Multi-level verification (gates + manual + deployment)\n7. **COMPLETION**: Generate proof, update tracking, collect feedback\n\n## Quality Gates (Must ALL Pass)\n- npm run typecheck - No type errors\n- npm run test - All tests pass\n- npm run lint - No linting errors\n- npm run build - Build succeeds\n\n## Error Recovery (3 Levels)\n- Level 1: Auto-fix (type errors, lint --fix)\n- Level 2: Alternative approach via @review\n- Level 3: User intervention + follow-up task creation\n\n## Best Practices\n- Use for straightforward tasks first\n- Consider /plan + /implement for complex features\n- Review changes before final approval\n\n⚠️ This mode is experimental. Start with simpler tasks.`,\n delegatesTo: ['planner', 'build', 'review', 'scout', 'explore', 'vision'],\n },\n];\n\n/**\n * Agent delegation result\n */\nexport interface DelegationDecision {\n agent: Agent;\n reason: string;\n shouldDelegate: boolean;\n subTasks?: string[];\n}\n\n/**\n * Agent Manager - Handles agent selection and delegation\n */\nexport class AgentManager {\n private config: Config;\n private agents: Map<AgentType, Agent>;\n\n constructor(config: Config) {\n this.config = config;\n this.agents = new Map();\n \n // Initialize default agents\n for (const agent of DEFAULT_AGENTS) {\n this.agents.set(agent.name, agent);\n }\n }\n\n /**\n * List all available agents\n */\n listAgents(): Agent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Get a specific agent\n */\n getAgent(name: AgentType): Agent | undefined {\n return this.agents.get(name);\n }\n\n /**\n * Get the default agent\n */\n getDefaultAgent(): Agent {\n const defaultName = this.config.agents.default as AgentType;\n return this.agents.get(defaultName) || this.agents.get('build')!;\n }\n\n /**\n * Decide which agent should handle a task\n */\n decideAgent(task: string, _context?: string): DelegationDecision {\n const lowerTask = task.toLowerCase();\n \n // Check for explicit agent mentions\n for (const [name, agent] of this.agents) {\n if (lowerTask.includes(`@${name}`)) {\n return {\n agent,\n reason: `Explicitly requested @${name}`,\n shouldDelegate: false,\n };\n }\n }\n \n // Keyword-based delegation\n if (this.matchesKeywords(lowerTask, ['plan', 'architect', 'design', 'coordinate', 'complex'])) {\n return {\n agent: this.agents.get('planner')!,\n reason: 'Task requires planning and coordination',\n shouldDelegate: true,\n };\n }\n \n if (this.matchesKeywords(lowerTask, ['research', 'docs', 'documentation', 'library', 'framework', 'how to'])) {\n return {\n agent: this.agents.get('scout')!,\n reason: 'Task requires external research',\n shouldDelegate: false,\n };\n }\n \n if (this.matchesKeywords(lowerTask, ['review', 'audit', 'security', 'check', 'debug'])) {\n return {\n agent: this.agents.get('review')!,\n reason: 'Task requires code review or debugging',\n shouldDelegate: false,\n };\n }\n \n if (this.matchesKeywords(lowerTask, ['find', 'search', 'where', 'locate', 'explore'])) {\n return {\n agent: this.agents.get('explore')!,\n reason: 'Task requires codebase exploration',\n shouldDelegate: false,\n };\n }\n \n if (this.matchesKeywords(lowerTask, ['image', 'mockup', 'screenshot', 'pdf', 'diagram', 'visual'])) {\n return {\n agent: this.agents.get('vision')!,\n reason: 'Task requires visual analysis',\n shouldDelegate: false,\n };\n }\n \n if (this.matchesKeywords(lowerTask, ['fix quickly', 'hotfix', 'urgent', 'quick fix', 'typo'])) {\n return {\n agent: this.agents.get('rush')!,\n reason: 'Task is a quick fix',\n shouldDelegate: false,\n };\n }\n \n // Default to build agent\n return {\n agent: this.agents.get('build')!,\n reason: 'Default to build agent for implementation',\n shouldDelegate: false,\n };\n }\n\n /**\n * Format agent instructions for prompt\n */\n formatAgentPrompt(agent: Agent): string {\n return `# Agent: ${agent.displayName}\n\n${agent.systemPrompt}\n\n## Capabilities\n${agent.capabilities.map(c => `- ${c}`).join('\\n')}\n\n${agent.delegatesTo.length > 0 ? `## Can Delegate To\n${agent.delegatesTo.map(a => `- @${a}`).join('\\n')}` : ''}\n`;\n }\n\n private matchesKeywords(text: string, keywords: string[]): boolean {\n return keywords.some(kw => text.includes(kw));\n }\n}\n","/**\n * This file re-exports the modular commands structure for backward compatibility.\n * The actual implementation is in the commands/ directory.\n *\n * @deprecated Import directly from './commands/index.js' instead\n */\n\nexport {\n CommandRunner,\n Command,\n COMMAND_CATEGORIES,\n type CommandFrontmatter,\n type DefaultCommand,\n} from './commands/index.js';\n","import { readFile, readdir, writeFile, mkdir } from 'fs/promises';\nimport { join, basename, extname } from 'path';\nimport matter from 'gray-matter';\nimport { Config } from '../config.js';\nimport { paths } from '../../utils/paths.js';\nimport { Command, CommandFrontmatter, DefaultCommand, COMMAND_CATEGORIES } from './types.js';\nimport { CORE_COMMANDS } from './core.js';\nimport { QUICK_COMMANDS } from './quick.js';\nimport { RESEARCH_COMMANDS } from './research.js';\nimport { DESIGN_COMMANDS } from './design.js';\nimport { GIT_COMMANDS } from './git.js';\nimport { UTILITY_COMMANDS } from './utility.js';\nimport { CHECKPOINT_COMMANDS } from './checkpoint.js';\nimport { SESSION_COMMANDS } from './sessions.js';\nimport { DRAWIO_COMMANDS } from './drawio.js';\n\n/**\n * Aggregate all default commands from separate modules\n */\nconst DEFAULT_COMMANDS: DefaultCommand[] = [\n ...CORE_COMMANDS,\n ...QUICK_COMMANDS,\n ...RESEARCH_COMMANDS,\n ...DESIGN_COMMANDS,\n ...GIT_COMMANDS,\n ...UTILITY_COMMANDS,\n ...CHECKPOINT_COMMANDS,\n ...SESSION_COMMANDS,\n ...DRAWIO_COMMANDS,\n];\n\n/**\n * Command Runner - Manages and executes slash commands\n */\nexport class CommandRunner {\n private config: Config;\n private commandsCache: Map<string, Command> = new Map();\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * List all available commands\n */\n async listCommands(): Promise<Command[]> {\n const commands: Command[] = [];\n\n // Add default commands\n for (const cmd of DEFAULT_COMMANDS) {\n commands.push({\n ...cmd,\n filePath: 'built-in',\n });\n }\n\n // Load custom commands from global config\n const globalCommandsPath = paths.commands(paths.globalConfig());\n try {\n const globalCommands = await this.loadCommandsFromDir(globalCommandsPath);\n commands.push(...globalCommands);\n } catch {\n // No global commands\n }\n\n // Load custom commands from project config\n const projectCommandsPath = paths.commands(this.config.configPath);\n if (projectCommandsPath !== globalCommandsPath) {\n try {\n const projectCommands = await this.loadCommandsFromDir(projectCommandsPath);\n // Override with project commands\n for (const cmd of projectCommands) {\n const existingIndex = commands.findIndex(c => c.name === cmd.name);\n if (existingIndex >= 0) {\n commands[existingIndex] = cmd;\n } else {\n commands.push(cmd);\n }\n }\n } catch {\n // No project commands\n }\n }\n\n return commands.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n /**\n * Get a specific command\n */\n async getCommand(name: string): Promise<Command | null> {\n if (this.commandsCache.has(name)) {\n return this.commandsCache.get(name)!;\n }\n\n const commands = await this.listCommands();\n const command = commands.find(c => c.name === name);\n\n if (command) {\n this.commandsCache.set(name, command);\n }\n\n return command || null;\n }\n\n /**\n * Create a custom command\n */\n async createCommand(name: string, options?: {\n description?: string;\n category?: string;\n usage?: string;\n examples?: string[];\n content?: string;\n global?: boolean;\n }): Promise<Command> {\n const configPath = options?.global ? paths.globalConfig() : this.config.configPath;\n const category = options?.category || 'utility';\n const commandsDir = join(paths.commands(configPath), category);\n\n await mkdir(commandsDir, { recursive: true });\n\n const fileName = `${name}.md`;\n const filePath = join(commandsDir, fileName);\n\n const frontmatter: CommandFrontmatter = {\n name,\n description: options?.description || `Custom command: ${name}`,\n category,\n usage: options?.usage || `/${name}`,\n examples: options?.examples || [`/${name}`],\n };\n\n const content = options?.content || `## /${name}\n\nDescribe what this command does.\n\n## Workflow\n1. Step 1\n2. Step 2\n3. Step 3\n`;\n\n const fileContent = matter.stringify(content, frontmatter);\n await writeFile(filePath, fileContent);\n\n const command: Command = {\n name,\n description: frontmatter.description!,\n category,\n usage: frontmatter.usage!,\n examples: frontmatter.examples!,\n content,\n filePath,\n };\n\n this.commandsCache.set(name, command);\n\n return command;\n }\n\n /**\n * Format command for agent consumption\n */\n formatForAgent(command: Command, args?: string): string {\n let content = command.content;\n\n if (args && args.trim()) {\n const argParts = args.trim().split(/\\s+/);\n\n content = content\n .replace(/\\$ARGUMENTS/g, args.trim())\n .replace(/\\$1/g, argParts[0] || '')\n .replace(/\\$2/g, argParts[1] || '')\n .replace(/\\$3/g, argParts[2] || '')\n .replace(/\\$4/g, argParts[3] || '')\n .replace(/\\$5/g, argParts[4] || '');\n }\n\n let output = `# Command: /${command.name}\n\n## Usage\n\\`${command.usage}\\`\n\n## Description\n${command.description}\n\n## Examples\n${command.examples.map(e => `- \\`${e}\\``).join('\\n')}\n\n## Workflow\n${content}\n`;\n\n if (args && args.trim()) {\n output += `\nUser arguments are : ${args.trim()}\n`;\n }\n\n return output;\n }\n\n /**\n * Load commands from directory (recursively)\n */\n private async loadCommandsFromDir(dir: string): Promise<Command[]> {\n const commands: Command[] = [];\n\n const processDir = async (currentDir: string, category: string) => {\n try {\n const entries = await readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n await processDir(fullPath, entry.name);\n } else if (extname(entry.name) === '.md') {\n const content = await readFile(fullPath, 'utf-8');\n const { data, content: body } = matter(content);\n const frontmatter = data as CommandFrontmatter;\n const name = frontmatter.name || basename(entry.name, '.md');\n\n commands.push({\n name,\n description: frontmatter.description || '',\n category: frontmatter.category || category,\n usage: frontmatter.usage || `/${name}`,\n examples: frontmatter.examples || [],\n content: body.trim(),\n filePath: fullPath,\n });\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n return;\n }\n };\n\n await processDir(dir, 'custom');\n return commands;\n }\n}\n\n// Re-export types and constants\nexport { Command, DefaultCommand, COMMAND_CATEGORIES };\nexport type { CommandFrontmatter };\n","/**\n * Command definition\n */\nexport interface Command {\n name: string;\n description: string;\n category: string;\n usage: string;\n examples: string[];\n content: string;\n filePath: string;\n}\n\n/**\n * Command frontmatter schema\n */\nexport interface CommandFrontmatter {\n name?: string;\n description?: string;\n category?: string;\n usage?: string;\n examples?: string[];\n}\n\n/**\n * Command categories\n */\nexport const COMMAND_CATEGORIES = {\n core: 'Core Workflow',\n quick: 'Quick Actions',\n research: 'Research & Analysis',\n design: 'Design & Planning',\n git: 'Git & Version Control',\n utility: 'Utilities',\n checkpoint: 'Checkpoints',\n session: 'Sessions',\n} as const;\n\n/**\n * Default command (without filePath)\n */\nexport type DefaultCommand = Omit<Command, 'filePath'>;\n","import { DefaultCommand } from './types';\n\n/**\n * Core Workflow Commands (Beads integration)\n */\nexport const CORE_COMMANDS: DefaultCommand[] = [\n {\n name: 'create',\n description: 'Create a new Beads task for tracking',\n category: 'core',\n usage: '/create <task description>',\n examples: ['/create Add user authentication', '/create Fix navigation bug'],\n content: `Create a new task in the Beads system (.beads/ directory).\n\n## Workflow\n\nTask description: $ARGUMENTS\n\n1. Create a new bead file with unique ID\n2. Add task description, status, and notes\n3. Set status to \"in-progress\"\n4. Initialize working notes section\n\n## Required Output\n- Task ID for reference\n- Confirmation of task creation\n- Next steps`,\n },\n {\n name: 'plan',\n description: 'Create a detailed implementation plan',\n category: 'core',\n usage: '/plan <feature or task>',\n examples: ['/plan user authentication system', '/plan refactor database layer'],\n content: `Create a comprehensive plan before implementation.\n\n## Workflow\n\nFeature or task to plan: $ARGUMENTS\n\n1. UNDERSTAND: Clarify requirements through Socratic questioning\n2. RESEARCH: Check existing patterns and dependencies\n3. BREAK DOWN: Create 2-5 minute sub-tasks with:\n - Exact file paths\n - Expected changes\n - Verification steps\n4. DOCUMENT: Write plan to memory/plans/\n\n## Output Format\n\\`\\`\\`markdown\n# Plan: [Feature Name]\n\n## Overview\nBrief description of the goal.\n\n## Tasks\n1. [ ] Task 1 - file.ts\n2. [ ] Task 2 - component.tsx\n...\n\n## Dependencies\n- List dependencies\n\n## Risks\n- Potential issues\n\n## Verification\n- How to verify completion\n\\`\\`\\``,\n },\n {\n name: 'implement',\n description: 'Implement a planned task with TDD',\n category: 'core',\n usage: '/implement <task reference>',\n examples: ['/implement task-001', '/implement \"add login form\"'],\n content: `Implement a task following TDD principles.\n\n## Workflow\n\nTask reference or description: $ARGUMENTS\n\n1. LOAD: Get task details from .beads/ or plan\n2. TEST: Write failing tests first (RED)\n3. IMPLEMENT: Write minimal code to pass (GREEN)\n4. REFACTOR: Clean up while keeping tests green\n5. VERIFY: Run full test suite\n\n## Hard Gates\nBefore marking complete:\n- [ ] All new tests pass\n- [ ] No regressions\n- [ ] Type check passes\n- [ ] Linting passes`,\n },\n {\n name: 'finish',\n description: 'Complete a task with quality gates',\n category: 'core',\n usage: '/finish [task-id]',\n examples: ['/finish', '/finish task-001'],\n content: `Complete the current task with mandatory quality checks.\n\n## Hard Gates (Must ALL Pass)\n1. \\`npm run typecheck\\` - No type errors\n2. \\`npm run test\\` - All tests pass\n3. \\`npm run lint\\` - No linting errors\n4. \\`npm run build\\` - Build succeeds\n\n## Workflow\n1. Run all quality gates\n2. If any fail, report issues and stop\n3. If all pass, update task status to \"completed\"\n4. Create summary of changes\n5. Suggest commit message`,\n },\n {\n name: 'handoff',\n description: 'Create handoff bundle for session continuity',\n category: 'core',\n usage: '/handoff',\n examples: ['/handoff'],\n content: `Create a handoff bundle for context transfer to next session.\n\n## Workflow\n1. Summarize current progress\n2. Document:\n - What was completed\n - What remains\n - Current blockers\n - Key decisions made\n3. Save to memory/handoffs/[timestamp].md\n\n## Output Format\n\\`\\`\\`markdown\n# Handoff: [Date/Time]\n\n## Completed\n- List of completed items\n\n## In Progress\n- Current work state\n\n## Remaining\n- What still needs to be done\n\n## Context\n- Important context for next session\n\n## Next Steps\n- Recommended actions\n\\`\\`\\``,\n },\n {\n name: 'resume',\n description: 'Resume from last handoff',\n category: 'core',\n usage: '/resume',\n examples: ['/resume'],\n content: `Resume work from the most recent handoff.\n\n## Workflow\n1. Load latest handoff from memory/handoffs/\n2. Display summary to user\n3. Propose next actions\n4. Continue from where left off`,\n },\n {\n name: 'one-shot',\n description: 'End-to-end autonomous task execution (beta)',\n category: 'core',\n usage: '/one-shot <task description>',\n examples: ['/one-shot Add user authentication', '/one-shot Fix navigation bug'],\n content: `One-Shot Mode (beta) - End-to-end autonomous task execution.\n\n⚠️ This mode is experimental. Use for straightforward tasks first.\n\n## Workflow\n\nTask description: $ARGUMENTS\n\n**Phase 1: Requirements Gathering**\n- Interactive selection of task type (Feature, Bug Fix, Refactoring, etc.)\n- Scope clarification\n- Dependencies identification\n- Success criteria definition\n- User selects progress level (Minimal/Moderate/Detailed/Quiet)\n\n**Phase 2: Planning**\n- Delegate to @planner agent\n- Create detailed implementation plan\n- Recommend relevant skills and tools\n- Create Beads task for tracking\n\n**Phase 3: Complexity Check & Auto-Split**\n- Analyze task complexity\n- Split into multiple beads if needed:\n * Time > 30 minutes\n * >10 files affected\n * >500 lines to change\n * Touches >2 sub-systems\n\n**Phase 4: Execution**\n- Build dependency graph\n- Execute tasks in parallel (max 3 concurrent)\n- Dynamic agent selection (@build → @review → @scout → ...)\n- Integrate skills (TDD, debugging, etc.)\n- Smart terminal access (auto-allow/ask/forbid)\n\n**Phase 5: Enhanced Testing & Validation**\n- Auto-generate test scripts for new functionality\n- Run quality gates: typecheck, test, lint, build\n- Execute sample commands (with user approval)\n- Validate logs semantically with historical comparison\n- Retry loop (max 3 attempts) with:\n * Auto-fix type errors, lint errors\n * Alternative approaches from @review\n * User intervention on final failure\n\n**Phase 6: Multi-Level Verification**\n- All quality gates passed ✓\n- Manual verification confirmation\n- Deployment approval (if needed)\n- Rollback confirmation (if verification fails)\n\n**Phase 7: Completion**\n- Generate proof of completion\n * Files changed\n * Test results\n * Build output\n * Deployment status\n- Update Beads task → completed\n- Store proof in bead notes\n- Collect beta feedback\n\n## Quality Gates (Must ALL Pass)\n- \\`npm run typecheck\\` - No type errors\n- \\`npm run test\\` - All tests pass\n- \\`npm run lint\\` - No linting errors\n- \\`npm run build\\` - Build succeeds\n\n## Success Criteria\n- All tests passing\n- No regressions\n- Manual verification\n- Deployment complete (if applicable)\n- Beads task completed with proof\n\n## Error Handling\n- **Level 1**: Auto-fix (type errors, lint --fix)\n- **Level 2**: Alternative approach (@review delegation)\n- **Level 3**: User intervention + follow-up bead creation\n\n## Tips\n✓ Use for straightforward tasks first\n✓ Consider /plan + /implement for complex features\n✓ Review changes before final approval`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Quick Actions Commands\n */\nexport const QUICK_COMMANDS: DefaultCommand[] = [\n {\n name: 'fix',\n description: 'Quick fix for an issue',\n category: 'quick',\n usage: '/fix <issue description>',\n examples: ['/fix button not clickable', '/fix type error in auth.ts'],\n content: `Quick fix with minimal ceremony.\n\n## Workflow\n\nIssue description: $ARGUMENTS\n\n1. Identify issue\n2. Make minimal change to fix\n3. Verify fix works\n4. Run affected tests`,\n },\n {\n name: 'fix-types',\n description: 'Fix TypeScript type errors',\n category: 'quick',\n usage: '/fix-types [file]',\n examples: ['/fix-types', '/fix-types src/auth.ts'],\n content: `Fix TypeScript type errors systematically.\n\n## Workflow\n\nOptional file argument: $ARGUMENTS\n\n1. Run \\`npm run typecheck\\`\n2. Parse error output\n3. Fix each error in dependency order\n4. Verify all types pass`,\n },\n {\n name: 'fix-ci',\n description: 'Fix CI/CD pipeline failures',\n category: 'quick',\n usage: '/fix-ci',\n examples: ['/fix-ci'],\n content: `Diagnose and fix CI failures.\n\n## Workflow\n1. Check CI logs for errors\n2. Reproduce locally if possible\n3. Fix issues in order:\n - Type errors\n - Test failures\n - Lint errors\n - Build errors\n4. Verify full CI pipeline locally`,\n },\n {\n name: 'commit',\n description: 'Create a well-formatted commit',\n category: 'quick',\n usage: '/commit [message]',\n examples: ['/commit', '/commit \"feat: add login\"'],\n content: `Create a conventional commit.\n\n## Workflow\n\nOptional commit message: $ARGUMENTS\n\n1. Stage changes: \\`git add -A\\`\n2. Generate commit message following conventional commits:\n - feat: New feature\n - fix: Bug fix\n - docs: Documentation\n - refactor: Code refactoring\n - test: Adding tests\n - chore: Maintenance\n3. Commit with message`,\n },\n {\n name: 'pr',\n description: 'Create a pull request',\n category: 'quick',\n usage: '/pr [title]',\n examples: ['/pr', '/pr \"Add user authentication\"'],\n content: `Create a pull request with proper description.\n\n## Workflow\n\nOptional PR title: $ARGUMENTS\n\n1. Push current branch\n2. Generate PR description:\n - Summary of changes\n - Related issues\n - Testing done\n - Screenshots if UI changes\n3. Create PR via GitHub CLI or provide URL`,\n },\n {\n name: 'refactor',\n description: 'Refactor code to improve structure without changing behavior',\n category: 'quick',\n usage: '/refactor [file or pattern]',\n examples: ['/refactor src/utils.ts', '/refactor duplicate code'],\n content: `Refactor code following best practices.\n\n## Workflow\n\nOptional file or pattern: $ARGUMENTS\n\n1. Ensure tests are in place\n2. Identify refactoring opportunities\n3. Apply refactoring incrementally\n4. Run tests after each change\n5. Verify no behavior changes`,\n },\n {\n name: 'lint',\n description: 'Run linter and fix issues',\n category: 'quick',\n usage: '/lint [--fix]',\n examples: ['/lint', '/lint --fix'],\n content: `Run linter and optionally fix issues.\n\n## Workflow\n\nOptional flags: $ARGUMENTS\n\n1. Run linter: \\`npm run lint\\`\n2. Parse errors and warnings\n3. If --fix flag, run auto-fix\n4. Report remaining issues\n5. Suggest manual fixes if needed`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Research & Analysis Commands\n */\nexport const RESEARCH_COMMANDS: DefaultCommand[] = [\n {\n name: 'research',\n description: 'Deep research on a topic',\n category: 'research',\n usage: '/research <topic>',\n examples: ['/research React Server Components', '/research OAuth 2.0 best practices'],\n content: `Conduct thorough research and document findings.\n\n## Workflow\n\nResearch topic: $ARGUMENTS\n\n1. Search documentation and resources\n2. Find code examples and patterns\n3. Evaluate options and trade-offs\n4. Document findings in memory/research/\n\n## Output\n- Summary of findings\n- Recommended approach\n- Code examples\n- Links to resources`,\n },\n {\n name: 'analyze-project',\n description: 'Analyze project structure and patterns',\n category: 'research',\n usage: '/analyze-project',\n examples: ['/analyze-project'],\n content: `Comprehensive project analysis.\n\n## Workflow\n1. Scan directory structure\n2. Identify:\n - Tech stack\n - Architecture patterns\n - Key dependencies\n - Coding conventions\n3. Document findings in AGENTS.md`,\n },\n {\n name: 'review-codebase',\n description: 'Review codebase quality',\n category: 'research',\n usage: '/review-codebase [path]',\n examples: ['/review-codebase', '/review-codebase src/'],\n content: `Review codebase for quality issues.\n\n## Workflow\n\nOptional path: $ARGUMENTS\n\n1. Check code quality metrics\n2. Identify:\n - Code smells\n - Security issues\n - Performance concerns\n - Test coverage gaps\n3. Prioritize findings\n4. Suggest improvements`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Design & Planning Commands\n */\nexport const DESIGN_COMMANDS: DefaultCommand[] = [\n {\n name: 'design',\n description: 'Design a feature or system',\n category: 'design',\n usage: '/design <feature>',\n examples: ['/design notification system', '/design API gateway'],\n content: `Design a feature with thorough planning.\n\n## Workflow\n\nFeature to design: $ARGUMENTS\n\n1. Requirements gathering (Socratic questioning)\n2. Research existing solutions\n3. Design options with trade-offs\n4. Choose approach\n5. Document design in memory/\n\n## Output\n- Design document\n- Architecture diagrams (described)\n- API contracts\n- Data models`,\n },\n {\n name: 'brainstorm',\n description: 'Brainstorm ideas for a problem',\n category: 'design',\n usage: '/brainstorm <problem>',\n examples: ['/brainstorm user retention', '/brainstorm performance optimization'],\n content: `Collaborative brainstorming session.\n\n## Workflow\n\nProblem to brainstorm: $ARGUMENTS\n\n1. Define problem clearly\n2. Generate diverse ideas (no judgement)\n3. Group related ideas\n4. Evaluate feasibility\n5. Select top candidates`,\n },\n {\n name: 'analyze-figma',\n description: 'Analyze Figma design and extract design tokens using Figma API',\n category: 'design',\n usage: '/analyze-figma <figma-url>',\n examples: [\n '/analyze-figma https://www.figma.com/design/...',\n '/analyze-figma [figma-url]',\n ],\n content: `Analyze a Figma design and extract all design tokens automatically using Figma API.\n\n## Workflow\n\n**Step 1: Extract URL from User Input**\n\nThe Figma URL is provided in the SAME message as the command. Extract it:\n- Check the full user input message\n- Look for URL pattern: \\`https://www.figma.com/design/...\\` or \\`http://www.figma.com/design/...\\`\n- Extract the ENTIRE URL including all query parameters\n- If URL not found in current message, check previous messages\n\n**Step 2: Check Tool Configuration**\n\nBefore calling the tool, verify that Figma tool is configured:\n- If not configured, inform user to run: \\`aikit skills figma-analysis config\\`\n- The tool requires a Figma Personal Access Token\n\n**Step 3: Call MCP Tool**\n\n**CRITICAL**: You MUST use the MCP tool \\`tool_read_figma_design\\`, NOT web fetch!\n\n**The correct tool name is**: \\`tool_read_figma_design\\` (exposed via MCP)\n\n**DO NOT use**:\n- ❌ \\`read_figma_design\\` (wrong - missing \"tool_\" prefix)\n- ❌ \\`figma-analysis/read_figma_design\\` (wrong format)\n- ❌ Web fetch (file requires authentication)\n\n**DO use**:\n- ✅ \\`tool_read_figma_design\\` (correct MCP tool name)\n\nUse the MCP tool:\n\\`\\`\\`\nUse MCP tool: tool_read_figma_design\nArguments: { \"url\": \"[extracted URL]\" }\n\\`\\`\\`\n\nThe tool has the Figma API token configured and will authenticate automatically.\n\nThis tool will:\n1. Validate the Figma URL format\n2. Check if Figma tool is configured\n3. Call Figma API to fetch design data\n4. Extract design tokens:\n - Colors (from fills and strokes)\n - Typography (font families, sizes, weights, line heights)\n - Spacing system (8px grid detection)\n - Components (from Figma components)\n - Screens/Frames (dimensions and names)\n - Breakpoints (common responsive breakpoints)\n5. Return formatted markdown with all extracted tokens\n\n**Step 4: Format and Save**\n\nFormat extracted tokens as structured markdown:\n\\`\\`\\`markdown\n# Figma Design Analysis\n\n**Source**: [Figma URL]\n**Analyzed**: [Date]\n\n## Screens/Pages\n- [List all screens]\n\n## Color Palette\n### Primary Colors\n- Color Name: #hexcode\n[Continue for all colors]\n\n## Typography\n### Font Families\n- Primary: Font Name\n[Continue]\n\n### Font Sizes\n- Heading 1: 48px\n[Continue for all sizes]\n\n## Spacing System\n- Base unit: 8px\n- Values used: [list]\n\n## Component Structure\n- Header: [description]\n[Continue for all components]\n\n## Layout Grid\n- Container max-width: [value]\n- Columns: [value]\n\n## Responsive Breakpoints\n- Mobile: [range]\n- Tablet: [range]\n- Desktop: [range]\n\n## Assets Needed\n### Images\n- [List]\n\n### Icons\n- [List]\n\n### Fonts\n- [List]\n\\`\\`\\`\n\nSave to memory using memory-update tool:\n\\`\\`\\`\nUse tool: memory-update\nArguments: {\n \"key\": \"research/figma-analysis\",\n \"content\": \"[formatted markdown]\"\n}\n\\`\\`\\`\n\n**Step 5: Report Results**\n\nSummarize what was extracted:\n- Number of colors found\n- Number of typography styles\n- Number of components\n- Number of screens/frames\n- Confirm save location: \\`memory/research/figma-analysis.md\\`\n\n## Important Notes\n\n- **DO NOT** ask user to provide URL again - extract it from input\n- **DO NOT** wait - start immediately after extracting URL\n- The URL is in the SAME message as the command\n- The tool uses Figma API, so the file must be accessible with your API token\n- If the tool returns an error about configuration, guide user to run: \\`aikit skills figma-analysis config\\`\n- If the tool returns an error about access, verify the file is accessible with your token\n\nThe analysis will be saved automatically for later reference.`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Git & Version Control Commands\n */\nexport const GIT_COMMANDS: DefaultCommand[] = [\n {\n name: 'branch',\n description: 'Create a new feature branch',\n category: 'git',\n usage: '/branch <name>',\n examples: ['/branch feat/auth', '/branch fix/navigation-bug'],\n content: `Create and switch to a new branch.\n\n## Workflow\n\nBranch name: $ARGUMENTS\n\n1. Ensure clean working directory\n2. Pull latest main/master\n3. Create branch with naming convention:\n - feat/* for features\n - fix/* for bug fixes\n - refactor/* for refactoring\n - docs/* for documentation\n4. Switch to new branch`,\n },\n {\n name: 'merge',\n description: 'Merge current branch to target',\n category: 'git',\n usage: '/merge [target]',\n examples: ['/merge', '/merge main'],\n content: `Merge current branch to target.\n\n## Workflow\n\nOptional target branch: $ARGUMENTS\n\n1. Run quality gates first\n2. Commit any pending changes\n3. Switch to target branch\n4. Pull latest\n5. Merge feature branch\n6. Resolve conflicts if any\n7. Push`,\n },\n {\n name: 'git:ignore-init',\n description: 'Initialize AI-safe .gitignore patterns',\n category: 'git',\n usage: '/git:ignore-init',\n examples: ['/git:ignore-init'],\n content: `Initialize AI-safe .gitignore patterns to prevent AI from accessing sensitive files.\n\n## Workflow\n\n1. **Check Existing .gitignore**: See if .gitignore exists\n2. **Backup**: Create .gitignore.backup if file exists\n3. **Append Patterns**: Add AI-specific ignore patterns\n4. **Verify**: Confirm patterns added successfully\n\n## Patterns Added\n\n**AI-Sensitive Files:**\n\\`\\`\\`\n# AIKit - AI Agent Protection\n.env\n.env.local\n.env.*.local\n*.key\n*.pem\nsecrets/\ncredentials/\n.aws/\n.ssh/\nconfig/secrets.json\n\n# AI Working Directories\n.aikit/memory/\n.aikit/checkpoints/\n.aikit/sessions/\n\n# Claude Code\n.claude/settings.json\n.claude/local_history.json\n\n# OpenCode\n.opencode/config.json\n.opencode/state.json\n\n# Agent-Specific\n.agentignore\n.aiignore\n\n# Logs and Debug\n*.log\nlogs/\ndebug.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Temporary Files\n*.tmp\n*.temp\n.cache/\ntemp/\ntmp/\n\\`\\`\\`\n\n**Explanation of Each Pattern:**\n- **Credentials**: API keys, tokens, certificates\n- **Config**: Sensitive configuration files\n- **Memory**: AI conversation history and context\n- **Sessions**: Active AI session data\n- **Logs**: Debug and error logs\n- **Temp**: Temporary processing files\n\n**Why These Patterns?**\n- Prevent AI from reading API keys and secrets\n- Avoid exposing sensitive user data\n- Reduce AI context noise (logs, cache)\n- Protect privacy\n- Comply with security best practices\n\n## Verification\n\n**After Running Command:**\n\\`\\`\\`\n✓ AI-safe patterns added to .gitignore\n✓ Backup created: .gitignore.backup\n✓ Protected: API keys, secrets, memory, logs\n✓ Safe to commit code\n\\`\\`\\`\n\n## Notes\n- Patterns appended to existing .gitignore\n- Doesn't remove existing patterns\n- Can be manually customized after creation\n- Recommend reviewing before committing`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Utility Commands\n */\nexport const UTILITY_COMMANDS: DefaultCommand[] = [\n {\n name: 'status',\n description: 'Show current status overview',\n category: 'utility',\n usage: '/status',\n examples: ['/status'],\n content: `Display comprehensive status.\n\n## Shows\n- Current task (from Beads)\n- Git status\n- Active branch\n- Pending changes\n- Test status\n- Recent activity`,\n },\n {\n name: 'help',\n description: 'Show available commands',\n category: 'utility',\n usage: '/help [command]',\n examples: ['/help', '/help plan'],\n content: `Display help information.\n\nIf no command specified, list all available commands.\nIf command specified, show detailed help for that command.`,\n },\n {\n name: 'test',\n description: 'Run tests and show results',\n category: 'utility',\n usage: '/test [pattern]',\n examples: ['/test', '/test auth', '/test --watch'],\n content: `Run test suite and display results.\n\n## Workflow\n\nOptional pattern: $ARGUMENTS\n\n1. Run test command: \\`npm run test\\`\n2. Parse and display results\n3. Show coverage if available\n4. Highlight failures\n5. Suggest fixes for failures`,\n },\n {\n name: 'deploy',\n description: 'Deploy application to production',\n category: 'utility',\n usage: '/deploy [environment]',\n examples: ['/deploy', '/deploy staging', '/deploy production'],\n content: `Deploy application with quality checks.\n\n## Workflow\n\nOptional environment: $ARGUMENTS\n\n1. Run quality gates (test, lint, build)\n2. Check for uncommitted changes\n3. Build production bundle\n4. Deploy to target environment\n5. Verify deployment success`,\n },\n {\n name: 'rollback',\n description: 'Rollback to previous deployment',\n category: 'utility',\n usage: '/rollback [version]',\n examples: ['/rollback', '/rollback v1.2.3'],\n content: `Rollback to previous version.\n\n## Workflow\n\nOptional version: $ARGUMENTS\n\n1. Identify current version\n2. List available versions\n3. Confirm rollback target\n4. Execute rollback\n5. Verify rollback success`,\n },\n {\n name: 'logs',\n description: 'View application logs',\n category: 'utility',\n usage: '/logs [--tail] [--follow]',\n examples: ['/logs', '/logs --tail 100', '/logs --follow'],\n content: `View and filter application logs.\n\n## Workflow\n\nOptional flags: $ARGUMENTS\n\n1. Determine log location\n2. Apply filters if specified\n3. Display logs\n4. If --follow, stream updates\n5. Format for readability`,\n },\n {\n name: 'create-agent',\n description: 'Create a custom AI agent with specific capabilities',\n category: 'utility',\n usage: '/create-agent <name> [description]',\n examples: ['/create-agent security \"Security audit agent\"', '/create-agent writer'],\n content: `Create a custom AI agent for specialized tasks.\n\n## Workflow\n\nAgent name: $ARGUMENTS\n\n1. **Determine Agent Purpose**: Ask user clarifying questions:\n - What specific tasks will this agent handle?\n - What expertise should it have?\n - What tools should it have access to?\n - Any specific behaviors or constraints?\n\n2. **Generate Agent Configuration**:\n - System prompt with instructions\n - Recommended tools/skills\n - Preferred models\n - Interaction patterns\n\n3. **Create Agent File**: Save to .aikit/agents/<name>.md\n - Frontmatter with metadata\n - System prompt\n - Tool recommendations\n - Usage examples\n\n4. **Verify Creation**: Confirm agent created successfully\n\n## Agent Template\n\n**Frontmatter:**\n\\`\\`\\`yaml\n---\nname: <agent-name>\ndescription: <what this agent does>\nuseWhen: <when to use this agent>\nmode: subagent\ntools: [list of tools]\nskills: [list of skills]\n---\n\\`\\`\\`\n\n**System Prompt:**\n\\`\\`\\`\n# Agent Name\n\nYou are a specialized AI agent for <specific domain>.\n\n## Your Expertise\n- Expertise area 1\n- Expertise area 2\n- Expertise area 3\n\n## Your Role\n1. Primary responsibility\n2. Secondary tasks\n3. Collaboration with other agents\n\n## Guidelines\n- How to approach tasks\n- What to focus on\n- What to avoid\n\n## Tools You Have Access To\n- Tool 1: description\n- Tool 2: description\n\n## Output Format\n- Preferred response format\n- Code style (if applicable)\n- Explanation style\n\\`\\`\\`\n\n## Example Agents\n\n**Security Agent:**\n- Focuses on code security vulnerabilities\n- Tools: static analysis, dependency checker\n- Skills: security-audit, code-review\n\n**Performance Agent:**\n- Focuses on optimization\n- Tools: profiler, benchmark\n- Skills: performance-optimization\n\n**Documentation Agent:**\n- Focuses on writing clear docs\n- Tools: markdown formatter\n- Skills: documentation\n\n## Notes\n- Agents are saved as markdown files\n- Can be customized after creation\n- Used with /agent or agent delegation\n- Appear in agent selector in OpenCode`,\n },\n {\n name: 'list-agents',\n description: 'List all available custom agents',\n category: 'utility',\n usage: '/list-agents',\n examples: ['/list-agents'],\n content: `List all available custom agents with descriptions.\n\n## Workflow\n\n1. **Scan Agents Directory**: Find all agent files in .aikit/agents/\n2. **Parse Metadata**: Extract agent descriptions and use cases\n3. **Categorize**: Group by type/purpose\n4. **Display**: Show formatted list with details\n\n## Output Format\n\n\\`\\`\\`\nAvailable Agents:\n\n### Development Agents\n• security - Security vulnerability scanner\n Use when: Reviewing code for security issues\n Skills: security-audit, code-review\n Tools: static-analysis, dependency-checker\n\n• performance - Performance optimization specialist\n Use when: Optimizing slow code or databases\n Skills: performance-optimization, database-design\n Tools: profiler, query-analyzer\n\n### Documentation Agents\n• writer - Technical documentation writer\n Use when: Creating or updating docs\n Skills: documentation\n Tools: markdown-formatter\n\n### Design Agents\n• ui-ux - UI/UX design reviewer\n Use when: Reviewing interface designs\n Skills: accessibility, frontend-aesthetics\n\nTotal: 4 agents\n\nCreate a new agent: /create-agent <name>\n\\`\\`\\`\n\n## Agent Information Shown\n- Agent name\n- Description\n- When to use it\n- Required skills\n- Available tools\n- Category/type\n\n## Notes\n- Built-in agents (plan, build, review, etc.) also shown\n- Custom agents appear after built-in ones\n- Use /agent <name> to invoke specific agent\n- Can view full agent file for details`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Checkpoint Commands\n */\nexport const CHECKPOINT_COMMANDS: DefaultCommand[] = [\n {\n name: 'checkpoint:create',\n description: 'Save current state as a checkpoint',\n category: 'checkpoint',\n usage: '/checkpoint:create [message]',\n examples: ['/checkpoint:create', '/checkpoint:create \"Before refactoring\"'],\n content: `Create a checkpoint of the current working state.\n\n## Workflow\n\nOptional message: $ARGUMENTS\n\n1. **Check Git Status**: Verify clean or staged state\n2. **Create Checkpoint**:\n - Generate checkpoint ID (timestamp-based)\n - Save git diff or uncommitted changes\n - Save current branch name\n - Save list of modified files\n - Save user's message (if provided)\n3. **Store Checkpoint**: Save to .aikit/checkpoints/checkpoint-{id}.json\n4. **Confirm**: Display checkpoint ID and summary\n\n## Checkpoint Contents\n- Timestamp\n- Git branch\n- Git commit hash (if any)\n- Uncommitted changes (diff)\n- Modified files list\n- User message\n- Beads task state (if active)\n\n## Example Output\n\\`\\`\\`\nCheckpoint created: checkpoint-20250102-143022\nMessage: Before refactoring\nFiles modified: 5 files\n\\`\\`\\`\n\n## Notes\n- Checkpoints are stored locally in .aikit/checkpoints/\n- Git changes are preserved (not committed)\n- Use for experimentation - safely restore if things go wrong\n- Checkpoints include full state, not just git`,\n },\n {\n name: 'checkpoint:restore',\n description: 'Restore to a previous checkpoint',\n category: 'checkpoint',\n usage: '/checkpoint:restore [checkpoint-id]',\n examples: ['/checkpoint:restore', '/checkpoint:restore checkpoint-20250102-143022', '/checkpoint:restore latest'],\n content: `Restore the project state from a checkpoint.\n\n## Workflow\n\nCheckpoint ID: $ARGUMENTS (default: latest)\n\n1. **Find Checkpoint**:\n - If no ID provided, find latest checkpoint\n - Verify checkpoint file exists\n2. **Display Summary**: Show what will be restored\n3. **Confirm with User**: Ask for confirmation before proceeding\n4. **Restore State**:\n - Clean working directory (remove uncommitted changes)\n - Checkout git commit from checkpoint\n - Apply uncommitted changes from checkpoint\n - Restore Beads task state if available\n5. **Verify**: Confirm restoration successful\n\n## Safety Checks\n- Warn if current changes will be lost\n- Show diff between current and checkpoint\n- Require explicit user confirmation\n- Backup current state before restoring\n\n## Example Output\n\\`\\`\\`\nRestoring checkpoint: checkpoint-20250102-143022\nMessage: Before refactoring\nFiles modified: 5 files\n\n⚠️ Warning: Uncommitted changes will be lost\nProceed? (yes/no)\n\n✓ Restored successfully\n\\`\\`\\`\n\n## Notes\n- Current uncommitted changes will be lost\n- Git history is preserved\n- Beads tasks will be restored to checkpointed state`,\n },\n {\n name: 'checkpoint:list',\n description: 'List all available checkpoints',\n category: 'checkpoint',\n usage: '/checkpoint:list',\n examples: ['/checkpoint:list'],\n content: `List all saved checkpoints with details.\n\n## Workflow\n\n1. **Scan Checkpoints Directory**: Find all checkpoint files in .aikit/checkpoints/\n2. **Sort by Date**: Most recent first\n3. **Display Summary**: Show table/list of checkpoints\n\n## Output Format\n\\`\\`\\`\nAvailable Checkpoints:\n\n1. checkpoint-20250102-143022\n Date: 2025-01-02 14:30:22\n Message: Before refactoring\n Branch: feature/user-auth\n Files: 5 modified\n Size: 2.3MB\n\n2. checkpoint-20250102-120815\n Date: 2025-01-02 12:08:15\n Message: Initial implementation\n Branch: main\n Files: 12 modified\n Size: 5.1MB\n\nTotal: 2 checkpoints\n\\`\\`\\`\n\n## Filtering Options (future)\n- Filter by branch\n- Filter by date range\n- Filter by message content\n- Show only checkpoints with specific files\n\n## Notes\n- Checkpoints are stored in .aikit/checkpoints/\n- Older checkpoints can be manually deleted\n- Use /checkpoint:restore <id> to restore\n- Use /checkpoint:restore latest for most recent`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Session Management Commands\n */\nexport const SESSION_COMMANDS: DefaultCommand[] = [\n {\n name: 'session:start',\n description: 'Start a new development session',\n category: 'session',\n usage: '/session:start [name]',\n examples: [\n '/session:start',\n '/session:start authentication-refactor',\n '/session:start \"Add user profile feature\"',\n ],\n content: `Start a new development session to track your work.\n\n## Workflow\n\nSession name: $ARGUMENTS\n\n1. **Create Session:**\n - Generate session ID with timestamp\n - Create session file in .aikit/sessions/\n - Track active session in .current-session\n - Capture initial git state\n\n2. **Set Goals:**\n - Ask user for session goals if not provided\n - Document what you want to accomplish\n - Link to Beads task if active\n\n3. **Session Started:**\n - Session ID: YYYY-MM-DD-HHMM[-name]\n - Status: active\n - Ready for updates\n\n## What Gets Tracked\n- Session start time\n- Git branch and commits\n- Modified files\n- Progress notes\n- Linked Beads task\n\n## Session File Location\n.aikit/sessions/YYYY-MM-DD-HHMM[-name].md\n\n## Examples\n\nStart unnamed session:\n\\`\\`\\`\n/session:start\n\\`\\`\\`\n\nStart with descriptive name:\n\\`\\`\\`\n/session:start auth-refactor\n\\`\\`\\`\n\nStart with goal:\n\\`\\`\\`\n/session:start \"Implement OAuth 2.0\"\nGoals:\n- Add Google OAuth\n- Add JWT token handling\n\\`\\`\\`\n\n## Notes\n- Session files are markdown with frontmatter\n- Sessions persist across AI conversations\n- Use /session:update to add progress notes\n- Use /session:end to close and summarize`,\n },\n {\n name: 'session:update',\n description: 'Add progress notes to current session',\n category: 'session',\n usage: '/session:update [notes]',\n examples: [\n '/session:update',\n '/session:update Fixed authentication bug',\n '/session:update \"Added JWT middleware\"',\n ],\n content: `Update the current session with progress notes.\n\n## Workflow\n\nProgress notes: $ARGUMENTS\n\n1. **Check Active Session:**\n - Verify there's an active session\n - Load session file\n\n2. **Capture Current State:**\n - Get current git branch\n - Count git commits\n - List modified files\n - Check active Beads task\n\n3. **Add Update:**\n - Add timestamped update entry\n - Include your notes (or auto-generate)\n - Include git state\n - Include Beads task if active\n\n4. **Save Session:**\n - Update session file\n - Confirm update added\n\n## What Gets Captured\n- Timestamp of update\n- Your progress notes\n- Current git branch\n- Number of commits\n- List of modified files\n- Active Beads task (if any)\n\n## Examples\n\nAuto-update (no notes):\n\\`\\`\\`\n/session:update\n\\`\\`\\`\n*Auto-generates summary of recent work*\n\nWith specific notes:\n\\`\\`\\`\n/session:update Fixed Next.js params issue\n\\`\\`\\`\n\nWith detailed notes:\n\\`\\`\\`\n/session:update \"Implemented OAuth flow with Google provider. Added callback handler and token validation.\"\n\\`\\`\\`\n\n## Notes\n- Must have active session first\n- Updates are timestamped\n- Git state automatically captured\n- Beads task automatically linked`,\n },\n {\n name: 'session:end',\n description: 'End current session with summary',\n category: 'session',\n usage: '/session:end',\n examples: ['/session:end'],\n content: `End the current session and generate a comprehensive summary.\n\n## Workflow\n\n1. **Check Active Session:**\n - Verify there's an active session\n - Load session data\n\n2. **Generate Summary:**\n - Calculate session duration\n - Review all progress notes\n - Check goals completion\n - Count git commits\n - List modified files\n - Identify key accomplishments\n\n3. **Create Summary Section:**\n - Duration\n - Goals status\n - Total updates\n - Git summary\n - Key accomplishments\n - Problems solved\n - Lessons learned\n\n4. **Close Session:**\n - Mark session as ended\n - Set end time\n - Save session file\n - Clear .current-session tracker\n\n## Summary Includes\n\n**Session Info:**\n- Duration (hours and minutes)\n- Start and end times\n- Session name\n\n**Goals:**\n- List of all goals\n- Completion status\n\n**Progress:**\n- Number of updates\n- Key accomplishments\n- Problems and solutions\n\n**Git Activity:**\n- Total commits\n- Files modified\n- Branch worked on\n\n**Beads Task:**\n- Linked task ID and status\n\n## Example Output\n\\`\\`\\`\nSession ended: 2025-01-02-1430-auth-refactor\nDuration: 2h 30m\n\nGoals:\n- Refactor OAuth flow ✅\n- Add JWT support ✅\n\nUpdates: 5\nCommits: 3\nFiles Modified: 7\n\nSummary:\nSuccessfully refactored authentication system with OAuth 2.0\nand JWT token support. Resolved Next.js 15 async issues.\n\nLessons:\n- Next.js 15 requires await for params\n- JWT middleware order matters\n\\`\\`\\`\n\n## Notes\n- Session cannot be updated after ending\n- Summary is automatically generated\n- Session file persists for future reference\n- Can start new session after ending`,\n },\n {\n name: 'session:current',\n description: 'Show current active session',\n category: 'session',\n usage: '/session:current',\n examples: ['/session:current'],\n content: `Display information about the current active session.\n\n## Workflow\n\n1. **Check Active Session:**\n - Read .current-session file\n - Load session data\n\n2. **Display Session Info:**\n - Session name and ID\n - How long session has been active\n - Session goals\n - Recent updates (last 3)\n - Current git state\n - Active Beads task\n\n3. **Show Actions:**\n - Available session commands\n - Quick reminder to update/end\n\n## Example Output\n\\`\\`\\`\n📍 Current Session\n\nSession: authentication-refactor\nID: 2025-01-02-1430-auth-refactor\nStarted: 2 hours ago\n\nGoals:\n- [ ] Refactor OAuth flow\n- [x] Add JWT support\n\nRecent Updates:\n15:45 - Implemented OAuth 2.0 with Google\n16:20 - Added JWT token generation\n\nGit:\n- Branch: feature/auth\n- Commits: 3\n- Modified: 5 files\n\nBeads Task:\n- bead-001 (in-progress)\n\nCommands:\n/session:update [notes] - Add progress\n/session:end - Close session\n\\`\\`\\`\n\n## Notes\n- Shows error if no active session\n- Use to quickly check session status\n- Displays recent progress`,\n },\n {\n name: 'session:list',\n description: 'List all sessions',\n category: 'session',\n usage: '/session:list',\n examples: ['/session:list'],\n content: `List all development sessions with summaries.\n\n## Workflow\n\n1. **Scan Sessions Directory:**\n - Find all .md files in .aikit/sessions/\n - Exclude .current-session\n\n2. **Sort by Date:**\n - Newest sessions first\n\n3. **Display Summary:**\n - Session ID and name\n - Start and end times\n - Status (active/ended)\n - Number of updates\n - Session goals\n\n## Example Output\n\\`\\`\\`\n📚 All Sessions\n\n1. 2025-01-02-1430-auth-refactor\n Status: Active\n Started: 2 hours ago\n Updates: 5\n Goals: Refactor OAuth, Add JWT\n\n2. 2025-01-02-1200-bug-fix\n Status: Ended\n Started: Today 12:00\n Ended: Today 13:30 (1h 30m)\n Updates: 3\n Goals: Fix email bounce handling\n\n3. 2025-01-01-1530-feature-user-profile\n Status: Ended\n Started: Yesterday 15:30\n Ended: Yesterday 18:45 (3h 15m)\n Updates: 8\n Goals: Add user profile page\n\nTotal: 3 sessions\n\\`\\`\\`\n\n## Notes\n- Shows both active and ended sessions\n- Most recent sessions first\n- Active session highlighted\n- Use /session:show <id> for details`,\n },\n {\n name: 'session:show',\n description: 'Show details of a specific session',\n category: 'session',\n usage: '/session:show <session-id>',\n examples: [\n '/session:show 2025-01-02-1430',\n '/session:show 2025-01-02-1430-auth-refactor',\n ],\n content: `Display full details of a specific session.\n\n## Workflow\n\nSession ID: $ARGUMENTS\n\n1. **Load Session:**\n - Find session file\n - Parse session data\n\n2. **Display Details:**\n - Session metadata\n - All progress notes\n - Git activity timeline\n - Summary (if ended)\n\n3. **Format Output:**\n - Readable markdown format\n - Chronological updates\n - Key accomplishments\n\n## Example Output\n\\`\\`\\`\n📄 Session: 2025-01-02-1430-auth-refactor\n\nStatus: Ended\nStarted: 2025-01-02 14:30\nEnded: 2025-01-02 17:00\nDuration: 2h 30m\n\nGoals:\n- [x] Refactor OAuth flow\n- [x] Add JWT support\n\n## Progress\n\n### 2025-01-02 14:30\nStarted session: authentication-refactor\nGit Branch: feature/auth\n\n### 2025-01-02 15:45\nImplemented OAuth 2.0 flow with Google provider\nAdded callback handler and token validation\nGit Branch: feature/auth\n\n### 2025-01-02 16:20\nAdded JWT token generation and validation\nCreated middleware for protected routes\nGit Branch: feature/auth\n\n### 2025-01-02 17:00\nSession ended\n\n## Summary\nDuration: 2h 30m\nGoals: 2\nUpdates: 4\nGit Commits: 3\nFiles Modified: 7\n\nSuccessfully refactored authentication system...\n\\`\\`\\`\n\n## Notes\n- Use session ID or partial ID\n- Shows all updates chronologically\n- Full session details displayed`,\n },\n {\n name: 'session:search',\n description: 'Search sessions by keyword',\n category: 'session',\n usage: '/session:search <query>',\n examples: [\n '/session:search oauth',\n '/session:search \"jwt\"',\n '/session:search authentication',\n ],\n content: `Search for sessions matching a keyword.\n\n## Workflow\n\nSearch query: $ARGUMENTS\n\n1. **Search Sessions:**\n - Search in session names\n - Search in session IDs\n - Search in goals\n - Search in update notes\n\n2. **Display Results:**\n - Matching sessions\n - Highlight match context\n - Sort by date\n\n3. **Show Actions:**\n - List matching sessions\n - Suggest /session:show for details\n\n## Example Output\n\\`\\`\\`\n🔍 Search Results: \"oauth\"\n\nFound 2 sessions:\n\n1. 2025-01-02-1430-auth-refactor\n Match: Name contains \"oauth\" (case-insensitive)\n Started: 2 hours ago\n Status: Active\n Goals: Refactor OAuth flow, Add JWT\n\n2. 2025-01-01-1200-oauth-fix\n Match: Goals contain \"OAuth\"\n Started: Yesterday\n Status: Ended\n Goals: Fix OAuth callback\n\nTotal: 2 matching sessions\n\\`\\`\\`\n\n## Notes\n- Case-insensitive search\n- Searches name, goals, and notes\n- Shows matching context\n- Use partial IDs too`,\n },\n {\n name: 'session:resume',\n description: 'Resume a past session (load context)',\n category: 'session',\n usage: '/session:resume <session-id>',\n examples: [\n '/session:resume latest',\n '/session:resume 2025-01-02-1430',\n '/session:resume 2025-01-02-1430-auth-refactor',\n ],\n content: `Load context from a past session to resume work.\n\n## Workflow\n\nSession ID: $ARGUMENTS (or \"latest\")\n\n1. **Find Session:**\n - If \"latest\", load most recent session\n - Otherwise, load specified session\n\n2. **Load Context:**\n - Display session summary\n - Show what was accomplished\n - Show what's remaining\n - List key decisions made\n\n3. **Suggest Next Actions:**\n - Based on session goals\n - Based on remaining tasks\n - Based on session end notes\n\n4. **Display Session:**\n - Full session details\n - All progress notes\n - Git activity\n - Summary and lessons\n\n## Example Output\n\\`\\`\\`\n🔄 Resuming Session: 2025-01-02-1430-auth-refactor\n\n## What Was Done\n✓ Refactored OAuth flow\n✓ Added JWT middleware\n✓ Fixed Next.js 15 issues\n\n## What Remains\n○ Add refresh token support\n○ Write tests for auth module\n○ Update documentation\n\n## Key Decisions\n- Used next-auth for OAuth\n- JWT middleware order: auth → validate → route\n- Next.js 15 requires async params\n\n## Problems Solved\n- Next.js 15 params Promise issue\n- Cookie domain configuration\n- JWT secret from env var\n\n## Suggested Next Steps\n1. Add refresh token rotation\n2. Write unit tests for auth\n3. Update API documentation\n4. Deploy to staging for testing\n\nSession context loaded! Ready to continue.\n\\`\\`\\`\n\n## Notes\n- Use \"latest\" for most recent session\n- Loads full context for continuity\n- Suggests next actions based on goals\n- Great for picking up after a break`,\n },\n];\n","import { DefaultCommand } from './types';\n\n/**\n * Draw.io Diagram Commands\n */\nexport const DRAWIO_COMMANDS: DefaultCommand[] = [\n {\n name: 'drawio-interact',\n description: 'Create/edit diagrams with AI + Draw.io + auto-sync',\n category: 'design',\n usage: '/drawio-interact <create|modify|list|start-sync|stop-sync> [diagram-name]',\n examples: [\n '/drawio-interact create login-flow',\n '/drawio-interact modify login-flow',\n '/drawio-interact list',\n '/drawio-interact start-sync',\n '/drawio-interact stop-sync',\n ],\n content: `Interactive diagram workflow with AI + Draw.io + background sync.\n\n**User provided**: $ARGUMENTS\n\n## File Locations\n\n**NEW STRUCTURE**:\n- **Mermaid files**: \\`mermaid/[name].mmd\\` (project root, version control)\n- **Draw.io files**: \\`.aikit/assets/drawio/[name].drawio\\` (visual editing)\n\n**Background Sync**:\n- Auto-syncs changes between both formats\n- Runs as background service\n- Detects changes in real-time\n\n## Workflow\n\n### Step 1: Parse User Intent\n\nCheck if user wants to:\n- **create** - Generate new diagram and open in Draw.io\n- **modify** - Manual sync (if background sync not running)\n- **list** - Show all existing diagrams\n- **start-sync** - Start background sync service\n- **stop-sync** - Stop background sync service\n\n### Step 2: Create Diagram (if \"create\")\n\n**Action**: Generate diagram from description, create files, open in Draw.io\n\n1. **Extract diagram name** from arguments\n - \"create login-flow\" → name = \"login-flow\"\n - If no name provided, ask user\n\n2. **Generate Mermaid code** based on description:\n - Login/auth → Flowchart with authentication\n - Order/purchase → Flowchart with payment\n - API/request → Sequence diagram\n - Generic → Basic flowchart\n\n3. **Create files**:\n - \\`mermaid/[name].mmd\\` - Mermaid source\n - \\`.aikit/assets/drawio/[name].drawio\\` - Draw.io XML\n\n4. **Open in Draw.io with auto-sync**:\n - Use lifecycle manager for automatic sync start/stop\n - Sync starts when Draw.io opens\n - Sync stops when Draw.io closes\n - No manual intervention needed!\n\n**Implementation**: Use lifecycle manager\n\n\\`\\`\\`javascript\nimport { openDrawioWithAutoSync } from '.aikit/tools/drawio-sync/lifecycle-manager.js';\nimport { join } from 'path';\n\nconst projectRoot = process.cwd();\nconst drawioPath = join(projectRoot, '.aikit/assets/drawio', \\`\\${name}.drawio\\`);\n\n// This will:\n// 1. Start sync service automatically\n// 2. Open Draw.io app\n// 3. Monitor Draw.io process\n// 4. Stop sync when Draw.io closes\nawait openDrawioWithAutoSync(drawioPath);\n\\`\\`\\`\n\n**What happens**:\n- ✅ Sync service starts automatically\n- ✅ Draw.io opens\n- ✅ Files stay in sync while editing\n- ✅ Sync stops automatically when Draw.io closes\n- ✅ Zero manual intervention!\n\n5. **Report success**:\n - Show generated Mermaid code\n - Confirm file locations\n - Confirm Draw.io opened with auto-sync\n - Inform user: \"Sync will stop automatically when you close Draw.io\"\n\n### Step 3: Modify Diagram (if \"modify\")\n\n**Action**: Manual one-time sync (use if background sync not running)\n\n1. **Extract diagram name**\n2. **Read files**:\n - \\`mermaid/[name].mmd\\`\n - \\`.aikit/assets/drawio/[name].drawio\\`\n\n3. **Convert Draw.io → Mermaid**\n4. **Detect changes**\n5. **Update Mermaid file**\n6. **Report changes**\n\n**Note**: If background sync is running, this is automatic!\n\n### Step 4: List Diagrams (if \"list\")\n\n**Action**: Show all diagrams\n\n\\`\\`\\`bash\nls mermaid/*.mmd 2>/dev/null | sed 's/mermaid\\\\///' | sed 's/.mmd$//'\n\\`\\`\\`\n\nFormat as numbered list with file info.\n\n### Step 5: Start Sync (if \"start-sync\")\n\n**Action**: Start background sync service\n\n1. **Check if service already running**\n2. **Start Chokidar file watcher**:\n - Watch \\`mermaid/*.mmd\\`\n - Watch \\`.aikit/assets/drawio/*.drawio\\`\n3. **Auto-sync on change**:\n - Debounce: 500ms\n - Lock files during sync to prevent loops\n - Log all changes\n4. **Report**: \"Background sync running\"\n\n**Implementation**: Use .aikit/tools/drawio-sync/sync-service.js\n\n\\`\\`\\`javascript\nimport { startSyncService } from '.aikit/tools/drawio-sync/sync-service.js';\nstartSyncService();\n\\`\\`\\`\n\n### Step 6: Stop Sync (if \"stop-sync\")\n\n**Action**: Stop background sync service\n\n\\`\\`\\`javascript\nimport { stopSyncService } from '.aikit/tools/drawio-sync/sync-service.js';\nstopSyncService();\n\\`\\`\\`\n\n## Conversion Tools\n\n**Location**: \\`.aikit/tools/drawio-sync/\\`\n\n**Modules**:\n- \\`mermaid-to-drawio.js\\` - Mermaid → Draw.io conversion\n- \\`drawio-to-mermaid.js\\` - Draw.io → Mermaid conversion\n- \\`sync-service.js\\` - Background sync service\n- \\`lifecycle-manager.js\\` - **NEW!** Automatic lifecycle (start/stop sync with Draw.io)\n\n**Lifecycle Manager Usage** (recommended for \"create\" command):\n\\`\\`\\`javascript\nimport { openDrawioWithAutoSync } from '.aikit/tools/drawio-sync/lifecycle-manager.js';\nimport { join } from 'path';\n\nconst drawioPath = join(process.cwd(), '.aikit/assets/drawio', name + '.drawio');\n\n// Automatically:\n// - Starts sync when Draw.io opens\n// - Stops sync when Draw.io closes\nawait openDrawioWithAutoSync(drawioPath);\n\\`\\`\\`\n\n**Manual Conversion** (for \"modify\" command):\n\\`\\`\\`javascript\nimport { convertMermaidToDrawio } from '.aikit/tools/drawio-sync/mermaid-to-drawio.js';\nimport { convertDrawioToMermaid } from '.aikit/tools/drawio-sync/drawio-to-mermaid.js';\n\n// Mermaid → Draw.io\nconst result = convertMermaidToDrawio(mermaidCode, diagramName);\nfs.writeFileSync('.aikit/assets/drawio/name.drawio', result.xml, 'utf-8');\n\n// Draw.io → Mermaid\nconst result = convertDrawioToMermaid(drawioXML);\nfs.writeFileSync('mermaid/name.mmd', result.code, 'utf-8');\n\\`\\`\\`\n\n## Error Handling\n\n**If sync fails**:\n1. Log error to console\n2. Show notification: \"Sync failed for [name]\"\n3. **Ask user**:\n - Ignore this error?\n - Retry sync?\n - Let AI fix it?\n\n**AI Fix Option**:\n- Analyze error\n- Attempt to fix common issues:\n - Malformed Mermaid syntax\n - Invalid XML characters\n - Encoding issues\n - Missing nodes\n- Retry sync after fix\n- Report result\n\n## Example Session\n\n\\`\\`\\`\nUser: /drawio-interact create user-authentication\n\nAI: Creating diagram: user-authentication\n\n📄 Generated Mermaid Code:\ngraph TD\n User[User] -->|Login| Login[Login Page]\n Login -->|Success| Dashboard[Dashboard]\n\n✅ Files created:\n - mermaid/user-authentication.mmd\n - .aikit/assets/drawio/user-authentication.drawio\n\n🔄 Starting background sync service...\n✅ Sync service running\n\n🎨 Opening Draw.io...\n👀 Monitoring Draw.io app (sync will stop when Draw.io closes)\n\n---\n\n[User edits in Draw.io, adds \"Password Recovery\", saves]\n\n🔄 Background sync detected changes:\n • Added nodes: Recovery, ResetEmail\n • Modified connections: Login → Recovery\n\n✅ Updated: mermaid/user-authentication.mmd\n\n[Or user edits mermaid/user-authentication.mmd directly]\n\n🔄 Background sync detected changes:\n • Modified Mermaid syntax\n\n✅ Updated: .aikit/assets/drawio/user-authentication.drawio\n\n---\n\n[User closes Draw.io app]\n\n🎨 Draw.io closed - stopping sync service\n✅ Sync service stopped\n\\`\\`\\`\n\n**Key Point**: Sync starts automatically when Draw.io opens, and stops automatically when Draw.io closes. No manual commands needed!\n\n## Important Notes\n\n- **Auto-sync lifecycle** - Sync starts when Draw.io opens, stops when it closes\n- **Zero manual intervention** - No need to run start/stop commands\n- **Draw.io app** opens automatically on \"create\"\n- **Both formats** stay in sync automatically while Draw.io is open\n- **Mermaid files** are in project root for version control\n- **Draw.io files** are in .aikit/assets (can be .gitignored)\n- **Manual commands** (start-sync/stop-sync) only needed for special cases\n\n## Auto-Open Commands\n\n**IMPORTANT**: Always use absolute paths!\n\n**Example code**:\n\\`\\`\\`javascript\nconst platform = process.platform;\nconst projectRoot = process.cwd(); // Get absolute project root\nconst filePath = join(projectRoot, '.aikit/assets/drawio', name + '.drawio');\n\nif (platform === 'darwin') {\n // macOS: Use double quotes for path with spaces\n execSync('open -a \"Draw.io\" \"' + filePath + '\"');\n} else if (platform === 'linux') {\n // Linux\n execSync('xdg-open \"' + filePath + '\"');\n} else if (platform === 'win32') {\n // Windows\n execSync('start \"\" \"' + filePath + '\"', { shell: true });\n}\n\\`\\`\\`\n\n**Why absolute paths?**\n- Relative paths depend on current working directory\n- Claude/AI might execute from wrong directory\n- Absolute paths always work correctly\n\n**Fallback**: If Draw.io app not found, open https://app.diagrams.net/\n\n## Directory Setup\n\nEnsure directories exist:\n\\`\\`\\`bash\nmkdir -p mermaid\nmkdir -p .aikit/assets/drawio\n\\`\\`\\``,\n },\n];\n","import { readdir, writeFile, mkdir } from 'fs/promises';\nimport { join, extname } from 'path';\nimport { z } from 'zod';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Tool argument schema\n */\nexport const ToolArgSchema = z.object({\n type: z.enum(['string', 'number', 'boolean', 'array', 'object']),\n description: z.string(),\n required: z.boolean().optional().default(true),\n default: z.any().optional(),\n});\n\nexport type ToolArg = z.infer<typeof ToolArgSchema>;\n\n/**\n * Tool definition\n */\nexport interface Tool {\n name: string;\n description: string;\n args: Record<string, ToolArg>;\n execute: (args: Record<string, unknown>, context?: { config?: Config; toolConfigManager?: any }) => Promise<string>;\n filePath?: string;\n}\n\n/**\n * Tool definition helper for type safety\n */\nexport function defineTool(config: {\n name: string;\n description: string;\n args: Record<string, ToolArg>;\n execute: (args: Record<string, unknown>) => Promise<string>;\n}): Tool {\n return config;\n}\n\n/**\n * Built-in tools\n */\nconst BUILT_IN_TOOLS: Tool[] = [\n {\n name: 'websearch',\n description: 'Search the web for documentation, articles, and current information',\n args: {\n query: {\n type: 'string',\n description: 'The search query',\n required: true,\n },\n numResults: {\n type: 'number',\n description: 'Number of results to return (default: 5)',\n required: false,\n default: 5,\n },\n },\n async execute({ query }) {\n // This would integrate with a search API (Exa, Tavily, etc.)\n // For now, return placeholder\n return `Web search results for: \"${query}\"\\n\\nNote: Configure a search provider in AIKit settings for actual results.`;\n },\n },\n {\n name: 'codesearch',\n description: 'Search GitHub for code patterns and examples across millions of repositories',\n args: {\n query: {\n type: 'string',\n description: 'The code pattern or search query',\n required: true,\n },\n language: {\n type: 'string',\n description: 'Programming language to filter by',\n required: false,\n },\n },\n async execute({ query, language }) {\n // This would integrate with GitHub code search\n const langFilter = language ? ` in ${language}` : '';\n return `GitHub code search for: \"${query}\"${langFilter}\\n\\nNote: Configure GitHub integration in AIKit settings for actual results.`;\n },\n },\n {\n name: 'memory-read',\n description: 'Read from persistent memory (project or global)',\n args: {\n key: {\n type: 'string',\n description: 'The memory key to read',\n required: true,\n },\n },\n async execute({ key }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n try {\n const { MemoryManager } = await import('./memory.js');\n const memory = new MemoryManager(config);\n const content = await memory.read(key as string);\n\n if (!content) {\n return `Memory entry not found: ${key as string}\\n\\nAvailable keys (use \\`list_session\\` or \\`aikit memory list\\`):\\n- handoffs/\\n- observations/\\n- research/\\n- _templates/`;\n }\n\n return content;\n } catch (error) {\n return `Error reading memory: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'memory-update',\n description: 'Update persistent memory with new information',\n args: {\n key: {\n type: 'string',\n description: 'The memory key to update',\n required: true,\n },\n content: {\n type: 'string',\n description: 'The content to write',\n required: true,\n },\n append: {\n type: 'boolean',\n description: 'Whether to append to existing content (default: true)',\n required: false,\n default: true,\n },\n },\n async execute({ key, content, append = true }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (typeof content !== 'string') {\n return 'Error: content must be a string';\n }\n\n try {\n const { MemoryManager } = await import('./memory.js');\n const memory = new MemoryManager(config);\n await memory.update(key as string, content as string, { append: append as boolean | undefined });\n return `✓ Saved to memory: ${key as string}${append ? ' (appended)' : ' (overwrote)'}`;\n } catch (error) {\n return `Error updating memory: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'find_skills',\n description: 'Find available workflow skills',\n args: {\n query: {\n type: 'string',\n description: 'Optional search query to filter skills',\n required: false,\n },\n },\n async execute({ query }) {\n // Implemented by SkillEngine integration\n return `Skills matching: ${query || 'all'}`;\n },\n },\n {\n name: 'use_skill',\n description: 'Load and use a specific skill workflow',\n args: {\n name: {\n type: 'string',\n description: 'Name of the skill to use',\n required: true,\n },\n },\n async execute({ name }) {\n // Implemented by SkillEngine integration\n return `Loading skill: ${name}`;\n },\n },\n {\n name: 'read_figma_design',\n description: 'Read and analyze a Figma design using Figma API. Extracts design tokens including colors, typography, spacing, components, and layout.',\n args: {\n url: {\n type: 'string',\n description: 'Figma design URL to analyze (must start with https://www.figma.com/design/)',\n required: true,\n },\n },\n async execute({ url }, context?: { toolConfigManager?: import('./tool-config.js').ToolConfigManager }) {\n // Validate Figma URL\n if (!url || typeof url !== 'string') {\n return 'Error: Invalid URL provided';\n }\n \n if (!url.startsWith('https://www.figma.com/design/') && !url.startsWith('http://www.figma.com/design/')) {\n return `Error: Invalid Figma URL format. URL must start with https://www.figma.com/design/\\n\\nProvided URL: ${url}`;\n }\n\n // Check if Figma tool is configured\n const configManager = context?.toolConfigManager;\n if (!configManager) {\n return `Error: Tool configuration manager not available. This usually means the MCP server isn't properly initialized. Please restart OpenCode.\\n\\nIf the issue persists, configure Figma tool manually: aikit skills figma-analysis config`;\n }\n\n const isReady = await configManager.isToolReady('figma-analysis');\n if (!isReady) {\n // Provide more helpful error message\n const toolConfig = await configManager.getToolConfig('figma-analysis');\n if (toolConfig?.status === 'error') {\n return `Error: Figma tool configuration error: ${toolConfig.errorMessage || 'Unknown error'}\\n\\nPlease reconfigure: aikit skills figma-analysis config`;\n }\n return `Error: Figma tool is not configured. Please run: aikit skills figma-analysis config\\n\\nThis will guide you through setting up your Figma Personal Access Token.`;\n }\n\n const apiKey = await configManager.getApiKey('figma-analysis');\n if (!apiKey) {\n return `Error: Figma API key not found. Please run: aikit skills figma-analysis config`;\n }\n\n try {\n // Use Figma MCP client to extract design tokens\n const { FigmaMcpClient } = await import('./tools/figma-mcp.js');\n const client = new FigmaMcpClient(apiKey, configManager);\n \n // Determine assets directory (use project root or current working directory)\n const assetsDir = './assets/images';\n \n // Extract design tokens (without downloading assets yet - will do after screen selection)\n const tokens = await client.extractDesignTokens(url, false, assetsDir);\n\n // Format results\n let result = `# Figma Design Analysis\\n\\n`;\n result += `**URL**: ${url}\\n\\n`;\n \n result += `## Design Structure & Content\\n\\n`;\n \n // Structure hierarchy\n if (tokens.structure) {\n result += `### Node Hierarchy (${tokens.structure.nodes.length} nodes)\\n\\n`;\n result += `\\`\\`\\`\\n${tokens.structure.hierarchy}\\n\\`\\`\\`\\n\\n`;\n \n // Key elements with content\n const textNodes = tokens.structure.nodes.filter(n => n.type === 'TEXT' && n.content);\n if (textNodes.length > 0) {\n result += `### Text Content (${textNodes.length} text elements)\\n\\n`;\n textNodes.slice(0, 20).forEach(node => {\n const preview = node.content && node.content.length > 100 \n ? node.content.substring(0, 100) + '...' \n : node.content;\n result += `- **${node.name}**: \"${preview}\"\\n`;\n if (node.styles) {\n result += ` - Style: ${node.styles.fontFamily || 'N/A'} ${node.styles.fontSize || 'N/A'}px, weight ${node.styles.fontWeight || 'N/A'}\\n`;\n }\n });\n if (textNodes.length > 20) {\n result += `\\n... and ${textNodes.length - 20} more text elements\\n`;\n }\n result += `\\n`;\n }\n\n // Layout structure\n const frameNodes = tokens.structure.nodes.filter(n => n.type === 'FRAME' || n.type === 'COMPONENT');\n if (frameNodes.length > 0) {\n result += `### Layout Structure (${frameNodes.length} frames/components)\\n\\n`;\n frameNodes.slice(0, 15).forEach(node => {\n result += `- **${node.name}** (${node.type})\\n`;\n if (node.position) {\n result += ` - Position: x=${Math.round(node.position.x)}, y=${Math.round(node.position.y)}\\n`;\n result += ` - Size: ${Math.round(node.position.width)}×${Math.round(node.position.height)}px\\n`;\n }\n if (node.styles?.layout) {\n result += ` - Layout: ${node.styles.layout}${node.styles.gap ? `, gap: ${node.styles.gap}px` : ''}\\n`;\n }\n if (node.children && node.children.length > 0) {\n result += ` - Children: ${node.children.length}\\n`;\n }\n });\n if (frameNodes.length > 15) {\n result += `\\n... and ${frameNodes.length - 15} more frames/components\\n`;\n }\n result += `\\n`;\n }\n }\n \n result += `## Design Tokens\\n\\n`;\n \n // Colors\n if (tokens.colors.length > 0) {\n result += `### Colors (${tokens.colors.length} found)\\n\\n`;\n tokens.colors.slice(0, 30).forEach(color => {\n result += `- \\`${color.hex}\\`\\n`;\n });\n if (tokens.colors.length > 30) {\n result += `\\n... and ${tokens.colors.length - 30} more colors\\n`;\n }\n result += `\\n`;\n }\n\n // Typography\n if (tokens.typography.length > 0) {\n result += `### Typography (${tokens.typography.length} styles)\\n\\n`;\n tokens.typography.forEach(typography => {\n result += `- **${typography.name}**: ${typography.fontFamily}, ${typography.fontSize}px, weight ${typography.fontWeight}, line-height ${typography.lineHeight}px\\n`;\n });\n result += `\\n`;\n }\n\n // Spacing\n result += `### Spacing System\\n\\n`;\n result += `- Base unit: ${tokens.spacing.unit}px\\n`;\n result += `- Scale: ${tokens.spacing.scale.length > 0 ? tokens.spacing.scale.join(', ') : 'Not detected'}\\n\\n`;\n\n // Components\n if (tokens.components.length > 0) {\n result += `### Components (${tokens.components.length} found)\\n\\n`;\n tokens.components.forEach(component => {\n result += `- **${component.name}**: ${component.type}${component.description ? ` - ${component.description}` : ''}\\n`;\n });\n result += `\\n`;\n }\n\n // Screens - Show with selection prompt\n if (tokens.screens.length > 0) {\n result += `## Available Screens/Frames (${tokens.screens.length} found)\\n\\n`;\n result += `**Please confirm which screen(s) you want to develop:**\\n\\n`;\n tokens.screens.forEach((screen, index) => {\n result += `${index + 1}. **${screen.name}**\\n`;\n result += ` - Size: ${screen.width}×${screen.height}px\\n`;\n result += ` - Type: ${screen.type}\\n`;\n if (screen.childrenCount) {\n result += ` - Components: ${screen.childrenCount}\\n`;\n }\n result += ` - ID: \\`${screen.id}\\`\\n\\n`;\n });\n result += `\\n**To proceed, simply reply with the screen number(s) or name(s) you want to develop.**\\n`;\n result += `Example: \"1\" or \"Main Page\" or \"1, 2, 3\"\\n\\n`;\n }\n\n // Breakpoints\n result += `### Responsive Breakpoints\\n\\n`;\n result += `- ${tokens.breakpoints.join('px, ')}px\\n\\n`;\n\n // Assets\n if (tokens.assets && tokens.assets.length > 0) {\n result += `## Downloaded Assets (${tokens.assets.length} files)\\n\\n`;\n result += `All assets have been downloaded to: \\`${tokens.assets[0].path.split('/').slice(0, -1).join('/')}\\`\\n\\n`;\n result += `### Image Files\\n\\n`;\n tokens.assets.forEach(asset => {\n const relativePath = asset.path.replace(process.cwd() + '/', '');\n result += `- **${asset.nodeName}** (${asset.nodeType})\\n`;\n result += ` - File: \\`${relativePath}\\`\\n`;\n if (asset.width && asset.height) {\n result += ` - Size: ${Math.round(asset.width)}×${Math.round(asset.height)}px\\n`;\n }\n result += ` - Format: ${asset.format.toUpperCase()}\\n`;\n result += ` - Usage: \\`<img src=\"${relativePath}\" alt=\"${asset.nodeName}\" />\\`\\n\\n`;\n });\n }\n\n result += `## Implementation Guide\\n\\n`;\n result += `### Structure Analysis\\n`;\n result += `The design contains ${tokens.structure?.nodes.length || 0} nodes organized in a hierarchical structure.\\n`;\n result += `Use the node hierarchy above to understand:\\n`;\n result += `1. **Component structure** - How elements are organized\\n`;\n result += `2. **Text content** - All text content from TEXT nodes\\n`;\n result += `3. **Layout properties** - Flex direction, gaps, padding\\n`;\n result += `4. **Positioning** - Exact x, y, width, height values\\n\\n`;\n result += `### Next Steps\\n\\n`;\n result += `1. Review the structure hierarchy to understand component organization\\n`;\n result += `2. Extract text content from TEXT nodes for HTML content\\n`;\n result += `3. Use position and size data for pixel-perfect CSS\\n`;\n result += `4. Use layout properties (HORIZONTAL/VERTICAL) for flexbox/grid\\n`;\n result += `5. Use extracted design tokens (colors, typography) for styling\\n`;\n result += `6. Save this analysis: \\`memory-update(\"research/figma-analysis\", \"[this analysis]\")\\`\\n`;\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return `Error analyzing Figma design: ${errorMessage}\\n\\nPlease check:\\n1. The Figma URL is correct and accessible\\n2. Your Figma API token has proper permissions\\n3. The design file is shared with your account`;\n }\n },\n },\n {\n name: 'analyze_figma',\n description: 'Analyze a Figma design URL and extract all design tokens automatically. The URL should be provided in the user input after the command.',\n args: {\n url: {\n type: 'string',\n description: 'Figma design URL to analyze',\n required: true,\n },\n },\n async execute({ url }) {\n // This tool will be used by agents to analyze Figma\n // The actual analysis will be done by @vision agent\n return `Figma analysis tool called for: ${url}\\n\\nNext steps:\\n1. Use @vision agent to analyze the design\\n2. Extract all design tokens\\n3. Save to memory/research/figma-analysis.md`;\n },\n },\n {\n name: 'develop_figma_screen',\n description: 'Smart workflow to develop a specific Figma screen: check current code, pull needed assets, plan, and develop. User just needs to confirm the screen number/name.',\n args: {\n figmaUrl: {\n type: 'string',\n description: 'Figma design URL',\n required: true,\n },\n screenId: {\n type: 'string',\n description: 'Screen ID or name to develop (from read_figma_design output)',\n required: true,\n },\n },\n async execute({ figmaUrl, screenId }, context?: { toolConfigManager?: import('./tool-config.js').ToolConfigManager }) {\n const configManager = context?.toolConfigManager;\n if (!configManager) {\n return 'Error: Tool configuration manager not available.';\n }\n\n const isReady = await configManager.isToolReady('figma-analysis');\n if (!isReady) {\n return 'Error: Figma tool is not configured. Please run: aikit skills figma-analysis config';\n }\n\n const apiKey = await configManager.getApiKey('figma-analysis');\n if (!apiKey) {\n return 'Error: Figma API key not found.';\n }\n\n try {\n const { FigmaMcpClient } = await import('./tools/figma-mcp.js');\n const { checkCurrentCodeStatus, compareCodeWithFigma } = await import('./tools/figma-screen-developer.js');\n \n const client = new FigmaMcpClient(apiKey, configManager);\n \n // Step 1: Extract design tokens\n const tokens = await client.extractDesignTokens(figmaUrl as string, false, './assets/images');\n \n // Step 2: Find selected screen\n const screenIdStr = String(screenId);\n const selectedScreen = tokens.screens?.find((s: any) => \n s.id === screenIdStr || s.name.toLowerCase() === screenIdStr.toLowerCase()\n );\n \n if (!selectedScreen) {\n return `Error: Screen \"${screenId}\" not found. Available screens:\\n${tokens.screens?.map((s: any, i: number) => `${i + 1}. ${s.name} (ID: ${s.id})`).join('\\n') || 'None'}`;\n }\n\n // Step 3: Check current code status\n const codeStatus = await checkCurrentCodeStatus();\n \n // Step 4: Compare with Figma\n const comparison = await compareCodeWithFigma(tokens, selectedScreen.id);\n \n // Step 5: Download assets for this screen only\n let downloadedAssets: any[] = [];\n const fileKey = (client as any).extractFileKey(figmaUrl as string);\n if (fileKey) {\n try {\n const fileData = await (client as any).getFileData(figmaUrl as string);\n // Use absolute path for assets directory\n const projectPath = process.cwd();\n const assetsDir = join(projectPath, 'assets', 'images');\n const assets = await (client as any).downloadAssets(fileKey, fileData.document, assetsDir, selectedScreen.id);\n downloadedAssets = assets || [];\n logger.info(`Downloaded ${downloadedAssets.length} assets for screen ${selectedScreen.name}`);\n } catch (error) {\n logger.warn(`Failed to download assets: ${error instanceof Error ? error.message : String(error)}`);\n downloadedAssets = [];\n }\n }\n\n // Step 6: Generate detailed plan\n let result = `# Development Plan for Screen: ${selectedScreen.name}\\n\\n`;\n result += `## Current Code Status\\n\\n`;\n result += `- HTML: ${codeStatus.hasHTML ? `✅ ${codeStatus.htmlFile}` : '❌ Not found'}\\n`;\n result += `- CSS: ${codeStatus.hasCSS ? `✅ ${codeStatus.cssFiles.length} files` : '❌ Not found'}\\n`;\n result += `- Assets: ${codeStatus.hasAssets ? `✅ ${codeStatus.assetCount} files` : '❌ Not found'}\\n`;\n result += `- Existing Sections: ${codeStatus.sections.length > 0 ? codeStatus.sections.join(', ') : 'None'}\\n\\n`;\n \n result += `## Comparison with Figma Design\\n\\n`;\n result += `- Missing Sections: ${comparison.missingSections.length > 0 ? comparison.missingSections.join(', ') : 'None'}\\n`;\n result += `- Missing Assets: ${comparison.missingAssets.length > 0 ? comparison.missingAssets.join(', ') : 'None'}\\n`;\n result += `- Needs Update: ${comparison.needsUpdate ? 'Yes' : 'No'}\\n\\n`;\n \n result += `## Recommendations\\n\\n`;\n comparison.recommendations.forEach((rec, i) => {\n result += `${i + 1}. ${rec}\\n`;\n });\n result += `\\n`;\n \n result += `## Downloaded Assets (${downloadedAssets.length})\\n\\n`;\n if (downloadedAssets.length > 0) {\n downloadedAssets.forEach((asset: any) => {\n const relativePath = asset.path.replace(process.cwd() + '/', '');\n result += `- **${asset.nodeName}** (${asset.nodeType})\\n`;\n result += ` - File: \\`${relativePath}\\`\\n`;\n if (asset.width && asset.height) {\n result += ` - Size: ${Math.round(asset.width)}×${Math.round(asset.height)}px\\n`;\n }\n result += ` - Usage: \\`<img src=\"${relativePath}\" alt=\"${asset.nodeName}\" />\\`\\n\\n`;\n });\n \n // Add critical instruction to use downloaded assets\n result += `\\n**⚠️ IMPORTANT: Use downloaded assets above instead of placeholder images!**\\n`;\n result += `Replace all Unsplash/placeholder image URLs with the downloaded asset paths.\\n\\n`;\n } else {\n result += `**No assets downloaded.** This may indicate:\\n`;\n result += `1. The screen doesn't contain exportable image nodes\\n`;\n result += `2. Assets download failed (check logs)\\n`;\n result += `3. Figma API permissions issue\\n\\n`;\n }\n \n result += `\\n## Next Steps\\n\\n`;\n result += `1. Review the plan above\\n`;\n result += `2. Use @build agent to implement missing sections\\n`;\n result += `3. Use extracted design tokens for CSS variables\\n`;\n result += `4. Use downloaded assets in HTML\\n`;\n result += `5. Verify pixel-perfect match with Figma design\\n`;\n\n return result;\n } catch (error) {\n return `Error: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'list_session',\n description: 'List previous sessions to discover what happened and when. Use this before read_session to find the right context.',\n args: {\n limit: {\n type: 'number',\n description: 'Maximum number of sessions to return (default: 10)',\n required: false,\n default: 10,\n },\n },\n async execute({ limit = 10 }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n \n // Ensure limit is a number\n const limitNum = typeof limit === 'number' ? limit : 10;\n \n try {\n const { MemoryManager } = await import('./memory.js');\n const memory = new MemoryManager(config);\n const memories = await memory.list();\n \n // Filter handoffs (sessions)\n const handoffs = memories\n .filter(m => m.type === 'handoff')\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\n .slice(0, limitNum);\n \n if (handoffs.length === 0) {\n return 'No previous sessions found. Use /handoff to create a session handoff.';\n }\n \n let result = `# Previous Sessions (${handoffs.length})\\n\\n`;\n handoffs.forEach((handoff, index) => {\n const sessionId = handoff.key.replace('handoffs/', '');\n result += `${index + 1}. **${sessionId}**\\n`;\n result += ` - Updated: ${handoff.updatedAt.toLocaleString()}\\n`;\n result += ` - Summary: ${handoff.summary}\\n\\n`;\n });\n \n result += `\\nUse \\`read_session\\` with a session ID to load full context.`;\n return result;\n } catch (error) {\n return `Error listing sessions: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'read_session',\n description: 'Load context from a previous session. Returns session summary, user tasks, and file changes.',\n args: {\n sessionId: {\n type: 'string',\n description: 'Session ID from list_session (e.g., \"2024-01-15T10-30-00\")',\n required: true,\n },\n },\n async execute({ sessionId }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n \n try {\n const { MemoryManager } = await import('./memory.js');\n const memory = new MemoryManager(config);\n const content = await memory.read(`handoffs/${sessionId}`);\n \n if (!content) {\n return `Session not found: ${sessionId}\\n\\nUse \\`list_session\\` to see available sessions.`;\n }\n \n return `# Session Context: ${sessionId}\\n\\n${content}\\n\\n---\\n\\nThis context has been loaded. Use /resume to continue from this point.`;\n } catch (error) {\n return `Error reading session: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'bead-create',\n description: 'Create a new bead/task for tracking work',\n args: {\n title: {\n type: 'string',\n description: 'Title of bead/task',\n required: true,\n },\n description: {\n type: 'string',\n description: 'Description of what needs to be done',\n required: true,\n },\n },\n async execute({ title, description }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (typeof title !== 'string' || typeof description !== 'string') {\n return 'Error: title and description must be strings';\n }\n\n try {\n const { BeadsIntegration } = await import('./beads.js');\n const beads = new BeadsIntegration(config.projectPath);\n const bead = await beads.createBead(title, description);\n return `✓ Created bead: ${bead.id}\\n\\nTitle: ${bead.title}\\nDescription: ${description}\\n\\nUse \\`bead-update-status\\` to change status or \\`bead-complete\\` to finish with quality gates.`;\n } catch (error) {\n return `Error creating bead: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'bead-update-status',\n description: 'Update bead status (todo, in-progress, completed, blocked)',\n args: {\n id: {\n type: 'string',\n description: 'Bead ID (e.g., \"bead-001\")',\n required: true,\n },\n status: {\n type: 'string',\n description: 'New status: todo, in-progress, completed, blocked',\n required: true,\n },\n },\n async execute({ id, status }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (typeof id !== 'string' || typeof status !== 'string') {\n return 'Error: id and status must be strings';\n }\n\n const validStatuses = ['todo', 'in-progress', 'completed', 'blocked'];\n if (!validStatuses.includes(status)) {\n return `Error: Invalid status \"${status}\". Valid statuses: ${validStatuses.join(', ')}`;\n }\n\n try {\n const { BeadsIntegration } = await import('./beads.js');\n const beads = new BeadsIntegration(config.projectPath);\n const success = await beads.updateBeadStatus(id, status as any);\n if (success) {\n return `✓ Updated bead ${id} to status: ${status}`;\n } else {\n return `Error: Bead ${id} not found`;\n }\n } catch (error) {\n return `Error updating bead status: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'bead-complete',\n description: 'Complete a bead with quality gates (typecheck, test, lint, build)',\n args: {\n id: {\n type: 'string',\n description: 'Bead ID (e.g., \"bead-001\")',\n required: true,\n },\n },\n async execute({ id }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (typeof id !== 'string') {\n return 'Error: id must be a string';\n }\n\n try {\n const { BeadsIntegration } = await import('./beads.js');\n const beads = new BeadsIntegration(config.projectPath);\n const result = await beads.completeBead(id);\n\n if (!result.success) {\n let errorReport = `❌ Quality gates failed for bead ${id}:\\n\\n`;\n result.gates.forEach(gate => {\n const status = gate.passed ? '✓' : '✗';\n errorReport += `${status} ${gate.name}`;\n if (gate.error) {\n errorReport += `\\n Error: ${gate.error}`;\n }\n errorReport += '\\n';\n });\n return errorReport;\n }\n\n return `✓ Bead ${id} completed successfully!\\n\\nAll quality gates passed:\\n${result.gates.map(g => ` ✓ ${g.name}`).join('\\n')}`;\n } catch (error) {\n return `Error completing bead: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'bead-list',\n description: 'List all beads in the project',\n args: {\n filter: {\n type: 'string',\n description: 'Filter by status: todo, in-progress, completed, blocked (optional)',\n required: false,\n },\n },\n async execute({ filter }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (filter !== undefined && typeof filter !== 'string') {\n return 'Error: filter must be a string';\n }\n\n try {\n const { BeadsIntegration } = await import('./beads.js');\n const beads = new BeadsIntegration(config.projectPath);\n const allBeads = await beads.listBeads();\n\n let filtered = allBeads;\n if (filter && ['todo', 'in-progress', 'completed', 'blocked'].includes(filter)) {\n filtered = allBeads.filter(b => b.status === filter);\n }\n\n if (filtered.length === 0) {\n return `No beads found${filter ? ` with status \"${filter}\"` : ''}`;\n }\n\n let result = `# Beads (${filtered.length})\\n\\n`;\n filtered.forEach(bead => {\n const statusEmoji = {\n 'todo': '⏸️',\n 'in-progress': '🔄',\n 'completed': '✅',\n 'blocked': '🚫'\n }[bead.status] || '❓';\n\n result += `${statusEmoji} **${bead.id}**: ${bead.title}\\n`;\n result += ` Status: ${bead.status}\\n`;\n result += ` Updated: ${bead.updatedAt.toLocaleString()}\\n`;\n if (bead.description) {\n const desc = bead.description.length > 100 ? bead.description.slice(0, 100) + '...' : bead.description;\n result += ` Description: ${desc}\\n`;\n }\n result += '\\n';\n });\n\n return result.trim();\n } catch (error) {\n return `Error listing beads: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n {\n name: 'bead-update-type',\n description: 'Update the type of an existing bead (feature, pattern, decision, knowledge)',\n args: {\n id: {\n type: 'string',\n description: 'Bead ID (e.g., \"bead-001\")',\n required: true,\n },\n type: {\n type: 'string',\n description: 'New type: feature, pattern, decision, or knowledge',\n required: true,\n },\n },\n async execute({ id, type }, context?: { config?: Config }) {\n const config = context?.config;\n if (!config) {\n return 'Error: Configuration not available';\n }\n\n if (typeof id !== 'string') {\n return 'Error: id must be a string';\n }\n if (typeof type !== 'string') {\n return 'Error: type must be a string';\n }\n\n const validTypes = ['feature', 'pattern', 'decision', 'knowledge'];\n if (!validTypes.includes(type)) {\n return `Error: Invalid type \"${type}\". Valid types: ${validTypes.join(', ')}`;\n }\n\n try {\n const { BeadsIntegration } = await import('./beads.js');\n const beads = new BeadsIntegration(config.projectPath);\n const success = await beads.updateBeadType(id, type as any);\n if (success) {\n return `✓ Updated bead ${id} type to: ${type}`;\n } else {\n return `Error: Bead ${id} not found`;\n }\n } catch (error) {\n return `Error updating bead type: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n },\n];\n\n/**\n * Tool Registry - Manages custom tools for AI agents\n */\nexport class ToolRegistry {\n private config: Config;\n private tools: Map<string, Tool> = new Map();\n private toolConfigManager?: import('./tool-config.js').ToolConfigManager;\n\n constructor(config: Config) {\n this.config = config;\n \n // Register built-in tools\n for (const tool of BUILT_IN_TOOLS) {\n this.tools.set(tool.name, tool);\n }\n }\n\n /**\n * Set tool config manager (for tools that need configuration)\n */\n setToolConfigManager(manager: import('./tool-config.js').ToolConfigManager): void {\n this.toolConfigManager = manager;\n }\n\n /**\n * List all available tools\n */\n async listTools(): Promise<Tool[]> {\n // Load custom tools\n await this.loadCustomTools();\n return Array.from(this.tools.values());\n }\n\n /**\n * Get a specific tool\n */\n getTool(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Register a new tool\n */\n registerTool(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Execute a tool\n */\n async executeTool(name: string, args: Record<string, unknown>, context?: { toolConfigManager?: import('./tool-config.js').ToolConfigManager }): Promise<string> {\n const tool = this.tools.get(name);\n if (!tool) {\n throw new Error(`Tool not found: ${name}`);\n }\n\n // Validate required arguments\n for (const [argName, argDef] of Object.entries(tool.args)) {\n if (argDef.required && args[argName] === undefined) {\n throw new Error(`Missing required argument: ${argName}`);\n }\n }\n\n // Merge context with config and toolConfigManager from registry\n const mergedContext = {\n ...context,\n config: this.config,\n toolConfigManager: context?.toolConfigManager || this.toolConfigManager,\n };\n\n // Check if tool.execute accepts context parameter\n if (tool.execute.length === 2) {\n return await (tool.execute as (args: Record<string, unknown>, context?: any) => Promise<string>)(args, mergedContext);\n }\n\n return await tool.execute(args);\n }\n\n /**\n * Create a custom tool\n */\n async createTool(name: string, options: {\n description: string;\n args: Record<string, ToolArg>;\n code: string;\n global?: boolean;\n }): Promise<void> {\n const configPath = options.global ? paths.globalConfig() : this.config.configPath;\n const toolsDir = paths.tools(configPath);\n \n await mkdir(toolsDir, { recursive: true });\n \n const fileName = `${name}.ts`;\n const filePath = join(toolsDir, fileName);\n \n const argsSchema = Object.entries(options.args)\n .map(([argName, arg]) => ` ${argName}: {\n type: '${arg.type}',\n description: '${arg.description}',\n required: ${arg.required ?? true},\n }`)\n .join(',\\n');\n \n const content = `import { defineTool } from 'aikit';\n\nexport default defineTool({\n name: '${name}',\n description: '${options.description}',\n args: {\n${argsSchema}\n },\n async execute(args) {\n${options.code}\n }\n});\n`;\n \n await writeFile(filePath, content);\n }\n\n /**\n * Format tool for agent consumption\n */\n formatForAgent(tool: Tool): string {\n const argsDesc = Object.entries(tool.args)\n .map(([name, arg]) => ` - ${name} (${arg.type}${arg.required ? ', required' : ''}): ${arg.description}`)\n .join('\\n');\n \n return `## Tool: ${tool.name}\n\n${tool.description}\n\n### Arguments\n${argsDesc}\n`;\n }\n\n /**\n * Load custom tools from disk\n */\n private async loadCustomTools(): Promise<void> {\n // Load from global config\n const globalToolsPath = paths.tools(paths.globalConfig());\n await this.loadToolsFromDir(globalToolsPath);\n \n // Load from project config (override global)\n const projectToolsPath = paths.tools(this.config.configPath);\n if (projectToolsPath !== globalToolsPath) {\n await this.loadToolsFromDir(projectToolsPath);\n }\n }\n\n private async loadToolsFromDir(dir: string): Promise<void> {\n let files: string[];\n try {\n files = await readdir(dir);\n } catch {\n return; // Directory doesn't exist\n }\n \n for (const file of files) {\n if (extname(file) !== '.ts' && extname(file) !== '.js') continue;\n \n const filePath = join(dir, file);\n \n try {\n // Dynamic import of custom tool\n const toolModule = await import(`file://${filePath}`);\n const tool = toolModule.default as Tool;\n \n if (tool?.name && typeof tool.execute === 'function') {\n tool.filePath = filePath;\n this.tools.set(tool.name, tool);\n }\n } catch (error) {\n // Failed to load tool, skip\n logger.warn(`Failed to load tool from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n}\n","import { readdir, writeFile, mkdir } from 'fs/promises';\nimport { join, basename, extname } from 'path';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Plugin event types\n */\nexport type PluginEventType =\n | 'session.idle'\n | 'session.created'\n | 'session.error'\n | 'tool.execute.before'\n | 'tool.execute.after'\n | 'file.edited'\n | 'file.watcher.updated'\n | 'message.updated'\n | 'message.removed';\n\n/**\n * Plugin event payload\n */\nexport interface PluginEvent {\n type: PluginEventType;\n timestamp: Date;\n properties?: Record<string, unknown>;\n}\n\n/**\n * Plugin context passed to plugins\n */\nexport interface PluginContext {\n project: {\n path: string;\n name: string;\n };\n config: Config;\n emit: (event: PluginEvent) => Promise<void>;\n}\n\n/**\n * Plugin handler return type\n */\nexport interface PluginHandlers {\n event?: (event: PluginEvent) => Promise<void>;\n 'tool.execute.before'?: (input: unknown) => Promise<unknown>;\n 'tool.execute.after'?: (input: unknown, output: unknown) => Promise<unknown>;\n}\n\n/**\n * Plugin definition function type\n */\nexport type PluginFactory = (context: PluginContext) => Promise<PluginHandlers>;\n\n/**\n * Plugin metadata\n */\nexport interface PluginInfo {\n name: string;\n description: string;\n enabled: boolean;\n filePath: string;\n handlers?: PluginHandlers;\n}\n\n/**\n * Plugin definition helper\n */\nexport type Plugin = PluginFactory;\n\n/**\n * Plugin System - Manages event-driven plugins\n */\nexport class PluginSystem {\n private config: Config;\n private plugins: Map<string, PluginInfo> = new Map();\n private loadedPlugins: Map<string, PluginHandlers> = new Map();\n private eventQueue: PluginEvent[] = [];\n private processing = false;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * Initialize and load all plugins\n */\n async initialize(): Promise<void> {\n await this.loadPlugins();\n \n // Initialize each plugin\n for (const [name, info] of this.plugins) {\n if (info.enabled) {\n try {\n const handlers = await this.initializePlugin(info);\n this.loadedPlugins.set(name, handlers);\n info.handlers = handlers;\n } catch (error) {\n logger.warn(`Failed to initialize plugin ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n\n /**\n * List all available plugins\n */\n async listPlugins(): Promise<PluginInfo[]> {\n await this.loadPlugins();\n return Array.from(this.plugins.values());\n }\n\n /**\n * Enable a plugin\n */\n async enablePlugin(name: string): Promise<void> {\n const plugin = this.plugins.get(name);\n if (plugin) {\n plugin.enabled = true;\n if (!this.loadedPlugins.has(name)) {\n const handlers = await this.initializePlugin(plugin);\n this.loadedPlugins.set(name, handlers);\n plugin.handlers = handlers;\n }\n }\n }\n\n /**\n * Disable a plugin\n */\n disablePlugin(name: string): void {\n const plugin = this.plugins.get(name);\n if (plugin) {\n plugin.enabled = false;\n this.loadedPlugins.delete(name);\n plugin.handlers = undefined;\n }\n }\n\n /**\n * Emit an event to all plugins\n */\n async emit(event: PluginEvent): Promise<void> {\n this.eventQueue.push(event);\n \n if (!this.processing) {\n await this.processEventQueue();\n }\n }\n\n /**\n * Execute before hooks for tool execution\n */\n async executeBeforeHooks(_toolName: string, input: unknown): Promise<unknown> {\n let result = input;\n \n for (const handlers of this.loadedPlugins.values()) {\n if (handlers['tool.execute.before']) {\n result = await handlers['tool.execute.before'](result);\n }\n }\n \n return result;\n }\n\n /**\n * Execute after hooks for tool execution\n */\n async executeAfterHooks(_toolName: string, input: unknown, output: unknown): Promise<unknown> {\n let result = output;\n \n for (const handlers of this.loadedPlugins.values()) {\n if (handlers['tool.execute.after']) {\n result = await handlers['tool.execute.after'](input, result);\n }\n }\n \n return result;\n }\n\n /**\n * Create a new plugin\n */\n async createPlugin(name: string, options: {\n description?: string;\n code: string;\n global?: boolean;\n }): Promise<void> {\n const configPath = options.global ? paths.globalConfig() : this.config.configPath;\n const pluginsDir = paths.plugins(configPath);\n \n await mkdir(pluginsDir, { recursive: true });\n \n const fileName = `${name}.ts`;\n const filePath = join(pluginsDir, fileName);\n \n const content = `import { Plugin } from 'aikit';\n\n/**\n * ${options.description || `Custom plugin: ${name}`}\n */\nexport const ${toPascalCase(name)}Plugin: Plugin = async ({ project, config, emit }) => {\n return {\n event: async ({ event }) => {\n${options.code}\n }\n };\n};\n\nexport default ${toPascalCase(name)}Plugin;\n`;\n \n await writeFile(filePath, content);\n }\n\n /**\n * Process event queue\n */\n private async processEventQueue(): Promise<void> {\n this.processing = true;\n \n while (this.eventQueue.length > 0) {\n const event = this.eventQueue.shift()!;\n \n for (const handlers of this.loadedPlugins.values()) {\n if (handlers.event) {\n try {\n await handlers.event(event);\n } catch (error) {\n logger.warn(`Plugin error handling event ${event.type}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n }\n \n this.processing = false;\n }\n\n /**\n * Load plugins from disk\n */\n private async loadPlugins(): Promise<void> {\n // Load built-in plugins\n this.registerBuiltInPlugins();\n \n // Load from global config\n const globalPluginsPath = paths.plugins(paths.globalConfig());\n await this.loadPluginsFromDir(globalPluginsPath);\n \n // Load from project config\n const projectPluginsPath = paths.plugins(this.config.configPath);\n if (projectPluginsPath !== globalPluginsPath) {\n await this.loadPluginsFromDir(projectPluginsPath);\n }\n }\n\n private registerBuiltInPlugins(): void {\n // Enforcer plugin - warns about abandoned work\n this.plugins.set('enforcer', {\n name: 'enforcer',\n description: 'Warns when session idles with TODO items remaining',\n enabled: true,\n filePath: 'built-in',\n });\n \n // Compactor plugin - warns about context overflow\n this.plugins.set('compactor', {\n name: 'compactor',\n description: 'Warns when context usage reaches 70%, 85%, 95%',\n enabled: true,\n filePath: 'built-in',\n });\n \n // Truncator plugin - auto-truncates large outputs\n this.plugins.set('truncator', {\n name: 'truncator',\n description: 'Auto-truncates tool output to preserve context space',\n enabled: true,\n filePath: 'built-in',\n });\n \n // Notification plugin - OS notifications when session completes\n this.plugins.set('notification', {\n name: 'notification',\n description: 'OS notifications when OpenCode completes a session',\n enabled: true,\n filePath: 'built-in',\n });\n \n // Session Management plugin - cross-session context transfer\n this.plugins.set('session-management', {\n name: 'session-management',\n description: 'Cross-session context transfer based on handoffs',\n enabled: true,\n filePath: 'built-in',\n });\n }\n\n private async loadPluginsFromDir(dir: string): Promise<void> {\n let files: string[];\n try {\n files = await readdir(dir);\n } catch {\n return;\n }\n \n for (const file of files) {\n if (extname(file) !== '.ts' && extname(file) !== '.js') continue;\n \n const filePath = join(dir, file);\n const name = basename(file, extname(file));\n \n this.plugins.set(name, {\n name,\n description: `Custom plugin: ${name}`,\n enabled: true,\n filePath,\n });\n }\n }\n\n private async initializePlugin(info: PluginInfo): Promise<PluginHandlers> {\n if (info.filePath === 'built-in') {\n return this.getBuiltInPluginHandlers(info.name);\n }\n \n try {\n const pluginModule = await import(`file://${info.filePath}`);\n const factory = pluginModule.default as PluginFactory;\n \n const context: PluginContext = {\n project: {\n path: this.config.projectPath,\n name: basename(this.config.projectPath),\n },\n config: this.config,\n emit: this.emit.bind(this),\n };\n \n return await factory(context);\n } catch (error) {\n logger.warn(`Failed to load plugin ${info.name}: ${error instanceof Error ? error.message : String(error)}`);\n return {};\n }\n }\n\n private getBuiltInPluginHandlers(name: string): PluginHandlers {\n switch (name) {\n case 'enforcer':\n return {\n event: async (event) => {\n if (event.type === 'session.idle') {\n // Check for remaining TODOs and warn\n logger.info('[Enforcer] Session idle - check for remaining work');\n }\n },\n };\n \n case 'compactor':\n return {\n event: async (event) => {\n // Monitor context usage\n const usage = event.properties?.contextUsage as number | undefined;\n if (usage && usage > 70) {\n logger.info(`[Compactor] Context usage at ${usage}%`);\n }\n },\n };\n \n case 'truncator':\n return {\n 'tool.execute.after': async (_input, output) => {\n if (typeof output === 'string' && output.length > 50000) {\n return output.slice(0, 50000) + '\\n\\n[Output truncated - exceeded 50KB limit]';\n }\n return output;\n },\n };\n \n case 'notification':\n return {\n event: async (event) => {\n if (event.type === 'session.idle') {\n // Send OS notification when session completes\n try {\n const { exec } = await import('child_process');\n const { promisify } = await import('util');\n const execAsync = promisify(exec);\n \n const platform = process.platform;\n const summary = event.properties?.summary as string | undefined || 'Session completed';\n \n if (platform === 'darwin') {\n // macOS\n await execAsync(`osascript -e 'display notification \"${summary}\" with title \"OpenCode Session Complete\"'`);\n } else if (platform === 'linux') {\n // Linux\n await execAsync(`notify-send \"OpenCode Session Complete\" \"${summary}\"`);\n } else if (platform === 'win32') {\n // Windows\n await execAsync(`powershell -Command \"New-BurntToastNotification -Text 'OpenCode Session Complete', '${summary}'\"`);\n }\n } catch (error) {\n // Notification failed, but don't break the workflow\n logger.warn(`[Notification] Failed to send notification: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n },\n };\n \n case 'session-management':\n return {\n event: async (event) => {\n if (event.type === 'session.idle') {\n // Session management is handled via tools (list_session, read_session)\n // This plugin just ensures session data is properly saved\n logger.info('[Session Management] Session idle - context saved for next session');\n }\n },\n };\n \n default:\n return {};\n }\n }\n}\n\n/**\n * Convert string to PascalCase\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n","import { readFile, writeFile, readdir, access, constants } from 'fs/promises';\nimport { join } from 'path';\nimport { Config } from './config.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Spec violation\n */\nexport interface SpecViolation {\n rule: string;\n description: string;\n severity: 'error' | 'warning';\n location?: string;\n}\n\n/**\n * Review item\n */\nexport interface ReviewItem {\n type: 'change' | 'skip' | 'inconsistency';\n description: string;\n files?: string[];\n}\n\n/**\n * Anti-Hallucination System\n * \n * Prevents AI from inventing APIs, assuming features, and losing track of requirements.\n * Implements three validation layers:\n * 1. Task Validation (.beads/ tracking)\n * 2. Spec Enforcement (spec.md constraints)\n * 3. Review Gates (review.md documentation)\n */\nexport class AntiHallucination {\n private config: Config;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * Layer 1: Validate task exists before work begins\n */\n async validateTask(taskId?: string): Promise<{\n valid: boolean;\n task?: {\n id: string;\n description: string;\n status: string;\n };\n error?: string;\n }> {\n const beadsDir = join(this.config.projectPath, '.beads');\n \n try {\n await access(beadsDir, constants.R_OK);\n } catch {\n return {\n valid: false,\n error: 'No .beads directory found. Run \"bd init\" to initialize task tracking.',\n };\n }\n \n if (!taskId) {\n // Check for any active task\n const files = await readdir(beadsDir);\n const beadFiles = files.filter(f => f.match(/^bead-\\d+\\.md$/));\n \n if (beadFiles.length === 0) {\n return {\n valid: false,\n error: 'No tasks found. Create a task with /create before starting work.',\n };\n }\n \n // Find in-progress task\n for (const file of beadFiles) {\n const content = await readFile(join(beadsDir, file), 'utf-8');\n if (content.includes('status: in-progress') || content.includes('Status: In Progress')) {\n const id = file.replace('.md', '');\n const descMatch = content.match(/description:\\s*(.+)/i) || content.match(/# (.+)/);\n return {\n valid: true,\n task: {\n id,\n description: descMatch?.[1] || 'Unknown task',\n status: 'in-progress',\n },\n };\n }\n }\n \n return {\n valid: false,\n error: 'No active task found. Start a task with /create or /implement.',\n };\n }\n \n // Check specific task\n const taskFile = join(beadsDir, `${taskId}.md`);\n try {\n const content = await readFile(taskFile, 'utf-8');\n const statusMatch = content.match(/status:\\s*(\\w+)/i);\n const descMatch = content.match(/description:\\s*(.+)/i) || content.match(/# (.+)/);\n \n return {\n valid: true,\n task: {\n id: taskId,\n description: descMatch?.[1] || 'Unknown task',\n status: statusMatch?.[1] || 'unknown',\n },\n };\n } catch {\n return {\n valid: false,\n error: `Task not found: ${taskId}`,\n };\n }\n }\n\n /**\n * Layer 2: Check spec constraints\n */\n async checkSpec(): Promise<{\n hasSpec: boolean;\n constraints?: {\n naming: string[];\n forbidden: string[];\n required: string[];\n };\n }> {\n const specFile = this.config.antiHallucination.specFile;\n const specPath = join(this.config.projectPath, specFile);\n \n try {\n const content = await readFile(specPath, 'utf-8');\n \n const constraints = {\n naming: this.extractConstraints(content, 'Naming'),\n forbidden: this.extractConstraints(content, 'Forbidden'),\n required: this.extractConstraints(content, 'Required'),\n };\n \n return { hasSpec: true, constraints };\n } catch {\n return { hasSpec: false };\n }\n }\n\n /**\n * Validate code against spec constraints\n */\n async validateAgainstSpec(code: string, filePath: string): Promise<SpecViolation[]> {\n const spec = await this.checkSpec();\n const violations: SpecViolation[] = [];\n \n if (!spec.hasSpec || !spec.constraints) {\n return violations;\n }\n \n // Check forbidden patterns\n for (const forbidden of spec.constraints.forbidden) {\n const pattern = this.patternToRegex(forbidden);\n if (pattern && pattern.test(code)) {\n violations.push({\n rule: 'Forbidden Pattern',\n description: forbidden,\n severity: 'error',\n location: filePath,\n });\n }\n }\n \n return violations;\n }\n\n /**\n * Layer 3: Create review documentation\n */\n async createReview(changes: {\n filesChanged: string[];\n functionsAdded: string[];\n testsAdded: string[];\n skipped?: string[];\n inconsistencies?: string[];\n }): Promise<string> {\n const reviewFile = this.config.antiHallucination.reviewFile;\n const reviewPath = join(this.config.projectPath, reviewFile);\n \n const content = `# Code Review\n\n_Generated: ${new Date().toISOString()}_\n\n## What Changed\n\n### Files Modified\n${changes.filesChanged.map(f => `- ${f}`).join('\\n') || '- None'}\n\n### Functions Added\n${changes.functionsAdded.map(f => `- ${f}`).join('\\n') || '- None'}\n\n### Tests Added\n${changes.testsAdded.map(t => `- ${t}`).join('\\n') || '- None'}\n\n## What Was Skipped\n${changes.skipped?.map(s => `- ${s}`).join('\\n') || '- Nothing skipped'}\n\n## Inconsistencies\n${changes.inconsistencies?.map(i => `- ⚠️ ${i}`).join('\\n') || '- None found'}\n\n## Verification\n- [ ] All tests pass\n- [ ] Type check passes\n- [ ] Linting passes\n- [ ] Build succeeds\n- [ ] Manual testing completed\n`;\n \n await writeFile(reviewPath, content);\n return reviewPath;\n }\n\n /**\n * Verify completion (hard gates)\n */\n async verifyCompletion(): Promise<{\n passed: boolean;\n gates: {\n name: string;\n passed: boolean;\n error?: string;\n }[];\n }> {\n const { exec } = await import('child_process');\n const { promisify } = await import('util');\n const execAsync = promisify(exec);\n \n const gates = [\n { name: 'Type Check', command: 'npm run typecheck' },\n { name: 'Tests', command: 'npm run test' },\n { name: 'Lint', command: 'npm run lint' },\n { name: 'Build', command: 'npm run build' },\n ];\n \n const results: { name: string; passed: boolean; error?: string }[] = [];\n \n for (const gate of gates) {\n try {\n await execAsync(gate.command, { cwd: this.config.projectPath });\n results.push({ name: gate.name, passed: true });\n } catch (error) {\n results.push({\n name: gate.name,\n passed: false,\n error: error instanceof Error ? error.message : 'Failed',\n });\n }\n }\n \n return {\n passed: results.every(r => r.passed),\n gates: results,\n };\n }\n\n /**\n * Recovery: Check for context loss\n */\n async checkContextLoss(): Promise<{\n hasHandoff: boolean;\n latestHandoff?: string;\n }> {\n const handoffsDir = join(this.config.configPath, 'memory', 'handoffs');\n \n try {\n const files = await readdir(handoffsDir);\n const handoffs = files.filter(f => f.endsWith('.md')).sort().reverse();\n \n if (handoffs.length > 0) {\n return {\n hasHandoff: true,\n latestHandoff: handoffs[0],\n };\n }\n } catch {\n // No handoffs directory\n }\n \n return { hasHandoff: false };\n }\n\n /**\n * Initialize spec.md template\n */\n async initSpec(): Promise<void> {\n const specPath = join(this.config.projectPath, this.config.antiHallucination.specFile);\n \n try {\n await access(specPath, constants.R_OK);\n logger.info('spec.md already exists');\n return;\n } catch {\n // Create template\n }\n \n const template = `# Project Specification\n\n## Constraints\n\n### Naming\n- Components: PascalCase\n- Files: kebab-case\n- Variables: camelCase\n- Constants: SCREAMING_SNAKE_CASE\n\n### Forbidden\n- No inline styles\n- No \\`any\\` types\n- No console.log in production code\n- No hardcoded secrets\n- No disabled ESLint rules\n\n### Required\n- JSDoc on all exported functions\n- Input validation on API routes\n- Error handling for async operations\n- Unit tests for business logic\n\n## Architecture\n\nDescribe your project architecture here.\n\n## Dependencies\n\nList approved dependencies here.\n`;\n \n await writeFile(specPath, template);\n logger.success('Created spec.md template');\n }\n\n /**\n * Extract constraints from a section\n */\n private extractConstraints(content: string, section: string): string[] {\n const sectionMatch = content.match(new RegExp(`### ${section}[\\\\s\\\\S]*?(?=###|$)`, 'i'));\n if (!sectionMatch) return [];\n \n const lines = sectionMatch[0].split('\\n');\n return lines\n .filter(line => line.trim().startsWith('-'))\n .map(line => line.replace(/^-\\s*/, '').trim());\n }\n\n /**\n * Convert a constraint description to a regex pattern\n */\n private patternToRegex(description: string): RegExp | null {\n // Simple pattern matching\n if (description.includes('console.log')) {\n return /console\\.log/;\n }\n if (description.includes('any') && description.includes('type')) {\n return /:\\s*any\\b/;\n }\n if (description.includes('inline style')) {\n return /style=\\{/;\n }\n return null;\n }\n}\n","/**\n * CLI Commands Index\n *\n * Export all command registration functions\n */\n\nexport { registerInitCommand } from './init.js';\nexport { registerInstallCommand } from './install.js';\nexport { registerSyncCommand } from './sync.js';\nexport { registerSkillsCommand } from './skills.js';\nexport {\n registerAgentsCommand,\n registerCommandsCommand,\n registerModeCommand,\n registerToolsCommand,\n registerPluginsCommand,\n registerMemoryCommand,\n registerBeadsCommand,\n registerStatusCommand,\n} from './misc.js';\nexport { registerSessionCommand } from './session.js';\n\n\n\n\n","/**\n * Init Command\n *\n * Initialize AIKit configuration for a specific platform\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\n\nimport { loadConfig } from '../../core/config.js';\nimport { SkillEngine } from '../../core/skills.js';\nimport { BeadsIntegration } from '../../core/beads.js';\nimport { CliDetector, CliTool, CliPlatform } from '../../utils/cli-detector.js';\nimport { logger } from '../../utils/logger.js';\nimport { paths } from '../../utils/paths.js';\nimport { initializeConfig, installCliTool } from '../helpers.js';\nimport { AgentManager } from '../../core/agents.js';\nimport { CommandRunner } from '../../core/commands.js';\nimport { createAdapter } from '../../platform/adapters.js';\n\nexport function registerInitCommand(program: Command): void {\n program\n .command('init [platform]')\n .description('Initialize AIKit configuration for a specific platform')\n .option('-g, --global', 'Initialize global configuration')\n .option('-p, --project', 'Initialize project-level configuration')\n .action(async (platformArg, options) => {\n const configDir = options.global ? paths.globalConfig() : paths.projectConfig();\n\n console.log(chalk.bold('\\n🚀 AIKit Setup\\n'));\n logger.info(`Initializing AIKit in ${configDir}...`);\n\n try {\n // Step 1: Initialize config\n await initializeConfig(configDir, options.global);\n logger.success('✓ Configuration created');\n\n if (!options.global) {\n // Step 2: Platform selection\n let selectedPlatform: CliPlatform;\n\n if (platformArg) {\n selectedPlatform = CliDetector.matchPlatform(platformArg);\n } else {\n const platforms = await CliDetector.detectPlatforms();\n const installed = CliDetector.filterInstalledPlatforms(platforms);\n\n console.log(chalk.bold('\\n🔍 Available CLI Tools\\n'));\n for (const p of platforms) {\n const status = p.installed ? chalk.green('✓') : chalk.gray('○');\n console.log(` ${status} ${p.displayName}`);\n }\n\n const { platform } = await inquirer.prompt([\n {\n type: 'list',\n name: 'platform',\n message: 'Which CLI tool do you want to configure AIKit for?',\n choices: platforms.map(p => ({\n name: p.displayName,\n value: p.platform,\n })),\n default: installed[0]?.platform || CliPlatform.OPENCODE,\n },\n ]);\n\n selectedPlatform = platform;\n }\n\n logger.info(`Selected platform: ${selectedPlatform}`);\n\n // Step 3: Sync skills\n const config = await loadConfig();\n const engine = new SkillEngine(config);\n const result = await engine.syncSkillsToProject();\n if (result.count > 0) {\n logger.success(`✓ Synced ${result.count} skills`);\n }\n\n // Step 4: Install CLI tool if needed\n if (selectedPlatform === CliPlatform.CLAUDE) {\n const cliTools = await CliDetector.checkAll();\n const claudeTool = cliTools.find(t => t.name === CliTool.CLAUDE);\n if (claudeTool && !claudeTool.installed) {\n const { installClaude } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'installClaude',\n message: 'Claude Code CLI is not installed. Install now?',\n default: true,\n },\n ]);\n\n if (installClaude) {\n await installCliTool(claudeTool);\n }\n }\n }\n\n // Step 5: Initialize beads\n const beads = new BeadsIntegration();\n const beadsStatus = await beads.getStatus();\n\n if (!beadsStatus.initialized) {\n logger.info('Initializing .beads directory...');\n await beads.initLocal();\n logger.success('✓ .beads directory created');\n\n if (!beadsStatus.installed) {\n logger.info('Tip: Install Beads CLI globally for full functionality: npm install -g beads');\n }\n } else {\n logger.info('Beads already initialized');\n }\n\n // Step 5.5: Setup git hooks\n logger.info('Setting up git hooks...');\n await beads.setupGitHooks();\n logger.success('✓ Git hooks configured');\n\n // Step 6: Install platform-specific commands\n const adapter = createAdapter(selectedPlatform);\n logger.info(`Installing AIKit for ${adapter.displayName}...`);\n await installToPlatform(adapter, config);\n\n console.log(chalk.bold('\\n✨ AIKit is ready!\\n'));\n\n // Show platform-specific usage\n if (selectedPlatform === CliPlatform.OPENCODE) {\n showOpenCodeUsage();\n } else if (selectedPlatform === CliPlatform.CLAUDE) {\n showClaudeUsage();\n }\n }\n } catch (error) {\n logger.error('Failed to initialize AIKit:', error);\n process.exit(1);\n }\n });\n}\n\nasync function installToPlatform(\n adapter: any,\n config: any\n): Promise<void> {\n const skillEngine = new SkillEngine(config);\n const commandRunner = new CommandRunner(config);\n const agentManager = new AgentManager(config);\n\n const skills = await skillEngine.listSkills();\n const commands = await commandRunner.listCommands();\n const agents = await agentManager.listAgents();\n\n // Install commands\n logger.info(`Installing ${commands.length} commands...`);\n for (const command of commands) {\n const { name, content } = await adapter.transformCommand(command);\n await adapter.installCommand(name, content);\n logger.info(` ✓ Created ${name} command`);\n }\n\n // Install skills\n logger.info(`Installing ${skills.length} skills...`);\n for (const skill of skills) {\n const { name, directory, files } = await adapter.transformSkill(skill);\n await adapter.installSkill(name, directory, files);\n logger.info(` ✓ Created ${name} skill`);\n }\n\n // Install agents\n logger.info(`Installing ${agents.length} agents...`);\n for (const agent of agents) {\n const { name, content } = await adapter.transformAgent(agent);\n await adapter.installAgent(name, content);\n logger.info(` ✓ Created ${name} agent`);\n }\n}\n\nfunction showOpenCodeUsage(): void {\n console.log('Usage in OpenCode:');\n console.log(chalk.cyan(' /skills') + ' - List all available skills');\n console.log(chalk.cyan(' /plan') + ' - Create implementation plan');\n console.log(chalk.cyan(' /tdd') + ' - Test-driven development');\n console.log(chalk.cyan(' /debug') + ' - Systematic debugging');\n console.log(chalk.cyan(' /review') + ' - Code review checklist');\n console.log(chalk.cyan(' /git') + ' - Git workflow');\n console.log(chalk.cyan(' /frontend-aesthetics') + ' - UI/UX guidelines');\n console.log('\\nPress ' + chalk.bold('Ctrl+K') + ' in OpenCode to see all commands.\\n');\n}\n\nfunction showClaudeUsage(): void {\n console.log('Usage in Claude Code CLI:');\n console.log(chalk.cyan(' /help') + ' - List all available commands');\n console.log(chalk.cyan(' /plan') + ' - Create implementation plan');\n console.log(chalk.cyan(' /implement') + ' - Implement a task');\n console.log(chalk.cyan(' /test') + ' - Run tests');\n console.log('\\nType ' + chalk.bold('\"/help\"') + ' in Claude to see all commands.\\n');\n}\n\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\n/**\n * Supported CLI tools\n */\nexport enum CliTool {\n OPENCODE = 'opencode',\n CLAUDE = 'claude',\n GITHUB = 'github',\n}\n\n/**\n * Supported CLI platforms\n */\nexport enum CliPlatform {\n OPENCODE = 'opencode',\n CLAUDE = 'claude',\n CODEX = 'codex',\n}\n\n/**\n * CLI tool info\n */\nexport interface CliToolInfo {\n name: CliTool;\n displayName: string;\n detected: boolean;\n installed: boolean;\n version?: string;\n configPath?: string;\n}\n\n/**\n * Platform info\n */\nexport interface PlatformInfo {\n platform: CliPlatform;\n displayName: string;\n installed: boolean;\n configPath: string;\n}\n\n/**\n * Detect and check CLI tools\n */\nexport class CliDetector {\n /**\n * Check if OpenCode is installed\n */\n static async checkOpenCode(): Promise<CliToolInfo> {\n try {\n const opencodePath = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.config');\n const opencodeConfig = join(opencodePath, 'opencode', 'opencode.json');\n let installed = existsSync(opencodeConfig);\n \n // Verify opencode is actually runnable by checking command\n let version: string | undefined;\n if (installed) {\n try {\n execSync('opencode --version', { stdio: 'ignore' });\n version = 'installed';\n } catch (error) {\n // Command check failed - check if config file still exists\n if (existsSync(opencodeConfig)) {\n version = 'installed (config exists)';\n } else {\n // Config file doesn't exist anymore\n installed = false;\n }\n }\n }\n \n return {\n name: CliTool.OPENCODE,\n displayName: 'OpenCode',\n detected: true,\n installed,\n version,\n configPath: opencodeConfig,\n };\n } catch {\n return {\n name: CliTool.OPENCODE,\n displayName: 'OpenCode',\n detected: false,\n installed: false,\n };\n }\n }\n\n /**\n * Check if Claude CLI is installed\n */\n static async checkClaude(): Promise<CliToolInfo> {\n try {\n execSync('claude --version', { stdio: 'ignore' });\n \n return {\n name: CliTool.CLAUDE,\n displayName: 'Claude CLI',\n detected: true,\n installed: true,\n version: 'installed',\n };\n } catch {\n return {\n name: CliTool.CLAUDE,\n displayName: 'Claude CLI',\n detected: true,\n installed: false,\n };\n }\n }\n\n /**\n * Check if GitHub CLI is installed\n */\n static async checkGitHub(): Promise<CliToolInfo> {\n try {\n const output = execSync('gh --version', { stdio: 'pipe', encoding: 'utf-8' });\n const match = output.match(/gh version ([\\d.]+)/);\n const version = match?.[1];\n \n return {\n name: CliTool.GITHUB,\n displayName: 'GitHub CLI',\n detected: true,\n installed: true,\n version,\n };\n } catch {\n return {\n name: CliTool.GITHUB,\n displayName: 'GitHub CLI',\n detected: true,\n installed: false,\n };\n }\n }\n\n /**\n * Check all supported CLIs\n */\n static async checkAll(): Promise<CliToolInfo[]> {\n const results: CliToolInfo[] = [];\n \n results.push(await this.checkOpenCode());\n results.push(await this.checkClaude());\n results.push(await this.checkGitHub());\n \n return results;\n }\n\n /**\n * Filter tools by installation status\n */\n static filterInstalled(tools: CliToolInfo[]): CliToolInfo[] {\n return tools.filter(t => !t.installed && t.detected);\n }\n\n /**\n * Filter tools that can be installed\n */\n static filterInstallable(tools: CliToolInfo[]): CliToolInfo[] {\n return tools.filter(t => t.detected && !t.installed);\n }\n\n /**\n * Detect available platforms\n */\n static async detectPlatforms(): Promise<PlatformInfo[]> {\n const platforms: PlatformInfo[] = [];\n \n // Check OpenCode\n const opencodePath = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.config');\n platforms.push({\n platform: CliPlatform.OPENCODE,\n displayName: 'OpenCode',\n installed: existsSync(join(opencodePath, 'opencode', 'opencode.json')),\n configPath: opencodePath,\n });\n \n // Check Claude Code CLI\n const claudePath = process.platform === 'win32'\n ? process.env.APPDATA || join(homedir(), 'AppData', 'Roaming')\n : join(homedir(), '.claude');\n platforms.push({\n platform: CliPlatform.CLAUDE,\n displayName: 'Claude Code CLI',\n installed: existsSync(claudePath),\n configPath: claudePath,\n });\n \n return platforms;\n }\n\n /**\n * Filter installed platforms\n */\n static filterInstalledPlatforms(platforms: PlatformInfo[]): PlatformInfo[] {\n return platforms.filter(p => p.installed);\n }\n\n /**\n * Match platform name to CliPlatform enum\n */\n static matchPlatform(name: string): CliPlatform {\n const normalized = name.toLowerCase();\n if (normalized === 'opencode' || normalized === 'open-code') {\n return CliPlatform.OPENCODE;\n } else if (normalized === 'claude' || normalized === 'claude-code' || normalized === 'claude-code-cli') {\n return CliPlatform.CLAUDE;\n } else if (normalized === 'codex') {\n return CliPlatform.CODEX;\n }\n throw new Error(`Unknown platform: ${name}`);\n }\n}\n\n","/**\n * CLI Helper Functions\n * \n * Contains utility functions for CLI commands:\n * - initializeConfig: Create AIKit configuration\n * - configureMcpServer: Configure MCP server for OpenCode\n * - installCliTool: Install CLI tools\n * - installToOpenCode: Install AIKit to OpenCode\n */\n\nimport { existsSync } from 'fs';\nimport { mkdir, writeFile, readFile, access } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport { homedir } from 'os';\nimport { fileURLToPath } from 'url';\nimport { execSync } from 'child_process';\n\nimport { VERSION } from '../index.js';\nimport { loadConfig } from '../core/config.js';\nimport { SkillEngine } from '../core/skills.js';\nimport { CommandRunner } from '../core/commands.js';\nimport { CliTool, CliToolInfo } from '../utils/cli-detector.js';\nimport { logger } from '../utils/logger.js';\nimport { paths } from '../utils/paths.js';\n\n/**\n * Initialize AIKit configuration in a directory\n */\nexport async function initializeConfig(configDir: string, _isGlobal?: boolean): Promise<void> {\n // Create directory structure\n const dirs = [\n '',\n 'skills',\n 'agents',\n 'commands',\n 'commands/build',\n 'commands/git',\n 'commands/plan',\n 'commands/research',\n 'tools',\n 'plugins',\n 'memory',\n 'memory/_templates',\n 'memory/handoffs',\n 'memory/observations',\n 'memory/research',\n ];\n \n for (const dir of dirs) {\n await mkdir(join(configDir, dir), { recursive: true });\n }\n \n // Create default config file\n const defaultConfig = {\n version: VERSION(),\n skills: { enabled: true },\n agents: { enabled: true, default: 'build' },\n commands: { enabled: true },\n tools: { enabled: true },\n plugins: { enabled: true },\n memory: { enabled: true },\n beads: { enabled: true },\n antiHallucination: { enabled: true },\n };\n \n await writeFile(\n join(configDir, 'aikit.json'),\n JSON.stringify(defaultConfig, null, 2)\n );\n \n // Create AGENTS.md template\n const agentsMd = `# AIKit Agent Rules\n\n## Build Commands\n- \\`npm run build\\` - Build the project\n- \\`npm run test\\` - Run tests\n- \\`npm run lint\\` - Run linting\n\n## Code Style\n- Use 2 spaces for indentation\n- Use single quotes for strings\n- Add trailing commas\n\n## Naming Conventions\n- Variables: camelCase\n- Components: PascalCase\n- Files: kebab-case\n\n## Project-Specific Rules\nAdd your project-specific rules here.\n`;\n \n await writeFile(join(configDir, 'AGENTS.md'), agentsMd);\n}\n\n/**\n * Configure MCP server for OpenCode\n */\nexport async function configureMcpServer(projectPath: string): Promise<void> {\n // Get absolute path to MCP server\n const currentFile = fileURLToPath(import.meta.url);\n const currentDir = dirname(currentFile);\n const aikitPath = join(currentDir, '..', '..');\n const mcpServerPath = join(aikitPath, 'dist', 'mcp-server.js');\n \n // OpenCode config locations (try multiple)\n const configLocations = [\n // Global config (most common)\n join(homedir(), '.config', 'opencode', 'opencode.json'),\n // Project-level config\n join(projectPath, '.opencode', 'opencode.json'),\n // Alternative global location\n join(homedir(), '.opencode', 'opencode.json'),\n ];\n \n // OpenCode MCP server configuration\n const mcpServerConfig = {\n type: 'local',\n command: ['node', mcpServerPath],\n environment: {},\n };\n \n // Try to update OpenCode config\n for (const configPath of configLocations) {\n try {\n const configDir = join(configPath, '..');\n await mkdir(configDir, { recursive: true });\n \n // Read existing config or create new\n let config: any = {};\n if (existsSync(configPath)) {\n try {\n const existing = await readFile(configPath, 'utf-8');\n config = JSON.parse(existing);\n } catch {\n config = {};\n }\n }\n \n // OpenCode uses \"mcp\" key, not \"mcpServers\"\n if (!config.mcp) {\n config.mcp = {};\n }\n \n // Add or update aikit MCP server\n config.mcp.aikit = mcpServerConfig;\n \n await writeFile(configPath, JSON.stringify(config, null, 2));\n logger.success(`\\n✅ MCP server configured: ${configPath}`);\n logger.info(` Server: node ${mcpServerPath}`);\n return;\n } catch {\n // Try next location\n continue;\n }\n }\n \n // If all locations failed, create instructions file\n const instructionsPath = join(projectPath, '.opencode', 'MCP_SETUP.md');\n await mkdir(join(projectPath, '.opencode'), { recursive: true });\n await writeFile(instructionsPath, `# AIKit MCP Server Configuration\n\n## Automatic Setup Failed\n\nPlease manually configure the MCP server in OpenCode.\n\n## Configuration\n\nAdd this to your OpenCode configuration file (\\`~/.config/opencode/opencode.json\\`):\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"aikit\": {\n \"command\": \"node\",\n \"args\": [\"${mcpServerPath}\"],\n \"env\": {}\n }\n }\n}\n\\`\\`\\`\n\n## After Configuration\n\n1. Restart OpenCode completely\n2. OpenCode will automatically start the MCP server\n3. Tools will be available via MCP protocol\n4. You can use tools like \\`tool_read_figma_design\\` directly\n\n## Verify\n\nAfter restarting OpenCode, check:\n- MCP server is running (check OpenCode settings)\n- Tools are discoverable (OpenCode should list them)\n- You can call tools via MCP protocol\n`);\n logger.warn(`\\n⚠️ Could not auto-configure MCP server. See: ${instructionsPath}`);\n}\n\n/**\n * Install a CLI tool\n */\nexport async function installCliTool(tool: CliToolInfo): Promise<boolean> {\n try {\n logger.info(`Installing ${tool.displayName}...`);\n \n switch (tool.name) {\n case CliTool.OPENCODE:\n await installToOpenCode(paths.opencodeConfig());\n break;\n \n case CliTool.CLAUDE:\n // Use native install script (recommended by Claude)\n // Defer platform check to avoid cwd issues\n let platform: string;\n try {\n platform = process.platform;\n } catch {\n platform = 'darwin'; // Default to macOS if platform detection fails\n }\n\n if (platform === 'darwin') {\n // macOS\n execSync('curl -fsSL https://claude.ai/install.sh | bash', { stdio: 'inherit' });\n } else if (platform === 'win32') {\n // Windows\n execSync('powershell -Command \"irm https://claude.ai/install.ps1 | iex\"', { stdio: 'inherit' });\n } else {\n // Linux/WSL\n execSync('curl -fsSL https://claude.ai/install.sh | bash', { stdio: 'inherit' });\n }\n break;\n \n case CliTool.GITHUB:\n execSync('npm install -g gh', { stdio: 'inherit' });\n break;\n }\n \n return true;\n } catch (error) {\n logger.error(`Failed to install ${tool.displayName}:`, error);\n return false;\n }\n}\n\n/**\n * Agent files for OpenCode\n * NOTE: DO NOT create agents named 'build' or 'planner' - these conflict with\n * OpenCode's default modes (Plan, Planner, Build). Use @-mention for subagents instead.\n */\nconst AGENT_FILES: Record<string, string> = {\n rush: `---\ndescription: Fast execution for small/urgent changes with minimal planning.\nmode: subagent\ntools:\n \"*\": true\n---\n\nUse for quick fixes, hotfixes, or tiny edits. Keep scope minimal and verify quickly.`,\n review: `---\ndescription: Code review and quality/security auditing agent.\nmode: subagent\ntools:\n \"*\": true\n---\n\nUse to review correctness, security, performance, maintainability, and tests. Be specific\nabout issues and suggest concrete fixes.`,\n scout: `---\ndescription: Research agent for external docs, patterns, and references.\nmode: subagent\ntools:\n \"*\": true\n---\n\nUse to look up docs, examples, best practices. Summarize findings concisely and cite sources.`,\n explore: `---\ndescription: Codebase navigation agent (search, grep, structure understanding).\nmode: subagent\ntools:\n \"*\": true\n---\n\nUse to locate files, patterns, dependencies, and gather quick context in the repo.`,\n vision: `---\ndescription: Visual analysis agent for mockups, screenshots, PDFs, diagrams.\nmode: subagent\ntools:\n \"*\": true\n---\n\nUse to interpret visual assets (components, layout, colors, typography) and translate to tasks.`,\n 'one-shot': `---\ndescription: End-to-end autonomous task execution (beta). Complete tasks from start to finish.\nmode: subagent\ntools:\n \"*\": true\n---\n\n⚠️ BETA: This mode is experimental. Use for straightforward tasks first.\n\n## One-Shot Mode - Autonomous Task Execution\n\nExecute tasks end-to-end with minimal intervention:\n\n### Workflow Phases\n1. **REQUIREMENTS** - Gather task type, scope, dependencies, success criteria\n2. **PLANNING** - Create detailed plan, recommend skills/tools, create tracking bead\n3. **COMPLEXITY** - Auto-split if: >30min, >10 files, >500 lines, >2 sub-systems\n4. **EXECUTION** - Parallel tasks (max 3), dynamic agent delegation\n5. **TESTING** - Run until pass: typecheck → test → lint → build (max 3 retries)\n6. **VERIFICATION** - Quality gates ✓ → Manual verification → Deployment approval\n7. **COMPLETION** - Generate proof, update tracking, collect feedback\n\n### Quality Gates (ALL must pass)\n- \\`npm run typecheck\\` - No type errors\n- \\`npm run test\\` - All tests pass\n- \\`npm run lint\\` - No lint errors\n- \\`npm run build\\` - Build succeeds\n\n### Error Recovery (3 Levels)\n- **Level 1**: Auto-fix (type errors, lint --fix)\n- **Level 2**: Alternative approach via @review\n- **Level 3**: User intervention + follow-up task\n\n### Delegates To\n@planner for planning, @build for implementation, @review for code review,\n@scout for research, @explore for navigation, @vision for visual analysis.\n\n### Best Use Cases\n- Straightforward features with clear scope\n- Bug fixes with known reproduction steps\n- Refactoring with defined boundaries\n\n### Consider Alternatives For\n- Complex multi-system features → Use /plan + /implement\n- Exploratory research → Use /research first\n- Critical production changes → Manual with /review`,\n};\n\n/**\n * Generate analyze-figma command content\n */\nfunction generateAnalyzeFigmaCommand(): string {\n return `# Command: /analyze-figma\n\n## Description\nAnalyze a Figma design and extract design tokens\n\n## Usage\n\\`/analyze-figma <figma-url>\\`\n\n## Examples\n- \\`/analyze-figma https://www.figma.com/design/...\\`\n\n## ⚠️ CRITICAL: Extract URL FIRST!\n\n**BEFORE ANYTHING ELSE**: Look at the user's FULL input message (all lines) and find the Figma URL. It's ALWAYS there - never ask for it!\n\n**The URL pattern**: Look for text containing \\`figma.com/design/\\` anywhere in the user's message.\n\n**Example of what user input looks like**:\n\\`\\`\\`\n/analyze-figma https://www.figma.com/design/lC34qpTSy2MYalTIOsj8S2/\nOnline-Education-Website-Free-Template--Community-?t=7G5yzTiEtJlIZBtY-0\n\\`\\`\\`\n\n**Extract the complete URL** (combine if split):\n\\`https://www.figma.com/design/lC34qpTSy2MYalTIOsj8S2/Online-Education-Website-Free-Template--Community-?t=7G5yzTiEtJlIZBtY-0\\`\n\n## Workflow\n\n**IMPORTANT**: When user provides a Figma URL, you MUST immediately:\n\n**Step 1: Extract URL from User Input**\n\n**CRITICAL**: The URL is ALWAYS in the user's input message! DO NOT ask for it - just extract it!\n\n**MANDATORY**: You MUST extract the URL before proceeding. This is not optional!\n\n**How to Extract**:\n1. **Read the ENTIRE user input message** - look at ALL lines, not just the first line\n2. **Search for ANY text containing** \\`figma.com/design/\\` - this is the URL\n3. **URL may appear in different formats**:\n - On same line: \\`/analyze-figma https://www.figma.com/design/...\\`\n - Split across lines\n4. **Extract the COMPLETE URL**:\n - Start from \\`https://\\` or \\`http://\\`\n - Include everything until the end of the line or next whitespace\n - If URL is split, combine ALL parts into one complete URL\n5. **Include ALL query parameters**: \\`?node-id=...\\`, \\`&t=...\\`, etc.\n\n**CRITICAL RULES**:\n- ✅ DO: Read the ENTIRE user message (all lines)\n- ✅ DO: Look for \\`figma.com/design/\\` anywhere in the message\n- ✅ DO: Combine split lines into one URL\n- ❌ DO NOT: Ask user for URL - it's ALWAYS in the input\n- ❌ DO NOT: Skip this step - URL extraction is MANDATORY\n- ❌ DO NOT: Proceed without extracting URL first\n\n**Step 2: Check Tool Configuration**\n\nBefore calling the tool, verify that Figma tool is configured:\n- If not configured, inform user to run: \\`aikit skills figma-analysis config\\`\n- The tool requires a Figma Personal Access Token\n\n**Step 3: Call MCP Tool read_figma_design**\n\nUse the MCP tool \\`read_figma_design\\` with the extracted URL:\n\\`\\`\\`\nUse tool: read_figma_design\nArguments: { \"url\": \"[extracted URL]\" }\n\\`\\`\\`\n\n**Step 4: Format and Save**\n\nFormat extracted tokens as structured markdown and save using memory-update tool.\n\n**Step 5: Report Results**\n\nReport what was extracted:\n- Number of screens found\n- Number of colors in palette\n- Typography styles found\n- Components identified\n\n## Critical Instructions\n\n- **DO NOT** ask user to \"share the Figma URL\" - they already provided it in the command\n- **DO NOT** wait for confirmation - just start analyzing immediately\n- **DO** extract URL from full user input message\n- **DO** call MCP tool \\`read_figma_design\\` immediately\n- **DO** save to memory automatically`;\n}\n\n/**\n * Install AIKit to OpenCode\n */\nexport async function installToOpenCode(_opencodePath: string): Promise<void> {\n // Get current working directory for project-level installation\n const projectPath = process.cwd();\n const opencodeCommandDir = join(projectPath, '.opencode', 'command');\n const aikitDir = join(projectPath, '.aikit');\n const opencodeAgentDir = join(paths.opencodeConfig(), 'agent');\n \n // Ensure directories exist\n await mkdir(opencodeCommandDir, { recursive: true });\n await mkdir(join(aikitDir, 'skills'), { recursive: true });\n await mkdir(opencodeAgentDir, { recursive: true });\n\n // Install agent files\n for (const [name, content] of Object.entries(AGENT_FILES)) {\n const filePath = join(opencodeAgentDir, `${name}.md`);\n try {\n await access(filePath);\n // File exists - check if it has mode: subagent\n const existingContent = await readFile(filePath, 'utf8');\n if (!existingContent.includes('mode: subagent')) {\n // Missing mode: subagent - add it to preserve user edits but ensure critical config\n const matter = await import('gray-matter');\n const { data: frontmatter, content: body } = matter.default(existingContent);\n frontmatter.mode = 'subagent';\n const updatedContent = matter.default.stringify(body, frontmatter);\n await writeFile(filePath, updatedContent, 'utf8');\n }\n // File exists and has mode: subagent - keep user edits\n } catch {\n // File doesn't exist - create it\n await writeFile(filePath, content, 'utf8');\n }\n }\n \n // Load config to get skills and commands\n const config = await loadConfig();\n const skillEngine = new SkillEngine(config);\n const commandRunner = new CommandRunner(config);\n \n const skills = await skillEngine.listSkills();\n const commands = await commandRunner.listCommands();\n \n const opencodeCommands: Record<string, string> = {};\n \n // Create /skills command that lists all available skills\n const skillsList = skills.map(s => `| \\`/ak_sk_${s.name.replace(/\\s+/g, '-')}\\` | ${s.description} |`).join('\\n');\n opencodeCommands['ak_cm_skills'] = `List all available AIKit skills and how to use them.\n\nREAD .aikit/AGENTS.md\n\n## Available Skills\n\n| Command | Description |\n|---------|-------------|\n${skillsList}\n\nType any command to use that skill. For example: \\`/ak_sk_test-driven-development\\``;\n \n // Generate commands from skills\n for (const skill of skills) {\n const commandName = `ak_sk_${skill.name.replace(/\\s+/g, '-').toLowerCase()}`;\n const skillPath = skill.filePath;\n const relativePath = skillPath.startsWith(projectPath) \n ? skillPath.replace(projectPath, '').replace(/\\\\/g, '/').replace(/^\\//, '')\n : `.aikit/skills/${skill.name.replace(/\\s+/g, '-').toLowerCase()}.md`;\n \n const useWhen = skill.useWhen || `The user asks you to ${skill.name}`;\n \n opencodeCommands[commandName] = `Use the **${skill.name} skill** ${useWhen.toLowerCase()}.\n\nREAD ${relativePath}\n\n## Description\n${skill.description}\n\n## When to Use\n${useWhen}\n\n## Workflow\n${skill.content.split('\\n').slice(0, 20).join('\\n')}${skill.content.split('\\n').length > 20 ? '\\n\\n... (see full skill file for complete workflow)' : ''}\n\n**IMPORTANT**: Follow this skill's workflow step by step. Do not skip steps.\nComplete the checklist at the end of the skill.`;\n }\n \n // Generate commands from slash commands\n for (const cmd of commands) {\n // Skip if already exists as a skill command\n if (opencodeCommands[cmd.name]) continue;\n\n const commandName = `ak_cm_${cmd.name.replace(/\\//g, '').replace(/\\s+/g, '-')}`;\n const examples = cmd.examples.map(e => {\n const prefixed = e.replace(/\\//g, '/ak_cm_');\n return `- \\`${prefixed}\\``;\n }).join('\\n');\n\n // Special handling for analyze-figma command\n if (cmd.name === 'analyze-figma') {\n opencodeCommands[commandName] = generateAnalyzeFigmaCommand();\n } else {\n opencodeCommands[commandName] = `# Command: /ak_cm_${cmd.name}\n\n## Description\n${cmd.description}\n\n## Usage\n\\`${cmd.usage.replace(/\\//g, '/ak_cm_')}\\`\n\n## Examples\n${examples}\n\n## ⚠️ CRITICAL: The User Has Already Provided Arguments!\n\n**The user has provided arguments with this command!**\n\nThe arguments are available in this command response - look at the command workflow below, which now includes explicit instructions to use the provided arguments.\n\n**YOUR JOB**:\n1. Follow the command workflow steps\n2. The workflow will tell you to look at \"Arguments Provided\" section\n3. Use those arguments - do NOT ask the user for this information!\n4. They have already provided it - extract and use it!\n\n**Example Scenario**:\n- User runs: \\`/ak_cm_${cmd.name} snake game with html & css\\`\n- Command: \\`/ak_cm_${cmd.name}\\`\n- Arguments to use: \\`snake game with html & css\\`\n- You must use \"snake game with html & css\" as provided in the workflow!\n\n**DO NOT**: Ask \"Please provide a task description\"\n**DO**: Follow the workflow and use the arguments provided in it!\n\n## Workflow\n${cmd.content}\n\n**Category**: ${cmd.category}`;\n }\n }\n \n // Write all command files\n let count = 0;\n for (const [name, content] of Object.entries(opencodeCommands)) {\n const filePath = join(opencodeCommandDir, `${name}.md`);\n await writeFile(filePath, content.trim());\n logger.info(` ✓ Created /${name} command`);\n count++;\n }\n\n logger.success(`\\nCreated ${count} OpenCode commands in .opencode/command/`);\n\n // Configure MCP server\n await configureMcpServer(projectPath);\n\n logger.info('\\nUsage in OpenCode:');\n logger.info(' Press Ctrl+K to open command picker');\n logger.info(' Or type /ak_cm_skills to see all available skills');\n logger.info(` Available: ${skills.length} skills (ak_sk_*), ${commands.length} commands (ak_cm_*)`);\n logger.info(' MCP server configured - tools available via MCP protocol');\n}\n\n/**\n * Group array by key function\n */\nexport function groupBy<T>(array: T[], keyFn: (item: T) => string): Record<string, T[]> {\n return array.reduce((acc, item) => {\n const key = keyFn(item);\n if (!acc[key]) acc[key] = [];\n acc[key].push(item);\n return acc;\n }, {} as Record<string, T[]>);\n}\n\n/**\n * Create a checkpoint\n */\nexport async function createCheckpoint(message?: string): Promise<void> {\n try {\n const { CheckpointManager } = await import('../core/checkpoints.js');\n const manager = new CheckpointManager();\n const checkpoint = await manager.create(message);\n\n logger.success('✓ Checkpoint created');\n console.log(` ID: ${checkpoint.id}`);\n console.log(` Message: ${checkpoint.message || 'No message'}`);\n console.log(` Branch: ${checkpoint.branch}`);\n console.log(` Files: ${checkpoint.files.length} modified`);\n } catch (error) {\n logger.error('Failed to create checkpoint:', error);\n }\n}\n\n/**\n * Restore a checkpoint\n */\nexport async function restoreCheckpoint(checkpointId?: string): Promise<void> {\n try {\n const { CheckpointManager } = await import('../core/checkpoints.js');\n const manager = new CheckpointManager();\n\n // If no ID provided, get latest\n const id = checkpointId || (await manager.getLatest())?.id;\n if (!id) {\n logger.error('No checkpoints found');\n return;\n }\n\n logger.info(`Restoring checkpoint: ${id}`);\n\n const success = await manager.restore(id);\n if (success) {\n logger.success('✓ Checkpoint restored successfully');\n } else {\n logger.error('Failed to restore checkpoint');\n }\n } catch (error) {\n logger.error('Failed to restore checkpoint:', error);\n }\n}\n\n/**\n * List checkpoints\n */\nexport async function listCheckpoints(): Promise<void> {\n try {\n const { CheckpointManager } = await import('../core/checkpoints.js');\n const manager = new CheckpointManager();\n const checkpoints = await manager.list();\n\n if (checkpoints.length === 0) {\n logger.info('No checkpoints found');\n return;\n }\n\n console.log('\\nAvailable Checkpoints:');\n console.log('━'.repeat(60));\n\n for (const checkpoint of checkpoints) {\n const date = new Date(checkpoint.timestamp).toLocaleString();\n console.log(`\\n${checkpoint.id}`);\n console.log(` Date: ${date}`);\n console.log(` Message: ${checkpoint.message || 'No message'}`);\n console.log(` Branch: ${checkpoint.branch}`);\n console.log(` Files: ${checkpoint.files.length} modified`);\n }\n\n console.log('\\n' + '━'.repeat(60));\n console.log(`\\nTotal: ${checkpoints.length} checkpoint${checkpoints.length > 1 ? 's' : ''}\\n`);\n console.log('Restore with: /checkpoint:restore <id>');\n console.log('Latest: /checkpoint:restore latest\\n');\n } catch (error) {\n logger.error('Failed to list checkpoints:', error);\n }\n}\n\n/**\n * Create a custom agent\n */\nexport async function createCustomAgent(name: string, description?: string): Promise<void> {\n try {\n const { AgentManager: CustomAgentManager } = await import('../core/agentManager.js');\n const manager = new CustomAgentManager();\n const agent = await manager.createAgent(name, description);\n\n logger.success(`✓ Agent \"${name}\" created successfully`);\n console.log(`\\nFile: ${agent.filePath}`);\n console.log(`Description: ${agent.description}`);\n console.log(`\\nYou can now use this agent with /agent ${name}\\n`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('already exists')) {\n logger.error(`Agent \"${name}\" already exists`);\n } else {\n logger.error('Failed to create agent:', error);\n }\n }\n}\n\n/**\n * List all agents\n */\nexport async function listAgents(): Promise<void> {\n try {\n const { AgentManager: CustomAgentManager } = await import('../core/agentManager.js');\n const manager = new CustomAgentManager();\n const agents = await manager.listAgents();\n\n if (agents.length === 0) {\n logger.info('No agents found');\n return;\n }\n\n // Group by type/category\n const builtIn = agents.filter(a => !a.filePath.includes('.aikit/agents'));\n const custom = agents.filter(a => a.filePath.includes('.aikit/agents'));\n\n console.log('\\nAvailable Agents:');\n console.log('━'.repeat(60));\n\n if (builtIn.length > 0) {\n console.log('\\n### Built-in Agents');\n builtIn.forEach(agent => {\n console.log(`\\n• ${agent.name} - ${agent.description}`);\n console.log(` Use when: ${agent.useWhen}`);\n });\n }\n\n if (custom.length > 0) {\n console.log('\\n### Custom Agents');\n custom.forEach(agent => {\n console.log(`\\n• ${agent.name} - ${agent.description}`);\n console.log(` Use when: ${agent.useWhen}`);\n });\n }\n\n console.log('\\n' + '━'.repeat(60));\n console.log(`\\nTotal: ${agents.length} agent${agents.length > 1 ? 's' : ''}\\n`);\n console.log('Create a new agent: /create-agent <name> [description]\\n');\n } catch (error) {\n logger.error('Failed to list agents:', error);\n }\n}\n\n/**\n * Initialize AI-safe git ignore patterns\n */\nexport async function initGitIgnore(): Promise<void> {\n try {\n const { initAISafeGitignore } = await import('../utils/git-ignore.js');\n const initialized = await initAISafeGitignore();\n\n if (initialized) {\n logger.success('✓ AI-safe .gitignore patterns added');\n console.log('\\nProtected:');\n console.log(' • API keys and secrets (.env, *.key)');\n console.log(' • AI working directories (.aikit/memory/)');\n console.log(' • Configuration files (.claude/settings.json)');\n console.log(' • Logs and temporary files');\n console.log('\\n✓ Safe to commit code\\n');\n } else {\n logger.info('AI-safe patterns already exist in .gitignore');\n }\n } catch (error) {\n logger.error('Failed to initialize .gitignore:', error);\n }\n}\n\n/**\n * Start a new development session\n */\nexport async function startSession(name?: string, goals?: string[]): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const session = await manager.startSession(name, goals);\n\n logger.success('✓ Session started');\n console.log(` ID: ${session.id}`);\n console.log(` Name: ${session.name}`);\n console.log(` Started: ${new Date(session.startTime).toLocaleString()}`);\n if (session.goals.length > 0) {\n console.log(` Goals:`);\n session.goals.forEach(goal => console.log(` - ${goal}`));\n }\n console.log('\\nCommands:');\n console.log(' /session:update [notes] - Add progress notes');\n console.log(' /session:end - End session with summary');\n console.log(' /session:current - Show session status\\n');\n } catch (error) {\n logger.error('Failed to start session:', error);\n }\n}\n\n/**\n * Update current session with progress notes\n */\nexport async function updateSession(notes?: string): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const session = await manager.updateSession(notes);\n\n if (session) {\n logger.success('✓ Session updated');\n console.log(` Session: ${session.id}`);\n console.log(` Notes: ${notes || 'Auto-generated'}`);\n console.log(` Time: ${new Date().toLocaleString()}`);\n if (session.updates[session.updates.length - 1]?.modifiedFiles) {\n const files = session.updates[session.updates.length - 1].modifiedFiles;\n console.log(` Modified: ${files?.length} files`);\n }\n console.log();\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('No active session')) {\n logger.error('No active session. Use /session:start first');\n } else {\n logger.error('Failed to update session:', error);\n }\n }\n}\n\n/**\n * End current session with summary\n */\nexport async function endSession(): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const session = await manager.endSession();\n\n if (session) {\n const duration = session.endTime\n ? Math.floor((new Date(session.endTime).getTime() - new Date(session.startTime).getTime()) / 60000)\n : 0;\n\n logger.success('✓ Session ended');\n console.log(`\\nSession: ${session.id}`);\n console.log(`Name: ${session.name}`);\n console.log(`Duration: ${Math.floor(duration / 60)}h ${duration % 60}m`);\n console.log(`Updates: ${session.updates.length}`);\n\n if (session.goals.length > 0) {\n console.log(`\\nGoals:`);\n session.goals.forEach(goal => console.log(` - ${goal}`));\n }\n\n const lastUpdate = session.updates[session.updates.length - 1];\n if (lastUpdate?.gitCommits) {\n console.log(`\\nGit Activity:`);\n console.log(` Commits: ${lastUpdate.gitCommits}`);\n if (lastUpdate.modifiedFiles && lastUpdate.modifiedFiles.length > 0) {\n console.log(` Files Modified: ${lastUpdate.modifiedFiles.length}`);\n }\n }\n\n console.log(`\\nUse /session:show ${session.id} for details\\n`);\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('No active session')) {\n logger.error('No active session. Use /session:start first');\n } else {\n logger.error('Failed to end session:', error);\n }\n }\n}\n\n/**\n * Show current active session\n */\nexport async function showCurrentSession(): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const session = await manager.getCurrentSession();\n\n if (!session) {\n logger.info('No active session');\n console.log('Start a session: /session:start [name]\\n');\n return;\n }\n\n const duration = Math.floor((Date.now() - new Date(session.startTime).getTime()) / 60000);\n\n console.log('\\n📍 Current Session');\n console.log('━'.repeat(60));\n console.log(`\\nSession: ${session.name}`);\n console.log(`ID: ${session.id}`);\n console.log(`Started: ${Math.floor(duration / 60)}h ${duration % 60}m ago`);\n\n if (session.goals.length > 0) {\n console.log(`\\nGoals:`);\n session.goals.forEach(goal => console.log(` - ${goal}`));\n }\n\n if (session.updates.length > 0) {\n console.log(`\\nRecent Updates (last 3):`);\n const recent = session.updates.slice(-3);\n recent.forEach(update => {\n const date = new Date(update.timestamp);\n console.log(` ${date.toLocaleTimeString()} - ${update.notes || 'Update'}`);\n });\n }\n\n const lastUpdate = session.updates[session.updates.length - 1];\n if (lastUpdate?.gitBranch || lastUpdate?.gitCommits) {\n console.log(`\\nGit:`);\n if (lastUpdate.gitBranch) console.log(` Branch: ${lastUpdate.gitBranch}`);\n if (lastUpdate.gitCommits) console.log(` Commits: ${lastUpdate.gitCommits}`);\n if (lastUpdate.modifiedFiles && lastUpdate.modifiedFiles.length > 0) {\n console.log(` Modified: ${lastUpdate.modifiedFiles.length} files`);\n }\n }\n\n if (lastUpdate?.beadsTask) {\n console.log(`\\nBeads Task:`);\n console.log(` ${lastUpdate.beadsTask.id} (${lastUpdate.beadsTask.status})`);\n }\n\n console.log('\\nCommands:');\n console.log(' /session:update [notes] - Add progress');\n console.log(' /session:end - Close session');\n console.log('━'.repeat(60) + '\\n');\n } catch (error) {\n logger.error('Failed to show current session:', error);\n }\n}\n\n/**\n * List all sessions\n */\nexport async function listSessions(): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const sessions = await manager.listSessions();\n\n if (sessions.length === 0) {\n logger.info('No sessions found');\n console.log('Start a session: /session:start [name]\\n');\n return;\n }\n\n console.log('\\n📚 All Sessions');\n console.log('━'.repeat(60));\n\n sessions.forEach((session, index) => {\n const startDate = new Date(session.startTime);\n const endDate = session.endTime ? new Date(session.endTime) : null;\n const duration = endDate\n ? Math.floor((endDate.getTime() - startDate.getTime()) / 60000)\n : null;\n\n console.log(`\\n${index + 1}. ${session.id}`);\n console.log(` Status: ${session.status === 'active' ? '🟢 Active' : 'Ended'}`);\n console.log(` Name: ${session.name}`);\n console.log(` Started: ${startDate.toLocaleString()}`);\n\n if (endDate && duration) {\n console.log(` Ended: ${endDate.toLocaleString()} (${Math.floor(duration / 60)}h ${duration % 60}m)`);\n }\n\n if (session.goals.length > 0) {\n console.log(` Goals: ${session.goals.slice(0, 2).join(', ')}${session.goals.length > 2 ? '...' : ''}`);\n }\n\n console.log(` Updates: ${session.updates.length}`);\n });\n\n console.log('\\n' + '━'.repeat(60));\n console.log(`\\nTotal: ${sessions.length} session${sessions.length > 1 ? 's' : ''}\\n`);\n console.log('Commands:');\n console.log(' /session:show <id> - View session details');\n console.log(' /session:resume <id> - Resume session');\n console.log(' /session:search <query> - Search sessions\\n');\n } catch (error) {\n logger.error('Failed to list sessions:', error);\n }\n}\n\n/**\n * Show specific session details\n */\nexport async function showSession(sessionId: string): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const sessions = await manager.listSessions();\n\n // Find matching session (supports partial ID)\n const session = sessions.find(s => s.id.startsWith(sessionId) || s.id === sessionId);\n\n if (!session) {\n logger.error(`Session not found: ${sessionId}`);\n console.log('Use /session:list to see all sessions\\n');\n return;\n }\n\n const startDate = new Date(session.startTime);\n const endDate = session.endTime ? new Date(session.endTime) : null;\n const duration = endDate\n ? Math.floor((endDate.getTime() - startDate.getTime()) / 60000)\n : null;\n\n console.log('\\n📄 Session: ' + session.id);\n console.log('━'.repeat(60));\n console.log(`\\nStatus: ${session.status === 'active' ? '🟢 Active' : 'Ended'}`);\n console.log(`Name: ${session.name}`);\n console.log(`Started: ${startDate.toLocaleString()}`);\n if (endDate && duration) {\n console.log(`Ended: ${endDate.toLocaleString()}`);\n console.log(`Duration: ${Math.floor(duration / 60)}h ${duration % 60}m`);\n }\n\n if (session.goals.length > 0) {\n console.log(`\\nGoals:`);\n session.goals.forEach(goal => console.log(` ${session.status === 'ended' ? '✓' : '○'} ${goal}`));\n }\n\n console.log(`\\n## Progress (${session.updates.length} updates)`);\n session.updates.forEach(update => {\n const date = new Date(update.timestamp);\n console.log(`\\n### ${date.toLocaleString()}`);\n if (update.notes) console.log(`${update.notes}`);\n if (update.gitBranch) console.log(`**Git Branch:** ${update.gitBranch}`);\n if (update.modifiedFiles && update.modifiedFiles.length > 0) {\n console.log(`**Modified Files:** ${update.modifiedFiles.length} files`);\n }\n if (update.beadsTask) {\n console.log(`**Beads Task:** ${update.beadsTask.id} (${update.beadsTask.status})`);\n }\n });\n\n if (session.status === 'ended') {\n console.log(`\\n## Summary`);\n console.log(`Duration: ${duration ? Math.floor(duration / 60) + 'h ' + (duration % 60) + 'm' : 'N/A'}`);\n console.log(`Updates: ${session.updates.length}`);\n if (session.updates[session.updates.length - 1]?.gitCommits) {\n console.log(`Git Commits: ${session.updates[session.updates.length - 1].gitCommits}`);\n }\n }\n\n console.log('\\n' + '━'.repeat(60) + '\\n');\n } catch (error) {\n logger.error('Failed to show session:', error);\n }\n}\n\n/**\n * Search sessions by keyword\n */\nexport async function searchSessions(query: string): Promise<void> {\n try {\n const { SessionManager } = await import('../core/sessions.js');\n const manager = new SessionManager();\n const sessions = await manager.searchSessions(query);\n\n if (sessions.length === 0) {\n logger.info(`No sessions found matching: ${query}`);\n console.log('Use /session:list to see all sessions\\n');\n return;\n }\n\n console.log(`\\n🔍 Search Results: \"${query}\"`);\n console.log('━'.repeat(60));\n console.log(`\\nFound ${sessions.length} session${sessions.length > 1 ? 's' : ''}:\\n`);\n\n sessions.forEach((session, index) => {\n const startDate = new Date(session.startTime);\n console.log(`${index + 1}. ${session.id}`);\n console.log(` Name: ${session.name}`);\n console.log(` Started: ${startDate.toLocaleString()}`);\n console.log(` Status: ${session.status === 'active' ? '🟢 Active' : 'Ended'}`);\n\n if (session.goals.length > 0) {\n console.log(` Goals: ${session.goals.slice(0, 2).join(', ')}${session.goals.length > 2 ? '...' : ''}`);\n }\n console.log();\n });\n\n console.log('━'.repeat(60));\n console.log(`\\nTotal: ${sessions.length} matching session${sessions.length > 1 ? 's' : ''}\\n`);\n console.log('Commands:');\n console.log(' /session:show <id> - View session details');\n console.log(' /session:resume <id> - Resume session\\n');\n } catch (error) {\n logger.error('Failed to search sessions:', error);\n }\n}\n\n","import { CliPlatform } from '../utils/cli-detector.js';\nimport { OpenCodeAdapter } from './opencode-adapter.js';\nimport { ClaudeAdapter } from './claude-adapter.js';\nimport { PlatformAdapter } from './types.js';\n\nexport function createAdapter(platform: CliPlatform): PlatformAdapter {\n switch (platform) {\n case CliPlatform.OPENCODE:\n return new OpenCodeAdapter();\n case CliPlatform.CLAUDE:\n return new ClaudeAdapter();\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport const SUPPORTED_PLATFORMS = [\n { platform: CliPlatform.OPENCODE, name: 'OpenCode' },\n { platform: CliPlatform.CLAUDE, name: 'Claude Code CLI' },\n] as const;\n","import { PlatformAdapter } from './types.js';\nimport { Command } from '../core/commands.js';\nimport { Skill } from '../core/skills.js';\nimport { Agent } from '../core/agents.js';\nimport { CliPlatform } from '../utils/cli-detector.js';\nimport { paths } from '../utils/paths.js';\nimport { readFile, writeFile, mkdir, access } from 'fs/promises';\nimport { join } from 'path';\n\ninterface TransformedSkill {\n name: string;\n directory: string;\n files: Record<string, string>;\n}\n\n/**\n * OpenCode Platform Adapter\n * Transforms aikit commands/skills/agents to OpenCode format\n */\nexport class OpenCodeAdapter implements PlatformAdapter {\n readonly platform = CliPlatform.OPENCODE;\n readonly displayName = 'OpenCode';\n\n getCommandsDir(): string {\n return join(process.cwd(), '.opencode', 'command');\n }\n\n getSkillsDir(): string {\n return join(process.cwd(), '.opencode', 'skill');\n }\n\n getAgentsDir(): string {\n return join(paths.opencodeConfig(), 'agent');\n }\n\n async transformCommand(command: Command): Promise<{ name: string; content: string }> {\n // Sanitize filename for Windows (replace colons with dashes)\n const sanitizedName = command.name.replace(/:/g, '-');\n const name = `ak_cm_${sanitizedName}`;\n const content = this.generateCommandContent(command);\n return { name, content };\n }\n\n async transformSkill(skill: Skill): Promise<TransformedSkill> {\n const skillName = `ak_sk_${skill.name}`;\n const skillContent = this.generateSkillContent(skill);\n const result: TransformedSkill = {\n name: skillName,\n directory: '',\n files: { [`${skillName}.md`]: skillContent },\n };\n return result;\n }\n\n async transformAgent(agent: Agent): Promise<{ name: string; content: string }> {\n // Rename build and planner to avoid conflicts with OpenCode's default modes\n const name = (agent.name === 'build' || agent.name === 'planner')\n ? `aikit${agent.name}`\n : agent.name;\n const content = this.generateAgentContent(agent, name);\n return { name, content };\n }\n\n async installCommand(name: string, content: string): Promise<void> {\n const dir = this.getCommandsDir();\n await mkdir(dir, { recursive: true });\n await writeFile(join(dir, `${name}.md`), content);\n }\n\n async installSkill(_name: string, directory: string, files: Record<string, string>): Promise<void> {\n const baseDir = this.getSkillsDir();\n const targetDir = directory ? join(baseDir, directory) : baseDir;\n await mkdir(targetDir, { recursive: true });\n for (const [filename, content] of Object.entries(files)) {\n await writeFile(join(targetDir, filename), content);\n }\n }\n\n async installAgent(name: string, content: string): Promise<void> {\n const dir = this.getAgentsDir();\n await mkdir(dir, { recursive: true });\n const filePath = join(dir, `${name}.md`);\n\n try {\n await access(filePath);\n // File exists - check if it has mode: subagent\n const existingContent = await readFile(filePath, 'utf-8');\n if (!existingContent.includes('mode: subagent')) {\n // Missing mode: subagent - add it to preserve user edits but ensure critical config\n const matter = await import('gray-matter');\n const { data: frontmatter, content: body } = matter.default(existingContent);\n frontmatter.mode = 'subagent';\n const updatedContent = matter.default.stringify(body, frontmatter);\n await writeFile(filePath, updatedContent, 'utf-8');\n }\n // File exists and has mode: subagent - keep user edits\n } catch {\n // File doesn't exist - create it\n await writeFile(filePath, content, 'utf-8');\n }\n }\n\n private generateCommandContent(command: Command): string {\n const examples = command.examples.map(e => {\n const prefixed = e.replace(/\\//g, '/ak_cm_');\n return `- \\`${prefixed}\\``;\n }).join('\\n');\n\n return `# Command: /ak_cm_${command.name}\n\n## Description\n${command.description}\n\n## Usage\n\\`${command.usage.replace(/\\//g, '/ak_cm_')}\\`\n\n## Examples\n${examples}\n\n## ⚠️ CRITICAL: The User Has Already Provided Arguments!\n\n**The user has provided arguments with this command!**\n\nThe arguments are available in this command response - look at the command workflow below, which now includes explicit instructions to use the provided arguments.\n\n**YOUR JOB**:\n1. Follow the command workflow steps\n2. The workflow will tell you to look at \"Arguments Provided\" section\n3. Use those arguments - do NOT ask the user for this information!\n4. They have already provided it - extract and use it!\n\n**Example Scenario**:\n- User runs: \\`/ak_cm_${command.name} snake game with html & css\\`\n- Command: \\`/ak_cm_${command.name}\\`\n- Arguments to use: \\`snake game with html & css\\`\n- You must use \"snake game with html & css\" as provided in the workflow!\n\n**DO NOT**: Ask \"Please provide a task description\"\n**DO**: Follow the workflow and use the arguments provided in it!\n\n## Workflow\n${command.content}\n\n**Category**: ${command.category}`;\n }\n\n private generateSkillContent(skill: Skill): string {\n const relativePath = skill.filePath.startsWith(process.cwd())\n ? skill.filePath.replace(process.cwd(), '').replace(/\\\\/g, '/').replace(/^\\//, '')\n : `.aikit/skills/${skill.name}.md`;\n\n return `Use the **${skill.name} skill** ${skill.useWhen.toLowerCase()}.\n\nREAD ${relativePath}\n\n## Description\n${skill.description}\n\n## When to Use\n${skill.useWhen}\n\n## Workflow\n${skill.content.split('\\n').slice(0, 20).join('\\n')}${skill.content.split('\\n').length > 20 ? '\\n\\n... (see full skill file for complete workflow)' : ''}\n\n**IMPORTANT**: Follow this skill's workflow step by step. Do not skip steps.\nComplete the checklist at the end of the skill.`;\n }\n\n private generateAgentContent(agent: Agent, nameOverride?: string): string {\n // All agents (including renamed ones) should have mode: subagent for tab switching\n return `---\nname: ${nameOverride || agent.name}\nmode: subagent\n---\n\n${agent.systemPrompt}`;\n }\n}\n","import { PlatformAdapter } from './types.js';\nimport { Command } from '../core/commands.js';\nimport { Skill } from '../core/skills.js';\nimport { Agent } from '../core/agents.js';\nimport { CliPlatform } from '../utils/cli-detector.js';\nimport { paths } from '../utils/paths.js';\nimport { writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport matter from 'gray-matter';\n\n/**\n * Claude Code CLI Platform Adapter\n * Transforms aikit commands/skills/agents to Claude Code CLI format\n */\nexport class ClaudeAdapter implements PlatformAdapter {\n readonly platform = CliPlatform.CLAUDE;\n readonly displayName = 'Claude Code CLI';\n\n getCommandsDir(): string {\n return paths.claudeCommands(true); // project scope\n }\n\n getSkillsDir(): string {\n return paths.claudeSkills(true); // project scope\n }\n\n getAgentsDir(): string {\n return paths.claudeAgents(true); // project scope\n }\n\n async transformCommand(command: Command): Promise<{ name: string; content: string }> {\n // Sanitize filename for Windows (replace colons with dashes)\n const name = command.name.replace(/:/g, '-');\n const content = this.generateCommandContent(command);\n return { name, content };\n }\n\n async transformSkill(skill: Skill): Promise<{ name: string; directory: string; files: Record<string, string> }> {\n const name = skill.name; // No prefix\n const content = this.generateSkillContent(skill);\n return {\n name,\n directory: name,\n files: { 'SKILL.md': content },\n };\n }\n\n async transformAgent(agent: Agent): Promise<{ name: string; content: string }> {\n const name = agent.name;\n const content = this.generateAgentContent(agent);\n return { name, content };\n }\n\n async installCommand(name: string, content: string): Promise<void> {\n const dir = this.getCommandsDir();\n await mkdir(dir, { recursive: true });\n await writeFile(join(dir, `${name}.md`), content);\n }\n\n async installSkill(_name: string, directory: string, files: Record<string, string>): Promise<void> {\n const baseDir = this.getSkillsDir();\n const targetDir = join(baseDir, directory);\n await mkdir(targetDir, { recursive: true });\n for (const [filename, content] of Object.entries(files)) {\n await writeFile(join(targetDir, filename), content);\n }\n }\n\n async installAgent(name: string, content: string): Promise<void> {\n const dir = this.getAgentsDir();\n await mkdir(dir, { recursive: true });\n await writeFile(join(dir, `${name}.md`), content);\n }\n\n private generateCommandContent(command: Command): string {\n // Remove OpenCode-specific headers and formatting\n let workflow = command.content;\n\n // Remove OpenCode-specific sections\n workflow = workflow\n .replace(/## ⚠️ CRITICAL: The User Has Already Provided Arguments!.*?(?![\\n])?.*/gs, '')\n .replace(/\\*\\*The user has provided arguments with this command!\\*\\*/g, '')\n .replace(/\\*\\*The arguments are available in this command response.*?\\*\\*/g, '')\n .replace(/\\*\\*YOUR JOB\\*\\*:.*/gs, '')\n .replace(/1\\. Follow command workflow steps.*?\\n2\\. The workflow will tell you.*?\\n3\\. Use those arguments.*?\\n4\\. They have already provided it.*?\\n5\\. DO NOT ask.*?\\n6\\. DO: Follow workflow.*?\\n+\\**Example Scenario\\*\\*:.*/gs, '')\n .replace(/\\*\\*User runs:.*?\\*\\*:\\n.*?\\n+- Command:.*?\\n+- Arguments to use:.*?\\n+- You must use.*?\\n+- DO NOT:.*?\\n+- DO:.*?\\n+\\*\\*\\*/g, '')\n .replace(/\\*\\*\\*/g, '');\n\n // Remove OpenCode command header\n workflow = workflow.replace(/^# Command: \\/ak_cm_[\\s-]+\\n+/g, '');\n\n // Transform $ARGUMENTS to Claude format\n workflow = workflow\n .replace(/\\$ARGUMENTS/g, '$ARGUMENTS')\n .replace(/\\$1/g, '$1')\n .replace(/\\$2/g, '$2');\n\n // Generate frontmatter\n const frontmatter = {\n description: command.description,\n argumentHint: command.usage.replace(/^\\//, '').replace(/<[^>]+>/g, '[args]'),\n };\n\n return matter.stringify(workflow, frontmatter);\n }\n\n private generateSkillContent(skill: Skill): string {\n // Transform to Claude skill format\n const frontmatter = {\n name: skill.name,\n description: `${skill.description}. ${skill.useWhen}`,\n };\n\n const content = `# ${skill.name}\n\n## When to Use\n${skill.useWhen}\n\n## Description\n${skill.description}\n\n## Workflow\n${skill.content}\n\n## Tips\n- Use this skill when: ${skill.useWhen.toLowerCase()}\n- Category: ${skill.category}\n- Tags: ${skill.tags.join(', ')}`;\n\n return matter.stringify(content, frontmatter);\n }\n\n private generateAgentContent(agent: Agent): string {\n // Transform to Claude agent format\n const frontmatter = {\n name: agent.name,\n description: agent.useWhen,\n tools: ['Read', 'Edit', 'Bash', 'Grep', 'Glob'], // Default tools\n };\n\n return matter.stringify(agent.systemPrompt, frontmatter);\n }\n}\n","/**\n * Install Command\n *\n * Install AIKit to specific CLI tool configuration\n */\n\nimport { Command } from 'commander';\nimport inquirer from 'inquirer';\n\nimport { logger } from '../../utils/logger.js';\nimport { CliDetector, CliPlatform } from '../../utils/cli-detector.js';\nimport { createAdapter } from '../../platform/adapters.js';\nimport { loadConfig } from '../../core/config.js';\nimport { AgentManager } from '../../core/agents.js';\nimport { CommandRunner } from '../../core/commands.js';\nimport { SkillEngine } from '../../core/skills.js';\n\nexport function registerInstallCommand(program: Command): void {\n program\n .command('install [platform]')\n .description('Install AIKit to specific CLI tool configuration')\n .action(async (platformArg) => {\n try {\n let selectedPlatform: CliPlatform;\n\n if (platformArg) {\n selectedPlatform = CliDetector.matchPlatform(platformArg);\n if (!selectedPlatform) {\n logger.error(`Unknown platform: ${platformArg}`);\n logger.info(`Supported platforms: ${Object.values(CliPlatform).join(', ')}`);\n process.exit(1);\n }\n } else {\n const platforms = await CliDetector.detectPlatforms();\n \n // Smart default: prefer already installed platform\n const installedPlatforms = CliDetector.filterInstalledPlatforms(platforms);\n const defaultPlatform = installedPlatforms.length > 0\n ? installedPlatforms[0].platform\n : platforms[0]?.platform;\n\n const { platform } = await inquirer.prompt([\n {\n type: 'list',\n name: 'platform',\n message: 'Which CLI tool do you want to install AIKit for?',\n choices: platforms.map(p => ({\n name: p.displayName,\n value: p.platform,\n })),\n default: defaultPlatform,\n },\n ]);\n\n selectedPlatform = platform;\n }\n\n logger.info(`Installing AIKit for ${selectedPlatform}...`);\n\n const config = await loadConfig();\n const adapter = createAdapter(selectedPlatform);\n\n const skillEngine = config.skills.enabled ? new SkillEngine(config) : null;\n const commandRunner = config.commands.enabled ? new CommandRunner(config) : null;\n const agentManager = config.agents.enabled ? new AgentManager(config) : null;\n\n // Install commands\n if (commandRunner) {\n const commands = await commandRunner.listCommands();\n logger.info(`Installing ${commands.length} commands...`);\n for (const command of commands) {\n const { name, content } = await adapter.transformCommand(command);\n await adapter.installCommand(name, content);\n logger.info(` ✓ Created ${name} command`);\n }\n }\n\n // Install skills\n if (skillEngine) {\n const skills = await skillEngine.listSkills();\n logger.info(`Installing ${skills.length} skills...`);\n for (const skill of skills) {\n const { name, directory, files } = await adapter.transformSkill(skill);\n await adapter.installSkill(name, directory, files);\n logger.info(` ✓ Created ${name} skill`);\n }\n }\n\n // Install agents\n if (agentManager) {\n const agents = await agentManager.listAgents();\n logger.info(`Installing ${agents.length} agents...`);\n for (const agent of agents) {\n const { name, content } = await adapter.transformAgent(agent);\n await adapter.installAgent(name, content);\n logger.info(` ✓ Created ${name} agent`);\n }\n }\n\n logger.success(`\\n✓ AIKit installed to ${adapter.displayName}!`);\n } catch (error) {\n logger.error('Failed to install:', error);\n process.exit(1);\n }\n });\n}\n\n","/**\n * Sync Command\n * \n * Update AIKit to latest version\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nimport { loadConfig } from '../../core/config.js';\nimport { SyncEngine } from '../../core/sync-engine.js';\nimport { logger } from '../../utils/logger.js';\n\nexport function registerSyncCommand(program: Command): void {\n program\n .command('sync [subcommand]')\n .description('Update AIKit to latest version')\n .option('--dry-run', 'Preview changes without applying')\n .option('-f, --force', 'Skip confirmation prompts')\n .option('--no-backup', 'Skip creating backup')\n .action(async (subcommand, options) => {\n const config = await loadConfig();\n const syncEngine = new SyncEngine(config);\n\n if (!subcommand) {\n // Default: check and apply\n await syncEngine.applyUpdate(options);\n } else {\n switch (subcommand) {\n case 'check':\n await syncEngine.checkForUpdates();\n break;\n case 'preview':\n await syncEngine.previewUpdate();\n break;\n case 'apply':\n await syncEngine.applyUpdate(options);\n break;\n case 'rollback':\n await syncEngine.rollback();\n break;\n default:\n logger.error(`Unknown subcommand: ${subcommand}`);\n console.log(chalk.gray('Available subcommands: check, preview, apply, rollback'));\n process.exit(1);\n }\n }\n });\n}\n\n\n\n\n","import { readFile, writeFile, copyFile, mkdir } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport inquirer from 'inquirer';\nimport chalk from 'chalk';\nimport { VersionManager, UpdateChanges, SkillConflict, SkillHash } from './version-manager.js';\nimport { BackupManager } from './backup-manager.js';\nimport { MigrationManager } from './migration-manager.js';\nimport { logger } from '../utils/logger.js';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\n\n/**\n * Sync options\n */\nexport interface SyncOptions {\n dryRun?: boolean;\n force?: boolean;\n backup?: boolean;\n}\n\n/**\n * Sync result\n */\nexport interface SyncResult {\n success: boolean;\n backupId?: string;\n newSkills: string[];\n updatedSkills: string[];\n removedSkills: string[];\n migrationsRun: string[];\n}\n\n/**\n * Sync Engine - Orchestrates update process\n */\nexport class SyncEngine {\n private versionManager: VersionManager;\n private backupManager: BackupManager;\n private migrationManager: MigrationManager;\n\n constructor(config: Config) {\n this.versionManager = new VersionManager(config);\n this.backupManager = new BackupManager(config.configPath);\n this.migrationManager = new MigrationManager(config.configPath);\n }\n\n /**\n * Check for updates without applying\n */\n async checkForUpdates(): Promise<UpdateChanges | null> {\n try {\n const changes = await this.versionManager.checkForUpdates();\n\n if (changes.hasUpdate) {\n this.displayUpdateInfo(changes);\n } else {\n console.log(chalk.green('✓ Your AIKit is up to date'));\n console.log(` Installed: ${changes.fromVersion}`);\n console.log(` Latest: ${changes.toVersion}`);\n }\n\n return changes;\n } catch (error) {\n logger.error('Failed to check for updates:', error);\n return null;\n }\n }\n\n /**\n * Preview changes without applying\n */\n async previewUpdate(): Promise<boolean> {\n try {\n console.log(chalk.bold('\\n🔍 Previewing update...\\n'));\n\n const changes = await this.versionManager.checkForUpdates();\n\n if (!changes.hasUpdate) {\n console.log(chalk.green('✓ No updates available'));\n return false;\n }\n\n await this.displayChanges(changes);\n\n console.log(chalk.yellow('\\n⚠️ This is a preview - no changes will be made.'));\n console.log(chalk.gray('Use `aikit sync apply` to apply these changes.'));\n\n return true;\n } catch (error) {\n logger.error('Failed to preview update:', error);\n return false;\n }\n }\n\n /**\n * Apply update\n */\n async applyUpdate(options: SyncOptions = {}): Promise<SyncResult> {\n try {\n // Step 1: Check for updates\n const changes = await this.versionManager.checkForUpdates();\n\n if (!changes.hasUpdate) {\n console.log(chalk.green('✓ Already up to date'));\n return {\n success: true,\n newSkills: [],\n updatedSkills: [],\n removedSkills: [],\n migrationsRun: []\n };\n }\n\n // Step 2: Display changes\n await this.displayChanges(changes);\n\n // Step 3: Confirm\n if (!options.force) {\n const { confirmed } = await inquirer.prompt([{\n type: 'confirm',\n name: 'confirmed',\n message: 'Continue with update?',\n default: false\n }]);\n\n if (!confirmed) {\n console.log(chalk.yellow('Update cancelled'));\n return {\n success: false,\n newSkills: [],\n updatedSkills: [],\n removedSkills: [],\n migrationsRun: []\n };\n }\n }\n\n // Step 4: Create backup (unless dry run)\n let backupId: string | undefined = undefined;\n\n if (!options.dryRun && options.backup !== false) {\n console.log(chalk.bold('\\n📦 Creating backup...'));\n const backupResult = await this.backupManager.createBackup(\n changes.fromVersion,\n changes.toVersion\n );\n\n if (!backupResult) {\n throw new Error('Failed to create backup');\n }\n backupId = backupResult;\n }\n\n // Step 5: Resolve conflicts\n for (const conflict of changes.conflicts) {\n await this.resolveConflict(conflict);\n }\n\n // Step 6: Run migrations\n console.log(chalk.bold('\\n🔄 Running migrations...'));\n const migrationResult = await this.migrationManager.runPendingMigrations();\n\n if (!migrationResult.success) {\n throw new Error(`Migration failed: ${migrationResult.failed.join(', ')}`);\n }\n\n // Step 7: Update skills\n console.log(chalk.bold('\\n📝 Updating skills...'));\n const updateResult = await this.updateSkills(changes, options);\n\n // Step 8: Update version\n await this.versionManager.updateVersion(changes.toVersion);\n\n // Update installed skills tracking\n if (backupId) {\n const allSkills = await this.versionManager.loadSkillHashes(paths.skills(paths.globalConfig()));\n await this.versionManager.saveInstalledSkills(allSkills);\n }\n\n console.log(chalk.green('\\n✅ Update complete!'));\n this.displaySummary({\n success: true,\n backupId,\n ...updateResult,\n migrationsRun: migrationResult.applied\n });\n\n return {\n success: true,\n backupId,\n ...updateResult,\n migrationsRun: migrationResult.applied\n };\n } catch (error) {\n logger.error('Update failed:', error);\n console.log(chalk.red('\\n❌ Update failed'));\n\n // TODO: Implement automatic rollback\n return {\n success: false,\n newSkills: [],\n updatedSkills: [],\n removedSkills: [],\n migrationsRun: []\n };\n }\n }\n\n /**\n * Rollback to previous backup\n */\n async rollback(backupId?: string): Promise<boolean> {\n try {\n console.log(chalk.bold('\\n🔄 Rollback...\\n'));\n\n // List backups if no ID provided\n if (!backupId) {\n const backups = await this.backupManager.listBackups();\n\n if (backups.length === 0) {\n console.log(chalk.yellow('No backups available'));\n return false;\n }\n\n const { selectedBackup } = await inquirer.prompt([{\n type: 'list',\n name: 'selectedBackup',\n message: 'Select backup to restore:',\n choices: backups.map((b) => ({\n name: `${b.manifest.backupId} (${b.manifest.fromVersion} → ${b.manifest.toVersion})`,\n value: b.manifest.backupId\n }))\n }]);\n\n backupId = selectedBackup;\n }\n\n if (!backupId) {\n console.log(chalk.yellow('No backup ID provided'));\n return false;\n }\n\n const success = await this.backupManager.restoreBackup(backupId);\n\n if (success) {\n console.log(chalk.green('✓ Rollback complete'));\n return true;\n }\n\n return false;\n } catch (error) {\n logger.error('Rollback failed:', error);\n return false;\n }\n }\n\n /**\n * Display update information\n */\n private displayUpdateInfo(changes: UpdateChanges): void {\n console.log(chalk.bold('\\n📢 New version available!\\n'));\n console.log(` ${chalk.cyan('Current:')} ${changes.fromVersion}`);\n console.log(` ${chalk.cyan('Latest:')} ${changes.toVersion}\\n`);\n }\n\n /**\n * Display changes summary\n */\n private async displayChanges(changes: UpdateChanges): Promise<void> {\n console.log(chalk.bold('📊 Changes detected:\\n'));\n\n if (changes.newSkills.length > 0) {\n console.log(chalk.green(' New Skills:'));\n changes.newSkills.forEach((skill) => {\n console.log(` + ${skill.name} (${skill.category})`);\n });\n }\n\n if (changes.modifiedSkills.length > 0) {\n console.log(chalk.yellow(' Updated Skills:'));\n changes.modifiedSkills.forEach((skill) => {\n console.log(` ~ ${skill.name}`);\n });\n }\n\n if (changes.removedSkills.length > 0) {\n console.log(chalk.red(' Removed Skills:'));\n changes.removedSkills.forEach((skill) => {\n console.log(` - ${skill.name}`);\n });\n }\n\n if (changes.conflicts.length > 0) {\n console.log(chalk.bold.red(' ⚠️ Conflicts:'));\n changes.conflicts.forEach((conflict) => {\n console.log(` ! ${conflict.skillName} (user modified)`);\n });\n }\n }\n\n /**\n * Resolve a conflict\n */\n private async resolveConflict(conflict: SkillConflict): Promise<void> {\n console.log(chalk.bold.red(`\\n⚠️ Conflict detected: ${conflict.skillName}\\n`));\n console.log(chalk.yellow('Your version differs from official version.'));\n\n const { action } = await inquirer.prompt([{\n type: 'list',\n name: 'action',\n message: 'Choose action:',\n choices: [\n {\n name: 'Keep your version (will be renamed to -custom.md)',\n value: 'preserve'\n },\n {\n name: 'Overwrite with official version',\n value: 'overwrite'\n },\n {\n name: 'Skip this skill',\n value: 'skip'\n }\n ]\n }]);\n\n if (action === 'skip') {\n return;\n }\n\n if (action === 'overwrite') {\n // User chose to overwrite - do nothing, sync will overwrite\n return;\n }\n\n // Preserve - rename user's version to -custom\n // TODO: Implement this logic\n console.log(chalk.yellow(' Your version will be preserved as -custom.md'));\n }\n\n /**\n * Update skills based on changes\n */\n private async updateSkills(\n changes: UpdateChanges,\n options: SyncOptions\n ): Promise<{\n newSkills: string[];\n updatedSkills: string[];\n removedSkills: string[];\n }> {\n const globalSkillsPath = paths.skills(paths.globalConfig());\n const projectSkillsPath = paths.skills(this.versionManager['config'].configPath);\n const newSkills: string[] = [];\n const updatedSkills: string[] = [];\n const removedSkills: string[] = [];\n\n // Install new skills\n for (const skill of changes.newSkills) {\n if (!options.dryRun) {\n await this.installSkill(globalSkillsPath, skill, projectSkillsPath);\n }\n newSkills.push(skill.name);\n console.log(chalk.green(` + ${skill.name}`));\n }\n\n // Update modified skills\n for (const skill of changes.modifiedSkills) {\n if (!options.dryRun) {\n await this.installSkill(globalSkillsPath, skill, projectSkillsPath);\n }\n updatedSkills.push(skill.name);\n console.log(chalk.yellow(` ~ ${skill.name}`));\n }\n\n // Handle removed skills (archive them)\n for (const skill of changes.removedSkills) {\n if (!options.dryRun) {\n await this.archiveSkill(projectSkillsPath, skill);\n }\n removedSkills.push(skill.name);\n console.log(chalk.red(` - ${skill.name} (archived)`));\n }\n\n return {\n newSkills,\n updatedSkills,\n removedSkills\n };\n }\n\n /**\n * Install a skill\n */\n private async installSkill(\n sourceDir: string,\n skill: SkillHash,\n targetDir: string\n ): Promise<void> {\n const sourcePath = join(sourceDir, skill.category, `${skill.name}.md`);\n const targetPath = join(targetDir, skill.category, `${skill.name}.md`);\n\n // Create target directory\n await mkdir(dirname(targetPath), { recursive: true });\n\n // Copy file\n await copyFile(sourcePath, targetPath);\n }\n\n /**\n * Archive a removed skill\n */\n private async archiveSkill(\n targetDir: string,\n skill: SkillHash\n ): Promise<void> {\n const sourcePath = join(targetDir, skill.category, `${skill.name}.md`);\n const targetPath = join(targetDir, skill.category, `${skill.name}-deprecated.md`);\n\n try {\n // Read original content\n const content = await readFile(sourcePath, 'utf-8');\n\n // Add deprecation notice\n const deprecatedNotice = `---\n⚠️ DEPRECATED: This skill has been removed\n\nDeprecation date: ${new Date().toISOString()}\nReason: Check release notes for replacement\n---\n\n${content}`;\n\n // Create target directory\n await mkdir(dirname(targetPath), { recursive: true });\n\n await writeFile(targetPath, deprecatedNotice);\n } catch (error) {\n // If source file doesn't exist, skip archiving\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n console.log(chalk.yellow(` - ${skill.name} (not found, skipping)`));\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Display sync summary\n */\n private displaySummary(result: SyncResult): void {\n console.log(chalk.bold('\\n📋 Summary:\\n'));\n console.log(` Updated from: ${chalk.cyan(result.backupId || 'N/A')}`);\n console.log(` Updated to: ${chalk.cyan('current')}`);\n console.log();\n\n if (result.newSkills.length > 0) {\n console.log(chalk.green(` ${result.newSkills.length} new skills installed`));\n }\n if (result.updatedSkills.length > 0) {\n console.log(chalk.yellow(` ${result.updatedSkills.length} skills updated`));\n }\n if (result.removedSkills.length > 0) {\n console.log(chalk.red(` ${result.removedSkills.length} skills archived`));\n }\n if (result.migrationsRun.length > 0) {\n console.log(chalk.blue(` ${result.migrationsRun.length} migrations run`));\n }\n\n if (result.backupId) {\n console.log(chalk.gray(`\\n Rollback available: aikit sync rollback ${result.backupId}`));\n }\n }\n}\n","import { readFile, readdir, writeFile, stat } from 'fs/promises';\nimport { join } from 'path';\nimport { createHash } from 'crypto';\nimport { Config } from './config.js';\nimport { paths } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Version information\n */\nexport interface VersionInfo {\n installedVersion: string;\n lastSynced: string;\n packageVersion: string;\n migrationHistory: MigrationHistoryEntry[];\n}\n\n/**\n * Migration history entry\n */\nexport interface MigrationHistoryEntry {\n from: string;\n to: string;\n timestamp: string;\n status: 'completed' | 'failed' | 'rolled-back';\n}\n\n/**\n * Skill hash information\n */\nexport interface SkillHash {\n path: string;\n name: string;\n hash: string;\n category: string;\n}\n\n/**\n * Update changes detected\n */\nexport interface UpdateChanges {\n hasUpdate: boolean;\n fromVersion: string;\n toVersion: string;\n newSkills: SkillHash[];\n modifiedSkills: SkillHash[];\n removedSkills: SkillHash[];\n conflicts: SkillConflict[];\n configChanges: string[];\n}\n\n/**\n * Skill conflict information\n */\nexport interface SkillConflict {\n skillName: string;\n userHash: string;\n sourceHash: string;\n installedHash: string;\n userModified: boolean;\n sourceModified: boolean;\n}\n\n/**\n * Version Manager - Handles version tracking and update detection\n */\nexport class VersionManager {\n private config: Config;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * Get current installed version\n */\n async getCurrentVersion(): Promise<VersionInfo | null> {\n const versionPath = join(paths.globalConfig(), '.version.json');\n\n try {\n const content = await readFile(versionPath, 'utf-8');\n return JSON.parse(content) as VersionInfo;\n } catch {\n return null;\n }\n }\n\n /**\n * Get package version from package.json\n */\n getPackageVersion(): string {\n try {\n const packageJson = require(join(process.cwd(), 'package.json'));\n return packageJson.version || '0.0.0';\n } catch {\n return '0.0.0';\n }\n }\n\n /**\n * Check for updates\n */\n async checkForUpdates(): Promise<UpdateChanges> {\n const installed = await this.getCurrentVersion();\n const packageVersion = this.getPackageVersion();\n\n // If no version file exists, treat as fresh install\n if (!installed) {\n return {\n hasUpdate: true,\n fromVersion: 'none',\n toVersion: packageVersion,\n newSkills: [],\n modifiedSkills: [],\n removedSkills: [],\n conflicts: [],\n configChanges: ['Initial version tracking']\n };\n }\n\n // Compare versions (simple string comparison for now)\n const hasUpdate = installed.installedVersion !== packageVersion;\n\n if (!hasUpdate) {\n return {\n hasUpdate: false,\n fromVersion: installed.installedVersion,\n toVersion: packageVersion,\n newSkills: [],\n modifiedSkills: [],\n removedSkills: [],\n conflicts: [],\n configChanges: []\n };\n }\n\n // Detect changes\n const changes = await this.detectChanges();\n\n return {\n hasUpdate: true,\n fromVersion: installed.installedVersion,\n toVersion: packageVersion,\n ...changes\n };\n }\n\n /**\n * Detect changes between versions\n */\n async detectChanges(): Promise<{\n newSkills: SkillHash[];\n modifiedSkills: SkillHash[];\n removedSkills: SkillHash[];\n conflicts: SkillConflict[];\n configChanges: string[];\n }> {\n const globalSkillsPath = paths.skills(paths.globalConfig());\n const projectSkillsPath = paths.skills(this.config.configPath);\n\n // Get all skills from both locations\n const sourceSkills = await this.loadSkillHashes(globalSkillsPath);\n const userSkills = await this.loadSkillHashes(projectSkillsPath);\n\n const newSkills: SkillHash[] = [];\n const modifiedSkills: SkillHash[] = [];\n const removedSkills: SkillHash[] = [];\n const conflicts: SkillConflict[] = [];\n const installedSkills = new Map<string, SkillHash>();\n\n // Load installed versions (for comparison)\n const installedPath = join(paths.globalConfig(), '.installed-skills.json');\n try {\n const installedData = await readFile(installedPath, 'utf-8');\n const installedList = JSON.parse(installedData) as SkillHash[];\n installedList.forEach(skill => {\n installedSkills.set(skill.name, skill);\n });\n } catch {\n // No installed skills file yet\n }\n\n // Detect new and modified skills\n for (const sourceSkill of sourceSkills) {\n const installed = installedSkills.get(sourceSkill.name);\n const user = userSkills.find(s => s.name === sourceSkill.name);\n\n if (!installed) {\n // New skill\n newSkills.push(sourceSkill);\n } else if (installed.hash !== sourceSkill.hash) {\n // Modified skill\n modifiedSkills.push(sourceSkill);\n\n // Check for conflicts\n if (user && user.hash !== installed.hash) {\n conflicts.push({\n skillName: sourceSkill.name,\n userHash: user.hash,\n sourceHash: sourceSkill.hash,\n installedHash: installed.hash,\n userModified: user.hash !== installed.hash,\n sourceModified: sourceSkill.hash !== installed.hash\n });\n }\n }\n }\n\n // Detect removed skills\n for (const [name, installedSkill] of installedSkills.entries()) {\n const existsInSource = sourceSkills.find(s => s.name === name);\n if (!existsInSource) {\n removedSkills.push(installedSkill);\n }\n }\n\n return {\n newSkills,\n modifiedSkills,\n removedSkills,\n conflicts,\n configChanges: [] // Will be detected separately\n };\n }\n\n /**\n * Load skill hashes from directory\n */\n async loadSkillHashes(skillsPath: string): Promise<SkillHash[]> {\n const hashes: SkillHash[] = [];\n\n try {\n const loadFromDir = async (dir: string) => {\n const files = await readdir(dir);\n\n for (const file of files) {\n const filePath = join(dir, file);\n const stats = await stat(filePath);\n\n if (stats.isDirectory()) {\n // Recursively load subdirectories\n await loadFromDir(filePath);\n } else if (file.endsWith('.md')) {\n // Calculate hash for markdown file\n const hash = await this.calculateSkillHash(filePath);\n hashes.push({\n path: filePath,\n name: file.replace('.md', ''),\n hash,\n category: this.extractCategory(dir, skillsPath)\n });\n }\n }\n };\n\n await loadFromDir(skillsPath);\n } catch (error) {\n // Skills directory might not exist\n logger.debug(`Could not load skills from ${skillsPath}:`, error);\n }\n\n return hashes;\n }\n\n /**\n * Calculate hash for a skill file\n */\n async calculateSkillHash(filePath: string): Promise<string> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return createHash('sha256').update(content).digest('hex');\n } catch {\n return '';\n }\n }\n\n /**\n * Extract category from path\n */\n private extractCategory(filePath: string, basePath: string): string {\n const relative = filePath.replace(basePath + '/', '');\n const parts = relative.split('/');\n\n if (parts.length > 1) {\n return parts[0]; // First directory is category\n }\n\n return 'uncategorized';\n }\n\n /**\n * Save installed skills info\n */\n async saveInstalledSkills(skills: SkillHash[]): Promise<void> {\n const installedPath = join(paths.globalConfig(), '.installed-skills.json');\n\n try {\n await writeFile(installedPath, JSON.stringify(skills, null, 2));\n } catch (error) {\n logger.error('Failed to save installed skills info:', error);\n }\n }\n\n /**\n * Update version file\n */\n async updateVersion(version: string, migration?: MigrationHistoryEntry): Promise<void> {\n const current = await this.getCurrentVersion() || {\n installedVersion: '0.0.0',\n lastSynced: new Date().toISOString(),\n packageVersion: '0.0.0',\n migrationHistory: []\n };\n\n const updated: VersionInfo = {\n installedVersion: version,\n lastSynced: new Date().toISOString(),\n packageVersion: this.getPackageVersion(),\n migrationHistory: migration\n ? [...current.migrationHistory, migration]\n : current.migrationHistory\n };\n\n const versionPath = join(paths.globalConfig(), '.version.json');\n await writeFile(versionPath, JSON.stringify(updated, null, 2));\n }\n\n /**\n * Check if migration is needed\n */\n async needsMigration(): Promise<boolean> {\n const current = await this.getCurrentVersion();\n const packageVersion = this.getPackageVersion();\n\n // Simple version comparison\n // In a real implementation, use semver for proper comparison\n return current?.installedVersion !== packageVersion;\n }\n}\n","import { readFile, writeFile, readdir, stat, unlink, mkdir } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport { createHash } from 'crypto';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Backup manifest\n */\nexport interface BackupManifest {\n backupId: string;\n fromVersion: string;\n toVersion: string;\n timestamp: string;\n files: BackupFile[];\n success: boolean;\n}\n\n/**\n * Backup file entry\n */\nexport interface BackupFile {\n path: string;\n hash: string;\n size: number;\n}\n\n/**\n * Backup information\n */\nexport interface BackupInfo {\n manifest: BackupManifest;\n path: string;\n size: number;\n}\n\n/**\n * Backup Manager - Handles creating and restoring backups\n */\nexport class BackupManager {\n private configPath: string;\n private backupsDir: string;\n private maxBackups: number;\n\n constructor(configPath: string, maxBackups: number = 5) {\n this.configPath = configPath;\n this.backupsDir = join(configPath, '.backups');\n this.maxBackups = maxBackups;\n }\n\n /**\n * Create backup before update\n */\n async createBackup(fromVersion: string, toVersion: string): Promise<string | null> {\n try {\n await mkdir(this.backupsDir, { recursive: true });\n\n const backupId = `${new Date().toISOString().replace(/[:.]/g, '-')}`;\n const backupPath = join(this.backupsDir, `${backupId}-v${toVersion}`);\n\n await mkdir(backupPath, { recursive: true });\n\n logger.info(`Creating backup: ${backupPath}`);\n\n const files: BackupFile[] = [];\n\n // Backup critical files\n const backupItems = [\n 'skills/',\n 'aikit.json',\n 'AGENTS.md',\n 'config/',\n ];\n\n for (const item of backupItems) {\n const files = await this.backupItem(this.configPath, item, backupPath);\n files.push(...files);\n }\n\n // Create manifest\n const manifest: BackupManifest = {\n backupId,\n fromVersion,\n toVersion,\n timestamp: new Date().toISOString(),\n files,\n success: true\n };\n\n const manifestPath = join(backupPath, 'backup-manifest.json');\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n\n // Cleanup old backups\n await this.cleanupOldBackups();\n\n logger.success(`✓ Backup created: ${backupId}`);\n return backupId;\n } catch (error) {\n logger.error('Failed to create backup:', error);\n return null;\n }\n }\n\n /**\n * Backup a file or directory\n */\n async backupItem(\n sourceDir: string,\n item: string,\n targetDir: string\n ): Promise<BackupFile[]> {\n const sourcePath = join(sourceDir, item);\n const targetPath = join(targetDir, item);\n const files: BackupFile[] = [];\n\n try {\n const stats = await stat(sourcePath);\n\n if (stats.isDirectory()) {\n await mkdir(targetPath, { recursive: true });\n const entries = await readdir(sourcePath);\n\n for (const entry of entries) {\n const entryFiles = await this.backupItem(sourcePath, entry, targetPath);\n files.push(...entryFiles);\n }\n } else if (stats.isFile()) {\n await mkdir(dirname(targetPath), { recursive: true });\n await this.copyFile(sourcePath, targetPath);\n\n const hash = await this.calculateHash(targetPath);\n files.push({\n path: item,\n hash,\n size: stats.size\n });\n }\n } catch (error) {\n logger.debug(`Could not backup ${item}:`, error);\n }\n\n return files;\n }\n\n /**\n * Copy file with hash calculation\n */\n private async copyFile(source: string, target: string): Promise<void> {\n const content = await readFile(source);\n await writeFile(target, content);\n }\n\n /**\n * Calculate file hash\n */\n private async calculateHash(filePath: string): Promise<string> {\n try {\n const content = await readFile(filePath);\n return createHash('sha256').update(content).digest('hex');\n } catch {\n return '';\n }\n }\n\n /**\n * List available backups\n */\n async listBackups(): Promise<BackupInfo[]> {\n try {\n const entries = await readdir(this.backupsDir);\n const backups: BackupInfo[] = [];\n\n for (const entry of entries) {\n const backupPath = join(this.backupsDir, entry);\n const manifestPath = join(backupPath, 'backup-manifest.json');\n\n try {\n const manifestContent = await readFile(manifestPath, 'utf-8');\n const manifest = JSON.parse(manifestContent) as BackupManifest;\n\n const size = await this.calculateBackupSize(backupPath);\n\n backups.push({\n manifest,\n path: backupPath,\n size\n });\n } catch {\n // Invalid backup, skip\n }\n }\n\n // Sort by timestamp (newest first)\n backups.sort((a, b) =>\n new Date(b.manifest.timestamp).getTime() - new Date(a.manifest.timestamp).getTime()\n );\n\n return backups;\n } catch {\n return [];\n }\n }\n\n /**\n * Calculate backup directory size\n */\n private async calculateBackupSize(backupPath: string): Promise<number> {\n let totalSize = 0;\n\n try {\n const calculate = async (dir: string): Promise<void> => {\n const entries = await readdir(dir);\n\n for (const entry of entries) {\n const entryPath = join(dir, entry);\n const stats = await stat(entryPath);\n\n if (stats.isDirectory()) {\n await calculate(entryPath);\n } else {\n totalSize += stats.size;\n }\n }\n };\n\n await calculate(backupPath);\n } catch {\n // Return 0 if calculation fails\n }\n\n return totalSize;\n }\n\n /**\n * Restore from backup\n */\n async restoreBackup(backupId: string): Promise<boolean> {\n try {\n const backups = await this.listBackups();\n const backup = backups.find(b => b.manifest.backupId === backupId);\n\n if (!backup) {\n logger.error(`Backup not found: ${backupId}`);\n return false;\n }\n\n logger.info(`Restoring from backup: ${backupId}`);\n\n // Validate backup integrity\n const isValid = await this.validateBackup(backup);\n if (!isValid) {\n logger.error('Backup validation failed');\n return false;\n }\n\n // Restore each file\n for (const file of backup.manifest.files) {\n const sourcePath = join(backup.path, file.path);\n const targetPath = join(this.configPath, file.path);\n\n await mkdir(dirname(targetPath), { recursive: true });\n await this.copyFile(sourcePath, targetPath);\n }\n\n logger.success(`✓ Backup restored: ${backupId}`);\n return true;\n } catch (error) {\n logger.error('Failed to restore backup:', error);\n return false;\n }\n }\n\n /**\n * Validate backup integrity\n */\n async validateBackup(backup: BackupInfo): Promise<boolean> {\n try {\n // Check manifest exists and is valid JSON\n const manifestPath = join(backup.path, 'backup-manifest.json');\n await readFile(manifestPath, 'utf-8');\n\n // Check if all files exist\n for (const file of backup.manifest.files) {\n const filePath = join(backup.path, file.path);\n await stat(filePath);\n\n // Verify hash\n const currentHash = await this.calculateHash(filePath);\n if (currentHash !== file.hash) {\n logger.warn(`File hash mismatch: ${file.path}`);\n return false;\n }\n }\n\n return true;\n } catch (error) {\n logger.debug('Backup validation failed:', error);\n return false;\n }\n }\n\n /**\n * Delete backup\n */\n async deleteBackup(backupId: string): Promise<boolean> {\n try {\n const backups = await this.listBackups();\n const backup = backups.find(b => b.manifest.backupId === backupId);\n\n if (!backup) {\n return false;\n }\n\n // Remove all files in backup directory\n const entries = await readdir(backup.path);\n for (const entry of entries) {\n const entryPath = join(backup.path, entry);\n const stats = await stat(entryPath);\n\n if (stats.isDirectory()) {\n // Remove recursively\n await this.removeDirectory(entryPath);\n } else {\n await unlink(entryPath);\n }\n }\n\n logger.success(`✓ Backup deleted: ${backupId}`);\n return true;\n } catch (error) {\n logger.error('Failed to delete backup:', error);\n return false;\n }\n }\n\n /**\n * Remove directory recursively\n */\n private async removeDirectory(dirPath: string): Promise<void> {\n const entries = await readdir(dirPath);\n\n for (const entry of entries) {\n const entryPath = join(dirPath, entry);\n const stats = await stat(entryPath);\n\n if (stats.isDirectory()) {\n await this.removeDirectory(entryPath);\n } else {\n await unlink(entryPath);\n }\n }\n\n await unlink(dirPath);\n }\n\n /**\n * Cleanup old backups (keep only maxBackups)\n */\n async cleanupOldBackups(): Promise<void> {\n try {\n const backups = await this.listBackups();\n\n if (backups.length <= this.maxBackups) {\n return;\n }\n\n const toDelete = backups.slice(this.maxBackups);\n\n for (const backup of toDelete) {\n await this.deleteBackup(backup.manifest.backupId);\n }\n\n logger.info(`Cleaned up ${toDelete.length} old backup(s)`);\n } catch (error) {\n logger.error('Failed to cleanup old backups:', error);\n }\n }\n\n /**\n * Format backup size for display\n */\n formatSize(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(2)} ${units[unitIndex]}`;\n }\n}\n","import { readFile, writeFile, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Migration interface\n */\nexport interface Migration {\n version: string;\n description: string;\n up(): Promise<void>;\n down(): Promise<void>;\n}\n\n/**\n * Migration history entry\n */\nexport interface MigrationHistoryEntry {\n from: string;\n to: string;\n timestamp: string;\n status: 'completed' | 'failed' | 'rolled-back';\n}\n\n/**\n * Migration Manager - Handles version migrations\n */\nexport class MigrationManager {\n private configPath: string;\n private migrationsDir: string;\n\n constructor(configPath: string) {\n this.configPath = configPath;\n this.migrationsDir = join(process.cwd(), 'src/core/migrations');\n }\n\n /**\n * Load all available migrations\n */\n async loadMigrations(): Promise<Migration[]> {\n const migrations: Migration[] = [];\n\n try {\n const files = await readdir(this.migrationsDir);\n\n for (const file of files) {\n if (file.endsWith('.js') && file.startsWith('migrate-')) {\n try {\n const module = await import(join(this.migrationsDir, file));\n // Default export or named export 'migration'\n const migration: Migration = module.default || module.migration;\n if (migration) {\n migrations.push(migration);\n }\n } catch (error) {\n logger.warn(`Failed to load migration ${file}:`, error);\n }\n }\n }\n } catch (error) {\n logger.debug('Could not load migrations:', error);\n }\n\n return migrations.sort((a, b) => a.version.localeCompare(b.version));\n }\n\n /**\n * Get applied migrations\n */\n async getAppliedMigrations(): Promise<string[]> {\n const migrationHistoryPath = join(this.configPath, '.migration-history.json');\n\n try {\n const content = await readFile(migrationHistoryPath, 'utf-8');\n const history = JSON.parse(content) as MigrationHistoryEntry[];\n\n return history\n .filter(m => m.status === 'completed')\n .map(m => m.to);\n } catch {\n return [];\n }\n }\n\n /**\n * Run pending migrations\n */\n async runPendingMigrations(): Promise<{\n success: boolean;\n applied: string[];\n failed: string[];\n }> {\n const appliedMigrations = await this.getAppliedMigrations();\n const allMigrations = await this.loadMigrations();\n\n const pendingMigrations = allMigrations.filter(\n m => !appliedMigrations.includes(m.version)\n );\n\n if (pendingMigrations.length === 0) {\n logger.info('No pending migrations');\n return { success: true, applied: [], failed: [] };\n }\n\n logger.info(`Running ${pendingMigrations.length} pending migration(s)...`);\n\n const applied: string[] = [];\n const failed: string[] = [];\n const migrationHistory: MigrationHistoryEntry[] = [];\n\n for (const migration of pendingMigrations) {\n try {\n logger.info(`Running migration: ${migration.version}`);\n logger.info(` ${migration.description}`);\n\n await migration.up();\n\n applied.push(migration.version);\n migrationHistory.push({\n from: 'previous',\n to: migration.version,\n timestamp: new Date().toISOString(),\n status: 'completed'\n });\n\n logger.success(`✓ Migration completed: ${migration.version}`);\n } catch (error) {\n logger.error(`✗ Migration failed: ${migration.version}`, error);\n failed.push(migration.version);\n\n migrationHistory.push({\n from: 'previous',\n to: migration.version,\n timestamp: new Date().toISOString(),\n status: 'failed'\n });\n\n // Stop on first failure\n break;\n }\n }\n\n // Update migration history\n await this.updateMigrationHistory(migrationHistory);\n\n return {\n success: failed.length === 0,\n applied,\n failed\n };\n }\n\n /**\n * Rollback migration\n */\n async rollbackMigration(version: string): Promise<boolean> {\n try {\n const applied = await this.getAppliedMigrations();\n\n if (!applied.includes(version)) {\n logger.error(`Migration not found in applied list: ${version}`);\n return false;\n }\n\n const allMigrations = await this.loadMigrations();\n const migration = allMigrations.find(m => m.version === version);\n\n if (!migration) {\n logger.error(`Migration file not found: ${version}`);\n return false;\n }\n\n logger.info(`Rolling back migration: ${version}`);\n\n await migration.down();\n\n // Update migration history\n await this.updateMigrationHistoryStatus(version, 'rolled-back');\n\n logger.success(`✓ Migration rolled back: ${version}`);\n return true;\n } catch (error) {\n logger.error('Failed to rollback migration:', error);\n return false;\n }\n }\n\n /**\n * Update migration history\n */\n private async updateMigrationHistory(\n entries: MigrationHistoryEntry[]\n ): Promise<void> {\n const historyPath = join(this.configPath, '.migration-history.json');\n\n try {\n let history: MigrationHistoryEntry[] = [];\n\n try {\n const content = await readFile(historyPath, 'utf-8');\n history = JSON.parse(content);\n } catch {\n // File doesn't exist yet\n }\n\n history.push(...entries);\n\n await writeFile(historyPath, JSON.stringify(history, null, 2));\n } catch (error) {\n logger.error('Failed to update migration history:', error);\n }\n }\n\n /**\n * Update migration history status\n */\n private async updateMigrationHistoryStatus(\n version: string,\n status: 'completed' | 'failed' | 'rolled-back'\n ): Promise<void> {\n const historyPath = join(this.configPath, '.migration-history.json');\n\n try {\n const content = await readFile(historyPath, 'utf-8');\n const history = JSON.parse(content) as MigrationHistoryEntry[];\n\n // Update status for matching migration\n const updated = history.map(m =>\n m.to === version ? { ...m, status } : m\n );\n\n await writeFile(historyPath, JSON.stringify(updated, null, 2));\n } catch (error) {\n logger.error('Failed to update migration history status:', error);\n }\n }\n\n /**\n * Get migration history\n */\n async getMigrationHistory(): Promise<MigrationHistoryEntry[]> {\n const historyPath = join(this.configPath, '.migration-history.json');\n\n try {\n const content = await readFile(historyPath, 'utf-8');\n return JSON.parse(content) as MigrationHistoryEntry[];\n } catch {\n return [];\n }\n }\n\n /**\n * Check if migration is needed for version\n */\n async needsMigration(_fromVersion: string): Promise<boolean> {\n const applied = await this.getAppliedMigrations();\n const allMigrations = await this.loadMigrations();\n\n // Check if there are migrations for this version range\n const pendingMigrations = allMigrations.filter(\n m => !applied.includes(m.version)\n );\n\n return pendingMigrations.length > 0;\n }\n}\n","/**\n * Skills Command Group\n * \n * Manage skills and tool configurations\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nimport { loadConfig } from '../../core/config.js';\nimport { SkillEngine } from '../../core/skills.js';\nimport { logger } from '../../utils/logger.js';\n\nexport function registerSkillsCommand(program: Command): Command {\n const skillsCmd = program\n .command('skills')\n .description('Manage skills');\n\n skillsCmd\n .command('list')\n .description('List available skills and tools with their configuration status')\n .action(async () => {\n const config = await loadConfig();\n const engine = new SkillEngine(config);\n const skills = await engine.listSkills();\n \n // Import tool config manager\n const { ToolConfigManager } = await import('../../core/tool-config.js');\n const toolConfigManager = new ToolConfigManager(config);\n const tools = await toolConfigManager.listTools();\n \n console.log(chalk.bold('\\n📚 Available Skills:\\n'));\n \n for (const skill of skills) {\n console.log(` ${chalk.cyan(skill.name)} - ${skill.description}`);\n }\n \n console.log(chalk.bold('\\n🔧 Available Tools:\\n'));\n \n for (const tool of tools) {\n let statusIcon = ' ';\n let statusText = '';\n \n if (tool.status === 'ready') {\n statusIcon = chalk.green('✓');\n statusText = chalk.gray('(ready)');\n } else if (tool.status === 'needs_config') {\n statusIcon = chalk.yellow('⚠');\n statusText = chalk.yellow('(needs config)');\n } else if (tool.status === 'error') {\n statusIcon = chalk.red('✗');\n statusText = chalk.red('(error)');\n }\n \n console.log(` ${statusIcon} ${chalk.cyan(tool.name)} - ${tool.description} ${statusText}`);\n \n if (tool.errorMessage) {\n console.log(` ${chalk.red('Error:')} ${tool.errorMessage}`);\n }\n }\n \n console.log();\n console.log(chalk.gray('Tip: Use \"aikit skills <tool-name> config\" to configure a tool\\n'));\n });\n\n skillsCmd\n .command('show <name>')\n .description('Show skill details')\n .action(async (name: string) => {\n const config = await loadConfig();\n const engine = new SkillEngine(config);\n const skill = await engine.getSkill(name);\n \n if (!skill) {\n logger.error(`Skill not found: ${name}`);\n process.exit(1);\n }\n \n console.log(chalk.bold(`\\n📖 Skill: ${skill.name}\\n`));\n console.log(chalk.gray(skill.description));\n console.log(chalk.bold('\\nWorkflow:'));\n console.log(skill.content);\n });\n\n skillsCmd\n .command('create <name>')\n .description('Create a new skill')\n .action(async (name: string) => {\n const config = await loadConfig();\n const engine = new SkillEngine(config);\n await engine.createSkill(name);\n logger.success(`Skill created: ${name}`);\n });\n\n skillsCmd\n .command('sync')\n .description('Sync global skills to project')\n .action(async () => {\n const config = await loadConfig();\n const engine = new SkillEngine(config);\n const result = await engine.syncSkillsToProject();\n \n if (result.count === 0) {\n logger.info('Skills already in sync or no global skills to sync');\n } else {\n console.log(chalk.bold(`\\n✓ Synced ${result.count} skills to project:\\n`));\n for (const skill of result.synced) {\n console.log(` ${chalk.cyan('•')} ${skill}`);\n }\n console.log();\n }\n });\n\n // Tool configuration command - supports \"config <tool-name>\"\n skillsCmd\n .command('config <tool-name>')\n .description('Configure a tool (e.g., config figma-analysis)')\n .action(async (toolName: string) => {\n await configureToolAction(toolName);\n });\n\n // Tool configuration command - supports \"<tool-name> config\" pattern\n skillsCmd\n .command('*')\n .description('Configure a tool (e.g., figma-analysis config)')\n .allowUnknownOption()\n .action(async () => {\n // Parse arguments manually from process.argv\n const args = process.argv.slice(process.argv.indexOf('skills') + 1);\n const toolName = args[0];\n const action = args[1];\n \n // Only handle if action is 'config', otherwise show error\n if (action === 'config' && toolName) {\n await configureToolAction(toolName);\n } else {\n // Not a tool config command, show help\n logger.error(`Unknown command: ${toolName || 'unknown'} ${action || ''}`);\n console.log(chalk.gray('\\nAvailable commands:'));\n console.log(' aikit skills list - List all skills and tools');\n console.log(' aikit skills show <name> - Show skill details');\n console.log(' aikit skills config <tool-name> - Configure a tool');\n console.log(' aikit skills <tool-name> config - Configure a tool (alternative syntax)');\n console.log();\n process.exit(1);\n }\n });\n\n return skillsCmd;\n}\n\n/**\n * Configure a tool action\n */\nasync function configureToolAction(toolName: string): Promise<void> {\n const config = await loadConfig();\n const { ToolConfigManager } = await import('../../core/tool-config.js');\n const toolConfigManager = new ToolConfigManager(config);\n \n const tool = await toolConfigManager.getToolConfig(toolName);\n \n if (!tool) {\n logger.error(`Tool not found: ${toolName}`);\n console.log(chalk.gray('\\nAvailable tools:'));\n const tools = await toolConfigManager.listTools();\n for (const t of tools) {\n console.log(` - ${chalk.cyan(t.name)}`);\n }\n console.log();\n console.log(chalk.gray('Tip: If you meant to show a skill, use: aikit skills show <name>'));\n console.log();\n process.exit(1);\n }\n \n console.log(chalk.bold(`\\n🔧 Configuring: ${tool.name}\\n`));\n console.log(chalk.gray(tool.description));\n console.log();\n \n if (tool.configMethod === 'oauth') {\n // Use OAuth flow\n if (toolName === 'figma-analysis') {\n const { FigmaOAuth } = await import('../../core/auth/figma-oauth.js');\n const oauth = new FigmaOAuth(toolConfigManager);\n \n try {\n const token = await oauth.authenticate();\n \n // Validate token\n console.log(chalk.gray('\\nValidating token...'));\n const isValid = await oauth.validateToken(token);\n \n if (isValid) {\n logger.success(`\\n✅ ${tool.name} configured successfully!`);\n console.log(chalk.gray('\\nYou can now use the /analyze-figma command in OpenCode.\\n'));\n } else {\n await toolConfigManager.updateToolConfig(toolName, {\n status: 'error',\n errorMessage: 'Token validation failed',\n });\n logger.error('Token validation failed. Please try again.');\n process.exit(1);\n }\n } catch (error) {\n await toolConfigManager.updateToolConfig(toolName, {\n status: 'error',\n errorMessage: error instanceof Error ? error.message : String(error),\n });\n logger.error(`Configuration failed: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n } else {\n logger.error(`OAuth flow not implemented for tool: ${toolName}`);\n process.exit(1);\n }\n } else if (tool.configMethod === 'manual') {\n // Manual configuration\n logger.info('Manual configuration not yet implemented');\n process.exit(1);\n } else {\n logger.info(`Tool ${tool.name} does not require configuration`);\n }\n}\n\n\n\n\n","/**\n * Miscellaneous Commands\n * \n * Contains smaller command groups:\n * - agents: Manage agents\n * - commands: Manage commands\n * - mode: Manage AIKit mode\n * - tools: Manage custom tools\n * - plugins: Manage plugins\n * - memory: Manage persistent memory\n * - beads: Beads task management\n * - status: Show AIKit status\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { readFile, writeFile } from 'fs/promises';\nimport { join } from 'path';\n\nimport { VERSION } from '../../index.js';\nimport { loadConfig } from '../../core/config.js';\nimport { AgentManager } from '../../core/agents.js';\nimport { CommandRunner } from '../../core/commands.js';\nimport { ToolRegistry } from '../../core/tools.js';\nimport { PluginSystem } from '../../core/plugins.js';\nimport { MemoryManager } from '../../core/memory.js';\nimport { BeadsIntegration } from '../../core/beads.js';\nimport { SkillEngine } from '../../core/skills.js';\nimport { logger } from '../../utils/logger.js';\nimport { groupBy } from '../helpers.js';\n\n/**\n * Register agents command group\n */\nexport function registerAgentsCommand(program: Command): Command {\n const agentsCmd = program\n .command('agents')\n .description('Manage agents');\n\n agentsCmd\n .command('list')\n .description('List available agents')\n .action(async () => {\n const config = await loadConfig();\n const manager = new AgentManager(config);\n const agents = manager.listAgents();\n \n console.log(chalk.bold('\\n🤖 Available Agents:\\n'));\n \n for (const agent of agents) {\n console.log(` ${chalk.cyan(`@${agent.name}`)} - ${agent.description}`);\n console.log(chalk.gray(` Use when: ${agent.useWhen}`));\n }\n console.log();\n });\n\n return agentsCmd;\n}\n\n/**\n * Register commands command group\n */\nexport function registerCommandsCommand(program: Command): Command {\n const commandsCmd = program\n .command('commands')\n .description('Manage commands');\n\n commandsCmd\n .command('list')\n .description('List available commands')\n .action(async () => {\n const config = await loadConfig();\n const runner = new CommandRunner(config);\n const commands = await runner.listCommands();\n \n console.log(chalk.bold('\\n⚡ Available Commands:\\n'));\n \n const groups = groupBy(commands, (c) => c.category);\n for (const [category, cmds] of Object.entries(groups)) {\n console.log(chalk.bold.yellow(`\\n ${category}:`));\n for (const cmd of cmds) {\n console.log(` ${chalk.cyan(`/${cmd.name}`)} - ${cmd.description}`);\n }\n }\n console.log();\n });\n\n return commandsCmd;\n}\n\n/**\n * Register mode command group\n */\nexport function registerModeCommand(program: Command): Command {\n const modeCmd = program\n .command('mode')\n .description('Manage AIKit mode');\n\n modeCmd\n .command('get')\n .description('Get current AIKit mode')\n .action(async () => {\n const config = await loadConfig();\n const { mode } = config;\n \n console.log(chalk.bold('\\n📋 Current Mode:\\n'));\n console.log(` ${chalk.cyan(mode || 'build')}`);\n console.log();\n \n console.log(chalk.bold('Available Modes:\\n'));\n console.log(` ${chalk.cyan('plan')} - Create detailed implementation plans`);\n console.log(` ${chalk.cyan('build')} - Direct execution mode`);\n console.log(` ${chalk.cyan('one-shot')} - End-to-end autonomous execution`);\n console.log();\n \n console.log(chalk.gray('Use \"aikit mode set <mode>\" to change mode.'));\n });\n\n modeCmd\n .command('set <mode>')\n .description('Set AIKit mode (plan, build, one-shot)')\n .action(async (mode) => {\n const config = await loadConfig();\n const configPath = config.configPath;\n \n try {\n // Validate mode\n const validModes = ['plan', 'build', 'one-shot'];\n if (!validModes.includes(mode)) {\n console.log(chalk.red(`Invalid mode. Available modes: ${validModes.join(', ')}`));\n return;\n }\n \n // Update config\n const configData = JSON.parse(await readFile(join(configPath, 'aikit.json'), 'utf-8'));\n configData.mode = mode;\n await writeFile(join(configPath, 'aikit.json'), JSON.stringify(configData, null, 2));\n \n console.log(chalk.green(`✓ Mode set to: ${mode}`));\n console.log(chalk.gray(`Configuration updated at: ${configPath}/aikit.json`));\n } catch (error) {\n console.log(chalk.red(`Failed to set mode: ${error instanceof Error ? error.message : String(error)}`));\n }\n });\n\n return modeCmd;\n}\n\n/**\n * Register tools command group\n */\nexport function registerToolsCommand(program: Command): Command {\n const toolsCmd = program\n .command('tools')\n .description('Manage custom tools');\n\n toolsCmd\n .command('list')\n .description('List available tools')\n .action(async () => {\n const config = await loadConfig();\n const registry = new ToolRegistry(config);\n const tools = await registry.listTools();\n \n console.log(chalk.bold('\\n🔧 Available Tools:\\n'));\n \n for (const tool of tools) {\n console.log(` ${chalk.cyan(tool.name)} - ${tool.description}`);\n }\n console.log();\n });\n\n return toolsCmd;\n}\n\n/**\n * Register plugins command group\n */\nexport function registerPluginsCommand(program: Command): Command {\n const pluginsCmd = program\n .command('plugins')\n .description('Manage plugins');\n\n pluginsCmd\n .command('list')\n .description('List available plugins')\n .action(async () => {\n const config = await loadConfig();\n const system = new PluginSystem(config);\n const plugins = await system.listPlugins();\n \n console.log(chalk.bold('\\n🔌 Available Plugins:\\n'));\n \n for (const plugin of plugins) {\n const status = plugin.enabled ? chalk.green('✓') : chalk.gray('○');\n console.log(` ${status} ${chalk.cyan(plugin.name)} - ${plugin.description}`);\n }\n console.log();\n });\n\n return pluginsCmd;\n}\n\n/**\n * Register memory command group\n */\nexport function registerMemoryCommand(program: Command): Command {\n const memoryCmd = program\n .command('memory')\n .description('Manage persistent memory');\n\n memoryCmd\n .command('list')\n .description('List memory entries')\n .action(async () => {\n const config = await loadConfig();\n const memory = new MemoryManager(config);\n const entries = await memory.list();\n \n console.log(chalk.bold('\\n🧠 Memory Entries:\\n'));\n \n for (const entry of entries) {\n console.log(` ${chalk.cyan(entry.key)} - ${entry.summary}`);\n console.log(chalk.gray(` Updated: ${entry.updatedAt}`));\n }\n console.log();\n });\n\n memoryCmd\n .command('read <key>')\n .description('Read a memory entry')\n .action(async (key: string) => {\n const config = await loadConfig();\n const memory = new MemoryManager(config);\n const content = await memory.read(key);\n \n if (!content) {\n logger.error(`Memory entry not found: ${key}`);\n process.exit(1);\n }\n \n console.log(content);\n });\n\n return memoryCmd;\n}\n\n/**\n * Register beads command group\n */\nexport function registerBeadsCommand(program: Command): Command {\n const beadsCmd = program\n .command('beads')\n .description('Beads task management integration');\n\n beadsCmd\n .command('status')\n .description('Show current Beads status')\n .action(async () => {\n const beads = new BeadsIntegration();\n const status = await beads.getStatus();\n \n console.log(chalk.bold('\\n📿 Beads Status:\\n'));\n console.log(` Active tasks: ${status.activeTasks}`);\n console.log(` Completed: ${status.completedTasks}`);\n console.log(` Current: ${status.currentTask || 'None'}`);\n console.log();\n });\n\n return beadsCmd;\n}\n\n/**\n * Register status command\n */\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Show AIKit status')\n .action(async () => {\n console.log(chalk.bold(`\\n🚀 AIKit v${VERSION()}\\n`));\n \n try {\n const config = await loadConfig();\n console.log(chalk.green('✓ Configuration loaded'));\n \n const skillEngine = new SkillEngine(config);\n const skills = await skillEngine.listSkills();\n console.log(` Skills: ${skills.length}`);\n \n const agentManager = new AgentManager(config);\n const agents = agentManager.listAgents();\n console.log(` Agents: ${agents.length}`);\n \n const commandRunner = new CommandRunner(config);\n const commands = await commandRunner.listCommands();\n console.log(` Commands: ${commands.length}`);\n \n const toolRegistry = new ToolRegistry(config);\n const tools = await toolRegistry.listTools();\n console.log(` Tools: ${tools.length}`);\n \n const beads = new BeadsIntegration();\n const beadsStatus = await beads.isInstalled();\n console.log(` Beads: ${beadsStatus ? chalk.green('Installed') : chalk.yellow('Not installed')}`);\n \n } catch (error) {\n console.log(chalk.yellow('⚠ AIKit not initialized. Run \"aikit init\" to get started.'));\n }\n \n console.log();\n });\n}\n\n","/**\n * Session Commands\n *\n * Manages development sessions for tracking work progress\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\n\nimport {\n startSession,\n updateSession,\n endSession,\n showCurrentSession,\n listSessions,\n showSession,\n searchSessions,\n} from '../helpers.js';\n\n/**\n * Register session command group\n */\nexport function registerSessionCommand(program: Command): Command {\n const sessionCmd = program\n .command('session')\n .description('Manage development sessions');\n\n // Start a new session\n sessionCmd\n .command('start [name]')\n .description('Start a new development session')\n .option('-g, --goals <goals...>', 'Session goals')\n .action(async (name, options) => {\n await startSession(name, options.goals);\n });\n\n // Update current session\n sessionCmd\n .command('update [notes]')\n .description('Add progress notes to current session')\n .action(async (notes) => {\n await updateSession(notes);\n });\n\n // End current session\n sessionCmd\n .command('end')\n .description('End current session with summary')\n .action(async () => {\n await endSession();\n });\n\n // Show current session\n sessionCmd\n .command('current')\n .description('Show current active session')\n .action(async () => {\n await showCurrentSession();\n });\n\n // List all sessions\n sessionCmd\n .command('list')\n .description('List all sessions')\n .action(async () => {\n await listSessions();\n });\n\n // Show specific session\n sessionCmd\n .command('show <sessionId>')\n .description('Show details of a specific session')\n .action(async (sessionId) => {\n await showSession(sessionId);\n });\n\n // Search sessions\n sessionCmd\n .command('search <query>')\n .description('Search sessions by keyword')\n .action(async (query) => {\n await searchSessions(query);\n });\n\n return sessionCmd;\n}\n"],"mappings":"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","names":["fileURLToPath","join","__filename","__dirname","join","readFile","writeFile","mkdir","access","constants","join","readdir","dirname","writeFile","mkdir","join","existsSync","imageUrl","readFile","readdir","join","existsSync","readFile","writeFile","readdir","access","constants","mkdir","existsSync","join","MemoryManager","loadConfig","readFile","writeFile","readdir","mkdir","join","matter","exec","promisify","execAsync","readFile","writeFile","mkdir","access","constants","join","z","inquirer","Command","readFile","join","readFile","readdir","writeFile","mkdir","join","basename","extname","matter","join","mkdir","matter","writeFile","readdir","extname","readFile","basename","readdir","writeFile","mkdir","join","extname","z","MemoryManager","FigmaMcpClient","checkCurrentCodeStatus","compareCodeWithFigma","join","BeadsIntegration","mkdir","writeFile","readdir","extname","readdir","writeFile","mkdir","join","basename","extname","exec","promisify","execAsync","chalk","existsSync","join","homedir","CliPlatform","join","homedir","existsSync","existsSync","mkdir","writeFile","readFile","access","join","dirname","homedir","fileURLToPath","execSync","mkdir","join","writeFile","fileURLToPath","dirname","homedir","existsSync","readFile","execSync","access","matter","SessionManager","readFile","writeFile","mkdir","access","join","matter","writeFile","mkdir","join","matter","program","chalk","inquirer","program","inquirer","chalk","readFile","writeFile","mkdir","join","dirname","inquirer","chalk","readFile","readdir","writeFile","join","join","readFile","readdir","writeFile","readFile","writeFile","readdir","stat","mkdir","join","dirname","createHash","files","readFile","writeFile","readdir","join","chalk","inquirer","join","mkdir","dirname","readFile","writeFile","program","chalk","chalk","program","ToolConfigManager","chalk","FigmaOAuth","chalk","readFile","writeFile","join","program","chalk","readFile","join","writeFile","program","Command"]}