lean-spec 0.2.7 → 0.2.8
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/backfill-QIQLXSUG.js +5 -0
- package/dist/backfill-QIQLXSUG.js.map +1 -0
- package/dist/chunk-A6JDTXPV.js +444 -0
- package/dist/chunk-A6JDTXPV.js.map +1 -0
- package/dist/{chunk-Q6B3LVO7.js → chunk-EBSQ7FUR.js} +2257 -5168
- package/dist/chunk-EBSQ7FUR.js.map +1 -0
- package/dist/chunk-FUIUCGUV.js +3063 -0
- package/dist/chunk-FUIUCGUV.js.map +1 -0
- package/dist/chunk-LXOJW2FE.js +298 -0
- package/dist/chunk-LXOJW2FE.js.map +1 -0
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/mcp-server.js +4 -1
- package/dist/validate-PT6GAS57.js +5 -0
- package/dist/validate-PT6GAS57.js.map +1 -0
- package/package.json +2 -2
- package/templates/detailed/AGENTS.md +4 -19
- package/templates/detailed/README.md +3 -3
- package/templates/examples/api-refactor/README.md +1 -1
- package/templates/examples/dark-theme/README.md +1 -1
- package/templates/examples/dashboard-widgets/README.md +1 -1
- package/templates/standard/AGENTS.md +4 -19
- package/templates/standard/README.md +1 -2
- package/dist/chunk-Q6B3LVO7.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/spec-loader.ts","../src/utils/path-helpers.ts","../src/utils/safe-output.ts","../src/utils/ui.ts","../src/commands/check.ts","../src/utils/cli-helpers.ts","../src/commands/update.ts","../src/utils/colors.ts","../src/commands/agent.ts","../../core/src/parsers/frontmatter.ts","../../core/src/parsers/markdown-parser.ts","../../core/src/utils/token-counter.ts","../../core/src/validators/complexity.ts","../../core/src/utils/dependency-graph.ts","../../core/src/search/scoring.ts","../../core/src/search/context.ts","../../core/src/search/query-parser.ts","../../core/src/search/engine.ts","../src/mcp/helpers.ts","../src/mcp/tools/agent.ts","../src/utils/variable-resolver.ts","../src/commands/link.ts","../src/commands/create.ts","../src/commands/archive.ts","../src/utils/pattern-detection.ts","../src/commands/list.ts","../src/commands/unlink.ts","../src/utils/git-timestamps.ts","../src/commands/backfill.ts","../src/commands/templates.ts","../src/utils/template-helpers.ts","../src/utils/examples.ts","../src/commands/init.ts","../src/commands/files.ts","../src/commands/examples.ts","../src/validators/frontmatter.ts","../src/validators/structure.ts","../src/validators/corruption.ts","../src/validators/sub-spec.ts","../src/validators/dependency-alignment.ts","../src/utils/validate-formatter.ts","../src/commands/validate.ts","../src/commands/migrate.ts","../src/utils/completion.ts","../src/utils/velocity.ts","../src/commands/board.ts","../src/utils/spec-stats.ts","../src/utils/insights.ts","../src/commands/stats.ts","../src/commands/search.ts","../src/commands/deps.ts","../src/commands/timeline.ts","../src/commands/gantt.ts","../src/commands/tokens.ts","../src/commands/analyze.ts","../src/commands/split.ts","../src/commands/compact.ts","../src/commands/viewer.ts","../src/commands/mcp.ts","../src/utils/package-manager.ts","../src/commands/ui.ts","../src/mcp/tools/archive.ts","../src/mcp/tools/backfill.ts","../src/mcp/tools/board.ts","../src/mcp/tools/check.ts","../src/mcp/tools/create.ts","../src/mcp/tools/deps.ts","../src/mcp/tools/files.ts","../src/mcp/tools/list.ts","../src/mcp/tools/search.ts","../src/mcp/tools/stats.ts","../src/mcp/tools/tokens.ts","../src/mcp/tools/update.ts","../src/mcp/tools/validate.ts","../src/mcp/tools/view.ts","../src/mcp/tools/registry.ts","../src/mcp/resources/board.ts","../src/mcp/resources/spec.ts","../src/mcp/resources/stats.ts","../src/mcp/resources/registry.ts","../src/mcp/prompts/plan-project-roadmap.ts","../src/mcp/prompts/project-progress-overview.ts","../src/mcp/prompts/sdd-checkpoint.ts","../src/mcp/prompts/spec-creation-workflow.ts","../src/mcp/prompts/update-spec-status.ts","../src/mcp/prompts/registry.ts","../src/mcp-server.ts"],"names":["path","fs","fs2","path2","stat","aDate","bDate","fs3","path3","result","path4","chalk","Command","path5","resolve","fs4","path6","normalizeDateFields","fs5","path7","matter","highlights","start","path8","fs6","packageJson","path9","parseFrontmatter","path10","fs7","yaml","enrichWithTimestamps","path11","fs8","path12","fs9","path13","execSync","path14","path15","fs10","path16","getProjectName","fs12","projectName","path18","readmeStat","fs13","readmeContent","readmeTokens","listExamples","path19","errorCount","warningCount","path20","fs14","fs15","path21","dayjs","stripAnsi","showStats","showTimeline","labelWidth","barWidth","createBar","path22","STATUS_CONFIG","PRIORITY_CONFIG","specs","path23","path24","readFile","path27","writeFile","path28","validateNoOverlaps","displayDryRun","path29","fs16","spawn","detectPackageManager","join","existsSync","ora","args","z","path30","path31","ResourceTemplate","fileURLToPath","__dirname","dirname","readFileSync","StdioServerTransport"],"mappings":"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","file":"chunk-Q6B3LVO7.js","sourcesContent":["import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface LeanSpecConfig {\n template: string;\n templates?: Record<string, string>; // Maps template name to filename\n specsDir: string;\n autoCheck?: boolean; // Enable/disable auto-check for sequence conflicts (default: true)\n structure: {\n pattern: 'flat' | 'custom' | string; // 'flat' or 'custom', or legacy pattern string\n dateFormat: string;\n sequenceDigits: number;\n defaultFile: string;\n prefix?: string; // For flat pattern: \"{YYYYMMDD}-\" or \"spec-\" (optional, default: empty for global numbering)\n groupExtractor?: string; // For custom pattern: \"{YYYYMMDD}\" or \"milestone-{milestone}\"\n groupFallback?: string; // Fallback folder if field missing (only for non-date extractors)\n };\n features?: {\n aiAgents?: boolean;\n examples?: boolean;\n collaboration?: boolean;\n compliance?: boolean;\n approvals?: boolean;\n apiDocs?: boolean;\n };\n frontmatter?: {\n required?: string[];\n optional?: string[];\n custom?: Record<string, 'string' | 'number' | 'boolean' | 'array'>;\n };\n variables?: Record<string, string>;\n}\n\nconst DEFAULT_CONFIG: LeanSpecConfig = {\n template: 'spec-template.md',\n templates: {\n default: 'spec-template.md',\n },\n specsDir: 'specs',\n structure: {\n pattern: 'flat', // Default to flat for new projects\n prefix: '', // No prefix by default - global sequence numbers only\n dateFormat: 'YYYYMMDD',\n sequenceDigits: 3,\n defaultFile: 'README.md',\n },\n features: {\n aiAgents: true,\n examples: true,\n },\n};\n\nexport async function loadConfig(cwd: string = process.cwd()): Promise<LeanSpecConfig> {\n const configPath = path.join(cwd, '.lean-spec', 'config.json');\n\n try {\n const content = await fs.readFile(configPath, 'utf-8');\n const userConfig = JSON.parse(content);\n const merged = { ...DEFAULT_CONFIG, ...userConfig };\n \n // Normalize legacy pattern format\n normalizeLegacyPattern(merged);\n \n return merged;\n } catch {\n // No config file, use defaults\n return DEFAULT_CONFIG;\n }\n}\n\nexport async function saveConfig(\n config: LeanSpecConfig,\n cwd: string = process.cwd(),\n): Promise<void> {\n const configDir = path.join(cwd, '.lean-spec');\n const configPath = path.join(configDir, 'config.json');\n\n await fs.mkdir(configDir, { recursive: true });\n await fs.writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n}\n\nexport function getToday(format: string = 'YYYYMMDD'): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n\n switch (format) {\n case 'YYYYMMDD':\n return `${year}${month}${day}`;\n case 'YYYY-MM-DD':\n return `${year}-${month}-${day}`;\n case 'YYYY-MM':\n return `${year}-${month}`;\n case 'YYYY/MM':\n return `${year}/${month}`;\n case 'YYYY':\n return String(year);\n case 'MM':\n return month;\n case 'DD':\n return day;\n default:\n return `${year}${month}${day}`;\n }\n}\n\n/**\n * Detect if a config uses legacy pattern format and convert it\n */\nexport function normalizeLegacyPattern(config: LeanSpecConfig): void {\n const pattern = config.structure.pattern;\n \n // If pattern contains {date}/{seq}-{name}/, convert to custom with date grouping\n if (pattern && pattern.includes('{date}') && pattern.includes('{seq}') && pattern.includes('{name}')) {\n config.structure.pattern = 'custom';\n config.structure.groupExtractor = `{${config.structure.dateFormat}}`;\n }\n}\n\n/**\n * Resolve prefix string for flat pattern (e.g., \"{YYYYMMDD}-\" becomes \"20251103-\")\n */\nexport function resolvePrefix(\n prefix: string,\n dateFormat: string = 'YYYYMMDD'\n): string {\n const dateReplacements: Record<string, () => string> = {\n '{YYYYMMDD}': () => getToday('YYYYMMDD'),\n '{YYYY-MM-DD}': () => getToday('YYYY-MM-DD'),\n '{YYYY-MM}': () => getToday('YYYY-MM'),\n '{YYYY}': () => getToday('YYYY'),\n '{MM}': () => getToday('MM'),\n '{DD}': () => getToday('DD'),\n };\n\n let result = prefix;\n for (const [pattern, fn] of Object.entries(dateReplacements)) {\n result = result.replace(pattern, fn());\n }\n\n return result;\n}\n\n/**\n * Extract group folder from extractor pattern\n */\nexport function extractGroup(\n extractor: string,\n dateFormat: string = 'YYYYMMDD',\n fields?: Record<string, unknown>,\n fallback?: string\n): string {\n const dateReplacements: Record<string, () => string> = {\n '{YYYYMMDD}': () => getToday('YYYYMMDD'),\n '{YYYY-MM-DD}': () => getToday('YYYY-MM-DD'),\n '{YYYY-MM}': () => getToday('YYYY-MM'),\n '{YYYY}': () => getToday('YYYY'),\n '{MM}': () => getToday('MM'),\n '{DD}': () => getToday('DD'),\n };\n\n let result = extractor;\n\n // Replace date functions first\n for (const [pattern, fn] of Object.entries(dateReplacements)) {\n result = result.replace(pattern, fn());\n }\n\n // Replace frontmatter fields: {fieldname}\n const fieldMatches = result.match(/\\{([^}]+)\\}/g);\n if (fieldMatches) {\n for (const match of fieldMatches) {\n const fieldName = match.slice(1, -1); // Remove { }\n const fieldValue = fields?.[fieldName];\n\n if (fieldValue === undefined) {\n if (!fallback) {\n throw new Error(`Custom field '${fieldName}' required but not provided. Set structure.groupFallback in config or provide --field ${fieldName}=<value>`);\n }\n return fallback;\n }\n\n result = result.replace(match, String(fieldValue));\n }\n }\n\n return result;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { loadConfig } from './config.js';\nimport { parseFrontmatter, getSpecFile, matchesFilter, type SpecFrontmatter, type SpecFilterOptions } from './frontmatter.js';\n\nexport interface SpecInfo {\n path: string; // Relative path like \"20251101/003-pm-visualization-tools\"\n fullPath: string; // Absolute path to spec directory\n filePath: string; // Absolute path to spec file (README.md)\n name: string; // Just the spec name like \"003-pm-visualization-tools\"\n date?: string; // Date folder like \"20251101\" (optional for flat/nested patterns)\n frontmatter: SpecFrontmatter;\n content?: string; // Full file content (optional, for search)\n subFiles?: SubFileInfo[]; // Sub-documents and assets\n}\n\nexport interface SubFileInfo {\n name: string; // e.g., \"TESTING.md\" or \"diagram.png\"\n path: string; // Absolute path to the file\n size: number; // File size in bytes\n type: 'document' | 'asset'; // Classification based on file type\n content?: string; // Optional content for documents\n}\n\n// Load sub-files for a spec (all files except README.md)\nexport async function loadSubFiles(\n specDir: string,\n options: { includeContent?: boolean } = {}\n): Promise<SubFileInfo[]> {\n const subFiles: SubFileInfo[] = [];\n\n try {\n const entries = await fs.readdir(specDir, { withFileTypes: true });\n\n for (const entry of entries) {\n // Skip README.md (main spec file)\n if (entry.name === 'README.md') continue;\n\n // Skip directories for now (could be assets folder)\n if (entry.isDirectory()) continue;\n\n const filePath = path.join(specDir, entry.name);\n const stat = await fs.stat(filePath);\n\n // Determine type based on extension\n const ext = path.extname(entry.name).toLowerCase();\n const isDocument = ext === '.md';\n\n const subFile: SubFileInfo = {\n name: entry.name,\n path: filePath,\n size: stat.size,\n type: isDocument ? 'document' : 'asset',\n };\n\n // Load content for documents if requested\n if (isDocument && options.includeContent) {\n subFile.content = await fs.readFile(filePath, 'utf-8');\n }\n\n subFiles.push(subFile);\n }\n } catch (error) {\n // Directory doesn't exist or can't be read - return empty array\n // This is expected for specs without sub-files\n return [];\n }\n\n // Sort: documents first, then alphabetically\n return subFiles.sort((a, b) => {\n if (a.type !== b.type) {\n return a.type === 'document' ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n}\n\n// Load all specs from the specs directory\nexport async function loadAllSpecs(options: {\n includeArchived?: boolean;\n includeContent?: boolean;\n includeSubFiles?: boolean;\n filter?: SpecFilterOptions;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n} = {}): Promise<SpecInfo[]> {\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n\n const specs: SpecInfo[] = [];\n\n // Check if specs directory exists\n try {\n await fs.access(specsDir);\n } catch {\n return [];\n }\n\n // Pattern to match spec directories (2 or more digits followed by dash)\n const specPattern = /^(\\d{2,})-/;\n\n // Recursively load all specs from the directory structure\n async function loadSpecsFromDir(dir: string, relativePath: string = ''): Promise<void> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n \n // Skip archived directory in main scan (handle separately)\n if (entry.name === 'archived' && relativePath === '') continue;\n \n const entryPath = path.join(dir, entry.name);\n const entryRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;\n \n // Check if this is a spec directory (NNN-name format)\n if (specPattern.test(entry.name)) {\n const specFile = await getSpecFile(entryPath, config.structure.defaultFile);\n \n if (specFile) {\n const frontmatter = await parseFrontmatter(specFile, config);\n \n if (frontmatter) {\n // Apply filter if provided\n if (options.filter && !matchesFilter(frontmatter, options.filter)) {\n continue;\n }\n \n // Extract date from path or frontmatter\n const dateMatch = entryRelativePath.match(/(\\d{8})/);\n let date: string;\n \n if (dateMatch) {\n date = dateMatch[1];\n } else if (typeof frontmatter.created === 'string') {\n date = frontmatter.created;\n } else if (frontmatter.created) {\n date = String(frontmatter.created);\n } else {\n date = '';\n }\n \n const specInfo: SpecInfo = {\n path: entryRelativePath,\n fullPath: entryPath,\n filePath: specFile,\n name: entry.name,\n date: date,\n frontmatter,\n };\n \n // Load content if requested\n if (options.includeContent) {\n specInfo.content = await fs.readFile(specFile, 'utf-8');\n }\n \n // Load sub-files if requested\n if (options.includeSubFiles) {\n specInfo.subFiles = await loadSubFiles(entryPath, {\n includeContent: options.includeContent,\n });\n }\n \n specs.push(specInfo);\n }\n }\n } else {\n // Not a spec directory, scan recursively for nested structure\n await loadSpecsFromDir(entryPath, entryRelativePath);\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n }\n \n // Load active specs\n await loadSpecsFromDir(specsDir);\n\n // Load archived specs if requested\n if (options.includeArchived) {\n const archivedPath = path.join(specsDir, 'archived');\n await loadSpecsFromDir(archivedPath, 'archived');\n }\n\n // Sort specs based on options (default: id desc)\n const sortBy = options.sortBy || 'id';\n const sortOrder = options.sortOrder || 'desc';\n \n specs.sort((a, b) => {\n let comparison = 0;\n \n switch (sortBy) {\n case 'id':\n case 'number': { // Keep 'number' for backwards compatibility\n // Extract leading digits from spec name\n const aNum = parseInt(a.name.match(/^(\\d+)/)?.[1] || '0', 10);\n const bNum = parseInt(b.name.match(/^(\\d+)/)?.[1] || '0', 10);\n comparison = aNum - bNum;\n break;\n }\n case 'created': {\n // Sort by created date from frontmatter\n const aDate = String(a.frontmatter.created || '');\n const bDate = String(b.frontmatter.created || '');\n comparison = aDate.localeCompare(bDate);\n break;\n }\n case 'name': {\n comparison = a.name.localeCompare(b.name);\n break;\n }\n case 'status': {\n comparison = a.frontmatter.status.localeCompare(b.frontmatter.status);\n break;\n }\n case 'priority': {\n // Priority order: critical > high > medium > low > (none)\n const priorityOrder = { critical: 4, high: 3, medium: 2, low: 1 };\n const aPriority = a.frontmatter.priority ? priorityOrder[a.frontmatter.priority] : 0;\n const bPriority = b.frontmatter.priority ? priorityOrder[b.frontmatter.priority] : 0;\n comparison = aPriority - bPriority;\n break;\n }\n default:\n // Default to created date\n const aDate = String(a.frontmatter.created || '');\n const bDate = String(b.frontmatter.created || '');\n comparison = aDate.localeCompare(bDate);\n }\n \n // Apply sort order\n return sortOrder === 'desc' ? -comparison : comparison;\n });\n\n return specs;\n}\n\n// Get a specific spec by path\nexport async function getSpec(specPath: string): Promise<SpecInfo | null> {\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n\n // Resolve the full path\n let fullPath: string;\n if (path.isAbsolute(specPath)) {\n fullPath = specPath;\n } else {\n fullPath = path.join(specsDir, specPath);\n }\n\n // Check if directory exists\n try {\n await fs.access(fullPath);\n } catch {\n return null;\n }\n\n const specFile = await getSpecFile(fullPath, config.structure.defaultFile);\n if (!specFile) return null;\n\n const frontmatter = await parseFrontmatter(specFile, config);\n if (!frontmatter) return null;\n\n const content = await fs.readFile(specFile, 'utf-8');\n\n // Parse path components\n const relativePath = path.relative(specsDir, fullPath);\n const parts = relativePath.split(path.sep);\n const date = parts[0] === 'archived' ? parts[1] : parts[0];\n const name = parts[parts.length - 1];\n\n return {\n path: relativePath,\n fullPath,\n filePath: specFile,\n name,\n date,\n frontmatter,\n content,\n };\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n/**\n * Create a regex pattern to match spec directories with sequence numbers\n * Handles optional date prefixes like 20251103-001-name\n */\nexport function createSpecDirPattern(): RegExp {\n // Match spec directories, handling optional date prefix\n // Patterns:\n // - 001-name (simple sequence)\n // - 20251103-001-name (date prefix + sequence)\n // - spec-001-name (custom prefix + sequence)\n // We look for: optional-prefix + NNN + dash + name\n // The sequence is 2-4 digits (to avoid matching 8-digit dates as sequences)\n // Requires dash followed by letter to ensure this is a spec directory name\n return /(?:^|\\D)(\\d{2,4})-[a-z]/i;\n}\n\n/**\n * Get next global sequence number across entire specs directory\n */\nexport async function getGlobalNextSeq(specsDir: string, digits: number): Promise<string> {\n try {\n // Recursively find all spec directories with sequence numbers\n const seqNumbers: number[] = [];\n const specPattern = createSpecDirPattern();\n \n async function scanDirectory(dir: string): Promise<void> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n \n // Check if this is a spec directory (NNN-name format)\n const match = entry.name.match(specPattern);\n if (match) {\n const seqNum = parseInt(match[1], 10);\n if (!isNaN(seqNum) && seqNum > 0) {\n seqNumbers.push(seqNum);\n }\n }\n \n // Skip archived directory to avoid confusion\n if (entry.name === 'archived') continue;\n \n // Recursively scan subdirectories (for custom pattern grouping)\n const subDir = path.join(dir, entry.name);\n await scanDirectory(subDir);\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n }\n \n await scanDirectory(specsDir);\n \n if (seqNumbers.length === 0) {\n return '1'.padStart(digits, '0');\n }\n \n const maxSeq = Math.max(...seqNumbers);\n return String(maxSeq + 1).padStart(digits, '0');\n } catch {\n return '1'.padStart(digits, '0');\n }\n}\n\n/**\n * Get next sequence number for a date directory (legacy, kept for backward compatibility)\n */\nexport async function getNextSeq(dateDir: string, digits: number): Promise<string> {\n try {\n const specPattern = createSpecDirPattern();\n const entries = await fs.readdir(dateDir, { withFileTypes: true });\n const seqNumbers = entries\n .filter((e) => e.isDirectory() && specPattern.test(e.name))\n .map((e) => {\n const match = e.name.match(specPattern);\n return match ? parseInt(match[1], 10) : NaN;\n })\n .filter((n) => !isNaN(n));\n\n if (seqNumbers.length === 0) {\n return '1'.padStart(digits, '0');\n }\n\n const maxSeq = Math.max(...seqNumbers);\n return String(maxSeq + 1).padStart(digits, '0');\n } catch {\n return '1'.padStart(digits, '0');\n }\n}\n\n/**\n * Resolve spec path in multiple ways:\n * 1. Absolute path as given\n * 2. Relative to current directory\n * 3. Relative to specs directory\n * 4. Search by spec name in all subdirectories (flat or grouped)\n * 5. Search by sequence number only\n */\nexport async function resolveSpecPath(\n specPath: string,\n cwd: string,\n specsDir: string\n): Promise<string | null> {\n // Try absolute path\n if (path.isAbsolute(specPath)) {\n try {\n await fs.access(specPath);\n return specPath;\n } catch {\n return null;\n }\n }\n\n // Try relative to cwd\n const cwdPath = path.resolve(cwd, specPath);\n try {\n await fs.access(cwdPath);\n return cwdPath;\n } catch {\n // Continue to next method\n }\n\n // Try relative to specs directory\n const specsPath = path.join(specsDir, specPath);\n try {\n await fs.access(specsPath);\n return specsPath;\n } catch {\n // Continue to next method\n }\n\n // Search by sequence number only (e.g., \"5\" or \"005\")\n const seqMatch = specPath.match(/^0*(\\d+)$/);\n if (seqMatch) {\n const seqNum = parseInt(seqMatch[1], 10);\n const result = await searchBySequence(specsDir, seqNum);\n if (result) return result;\n }\n\n // Last resort: search for spec name in all subdirectories\n const specName = specPath.replace(/^.*\\//, ''); // Get last part\n const result = await searchInAllDirectories(specsDir, specName);\n return result;\n}\n\n/**\n * Search for a spec by sequence number across all directories\n */\nasync function searchBySequence(specsDir: string, seqNum: number): Promise<string | null> {\n const specPattern = createSpecDirPattern();\n \n async function scanDirectory(dir: string): Promise<string | null> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n \n // Check if this matches the sequence number\n const match = entry.name.match(specPattern);\n if (match) {\n const entrySeq = parseInt(match[1], 10);\n if (entrySeq === seqNum) {\n return path.join(dir, entry.name);\n }\n }\n \n // Recursively search subdirectories (including archived)\n const subDir = path.join(dir, entry.name);\n const result = await scanDirectory(subDir);\n if (result) return result;\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n \n return null;\n }\n \n return scanDirectory(specsDir);\n}\n\n/**\n * Search for a spec by name in all subdirectories\n */\nasync function searchInAllDirectories(specsDir: string, specName: string): Promise<string | null> {\n async function scanDirectory(dir: string): Promise<string | null> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n \n // Check if this matches the spec name\n if (entry.name === specName) {\n return path.join(dir, entry.name);\n }\n \n // Recursively search subdirectories (including archived)\n const subDir = path.join(dir, entry.name);\n const result = await scanDirectory(subDir);\n if (result) return result;\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n \n return null;\n }\n \n return scanDirectory(specsDir);\n}\n","import chalk from 'chalk';\nimport stripAnsi from 'strip-ansi';\n\n/**\n * Sanitizes user input by stripping all ANSI escape sequences\n * and control characters that could be used for injection attacks.\n * \n * This prevents:\n * - ANSI injection attacks\n * - Terminal escape sequence abuse\n * - Output manipulation\n * \n * @param input - The untrusted user input to sanitize\n * @returns Sanitized string safe for display\n */\nexport function sanitizeUserInput(input: string): string {\n // Handle non-string or falsy values explicitly\n if (typeof input !== 'string') {\n return '';\n }\n \n if (!input) {\n return '';\n }\n \n // First strip any existing ANSI codes\n let sanitized = stripAnsi(input);\n \n // Remove control characters (except newlines, tabs, and carriage returns which might be intended)\n // This regex removes characters in ranges:\n // \\x00-\\x08 (NULL through BACKSPACE)\n // \\x0B-\\x0C (vertical tab, form feed)\n // \\x0E-\\x1F (shift out through unit separator)\n // \\x7F (DELETE)\n sanitized = sanitized.replace(/[\\x00-\\x08\\x0B-\\x0C\\x0E-\\x1F\\x7F]/g, '');\n \n return sanitized;\n}\n\n/**\n * Strips ANSI escape sequences from a string.\n * This is a direct wrapper around strip-ansi for convenience.\n * \n * @param text - The text to strip ANSI codes from\n * @returns Text without ANSI codes\n */\nexport function stripAnsiCodes(text: string): string {\n return stripAnsi(text);\n}\n\n/**\n * Safely logs a message with optional user content.\n * \n * @param message - The message to log (can include user content that will be sanitized)\n */\nexport function safeLog(message: string): void {\n // Sanitize the entire message to handle any user content within it\n console.log(sanitizeUserInput(message));\n}\n\n/**\n * Safely displays a success message with optional user content\n * \n * @param message - The static message template\n * @param userContent - Optional user-provided content to sanitize\n */\nexport function safeSuccess(message: string, userContent?: string): void {\n const fullMessage = userContent \n ? `${message} ${sanitizeUserInput(userContent)}`\n : message;\n console.log(chalk.green(`✓ ${fullMessage}`));\n}\n\n/**\n * Safely displays an error message with optional user content\n * \n * @param message - The static message template\n * @param userContent - Optional user-provided content to sanitize\n */\nexport function safeError(message: string, userContent?: string): void {\n const fullMessage = userContent \n ? `${message} ${sanitizeUserInput(userContent)}`\n : message;\n console.error(chalk.red(`✗ ${fullMessage}`));\n}\n\n/**\n * Safely displays a warning message with optional user content\n * \n * @param message - The static message template\n * @param userContent - Optional user-provided content to sanitize\n */\nexport function safeWarn(message: string, userContent?: string): void {\n const fullMessage = userContent \n ? `${message} ${sanitizeUserInput(userContent)}`\n : message;\n console.log(chalk.yellow(`⚠ ${fullMessage}`));\n}\n\n/**\n * Safely displays an info message with optional user content\n * \n * @param message - The static message template\n * @param userContent - Optional user-provided content to sanitize\n */\nexport function safeInfo(message: string, userContent?: string): void {\n const fullMessage = userContent \n ? `${message} ${sanitizeUserInput(userContent)}`\n : message;\n console.log(chalk.blue(`ℹ ${fullMessage}`));\n}\n\n/**\n * Safely displays a heading with user content\n * \n * @param text - The heading text (should be sanitized if user-provided)\n * @param isUserProvided - Whether the text comes from user input\n */\nexport function safeHeading(text: string, isUserProvided = false): void {\n const safeText = isUserProvided ? sanitizeUserInput(text) : text;\n console.log('');\n console.log(chalk.green.bold(safeText));\n console.log('');\n}\n\n/**\n * Safely displays a subheading with user content\n * \n * @param text - The subheading text (should be sanitized if user-provided)\n * @param isUserProvided - Whether the text comes from user input\n */\nexport function safeSubheading(text: string, isUserProvided = false): void {\n const safeText = isUserProvided ? sanitizeUserInput(text) : text;\n console.log(chalk.cyan.bold(safeText));\n}\n\n/**\n * Safely displays a hint/tip with user content\n * \n * @param message - The hint message (should be sanitized if user-provided)\n * @param isUserProvided - Whether the message comes from user input\n */\nexport function safeHint(message: string, isUserProvided = false): void {\n const safeMessage = isUserProvided ? sanitizeUserInput(message) : message;\n console.log(chalk.gray(`💡 Tip: ${safeMessage}`));\n}\n","import ora, { Ora } from 'ora';\nimport chalk from 'chalk';\nimport { sanitizeUserInput } from './safe-output.js';\n\n/**\n * Show a spinner while executing an async operation\n */\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n options?: {\n successText?: string;\n failText?: string;\n }\n): Promise<T> {\n const spinner = ora(text).start();\n \n try {\n const result = await fn();\n spinner.succeed(options?.successText || text);\n return result;\n } catch (error) {\n spinner.fail(options?.failText || `${text} failed`);\n throw error;\n }\n}\n\n/**\n * Create a spinner instance for manual control\n */\nexport function createSpinner(text: string): Ora {\n return ora(text);\n}\n\n/**\n * Display a success message\n * Note: If message contains user input, it should be pre-sanitized or passed separately\n */\nexport function success(message: string): void {\n console.log(chalk.green(`✓ ${message}`));\n}\n\n/**\n * Display an error message\n * Note: If message contains user input, it should be pre-sanitized or passed separately\n */\nexport function error(message: string): void {\n console.error(chalk.red(`✗ ${message}`));\n}\n\n/**\n * Display a warning message\n * Note: If message contains user input, it should be pre-sanitized or passed separately\n */\nexport function warning(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n}\n\n/**\n * Display an info message\n * Note: If message contains user input, it should be pre-sanitized or passed separately\n */\nexport function info(message: string): void {\n console.log(chalk.blue(`ℹ ${message}`));\n}\n\n/**\n * Display a heading\n * Note: If text contains user input, it should be pre-sanitized or passed separately\n */\nexport function heading(text: string): void {\n console.log('');\n console.log(chalk.green.bold(text));\n console.log('');\n}\n\n/**\n * Display a subheading\n * Note: If text contains user input, it should be pre-sanitized or passed separately\n */\nexport function subheading(text: string): void {\n console.log(chalk.cyan.bold(text));\n}\n\n/**\n * Display a hint/tip\n * Note: If message contains user input, it should be pre-sanitized or passed separately\n */\nexport function hint(message: string): void {\n console.log(chalk.gray(`💡 Tip: ${message}`));\n}\n\n/**\n * Helper to sanitize user input before display\n * This is exported for convenience when building messages that include user input\n */\nexport { sanitizeUserInput };\n","import * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport { createSpecDirPattern } from '../utils/path-helpers.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\n\n/**\n * Check command - check for sequence conflicts\n */\nexport function checkCommand(): Command {\n return new Command('check')\n .description('Check for sequence conflicts')\n .option('-q, --quiet', 'Brief output')\n .option('--json', 'Output as JSON')\n .action(async (options: { quiet?: boolean; json?: boolean }) => {\n const hasNoConflicts = await checkSpecs(options);\n process.exit(hasNoConflicts ? 0 : 1);\n });\n}\n\n/**\n * Check for sequence conflicts in specs\n */\nexport async function checkSpecs(options: {\n quiet?: boolean;\n silent?: boolean;\n json?: boolean;\n} = {}): Promise<boolean> {\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n \n // Find all specs with sequence numbers\n const specs = await loadAllSpecs();\n const sequenceMap = new Map<number, string[]>();\n const specPattern = createSpecDirPattern();\n \n for (const spec of specs) {\n // Extract sequence number from spec name\n const specName = path.basename(spec.path);\n // Use the same pattern as path-helpers to ensure consistency\n const match = specName.match(specPattern);\n \n if (match) {\n const seq = parseInt(match[1], 10);\n if (!isNaN(seq) && seq > 0) {\n if (!sequenceMap.has(seq)) {\n sequenceMap.set(seq, []);\n }\n sequenceMap.get(seq)!.push(spec.path);\n }\n }\n }\n \n // Find conflicts (sequences with multiple specs)\n const conflicts = Array.from(sequenceMap.entries())\n .filter(([_, paths]) => paths.length > 1)\n .sort(([a], [b]) => a - b);\n \n if (conflicts.length === 0) {\n if (!options.quiet && !options.silent) {\n if (options.json) {\n console.log(JSON.stringify({ conflicts: [], hasConflicts: false }, null, 2));\n } else {\n console.log(chalk.green('✓ No sequence conflicts detected'));\n }\n }\n return true;\n }\n \n // JSON output\n if (options.json) {\n const jsonOutput = {\n hasConflicts: true,\n conflicts: conflicts.map(([seq, paths]) => ({\n sequence: seq,\n specs: paths,\n })),\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return false;\n }\n \n // Report conflicts\n if (!options.silent) {\n if (!options.quiet) {\n // Full output\n console.log('');\n console.log(chalk.yellow('⚠️ Sequence conflicts detected:\\n'));\n \n for (const [seq, paths] of conflicts) {\n console.log(chalk.red(` Sequence ${String(seq).padStart(config.structure.sequenceDigits, '0')}:`));\n for (const p of paths) {\n console.log(chalk.gray(` - ${sanitizeUserInput(p)}`));\n }\n console.log('');\n }\n \n console.log(chalk.cyan('Tip: Use date prefix to prevent conflicts:'));\n console.log(chalk.gray(' Edit .lean-spec/config.json → structure.prefix: \"{YYYYMMDD}-\"'));\n console.log('');\n console.log(chalk.cyan('Or rename folders manually to resolve.'));\n console.log('');\n } else {\n // Brief warning (for auto-check)\n console.log('');\n console.log(chalk.yellow(`⚠️ Conflict warning: ${conflicts.length} sequence conflict(s) detected`));\n console.log(chalk.gray('Run: lean-spec check'));\n console.log('');\n }\n }\n \n return false;\n}\n\n/**\n * Helper for auto-check in other commands\n */\nexport async function autoCheckIfEnabled(): Promise<void> {\n const config = await loadConfig();\n \n // Check if auto-check is disabled\n if (config.autoCheck === false) {\n return;\n }\n \n // Run check in quiet mode (brief warning only)\n try {\n await checkSpecs({ quiet: true });\n } catch {\n // Ignore errors in auto-check\n }\n}\n","/**\n * Parse custom fields from CLI --field options\n * @param fieldOptions Array of \"name=value\" strings\n * @returns Record of parsed field names and values\n */\nexport function parseCustomFieldOptions(fieldOptions?: string[]): Record<string, unknown> {\n const customFields: Record<string, unknown> = {};\n \n if (!fieldOptions) {\n return customFields;\n }\n \n for (const field of fieldOptions) {\n const [key, ...valueParts] = field.split('=');\n if (key && valueParts.length > 0) {\n const value = valueParts.join('='); // Handle values with '=' in them\n customFields[key.trim()] = value.trim();\n }\n }\n \n return customFields;\n}\n","import * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { getSpecFile, updateFrontmatter } from '../frontmatter.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport type { SpecStatus, SpecPriority } from '../frontmatter.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { parseCustomFieldOptions } from '../utils/cli-helpers.js';\n\n/**\n * Update command - update spec metadata\n */\nexport function updateCommand(): Command {\n return new Command('update')\n .description('Update spec metadata')\n .argument('<spec>', 'Spec to update')\n .option('--status <status>', 'Set status (planned, in-progress, complete, archived)')\n .option('--priority <priority>', 'Set priority (low, medium, high, critical)')\n .option('--tags <tags>', 'Set tags (comma-separated)')\n .option('--assignee <name>', 'Set assignee')\n .option('--field <name=value...>', 'Set custom field (can specify multiple)')\n .action(async (specPath: string, options: {\n status?: SpecStatus;\n priority?: SpecPriority;\n tags?: string;\n assignee?: string;\n field?: string[];\n }) => {\n const customFields = parseCustomFieldOptions(options.field);\n const updates: {\n status?: SpecStatus;\n priority?: SpecPriority;\n tags?: string[];\n assignee?: string;\n customFields?: Record<string, unknown>;\n } = {\n status: options.status,\n priority: options.priority,\n tags: options.tags ? options.tags.split(',').map(t => t.trim()) : undefined,\n assignee: options.assignee,\n customFields: Object.keys(customFields).length > 0 ? customFields : undefined,\n };\n \n Object.keys(updates).forEach(key => {\n if (updates[key as keyof typeof updates] === undefined) {\n delete updates[key as keyof typeof updates];\n }\n });\n \n if (Object.keys(updates).length === 0) {\n console.error('Error: At least one update option required (--status, --priority, --tags, --assignee, --field)');\n process.exit(1);\n }\n \n await updateSpec(specPath, updates);\n });\n}\n\nexport async function updateSpec(\n specPath: string,\n updates: {\n status?: SpecStatus;\n priority?: SpecPriority;\n tags?: string[];\n assignee?: string;\n customFields?: Record<string, unknown>;\n },\n options: { cwd?: string } = {}\n): Promise<void> {\n // Auto-check for conflicts before update\n await autoCheckIfEnabled();\n \n const cwd = options.cwd ?? process.cwd();\n const config = await loadConfig(cwd);\n const specsDir = path.join(cwd, config.specsDir);\n \n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n\n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}. Tried: ${sanitizeUserInput(specPath)}, specs/${sanitizeUserInput(specPath)}, and searching in date directories`);\n }\n\n // Get spec file\n const specFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n if (!specFile) {\n throw new Error(`No spec file found in: ${sanitizeUserInput(specPath)}`);\n }\n\n // Merge custom fields into updates object, filtering out undefined values\n const allUpdates: Record<string, unknown> = {};\n \n // Only add defined values\n if (updates.status !== undefined) allUpdates.status = updates.status;\n if (updates.priority !== undefined) allUpdates.priority = updates.priority;\n if (updates.tags !== undefined) allUpdates.tags = updates.tags;\n if (updates.assignee !== undefined) allUpdates.assignee = updates.assignee;\n \n if (updates.customFields) {\n Object.entries(updates.customFields).forEach(([key, value]) => {\n if (value !== undefined) {\n allUpdates[key] = value;\n }\n });\n }\n\n // Update frontmatter\n await updateFrontmatter(specFile, allUpdates);\n\n console.log(chalk.green(`✓ Updated: ${sanitizeUserInput(path.relative(cwd, resolvedPath))}`));\n \n // Show what was updated\n const updatedFields = Object.keys(updates).filter(k => k !== 'customFields');\n if (updates.customFields) {\n updatedFields.push(...Object.keys(updates.customFields));\n }\n console.log(chalk.gray(` Fields: ${updatedFields.join(', ')}`));\n}\n","/**\n * Shared color scheme for status and priority across all commands\n * Ensures consistent visual representation throughout the CLI\n */\n\nimport chalk from 'chalk';\nimport type { SpecStatus, SpecPriority } from '../frontmatter.js';\n\n/**\n * Status color and display configuration\n * Colors: planned (blue), in-progress (yellow), complete (green), archived (gray)\n */\nexport const STATUS_CONFIG: Record<SpecStatus, { \n emoji: string; \n label: string; \n colorFn: (s: string) => string;\n badge: (s?: string) => string;\n}> = {\n planned: { \n emoji: '📅', \n label: 'Planned', \n colorFn: chalk.blue,\n badge: (s = 'planned') => chalk.blue(`[${s}]`),\n },\n 'in-progress': { \n emoji: '⏳', \n label: 'In Progress', \n colorFn: chalk.yellow,\n badge: (s = 'in-progress') => chalk.yellow(`[${s}]`),\n },\n complete: { \n emoji: '✅', \n label: 'Complete', \n colorFn: chalk.green,\n badge: (s = 'complete') => chalk.green(`[${s}]`),\n },\n archived: { \n emoji: '📦', \n label: 'Archived', \n colorFn: chalk.gray,\n badge: (s = 'archived') => chalk.gray(`[${s}]`),\n },\n};\n\n/**\n * Priority color and display configuration\n * Colors: critical (red bold), high (red), medium (yellow), low (gray)\n */\nexport const PRIORITY_CONFIG: Record<SpecPriority, { \n emoji: string; \n colorFn: (s: string) => string;\n badge: (s?: string) => string;\n}> = {\n critical: { \n emoji: '🔴', \n colorFn: chalk.red.bold,\n badge: (s = 'critical') => chalk.red.bold(`[${s}]`),\n },\n high: { \n emoji: '🟠', \n colorFn: chalk.hex('#FFA500'),\n badge: (s = 'high') => chalk.hex('#FFA500')(`[${s}]`),\n },\n medium: { \n emoji: '🟡', \n colorFn: chalk.yellow,\n badge: (s = 'medium') => chalk.yellow(`[${s}]`),\n },\n low: { \n emoji: '🟢', \n colorFn: chalk.gray,\n badge: (s = 'low') => chalk.gray(`[${s}]`),\n },\n};\n\n/**\n * Get status badge (e.g., [planned], [in-progress])\n */\nexport function formatStatusBadge(status: SpecStatus): string {\n return STATUS_CONFIG[status]?.badge() || chalk.white(`[${status}]`);\n}\n\n/**\n * Get priority badge (e.g., [critical], [high])\n */\nexport function formatPriorityBadge(priority: SpecPriority): string {\n return PRIORITY_CONFIG[priority]?.badge() || chalk.white(`[${priority}]`);\n}\n\n/**\n * Get status indicator with emoji (for deps command)\n */\nexport function getStatusIndicator(status: SpecStatus): string {\n const config = STATUS_CONFIG[status];\n if (!config) return chalk.gray('[unknown]');\n return config.colorFn(`[${status}]`);\n}\n\n/**\n * Get status emoji\n */\nexport function getStatusEmoji(status: SpecStatus): string {\n return STATUS_CONFIG[status]?.emoji || '📄';\n}\n\n/**\n * Get priority emoji\n */\nexport function getPriorityEmoji(priority?: SpecPriority): string {\n return priority ? (PRIORITY_CONFIG[priority]?.emoji || '') : '';\n}\n","/**\n * Agent command - Dispatch specs to AI coding agents\n * \n * Implements spec 123: AI Coding Agent Integration for Automated Spec Orchestration\n * \n * This command enables dispatching specs to various AI coding agents like:\n * - Claude Code (CLI-based, local)\n * - GitHub Copilot CLI (CLI-based, local)\n * - Aider (CLI-based, local)\n * - GitHub Coding Agent (cloud-based, creates PRs)\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { loadConfig, saveConfig, type LeanSpecConfig } from '../config.js';\nimport { getSpec, loadAllSpecs } from '../spec-loader.js';\nimport { updateSpec } from './update.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { getStatusIndicator } from '../utils/colors.js';\n\n/**\n * Supported agent types\n */\nexport type AgentType = 'claude' | 'copilot' | 'aider' | 'gemini' | 'gh-coding' | 'continue';\n\n/**\n * Agent execution mode\n */\nexport type AgentMode = 'cli' | 'cloud';\n\n/**\n * Agent configuration in config file\n */\nexport interface AgentConfig {\n type: AgentMode;\n command?: string;\n args?: string[];\n contextTemplate?: string;\n provider?: string; // For cloud agents\n}\n\n/**\n * Extended config with agents\n */\ninterface AgentsConfig {\n default?: string;\n [key: string]: AgentConfig | string | undefined;\n}\n\n/**\n * Agent session status\n */\nexport interface AgentSession {\n specPath: string;\n agent: AgentType;\n status: 'running' | 'completed' | 'failed' | 'pending';\n startedAt: string;\n worktree?: string;\n pid?: number;\n exitCode?: number;\n error?: string;\n}\n\n// Track active sessions in memory (could be persisted to disk for real implementation)\nconst activeSessions: Map<string, AgentSession> = new Map();\n\n/**\n * Default agent configurations\n */\nconst DEFAULT_AGENTS: Record<string, AgentConfig> = {\n claude: {\n type: 'cli',\n command: 'claude',\n contextTemplate: `Implement the following LeanSpec specification:\n\n---\n{spec_content}\n---\n\nPlease follow the spec's design, plan, and test sections. Update the spec status to 'complete' when done.`,\n },\n copilot: {\n type: 'cli',\n command: 'gh',\n args: ['copilot', 'suggest'],\n contextTemplate: `Help implement this specification:\n\n{spec_content}`,\n },\n aider: {\n type: 'cli',\n command: 'aider',\n args: ['--message'],\n contextTemplate: `Implement the following spec:\n\n{spec_content}`,\n },\n gemini: {\n type: 'cli',\n command: 'gemini',\n contextTemplate: `Implement the following specification:\n\n{spec_content}`,\n },\n 'gh-coding': {\n type: 'cloud',\n provider: 'github',\n },\n continue: {\n type: 'cli',\n command: 'continue',\n contextTemplate: `{spec_content}`,\n },\n};\n\n/**\n * Get agents config from LeanSpec config with type safety\n */\nfunction getAgentsFromConfig(config: LeanSpecConfig): AgentsConfig | undefined {\n // The agents property may exist on config but is not in the base interface\n // It's added dynamically when agents are configured\n const configWithAgents = config as LeanSpecConfig & { agents?: AgentsConfig };\n return configWithAgents.agents;\n}\n\n/**\n * Get agent configuration, merging defaults with user config\n */\nexport async function getAgentConfig(\n agentName: string,\n config: LeanSpecConfig\n): Promise<AgentConfig | null> {\n // Check user-defined agents first\n const userAgents = getAgentsFromConfig(config);\n const userAgent = userAgents?.[agentName];\n if (userAgent && typeof userAgent !== 'string') {\n return { ...DEFAULT_AGENTS[agentName], ...userAgent };\n }\n \n // Fall back to defaults\n if (DEFAULT_AGENTS[agentName]) {\n return DEFAULT_AGENTS[agentName];\n }\n \n return null;\n}\n\n/**\n * Get default agent from config or use 'claude' as fallback\n */\nexport async function getDefaultAgent(config: LeanSpecConfig): Promise<string> {\n const userAgents = getAgentsFromConfig(config);\n return userAgents?.default || 'claude';\n}\n\n/**\n * Check if an agent command is available in PATH\n */\nasync function isAgentAvailable(agentConfig: AgentConfig): Promise<boolean> {\n if (agentConfig.type === 'cloud') {\n // Cloud agents don't need local command\n return true;\n }\n \n const command = agentConfig.command;\n if (!command) return false;\n \n return new Promise((resolve) => {\n const child = spawn('which', [command], { stdio: 'pipe' });\n child.on('close', (code) => resolve(code === 0));\n child.on('error', () => resolve(false));\n });\n}\n\n/**\n * Load spec content for agent context\n */\nasync function loadSpecContent(specPath: string): Promise<string> {\n const spec = await getSpec(specPath);\n if (!spec) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n \n // Use fullPath from spec info which is the directory path\n const specDir = spec.fullPath;\n let content = '';\n \n // Read all markdown files in spec directory\n try {\n const files = await fs.readdir(specDir);\n const mdFiles = files.filter(f => f.endsWith('.md'));\n \n for (const file of mdFiles) {\n const filePath = path.join(specDir, file);\n const fileContent = await fs.readFile(filePath, 'utf-8');\n content += `\\n\\n### ${file}\\n\\n${fileContent}`;\n }\n } catch {\n // Single file spec - use filePath from spec info\n content = await fs.readFile(spec.filePath, 'utf-8');\n }\n \n return content;\n}\n\n/**\n * Create git worktree for parallel spec implementation\n */\nasync function createWorktree(\n specPath: string,\n specName: string,\n cwd: string\n): Promise<string> {\n const worktreePath = path.join(cwd, '.worktrees', `spec-${specName}`);\n const branchName = `feature/${specName}`;\n \n // Create .worktrees directory if needed\n await fs.mkdir(path.join(cwd, '.worktrees'), { recursive: true });\n \n return new Promise((resolve, reject) => {\n const child = spawn('git', ['worktree', 'add', worktreePath, '-b', branchName], {\n cwd,\n stdio: 'pipe',\n });\n \n let stderr = '';\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n \n child.on('close', (code) => {\n if (code === 0) {\n resolve(worktreePath);\n } else {\n // Check if branch already exists\n if (stderr.includes('already exists')) {\n // Try to add worktree with existing branch\n const child2 = spawn('git', ['worktree', 'add', worktreePath, branchName], {\n cwd,\n stdio: 'pipe',\n });\n child2.on('close', (code2) => {\n if (code2 === 0) {\n resolve(worktreePath);\n } else {\n reject(new Error(`Failed to create worktree: ${stderr}`));\n }\n });\n } else {\n reject(new Error(`Failed to create worktree: ${stderr}`));\n }\n }\n });\n });\n}\n\n/**\n * Run CLI-based agent\n */\nasync function runCliAgent(\n specPath: string,\n agentConfig: AgentConfig,\n worktreePath?: string\n): Promise<ChildProcess> {\n const content = await loadSpecContent(specPath);\n const context = agentConfig.contextTemplate?.replace('{spec_content}', content) || content;\n \n const command = agentConfig.command!;\n const args = [...(agentConfig.args || [])];\n \n // For agents that take message as argument\n if (args.includes('--message') || command === 'aider') {\n args.push(context);\n }\n \n const child = spawn(command, args, {\n cwd: worktreePath || process.cwd(),\n stdio: 'inherit',\n detached: false,\n });\n \n return child;\n}\n\n/**\n * Run cloud-based agent (GitHub Coding Agent)\n */\nasync function runCloudAgent(\n specPath: string,\n _agentConfig: AgentConfig\n): Promise<void> {\n // For cloud agents, we'd typically:\n // 1. Create an issue from the spec (if not exists)\n // 2. Trigger the cloud agent via API\n // 3. Monitor for PR creation\n \n console.log(chalk.yellow('Cloud agent integration requires GitHub API configuration.'));\n console.log(chalk.gray('The spec content has been prepared for manual dispatch.'));\n \n const content = await loadSpecContent(specPath);\n console.log('');\n console.log(chalk.cyan('=== Spec Content for Cloud Agent ==='));\n console.log(content.substring(0, 500) + (content.length > 500 ? '...' : ''));\n console.log('');\n console.log(chalk.gray('To use GitHub Coding Agent:'));\n console.log(chalk.gray(' 1. Create a GitHub Issue with the spec content'));\n console.log(chalk.gray(' 2. Assign to the GitHub Coding Agent'));\n console.log(chalk.gray(' 3. The agent will create a PR automatically'));\n}\n\n/**\n * Agent command implementation\n */\nexport function agentCommand(): Command {\n const cmd = new Command('agent')\n .description('Dispatch specs to AI coding agents for automated implementation');\n\n // Run subcommand\n cmd.command('run')\n .description('Dispatch spec(s) to an AI coding agent')\n .argument('<specs...>', 'Spec(s) to dispatch (e.g., \"045\" or \"045 047 048\")')\n .option('--agent <type>', 'Agent type (claude, copilot, aider, gemini, gh-coding)', 'claude')\n .option('--parallel', 'Create worktrees for parallel implementation')\n .option('--no-status-update', 'Do not update spec status to in-progress')\n .option('--dry-run', 'Show what would be done without executing')\n .action(async (specs: string[], options: { \n agent: string; \n parallel?: boolean;\n statusUpdate?: boolean;\n dryRun?: boolean;\n }) => {\n await runAgent(specs, options);\n });\n\n // Status subcommand\n cmd.command('status')\n .description('Check status of agent sessions')\n .argument('[spec]', 'Specific spec to check (optional)')\n .option('--json', 'Output as JSON')\n .action(async (spec: string | undefined, options: { json?: boolean }) => {\n await showAgentStatus(spec, options);\n });\n\n // List subcommand\n cmd.command('list')\n .description('List available AI agents')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n await listAgents(options);\n });\n\n // Config subcommand\n cmd.command('config')\n .description('Configure default agent')\n .argument('<agent>', 'Agent name to set as default')\n .action(async (agent: string) => {\n await setDefaultAgent(agent);\n });\n\n // Default action (show help)\n cmd.action(() => {\n cmd.help();\n });\n\n return cmd;\n}\n\n/**\n * Run agent for spec(s)\n */\nexport async function runAgent(\n specs: string[],\n options: {\n agent?: string;\n parallel?: boolean;\n statusUpdate?: boolean;\n dryRun?: boolean;\n } = {}\n): Promise<void> {\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n \n // Determine agent to use\n const agentName = options.agent || await getDefaultAgent(config);\n const agentConfig = await getAgentConfig(agentName, config);\n \n if (!agentConfig) {\n console.error(chalk.red(`Unknown agent: ${agentName}`));\n console.log(chalk.gray('Available agents: claude, copilot, aider, gemini, gh-coding'));\n process.exit(1);\n }\n \n // Check agent availability (skip in dry-run mode)\n const available = await isAgentAvailable(agentConfig);\n if (!available && agentConfig.type === 'cli' && !options.dryRun) {\n console.error(chalk.red(`Agent not found: ${agentConfig.command}`));\n console.log(chalk.gray(`Make sure ${agentConfig.command} is installed and in your PATH.`));\n process.exit(1);\n }\n \n console.log('');\n console.log(chalk.green(`🤖 Dispatching to ${chalk.cyan(agentName)} agent`));\n console.log('');\n \n // Resolve spec paths\n const resolvedSpecs: string[] = [];\n for (const spec of specs) {\n const resolved = await resolveSpecPath(spec, cwd, specsDir);\n if (!resolved) {\n console.error(chalk.red(`Spec not found: ${sanitizeUserInput(spec)}`));\n process.exit(1);\n }\n resolvedSpecs.push(resolved);\n }\n \n // Show what will be done\n console.log(chalk.bold('Specs to process:'));\n for (const specPath of resolvedSpecs) {\n const spec = await getSpec(specPath);\n if (spec) {\n const status = getStatusIndicator(spec.frontmatter.status);\n console.log(` • ${sanitizeUserInput(spec.name)} ${status}`);\n } else {\n console.log(` • ${sanitizeUserInput(path.basename(specPath))}`);\n }\n }\n console.log('');\n \n if (options.dryRun) {\n console.log(chalk.yellow('Dry run mode - no actions will be taken'));\n console.log('');\n console.log(chalk.cyan('Would execute:'));\n for (const specPath of resolvedSpecs) {\n const spec = await getSpec(specPath);\n const specName = spec?.name || path.basename(specPath);\n console.log(` 1. Update ${specName} status to in-progress`);\n if (options.parallel) {\n console.log(` 2. Create worktree at .worktrees/spec-${specName}`);\n console.log(` 3. Create branch feature/${specName}`);\n }\n console.log(` ${options.parallel ? '4' : '2'}. Launch ${agentName} agent with spec context`);\n }\n return;\n }\n \n // Process each spec\n for (const specPath of resolvedSpecs) {\n const spec = await getSpec(specPath);\n const specName = spec?.name || path.basename(specPath);\n \n console.log(chalk.bold(`Processing: ${specName}`));\n \n // Update status to in-progress\n if (options.statusUpdate !== false) {\n try {\n await updateSpec(specName, { status: 'in-progress' });\n console.log(chalk.green(` ✓ Updated status to in-progress`));\n } catch (error) {\n console.log(chalk.yellow(` ⚠ Could not update status: ${(error as Error).message}`));\n }\n }\n \n // Create worktree for parallel development\n let worktreePath: string | undefined;\n if (options.parallel) {\n try {\n worktreePath = await createWorktree(specPath, specName, cwd);\n console.log(chalk.green(` ✓ Created worktree at ${worktreePath}`));\n } catch (error) {\n console.log(chalk.yellow(` ⚠ Could not create worktree: ${(error as Error).message}`));\n }\n }\n \n // Create session\n const session: AgentSession = {\n specPath,\n agent: agentName as AgentType,\n status: 'running',\n startedAt: new Date().toISOString(),\n worktree: worktreePath,\n };\n \n // Dispatch to agent\n if (agentConfig.type === 'cli') {\n console.log(chalk.cyan(` → Launching ${agentName}...`));\n \n try {\n const child = await runCliAgent(specPath, agentConfig, worktreePath);\n session.pid = child.pid;\n activeSessions.set(specName, session);\n \n child.on('close', (code) => {\n const sess = activeSessions.get(specName);\n if (sess) {\n sess.status = code === 0 ? 'completed' : 'failed';\n sess.exitCode = code ?? undefined;\n }\n });\n \n child.on('error', (error) => {\n const sess = activeSessions.get(specName);\n if (sess) {\n sess.status = 'failed';\n sess.error = error.message;\n }\n });\n \n console.log(chalk.green(` ✓ Agent launched (PID: ${child.pid})`));\n } catch (error) {\n session.status = 'failed';\n session.error = (error as Error).message;\n activeSessions.set(specName, session);\n console.error(chalk.red(` ✗ Failed to launch agent: ${(error as Error).message}`));\n }\n } else {\n // Cloud agent\n activeSessions.set(specName, session);\n await runCloudAgent(specPath, agentConfig);\n }\n \n console.log('');\n }\n \n console.log(chalk.green('✨ Agent dispatch complete'));\n console.log(chalk.gray('Use `lean-spec agent status` to check progress'));\n}\n\n/**\n * Show agent session status\n */\nexport async function showAgentStatus(\n spec: string | undefined,\n options: { json?: boolean } = {}\n): Promise<void> {\n if (spec) {\n const session = activeSessions.get(spec);\n if (!session) {\n if (options.json) {\n console.log(JSON.stringify({ error: `No active session for spec: ${spec}` }));\n } else {\n console.log(chalk.yellow(`No active session for spec: ${spec}`));\n }\n return;\n }\n \n if (options.json) {\n console.log(JSON.stringify(session, null, 2));\n } else {\n console.log('');\n console.log(chalk.cyan(`Agent Session: ${spec}`));\n console.log(` Agent: ${session.agent}`);\n console.log(` Status: ${getSessionStatusIndicator(session.status)}`);\n console.log(` Started: ${session.startedAt}`);\n if (session.worktree) {\n console.log(` Worktree: ${session.worktree}`);\n }\n if (session.pid) {\n console.log(` PID: ${session.pid}`);\n }\n if (session.error) {\n console.log(` Error: ${chalk.red(session.error)}`);\n }\n console.log('');\n }\n return;\n }\n \n // Show all sessions\n const sessions = Array.from(activeSessions.entries());\n \n if (options.json) {\n const data = Object.fromEntries(sessions);\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n \n if (sessions.length === 0) {\n console.log(chalk.gray('No active agent sessions'));\n return;\n }\n \n console.log('');\n console.log(chalk.green('=== Agent Sessions ==='));\n console.log('');\n \n for (const [specName, session] of sessions) {\n console.log(`${chalk.bold(specName)}`);\n console.log(` Agent: ${session.agent} | Status: ${getSessionStatusIndicator(session.status)}`);\n if (session.worktree) {\n console.log(` Worktree: ${chalk.dim(session.worktree)}`);\n }\n }\n console.log('');\n}\n\n/**\n * Get colored status indicator for agent session\n */\nfunction getSessionStatusIndicator(status: AgentSession['status']): string {\n switch (status) {\n case 'running':\n return chalk.blue('🔄 Running');\n case 'completed':\n return chalk.green('✅ Completed');\n case 'failed':\n return chalk.red('❌ Failed');\n case 'pending':\n return chalk.yellow('⏳ Pending');\n default:\n return status;\n }\n}\n\n/**\n * List available agents\n */\nexport async function listAgents(options: { json?: boolean } = {}): Promise<void> {\n const config = await loadConfig();\n const defaultAgent = await getDefaultAgent(config);\n \n const agents: Record<string, { type: AgentMode; available: boolean; isDefault: boolean; command?: string }> = {};\n \n for (const [name, agentConfig] of Object.entries(DEFAULT_AGENTS)) {\n const available = await isAgentAvailable(agentConfig);\n agents[name] = {\n type: agentConfig.type,\n available,\n isDefault: name === defaultAgent,\n command: agentConfig.command,\n };\n }\n \n // Add user-defined agents\n const userAgents = getAgentsFromConfig(config);\n if (userAgents) {\n for (const [name, agentConfig] of Object.entries(userAgents)) {\n if (name !== 'default' && !agents[name] && agentConfig && typeof agentConfig !== 'string') {\n const available = await isAgentAvailable(agentConfig);\n agents[name] = {\n type: agentConfig.type,\n available,\n isDefault: name === defaultAgent,\n command: agentConfig.command,\n };\n }\n }\n }\n \n if (options.json) {\n console.log(JSON.stringify(agents, null, 2));\n return;\n }\n \n console.log('');\n console.log(chalk.green('=== Available AI Agents ==='));\n console.log('');\n \n console.log(chalk.bold('CLI-based (local):'));\n for (const [name, info] of Object.entries(agents)) {\n if (info.type === 'cli') {\n const defaultMarker = info.isDefault ? chalk.green(' (default)') : '';\n const availableMarker = info.available ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${availableMarker} ${name}${defaultMarker} ${chalk.dim(`(${info.command})`)}`);\n }\n }\n \n console.log('');\n console.log(chalk.bold('Cloud-based:'));\n for (const [name, info] of Object.entries(agents)) {\n if (info.type === 'cloud') {\n const defaultMarker = info.isDefault ? chalk.green(' (default)') : '';\n console.log(` • ${name}${defaultMarker}`);\n }\n }\n \n console.log('');\n console.log(chalk.gray('Set default: lean-spec agent config <agent>'));\n console.log(chalk.gray('Run agent: lean-spec agent run <spec> --agent <agent>'));\n console.log('');\n}\n\n/**\n * Set default agent in config\n */\nexport async function setDefaultAgent(agent: string): Promise<void> {\n const config = await loadConfig();\n \n // Check if agent exists\n const agentConfig = await getAgentConfig(agent, config);\n if (!agentConfig) {\n console.error(chalk.red(`Unknown agent: ${agent}`));\n console.log(chalk.gray('Available agents: claude, copilot, aider, gemini, gh-coding'));\n process.exit(1);\n }\n \n // Update config with proper typing\n const configWithAgents = config as LeanSpecConfig & { agents?: AgentsConfig };\n configWithAgents.agents = configWithAgents.agents || {};\n configWithAgents.agents.default = agent;\n await saveConfig(configWithAgents);\n \n console.log(chalk.green(`✓ Default agent set to: ${agent}`));\n}\n","/**\n * Frontmatter parsing and manipulation (platform-independent)\n */\nimport matter from 'gray-matter';\nimport yaml from 'js-yaml';\nimport type { SpecFrontmatter, SpecStatus, SpecPriority, StatusTransition, SpecFilterOptions, LeanSpecConfig } from '../types/index.js';\n\n/**\n * Convert Date objects to YYYY-MM-DD string format\n * (gray-matter auto-parses YYYY-MM-DD strings as Date objects)\n */\nexport function normalizeDateFields(data: Record<string, unknown>): void {\n const dateFields = ['created', 'completed', 'updated', 'due'];\n \n for (const field of dateFields) {\n if (data[field] instanceof Date) {\n data[field] = (data[field] as Date).toISOString().split('T')[0];\n }\n }\n}\n\n/**\n * Enrich frontmatter with timestamps for velocity tracking\n * Auto-generates timestamps when missing and tracks status transitions\n */\nexport function enrichWithTimestamps(\n data: Record<string, unknown>,\n previousData?: Record<string, unknown>\n): void {\n const now = new Date().toISOString();\n\n // Set created_at if missing - always use current timestamp\n // Do NOT infer from created date field since that's just YYYY-MM-DD without time\n if (!data.created_at) {\n data.created_at = now;\n }\n\n // Update updated_at on any change (if previousData exists)\n if (previousData) {\n data.updated_at = now;\n }\n\n // Set completed_at when status changes to complete\n if (\n data.status === 'complete' &&\n previousData?.status !== 'complete' &&\n !data.completed_at\n ) {\n data.completed_at = now;\n // Also set the completed date field\n if (!data.completed) {\n data.completed = new Date().toISOString().split('T')[0];\n }\n }\n\n // Track status transition (optional)\n if (previousData && data.status !== previousData.status) {\n if (!Array.isArray(data.transitions)) {\n data.transitions = [];\n }\n (data.transitions as StatusTransition[]).push({\n status: data.status as SpecStatus,\n at: now,\n });\n }\n}\n\n/**\n * Normalize tags field - parse JSON strings into arrays\n * Handles cases where AI accidentally creates tags as '[\"..\",\"..\"]' strings\n */\nexport function normalizeTagsField(data: Record<string, unknown>): void {\n if (data.tags && typeof data.tags === 'string') {\n try {\n // Try to parse as JSON array\n const parsed = JSON.parse(data.tags as string);\n if (Array.isArray(parsed)) {\n data.tags = parsed;\n }\n } catch {\n // If not valid JSON, treat as comma-separated string\n data.tags = (data.tags as string).split(',').map(t => t.trim());\n }\n }\n}\n\n/**\n * Validate and coerce custom field types\n */\nexport function validateCustomField(\n value: unknown,\n expectedType: 'string' | 'number' | 'boolean' | 'array'\n): { valid: boolean; coerced?: unknown; error?: string } {\n switch (expectedType) {\n case 'string':\n if (typeof value === 'string') {\n return { valid: true, coerced: value };\n }\n // Coerce to string\n return { valid: true, coerced: String(value) };\n \n case 'number':\n if (typeof value === 'number') {\n return { valid: true, coerced: value };\n }\n // Try to coerce to number\n const num = Number(value);\n if (!isNaN(num)) {\n return { valid: true, coerced: num };\n }\n return { valid: false, error: `Cannot convert '${value}' to number` };\n \n case 'boolean':\n if (typeof value === 'boolean') {\n return { valid: true, coerced: value };\n }\n // Coerce string to boolean\n if (value === 'true' || value === 'yes' || value === '1') {\n return { valid: true, coerced: true };\n }\n if (value === 'false' || value === 'no' || value === '0') {\n return { valid: true, coerced: false };\n }\n return { valid: false, error: `Cannot convert '${value}' to boolean` };\n \n case 'array':\n if (Array.isArray(value)) {\n return { valid: true, coerced: value };\n }\n return { valid: false, error: `Expected array but got ${typeof value}` };\n \n default:\n return { valid: false, error: `Unknown type: ${expectedType}` };\n }\n}\n\n/**\n * Validate custom fields according to config\n */\nexport function validateCustomFields(\n frontmatter: Record<string, unknown>,\n config?: LeanSpecConfig\n): Record<string, unknown> {\n if (!config?.frontmatter?.custom) {\n return frontmatter;\n }\n \n const result = { ...frontmatter };\n \n for (const [fieldName, expectedType] of Object.entries(config.frontmatter.custom)) {\n if (fieldName in result) {\n const validation = validateCustomField(result[fieldName], expectedType);\n if (validation.valid) {\n result[fieldName] = validation.coerced;\n } else {\n console.warn(`Warning: Invalid custom field '${fieldName}': ${validation.error}`);\n }\n }\n }\n \n return result;\n}\n\n/**\n * Parse frontmatter from markdown content string\n */\nexport function parseFrontmatterFromString(\n content: string,\n filePath?: string,\n config?: LeanSpecConfig\n): SpecFrontmatter | null {\n try {\n const parsed = matter(content, {\n engines: {\n yaml: (str) => yaml.load(str, { schema: yaml.FAILSAFE_SCHEMA }) as Record<string, unknown>\n }\n });\n\n if (!parsed.data || Object.keys(parsed.data).length === 0) {\n // No frontmatter found, try fallback to inline fields\n return parseFallbackFields(content);\n }\n\n // Validate required fields\n if (!parsed.data.status) {\n if (filePath) console.warn(`Warning: Missing required field 'status' in ${filePath}`);\n return null;\n }\n\n if (!parsed.data.created) {\n if (filePath) console.warn(`Warning: Missing required field 'created' in ${filePath}`);\n return null;\n }\n\n // Validate status enum\n const validStatuses: SpecStatus[] = ['planned', 'in-progress', 'complete', 'archived'];\n if (!validStatuses.includes(parsed.data.status)) {\n if (filePath) {\n console.warn(`Warning: Invalid status '${parsed.data.status}' in ${filePath}. Valid values: ${validStatuses.join(', ')}`);\n }\n }\n\n // Validate priority enum if present\n if (parsed.data.priority) {\n const validPriorities: SpecPriority[] = ['low', 'medium', 'high', 'critical'];\n if (!validPriorities.includes(parsed.data.priority)) {\n if (filePath) {\n console.warn(`Warning: Invalid priority '${parsed.data.priority}' in ${filePath}. Valid values: ${validPriorities.join(', ')}`);\n }\n }\n }\n\n // Normalize tags field (parse JSON strings to arrays)\n normalizeTagsField(parsed.data);\n \n // Warn about unknown fields (informational only)\n const knownFields = [\n 'status', 'created', 'tags', 'priority', 'related', 'depends_on',\n 'updated', 'completed', 'assignee', 'reviewer', 'issue', 'pr', 'epic', 'breaking', 'due',\n 'created_at', 'updated_at', 'completed_at', 'transitions'\n ];\n \n // Add custom fields from config to known fields\n const customFields = config?.frontmatter?.custom ? Object.keys(config.frontmatter.custom) : [];\n const allKnownFields = [...knownFields, ...customFields];\n \n const unknownFields = Object.keys(parsed.data).filter(k => !allKnownFields.includes(k));\n if (unknownFields.length > 0 && filePath) {\n console.warn(`Info: Unknown fields in ${filePath}: ${unknownFields.join(', ')}`);\n }\n \n // Validate and coerce custom fields\n const validatedData = validateCustomFields(parsed.data, config);\n\n return validatedData as SpecFrontmatter;\n } catch (error) {\n console.error(`Error parsing frontmatter${filePath ? ` from ${filePath}` : ''}:`, error);\n return null;\n }\n}\n\n/**\n * Fallback: Parse inline fields from older specs\n */\nfunction parseFallbackFields(content: string): SpecFrontmatter | null {\n const statusMatch = content.match(/\\*\\*Status\\*\\*:\\s*(?:📅\\s*)?(\\w+(?:-\\w+)?)/i);\n const createdMatch = content.match(/\\*\\*Created\\*\\*:\\s*(\\d{4}-\\d{2}-\\d{2})/);\n\n if (statusMatch && createdMatch) {\n const status = statusMatch[1].toLowerCase().replace(/\\s+/g, '-') as SpecStatus;\n const created = createdMatch[1];\n\n return {\n status,\n created,\n };\n }\n\n return null;\n}\n\n/**\n * Create updated frontmatter with changes\n */\nexport function createUpdatedFrontmatter(\n existingContent: string,\n updates: Partial<SpecFrontmatter>\n): { content: string; frontmatter: SpecFrontmatter } {\n const parsed = matter(existingContent, {\n engines: {\n yaml: (str) => yaml.load(str, { schema: yaml.FAILSAFE_SCHEMA }) as Record<string, unknown>\n }\n });\n\n // Store previous data for timestamp enrichment\n const previousData = { ...parsed.data };\n\n // Merge updates with existing data\n const newData = { ...parsed.data, ...updates };\n\n // Ensure date fields remain as strings (gray-matter auto-parses YYYY-MM-DD as Date objects)\n normalizeDateFields(newData);\n\n // Enrich with timestamps\n enrichWithTimestamps(newData, previousData);\n\n // Auto-update timestamps if fields exist (legacy behavior)\n if (updates.status === 'complete' && !newData.completed) {\n newData.completed = new Date().toISOString().split('T')[0];\n }\n\n if ('updated' in parsed.data) {\n newData.updated = new Date().toISOString().split('T')[0];\n }\n\n // Update visual metadata badges in content\n let updatedContent = parsed.content;\n updatedContent = updateVisualMetadata(updatedContent, newData as SpecFrontmatter);\n\n // Stringify back to markdown\n const newContent = matter.stringify(updatedContent, newData);\n \n return {\n content: newContent,\n frontmatter: newData as SpecFrontmatter\n };\n}\n\n/**\n * Update visual metadata badges in content\n */\nfunction updateVisualMetadata(content: string, frontmatter: SpecFrontmatter): string {\n const statusEmoji = getStatusEmojiPlain(frontmatter.status);\n const statusLabel = frontmatter.status.charAt(0).toUpperCase() + frontmatter.status.slice(1).replace('-', ' ');\n \n // Use the created date as-is (already in YYYY-MM-DD format)\n const created = frontmatter.created;\n \n // Build metadata line\n let metadataLine = `> **Status**: ${statusEmoji} ${statusLabel}`;\n \n if (frontmatter.priority) {\n const priorityLabel = frontmatter.priority.charAt(0).toUpperCase() + frontmatter.priority.slice(1);\n metadataLine += ` · **Priority**: ${priorityLabel}`;\n }\n \n metadataLine += ` · **Created**: ${created}`;\n \n if (frontmatter.tags && frontmatter.tags.length > 0) {\n metadataLine += ` · **Tags**: ${frontmatter.tags.join(', ')}`;\n }\n \n // For enterprise template with assignee/reviewer\n let secondLine = '';\n if (frontmatter.assignee || frontmatter.reviewer) {\n const assignee = frontmatter.assignee || 'TBD';\n const reviewer = frontmatter.reviewer || 'TBD';\n secondLine = `\\n> **Assignee**: ${assignee} · **Reviewer**: ${reviewer}`;\n }\n \n // Replace existing metadata block or add after title\n const metadataPattern = /^>\\s+\\*\\*Status\\*\\*:.*(?:\\n>\\s+\\*\\*Assignee\\*\\*:.*)?/m;\n \n if (metadataPattern.test(content)) {\n // Replace existing metadata\n return content.replace(metadataPattern, metadataLine + secondLine);\n } else {\n // Add after title (# title)\n const titleMatch = content.match(/^#\\s+.+$/m);\n if (titleMatch) {\n const insertPos = titleMatch.index! + titleMatch[0].length;\n return content.slice(0, insertPos) + '\\n\\n' + metadataLine + secondLine + '\\n' + content.slice(insertPos);\n }\n }\n \n return content;\n}\n\nfunction getStatusEmojiPlain(status: string): string {\n switch (status) {\n case 'planned': return '📅';\n case 'in-progress': return '⏳';\n case 'complete': return '✅';\n case 'archived': return '📦';\n default: return '📄';\n }\n}\n\n/**\n * Filter specs by criteria\n */\nexport function matchesFilter(frontmatter: SpecFrontmatter, filter: SpecFilterOptions): boolean {\n // Status filter\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n if (!statuses.includes(frontmatter.status)) {\n return false;\n }\n }\n\n // Tags filter (spec must have ALL specified tags)\n if (filter.tags && filter.tags.length > 0) {\n if (!frontmatter.tags || frontmatter.tags.length === 0) {\n return false;\n }\n const hasAllTags = filter.tags.every(tag => frontmatter.tags!.includes(tag));\n if (!hasAllTags) {\n return false;\n }\n }\n\n // Priority filter\n if (filter.priority) {\n const priorities = Array.isArray(filter.priority) ? filter.priority : [filter.priority];\n if (!frontmatter.priority || !priorities.includes(frontmatter.priority)) {\n return false;\n }\n }\n\n // Assignee filter\n if (filter.assignee) {\n if (frontmatter.assignee !== filter.assignee) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Markdown parser for programmatic spec management\n * \n * Implements spec 059: Programmatic Spec Management\n * \n * This module provides mechanical parsing of markdown structure:\n * - Section detection (headings and their line ranges)\n * - Line extraction/removal/replacement\n * - Basic structure analysis\n * \n * NO semantic analysis - just mechanical operations on text\n */\n\n/**\n * Represents a section in the markdown document\n */\nexport interface Section {\n /** Section title (without the # prefix) */\n title: string;\n /** Heading level (1-6) */\n level: number;\n /** Start line number (1-indexed) */\n startLine: number;\n /** End line number (1-indexed, inclusive) */\n endLine: number;\n /** Line count */\n lineCount: number;\n /** Direct subsections */\n subsections: Section[];\n}\n\n/**\n * Parse markdown content and extract section structure\n */\nexport function parseMarkdownSections(content: string): Section[] {\n const lines = content.split('\\n');\n const sections: Section[] = [];\n const sectionStack: Section[] = [];\n \n let inCodeBlock = false;\n let currentLineNum = 1;\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n currentLineNum = i + 1;\n \n // Track code blocks to ignore headings inside them\n if (line.trimStart().startsWith('```')) {\n inCodeBlock = !inCodeBlock;\n continue;\n }\n \n if (inCodeBlock) {\n continue;\n }\n \n // Detect headings (ATX-style: # heading)\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n const level = headingMatch[1].length;\n const title = headingMatch[2].trim();\n \n // Close previous sections at same or higher level\n while (sectionStack.length > 0 && sectionStack[sectionStack.length - 1].level >= level) {\n const closedSection = sectionStack.pop()!;\n closedSection.endLine = currentLineNum - 1;\n closedSection.lineCount = closedSection.endLine - closedSection.startLine + 1;\n }\n \n // Create new section\n const newSection: Section = {\n title,\n level,\n startLine: currentLineNum,\n endLine: lines.length, // Will be updated when section closes\n lineCount: 0, // Will be calculated when section closes\n subsections: [],\n };\n \n // Add to parent or root\n if (sectionStack.length > 0) {\n sectionStack[sectionStack.length - 1].subsections.push(newSection);\n } else {\n sections.push(newSection);\n }\n \n sectionStack.push(newSection);\n }\n }\n \n // Close remaining sections\n while (sectionStack.length > 0) {\n const closedSection = sectionStack.pop()!;\n closedSection.endLine = lines.length;\n closedSection.lineCount = closedSection.endLine - closedSection.startLine + 1;\n }\n \n return sections;\n}\n\n/**\n * Find a section by title (case-insensitive, partial match)\n */\nexport function findSection(sections: Section[], titlePattern: string): Section | null {\n const pattern = titlePattern.toLowerCase();\n \n for (const section of sections) {\n if (section.title.toLowerCase().includes(pattern)) {\n return section;\n }\n \n // Search subsections recursively\n const found = findSection(section.subsections, titlePattern);\n if (found) {\n return found;\n }\n }\n \n return null;\n}\n\n/**\n * Flatten section tree to array (depth-first)\n */\nexport function flattenSections(sections: Section[]): Section[] {\n const result: Section[] = [];\n \n for (const section of sections) {\n result.push(section);\n result.push(...flattenSections(section.subsections));\n }\n \n return result;\n}\n\n/**\n * Extract lines from content\n * @param content Full markdown content\n * @param startLine Start line (1-indexed, inclusive)\n * @param endLine End line (1-indexed, inclusive)\n */\nexport function extractLines(content: string, startLine: number, endLine: number): string {\n const lines = content.split('\\n');\n \n // Validate bounds\n if (startLine < 1 || endLine < startLine || startLine > lines.length || endLine > lines.length) {\n throw new Error(`Invalid line range: ${startLine}-${endLine}`);\n }\n \n // Extract (convert to 0-indexed)\n const extracted = lines.slice(startLine - 1, endLine);\n return extracted.join('\\n');\n}\n\n/**\n * Remove lines from content\n * @param content Full markdown content\n * @param startLine Start line (1-indexed, inclusive)\n * @param endLine End line (1-indexed, inclusive)\n */\nexport function removeLines(content: string, startLine: number, endLine: number): string {\n const lines = content.split('\\n');\n \n // Validate bounds\n if (startLine < 1 || endLine < startLine || startLine > lines.length) {\n throw new Error(`Invalid line range: ${startLine}-${endLine}`);\n }\n \n // Remove (convert to 0-indexed)\n lines.splice(startLine - 1, endLine - startLine + 1);\n return lines.join('\\n');\n}\n\n/**\n * Replace lines in content\n * @param content Full markdown content\n * @param startLine Start line (1-indexed, inclusive)\n * @param endLine End line (1-indexed, inclusive)\n * @param replacement Replacement text (can be multi-line)\n */\nexport function replaceLines(content: string, startLine: number, endLine: number, replacement: string): string {\n const lines = content.split('\\n');\n \n // Validate bounds\n if (startLine < 1 || endLine < startLine || startLine > lines.length) {\n throw new Error(`Invalid line range: ${startLine}-${endLine}`);\n }\n \n // Split replacement into lines\n const replacementLines = replacement.split('\\n');\n \n // Replace (convert to 0-indexed)\n lines.splice(startLine - 1, endLine - startLine + 1, ...replacementLines);\n return lines.join('\\n');\n}\n\n/**\n * Count lines in content\n */\nexport function countLines(content: string): number {\n return content.split('\\n').length;\n}\n\n/**\n * Get line at specific line number (1-indexed)\n */\nexport function getLine(content: string, lineNumber: number): string {\n const lines = content.split('\\n');\n \n if (lineNumber < 1 || lineNumber > lines.length) {\n throw new Error(`Invalid line number: ${lineNumber}`);\n }\n \n return lines[lineNumber - 1];\n}\n\n/**\n * Parse markdown structure for analysis\n */\nexport interface MarkdownStructure {\n /** Total line count */\n lines: number;\n /** Section hierarchy */\n sections: Section[];\n /** Flattened sections */\n allSections: Section[];\n /** Section count by level */\n sectionsByLevel: {\n h1: number;\n h2: number;\n h3: number;\n h4: number;\n h5: number;\n h6: number;\n total: number;\n };\n /** Code block count */\n codeBlocks: number;\n /** Maximum nesting depth */\n maxNesting: number;\n}\n\n/**\n * Analyze markdown structure\n */\nexport function analyzeMarkdownStructure(content: string): MarkdownStructure {\n const lines = content.split('\\n');\n const sections = parseMarkdownSections(content);\n const allSections = flattenSections(sections);\n \n // Count sections by level\n const levelCounts = { h1: 0, h2: 0, h3: 0, h4: 0, h5: 0, h6: 0, total: 0 };\n for (const section of allSections) {\n levelCounts[`h${section.level}` as keyof typeof levelCounts]++;\n levelCounts.total++;\n }\n \n // Count code blocks\n let codeBlocks = 0;\n let inCodeBlock = false;\n for (const line of lines) {\n if (line.trimStart().startsWith('```')) {\n if (!inCodeBlock) {\n codeBlocks++;\n }\n inCodeBlock = !inCodeBlock;\n }\n }\n \n // Calculate max nesting\n let maxNesting = 0;\n function calculateNesting(secs: Section[], depth: number): void {\n for (const section of secs) {\n maxNesting = Math.max(maxNesting, depth);\n calculateNesting(section.subsections, depth + 1);\n }\n }\n calculateNesting(sections, 1);\n \n return {\n lines: lines.length,\n sections,\n allSections,\n sectionsByLevel: levelCounts,\n codeBlocks,\n maxNesting,\n };\n}\n","/**\n * Token counting utilities for LLM context management\n * \n * Implements spec 069: Token Counting Utilities\n * \n * Uses tiktoken (official OpenAI tokenizer) for exact token counts.\n * Token count is the primary metric for Context Economy because:\n * - Predicts AI performance better than line count\n * - Research shows 39% performance drop in multi-turn contexts\n * - Quality degradation starts well before 50K token limits\n * \n * See spec 066 for research findings and threshold rationale.\n */\n\n// Lazy import tiktoken to avoid WASM loading issues in Next.js\nlet encoding: any = null;\nasync function getEncoding() {\n if (!encoding) {\n const { encoding_for_model } = await import('tiktoken');\n encoding = encoding_for_model('gpt-4');\n }\n return encoding;\n}\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport matter from 'gray-matter';\n\nexport interface TokenCount {\n total: number;\n files: {\n path: string;\n tokens: number;\n lines?: number;\n }[];\n breakdown?: {\n code: number; // Tokens in code blocks\n prose: number; // Tokens in prose\n tables: number; // Tokens in tables\n frontmatter: number; // Tokens in frontmatter\n };\n}\n\nexport interface TokenCounterOptions {\n detailed?: boolean; // Include breakdown by file and type\n includeSubSpecs?: boolean; // Count sub-spec files\n}\n\n/**\n * Token counter using tiktoken for exact token counts\n */\nexport class TokenCounter {\n private encoding: any = null;\n\n async getEncoding() {\n if (!this.encoding) {\n const { encoding_for_model } = await import('tiktoken');\n this.encoding = encoding_for_model('gpt-4');\n }\n return this.encoding;\n }\n\n /**\n * Clean up resources (important to prevent memory leaks)\n */\n dispose(): void {\n if (this.encoding) {\n this.encoding.free();\n }\n }\n\n /**\n * Count tokens in a string\n */\n async countString(text: string): Promise<number> {\n const encoding = await this.getEncoding();\n const tokens = encoding.encode(text);\n return tokens.length;\n }\n\n /**\n * Count tokens in content (convenience method for analyze command)\n * Alias for countString - provided for clarity in command usage\n */\n async countTokensInContent(content: string): Promise<number> {\n return this.countString(content);\n }\n\n /**\n * Count tokens in a single file\n */\n async countFile(filePath: string, options: TokenCounterOptions = {}): Promise<TokenCount> {\n const content = await fs.readFile(filePath, 'utf-8');\n const tokens = await this.countString(content);\n const lines = content.split('\\n').length;\n\n const result: TokenCount = {\n total: tokens,\n files: [{\n path: filePath,\n tokens,\n lines,\n }],\n };\n\n if (options.detailed) {\n result.breakdown = await this.analyzeBreakdown(content);\n }\n\n return result;\n }\n\n /**\n * Count tokens in a spec (including sub-specs if requested)\n */\n async countSpec(specPath: string, options: TokenCounterOptions = {}): Promise<TokenCount> {\n // Determine if specPath is a directory or file\n const stats = await fs.stat(specPath);\n \n if (stats.isFile()) {\n // Single file - count it\n return this.countFile(specPath, options);\n }\n\n // Directory - find all markdown files\n const files = await fs.readdir(specPath);\n const mdFiles = files.filter(f => f.endsWith('.md'));\n\n // Always include README.md if it exists\n const filesToCount: string[] = [];\n if (mdFiles.includes('README.md')) {\n filesToCount.push('README.md');\n }\n\n // Include sub-specs if requested\n if (options.includeSubSpecs) {\n mdFiles.forEach(f => {\n if (f !== 'README.md') {\n filesToCount.push(f);\n }\n });\n }\n\n // Count tokens for each file\n const fileCounts: TokenCount['files'] = [];\n let totalTokens = 0;\n let totalBreakdown: TokenCount['breakdown'] | undefined;\n\n if (options.detailed) {\n totalBreakdown = {\n code: 0,\n prose: 0,\n tables: 0,\n frontmatter: 0,\n };\n }\n\n for (const file of filesToCount) {\n const filePath = path.join(specPath, file);\n const content = await fs.readFile(filePath, 'utf-8');\n const tokens = await this.countString(content);\n const lines = content.split('\\n').length;\n\n fileCounts.push({\n path: file,\n tokens,\n lines,\n });\n\n totalTokens += tokens;\n\n if (options.detailed && totalBreakdown) {\n const breakdown = await this.analyzeBreakdown(content);\n totalBreakdown.code += breakdown.code;\n totalBreakdown.prose += breakdown.prose;\n totalBreakdown.tables += breakdown.tables;\n totalBreakdown.frontmatter += breakdown.frontmatter;\n }\n }\n\n return {\n total: totalTokens,\n files: fileCounts,\n breakdown: totalBreakdown,\n };\n }\n\n /**\n * Analyze token breakdown by content type\n */\n async analyzeBreakdown(content: string): Promise<NonNullable<TokenCount['breakdown']>> {\n const breakdown = {\n code: 0,\n prose: 0,\n tables: 0,\n frontmatter: 0,\n };\n\n // Parse frontmatter\n let body = content;\n let frontmatterContent = '';\n \n try {\n const parsed = matter(content);\n body = parsed.content;\n frontmatterContent = parsed.matter;\n breakdown.frontmatter = await this.countString(frontmatterContent);\n } catch {\n // No frontmatter or parsing error\n }\n\n // Track what we're in\n let inCodeBlock = false;\n let inTable = false;\n const lines = body.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Track code blocks\n if (trimmed.startsWith('```')) {\n inCodeBlock = !inCodeBlock;\n breakdown.code += await this.countString(line + '\\n');\n continue;\n }\n\n if (inCodeBlock) {\n breakdown.code += await this.countString(line + '\\n');\n continue;\n }\n\n // Track tables (lines with pipes and separators)\n const isTableSeparator = trimmed.includes('|') && /[-:]{3,}/.test(trimmed);\n const isTableRow = trimmed.includes('|') && trimmed.startsWith('|');\n \n if (isTableSeparator || (inTable && isTableRow)) {\n inTable = true;\n breakdown.tables += await this.countString(line + '\\n');\n continue;\n } else if (inTable && !isTableRow) {\n inTable = false;\n }\n\n // Everything else is prose\n breakdown.prose += await this.countString(line + '\\n');\n }\n\n return breakdown;\n }\n\n /**\n * Check if content fits within token limit\n */\n isWithinLimit(count: TokenCount, limit: number): boolean {\n return count.total <= limit;\n }\n\n /**\n * Format token count for display\n */\n formatCount(count: TokenCount, verbose: boolean = false): string {\n if (!verbose) {\n return `${count.total.toLocaleString()} tokens`;\n }\n\n const lines: string[] = [\n `Total: ${count.total.toLocaleString()} tokens`,\n '',\n 'Files:',\n ];\n\n for (const file of count.files) {\n const lineInfo = file.lines ? ` (${file.lines} lines)` : '';\n lines.push(` ${file.path}: ${file.tokens.toLocaleString()} tokens${lineInfo}`);\n }\n\n if (count.breakdown) {\n const b = count.breakdown;\n const total = b.code + b.prose + b.tables + b.frontmatter;\n \n lines.push('');\n lines.push('Content Breakdown:');\n lines.push(` Prose: ${b.prose.toLocaleString()} tokens (${Math.round(b.prose / total * 100)}%)`);\n lines.push(` Code: ${b.code.toLocaleString()} tokens (${Math.round(b.code / total * 100)}%)`);\n lines.push(` Tables: ${b.tables.toLocaleString()} tokens (${Math.round(b.tables / total * 100)}%)`);\n lines.push(` Frontmatter: ${b.frontmatter.toLocaleString()} tokens (${Math.round(b.frontmatter / total * 100)}%)`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Get performance indicators based on token count\n * Based on research from spec 066\n */\n getPerformanceIndicators(tokenCount: number): {\n level: 'excellent' | 'good' | 'warning' | 'problem';\n costMultiplier: number;\n effectiveness: number; // Estimated AI effectiveness (0-100%)\n recommendation: string;\n } {\n const baselineTokens = 1200;\n const costMultiplier = Math.round((tokenCount / baselineTokens) * 10) / 10;\n\n // Thresholds from spec 066 (hypothesis values)\n if (tokenCount < 2000) {\n return {\n level: 'excellent',\n costMultiplier,\n effectiveness: 100,\n recommendation: 'Optimal size for Context Economy',\n };\n } else if (tokenCount < 3500) {\n return {\n level: 'good',\n costMultiplier,\n effectiveness: 95,\n recommendation: 'Good size, no action needed',\n };\n } else if (tokenCount < 5000) {\n return {\n level: 'warning',\n costMultiplier,\n effectiveness: 85,\n recommendation: 'Consider simplification or sub-specs',\n };\n } else {\n return {\n level: 'problem',\n costMultiplier,\n effectiveness: 70,\n recommendation: 'Should split - elevated token count',\n };\n }\n }\n}\n\n/**\n * Convenience function to create, use, and dispose of a TokenCounter\n */\nexport async function countTokens(\n input: string | { content: string } | { filePath: string } | { specPath: string },\n options?: TokenCounterOptions\n): Promise<TokenCount> {\n const counter = new TokenCounter();\n \n try {\n if (typeof input === 'string') {\n // String content\n return {\n total: await counter.countString(input),\n files: [],\n };\n } else if ('content' in input) {\n // Content object\n return {\n total: await counter.countString(input.content),\n files: [],\n };\n } else if ('filePath' in input) {\n // File path\n return await counter.countFile(input.filePath, options);\n } else if ('specPath' in input) {\n // Spec path (directory)\n return await counter.countSpec(input.specPath, options);\n }\n \n throw new Error('Invalid input type');\n } finally {\n counter.dispose();\n }\n}\n","/**\n * Complexity validator - direct token threshold validation\n * \n * Implements spec 071: Simplified Token-Based Validation\n * \n * Uses direct, independent checks instead of derived scores:\n * 1. Token count (primary check) - direct thresholds\n * 2. Structure quality (independent feedback) - sub-specs and sectioning\n * 3. Line count (backstop only) - for extreme cases\n * \n * Research-backed findings:\n * - Token count predicts AI performance better than line count\n * - Quality degradation starts before 50K token limits\n * - Sub-specs enable progressive disclosure (Context Economy)\n * - Good sectioning enables cognitive chunking (7±2 rule)\n */\n\nimport type { ValidationRule, ValidationResult, ValidationError, ValidationWarning } from '../utils/validation-framework.js';\nimport type { SpecInfo } from '../types/index.js';\nimport { TokenCounter } from '../utils/token-counter.js';\nimport matter from 'gray-matter';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface ComplexityOptions {\n // Token thresholds (hypothesis values, to be validated)\n excellentThreshold?: number; // Default: 2000 tokens\n goodThreshold?: number; // Default: 3500 tokens\n warningThreshold?: number; // Default: 5000 tokens\n \n // Line count backstop (safety net)\n maxLines?: number; // Default: 500 lines\n warningLines?: number; // Default: 400 lines\n}\n\nexport interface ComplexityMetrics {\n lineCount: number;\n tokenCount: number;\n sectionCount: number;\n codeBlockCount: number;\n listItemCount: number;\n tableCount: number;\n hasSubSpecs: boolean;\n subSpecCount: number;\n averageSectionLength: number;\n}\n\n// Deprecated - kept for backward compatibility only\nexport interface ComplexityScore {\n score: number; // 0-100 (lower is better) - DEPRECATED\n factors: {\n tokens: number; // Primary: token-based score (0-60) - DEPRECATED\n structure: number; // Modifier: structure quality (-30 to +20) - DEPRECATED\n };\n recommendation: 'excellent' | 'good' | 'review' | 'split'; // DEPRECATED\n metrics: ComplexityMetrics;\n costMultiplier: number; // vs 1,200 token baseline\n}\n\nexport class ComplexityValidator implements ValidationRule {\n name = 'complexity';\n description = 'Direct token threshold validation with independent structure checks';\n\n private excellentThreshold: number;\n private goodThreshold: number;\n private warningThreshold: number;\n private maxLines: number;\n private warningLines: number;\n\n constructor(options: ComplexityOptions = {}) {\n // Token thresholds (hypothesis values based on research)\n this.excellentThreshold = options.excellentThreshold ?? 2000;\n this.goodThreshold = options.goodThreshold ?? 3500;\n this.warningThreshold = options.warningThreshold ?? 5000;\n \n // Line count backstop\n this.maxLines = options.maxLines ?? 500;\n this.warningLines = options.warningLines ?? 400;\n }\n\n async validate(spec: SpecInfo, content: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Analyze complexity\n const metrics = await this.analyzeComplexity(content, spec);\n\n // PRIMARY CHECK: Direct token thresholds\n const tokenValidation = this.validateTokens(metrics.tokenCount);\n if (tokenValidation.level === 'error') {\n errors.push({\n message: tokenValidation.message,\n suggestion: 'Consider splitting for Context Economy (attention and cognitive load)',\n });\n } else if (tokenValidation.level === 'warning') {\n warnings.push({\n message: tokenValidation.message,\n suggestion: 'Consider simplification or splitting into sub-specs',\n });\n }\n\n // INDEPENDENT CHECKS: Structure feedback\n const structureChecks = this.checkStructure(metrics);\n for (const check of structureChecks) {\n if (!check.passed && check.message) {\n warnings.push({\n message: check.message,\n suggestion: check.suggestion,\n });\n }\n }\n\n // LINE COUNT BACKSTOP: catch extremely long specs even if tokens are fine\n const lineWarning = this.checkLineCounts(metrics.lineCount);\n if (lineWarning) {\n warnings.push(lineWarning);\n }\n\n return {\n passed: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Validate token count with direct thresholds\n */\n private validateTokens(tokens: number): { level: 'excellent' | 'good' | 'info' | 'warning' | 'error'; message: string } {\n if (tokens > this.warningThreshold) {\n return {\n level: 'error',\n message: `Spec has ${tokens.toLocaleString()} tokens (threshold: ${this.warningThreshold.toLocaleString()}) - should split`,\n };\n }\n \n if (tokens > this.goodThreshold) {\n return {\n level: 'warning',\n message: `Spec has ${tokens.toLocaleString()} tokens (threshold: ${this.goodThreshold.toLocaleString()})`,\n };\n }\n \n if (tokens > this.excellentThreshold) {\n return {\n level: 'info',\n message: `Spec has ${tokens.toLocaleString()} tokens - acceptable, watch for growth`,\n };\n }\n \n return {\n level: 'excellent',\n message: `Spec has ${tokens.toLocaleString()} tokens - excellent`,\n };\n }\n\n /**\n * Check structure quality independently\n */\n private checkStructure(metrics: ComplexityMetrics): Array<{ passed: boolean; message?: string; suggestion?: string }> {\n const checks: Array<{ passed: boolean; message?: string; suggestion?: string }> = [];\n \n // Sub-specs presence (positive feedback when helpful)\n if (metrics.hasSubSpecs) {\n // Only show positive feedback if spec is large enough that sub-specs help\n if (metrics.tokenCount > this.excellentThreshold) {\n checks.push({\n passed: true,\n message: `Uses ${metrics.subSpecCount} sub-spec file${metrics.subSpecCount > 1 ? 's' : ''} for progressive disclosure`,\n });\n }\n } else if (metrics.tokenCount > this.goodThreshold) {\n checks.push({\n passed: false,\n message: 'Consider using sub-spec files (DESIGN.md, IMPLEMENTATION.md, etc.)',\n suggestion: 'Progressive disclosure reduces cognitive load for large specs',\n });\n }\n \n // Section organization\n if (metrics.sectionCount >= 15 && metrics.sectionCount <= 35) {\n // Only show positive feedback if structure is helping manage complexity\n if (metrics.tokenCount > this.excellentThreshold) {\n checks.push({\n passed: true,\n message: `Good sectioning (${metrics.sectionCount} sections) enables cognitive chunking`,\n });\n }\n } else if (metrics.sectionCount < 8 && metrics.lineCount > 200) {\n checks.push({\n passed: false,\n message: `Only ${metrics.sectionCount} sections - too monolithic`,\n suggestion: 'Break into 15-35 sections for better readability (7±2 cognitive chunks)',\n });\n }\n \n // Code block density\n if (metrics.codeBlockCount > 20) {\n checks.push({\n passed: false,\n message: `High code block density (${metrics.codeBlockCount} blocks)`,\n suggestion: 'Consider moving examples to separate files or sub-specs',\n });\n }\n \n return checks;\n }\n\n /**\n * Provide warnings when line counts exceed backstop thresholds\n */\n private checkLineCounts(lineCount: number): ValidationWarning | null {\n if (lineCount > this.maxLines) {\n return {\n message: `Spec is very long at ${lineCount.toLocaleString()} lines (limit ${this.maxLines.toLocaleString()})`,\n suggestion: 'Split the document or move details to sub-spec files to keep context manageable',\n };\n }\n\n if (lineCount > this.warningLines) {\n return {\n message: `Spec is ${lineCount.toLocaleString()} lines — approaching the ${this.warningLines.toLocaleString()} line backstop`,\n suggestion: 'Watch size growth and consider progressive disclosure before hitting hard limits',\n };\n }\n\n return null;\n }\n\n /**\n * Analyze complexity metrics from spec content\n */\n private async analyzeComplexity(content: string, spec: SpecInfo): Promise<ComplexityMetrics> {\n // Parse to separate frontmatter from body\n let body: string;\n try {\n const parsed = matter(content);\n body = parsed.content;\n } catch {\n body = content;\n }\n\n const lines = content.split('\\n');\n const lineCount = lines.length;\n\n // Count sections (## headings, excluding code blocks)\n let sectionCount = 0;\n let inCodeBlock = false;\n for (const line of lines) {\n if (line.trim().startsWith('```')) {\n inCodeBlock = !inCodeBlock;\n continue;\n }\n if (!inCodeBlock && line.match(/^#{2,4}\\s/)) {\n sectionCount++;\n }\n }\n\n // Count code blocks\n const codeBlockCount = Math.floor((content.match(/```/g) || []).length / 2);\n\n // Count list items (-, *, or numbered)\n const listItemCount = lines.filter(line => line.match(/^[\\s]*[-*]\\s/) || line.match(/^[\\s]*\\d+\\.\\s/)).length;\n\n // Count tables (lines with table separators)\n const tableCount = lines.filter(line => line.includes('|') && line.match(/[-:]{3,}/)).length;\n\n // Count tokens using tiktoken\n const counter = new TokenCounter();\n const tokenCount = await counter.countString(content);\n counter.dispose();\n\n // Detect sub-specs by checking actual files in the spec directory\n let hasSubSpecs = false;\n let subSpecCount = 0;\n \n try {\n // Get the directory path (parent of README.md)\n const specDir = path.dirname(spec.filePath);\n const files = await fs.readdir(specDir);\n \n // Count markdown files excluding README.md\n // Sub-specs are markdown files other than README.md\n const mdFiles = files.filter(f => \n f.endsWith('.md') && \n f !== 'README.md'\n );\n \n hasSubSpecs = mdFiles.length > 0;\n subSpecCount = mdFiles.length;\n } catch (error) {\n // If we can't read the directory, fall back to content-based detection\n // This preserves backwards compatibility if there are permission issues\n hasSubSpecs = /\\b(DESIGN|IMPLEMENTATION|TESTING|CONFIGURATION|API|MIGRATION)\\.md\\b/.test(content);\n const subSpecMatches = content.match(/\\b[A-Z-]+\\.md\\b/g) || [];\n const uniqueSubSpecs = new Set(subSpecMatches.filter(m => m !== 'README.md'));\n subSpecCount = uniqueSubSpecs.size;\n }\n\n // Calculate average section length\n const averageSectionLength = sectionCount > 0 ? Math.round(lineCount / sectionCount) : 0;\n\n return {\n lineCount,\n tokenCount,\n sectionCount,\n codeBlockCount,\n listItemCount,\n tableCount,\n hasSubSpecs,\n subSpecCount,\n averageSectionLength,\n };\n }\n}\n","/**\n * Dependency Graph for LeanSpec\n * \n * Builds an in-memory graph of all spec relationships for efficient querying.\n * Handles three types of relationships:\n * - dependsOn: Upstream dependencies (current spec depends on these)\n * - requiredBy: Downstream dependents (these specs depend on current)\n * - related: Bidirectional informational connections\n */\n\nimport type { SpecInfo } from '../types/spec.js';\n\n/**\n * A node in the dependency graph\n */\ninterface DependencyNode {\n dependsOn: Set<string>; // Upstream (current depends on these)\n requiredBy: Set<string>; // Downstream (these depend on current)\n related: Set<string>; // Bidirectional connections\n}\n\n/**\n * Complete dependency information for a spec\n */\nexport interface CompleteDependencyGraph {\n current: SpecInfo;\n dependsOn: SpecInfo[]; // Upstream (current depends on these)\n requiredBy: SpecInfo[]; // Downstream (these depend on current)\n related: SpecInfo[]; // Bidirectional (includes both directions)\n}\n\n/**\n * Impact radius showing all specs affected by changes\n */\nexport interface ImpactRadius {\n current: SpecInfo;\n upstream: SpecInfo[]; // What this spec needs\n downstream: SpecInfo[]; // What needs this spec\n related: SpecInfo[]; // Connected work\n}\n\n/**\n * Manages the dependency graph for all specs\n */\nexport class SpecDependencyGraph {\n private graph: Map<string, DependencyNode>;\n private specs: Map<string, SpecInfo>;\n\n constructor(allSpecs: SpecInfo[]) {\n this.graph = new Map();\n this.specs = new Map();\n this.buildGraph(allSpecs);\n }\n\n /**\n * Build the complete dependency graph from all specs\n */\n private buildGraph(specs: SpecInfo[]): void {\n // First pass: Initialize all nodes and store spec metadata\n for (const spec of specs) {\n this.specs.set(spec.path, spec);\n this.graph.set(spec.path, {\n dependsOn: new Set(spec.frontmatter.depends_on || []),\n requiredBy: new Set(),\n related: new Set(spec.frontmatter.related || []),\n });\n }\n\n // Second pass: Build reverse edges\n for (const [specPath, node] of this.graph.entries()) {\n // For each dependsOn, add reverse requiredBy edge\n for (const dep of node.dependsOn) {\n const depNode = this.graph.get(dep);\n if (depNode) {\n depNode.requiredBy.add(specPath);\n }\n }\n \n // For each related, add bidirectional link\n for (const rel of node.related) {\n const relNode = this.graph.get(rel);\n if (relNode) {\n relNode.related.add(specPath);\n }\n }\n }\n }\n\n /**\n * Get complete dependency graph for a spec\n */\n getCompleteGraph(specPath: string): CompleteDependencyGraph {\n const spec = this.specs.get(specPath);\n if (!spec) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n\n const node = this.graph.get(specPath);\n if (!node) {\n throw new Error(`Graph node not found: ${specPath}`);\n }\n\n return {\n current: spec,\n dependsOn: this.getSpecsByPaths(Array.from(node.dependsOn)),\n requiredBy: this.getSpecsByPaths(Array.from(node.requiredBy)),\n related: this.getSpecsByPaths(Array.from(node.related)),\n };\n }\n\n /**\n * Get upstream dependencies (specs this one depends on)\n * Recursively traverses the dependsOn chain up to maxDepth\n */\n getUpstream(specPath: string, maxDepth: number = 3): SpecInfo[] {\n const visited = new Set<string>();\n const result: SpecInfo[] = [];\n \n const traverse = (path: string, depth: number) => {\n if (visited.has(path)) {\n return;\n }\n \n visited.add(path);\n const node = this.graph.get(path);\n if (!node) return;\n \n for (const dep of node.dependsOn) {\n if (!visited.has(dep)) {\n // Only add and traverse if we haven't exceeded maxDepth\n if (depth < maxDepth) {\n const spec = this.specs.get(dep);\n if (spec) {\n result.push(spec);\n traverse(dep, depth + 1);\n }\n }\n }\n }\n };\n \n traverse(specPath, 0);\n return result;\n }\n\n /**\n * Get downstream dependents (specs that depend on this one)\n * Recursively traverses the requiredBy chain up to maxDepth\n */\n getDownstream(specPath: string, maxDepth: number = 3): SpecInfo[] {\n const visited = new Set<string>();\n const result: SpecInfo[] = [];\n \n const traverse = (path: string, depth: number) => {\n if (visited.has(path)) {\n return;\n }\n \n visited.add(path);\n const node = this.graph.get(path);\n if (!node) return;\n \n for (const dep of node.requiredBy) {\n if (!visited.has(dep)) {\n // Only add and traverse if we haven't exceeded maxDepth\n if (depth < maxDepth) {\n const spec = this.specs.get(dep);\n if (spec) {\n result.push(spec);\n traverse(dep, depth + 1);\n }\n }\n }\n }\n };\n \n traverse(specPath, 0);\n return result;\n }\n\n /**\n * Get impact radius - all specs affected by changes to this spec\n * Includes upstream dependencies, downstream dependents, and related specs\n */\n getImpactRadius(specPath: string, maxDepth: number = 3): ImpactRadius {\n const spec = this.specs.get(specPath);\n if (!spec) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n\n const node = this.graph.get(specPath);\n if (!node) {\n throw new Error(`Graph node not found: ${specPath}`);\n }\n\n return {\n current: spec,\n upstream: this.getUpstream(specPath, maxDepth),\n downstream: this.getDownstream(specPath, maxDepth),\n related: this.getSpecsByPaths(Array.from(node.related)),\n };\n }\n\n /**\n * Check if a circular dependency exists\n */\n hasCircularDependency(specPath: string): boolean {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n \n const hasCycle = (path: string): boolean => {\n if (recursionStack.has(path)) {\n return true;\n }\n \n if (visited.has(path)) {\n return false;\n }\n \n visited.add(path);\n recursionStack.add(path);\n \n const node = this.graph.get(path);\n if (node) {\n for (const dep of node.dependsOn) {\n if (hasCycle(dep)) {\n return true;\n }\n }\n }\n \n recursionStack.delete(path);\n return false;\n };\n \n return hasCycle(specPath);\n }\n\n /**\n * Get all specs in the graph\n */\n getAllSpecs(): SpecInfo[] {\n return Array.from(this.specs.values());\n }\n\n /**\n * Get specs by their paths\n */\n private getSpecsByPaths(paths: string[]): SpecInfo[] {\n return paths\n .map(path => this.specs.get(path))\n .filter((spec): spec is SpecInfo => spec !== undefined);\n }\n}\n","/**\n * Relevance scoring algorithms for search results\n */\n\nimport type { SearchMatch } from './types.js';\n\n/**\n * Field weights for scoring (higher = more relevant)\n */\nexport const FIELD_WEIGHTS = {\n title: 100,\n name: 70,\n tags: 70,\n description: 50,\n content: 10,\n} as const;\n\n/**\n * Calculate relevance score for a match\n * \n * Scoring factors:\n * - Field weight (title > name > tags > description > content)\n * - Exact word match bonus (2x)\n * - Position bonus (earlier = more relevant)\n * - Frequency penalty (many matches = less specific)\n * \n * @param match - The search match to score\n * @param queryTerms - Individual query terms\n * @param totalMatches - Total matches found in the field\n * @param matchPosition - Position of this match (0-based)\n * @returns Score between 0-100\n */\nexport function calculateMatchScore(\n match: Pick<SearchMatch, 'field' | 'text' | 'occurrences'>,\n queryTerms: string[],\n totalMatches: number,\n matchPosition: number\n): number {\n // Start with field weight\n let score = FIELD_WEIGHTS[match.field];\n\n // Exact word match bonus (2x)\n const textLower = match.text.toLowerCase();\n const hasExactMatch = queryTerms.some(term => {\n // Check for word boundaries\n const regex = new RegExp(`\\\\b${escapeRegex(term)}\\\\b`, 'i');\n return regex.test(match.text);\n });\n \n if (hasExactMatch) {\n score *= 2;\n }\n\n // Position bonus (first match is 1.5x, decreases linearly)\n const positionBonus = Math.max(1.0, 1.5 - (matchPosition * 0.1));\n score *= positionBonus;\n\n // Frequency penalty (many matches = less specific)\n // Cap at 3 to avoid over-penalizing\n const frequencyFactor = Math.min(1.0, 3.0 / totalMatches);\n score *= frequencyFactor;\n\n // Normalize to 0-100 scale (multiply by 10 to get reasonable range)\n return Math.min(100, score * 10);\n}\n\n/**\n * Calculate overall relevance score for a spec\n * \n * Uses the highest scoring match from each field type,\n * weighted by field importance.\n * \n * @param matches - All matches for the spec\n * @returns Overall score between 0-100\n */\nexport function calculateSpecScore(matches: SearchMatch[]): number {\n if (matches.length === 0) return 0;\n\n // Group matches by field\n const fieldScores: Record<string, number> = {};\n \n for (const match of matches) {\n const field = match.field;\n const currentScore = fieldScores[field] || 0;\n fieldScores[field] = Math.max(currentScore, match.score);\n }\n\n // Calculate weighted average of best scores per field\n let totalScore = 0;\n let totalWeight = 0;\n\n for (const [field, score] of Object.entries(fieldScores)) {\n const weight = FIELD_WEIGHTS[field as keyof typeof FIELD_WEIGHTS] || 1;\n totalScore += score * weight;\n totalWeight += weight;\n }\n\n return totalWeight > 0 ? Math.round(totalScore / totalWeight) : 0;\n}\n\n/**\n * Check if text contains all query terms (AND logic)\n * \n * @param text - Text to search\n * @param queryTerms - Terms to find\n * @returns True if all terms are found\n */\nexport function containsAllTerms(text: string, queryTerms: string[]): boolean {\n const textLower = text.toLowerCase();\n return queryTerms.every(term => textLower.includes(term));\n}\n\n/**\n * Check if text contains any query term (OR logic)\n * \n * @param text - Text to search\n * @param queryTerms - Terms to find\n * @returns True if any term is found, false for empty queryTerms\n */\nexport function containsAnyTerm(text: string, queryTerms: string[]): boolean {\n // Note: returns false for empty queryTerms (no terms to match)\n const textLower = text.toLowerCase();\n return queryTerms.some(term => textLower.includes(term));\n}\n\n/**\n * Count occurrences of query terms in text\n * \n * @param text - Text to search\n * @param queryTerms - Terms to count\n * @returns Number of occurrences\n */\nexport function countOccurrences(text: string, queryTerms: string[]): number {\n const textLower = text.toLowerCase();\n let count = 0;\n \n for (const term of queryTerms) {\n const regex = new RegExp(escapeRegex(term), 'gi');\n const matches = textLower.match(regex);\n count += matches ? matches.length : 0;\n }\n \n return count;\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Find all match positions in text for query terms\n * \n * @param text - Text to search\n * @param queryTerms - Terms to find\n * @returns Array of [start, end] positions\n */\nexport function findMatchPositions(\n text: string,\n queryTerms: string[]\n): Array<[number, number]> {\n const positions: Array<[number, number]> = [];\n const textLower = text.toLowerCase();\n\n for (const term of queryTerms) {\n const termLower = term.toLowerCase();\n let index = 0;\n\n while ((index = textLower.indexOf(termLower, index)) !== -1) {\n positions.push([index, index + term.length]);\n index += term.length;\n }\n }\n\n // Sort by position and merge overlapping ranges\n positions.sort((a, b) => a[0] - b[0]);\n \n const merged: Array<[number, number]> = [];\n for (const pos of positions) {\n if (merged.length === 0) {\n merged.push(pos);\n } else {\n const last = merged[merged.length - 1];\n if (pos[0] <= last[1]) {\n // Overlapping, merge\n last[1] = Math.max(last[1], pos[1]);\n } else {\n merged.push(pos);\n }\n }\n }\n\n return merged;\n}\n","/**\n * Context extraction for search matches\n */\n\nimport type { SearchMatch } from './types.js';\nimport { findMatchPositions } from './scoring.js';\n\n/**\n * Extract context around a match with smart boundaries\n * \n * @param text - Full text content\n * @param matchIndex - Index of the line/position where match occurs\n * @param queryTerms - Query terms to highlight\n * @param contextLength - Characters before/after (default: 80)\n * @returns Context text with match highlighted\n */\nexport function extractContext(\n text: string,\n matchIndex: number,\n queryTerms: string[],\n contextLength: number = 80\n): { text: string; highlights: Array<[number, number]> } {\n const lines = text.split('\\n');\n const matchLine = lines[matchIndex] || '';\n\n // For short lines, just return the line\n if (matchLine.length <= contextLength * 2) {\n const highlights = findMatchPositions(matchLine, queryTerms);\n return { text: matchLine, highlights };\n }\n\n // Find first occurrence of any query term\n const matchLineLower = matchLine.toLowerCase();\n let firstMatchPos = matchLine.length;\n \n for (const term of queryTerms) {\n const pos = matchLineLower.indexOf(term.toLowerCase());\n if (pos !== -1 && pos < firstMatchPos) {\n firstMatchPos = pos;\n }\n }\n\n // Extract context around the match\n const start = Math.max(0, firstMatchPos - contextLength);\n const end = Math.min(matchLine.length, firstMatchPos + contextLength);\n \n let contextText = matchLine.substring(start, end);\n \n // Add ellipsis if truncated\n if (start > 0) contextText = '...' + contextText;\n if (end < matchLine.length) contextText = contextText + '...';\n\n // Adjust highlight positions for context\n const highlights = findMatchPositions(contextText, queryTerms);\n\n return { text: contextText, highlights };\n}\n\n/**\n * Extract context with sentence boundaries\n * \n * @param text - Full text content\n * @param matchIndex - Index where match occurs\n * @param queryTerms - Query terms to highlight\n * @param contextLength - Target characters before/after\n * @returns Context text respecting sentence boundaries\n */\nexport function extractSmartContext(\n text: string,\n matchIndex: number,\n queryTerms: string[],\n contextLength: number = 80\n): { text: string; highlights: Array<[number, number]> } {\n const lines = text.split('\\n');\n const matchLine = lines[matchIndex] || '';\n\n // For short content, use simple extraction\n if (matchLine.length <= contextLength * 2) {\n return extractContext(text, matchIndex, queryTerms, contextLength);\n }\n\n // Try to find sentence boundaries\n const matchLineLower = matchLine.toLowerCase();\n let firstMatchPos = matchLine.length;\n \n for (const term of queryTerms) {\n const pos = matchLineLower.indexOf(term.toLowerCase());\n if (pos !== -1 && pos < firstMatchPos) {\n firstMatchPos = pos;\n }\n }\n\n // Look for sentence boundaries (., !, ?)\n const sentenceEnd = /[.!?]\\s+/g;\n let start = Math.max(0, firstMatchPos - contextLength);\n let end = Math.min(matchLine.length, firstMatchPos + contextLength);\n\n // Try to expand to sentence boundaries if close\n const beforeText = matchLine.substring(0, start);\n const lastSentence = beforeText.lastIndexOf('. ');\n if (lastSentence !== -1 && start - lastSentence < 20) {\n start = lastSentence + 2; // Skip \". \"\n }\n\n const afterText = matchLine.substring(end);\n const nextSentence = afterText.indexOf('. ');\n if (nextSentence !== -1 && nextSentence < 20) {\n end = end + nextSentence + 1; // Include \".\"\n }\n\n let contextText = matchLine.substring(start, end);\n \n // Add ellipsis if truncated\n if (start > 0) contextText = '...' + contextText;\n if (end < matchLine.length) contextText = contextText + '...';\n\n const highlights = findMatchPositions(contextText, queryTerms);\n\n return { text: contextText, highlights };\n}\n\n/**\n * Deduplicate nearby matches\n * \n * If matches are within a certain distance, keep only the best scoring one.\n * \n * @param matches - All matches for a spec\n * @param minDistance - Minimum line distance between matches (default: 3)\n * @returns Deduplicated matches\n */\nexport function deduplicateMatches(\n matches: SearchMatch[],\n minDistance: number = 3\n): SearchMatch[] {\n if (matches.length === 0) return matches;\n\n // Sort by score (descending) then by line number\n const sorted = [...matches].sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return (a.lineNumber || 0) - (b.lineNumber || 0);\n });\n\n const deduplicated: SearchMatch[] = [];\n const usedLines = new Set<number>();\n\n for (const match of sorted) {\n // Non-content fields always included\n if (match.field !== 'content') {\n deduplicated.push(match);\n continue;\n }\n\n // Check if too close to an existing match\n const lineNum = match.lineNumber || 0;\n let tooClose = false;\n\n for (let i = lineNum - minDistance; i <= lineNum + minDistance; i++) {\n if (usedLines.has(i)) {\n tooClose = true;\n break;\n }\n }\n\n if (!tooClose) {\n deduplicated.push(match);\n usedLines.add(lineNum);\n }\n }\n\n // Sort by field priority and score for final output\n return deduplicated.sort((a, b) => {\n const fieldOrder = { title: 0, name: 1, tags: 2, description: 3, content: 4 };\n const orderA = fieldOrder[a.field];\n const orderB = fieldOrder[b.field];\n \n if (orderA !== orderB) return orderA - orderB;\n return b.score - a.score;\n });\n}\n\n/**\n * Limit matches per spec\n * \n * @param matches - All matches\n * @param maxMatches - Maximum matches to keep (default: 5)\n * @returns Limited matches (best scoring)\n */\nexport function limitMatches(\n matches: SearchMatch[],\n maxMatches: number = 5\n): SearchMatch[] {\n if (matches.length <= maxMatches) return matches;\n\n // Separate by field type\n const fieldMatches: Record<string, SearchMatch[]> = {\n title: [],\n name: [],\n tags: [],\n description: [],\n content: [],\n };\n\n for (const match of matches) {\n fieldMatches[match.field].push(match);\n }\n\n // Always include non-content matches\n const nonContent: SearchMatch[] = [\n ...fieldMatches.title,\n ...fieldMatches.name,\n ...fieldMatches.tags,\n ...fieldMatches.description,\n ];\n\n // Fill remaining slots with best content matches\n const contentMatches = fieldMatches.content\n .sort((a, b) => b.score - a.score)\n .slice(0, Math.max(0, maxMatches - nonContent.length));\n\n return [...nonContent, ...contentMatches];\n}\n","/**\n * Advanced query parser for search\n * \n * Supports:\n * - Boolean operators: AND, OR, NOT\n * - Field-specific search: status:in-progress, tag:api, priority:high\n * - Date range filters: created:>2025-11-01, created:2025-11-01..2025-11-15\n * - Fuzzy matching: term~\n * - Quoted phrases: \"exact phrase\"\n */\n\n/**\n * Token types for the query lexer\n */\nexport type TokenType =\n | 'TERM'\n | 'PHRASE'\n | 'FIELD'\n | 'AND'\n | 'OR'\n | 'NOT'\n | 'LPAREN'\n | 'RPAREN'\n | 'FUZZY'\n | 'EOF';\n\n/**\n * A token from the lexer\n */\nexport interface Token {\n type: TokenType;\n value: string;\n position: number;\n}\n\n/**\n * AST node types\n */\nexport type ASTNodeType = 'AND' | 'OR' | 'NOT' | 'TERM' | 'PHRASE' | 'FIELD' | 'FUZZY';\n\n/**\n * Abstract Syntax Tree node\n */\nexport interface ASTNode {\n type: ASTNodeType;\n value?: string;\n field?: string;\n left?: ASTNode;\n right?: ASTNode;\n children?: ASTNode[];\n}\n\n/**\n * Parsed query result\n */\nexport interface ParsedQuery {\n ast: ASTNode | null;\n /** Plain text terms for simple matching */\n terms: string[];\n /** Field filters extracted from query */\n fields: FieldFilter[];\n /** Date range filters */\n dateFilters: DateFilter[];\n /** Fuzzy terms */\n fuzzyTerms: string[];\n /** Whether the query has advanced syntax */\n hasAdvancedSyntax: boolean;\n /** Original query string */\n originalQuery: string;\n /** Parse errors if any */\n errors: string[];\n}\n\n/**\n * Field filter (e.g., status:in-progress)\n */\nexport interface FieldFilter {\n field: string;\n value: string;\n /** Whether to match exactly or as substring */\n exact: boolean;\n}\n\n/**\n * Date range filter\n */\nexport interface DateFilter {\n field: string;\n operator: '>' | '<' | '>=' | '<=' | '=' | 'range';\n value: string;\n endValue?: string; // For range queries\n}\n\n/**\n * Supported field prefixes for field-specific search\n */\nexport const SUPPORTED_FIELDS = [\n 'status',\n 'tag',\n 'tags',\n 'priority',\n 'assignee',\n 'title',\n 'name',\n 'created',\n 'updated',\n] as const;\n\nexport type SupportedField = (typeof SUPPORTED_FIELDS)[number];\n\n/**\n * Tokenize a query string\n */\nexport function tokenize(query: string): Token[] {\n const tokens: Token[] = [];\n let position = 0;\n\n while (position < query.length) {\n // Skip whitespace\n if (/\\s/.test(query[position])) {\n position++;\n continue;\n }\n\n // Quoted phrase\n if (query[position] === '\"') {\n const start = position;\n position++; // Skip opening quote\n let phrase = '';\n while (position < query.length && query[position] !== '\"') {\n phrase += query[position];\n position++;\n }\n position++; // Skip closing quote\n tokens.push({ type: 'PHRASE', value: phrase, position: start });\n continue;\n }\n\n // Parentheses\n if (query[position] === '(') {\n tokens.push({ type: 'LPAREN', value: '(', position });\n position++;\n continue;\n }\n if (query[position] === ')') {\n tokens.push({ type: 'RPAREN', value: ')', position });\n position++;\n continue;\n }\n\n // Word or operator\n const start = position;\n let word = '';\n while (position < query.length && !/[\\s()\"]/.test(query[position])) {\n word += query[position];\n position++;\n }\n\n if (word.length === 0) continue;\n\n // Check for boolean operators (case-insensitive)\n const upperWord = word.toUpperCase();\n if (upperWord === 'AND') {\n tokens.push({ type: 'AND', value: word, position: start });\n continue;\n }\n if (upperWord === 'OR') {\n tokens.push({ type: 'OR', value: word, position: start });\n continue;\n }\n if (upperWord === 'NOT') {\n tokens.push({ type: 'NOT', value: word, position: start });\n continue;\n }\n\n // Check for field prefix (e.g., status:planned)\n const colonIndex = word.indexOf(':');\n if (colonIndex > 0) {\n const fieldName = word.substring(0, colonIndex).toLowerCase();\n if (SUPPORTED_FIELDS.includes(fieldName as SupportedField)) {\n tokens.push({ type: 'FIELD', value: word, position: start });\n continue;\n }\n }\n\n // Check for fuzzy suffix (e.g., term~)\n if (word.endsWith('~')) {\n tokens.push({ type: 'FUZZY', value: word.slice(0, -1), position: start });\n continue;\n }\n\n // Regular term\n tokens.push({ type: 'TERM', value: word, position: start });\n }\n\n tokens.push({ type: 'EOF', value: '', position: query.length });\n return tokens;\n}\n\n/**\n * Parser for query tokens\n */\nclass QueryParser {\n private tokens: Token[];\n private current = 0;\n private errors: string[] = [];\n\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n\n parse(): { ast: ASTNode | null; errors: string[] } {\n if (this.tokens.length <= 1) {\n // Only EOF\n return { ast: null, errors: [] };\n }\n\n try {\n const ast = this.parseExpression();\n return { ast, errors: this.errors };\n } catch {\n return { ast: null, errors: this.errors };\n }\n }\n\n private parseExpression(): ASTNode | null {\n return this.parseOr();\n }\n\n private parseOr(): ASTNode | null {\n let left = this.parseAnd();\n if (!left) return null;\n\n while (this.check('OR')) {\n this.advance();\n const right = this.parseAnd();\n if (!right) {\n this.errors.push('Expected term after OR');\n break;\n }\n left = { type: 'OR', left, right };\n }\n\n return left;\n }\n\n private parseAnd(): ASTNode | null {\n let left = this.parseNot();\n if (!left) return null;\n\n // AND can be explicit or implicit (terms next to each other)\n while (this.check('AND') || this.isTermStart()) {\n if (this.check('AND')) {\n this.advance();\n }\n const right = this.parseNot();\n if (!right) break;\n left = { type: 'AND', left, right };\n }\n\n return left;\n }\n\n private parseNot(): ASTNode | null {\n if (this.check('NOT')) {\n this.advance();\n const operand = this.parsePrimary();\n if (!operand) {\n this.errors.push('Expected term after NOT');\n return null;\n }\n return { type: 'NOT', left: operand };\n }\n return this.parsePrimary();\n }\n\n private parsePrimary(): ASTNode | null {\n const token = this.peek();\n\n if (token.type === 'LPAREN') {\n this.advance();\n const expr = this.parseExpression();\n if (!this.check('RPAREN')) {\n this.errors.push('Expected closing parenthesis');\n } else {\n this.advance();\n }\n return expr;\n }\n\n if (token.type === 'TERM') {\n this.advance();\n return { type: 'TERM', value: token.value };\n }\n\n if (token.type === 'PHRASE') {\n this.advance();\n return { type: 'PHRASE', value: token.value };\n }\n\n if (token.type === 'FIELD') {\n this.advance();\n const colonIndex = token.value.indexOf(':');\n const field = token.value.substring(0, colonIndex).toLowerCase();\n const value = token.value.substring(colonIndex + 1);\n return { type: 'FIELD', field, value };\n }\n\n if (token.type === 'FUZZY') {\n this.advance();\n return { type: 'FUZZY', value: token.value };\n }\n\n return null;\n }\n\n private isTermStart(): boolean {\n const type = this.peek().type;\n return (\n type === 'TERM' ||\n type === 'PHRASE' ||\n type === 'FIELD' ||\n type === 'FUZZY' ||\n type === 'LPAREN' ||\n type === 'NOT'\n );\n }\n\n private peek(): Token {\n return this.tokens[this.current] || { type: 'EOF', value: '', position: 0 };\n }\n\n private check(type: TokenType): boolean {\n return this.peek().type === type;\n }\n\n private advance(): Token {\n if (!this.isAtEnd()) {\n this.current++;\n }\n return this.tokens[this.current - 1];\n }\n\n private isAtEnd(): boolean {\n return this.peek().type === 'EOF';\n }\n}\n\n/**\n * Extract field filters from AST\n */\nfunction extractFieldFilters(ast: ASTNode | null): FieldFilter[] {\n if (!ast) return [];\n\n const filters: FieldFilter[] = [];\n\n function traverse(node: ASTNode): void {\n if (node.type === 'FIELD' && node.field && node.value !== undefined) {\n filters.push({\n field: node.field,\n value: node.value,\n exact: true,\n });\n }\n if (node.left) traverse(node.left);\n if (node.right) traverse(node.right);\n if (node.children) {\n for (const child of node.children) {\n traverse(child);\n }\n }\n }\n\n traverse(ast);\n return filters;\n}\n\n/**\n * Extract date filters from field filters\n */\nfunction extractDateFilters(fieldFilters: FieldFilter[]): DateFilter[] {\n const dateFields = ['created', 'updated'];\n const dateFilters: DateFilter[] = [];\n\n for (const filter of fieldFilters) {\n if (!dateFields.includes(filter.field)) continue;\n\n const value = filter.value;\n\n // Range: 2025-11-01..2025-11-15\n if (value.includes('..')) {\n const [start, end] = value.split('..');\n dateFilters.push({\n field: filter.field,\n operator: 'range',\n value: start,\n endValue: end,\n });\n continue;\n }\n\n // Comparison operators\n if (value.startsWith('>=')) {\n dateFilters.push({\n field: filter.field,\n operator: '>=',\n value: value.substring(2),\n });\n } else if (value.startsWith('<=')) {\n dateFilters.push({\n field: filter.field,\n operator: '<=',\n value: value.substring(2),\n });\n } else if (value.startsWith('>')) {\n dateFilters.push({\n field: filter.field,\n operator: '>',\n value: value.substring(1),\n });\n } else if (value.startsWith('<')) {\n dateFilters.push({\n field: filter.field,\n operator: '<',\n value: value.substring(1),\n });\n } else {\n dateFilters.push({\n field: filter.field,\n operator: '=',\n value,\n });\n }\n }\n\n return dateFilters;\n}\n\n/**\n * Extract plain terms from AST\n */\nfunction extractTerms(ast: ASTNode | null): string[] {\n if (!ast) return [];\n\n const terms: string[] = [];\n\n function traverse(node: ASTNode): void {\n if (node.type === 'TERM' && node.value) {\n terms.push(node.value.toLowerCase());\n }\n if (node.type === 'PHRASE' && node.value) {\n terms.push(node.value.toLowerCase());\n }\n if (node.left) traverse(node.left);\n if (node.right) traverse(node.right);\n if (node.children) {\n for (const child of node.children) {\n traverse(child);\n }\n }\n }\n\n traverse(ast);\n return terms;\n}\n\n/**\n * Extract fuzzy terms from AST\n */\nfunction extractFuzzyTerms(ast: ASTNode | null): string[] {\n if (!ast) return [];\n\n const fuzzyTerms: string[] = [];\n\n function traverse(node: ASTNode): void {\n if (node.type === 'FUZZY' && node.value) {\n fuzzyTerms.push(node.value.toLowerCase());\n }\n if (node.left) traverse(node.left);\n if (node.right) traverse(node.right);\n if (node.children) {\n for (const child of node.children) {\n traverse(child);\n }\n }\n }\n\n traverse(ast);\n return fuzzyTerms;\n}\n\n/**\n * Check if query has advanced syntax\n */\nfunction hasAdvancedSyntax(tokens: Token[]): boolean {\n for (const token of tokens) {\n if (\n token.type === 'AND' ||\n token.type === 'OR' ||\n token.type === 'NOT' ||\n token.type === 'FIELD' ||\n token.type === 'FUZZY' ||\n token.type === 'PHRASE' ||\n token.type === 'LPAREN'\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Parse a search query string into a structured query object\n * \n * @param query - The search query string\n * @returns Parsed query with AST, terms, filters, etc.\n */\nexport function parseQuery(query: string): ParsedQuery {\n const trimmed = query.trim();\n \n if (!trimmed) {\n return {\n ast: null,\n terms: [],\n fields: [],\n dateFilters: [],\n fuzzyTerms: [],\n hasAdvancedSyntax: false,\n originalQuery: query,\n errors: [],\n };\n }\n\n const tokens = tokenize(trimmed);\n const parser = new QueryParser(tokens);\n const { ast, errors } = parser.parse();\n\n const fields = extractFieldFilters(ast);\n const dateFilters = extractDateFilters(fields);\n const terms = extractTerms(ast);\n const fuzzyTerms = extractFuzzyTerms(ast);\n\n return {\n ast,\n terms,\n fields,\n dateFilters,\n fuzzyTerms,\n hasAdvancedSyntax: hasAdvancedSyntax(tokens),\n originalQuery: query,\n errors,\n };\n}\n\n/**\n * Calculate Levenshtein distance between two strings\n * Used for fuzzy matching\n */\nexport function levenshteinDistance(a: string, b: string): number {\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n\n const matrix: number[][] = [];\n\n // Initialize matrix\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n // Fill matrix\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n}\n\n/**\n * Check if a term fuzzy matches a text\n * \n * @param term - The search term\n * @param text - The text to search in\n * @param maxDistance - Maximum edit distance (default: auto based on term length)\n * @returns True if the term fuzzy matches any word in the text\n */\nexport function fuzzyMatch(term: string, text: string, maxDistance?: number): boolean {\n const termLower = term.toLowerCase();\n const textLower = text.toLowerCase();\n \n // Auto-calculate max distance based on term length\n // Short terms (<=4): 1, medium terms (5-8): 2\n // This is more conservative to reduce false positives\n const autoDistance = termLower.length <= 4 ? 1 : 2;\n const threshold = maxDistance ?? autoDistance;\n\n // Check each word in the text\n const words = textLower.split(/\\s+/);\n for (const word of words) {\n if (levenshteinDistance(termLower, word) <= threshold) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Generate search syntax help text\n */\nexport function getSearchSyntaxHelp(): string {\n return `\nSearch Syntax:\n term Simple term search\n \"exact phrase\" Match exact phrase\n term1 AND term2 Both terms must match (AND is optional)\n term1 OR term2 Either term matches\n NOT term Exclude specs with term\n\nField Filters:\n status:in-progress Filter by status (planned, in-progress, complete, archived)\n tag:api Filter by tag\n priority:high Filter by priority (low, medium, high, critical)\n assignee:marvin Filter by assignee\n title:dashboard Search in title only\n name:oauth Search in spec name\n\nDate Filters:\n created:>2025-11-01 Created after date\n created:<2025-11-15 Created before date\n created:2025-11-01..2025-11-15 Created in date range\n updated:>=2025-11-01 Updated on or after date\n\nFuzzy Matching:\n authetication~ Matches \"authentication\" (typo-tolerant)\n\nExamples:\n api authentication Find specs with both terms\n tag:api status:planned API specs that are planned\n \"user session\" OR \"token refresh\" Either phrase\n dashboard NOT deprecated Dashboard specs, exclude deprecated\n authetication~ Find despite typo\n`.trim();\n}\n","/**\n * Core search engine implementation\n */\n\nimport type {\n SearchOptions,\n SearchResult,\n SearchResponse,\n SearchMatch,\n SearchResultSpec,\n} from './types.js';\nimport {\n calculateMatchScore,\n calculateSpecScore,\n containsAllTerms,\n containsAnyTerm,\n countOccurrences,\n findMatchPositions,\n} from './scoring.js';\nimport {\n extractSmartContext,\n deduplicateMatches,\n limitMatches,\n} from './context.js';\nimport {\n parseQuery,\n fuzzyMatch,\n type ParsedQuery,\n type FieldFilter,\n type DateFilter,\n type ASTNode,\n} from './query-parser.js';\n\n/**\n * Spec data structure for search\n */\nexport interface SearchableSpec {\n path: string;\n name: string;\n status: string;\n priority?: string;\n tags?: string[];\n title?: string;\n description?: string;\n content?: string;\n /** Created date (ISO string) */\n created?: string;\n /** Updated date (ISO string) */\n updated?: string;\n /** Assignee */\n assignee?: string;\n}\n\n/**\n * Check if spec contains all query terms across any combination of fields\n * \n * This enables cross-field matching: term A can be in title, term B in content\n * \n * @param spec - Spec to check\n * @param queryTerms - Terms that must all be present\n * @returns True if all terms are found somewhere in the spec, false for empty queryTerms\n */\nexport function specContainsAllTerms(spec: SearchableSpec, queryTerms: string[]): boolean {\n // Return false for empty query to match main search function behavior\n if (queryTerms.length === 0) {\n return false;\n }\n \n // Combine all searchable text from the spec\n const allText = [\n spec.title || '',\n spec.name || '',\n spec.tags?.join(' ') || '',\n spec.description || '',\n spec.content || '',\n ].join(' ').toLowerCase();\n \n return queryTerms.every(term => allText.includes(term));\n}\n\n/**\n * Search specs with intelligent relevance ranking\n * \n * @param query - Search query string\n * @param specs - Specs to search\n * @param options - Search options\n * @returns Search results with relevance scoring\n */\nexport function searchSpecs(\n query: string,\n specs: SearchableSpec[],\n options: SearchOptions = {}\n): SearchResponse {\n const startTime = Date.now();\n\n // Parse query into terms (split on whitespace)\n const queryTerms = query\n .trim()\n .toLowerCase()\n .split(/\\s+/)\n .filter(term => term.length > 0);\n\n if (queryTerms.length === 0) {\n return {\n results: [],\n metadata: {\n totalResults: 0,\n searchTime: Date.now() - startTime,\n query,\n specsSearched: specs.length,\n },\n };\n }\n\n // Search options\n const maxMatchesPerSpec = options.maxMatchesPerSpec || 5;\n const contextLength = options.contextLength || 80;\n\n // Search each spec\n const results: SearchResult[] = [];\n\n for (const spec of specs) {\n // First check: does the spec contain all query terms (across any fields)?\n if (!specContainsAllTerms(spec, queryTerms)) {\n continue; // Skip specs that don't have all terms somewhere\n }\n \n // Collect matches from fields that contain ANY query term\n // This provides context/highlighting even for partial field matches\n const matches = searchSpec(spec, queryTerms, contextLength);\n \n if (matches.length > 0) {\n // Deduplicate and limit matches\n let processedMatches = deduplicateMatches(matches, 3);\n processedMatches = limitMatches(processedMatches, maxMatchesPerSpec);\n\n // Calculate overall score\n const score = calculateSpecScore(processedMatches);\n\n results.push({\n spec: specToSearchResult(spec),\n score,\n totalMatches: matches.length,\n matches: processedMatches,\n });\n }\n }\n\n // Sort by relevance score (descending)\n results.sort((a, b) => b.score - a.score);\n\n return {\n results,\n metadata: {\n totalResults: results.length,\n searchTime: Date.now() - startTime,\n query,\n specsSearched: specs.length,\n },\n };\n}\n\n/**\n * Search a single spec for query terms\n * \n * Returns matches from fields containing ANY query terms (for context/highlighting)\n * when doing cross-field search where spec-level matching is already confirmed\n */\nfunction searchSpec(\n spec: SearchableSpec,\n queryTerms: string[],\n contextLength: number\n): SearchMatch[] {\n const matches: SearchMatch[] = [];\n\n // Search title - include if it has ANY query terms\n if (spec.title && containsAnyTerm(spec.title, queryTerms)) {\n const occurrences = countOccurrences(spec.title, queryTerms);\n const highlights = findMatchPositions(spec.title, queryTerms);\n const score = calculateMatchScore(\n { field: 'title', text: spec.title, occurrences },\n queryTerms,\n 1,\n 0\n );\n\n matches.push({\n field: 'title',\n text: spec.title,\n score,\n highlights,\n occurrences,\n });\n }\n\n // Search name - include if it has ANY query terms\n if (spec.name && containsAnyTerm(spec.name, queryTerms)) {\n const occurrences = countOccurrences(spec.name, queryTerms);\n const highlights = findMatchPositions(spec.name, queryTerms);\n const score = calculateMatchScore(\n { field: 'name', text: spec.name, occurrences },\n queryTerms,\n 1,\n 0\n );\n\n matches.push({\n field: 'name',\n text: spec.name,\n score,\n highlights,\n occurrences,\n });\n }\n\n // Search tags - include tags that have ANY query terms\n if (spec.tags && spec.tags.length > 0) {\n for (const tag of spec.tags) {\n if (containsAnyTerm(tag, queryTerms)) {\n const occurrences = countOccurrences(tag, queryTerms);\n const highlights = findMatchPositions(tag, queryTerms);\n const score = calculateMatchScore(\n { field: 'tags', text: tag, occurrences },\n queryTerms,\n spec.tags.length,\n spec.tags.indexOf(tag)\n );\n\n matches.push({\n field: 'tags',\n text: tag,\n score,\n highlights,\n occurrences,\n });\n }\n }\n }\n\n // Search description - include if it has ANY query terms\n if (spec.description && containsAnyTerm(spec.description, queryTerms)) {\n const occurrences = countOccurrences(spec.description, queryTerms);\n const highlights = findMatchPositions(spec.description, queryTerms);\n const score = calculateMatchScore(\n { field: 'description', text: spec.description, occurrences },\n queryTerms,\n 1,\n 0\n );\n\n matches.push({\n field: 'description',\n text: spec.description,\n score,\n highlights,\n occurrences,\n });\n }\n\n // Search content\n if (spec.content) {\n const contentMatches = searchContent(\n spec.content,\n queryTerms,\n contextLength\n );\n matches.push(...contentMatches);\n }\n\n return matches;\n}\n\n/**\n * Search content with context extraction\n * \n * Returns matches from lines containing ANY query terms\n */\nfunction searchContent(\n content: string,\n queryTerms: string[],\n contextLength: number\n): SearchMatch[] {\n const matches: SearchMatch[] = [];\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n \n // Include lines with ANY query terms (not all terms)\n if (containsAnyTerm(line, queryTerms)) {\n const occurrences = countOccurrences(line, queryTerms);\n const { text, highlights } = extractSmartContext(\n content,\n i,\n queryTerms,\n contextLength\n );\n\n const score = calculateMatchScore(\n { field: 'content', text: line, occurrences },\n queryTerms,\n lines.length,\n i\n );\n\n matches.push({\n field: 'content',\n text,\n lineNumber: i + 1, // 1-based line numbers\n score,\n highlights,\n occurrences,\n });\n }\n }\n\n return matches;\n}\n\n/**\n * Convert spec to search result format\n */\nfunction specToSearchResult(spec: SearchableSpec): SearchResultSpec {\n return {\n name: spec.name,\n path: spec.path,\n status: spec.status,\n priority: spec.priority,\n tags: spec.tags,\n title: spec.title,\n description: spec.description,\n };\n}\n\n/**\n * Check if a spec matches field filters\n */\nfunction specMatchesFieldFilters(spec: SearchableSpec, filters: FieldFilter[]): boolean {\n for (const filter of filters) {\n const field = filter.field;\n const filterValue = filter.value.toLowerCase();\n\n switch (field) {\n case 'status':\n if (spec.status.toLowerCase() !== filterValue) return false;\n break;\n case 'tag':\n case 'tags':\n if (!spec.tags?.some(tag => tag.toLowerCase() === filterValue)) return false;\n break;\n case 'priority':\n if (spec.priority?.toLowerCase() !== filterValue) return false;\n break;\n case 'assignee':\n if (spec.assignee?.toLowerCase() !== filterValue) return false;\n break;\n case 'title':\n if (!spec.title?.toLowerCase().includes(filterValue)) return false;\n break;\n case 'name':\n if (!spec.name.toLowerCase().includes(filterValue)) return false;\n break;\n // Date filters are handled separately\n case 'created':\n case 'updated':\n break;\n }\n }\n return true;\n}\n\n/**\n * Check if a spec matches date filters\n */\nfunction specMatchesDateFilters(spec: SearchableSpec, filters: DateFilter[]): boolean {\n for (const filter of filters) {\n const field = filter.field;\n const specDate = field === 'created' ? spec.created : spec.updated;\n \n if (!specDate) return false;\n \n // Normalize dates for comparison (just the date part)\n const specDateStr = specDate.substring(0, 10);\n const filterDateStr = filter.value.substring(0, 10);\n \n switch (filter.operator) {\n case '>':\n if (specDateStr <= filterDateStr) return false;\n break;\n case '>=':\n if (specDateStr < filterDateStr) return false;\n break;\n case '<':\n if (specDateStr >= filterDateStr) return false;\n break;\n case '<=':\n if (specDateStr > filterDateStr) return false;\n break;\n case '=':\n if (!specDateStr.startsWith(filterDateStr)) return false;\n break;\n case 'range':\n if (filter.endValue) {\n const endDateStr = filter.endValue.substring(0, 10);\n if (specDateStr < filterDateStr || specDateStr > endDateStr) return false;\n }\n break;\n }\n }\n return true;\n}\n\n/**\n * Evaluate AST against a spec (for boolean logic)\n */\nfunction evaluateAST(node: ASTNode | null, spec: SearchableSpec): boolean {\n if (!node) return true;\n\n switch (node.type) {\n case 'AND':\n return evaluateAST(node.left!, spec) && evaluateAST(node.right!, spec);\n case 'OR':\n return evaluateAST(node.left!, spec) || evaluateAST(node.right!, spec);\n case 'NOT':\n return !evaluateAST(node.left!, spec);\n case 'TERM':\n case 'PHRASE':\n return specContainsAllTerms(spec, [node.value!.toLowerCase()]);\n case 'FUZZY':\n return specContainsFuzzyTerm(spec, node.value!);\n case 'FIELD':\n return specMatchesFieldFilters(spec, [\n { field: node.field!, value: node.value!, exact: true },\n ]);\n default:\n return true;\n }\n}\n\n/**\n * Check if a spec contains a fuzzy term\n */\nfunction specContainsFuzzyTerm(spec: SearchableSpec, term: string): boolean {\n const allText = [\n spec.title || '',\n spec.name || '',\n spec.tags?.join(' ') || '',\n spec.description || '',\n spec.content || '',\n ].join(' ');\n\n return fuzzyMatch(term, allText);\n}\n\n/**\n * Advanced search with query syntax support\n * \n * @param query - Search query string with optional advanced syntax\n * @param specs - Specs to search\n * @param options - Search options\n * @returns Search results with relevance scoring\n */\nexport function advancedSearchSpecs(\n query: string,\n specs: SearchableSpec[],\n options: SearchOptions = {}\n): SearchResponse {\n const startTime = Date.now();\n const parsedQuery = parseQuery(query);\n\n // If no advanced syntax, delegate to regular search\n if (!parsedQuery.hasAdvancedSyntax && parsedQuery.errors.length === 0) {\n return searchSpecs(query, specs, options);\n }\n\n // Search options\n const maxMatchesPerSpec = options.maxMatchesPerSpec || 5;\n const contextLength = options.contextLength || 80;\n\n // Build combined query terms for highlighting (excluding field filters)\n const queryTerms = [\n ...parsedQuery.terms,\n ...parsedQuery.fuzzyTerms,\n ];\n\n // Filter by field and date filters first\n const nonDateFieldFilters = parsedQuery.fields.filter(\n f => f.field !== 'created' && f.field !== 'updated'\n );\n\n // Search each spec\n const results: SearchResult[] = [];\n\n for (const spec of specs) {\n // Check field filters\n if (!specMatchesFieldFilters(spec, nonDateFieldFilters)) {\n continue;\n }\n\n // Check date filters\n if (!specMatchesDateFilters(spec, parsedQuery.dateFilters)) {\n continue;\n }\n\n // Evaluate AST for boolean logic\n if (parsedQuery.ast && !evaluateAST(parsedQuery.ast, spec)) {\n continue;\n }\n\n // For specs that match the AST, collect matches for context\n const matches = queryTerms.length > 0\n ? searchSpec(spec, queryTerms, contextLength)\n : [];\n\n // Include spec if it matched the AST (already verified above)\n // Even if no highlighting matches found, the spec matched the query criteria\n let processedMatches = deduplicateMatches(matches, 3);\n processedMatches = limitMatches(processedMatches, maxMatchesPerSpec);\n\n const score = matches.length > 0 ? calculateSpecScore(processedMatches) : 50;\n\n results.push({\n spec: specToSearchResult(spec),\n score,\n totalMatches: matches.length || 1,\n matches: processedMatches,\n });\n }\n\n // Sort by relevance score (descending)\n results.sort((a, b) => b.score - a.score);\n\n return {\n results,\n metadata: {\n totalResults: results.length,\n searchTime: Date.now() - startTime,\n query,\n specsSearched: specs.length,\n },\n };\n}\n\n/**\n * Search specs with intelligent relevance ranking, with support for advanced query syntax\n * \n * Automatically detects advanced syntax (AND, OR, NOT, field:value, etc.) and uses\n * the appropriate search method.\n * \n * @param query - Search query string (supports advanced syntax)\n * @param specs - Specs to search\n * @param options - Search options\n * @returns Search results with relevance scoring\n */\nexport function searchSpecsAdvanced(\n query: string,\n specs: SearchableSpec[],\n options: SearchOptions = {}\n): SearchResponse {\n return advancedSearchSpecs(query, specs, options);\n}\n","/**\n * Helper functions for MCP server modules\n */\n\nimport * as fs from 'node:fs/promises';\nimport { countTokens } from '@leanspec/core';\nimport { loadSubFiles } from '../spec-loader.js';\nimport type { SpecData, SubSpecReference, BoardData } from './types.js';\n\n/**\n * Format error messages for MCP responses\n */\nexport function formatErrorMessage(prefix: string, error: unknown): string {\n const errorMsg = error instanceof Error ? error.message : String(error);\n return `${prefix}: ${errorMsg}`;\n}\n\n/**\n * Stale spec information\n */\nexport interface StaleSpec {\n name: string;\n daysStale: number;\n}\n\n/**\n * Get specs that have been in-progress for too long\n * Default threshold: 7 days\n */\nexport function getStaleSpecs(board: BoardData, thresholdDays = 7): StaleSpec[] {\n const now = new Date();\n const staleSpecs: StaleSpec[] = [];\n \n for (const spec of board.columns['in-progress']) {\n // Check updated_at first, then fall back to created date\n const lastActivity = spec.updated_at || spec.created;\n if (!lastActivity) continue;\n \n try {\n const activityDate = new Date(lastActivity);\n const daysSinceActivity = Math.floor((now.getTime() - activityDate.getTime()) / (1000 * 60 * 60 * 24));\n \n if (daysSinceActivity >= thresholdDays) {\n staleSpecs.push({\n name: spec.name,\n daysStale: daysSinceActivity,\n });\n }\n } catch {\n // Invalid date format, skip\n }\n }\n \n return staleSpecs;\n}\n\n/**\n * Convert spec info to serializable SpecData format\n */\nexport function specToData(spec: any): SpecData {\n return {\n name: spec.name,\n path: spec.path,\n status: spec.frontmatter.status,\n created: spec.frontmatter.created,\n title: spec.frontmatter.title,\n tags: spec.frontmatter.tags,\n priority: spec.frontmatter.priority,\n assignee: spec.frontmatter.assignee,\n description: spec.frontmatter.description,\n customFields: spec.frontmatter.custom,\n updated_at: spec.frontmatter.updated_at,\n };\n}\n\n/**\n * Regex pattern for detecting spec references in content.\n * Matches patterns like:\n * - \"spec: 001-feature\"\n * - \"specs: 023-something\"\n * - \"depends on: 042-dependency\"\n * The pattern expects at least 3 digits followed by optional hyphens and word characters.\n */\nexport const SPEC_REFERENCE_REGEX = /(?:spec[s]?[:\\s]+|depends on[:\\s]+)([0-9]{3,}[-\\w]+)/gi;\n\n/**\n * Extract H1 heading from markdown content\n */\nfunction extractH1(content: string): string | undefined {\n const h1Match = content.match(/^#\\s+(.+)$/m);\n return h1Match?.[1]?.trim();\n}\n\n/**\n * Get summary from content (H1 heading or first 100 chars)\n */\nfunction getSummary(content: string): string {\n const h1 = extractH1(content);\n if (h1) {\n return h1;\n }\n \n // Fall back to first 100 chars (remove frontmatter if present)\n const withoutFrontmatter = content.replace(/^---[\\s\\S]*?---\\n/, '');\n const firstLine = withoutFrontmatter.trim().split('\\n')[0];\n return firstLine.length > 100 ? firstLine.substring(0, 97) + '...' : firstLine;\n}\n\n/**\n * Load sub-spec metadata for progressive disclosure\n * See spec 084: Sub-Spec File Visibility in MCP Tools and Commands\n */\nexport async function loadSubSpecMetadata(specDir: string): Promise<SubSpecReference[]> {\n try {\n // Load all sub-files (documents only, no assets for metadata)\n const subFiles = await loadSubFiles(specDir, { includeContent: true });\n \n // Filter to only document files (.md)\n const documents = subFiles.filter(f => f.type === 'document');\n \n // Build metadata for each document\n const metadata: SubSpecReference[] = [];\n \n for (const doc of documents) {\n // Count tokens using core utility\n const tokenCount = await countTokens({ content: doc.content || '' });\n \n const ref: SubSpecReference = {\n name: doc.name,\n tokens: tokenCount.total,\n size: doc.size,\n };\n \n // Add summary if content is available\n if (doc.content) {\n ref.summary = getSummary(doc.content);\n }\n \n metadata.push(ref);\n }\n \n return metadata;\n } catch (error) {\n // Spec has no sub-files or directory doesn't exist\n return [];\n }\n}\n","/**\n * Agent tools - MCP tools for AI agent orchestration\n * \n * Implements spec 123: AI Coding Agent Integration for Automated Spec Orchestration\n */\n\nimport { z } from 'zod';\nimport {\n runAgent,\n showAgentStatus,\n listAgents,\n type AgentType,\n} from '../../commands/agent.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Agent run tool definition\n */\nexport function agentRunTool(): ToolDefinition {\n return [\n 'agent_run',\n {\n title: 'Run Agent',\n description: 'Dispatch spec(s) to an AI coding agent for implementation. The agent will receive the spec content as context and can start working on the implementation.',\n inputSchema: {\n specs: z.array(z.string()).describe('Spec(s) to dispatch (e.g., [\"045\", \"047\"])'),\n agent: z.enum(['claude', 'copilot', 'aider', 'gemini', 'gh-coding', 'continue']).optional().describe('Agent type to use. Defaults to configured default agent.'),\n parallel: z.boolean().optional().describe('Create git worktrees for parallel implementation'),\n statusUpdate: z.boolean().optional().describe('Update spec status to in-progress (default: true)'),\n dryRun: z.boolean().optional().describe('Show what would be done without executing'),\n },\n outputSchema: {\n success: z.boolean(),\n message: z.string(),\n details: z.string().optional(),\n specs: z.array(z.object({\n name: z.string(),\n status: z.string(),\n worktree: z.string().optional(),\n })).optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n const originalError = console.error;\n try {\n // Capture output\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n console.error = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await runAgent(input.specs, {\n agent: input.agent,\n parallel: input.parallel,\n statusUpdate: input.statusUpdate,\n dryRun: input.dryRun,\n });\n\n const output = {\n success: true,\n message: `Dispatched ${input.specs.length} spec(s) to ${input.agent || 'default'} agent`,\n details: capturedOutput.trim(),\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error running agent', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n }\n ];\n}\n\n/**\n * Agent status tool definition\n */\nexport function agentStatusTool(): ToolDefinition {\n return [\n 'agent_status',\n {\n title: 'Agent Status',\n description: 'Check the status of AI agent sessions for spec implementations.',\n inputSchema: {\n spec: z.string().optional().describe('Specific spec to check status for (optional)'),\n },\n outputSchema: {\n success: z.boolean(),\n sessions: z.record(z.object({\n specPath: z.string(),\n agent: z.string(),\n status: z.string(),\n startedAt: z.string(),\n worktree: z.string().optional(),\n pid: z.number().optional(),\n })).optional(),\n message: z.string().optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n // Capture JSON output\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await showAgentStatus(input.spec, { json: true });\n\n try {\n const sessions = JSON.parse(capturedOutput.trim());\n const output = {\n success: true,\n sessions,\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch {\n const output = {\n success: true,\n message: capturedOutput.trim() || 'No active sessions',\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n }\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error checking agent status', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n\n/**\n * Agent list tool definition\n */\nexport function agentListTool(): ToolDefinition {\n return [\n 'agent_list',\n {\n title: 'List Agents',\n description: 'List available AI coding agents and their configuration status.',\n inputSchema: {},\n outputSchema: {\n success: z.boolean(),\n agents: z.record(z.object({\n type: z.string(),\n available: z.boolean(),\n isDefault: z.boolean(),\n command: z.string().optional(),\n })).optional(),\n message: z.string().optional(),\n },\n },\n async (_input, _extra) => {\n const originalLog = console.log;\n try {\n // Capture JSON output\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await listAgents({ json: true });\n\n try {\n const agents = JSON.parse(capturedOutput.trim());\n const output = {\n success: true,\n agents,\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch {\n const output = {\n success: false,\n message: 'Failed to parse agents list',\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n }\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error listing agents', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport type { LeanSpecConfig } from '../config.js';\n\nexport interface GitInfo {\n user: string;\n email: string;\n repo: string;\n}\n\nexport interface VariableContext {\n name?: string;\n date?: string;\n projectName?: string;\n gitInfo?: GitInfo;\n customVariables?: Record<string, string>;\n frontmatter?: Record<string, unknown>;\n}\n\n/**\n * Get git information from the repository\n */\nexport async function getGitInfo(): Promise<GitInfo | null> {\n try {\n const user = execSync('git config user.name', { encoding: 'utf-8' }).trim();\n const email = execSync('git config user.email', { encoding: 'utf-8' }).trim();\n \n // Get repository name from remote URL\n let repo = '';\n try {\n const remoteUrl = execSync('git config --get remote.origin.url', { encoding: 'utf-8' }).trim();\n // Extract repo name from various formats:\n // https://github.com/user/repo.git -> repo\n // git@github.com:user/repo.git -> repo\n const match = remoteUrl.match(/\\/([^/]+?)(?:\\.git)?$/);\n if (match) {\n repo = match[1];\n }\n } catch {\n // No remote configured\n repo = '';\n }\n \n return { user, email, repo };\n } catch {\n // Git not configured or not in a git repository\n return null;\n }\n}\n\n/**\n * Get project name from package.json\n */\nexport async function getProjectName(cwd: string = process.cwd()): Promise<string | null> {\n try {\n const packageJsonPath = path.join(cwd, 'package.json');\n const content = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(content);\n return packageJson.name || null;\n } catch {\n // No package.json or invalid JSON\n return null;\n }\n}\n\n/**\n * Format status for display (with emoji and label)\n */\nfunction formatStatus(status: string): string {\n const statusMap: Record<string, string> = {\n 'planned': '📅 Planned',\n 'in-progress': '⏳ In progress',\n 'complete': '✅ Complete',\n 'archived': '📦 Archived',\n };\n return statusMap[status] || status;\n}\n\n/**\n * Format priority for display (capitalize)\n */\nfunction formatPriority(priority: string): string {\n return priority.charAt(0).toUpperCase() + priority.slice(1);\n}\n\n/**\n * Format a frontmatter value for display in template body\n */\nfunction formatFrontmatterValue(key: string, value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n \n // Handle special formatting for status\n if (key === 'status' && typeof value === 'string') {\n return formatStatus(value);\n }\n \n // Handle special formatting for priority\n if (key === 'priority' && typeof value === 'string') {\n return formatPriority(value);\n }\n \n // Handle arrays (e.g., tags)\n if (Array.isArray(value)) {\n return value.join(', ');\n }\n \n // Handle objects - convert to JSON string\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n \n // Convert everything else to string\n return String(value);\n}\n\n/**\n * Resolve variables in a string\n */\nexport function resolveVariables(\n template: string,\n context: VariableContext\n): string {\n let result = template;\n \n // Built-in variables\n if (context.name) {\n result = result.replace(/{name}/g, context.name);\n }\n \n if (context.date) {\n result = result.replace(/{date}/g, context.date);\n }\n \n if (context.projectName) {\n result = result.replace(/{project_name}/g, context.projectName);\n }\n \n // Git variables\n if (context.gitInfo) {\n result = result.replace(/{author}/g, context.gitInfo.user);\n result = result.replace(/{git_user}/g, context.gitInfo.user);\n result = result.replace(/{git_email}/g, context.gitInfo.email);\n result = result.replace(/{git_repo}/g, context.gitInfo.repo);\n }\n \n // Custom variables from config\n if (context.customVariables) {\n for (const [key, value] of Object.entries(context.customVariables)) {\n // Escape special regex characters in key to prevent RegExp injection\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(`\\\\{${escapedKey}\\\\}`, 'g');\n result = result.replace(pattern, value);\n }\n }\n \n // Frontmatter field variables\n if (context.frontmatter) {\n for (const [key, value] of Object.entries(context.frontmatter)) {\n const formattedValue = formatFrontmatterValue(key, value);\n // Escape special regex characters in key to prevent RegExp injection\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(`\\\\{${escapedKey}\\\\}`, 'g');\n result = result.replace(pattern, formattedValue);\n }\n }\n \n return result;\n}\n\n/**\n * Build a complete variable context\n */\nexport async function buildVariableContext(\n config: LeanSpecConfig,\n options: {\n name?: string;\n date?: string;\n } = {}\n): Promise<VariableContext> {\n const context: VariableContext = {\n name: options.name,\n date: options.date || new Date().toISOString().split('T')[0],\n customVariables: config.variables || {},\n };\n \n // Load project name\n context.projectName = (await getProjectName()) ?? undefined;\n \n // Load git info\n context.gitInfo = (await getGitInfo()) ?? undefined;\n \n return context;\n}\n","import * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { getSpecFile, updateFrontmatter } from '../frontmatter.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { loadAllSpecs } from '../spec-loader.js';\n\n/**\n * Link command - add relationships between specs\n */\nexport function linkCommand(): Command {\n return new Command('link')\n .description('Add relationships between specs (depends_on, related)')\n .argument('<spec>', 'Spec to update')\n .option('--depends-on <specs>', 'Add dependencies (comma-separated spec numbers or names)')\n .option('--related <specs>', 'Add related specs (comma-separated spec numbers or names)')\n .action(async (specPath: string, options: {\n dependsOn?: string;\n related?: string;\n }) => {\n if (!options.dependsOn && !options.related) {\n console.error('Error: At least one relationship type required (--depends-on or --related)');\n process.exit(1);\n }\n\n await linkSpec(specPath, options);\n });\n}\n\nexport async function linkSpec(\n specPath: string,\n options: {\n dependsOn?: string;\n related?: string;\n }\n): Promise<void> {\n // Auto-check for conflicts before update\n await autoCheckIfEnabled();\n\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n\n // Resolve the target spec path\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Get spec file\n const specFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n if (!specFile) {\n throw new Error(`No spec file found in: ${sanitizeUserInput(specPath)}`);\n }\n\n // Load all specs for validation\n const allSpecs = await loadAllSpecs({ includeArchived: true });\n const specMap = new Map(allSpecs.map(s => [s.path, s]));\n\n // Parse relationship specs\n const dependsOnSpecs = options.dependsOn ? options.dependsOn.split(',').map(s => s.trim()) : [];\n const relatedSpecs = options.related ? options.related.split(',').map(s => s.trim()) : [];\n\n // Get the target spec's short name for self-reference check\n const targetSpecName = path.basename(resolvedPath);\n\n // Validate all relationship specs exist and aren't self-references\n const allRelationshipSpecs = [...dependsOnSpecs, ...relatedSpecs];\n const resolvedRelationships = new Map<string, string>();\n\n for (const relSpec of allRelationshipSpecs) {\n // Check for self-reference\n if (relSpec === targetSpecName || relSpec === specPath) {\n throw new Error(`Cannot link spec to itself: ${sanitizeUserInput(relSpec)}`);\n }\n\n const relResolvedPath = await resolveSpecPath(relSpec, cwd, specsDir);\n if (!relResolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(relSpec)}`);\n }\n\n // Check for self-reference after resolution\n if (relResolvedPath === resolvedPath) {\n throw new Error(`Cannot link spec to itself: ${sanitizeUserInput(relSpec)}`);\n }\n\n const relSpecName = path.basename(relResolvedPath);\n resolvedRelationships.set(relSpec, relSpecName);\n }\n\n // Read current frontmatter to get existing relationships\n const { parseFrontmatter } = await import('../frontmatter.js');\n const currentFrontmatter = await parseFrontmatter(specFile);\n const currentDependsOn = currentFrontmatter?.depends_on || [];\n const currentRelated = currentFrontmatter?.related || [];\n\n // Build updated relationships (add new ones, keep existing)\n const updates: { depends_on?: string[]; related?: string[] } = {};\n\n if (dependsOnSpecs.length > 0) {\n const newDependsOn = [...currentDependsOn];\n let added = 0;\n for (const spec of dependsOnSpecs) {\n const resolvedName = resolvedRelationships.get(spec);\n if (resolvedName && !newDependsOn.includes(resolvedName)) {\n newDependsOn.push(resolvedName);\n added++;\n }\n }\n updates.depends_on = newDependsOn;\n if (added === 0) {\n console.log(chalk.gray(`ℹ Dependencies already exist, no changes made`));\n }\n }\n\n if (relatedSpecs.length > 0) {\n const newRelated = [...currentRelated];\n let added = 0;\n const bidirectionalUpdates: string[] = [];\n\n for (const spec of relatedSpecs) {\n const resolvedName = resolvedRelationships.get(spec);\n if (resolvedName && !newRelated.includes(resolvedName)) {\n newRelated.push(resolvedName);\n added++;\n bidirectionalUpdates.push(resolvedName);\n }\n }\n updates.related = newRelated;\n\n // Update related specs bidirectionally\n for (const relSpecName of bidirectionalUpdates) {\n const relSpecPath = await resolveSpecPath(relSpecName, cwd, specsDir);\n if (relSpecPath) {\n const relSpecFile = await getSpecFile(relSpecPath, config.structure.defaultFile);\n if (relSpecFile) {\n const relFrontmatter = await parseFrontmatter(relSpecFile);\n const relCurrentRelated = relFrontmatter?.related || [];\n if (!relCurrentRelated.includes(targetSpecName)) {\n await updateFrontmatter(relSpecFile, {\n related: [...relCurrentRelated, targetSpecName],\n });\n console.log(chalk.gray(` Updated: ${sanitizeUserInput(relSpecName)} (bidirectional)`));\n }\n }\n }\n }\n\n if (added === 0) {\n console.log(chalk.gray(`ℹ Related specs already exist, no changes made`));\n }\n }\n\n // Check for dependency cycles (warn, don't block)\n if (updates.depends_on && updates.depends_on.length > 0) {\n const cycles = detectCycles(targetSpecName, updates.depends_on, specMap);\n if (cycles.length > 0) {\n console.log(chalk.yellow(`⚠️ Dependency cycle detected: ${cycles.join(' → ')}`));\n }\n }\n\n // Update frontmatter\n await updateFrontmatter(specFile, updates);\n\n // Success message\n const updatedFields: string[] = [];\n if (dependsOnSpecs.length > 0) {\n updatedFields.push(`depends_on: ${dependsOnSpecs.join(', ')}`);\n }\n if (relatedSpecs.length > 0) {\n updatedFields.push(`related: ${relatedSpecs.join(', ')}`);\n }\n\n console.log(chalk.green(`✓ Added relationships: ${updatedFields.join(', ')}`));\n console.log(chalk.gray(` Updated: ${sanitizeUserInput(path.relative(cwd, resolvedPath))}`));\n}\n\n/**\n * Detect dependency cycles\n */\nfunction detectCycles(\n startSpec: string,\n dependsOn: string[],\n specMap: Map<string, any>,\n visited: Set<string> = new Set(),\n path: string[] = []\n): string[] {\n if (visited.has(startSpec)) {\n // Found a cycle\n const cycleStart = path.indexOf(startSpec);\n if (cycleStart !== -1) {\n return [...path.slice(cycleStart), startSpec];\n }\n return [];\n }\n\n visited.add(startSpec);\n path.push(startSpec);\n\n // Check each dependency\n for (const dep of dependsOn) {\n const depSpec = specMap.get(dep);\n if (depSpec && depSpec.frontmatter.depends_on) {\n const cycle = detectCycles(dep, depSpec.frontmatter.depends_on, specMap, new Set(visited), [...path]);\n if (cycle.length > 0) {\n return cycle;\n }\n }\n }\n\n return [];\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport matter from 'gray-matter';\nimport yaml from 'js-yaml';\nimport { Command } from 'commander';\nimport { loadConfig, extractGroup, resolvePrefix } from '../config.js';\nimport { getGlobalNextSeq } from '../utils/path-helpers.js';\nimport { buildVariableContext, resolveVariables, type VariableContext } from '../utils/variable-resolver.js';\nimport type { SpecPriority } from '../frontmatter.js';\nimport { normalizeDateFields } from '../frontmatter.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { parseCustomFieldOptions } from '../utils/cli-helpers.js';\nimport { linkSpec } from './link.js';\n\n/**\n * Create command - create new spec\n */\nexport function createCommand(): Command {\n return new Command('create')\n .description('Create new spec in folder structure')\n .argument('<name>', 'Name of the spec')\n .option('--title <title>', 'Set custom title')\n .option('--description <desc>', 'Set initial description')\n .option('--tags <tags>', 'Set tags (comma-separated)')\n .option('--priority <priority>', 'Set priority (low, medium, high, critical)')\n .option('--assignee <name>', 'Set assignee')\n .option('--template <template>', 'Use a specific template')\n .option('--field <name=value...>', 'Set custom field (can specify multiple)')\n .option('--no-prefix', 'Skip date prefix even if configured')\n .option('--depends-on <specs>', 'Add dependencies (comma-separated spec numbers or names)')\n .option('--related <specs>', 'Add related specs (comma-separated spec numbers or names)')\n .action(async (name: string, options: {\n title?: string;\n description?: string;\n tags?: string;\n priority?: SpecPriority;\n assignee?: string;\n template?: string;\n field?: string[];\n prefix?: boolean;\n dependsOn?: string;\n related?: string;\n }) => {\n const customFields = parseCustomFieldOptions(options.field);\n const createOptions: {\n title?: string;\n description?: string;\n tags?: string[];\n priority?: SpecPriority;\n assignee?: string;\n template?: string;\n customFields?: Record<string, unknown>;\n noPrefix?: boolean;\n dependsOn?: string[];\n related?: string[];\n } = {\n title: options.title,\n description: options.description,\n tags: options.tags ? options.tags.split(',').map(t => t.trim()) : undefined,\n priority: options.priority,\n assignee: options.assignee,\n template: options.template,\n customFields: Object.keys(customFields).length > 0 ? customFields : undefined,\n noPrefix: options.prefix === false,\n dependsOn: options.dependsOn ? options.dependsOn.split(',').map(s => s.trim()) : undefined,\n related: options.related ? options.related.split(',').map(s => s.trim()) : undefined,\n };\n await createSpec(name, createOptions);\n });\n}\n\nexport async function createSpec(name: string, options: { \n title?: string; \n description?: string;\n tags?: string[];\n priority?: SpecPriority;\n assignee?: string;\n template?: string;\n customFields?: Record<string, unknown>;\n noPrefix?: boolean;\n dependsOn?: string[];\n related?: string[];\n} = {}): Promise<void> {\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n\n // Ensure specs directory exists\n await fs.mkdir(specsDir, { recursive: true });\n\n // Get global next sequence number\n const seq = await getGlobalNextSeq(specsDir, config.structure.sequenceDigits);\n \n // Resolve the spec path based on pattern\n let specRelativePath: string;\n \n if (config.structure.pattern === 'flat') {\n // Flat pattern: optional prefix on folder name\n const prefix = options.noPrefix \n ? ''\n : config.structure.prefix \n ? resolvePrefix(config.structure.prefix, config.structure.dateFormat)\n : '';\n specRelativePath = `${prefix}${seq}-${name}`;\n } else if (config.structure.pattern === 'custom') {\n // Custom pattern: extract group from extractor string\n if (!config.structure.groupExtractor) {\n throw new Error('Custom pattern requires structure.groupExtractor in config');\n }\n \n const group = extractGroup(\n config.structure.groupExtractor,\n config.structure.dateFormat,\n options.customFields,\n config.structure.groupFallback\n );\n \n specRelativePath = `${group}/${seq}-${name}`;\n } else {\n // Unknown pattern\n throw new Error(`Unknown pattern: ${config.structure.pattern}`);\n }\n\n const specDir = path.join(specsDir, specRelativePath);\n const specFile = path.join(specDir, config.structure.defaultFile);\n\n // Check if directory exists\n try {\n await fs.access(specDir);\n // If we get here, directory exists\n throw new Error(`Spec already exists: ${sanitizeUserInput(specDir)}`);\n } catch (error: any) {\n // If error is ENOENT, directory doesn't exist - that's good, continue\n if (error.code === 'ENOENT') {\n // Directory doesn't exist, continue\n } else {\n // Some other error or the \"already exists\" error we threw\n throw error;\n }\n }\n\n // Create spec directory\n await fs.mkdir(specDir, { recursive: true });\n\n // Resolve template path from .lean-spec/templates/\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n let templateName: string;\n \n // Determine which template to use\n if (options.template) {\n // User specified a template\n if (config.templates?.[options.template]) {\n templateName = config.templates[options.template];\n } else {\n const available = Object.keys(config.templates || {}).join(', ');\n throw new Error(`Template not found: ${options.template}. Available templates: ${available}`);\n }\n } else {\n // Use default template\n templateName = config.template || 'spec-template.md';\n }\n \n let templatePath = path.join(templatesDir, templateName);\n\n // Backward compatibility: If template not found, try spec-template.md then README.md\n try {\n await fs.access(templatePath);\n } catch {\n // Try spec-template.md first (legacy)\n const legacyPath = path.join(templatesDir, 'spec-template.md');\n try {\n await fs.access(legacyPath);\n templatePath = legacyPath;\n templateName = 'spec-template.md';\n } catch {\n // Try README.md as fallback\n const readmePath = path.join(templatesDir, 'README.md');\n try {\n await fs.access(readmePath);\n templatePath = readmePath;\n templateName = 'README.md';\n } catch {\n throw new Error(`Template not found: ${templatePath}. Run: lean-spec init`);\n }\n }\n }\n\n // Load spec template from .lean-spec/templates/\n let content: string;\n let varContext: VariableContext;\n \n try {\n const template = await fs.readFile(templatePath, 'utf-8');\n const date = new Date().toISOString().split('T')[0];\n const title = options.title || name;\n \n // Build variable context and resolve all variables in template\n varContext = await buildVariableContext(config, { name: title, date });\n content = resolveVariables(template, varContext);\n \n // Parse frontmatter to get the resolved values (always needed for variable resolution)\n // Even with no custom options, we need to parse frontmatter to resolve variables like\n // {status}, {priority} in the body content with their default values from the template\n const parsed = matter(content, {\n engines: {\n yaml: (str) => yaml.load(str, { schema: yaml.FAILSAFE_SCHEMA }) as Record<string, unknown>\n }\n });\n \n // Ensure date fields remain as strings (gray-matter auto-parses YYYY-MM-DD as Date objects)\n normalizeDateFields(parsed.data);\n \n // Update frontmatter with provided metadata and custom fields (if any)\n if (options.tags && options.tags.length > 0) {\n parsed.data.tags = options.tags;\n }\n \n if (options.priority) {\n parsed.data.priority = options.priority;\n }\n \n if (options.assignee) {\n parsed.data.assignee = options.assignee;\n }\n \n if (options.customFields) {\n for (const [key, value] of Object.entries(options.customFields)) {\n parsed.data[key] = value;\n }\n }\n \n // Resolve frontmatter variables in the body content\n // This ensures that variables like {status}, {priority}, {tags} in the body\n // are replaced with the actual frontmatter values\n const contextWithFrontmatter = {\n ...varContext,\n frontmatter: parsed.data,\n };\n parsed.content = resolveVariables(parsed.content, contextWithFrontmatter);\n \n // Enrich with timestamps (created_at, etc.)\n const { enrichWithTimestamps } = await import('../frontmatter.js');\n enrichWithTimestamps(parsed.data);\n \n // Stringify back with updated frontmatter and resolved body content\n content = matter.stringify(parsed.content, parsed.data);\n \n // Add description to Overview section if provided\n if (options.description) {\n content = content.replace(\n /## Overview\\s+<!-- What are we solving\\? Why now\\? -->/,\n `## Overview\\n\\n${options.description}`\n );\n }\n } catch (error) {\n throw new Error(`Template not found: ${templatePath}. Run: lean-spec init`);\n }\n\n await fs.writeFile(specFile, content, 'utf-8');\n\n // For detailed templates, copy any additional sub-spec files\n // Check if there are other .md files in the templates directory\n try {\n const templateFiles = await fs.readdir(templatesDir);\n const additionalFiles = templateFiles.filter(f => \n f.endsWith('.md') && \n f !== templateName && \n f !== 'spec-template.md' && \n f !== config.structure.defaultFile\n );\n \n if (additionalFiles.length > 0) {\n for (const file of additionalFiles) {\n const srcPath = path.join(templatesDir, file);\n const destPath = path.join(specDir, file);\n \n // Read template file and process variables\n let fileContent = await fs.readFile(srcPath, 'utf-8');\n \n // Replace variables in the file\n fileContent = resolveVariables(fileContent, varContext);\n \n // Write to spec directory\n await fs.writeFile(destPath, fileContent, 'utf-8');\n }\n console.log(chalk.green(`✓ Created: ${sanitizeUserInput(specDir)}/`));\n console.log(chalk.gray(` Files: ${config.structure.defaultFile}, ${additionalFiles.join(', ')}`));\n } else {\n console.log(chalk.green(`✓ Created: ${sanitizeUserInput(specDir)}/`));\n console.log(chalk.gray(` Edit: ${sanitizeUserInput(specFile)}`));\n }\n } catch (error) {\n // If reading directory fails, just show the main file\n console.log(chalk.green(`✓ Created: ${sanitizeUserInput(specDir)}/`));\n console.log(chalk.gray(` Edit: ${sanitizeUserInput(specFile)}`));\n }\n \n // Add dependencies and related specs if specified\n const hasRelationships = (options.dependsOn && options.dependsOn.length > 0) || \n (options.related && options.related.length > 0);\n if (hasRelationships) {\n const newSpecName = path.basename(specDir);\n try {\n await linkSpec(newSpecName, {\n dependsOn: options.dependsOn?.join(','),\n related: options.related?.join(','),\n });\n } catch (error: any) {\n console.log(chalk.yellow(`⚠️ Warning: Failed to add relationships: ${error.message}`));\n }\n }\n \n // Auto-check for conflicts after creation\n await autoCheckIfEnabled();\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { getSpecFile, updateFrontmatter } from '../frontmatter.js';\n\n/**\n * Archive command - move spec to archived/\n */\nexport function archiveCommand(): Command {\n return new Command('archive')\n .description('Move spec to archived/')\n .argument('<spec>', 'Spec to archive')\n .action(async (specPath: string) => {\n await archiveSpec(specPath);\n });\n}\n\nexport async function archiveSpec(specPath: string): Promise<void> {\n // Auto-check for conflicts before archive\n await autoCheckIfEnabled();\n \n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n \n // Resolve the spec path using the helper\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Update frontmatter to archived status before moving\n const specFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n if (specFile) {\n await updateFrontmatter(specFile, { status: 'archived' });\n }\n\n // Archive to flat structure in specs/archived/ regardless of original pattern\n const archiveDir = path.join(specsDir, 'archived');\n await fs.mkdir(archiveDir, { recursive: true });\n\n const specName = path.basename(resolvedPath);\n const archivePath = path.join(archiveDir, specName);\n\n await fs.rename(resolvedPath, archivePath);\n\n console.log(chalk.green(`✓ Archived: ${sanitizeUserInput(archivePath)}`));\n}\n","import type { LeanSpecConfig } from '../config.js';\n\n/**\n * Detect the type of folder pattern being used\n */\nexport type PatternType = 'flat' | 'date-grouped' | 'custom-grouped';\n\nexport interface PatternInfo {\n type: PatternType;\n shouldGroup: boolean;\n groupExtractor?: string;\n isDateBased?: boolean;\n}\n\n/**\n * Analyze the configured pattern and determine how specs should be displayed\n * \n * @param config - The LeanSpec configuration\n * @returns {PatternInfo} Object containing:\n * - type: Pattern type ('flat', 'date-grouped', 'custom-grouped')\n * - shouldGroup: Whether specs should be displayed in groups\n * - groupExtractor: Optional group extraction pattern\n * - isDateBased: Optional flag indicating if grouping is date-based\n */\nexport function detectPatternType(config: LeanSpecConfig): PatternInfo {\n const { pattern, groupExtractor } = config.structure;\n\n // Case 1: Explicit flat pattern\n if (pattern === 'flat') {\n return {\n type: 'flat',\n shouldGroup: false,\n };\n }\n\n // Case 2: Custom pattern with grouping\n if (pattern === 'custom' && groupExtractor) {\n // Detect if it's date-based grouping\n // Matches any date format in braces: {YYYYMMDD}, {YYYY-MM-DD}, {YYYY-MM}, {YYYY}, etc.\n const isDateBased = /\\{YYYY[^}]*\\}/.test(groupExtractor);\n \n return {\n type: isDateBased ? 'date-grouped' : 'custom-grouped',\n shouldGroup: true,\n groupExtractor,\n isDateBased,\n };\n }\n\n // Case 3: Legacy or unknown pattern - default to flat\n return {\n type: 'flat',\n shouldGroup: false,\n };\n}\n\n/**\n * Check if a pattern uses date-based grouping\n * \n * @param config - The LeanSpec configuration\n * @returns true if the pattern groups specs by date\n */\nexport function isDateGroupedPattern(config: LeanSpecConfig): boolean {\n const info = detectPatternType(config);\n return info.type === 'date-grouped';\n}\n\n/**\n * Check if specs should be grouped when listed\n * \n * @param config - The LeanSpec configuration\n * @returns true if specs should be displayed in groups\n */\nexport function shouldGroupSpecs(config: LeanSpecConfig): boolean {\n const info = detectPatternType(config);\n return info.shouldGroup;\n}\n","import chalk from 'chalk';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { withSpinner, sanitizeUserInput } from '../utils/ui.js';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport type { SpecFilterOptions, SpecStatus, SpecPriority } from '../frontmatter.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { detectPatternType } from '../utils/pattern-detection.js';\nimport { PRIORITY_CONFIG, getStatusEmoji, getPriorityEmoji } from '../utils/colors.js';\nimport { parseCustomFieldOptions } from '../utils/cli-helpers.js';\n\n/**\n * List command - list all specs\n */\nexport function listCommand(): Command {\n return new Command('list')\n .description('List all specs')\n .option('--archived', 'Include archived specs')\n .option('--status <status>', 'Filter by status (planned, in-progress, complete, archived)')\n .option('--tag <tag...>', 'Filter by tag (can specify multiple)')\n .option('--priority <priority>', 'Filter by priority (low, medium, high, critical)')\n .option('--assignee <name>', 'Filter by assignee')\n .option('--field <name=value...>', 'Filter by custom field (can specify multiple)')\n .option('--sort <field>', 'Sort by field (id, created, name, status, priority)', 'id')\n .option('--order <order>', 'Sort order (asc, desc)', 'desc')\n .option('--json', 'Output as JSON')\n .action(async (options: {\n archived?: boolean;\n status?: SpecStatus;\n tag?: string[];\n priority?: SpecPriority;\n assignee?: string;\n field?: string[];\n sort?: string;\n order?: string;\n json?: boolean;\n }) => {\n const customFields = parseCustomFieldOptions(options.field);\n const listOptions: {\n showArchived?: boolean;\n status?: SpecStatus;\n tags?: string[];\n priority?: SpecPriority;\n assignee?: string;\n customFields?: Record<string, unknown>;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n json?: boolean;\n } = {\n showArchived: options.archived,\n status: options.status,\n tags: options.tag,\n priority: options.priority,\n assignee: options.assignee,\n customFields: Object.keys(customFields).length > 0 ? customFields : undefined,\n sortBy: options.sort || 'id',\n sortOrder: (options.order as 'asc' | 'desc') || 'desc',\n json: options.json,\n };\n await listSpecs(listOptions);\n });\n}\n\nexport async function listSpecs(options: {\n showArchived?: boolean;\n status?: SpecStatus | SpecStatus[];\n tags?: string[];\n priority?: SpecPriority | SpecPriority[];\n assignee?: string;\n customFields?: Record<string, unknown>;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n json?: boolean;\n} = {}): Promise<void> {\n // Auto-check for conflicts before listing\n await autoCheckIfEnabled();\n \n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n \n try {\n await fs.access(specsDir);\n } catch {\n console.log('');\n console.log('No specs directory found. Initialize with: lean-spec init');\n console.log('');\n return;\n }\n\n // Build filter options\n const filter: SpecFilterOptions = {};\n if (options.status) filter.status = options.status;\n if (options.tags) filter.tags = options.tags;\n if (options.priority) filter.priority = options.priority;\n if (options.assignee) filter.assignee = options.assignee;\n if (options.customFields) filter.customFields = options.customFields;\n\n const specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({\n includeArchived: options.showArchived || false,\n includeSubFiles: true, // Load sub-file info for display\n filter,\n sortBy: options.sortBy || 'id',\n sortOrder: options.sortOrder || 'desc',\n })\n );\n\n if (specs.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ specs: [], total: 0 }, null, 2));\n } else {\n console.log(chalk.dim('No specs found.'));\n }\n return;\n }\n\n // JSON output\n if (options.json) {\n const jsonOutput = {\n specs: specs.map(spec => ({\n path: spec.path,\n name: spec.name,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n tags: spec.frontmatter.tags,\n assignee: spec.frontmatter.assignee,\n created: spec.frontmatter.created,\n completed: spec.frontmatter.completed,\n subFiles: spec.subFiles?.length || 0,\n })),\n total: specs.length,\n filter: options,\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Display header\n console.log(chalk.bold.cyan('📄 Spec List'));\n \n // Filter info\n const filterParts: string[] = [];\n if (options.status) {\n const statusStr = Array.isArray(options.status) ? options.status.join(',') : options.status;\n filterParts.push(`status=${statusStr}`);\n }\n if (options.tags) filterParts.push(`tags=${options.tags.join(',')}`);\n if (options.priority) {\n const priorityStr = Array.isArray(options.priority) ? options.priority.join(',') : options.priority;\n filterParts.push(`priority=${priorityStr}`);\n }\n if (options.assignee) filterParts.push(`assignee=${options.assignee}`);\n \n if (filterParts.length > 0) {\n console.log(chalk.dim(`Filtered by: ${filterParts.join(', ')}`));\n }\n console.log('');\n\n // Detect pattern type and decide whether to group specs\n const patternInfo = detectPatternType(config);\n\n if (patternInfo.shouldGroup && patternInfo.groupExtractor) {\n renderGroupedList(specs, patternInfo.groupExtractor);\n } else {\n renderFlatList(specs);\n }\n\n console.log('');\n console.log(chalk.bold(`Total: ${chalk.green(specs.length)} spec${specs.length !== 1 ? 's' : ''}`));\n}\n\nfunction renderFlatList(specs: SpecInfo[]): void {\n // Simple flat list - no grouping\n for (const spec of specs) {\n const statusEmoji = getStatusEmoji(spec.frontmatter.status);\n const priorityEmoji = getPriorityEmoji(spec.frontmatter.priority);\n \n let assigneeStr = '';\n if (spec.frontmatter.assignee) {\n assigneeStr = ' ' + chalk.cyan(`@${sanitizeUserInput(spec.frontmatter.assignee)}`);\n }\n \n let tagsStr = '';\n if (spec.frontmatter.tags?.length) {\n const tags = Array.isArray(spec.frontmatter.tags) ? spec.frontmatter.tags : [];\n if (tags.length > 0) {\n const tagStr = tags.map(tag => `#${sanitizeUserInput(tag)}`).join(' ');\n tagsStr = ' ' + chalk.dim(chalk.magenta(tagStr));\n }\n }\n\n // Add sub-spec indicator if present\n let subSpecStr = '';\n if (spec.subFiles) {\n const docCount = spec.subFiles.filter(f => f.type === 'document').length;\n if (docCount > 0) {\n subSpecStr = ' ' + chalk.dim(chalk.yellow(`(+${docCount} sub-spec${docCount > 1 ? 's' : ''})`));\n }\n }\n\n const priorityPrefix = priorityEmoji ? `${priorityEmoji} ` : '';\n console.log(`${priorityPrefix}${statusEmoji} ${chalk.cyan(sanitizeUserInput(spec.path))}${assigneeStr}${tagsStr}${subSpecStr}`);\n }\n}\n\nfunction renderGroupedList(specs: SpecInfo[], groupExtractor: string): void {\n // Extract group pattern (e.g., \"{YYYYMMDD}\" or \"milestone-{milestone}\")\n const isDatePattern = groupExtractor.match(/\\{YYYY/);\n\n // Group specs by their folder/group\n const groups = new Map<string, SpecInfo[]>();\n \n for (const spec of specs) {\n // Extract group from path (first part before spec name)\n const pathParts = spec.path.split('/');\n let group = 'unknown';\n \n if (pathParts.length > 1) {\n // Has a parent folder (e.g., \"20251103/001-spec\" or \"milestone-1/001-spec\")\n group = pathParts[0];\n } else if (isDatePattern && spec.date) {\n // No folder but we have date metadata\n group = spec.date;\n }\n \n if (!groups.has(group)) {\n groups.set(group, []);\n }\n groups.get(group)!.push(spec);\n }\n\n // Sort groups (dates descending, others ascending)\n const sortedGroups = Array.from(groups.keys()).sort((a, b) => {\n // If looks like dates (8 digits), sort descending (newest first)\n if (/^\\d{8}$/.test(a) && /^\\d{8}$/.test(b)) {\n return b.localeCompare(a);\n }\n // Otherwise alphabetically ascending\n return a.localeCompare(b);\n });\n\n // Render each group\n for (let i = 0; i < sortedGroups.length; i++) {\n const groupName = sortedGroups[i];\n const groupSpecs = groups.get(groupName)!;\n\n // Group header\n const groupEmoji = /^\\d{8}$/.test(groupName) ? '📅' : \n groupName.startsWith('milestone') ? '🎯' :\n '📁';\n console.log(`${chalk.bold.cyan(`${groupEmoji} ${groupName}/`)} ${chalk.dim(`(${groupSpecs.length})`)}`);\n console.log('');\n\n // Render specs in this group - simple flat list\n for (const spec of groupSpecs) {\n const statusEmoji = getStatusEmoji(spec.frontmatter.status);\n const priorityEmoji = getPriorityEmoji(spec.frontmatter.priority);\n \n // Remove group prefix from display path\n const displayPath = spec.path.includes('/') \n ? spec.path.split('/').slice(1).join('/')\n : spec.path;\n \n let assigneeStr = '';\n if (spec.frontmatter.assignee) {\n assigneeStr = ' ' + chalk.cyan(`@${sanitizeUserInput(spec.frontmatter.assignee)}`);\n }\n \n let tagsStr = '';\n if (spec.frontmatter.tags?.length) {\n const tags = Array.isArray(spec.frontmatter.tags) ? spec.frontmatter.tags : [];\n if (tags.length > 0) {\n const tagStr = tags.map(tag => `#${sanitizeUserInput(tag)}`).join(' ');\n tagsStr = ' ' + chalk.dim(chalk.magenta(tagStr));\n }\n }\n\n // Add sub-spec indicator if present\n let subSpecStr = '';\n if (spec.subFiles) {\n const docCount = spec.subFiles.filter(f => f.type === 'document').length;\n if (docCount > 0) {\n subSpecStr = ' ' + chalk.dim(chalk.yellow(`(+${docCount} sub-spec${docCount > 1 ? 's' : ''})`));\n }\n }\n\n const priorityPrefix = priorityEmoji ? `${priorityEmoji} ` : '';\n console.log(` ${priorityPrefix}${statusEmoji} ${chalk.cyan(sanitizeUserInput(displayPath))}${assigneeStr}${tagsStr}${subSpecStr}`);\n }\n\n // Spacing between groups\n if (i < sortedGroups.length - 1) {\n console.log('');\n }\n }\n}\n","import * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { getSpecFile, updateFrontmatter } from '../frontmatter.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\n\n/**\n * Unlink command - remove relationships between specs\n */\nexport function unlinkCommand(): Command {\n return new Command('unlink')\n .description('Remove relationships between specs (depends_on, related)')\n .argument('<spec>', 'Spec to update')\n .option('--depends-on [specs]', 'Remove dependencies (comma-separated spec numbers or names, or use with --all)')\n .option('--related [specs]', 'Remove related specs (comma-separated spec numbers or names, or use with --all)')\n .option('--all', 'Remove all relationships of the specified type(s)')\n .action(async (specPath: string, options: {\n dependsOn?: string | boolean;\n related?: string | boolean;\n all?: boolean;\n }) => {\n if (!options.dependsOn && !options.related) {\n console.error('Error: At least one relationship type required (--depends-on or --related)');\n process.exit(1);\n }\n\n await unlinkSpec(specPath, options);\n });\n}\n\nexport async function unlinkSpec(\n specPath: string,\n options: {\n dependsOn?: string | boolean;\n related?: string | boolean;\n all?: boolean;\n }\n): Promise<void> {\n // Auto-check for conflicts before update\n await autoCheckIfEnabled();\n\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n\n // Resolve the target spec path\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Get spec file\n const specFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n if (!specFile) {\n throw new Error(`No spec file found in: ${sanitizeUserInput(specPath)}`);\n }\n\n // Get the target spec's short name\n const targetSpecName = path.basename(resolvedPath);\n\n // Read current frontmatter\n const { parseFrontmatter } = await import('../frontmatter.js');\n const currentFrontmatter = await parseFrontmatter(specFile);\n const currentDependsOn = currentFrontmatter?.depends_on || [];\n const currentRelated = currentFrontmatter?.related || [];\n\n // Build updated relationships\n const updates: { depends_on?: string[]; related?: string[] } = {};\n let removedCount = 0;\n\n if (options.dependsOn !== undefined) {\n if (options.all || options.dependsOn === true) {\n // Remove all dependencies (when --all or --depends-on used without value)\n updates.depends_on = [];\n removedCount += currentDependsOn.length;\n } else {\n // Remove specific dependencies\n const toRemove = (options.dependsOn as string).split(',').map(s => s.trim());\n const resolvedToRemove = new Set<string>();\n\n // Resolve each spec to remove\n for (const spec of toRemove) {\n const resolvedSpecPath = await resolveSpecPath(spec, cwd, specsDir);\n if (resolvedSpecPath) {\n resolvedToRemove.add(path.basename(resolvedSpecPath));\n } else {\n // Also try to match by spec name directly\n resolvedToRemove.add(spec);\n }\n }\n\n const newDependsOn = currentDependsOn.filter(dep => !resolvedToRemove.has(dep));\n removedCount += currentDependsOn.length - newDependsOn.length;\n updates.depends_on = newDependsOn;\n }\n }\n\n if (options.related !== undefined) {\n if (options.all || options.related === true) {\n // Remove all related specs and update them bidirectionally (when --all or --related used without value)\n for (const relSpec of currentRelated) {\n const relSpecPath = await resolveSpecPath(relSpec, cwd, specsDir);\n if (relSpecPath) {\n const relSpecFile = await getSpecFile(relSpecPath, config.structure.defaultFile);\n if (relSpecFile) {\n const relFrontmatter = await parseFrontmatter(relSpecFile);\n const relCurrentRelated = relFrontmatter?.related || [];\n const relNewRelated = relCurrentRelated.filter(r => r !== targetSpecName);\n if (relNewRelated.length !== relCurrentRelated.length) {\n await updateFrontmatter(relSpecFile, {\n related: relNewRelated,\n });\n console.log(chalk.gray(` Updated: ${sanitizeUserInput(relSpec)} (bidirectional)`));\n }\n }\n }\n }\n removedCount += currentRelated.length;\n updates.related = [];\n } else {\n // Remove specific related specs\n const toRemove = (options.related as string).split(',').map(s => s.trim());\n const resolvedToRemove = new Set<string>();\n\n // Resolve each spec to remove and update bidirectionally\n for (const spec of toRemove) {\n const resolvedSpecPath = await resolveSpecPath(spec, cwd, specsDir);\n if (resolvedSpecPath) {\n const specName = path.basename(resolvedSpecPath);\n resolvedToRemove.add(specName);\n\n // Update the related spec to remove reverse relationship\n const relSpecFile = await getSpecFile(resolvedSpecPath, config.structure.defaultFile);\n if (relSpecFile) {\n const relFrontmatter = await parseFrontmatter(relSpecFile);\n const relCurrentRelated = relFrontmatter?.related || [];\n const relNewRelated = relCurrentRelated.filter(r => r !== targetSpecName);\n if (relNewRelated.length !== relCurrentRelated.length) {\n await updateFrontmatter(relSpecFile, {\n related: relNewRelated,\n });\n console.log(chalk.gray(` Updated: ${sanitizeUserInput(specName)} (bidirectional)`));\n }\n }\n } else {\n // Try to match by spec name directly\n resolvedToRemove.add(spec);\n }\n }\n\n const newRelated = currentRelated.filter(rel => !resolvedToRemove.has(rel));\n removedCount += currentRelated.length - newRelated.length;\n updates.related = newRelated;\n }\n }\n\n // Update frontmatter\n await updateFrontmatter(specFile, updates);\n\n // Success message\n if (removedCount === 0) {\n console.log(chalk.gray(`ℹ No matching relationships found to remove`));\n } else {\n const updatedFields: string[] = [];\n if (options.dependsOn !== undefined) {\n updatedFields.push(`depends_on`);\n }\n if (options.related !== undefined) {\n updatedFields.push(`related`);\n }\n console.log(chalk.green(`✓ Removed relationships: ${updatedFields.join(', ')} (${removedCount} total)`));\n console.log(chalk.gray(` Updated: ${sanitizeUserInput(path.relative(cwd, resolvedPath))}`));\n }\n}\n","import { execSync } from 'node:child_process';\nimport * as path from 'node:path';\nimport type { SpecStatus, StatusTransition } from '../frontmatter.js';\n\nexport interface GitTimestampData {\n created_at?: string;\n updated_at?: string;\n completed_at?: string;\n assignee?: string;\n transitions?: StatusTransition[];\n}\n\n/**\n * Check if the current directory is a git repository\n */\nexport function isGitRepository(): boolean {\n try {\n execSync('git rev-parse --is-inside-work-tree', { \n stdio: 'ignore',\n encoding: 'utf-8' \n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the timestamp of the first commit that created a file\n */\nexport function getFirstCommitTimestamp(filePath: string): string | null {\n try {\n // Use --follow to track file renames\n // Use --diff-filter=A to find the commit that added the file\n // Format as ISO 8601 timestamp\n const timestamp = execSync(\n `git log --follow --format=\"%aI\" --diff-filter=A -- \"${filePath}\" | tail -1`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n \n return timestamp || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the timestamp of the most recent commit that modified a file\n */\nexport function getLastCommitTimestamp(filePath: string): string | null {\n try {\n const timestamp = execSync(\n `git log --format=\"%aI\" -n 1 -- \"${filePath}\"`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n \n return timestamp || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the timestamp when a spec was marked as complete\n * Searches git history for status changes to \"complete\"\n */\nexport function getCompletionTimestamp(filePath: string): string | null {\n try {\n // Get all commits that modified the file, with patch output\n const gitLog = execSync(\n `git log --format=\"%H|%aI\" -p -- \"${filePath}\"`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n );\n \n // Parse commits to find status change to complete\n const commits = gitLog.split('\\ndiff --git').map(section => section.trim());\n \n for (const commit of commits) {\n if (!commit) continue;\n \n // Extract commit hash and timestamp from header\n const headerMatch = commit.match(/^([a-f0-9]{40})\\|([^\\n]+)/);\n if (!headerMatch) continue;\n \n const [, , timestamp] = headerMatch;\n \n // Look for status: complete in the diff\n // Check for both YAML frontmatter and inline status changes\n if (\n /^\\+status:\\s*['\"]?complete['\"]?/m.test(commit) ||\n /^\\+\\*\\*Status\\*\\*:.*complete/mi.test(commit)\n ) {\n return timestamp;\n }\n }\n \n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the author of the first commit (for assignee inference)\n */\nexport function getFirstCommitAuthor(filePath: string): string | null {\n try {\n const author = execSync(\n `git log --follow --format=\"%an\" --diff-filter=A -- \"${filePath}\" | tail -1`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n \n return author || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Parse all status transitions from git history\n * Reconstructs the full status change timeline\n */\nexport function parseStatusTransitions(filePath: string): StatusTransition[] {\n const transitions: StatusTransition[] = [];\n \n try {\n // Get all commits that modified the file, with patch output\n const gitLog = execSync(\n `git log --format=\"%H|%aI\" -p --reverse -- \"${filePath}\"`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n );\n \n // Parse commits in chronological order (--reverse)\n const commits = gitLog.split('\\ndiff --git').map(section => section.trim());\n \n const validStatuses: SpecStatus[] = ['planned', 'in-progress', 'complete', 'archived'];\n \n for (const commit of commits) {\n if (!commit) continue;\n \n // Extract commit hash and timestamp from header\n const headerMatch = commit.match(/^([a-f0-9]{40})\\|([^\\n]+)/);\n if (!headerMatch) continue;\n \n const [, , timestamp] = headerMatch;\n \n // Look for status changes in the diff\n // Match: +status: complete or +status: 'complete'\n const statusMatch = commit.match(/^\\+status:\\s*['\"]?(\\w+(?:-\\w+)?)['\"]?/m);\n if (statusMatch) {\n const status = statusMatch[1] as SpecStatus;\n \n // Only record valid status values\n if (validStatuses.includes(status)) {\n // Avoid duplicate consecutive transitions\n const lastTransition = transitions[transitions.length - 1];\n if (!lastTransition || lastTransition.status !== status) {\n transitions.push({ status, at: timestamp });\n }\n }\n }\n }\n \n return transitions;\n } catch {\n return [];\n }\n}\n\n/**\n * Extract all git timestamp data for a spec file\n */\nexport function extractGitTimestamps(\n filePath: string,\n options: {\n includeAssignee?: boolean;\n includeTransitions?: boolean;\n } = {}\n): GitTimestampData {\n const data: GitTimestampData = {};\n \n // Core timestamps (always extracted)\n data.created_at = getFirstCommitTimestamp(filePath) ?? undefined;\n data.updated_at = getLastCommitTimestamp(filePath) ?? undefined;\n data.completed_at = getCompletionTimestamp(filePath) ?? undefined;\n \n // Optional fields\n if (options.includeAssignee) {\n const author = getFirstCommitAuthor(filePath);\n if (author) {\n data.assignee = author;\n }\n }\n \n if (options.includeTransitions) {\n const transitions = parseStatusTransitions(filePath);\n if (transitions.length > 0) {\n data.transitions = transitions;\n }\n }\n \n return data;\n}\n\n/**\n * Validate that a file exists in git history\n */\nexport function fileExistsInGit(filePath: string): boolean {\n try {\n execSync(\n `git log -n 1 -- \"${filePath}\"`,\n { stdio: 'ignore', encoding: 'utf-8' }\n );\n return true;\n } catch {\n return false;\n }\n}\n","import * as path from 'node:path';\nimport { Command } from 'commander';\nimport { loadAllSpecs, getSpec, type SpecInfo } from '../spec-loader.js';\nimport { updateFrontmatter, type SpecFrontmatter } from '../frontmatter.js';\nimport { loadConfig } from '../config.js';\nimport { \n isGitRepository,\n extractGitTimestamps,\n fileExistsInGit,\n type GitTimestampData,\n} from '../utils/git-timestamps.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\n\nexport interface BackfillResult {\n specPath: string;\n specName: string;\n created_at?: string;\n updated_at?: string;\n completed_at?: string;\n assignee?: string;\n transitionsCount?: number;\n source: 'git' | 'existing' | 'skipped';\n reason?: string;\n}\n\nexport interface BackfillOptions {\n dryRun?: boolean;\n force?: boolean;\n includeAssignee?: boolean;\n includeTransitions?: boolean;\n specs?: string[]; // specific specs to target\n json?: boolean;\n}\n\n/**\n * Backfill command - backfill timestamps from git history\n */\nexport function backfillCommand(): Command {\n return new Command('backfill')\n .description('Backfill timestamps from git history')\n .argument('[specs...]', 'Specific specs to backfill (optional)')\n .option('--dry-run', 'Show what would be updated without making changes')\n .option('--force', 'Overwrite existing timestamp values')\n .option('--assignee', 'Include assignee from first commit author')\n .option('--transitions', 'Include full status transition history')\n .option('--all', 'Include all optional fields (assignee + transitions)')\n .option('--json', 'Output as JSON')\n .action(async (specs: string[] | undefined, options: {\n dryRun?: boolean;\n force?: boolean;\n assignee?: boolean;\n transitions?: boolean;\n all?: boolean;\n json?: boolean;\n }) => {\n await backfillTimestamps({\n dryRun: options.dryRun,\n force: options.force,\n includeAssignee: options.assignee || options.all,\n includeTransitions: options.transitions || options.all,\n specs: specs && specs.length > 0 ? specs : undefined,\n json: options.json,\n });\n });\n}\n\n/**\n * Backfill timestamps from git history for all or specific specs\n */\nexport async function backfillTimestamps(options: BackfillOptions = {}): Promise<BackfillResult[]> {\n const results: BackfillResult[] = [];\n \n // Check if we're in a git repository\n if (!isGitRepository()) {\n console.error('\\x1b[31mError:\\x1b[0m Not in a git repository');\n console.error('Git history is required for backfilling timestamps');\n process.exit(1);\n }\n \n // Load specs to process\n let specs: SpecInfo[];\n \n if (options.specs && options.specs.length > 0) {\n // Load specific specs\n specs = [];\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n \n for (const specPath of options.specs) {\n const resolved = await resolveSpecPath(specPath, cwd, specsDir);\n if (!resolved) {\n console.warn(`\\x1b[33mWarning:\\x1b[0m Spec not found: ${specPath}`);\n continue;\n }\n const spec = await getSpec(resolved);\n if (spec) {\n specs.push(spec);\n }\n }\n } else {\n // Load all specs (including archived)\n specs = await loadAllSpecs({ includeArchived: true });\n }\n \n if (specs.length === 0) {\n console.log('No specs found to backfill');\n return results;\n }\n \n // Show what we're doing\n if (options.dryRun) {\n console.log('\\x1b[36m🔍 Dry run mode - no changes will be made\\x1b[0m\\n');\n }\n \n console.log(`Analyzing git history for ${specs.length} spec${specs.length === 1 ? '' : 's'}...\\n`);\n \n // Process each spec\n for (const spec of specs) {\n const result = await backfillSpecTimestamps(spec, options);\n results.push(result);\n }\n \n // Print summary\n printSummary(results, options);\n \n return results;\n}\n\n/**\n * Backfill timestamps for a single spec\n */\nasync function backfillSpecTimestamps(\n spec: SpecInfo,\n options: BackfillOptions\n): Promise<BackfillResult> {\n const result: BackfillResult = {\n specPath: spec.path,\n specName: spec.name,\n source: 'skipped',\n };\n \n // Check if file exists in git history\n if (!fileExistsInGit(spec.filePath)) {\n result.reason = 'Not in git history';\n console.log(`\\x1b[33m⊘\\x1b[0m ${spec.name} - Not in git history`);\n return result;\n }\n \n // Extract git timestamps\n const gitData = extractGitTimestamps(spec.filePath, {\n includeAssignee: options.includeAssignee,\n includeTransitions: options.includeTransitions,\n });\n \n // Determine what needs to be updated\n const updates: Partial<SpecFrontmatter> = {};\n let hasUpdates = false;\n \n // Check created_at\n if (gitData.created_at && (options.force || !spec.frontmatter.created_at)) {\n updates.created_at = gitData.created_at;\n result.created_at = gitData.created_at;\n result.source = 'git';\n hasUpdates = true;\n } else if (spec.frontmatter.created_at) {\n result.created_at = spec.frontmatter.created_at;\n result.source = 'existing';\n }\n \n // Check updated_at\n if (gitData.updated_at && (options.force || !spec.frontmatter.updated_at)) {\n updates.updated_at = gitData.updated_at;\n result.updated_at = gitData.updated_at;\n result.source = 'git';\n hasUpdates = true;\n } else if (spec.frontmatter.updated_at) {\n result.updated_at = spec.frontmatter.updated_at;\n result.source = 'existing';\n }\n \n // Check completed_at\n if (gitData.completed_at && (options.force || !spec.frontmatter.completed_at)) {\n updates.completed_at = gitData.completed_at;\n result.completed_at = gitData.completed_at;\n result.source = 'git';\n hasUpdates = true;\n } else if (spec.frontmatter.completed_at) {\n result.completed_at = spec.frontmatter.completed_at;\n result.source = 'existing';\n }\n \n // Check assignee (optional)\n if (options.includeAssignee && gitData.assignee && (options.force || !spec.frontmatter.assignee)) {\n updates.assignee = gitData.assignee;\n result.assignee = gitData.assignee;\n result.source = 'git';\n hasUpdates = true;\n } else if (spec.frontmatter.assignee) {\n result.assignee = spec.frontmatter.assignee;\n }\n \n // Check transitions (optional)\n if (options.includeTransitions && gitData.transitions && gitData.transitions.length > 0) {\n if (options.force || !spec.frontmatter.transitions || spec.frontmatter.transitions.length === 0) {\n updates.transitions = gitData.transitions;\n result.transitionsCount = gitData.transitions.length;\n result.source = 'git';\n hasUpdates = true;\n } else {\n // Merge with existing transitions (optional: could implement smart merge)\n result.transitionsCount = spec.frontmatter.transitions.length;\n }\n }\n \n // Sync updated date field with updated_at timestamp\n if (updates.updated_at && !updates.updated) {\n updates.updated = updates.updated_at.split('T')[0];\n }\n \n if (!hasUpdates) {\n result.reason = 'Already has complete data';\n console.log(`\\x1b[90m✓\\x1b[0m ${spec.name} - Already complete`);\n return result;\n }\n \n // Apply updates (unless dry run)\n if (!options.dryRun) {\n try {\n await updateFrontmatter(spec.filePath, updates);\n console.log(`\\x1b[32m✓\\x1b[0m ${spec.name} - Updated`);\n } catch (error) {\n result.source = 'skipped';\n result.reason = `Error: ${error instanceof Error ? error.message : String(error)}`;\n console.log(`\\x1b[31m✗\\x1b[0m ${spec.name} - Failed: ${result.reason}`);\n }\n } else {\n console.log(`\\x1b[36m→\\x1b[0m ${spec.name} - Would update`);\n // Show what would be updated\n if (updates.created_at) console.log(` created_at: ${updates.created_at} (git)`);\n if (updates.updated_at) console.log(` updated_at: ${updates.updated_at} (git)`);\n if (updates.completed_at) console.log(` completed_at: ${updates.completed_at} (git)`);\n if (updates.assignee) console.log(` assignee: ${updates.assignee} (git)`);\n if (updates.transitions) console.log(` transitions: ${updates.transitions.length} status changes (git)`);\n }\n \n return result;\n}\n\n/**\n * Print summary of backfill results\n */\nfunction printSummary(results: BackfillResult[], options: BackfillOptions): void {\n console.log('\\n' + '─'.repeat(60));\n console.log('\\x1b[1mSummary:\\x1b[0m\\n');\n \n const total = results.length;\n const updated = results.filter(r => r.source === 'git').length;\n const existing = results.filter(r => r.source === 'existing').length;\n const skipped = results.filter(r => r.source === 'skipped').length;\n \n const timestampUpdates = results.filter(r => \n r.source === 'git' && (r.created_at || r.updated_at || r.completed_at)\n ).length;\n \n const assigneeUpdates = results.filter(r => \n r.source === 'git' && r.assignee\n ).length;\n \n const transitionUpdates = results.filter(r => \n r.source === 'git' && r.transitionsCount\n ).length;\n \n console.log(` ${total} specs analyzed`);\n \n if (options.dryRun) {\n console.log(` ${updated} would be updated`);\n if (timestampUpdates > 0) {\n console.log(` └─ ${timestampUpdates} with timestamps`);\n }\n if (options.includeAssignee && assigneeUpdates > 0) {\n console.log(` └─ ${assigneeUpdates} with assignee`);\n }\n if (options.includeTransitions && transitionUpdates > 0) {\n console.log(` └─ ${transitionUpdates} with transitions`);\n }\n } else {\n console.log(` ${updated} updated`);\n }\n \n console.log(` ${existing} already complete`);\n console.log(` ${skipped} skipped`);\n \n // Show reasons for skipped specs\n const skipReasons = results\n .filter(r => r.source === 'skipped' && r.reason)\n .map(r => r.reason);\n \n if (skipReasons.length > 0) {\n console.log('\\n\\x1b[33mSkipped reasons:\\x1b[0m');\n const uniqueReasons = [...new Set(skipReasons)];\n for (const reason of uniqueReasons) {\n const count = skipReasons.filter(r => r === reason).length;\n console.log(` - ${reason} (${count})`);\n }\n }\n \n // Guidance\n if (options.dryRun) {\n console.log('\\n\\x1b[36mℹ\\x1b[0m Run without --dry-run to apply changes');\n \n if (!options.includeAssignee || !options.includeTransitions) {\n console.log('\\x1b[36mℹ\\x1b[0m Use --all to include optional fields (assignee, transitions)');\n }\n } else if (updated > 0) {\n console.log('\\n\\x1b[32m✓\\x1b[0m Backfill complete!');\n console.log(' Run \\x1b[36mlspec stats\\x1b[0m to see velocity metrics');\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig, saveConfig } from '../config.js';\n\n/**\n * Templates command - manage spec templates\n */\nexport function templatesCommand(): Command {\n const cmd = new Command('templates')\n .description('Manage spec templates');\n\n cmd.command('list')\n .description('List available templates')\n .action(async () => {\n await listTemplates();\n });\n\n cmd.command('show')\n .description('Show template content')\n .argument('<name>', 'Template name')\n .action(async (name: string) => {\n await showTemplate(name);\n });\n\n cmd.command('add')\n .description('Register a template')\n .argument('<name>', 'Template name')\n .argument('<file>', 'Template file path')\n .action(async (name: string, file: string) => {\n await addTemplate(name, file);\n });\n\n cmd.command('remove')\n .description('Unregister a template')\n .argument('<name>', 'Template name')\n .action(async (name: string) => {\n await removeTemplate(name);\n });\n\n cmd.command('copy')\n .description('Copy a template to create a new one')\n .argument('<source>', 'Source template name')\n .argument('<target>', 'Target template name')\n .action(async (source: string, target: string) => {\n await copyTemplate(source, target);\n });\n\n // Default action (list)\n cmd.action(async () => {\n await listTemplates();\n });\n\n return cmd;\n}\n\nexport async function listTemplates(cwd: string = process.cwd()): Promise<void> {\n const config = await loadConfig(cwd);\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n\n console.log('');\n console.log(chalk.green('=== Project Templates ==='));\n console.log('');\n\n try {\n await fs.access(templatesDir);\n } catch {\n console.log(chalk.yellow('No templates directory found.'));\n console.log(chalk.gray('Run: lean-spec init'));\n console.log('');\n return;\n }\n\n const files = await fs.readdir(templatesDir);\n const templateFiles = files.filter((f) => f.endsWith('.md'));\n\n if (templateFiles.length === 0) {\n console.log(chalk.yellow('No templates found.'));\n console.log('');\n return;\n }\n\n // Show registered templates first\n if (config.templates && Object.keys(config.templates).length > 0) {\n console.log(chalk.cyan('Registered:'));\n for (const [name, file] of Object.entries(config.templates)) {\n const isDefault = config.template === file;\n const marker = isDefault ? chalk.green('✓ (default)') : '';\n console.log(` ${chalk.bold(name)}: ${file} ${marker}`);\n }\n console.log('');\n }\n\n // Show all available template files\n console.log(chalk.cyan('Available files:'));\n for (const file of templateFiles) {\n const filePath = path.join(templatesDir, file);\n const stat = await fs.stat(filePath);\n const sizeKB = (stat.size / 1024).toFixed(1);\n console.log(` ${file} (${sizeKB} KB)`);\n }\n\n console.log('');\n console.log(chalk.gray('Use templates with: lean-spec create <name> --template=<template-name>'));\n console.log('');\n}\n\nexport async function showTemplate(\n templateName: string,\n cwd: string = process.cwd(),\n): Promise<void> {\n const config = await loadConfig(cwd);\n\n if (!config.templates?.[templateName]) {\n console.error(chalk.red(`Template not found: ${templateName}`));\n console.error(chalk.gray(`Available: ${Object.keys(config.templates || {}).join(', ')}`));\n process.exit(1);\n }\n\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n const templateFile = config.templates[templateName];\n const templatePath = path.join(templatesDir, templateFile);\n\n try {\n const content = await fs.readFile(templatePath, 'utf-8');\n console.log('');\n console.log(chalk.cyan(`=== Template: ${templateName} (${templateFile}) ===`));\n console.log('');\n console.log(content);\n console.log('');\n } catch (error) {\n console.error(chalk.red(`Error reading template: ${templateFile}`));\n console.error(error);\n process.exit(1);\n }\n}\n\nexport async function addTemplate(\n name: string,\n file: string,\n cwd: string = process.cwd(),\n): Promise<void> {\n const config = await loadConfig(cwd);\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n const templatePath = path.join(templatesDir, file);\n\n // Check if file exists\n try {\n await fs.access(templatePath);\n } catch {\n console.error(chalk.red(`Template file not found: ${file}`));\n console.error(chalk.gray(`Expected at: ${templatePath}`));\n console.error(\n chalk.yellow('Create the file first or use: lean-spec templates copy <source> <target>'),\n );\n process.exit(1);\n }\n\n // Add to config\n if (!config.templates) {\n config.templates = {};\n }\n\n if (config.templates[name]) {\n console.log(chalk.yellow(`Warning: Template '${name}' already exists, updating...`));\n }\n\n config.templates[name] = file;\n await saveConfig(config, cwd);\n\n console.log(chalk.green(`✓ Added template: ${name} → ${file}`));\n console.log(chalk.gray(` Use with: lean-spec create <spec-name> --template=${name}`));\n}\n\nexport async function removeTemplate(name: string, cwd: string = process.cwd()): Promise<void> {\n const config = await loadConfig(cwd);\n\n if (!config.templates?.[name]) {\n console.error(chalk.red(`Template not found: ${name}`));\n console.error(chalk.gray(`Available: ${Object.keys(config.templates || {}).join(', ')}`));\n process.exit(1);\n }\n\n if (name === 'default') {\n console.error(chalk.red('Cannot remove default template'));\n process.exit(1);\n }\n\n const file = config.templates[name];\n delete config.templates[name];\n await saveConfig(config, cwd);\n\n console.log(chalk.green(`✓ Removed template: ${name}`));\n console.log(chalk.gray(` Note: Template file ${file} still exists in .lean-spec/templates/`));\n}\n\nexport async function copyTemplate(\n source: string,\n target: string,\n cwd: string = process.cwd(),\n): Promise<void> {\n const config = await loadConfig(cwd);\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n\n // Resolve source template\n let sourceFile: string;\n if (config.templates?.[source]) {\n sourceFile = config.templates[source];\n } else {\n sourceFile = source;\n }\n\n const sourcePath = path.join(templatesDir, sourceFile);\n\n // Check if source exists\n try {\n await fs.access(sourcePath);\n } catch {\n console.error(chalk.red(`Source template not found: ${source}`));\n console.error(chalk.gray(`Expected at: ${sourcePath}`));\n process.exit(1);\n }\n\n // Determine target filename\n const targetFile = target.endsWith('.md') ? target : `${target}.md`;\n const targetPath = path.join(templatesDir, targetFile);\n\n // Copy file\n await fs.copyFile(sourcePath, targetPath);\n console.log(chalk.green(`✓ Copied: ${sourceFile} → ${targetFile}`));\n\n // Optionally register the new template\n if (!config.templates) {\n config.templates = {};\n }\n\n const templateName = target.replace(/\\.md$/, '');\n config.templates[templateName] = targetFile;\n await saveConfig(config, cwd);\n\n console.log(chalk.green(`✓ Registered template: ${templateName}`));\n console.log(chalk.gray(` Edit: ${targetPath}`));\n console.log(chalk.gray(` Use with: lean-spec create <spec-name> --template=${templateName}`));\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport chalk from 'chalk';\n\n/**\n * AI Tool configuration for symlink generation\n * Maps tool keys to their expected instruction file names\n */\nexport interface AIToolConfig {\n file: string; // The filename expected by the tool (e.g., 'CLAUDE.md')\n description: string; // Human-readable description for prompts\n default: boolean; // Whether to include by default in quick start\n usesSymlink: boolean; // Whether this tool uses a symlink (false for AGENTS.md itself)\n detection?: { // Optional auto-detection configuration\n commands?: string[]; // CLI commands to check (e.g., ['claude', 'claude-code'])\n configDirs?: string[]; // Config directories to check (e.g., ['.claude'])\n envVars?: string[]; // Environment variables to check (e.g., ['ANTHROPIC_API_KEY'])\n extensions?: string[]; // VS Code extension IDs to check\n };\n}\n\nexport type AIToolKey = 'aider' | 'claude' | 'codex' | 'copilot' | 'cursor' | 'droid' | 'gemini' | 'opencode' | 'windsurf';\n\nexport const AI_TOOL_CONFIGS: Record<AIToolKey, AIToolConfig> = {\n aider: {\n file: 'AGENTS.md',\n description: 'Aider (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n commands: ['aider'],\n configDirs: ['.aider'],\n },\n },\n claude: {\n file: 'CLAUDE.md',\n description: 'Claude Code (CLAUDE.md)',\n default: true,\n usesSymlink: true,\n detection: {\n commands: ['claude'],\n configDirs: ['.claude'],\n envVars: ['ANTHROPIC_API_KEY'],\n },\n },\n codex: {\n file: 'AGENTS.md',\n description: 'Codex CLI by OpenAI (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n commands: ['codex'],\n configDirs: ['.codex'],\n envVars: ['OPENAI_API_KEY'],\n },\n },\n copilot: {\n file: 'AGENTS.md',\n description: 'GitHub Copilot (AGENTS.md - default)',\n default: true,\n usesSymlink: false, // Primary file, no symlink needed\n detection: {\n commands: ['copilot'],\n envVars: ['GITHUB_TOKEN'],\n },\n },\n cursor: {\n file: 'AGENTS.md',\n description: 'Cursor (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n configDirs: ['.cursor', '.cursorules'],\n commands: ['cursor'],\n },\n },\n droid: {\n file: 'AGENTS.md',\n description: 'Droid by Factory (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n commands: ['droid'],\n },\n },\n gemini: {\n file: 'GEMINI.md',\n description: 'Gemini CLI (GEMINI.md)',\n default: false,\n usesSymlink: true,\n detection: {\n commands: ['gemini'],\n configDirs: ['.gemini'],\n envVars: ['GOOGLE_API_KEY', 'GEMINI_API_KEY'],\n },\n },\n opencode: {\n file: 'AGENTS.md',\n description: 'OpenCode (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n commands: ['opencode'],\n configDirs: ['.opencode'],\n },\n },\n windsurf: {\n file: 'AGENTS.md',\n description: 'Windsurf (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n configDirs: ['.windsurf', '.windsurfrules'],\n commands: ['windsurf'],\n },\n },\n};\n\n/**\n * Check if a command exists in PATH\n */\nfunction commandExists(command: string): boolean {\n try {\n const which = process.platform === 'win32' ? 'where' : 'which';\n execSync(`${which} ${command}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a directory exists in the user's home directory\n */\nasync function configDirExists(dirName: string): Promise<boolean> {\n const homeDir = process.env.HOME || process.env.USERPROFILE || '';\n if (!homeDir) return false;\n \n try {\n await fs.access(path.join(homeDir, dirName));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an environment variable is set\n */\nfunction envVarExists(varName: string): boolean {\n return !!process.env[varName];\n}\n\n/**\n * Check if a VS Code extension is installed\n * Note: This is a best-effort check - may not work in all environments\n */\nasync function extensionInstalled(extensionId: string): Promise<boolean> {\n const homeDir = process.env.HOME || process.env.USERPROFILE || '';\n if (!homeDir) return false;\n \n // Check common VS Code extension directories\n const extensionDirs = [\n path.join(homeDir, '.vscode', 'extensions'),\n path.join(homeDir, '.vscode-server', 'extensions'),\n path.join(homeDir, '.cursor', 'extensions'),\n ];\n \n for (const extDir of extensionDirs) {\n try {\n const entries = await fs.readdir(extDir);\n // Extension folders are named like 'github.copilot-1.234.567'\n if (entries.some(e => e.toLowerCase().startsWith(extensionId.toLowerCase()))) {\n return true;\n }\n } catch {\n // Directory doesn't exist or not readable\n }\n }\n \n return false;\n}\n\nexport interface DetectionResult {\n tool: AIToolKey;\n detected: boolean;\n reasons: string[];\n}\n\n/**\n * Auto-detect installed AI tools\n * Returns detection results with reasons for each tool\n */\nexport async function detectInstalledAITools(): Promise<DetectionResult[]> {\n const results: DetectionResult[] = [];\n \n for (const [toolKey, config] of Object.entries(AI_TOOL_CONFIGS)) {\n const reasons: string[] = [];\n const detection = config.detection;\n \n if (!detection) {\n results.push({ tool: toolKey as AIToolKey, detected: false, reasons: [] });\n continue;\n }\n \n // Check commands\n if (detection.commands) {\n for (const cmd of detection.commands) {\n if (commandExists(cmd)) {\n reasons.push(`'${cmd}' command found`);\n }\n }\n }\n \n // Check config directories\n if (detection.configDirs) {\n for (const dir of detection.configDirs) {\n if (await configDirExists(dir)) {\n reasons.push(`~/${dir} directory found`);\n }\n }\n }\n \n // Check environment variables\n if (detection.envVars) {\n for (const envVar of detection.envVars) {\n if (envVarExists(envVar)) {\n reasons.push(`${envVar} env var set`);\n }\n }\n }\n \n // Check VS Code extensions\n if (detection.extensions) {\n for (const ext of detection.extensions) {\n if (await extensionInstalled(ext)) {\n reasons.push(`${ext} extension installed`);\n }\n }\n }\n \n results.push({\n tool: toolKey as AIToolKey,\n detected: reasons.length > 0,\n reasons,\n });\n }\n \n return results;\n}\n\n/**\n * Get default selection for AI tools based on auto-detection\n * Falls back to copilot only (AGENTS.md) if nothing is detected\n */\nexport async function getDefaultAIToolSelection(): Promise<{ defaults: AIToolKey[]; detected: DetectionResult[] }> {\n const detectionResults = await detectInstalledAITools();\n const detectedTools = detectionResults\n .filter(r => r.detected)\n .map(r => r.tool);\n \n // If any tools detected, use those as defaults\n if (detectedTools.length > 0) {\n // Always include copilot if it's detected or nothing else is (AGENTS.md is primary)\n const copilotDetected = detectedTools.includes('copilot');\n if (!copilotDetected) {\n // Check if any detected tool uses AGENTS.md\n const usesAgentsMd = detectedTools.some(t => !AI_TOOL_CONFIGS[t].usesSymlink);\n if (!usesAgentsMd) {\n detectedTools.push('copilot');\n }\n }\n return { defaults: detectedTools, detected: detectionResults };\n }\n \n // Fall back to copilot only (AGENTS.md is the primary file)\n return { defaults: ['copilot'], detected: detectionResults };\n}\n\nexport interface SymlinkResult {\n file: string;\n created?: boolean;\n skipped?: boolean;\n error?: string;\n}\n\n/**\n * Create symlinks for selected AI tools pointing to AGENTS.md\n */\nexport async function createAgentToolSymlinks(\n cwd: string,\n selectedTools: AIToolKey[]\n): Promise<SymlinkResult[]> {\n const results: SymlinkResult[] = [];\n const isWindows = process.platform === 'win32';\n\n // Get unique files that need symlinks (exclude AGENTS.md itself)\n const filesToCreate = new Set<string>();\n for (const tool of selectedTools) {\n const config = AI_TOOL_CONFIGS[tool];\n if (config.usesSymlink) {\n filesToCreate.add(config.file);\n }\n }\n\n for (const file of filesToCreate) {\n const targetPath = path.join(cwd, file);\n \n try {\n // Check if file already exists\n try {\n await fs.access(targetPath);\n results.push({ file, skipped: true });\n continue;\n } catch {\n // File doesn't exist, good to create\n }\n\n if (isWindows) {\n // Windows: Create a copy instead of symlink (symlinks require admin privileges)\n // The copy will be a regular file pointing users to edit AGENTS.md instead\n const windowsContent = `# ${file}\n\n> **Note**: This file is a copy of AGENTS.md for tools that expect ${file}.\n> \n> **Important**: Edit AGENTS.md instead. Then run \\`lean-spec init\\` to regenerate this file,\n> or manually copy AGENTS.md to ${file}.\n\nSee AGENTS.md for the full LeanSpec AI agent instructions.\n`;\n await fs.writeFile(targetPath, windowsContent, 'utf-8');\n results.push({ file, created: true, error: 'created as copy (Windows)' });\n } else {\n // Unix: Create symbolic link\n await fs.symlink('AGENTS.md', targetPath);\n results.push({ file, created: true });\n }\n } catch (error) {\n results.push({ \n file, \n error: error instanceof Error ? error.message : 'Unknown error' \n });\n }\n }\n\n return results;\n}\n\n/**\n * Detect common system prompt files in a directory\n */\nexport async function detectExistingSystemPrompts(cwd: string): Promise<string[]> {\n const commonFiles = [\n 'AGENTS.md',\n '.cursorrules',\n '.github/copilot-instructions.md',\n ];\n\n const found: string[] = [];\n for (const file of commonFiles) {\n try {\n await fs.access(path.join(cwd, file));\n found.push(file);\n } catch {\n // File doesn't exist\n }\n }\n return found;\n}\n\n/**\n * Handle existing system prompt files based on user's chosen action\n */\nexport async function handleExistingFiles(\n action: 'merge-ai' | 'merge-append' | 'overwrite' | 'skip',\n existingFiles: string[],\n templateDir: string,\n cwd: string,\n variables: Record<string, string> = {}\n): Promise<void> {\n for (const file of existingFiles) {\n const filePath = path.join(cwd, file);\n // AGENTS.md is now at template root, not in files/ subdirectory\n const templateFilePath = path.join(templateDir, file);\n\n // Check if template has this file\n try {\n await fs.access(templateFilePath);\n } catch {\n // Template doesn't have this file, skip\n continue;\n }\n\n if (action === 'merge-ai' && file === 'AGENTS.md') {\n // Create consolidation prompt for AI to merge intelligently\n const existing = await fs.readFile(filePath, 'utf-8');\n let template = await fs.readFile(templateFilePath, 'utf-8');\n \n // Replace variables in template\n for (const [key, value] of Object.entries(variables)) {\n template = template.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value);\n }\n\n // Create AI consolidation prompt file\n const promptPath = path.join(cwd, '.lean-spec', 'MERGE-AGENTS-PROMPT.md');\n const aiPrompt = `# AI Prompt: Consolidate AGENTS.md\n\n## Task\nConsolidate the existing AGENTS.md with LeanSpec instructions into a single, coherent document.\n\n## Instructions\n1. Read both documents below\n2. Merge them intelligently:\n - Preserve ALL existing project-specific information (workflows, SOPs, architecture, conventions)\n - Integrate LeanSpec sections where they fit naturally\n - Remove redundancy and ensure coherent flow\n - Keep the tone and style consistent\n3. Replace the existing AGENTS.md with the consolidated version\n\n## Existing AGENTS.md\n\\`\\`\\`markdown\n${existing}\n\\`\\`\\`\n\n## LeanSpec Instructions to Integrate\n\\`\\`\\`markdown\n${template}\n\\`\\`\\`\n\n## Output\nCreate a single consolidated AGENTS.md that:\n- Keeps all existing project context and workflows\n- Adds LeanSpec commands and principles where appropriate\n- Maintains clear structure and readability\n- Removes any duplicate or conflicting guidance\n`;\n\n await fs.mkdir(path.dirname(promptPath), { recursive: true });\n await fs.writeFile(promptPath, aiPrompt, 'utf-8');\n \n console.log(chalk.green(`✓ Created AI consolidation prompt`));\n console.log(chalk.cyan(` → ${promptPath}`));\n console.log('');\n console.log(chalk.yellow('📝 Next steps:'));\n console.log(chalk.gray(' 1. Open .lean-spec/MERGE-AGENTS-PROMPT.md'));\n console.log(chalk.gray(' 2. Send it to your AI coding assistant (GitHub Copilot, Cursor, etc.)'));\n console.log(chalk.gray(' 3. Let AI create the consolidated AGENTS.md'));\n console.log(chalk.gray(' 4. Review and commit the result'));\n console.log('');\n } else if (action === 'merge-append' && file === 'AGENTS.md') {\n // Simple append: add LeanSpec section to existing AGENTS.md\n const existing = await fs.readFile(filePath, 'utf-8');\n let template = await fs.readFile(templateFilePath, 'utf-8');\n \n // Replace variables in template\n for (const [key, value] of Object.entries(variables)) {\n template = template.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value);\n }\n\n const merged = `${existing}\n\n---\n\n## LeanSpec Integration\n\n${template.split('\\n').slice(1).join('\\n')}`;\n\n await fs.writeFile(filePath, merged, 'utf-8');\n console.log(chalk.green(`✓ Appended LeanSpec section to ${file}`));\n console.log(chalk.yellow(' ⚠ Note: May be verbose. Consider consolidating later.'));\n } else if (action === 'overwrite') {\n // Backup existing file and create fresh one\n const backupPath = `${filePath}.backup`;\n await fs.rename(filePath, backupPath);\n console.log(chalk.yellow(`✓ Backed up ${file} → ${file}.backup`));\n\n // Copy template file with variable substitution\n let content = await fs.readFile(templateFilePath, 'utf-8');\n \n // Replace variables in content\n for (const [key, value] of Object.entries(variables)) {\n content = content.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value);\n }\n \n await fs.writeFile(filePath, content, 'utf-8');\n console.log(chalk.green(`✓ Created new ${file}`));\n console.log(chalk.gray(` 💡 Your original content is preserved in ${file}.backup`));\n }\n // If skip, do nothing with this file\n }\n}\n\n/**\n * Recursively copy directory with variable substitution and skip list\n */\nexport async function copyDirectory(\n src: string,\n dest: string,\n skipFiles: string[] = [],\n variables: Record<string, string> = {}\n): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n // Check if this file should be skipped\n if (skipFiles.includes(entry.name)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await copyDirectory(srcPath, destPath, skipFiles, variables);\n } else {\n // Only copy if file doesn't exist\n try {\n await fs.access(destPath);\n // File exists, skip it\n } catch {\n // File doesn't exist, copy it with variable substitution\n let content = await fs.readFile(srcPath, 'utf-8');\n \n // Replace variables in content\n for (const [key, value] of Object.entries(variables)) {\n content = content.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value);\n }\n \n await fs.writeFile(destPath, content, 'utf-8');\n }\n }\n }\n}\n\n/**\n * Get project name from package.json or directory name\n */\nexport async function getProjectName(cwd: string): Promise<string> {\n try {\n const packageJsonPath = path.join(cwd, 'package.json');\n const content = await fs.readFile(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(content);\n if (pkg.name) {\n return pkg.name;\n }\n } catch {\n // package.json not found or invalid\n }\n \n // Fallback to directory name\n return path.basename(cwd);\n}\n","/**\n * Example project templates for tutorials\n */\n\nexport interface ExampleMetadata {\n name: string;\n title: string;\n description: string;\n difficulty: 'beginner' | 'intermediate' | 'advanced';\n tutorial: string;\n tutorialUrl: string;\n tech: string[];\n files: number;\n lines: number;\n}\n\nexport const EXAMPLES: Record<string, ExampleMetadata> = {\n 'dark-theme': {\n name: 'dark-theme',\n title: 'Dark Theme Support',\n description: 'Add dark theme support to a professional admin dashboard with charts',\n difficulty: 'beginner',\n tutorial: 'Your First Spec with AI',\n tutorialUrl: 'https://leanspec.dev/docs/tutorials/first-spec-with-ai',\n tech: ['HTML', 'CSS', 'JavaScript', 'Chart.js', 'Express.js'],\n files: 6,\n lines: 420,\n },\n 'dashboard-widgets': {\n name: 'dashboard-widgets',\n title: 'Dashboard Widgets',\n description: 'Add three new widgets to an analytics dashboard',\n difficulty: 'intermediate',\n tutorial: 'Managing Multiple Features',\n tutorialUrl: 'https://leanspec.dev/docs/tutorials/multiple-features',\n tech: ['React', 'Vite'],\n files: 17,\n lines: 300,\n },\n 'api-refactor': {\n name: 'api-refactor',\n title: 'API Client Refactor',\n description: 'Extract reusable API client from monolithic code',\n difficulty: 'intermediate',\n tutorial: 'Refactoring with Specs',\n tutorialUrl: 'https://leanspec.dev/docs/tutorials/refactoring-specs',\n tech: ['Node.js'],\n files: 7,\n lines: 250,\n },\n};\n\nexport function getExamplesList(): ExampleMetadata[] {\n return Object.values(EXAMPLES);\n}\n\nexport function getExample(name: string): ExampleMetadata | undefined {\n return EXAMPLES[name];\n}\n\nexport function exampleExists(name: string): boolean {\n return name in EXAMPLES;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { select, checkbox } from '@inquirer/prompts';\nimport { saveConfig, type LeanSpecConfig } from '../config.js';\nimport {\n detectExistingSystemPrompts,\n handleExistingFiles,\n copyDirectory,\n getProjectName,\n createAgentToolSymlinks,\n AI_TOOL_CONFIGS,\n getDefaultAIToolSelection,\n type AIToolKey,\n} from '../utils/template-helpers.js';\nimport { \n getExamplesList, \n getExample, \n exampleExists,\n type ExampleMetadata \n} from '../utils/examples.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst TEMPLATES_DIR = path.join(__dirname, '..', 'templates');\nconst EXAMPLES_DIR = path.join(TEMPLATES_DIR, 'examples');\n\n/**\n * Init command - initialize LeanSpec in current directory\n */\nexport function initCommand(): Command {\n return new Command('init')\n .description('Initialize LeanSpec in current directory')\n .option('-y, --yes', 'Skip prompts and use defaults (quick start with standard template)')\n .option('--template <name>', 'Use specific template (standard or detailed)')\n .option('--example [name]', 'Scaffold an example project for tutorials (interactive if no name provided)')\n .option('--name <dirname>', 'Custom directory name for example project')\n .option('--list', 'List available example projects')\n .option('--agent-tools <tools>', 'AI tools to create symlinks for (comma-separated: claude,gemini,copilot or \"all\" or \"none\")')\n .action(async (options: { yes?: boolean; template?: string; example?: string; name?: string; list?: boolean; agentTools?: string }) => {\n if (options.list) {\n await listExamples();\n return;\n }\n \n if (options.example !== undefined) {\n await scaffoldExample(options.example, options.name);\n return;\n }\n \n await initProject(options.yes, options.template, options.agentTools);\n });\n}\n\nexport async function initProject(skipPrompts = false, templateOption?: string, agentToolsOption?: string): Promise<void> {\n const cwd = process.cwd();\n\n // Check if already initialized\n try {\n await fs.access(path.join(cwd, '.lean-spec', 'config.json'));\n console.log(chalk.yellow('⚠ LeanSpec already initialized in this directory.'));\n console.log(chalk.gray('To reinitialize, delete .lean-spec/ directory first.'));\n return;\n } catch {\n // Not initialized, continue\n }\n\n console.log('');\n console.log(chalk.green('Welcome to LeanSpec!'));\n console.log('');\n\n let setupMode = 'quick';\n let templateName = templateOption || 'standard'; // Use provided template or default to standard\n let selectedAgentTools: AIToolKey[] = [];\n\n // Parse agent tools option if provided\n if (agentToolsOption) {\n if (agentToolsOption === 'all') {\n selectedAgentTools = Object.keys(AI_TOOL_CONFIGS) as AIToolKey[];\n } else if (agentToolsOption === 'none') {\n selectedAgentTools = [];\n } else {\n selectedAgentTools = agentToolsOption.split(',').map(t => t.trim()) as AIToolKey[];\n }\n }\n\n // Skip prompts if -y flag is used\n if (skipPrompts) {\n console.log(chalk.gray('Using defaults: quick start with standard template'));\n // Default to Copilot only (AGENTS.md) when using -y\n if (!agentToolsOption) {\n selectedAgentTools = ['copilot'];\n }\n console.log('');\n } else if (!templateOption) {\n // Only show setup mode prompt if no template was explicitly provided\n // Main question: How to set up?\n setupMode = await select({\n message: 'How would you like to set up?',\n choices: [\n {\n name: 'Quick start (recommended)',\n value: 'quick',\n description: 'Use standard template, start immediately',\n },\n {\n name: 'Choose template',\n value: 'template',\n description: 'Pick from: standard, detailed',\n },\n // TODO: Re-enable when custom setup mode is implemented\n // {\n // name: 'Customize everything',\n // value: 'custom',\n // description: 'Full control over structure and settings',\n // },\n ],\n });\n\n if (setupMode === 'template') {\n // Let user choose template\n templateName = await select({\n message: 'Select template:',\n choices: [\n { name: 'standard', value: 'standard', description: 'Recommended - single-file specs with AGENTS.md' },\n {\n name: 'detailed',\n value: 'detailed',\n description: 'Complex specs with sub-spec structure (DESIGN, PLAN, TEST)',\n },\n ],\n });\n }\n }\n // Note: setupMode === 'custom' branch removed - will be implemented in future\n\n // Handle legacy template names\n if (templateName === 'minimal') {\n console.log(chalk.yellow('⚠ The \"minimal\" template has been removed.'));\n console.log(chalk.gray(' Using \"standard\" template instead (same lightweight approach).'));\n console.log('');\n templateName = 'standard';\n } else if (templateName === 'enterprise') {\n console.log(chalk.yellow('⚠ The \"enterprise\" template has been renamed to \"detailed\".'));\n console.log(chalk.gray(' Using \"detailed\" template (sub-spec structure for complex specs).'));\n console.log('');\n templateName = 'detailed';\n }\n\n // Load template config\n const templateDir = path.join(TEMPLATES_DIR, templateName);\n const templateConfigPath = path.join(templateDir, 'config.json');\n\n let templateConfig: LeanSpecConfig;\n try {\n const content = await fs.readFile(templateConfigPath, 'utf-8');\n templateConfig = JSON.parse(content).config;\n } catch {\n console.error(chalk.red(`Error: Template not found: ${templateName}`));\n process.exit(1);\n }\n\n // Pattern selection (skip for quick start or if -y flag is used)\n let patternChoice = 'simple'; // Default for quick start\n\n if (setupMode !== 'quick' && !skipPrompts) {\n patternChoice = await select({\n message: 'Select folder pattern:',\n choices: [\n {\n name: 'Simple: 001-my-spec/',\n value: 'simple',\n description: 'Global sequential numbering (recommended)',\n },\n {\n name: 'Date-grouped: 20251105/001-my-spec/',\n value: 'date-grouped',\n description: 'Group specs by creation date (good for teams)',\n },\n {\n name: 'Flat with date: 20251105-001-my-spec/',\n value: 'date-prefix',\n description: 'Date prefix with global numbering',\n },\n {\n name: 'Custom pattern',\n value: 'custom',\n description: 'Enter your own pattern',\n },\n ],\n });\n }\n\n // Apply pattern choice to config\n if (patternChoice === 'simple') {\n // Default: flat pattern with no prefix\n templateConfig.structure.pattern = 'flat';\n templateConfig.structure.prefix = '';\n } else if (patternChoice === 'date-grouped') {\n // Custom pattern with date grouping\n templateConfig.structure.pattern = 'custom';\n templateConfig.structure.groupExtractor = '{YYYYMMDD}';\n templateConfig.structure.prefix = undefined;\n } else if (patternChoice === 'date-prefix') {\n // Flat pattern with date prefix\n templateConfig.structure.pattern = 'flat';\n templateConfig.structure.prefix = '{YYYYMMDD}-';\n } else if (patternChoice === 'custom') {\n // Custom pattern not yet implemented - fall back to simple\n console.log('');\n console.log(chalk.yellow('⚠ Custom pattern input is not yet implemented.'));\n console.log(chalk.gray(' You can manually edit .lean-spec/config.json after initialization.'));\n console.log(chalk.gray(' Using simple pattern for now.'));\n console.log('');\n templateConfig.structure.pattern = 'flat';\n templateConfig.structure.prefix = '';\n }\n\n // AI tool selection (skip only if -y flag is used or --agent-tools was provided)\n // Quick start should still ask this question - it's important for AI tool UX\n if (!skipPrompts && !agentToolsOption) {\n // Auto-detect installed AI tools for smart defaults\n const { defaults: detectedDefaults, detected: detectionResults } = await getDefaultAIToolSelection();\n const anyDetected = detectionResults.some(r => r.detected);\n \n // Show detection info if any tools were found\n if (anyDetected) {\n console.log('');\n console.log(chalk.cyan('🔍 Detected AI tools:'));\n for (const result of detectionResults) {\n if (result.detected) {\n console.log(chalk.gray(` ${AI_TOOL_CONFIGS[result.tool].description}`));\n for (const reason of result.reasons) {\n console.log(chalk.gray(` └─ ${reason}`));\n }\n }\n }\n console.log('');\n }\n\n const toolChoices = Object.entries(AI_TOOL_CONFIGS).map(([key, config]) => ({\n name: config.description,\n value: key as AIToolKey,\n checked: detectedDefaults.includes(key as AIToolKey),\n }));\n\n selectedAgentTools = await checkbox({\n message: 'Which AI tools do you use? (creates symlinks for tool-specific instruction files)',\n choices: toolChoices,\n });\n }\n\n // Create .lean-spec/templates/ directory\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n try {\n await fs.mkdir(templatesDir, { recursive: true });\n } catch (error) {\n console.error(chalk.red('Error creating templates directory:'), error);\n process.exit(1);\n }\n \n // Copy spec templates from template/files/ to .lean-spec/templates/\n const templateFilesDir = path.join(templateDir, 'files');\n \n try {\n const files = await fs.readdir(templateFilesDir);\n \n if (templateName === 'standard') {\n // Standard template: Copy files/README.md as spec-template.md (backward compat)\n const readmePath = path.join(templateFilesDir, 'README.md');\n const targetSpecPath = path.join(templatesDir, 'spec-template.md');\n await fs.copyFile(readmePath, targetSpecPath);\n console.log(chalk.green('✓ Created .lean-spec/templates/spec-template.md'));\n \n // Update config to use spec-template.md\n templateConfig.template = 'spec-template.md';\n templateConfig.templates = {\n default: 'spec-template.md',\n };\n } else if (templateName === 'detailed') {\n // Detailed template: Copy all files preserving names\n for (const file of files) {\n const srcPath = path.join(templateFilesDir, file);\n const destPath = path.join(templatesDir, file);\n await fs.copyFile(srcPath, destPath);\n }\n console.log(chalk.green(`✓ Created .lean-spec/templates/ with ${files.length} files`));\n console.log(chalk.gray(` Files: ${files.join(', ')}`));\n \n // Update config to use README.md as main template\n templateConfig.template = 'README.md';\n templateConfig.templates = {\n default: 'README.md',\n };\n }\n } catch (error) {\n console.error(chalk.red('Error copying template files:'), error);\n process.exit(1);\n }\n \n\n // Save config\n await saveConfig(templateConfig, cwd);\n console.log(chalk.green('✓ Created .lean-spec/config.json'));\n\n // Check for existing system prompt files\n const existingFiles = await detectExistingSystemPrompts(cwd);\n let skipFiles: string[] = [];\n\n if (existingFiles.length > 0) {\n console.log('');\n console.log(chalk.yellow(`Found existing: ${existingFiles.join(', ')}`));\n\n if (skipPrompts) {\n // With -y flag, use AI-Assisted Merge as default for existing files\n console.log(chalk.gray('Using AI-Assisted Merge for existing AGENTS.md'));\n const projectName = await getProjectName(cwd);\n await handleExistingFiles('merge-ai', existingFiles, templateDir, cwd, { project_name: projectName });\n } else {\n const action = await select<'merge-ai' | 'merge-append' | 'overwrite' | 'skip'>({\n message: 'How would you like to handle existing AGENTS.md?',\n choices: [\n {\n name: 'AI-Assisted Merge (recommended)',\n value: 'merge-ai',\n description: 'Creates prompt for AI to intelligently consolidate both files',\n },\n {\n name: 'Simple Append',\n value: 'merge-append',\n description: 'Quickly appends LeanSpec section (may be verbose)',\n },\n {\n name: 'Replace with LeanSpec',\n value: 'overwrite',\n description: 'Backs up existing, creates fresh AGENTS.md from template',\n },\n {\n name: 'Keep Existing Only',\n value: 'skip',\n description: 'Skips AGENTS.md, only adds .lean-spec config and specs/',\n },\n ],\n });\n\n // Get project name for variable substitution\n const projectName = await getProjectName(cwd);\n \n await handleExistingFiles(action, existingFiles, templateDir, cwd, { project_name: projectName });\n\n if (action === 'skip') {\n skipFiles = existingFiles;\n }\n }\n }\n\n // Get project name for variable substitution\n const projectName = await getProjectName(cwd);\n\n // Copy AGENTS.md from template root to project root (unless skipping)\n if (!skipFiles.includes('AGENTS.md')) {\n const agentsSourcePath = path.join(templateDir, 'AGENTS.md');\n const agentsTargetPath = path.join(cwd, 'AGENTS.md');\n \n try {\n let agentsContent = await fs.readFile(agentsSourcePath, 'utf-8');\n // Replace variables in AGENTS.md\n agentsContent = agentsContent.replace(/\\{project_name\\}/g, projectName);\n await fs.writeFile(agentsTargetPath, agentsContent, 'utf-8');\n console.log(chalk.green('✓ Created AGENTS.md'));\n } catch (error) {\n console.error(chalk.red('Error copying AGENTS.md:'), error);\n process.exit(1);\n }\n\n // Create symlinks for selected AI tools\n if (selectedAgentTools.length > 0) {\n const symlinkResults = await createAgentToolSymlinks(cwd, selectedAgentTools);\n for (const result of symlinkResults) {\n if (result.created) {\n console.log(chalk.green(`✓ Created ${result.file} → AGENTS.md`));\n } else if (result.skipped) {\n console.log(chalk.yellow(`⚠ Skipped ${result.file} (already exists)`));\n } else if (result.error) {\n console.log(chalk.yellow(`⚠ Could not create ${result.file}: ${result.error}`));\n }\n }\n }\n }\n\n // Copy any other template files from files/ directory (excluding those we're skipping)\n // Note: files/ directory no longer contains AGENTS.md\n const filesDir = path.join(templateDir, 'files');\n try {\n // Check if files/ directory has any files to copy (besides the spec templates already copied)\n const filesToCopy = await fs.readdir(filesDir);\n const hasOtherFiles = filesToCopy.some(f => !f.match(/\\.(md)$/i) || !['README.md', 'DESIGN.md', 'PLAN.md', 'TEST.md'].includes(f));\n \n if (hasOtherFiles) {\n await copyDirectory(filesDir, cwd, [...skipFiles, 'README.md', 'DESIGN.md', 'PLAN.md', 'TEST.md'], { project_name: projectName });\n }\n console.log(chalk.green('✓ Initialized project structure'));\n } catch (error) {\n console.error(chalk.red('Error copying template files:'), error);\n process.exit(1);\n }\n\n // Create empty specs/ directory\n const specsDir = path.join(cwd, 'specs');\n try {\n await fs.mkdir(specsDir, { recursive: true });\n console.log(chalk.green('✓ Created specs/ directory'));\n } catch (error) {\n console.error(chalk.red('Error creating specs directory:'), error);\n process.exit(1);\n }\n\n console.log('');\n console.log(chalk.green('✓ LeanSpec initialized!'));\n console.log('');\n console.log('Next steps:');\n console.log(chalk.cyan(' 1. Edit AGENTS.md') + chalk.gray(' → Fill in the \"📋 Project Context\" section'));\n console.log(chalk.cyan(' 2. Create your first spec:') + chalk.gray(' lean-spec create my-feature'));\n console.log('');\n}\n\n/**\n * List available example projects\n */\nasync function listExamples(): Promise<void> {\n const examples = getExamplesList();\n \n console.log('');\n console.log(chalk.bold('Available Examples:'));\n console.log('');\n \n for (const example of examples) {\n const difficultyColor = \n example.difficulty === 'beginner' ? chalk.green :\n example.difficulty === 'intermediate' ? chalk.yellow :\n chalk.red;\n \n console.log(chalk.cyan(` ${example.name}`));\n console.log(` ${example.description}`);\n console.log(` ${difficultyColor(example.difficulty)} • ${example.tech.join(', ')} • ~${example.lines} lines`);\n console.log(` Tutorial: ${chalk.gray(example.tutorialUrl)}`);\n console.log('');\n }\n \n console.log('Usage:');\n console.log(chalk.gray(' lean-spec init --example <name>'));\n console.log(chalk.gray(' lean-spec init --example dark-theme'));\n console.log('');\n}\n\n/**\n * Scaffold an example project\n */\nasync function scaffoldExample(exampleName: string, customName?: string): Promise<void> {\n // If no example name provided, show interactive selection\n if (!exampleName) {\n exampleName = await selectExample();\n }\n \n // Validate example exists\n if (!exampleExists(exampleName)) {\n console.error(chalk.red(`Error: Example \"${exampleName}\" not found.`));\n console.log('');\n console.log('Available examples:');\n getExamplesList().forEach(ex => {\n console.log(` - ${ex.name}`);\n });\n console.log('');\n console.log('Use: lean-spec init --list');\n process.exit(1);\n }\n \n const example = getExample(exampleName)!;\n const targetDirName = customName || exampleName;\n const targetPath = path.join(process.cwd(), targetDirName);\n \n // Check if directory already exists and is not empty\n try {\n const files = await fs.readdir(targetPath);\n const nonGitFiles = files.filter(f => f !== '.git');\n if (nonGitFiles.length > 0) {\n console.error(chalk.red(`Error: Directory \"${targetDirName}\" already exists and is not empty.`));\n console.log(chalk.gray('Choose a different name with --name option.'));\n process.exit(1);\n }\n } catch {\n // Directory doesn't exist, that's fine\n }\n \n console.log('');\n console.log(chalk.green(`Setting up example: ${example.title}`));\n console.log(chalk.gray(example.description));\n console.log('');\n \n // Create target directory\n await fs.mkdir(targetPath, { recursive: true });\n console.log(chalk.green(`✓ Created directory: ${targetDirName}/`));\n \n // Copy example template\n const examplePath = path.join(EXAMPLES_DIR, exampleName);\n await copyDirectoryRecursive(examplePath, targetPath);\n console.log(chalk.green('✓ Copied example project'));\n \n // Initialize LeanSpec in the new directory\n const originalCwd = process.cwd();\n try {\n process.chdir(targetPath);\n console.log(chalk.gray('Initializing LeanSpec...'));\n await initProject(true); // Use -y flag for defaults (standard template)\n console.log(chalk.green('✓ Initialized LeanSpec'));\n } catch (error) {\n console.error(chalk.red('Error initializing LeanSpec:'), error);\n process.exit(1);\n } finally {\n process.chdir(originalCwd);\n }\n \n // Detect package manager\n const packageManager = await detectPackageManager();\n \n // Install dependencies\n console.log(chalk.gray(`Installing dependencies with ${packageManager}...`));\n try {\n const { execSync } = await import('node:child_process');\n execSync(`${packageManager} install`, { \n cwd: targetPath, \n stdio: 'inherit' \n });\n console.log(chalk.green('✓ Installed dependencies'));\n } catch (error) {\n console.log(chalk.yellow('⚠ Failed to install dependencies automatically'));\n console.log(chalk.gray(` Run: cd ${targetDirName} && ${packageManager} install`));\n }\n \n // Show next steps\n console.log('');\n console.log(chalk.green('✓ Example project ready!'));\n console.log('');\n console.log(chalk.gray('Created:'));\n console.log(chalk.gray(` - Application code (${example.tech.join(', ')})`));\n console.log(chalk.gray(' - LeanSpec files (AGENTS.md, .lean-spec/, specs/)'));\n console.log('');\n console.log('Next steps:');\n console.log(chalk.cyan(` 1. cd ${targetDirName}`));\n console.log(chalk.cyan(' 2. Open this project in your editor'));\n console.log(chalk.cyan(` 3. Follow the tutorial: ${example.tutorialUrl}`));\n console.log(chalk.cyan(` 4. Ask your AI: \"Help me with this tutorial using LeanSpec\"`));\n console.log('');\n}\n\n/**\n * Interactive example selection\n */\nasync function selectExample(): Promise<string> {\n const examples = getExamplesList();\n \n const choice = await select({\n message: 'Select an example project:',\n choices: examples.map(ex => {\n const difficultyLabel = \n ex.difficulty === 'beginner' ? '★☆☆' :\n ex.difficulty === 'intermediate' ? '★★☆' :\n '★★★';\n \n return {\n name: `${ex.title} (${difficultyLabel})`,\n value: ex.name,\n description: `${ex.description} • ${ex.tech.join(', ')}`,\n };\n }),\n });\n \n return choice;\n}\n\n/**\n * Copy directory recursively\n */\nasync function copyDirectoryRecursive(src: string, dest: string): Promise<void> {\n const entries = await fs.readdir(src, { withFileTypes: true });\n \n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n \n if (entry.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true });\n await copyDirectoryRecursive(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Detect package manager (pnpm > yarn > npm)\n */\nasync function detectPackageManager(): Promise<string> {\n const cwd = process.cwd();\n \n // Check for lockfiles in parent directory\n try {\n await fs.access(path.join(cwd, '..', 'pnpm-lock.yaml'));\n return 'pnpm';\n } catch {}\n \n try {\n await fs.access(path.join(cwd, '..', 'yarn.lock'));\n return 'yarn';\n } catch {}\n \n // Default to npm\n return 'npm';\n}\n\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getSpec, loadSubFiles } from '../spec-loader.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { loadConfig } from '../config.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { countTokens } from '@leanspec/core';\n\nexport interface FilesOptions {\n type?: 'docs' | 'assets';\n tree?: boolean;\n json?: boolean;\n}\n\nexport function filesCommand(): Command;\nexport function filesCommand(specPath: string, options?: FilesOptions): Promise<void>;\nexport function filesCommand(specPath?: string, options: FilesOptions = {}): Command | Promise<void> {\n if (typeof specPath === 'string') {\n return showFiles(specPath, options);\n }\n\n return new Command('files')\n .description('List files in a spec')\n .argument('<spec>', 'Spec to list files for')\n .option('--type <type>', 'Filter by type: docs, assets')\n .option('--tree', 'Show tree structure')\n .option('--json', 'Output as JSON')\n .action(async (target: string, opts: FilesOptions) => {\n await showFiles(target, opts);\n });\n}\n\nexport async function showFiles(\n specPath: string,\n options: FilesOptions = {}\n): Promise<void> {\n // Auto-check for conflicts before display\n await autoCheckIfEnabled();\n \n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n\n // Resolve spec path\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}. Try using the full path or spec name (e.g., 001-my-spec)`);\n }\n\n // Load spec info\n const spec = await getSpec(resolvedPath);\n if (!spec) {\n throw new Error(`Could not load spec: ${sanitizeUserInput(specPath)}`);\n }\n\n // Load sub-files\n const subFiles = await loadSubFiles(spec.fullPath);\n\n // JSON output\n if (options.json) {\n const readmeStat = await fs.stat(spec.filePath);\n const readmeContent = await fs.readFile(spec.filePath, 'utf-8');\n const readmeTokens = await countTokens({ content: readmeContent });\n \n const jsonOutput = {\n spec: spec.name,\n path: spec.fullPath,\n files: [\n {\n name: 'README.md',\n type: 'required',\n size: readmeStat.size,\n tokens: readmeTokens.total,\n },\n ...subFiles.map(f => ({\n name: f.name,\n type: f.type,\n size: f.size,\n })),\n ],\n total: subFiles.length + 1,\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.cyan(`📄 Files in ${sanitizeUserInput(spec.name)}`));\n console.log('');\n\n // Show README.md (required)\n console.log(chalk.green('Required:'));\n const readmeStat = await fs.stat(spec.filePath);\n const readmeSize = formatSize(readmeStat.size);\n const readmeContent = await fs.readFile(spec.filePath, 'utf-8');\n const readmeTokens = await countTokens({ content: readmeContent });\n console.log(chalk.green(` ✓ README.md (${readmeSize}, ~${readmeTokens.total.toLocaleString()} tokens) Main spec`));\n console.log('');\n\n // Filter by type if requested\n let filteredFiles = subFiles;\n if (options.type === 'docs') {\n filteredFiles = subFiles.filter((f) => f.type === 'document');\n } else if (options.type === 'assets') {\n filteredFiles = subFiles.filter((f) => f.type === 'asset');\n }\n\n if (filteredFiles.length === 0) {\n console.log(chalk.gray('No additional files'));\n console.log('');\n return;\n }\n\n // Group by type\n const documents = filteredFiles.filter((f) => f.type === 'document');\n const assets = filteredFiles.filter((f) => f.type === 'asset');\n\n if (documents.length > 0 && (!options.type || options.type === 'docs')) {\n console.log(chalk.cyan('Documents:'));\n for (const file of documents) {\n const size = formatSize(file.size);\n // Count tokens for document files\n const content = await fs.readFile(file.path, 'utf-8');\n const tokenCount = await countTokens({ content });\n console.log(chalk.cyan(` ✓ ${sanitizeUserInput(file.name).padEnd(20)} (${size}, ~${tokenCount.total.toLocaleString()} tokens)`));\n }\n console.log('');\n }\n\n if (assets.length > 0 && (!options.type || options.type === 'assets')) {\n console.log(chalk.yellow('Assets:'));\n for (const file of assets) {\n const size = formatSize(file.size);\n console.log(chalk.yellow(` ✓ ${sanitizeUserInput(file.name).padEnd(20)} (${size})`));\n }\n console.log('');\n }\n\n // Show totals\n const totalFiles = filteredFiles.length + 1; // +1 for README.md\n const totalSize = formatSize(\n readmeStat.size + filteredFiles.reduce((sum, f) => sum + f.size, 0)\n );\n console.log(chalk.gray(`Total: ${totalFiles} files, ${totalSize}`));\n console.log('');\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n } else if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n } else {\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getExamplesList } from '../utils/examples.js';\n\n/**\n * Examples command - list available example projects\n */\nexport function examplesCommand(): Command {\n return new Command('examples')\n .description('List available example projects for tutorials')\n .action(async () => {\n await listExamples();\n });\n}\n\nasync function listExamples(): Promise<void> {\n const examples = getExamplesList();\n \n console.log('');\n console.log(chalk.bold('LeanSpec Example Projects'));\n console.log('');\n console.log('Scaffold complete example projects to follow tutorials:');\n console.log('');\n \n for (const example of examples) {\n const difficultyColor = \n example.difficulty === 'beginner' ? chalk.green :\n example.difficulty === 'intermediate' ? chalk.yellow :\n chalk.red;\n \n const difficultyStars = \n example.difficulty === 'beginner' ? '★☆☆' :\n example.difficulty === 'intermediate' ? '★★☆' :\n '★★★';\n \n console.log(chalk.cyan.bold(` ${example.title}`));\n console.log(` ${chalk.gray(example.name)}`);\n console.log(` ${example.description}`);\n console.log(` ${difficultyColor(difficultyStars + ' ' + example.difficulty)} • ${example.tech.join(', ')} • ~${example.lines} lines`);\n console.log(` ${chalk.gray('Tutorial:')} ${example.tutorial}`);\n console.log(` ${chalk.gray(example.tutorialUrl)}`);\n console.log('');\n }\n \n console.log(chalk.bold('Usage:'));\n console.log('');\n console.log(' # Scaffold an example');\n console.log(chalk.cyan(' lean-spec init --example <name>'));\n console.log('');\n console.log(' # Interactive selection');\n console.log(chalk.cyan(' lean-spec init --example'));\n console.log('');\n console.log(' # Custom directory name');\n console.log(chalk.cyan(' lean-spec init --example dark-theme --name my-demo'));\n console.log('');\n}\n","/**\n * Frontmatter validator - validates spec frontmatter for quality issues\n * \n * Phase 1b: Frontmatter Validation\n * - Required fields: status, created\n * - Valid status values: planned, in-progress, complete, archived\n * - Valid priority values: low, medium, high, critical\n * - Date format validation (ISO 8601)\n * - Tags format validation (array of strings)\n */\n\nimport type { ValidationRule, ValidationResult, ValidationError, ValidationWarning } from '../utils/validation-framework.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport type { SpecStatus, SpecPriority } from '../frontmatter.js';\nimport matter from 'gray-matter';\nimport yaml from 'js-yaml';\n\nexport interface FrontmatterOptions {\n // Allow customization of valid values (future use)\n validStatuses?: SpecStatus[];\n validPriorities?: SpecPriority[];\n}\n\nexport class FrontmatterValidator implements ValidationRule {\n name = 'frontmatter';\n description = 'Validate spec frontmatter for required fields and valid values';\n\n private validStatuses: SpecStatus[];\n private validPriorities: SpecPriority[];\n\n constructor(options: FrontmatterOptions = {}) {\n this.validStatuses = options.validStatuses ?? ['planned', 'in-progress', 'complete', 'archived'];\n this.validPriorities = options.validPriorities ?? ['low', 'medium', 'high', 'critical'];\n }\n\n validate(spec: SpecInfo, content: string): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Parse frontmatter\n let parsed;\n try {\n parsed = matter(content, {\n engines: {\n yaml: (str) => yaml.load(str, { schema: yaml.FAILSAFE_SCHEMA }) as Record<string, unknown>\n }\n });\n } catch (error) {\n errors.push({\n message: 'Failed to parse frontmatter YAML',\n suggestion: 'Check for YAML syntax errors in frontmatter',\n });\n return { passed: false, errors, warnings };\n }\n\n const frontmatter = parsed.data;\n\n // Check if frontmatter exists\n if (!frontmatter || Object.keys(frontmatter).length === 0) {\n errors.push({\n message: 'No frontmatter found',\n suggestion: 'Add YAML frontmatter at the top of the file between --- delimiters',\n });\n return { passed: false, errors, warnings };\n }\n\n // Required field: status\n if (!frontmatter.status) {\n errors.push({\n message: 'Missing required field: status',\n suggestion: 'Add status field (valid values: planned, in-progress, complete, archived)',\n });\n } else {\n // Validate status value\n const statusStr = String(frontmatter.status);\n if (!this.validStatuses.includes(statusStr as SpecStatus)) {\n errors.push({\n message: `Invalid status: \"${statusStr}\"`,\n suggestion: `Valid values: ${this.validStatuses.join(', ')}`,\n });\n }\n }\n\n // Required field: created\n if (!frontmatter.created) {\n errors.push({\n message: 'Missing required field: created',\n suggestion: 'Add created field with date in YYYY-MM-DD format',\n });\n } else {\n // Validate created date format\n const dateValidation = this.validateDateField(frontmatter.created, 'created');\n if (!dateValidation.valid) {\n errors.push({\n message: dateValidation.message!,\n suggestion: dateValidation.suggestion,\n });\n }\n }\n\n // Optional field: priority (validate if present)\n if (frontmatter.priority) {\n const priorityStr = String(frontmatter.priority);\n if (!this.validPriorities.includes(priorityStr as SpecPriority)) {\n errors.push({\n message: `Invalid priority: \"${priorityStr}\"`,\n suggestion: `Valid values: ${this.validPriorities.join(', ')}`,\n });\n }\n }\n\n // Optional field: tags (validate if present)\n if (frontmatter.tags !== undefined && frontmatter.tags !== null) {\n if (!Array.isArray(frontmatter.tags)) {\n errors.push({\n message: 'Field \"tags\" must be an array',\n suggestion: 'Use array format: tags: [tag1, tag2]',\n });\n }\n // Note: We don't strictly validate tag types as YAML may parse numbers/booleans\n // This is acceptable as they'll be coerced to strings when used\n }\n\n // Validate other date fields if present\n const dateFields = ['updated', 'completed', 'due'];\n for (const field of dateFields) {\n if (frontmatter[field]) {\n const dateValidation = this.validateDateField(frontmatter[field], field);\n if (!dateValidation.valid) {\n warnings.push({\n message: dateValidation.message!,\n suggestion: dateValidation.suggestion,\n });\n }\n }\n }\n\n return {\n passed: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Validate date field format (ISO 8601: YYYY-MM-DD or full timestamp)\n */\n private validateDateField(value: unknown, fieldName: string): {\n valid: boolean;\n message?: string;\n suggestion?: string;\n } {\n // Handle Date objects (gray-matter auto-parses dates)\n if (value instanceof Date) {\n return { valid: true };\n }\n\n if (typeof value !== 'string') {\n return {\n valid: false,\n message: `Field \"${fieldName}\" must be a string or date`,\n suggestion: 'Use YYYY-MM-DD format (e.g., 2025-11-05)',\n };\n }\n\n // Check for ISO 8601 date format (YYYY-MM-DD) or full timestamp\n // Be lenient: accept YYYY-MM-DD or timestamps with/without milliseconds and timezone\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?(Z|[+-]\\d{2}:\\d{2})?)?$/;\n if (!isoDateRegex.test(value)) {\n return {\n valid: false,\n message: `Field \"${fieldName}\" has invalid date format: \"${value}\"`,\n suggestion: 'Use ISO 8601 format: YYYY-MM-DD (e.g., 2025-11-05)',\n };\n }\n\n // Validate the date is actually valid (not 2025-99-99)\n const date = new Date(value);\n if (isNaN(date.getTime())) {\n return {\n valid: false,\n message: `Field \"${fieldName}\" has invalid date: \"${value}\"`,\n suggestion: 'Ensure date is valid (e.g., month 01-12, day 01-31)',\n };\n }\n\n return { valid: true };\n }\n}\n","/**\n * Structure validator - validates spec structure and required sections\n * \n * Phase 2: Structure Validation\n * - Must have title (H1 heading)\n * - Must have required sections\n * - No empty required sections\n * - No duplicate section headers at same level\n */\n\nimport * as path from 'node:path';\nimport type { ValidationRule, ValidationResult, ValidationError, ValidationWarning } from '../utils/validation-framework.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport matter from 'gray-matter';\n\nexport interface StructureOptions {\n // Required section names (H2 level)\n requiredSections?: string[];\n // Allow custom section validation\n strict?: boolean;\n}\n\nexport class StructureValidator implements ValidationRule {\n name = 'structure';\n description = 'Validate spec structure and required sections';\n\n private requiredSections: string[];\n private strict: boolean;\n\n constructor(options: StructureOptions = {}) {\n // Default required sections based on common spec patterns\n this.requiredSections = options.requiredSections ?? ['Overview', 'Design'];\n this.strict = options.strict ?? false;\n }\n\n async validate(spec: SpecInfo, content: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Parse content to separate frontmatter from body\n let parsed;\n try {\n parsed = matter(content);\n } catch (error) {\n errors.push({\n message: 'Failed to parse frontmatter',\n suggestion: 'Check YAML frontmatter syntax',\n });\n return { passed: false, errors, warnings };\n }\n\n const body = parsed.content;\n\n // Check for H1 title\n const h1Match = body.match(/^#\\s+(.+)$/m);\n if (!h1Match) {\n errors.push({\n message: 'Missing H1 title (# Heading)',\n suggestion: 'Add a title as the first heading in the spec',\n });\n }\n\n // Extract all headings\n const headings = this.extractHeadings(body);\n\n // Skip checking for required sections - too verbose and not critical\n // Skip checking for empty sections - too verbose and not critical\n\n // Check for duplicate headers at same level\n const duplicates = this.findDuplicateHeaders(headings);\n for (const dup of duplicates) {\n errors.push({\n message: `Duplicate section header: ${'#'.repeat(dup.level)} ${dup.text}`,\n suggestion: 'Remove or rename duplicate section headers',\n });\n }\n\n return {\n passed: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Extract all headings from markdown content (excluding code blocks)\n */\n private extractHeadings(content: string): Array<{ level: number; text: string; line: number }> {\n const headings: Array<{ level: number; text: string; line: number }> = [];\n const lines = content.split('\\n');\n \n let inCodeBlock = false;\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n \n // Track code block boundaries\n if (line.trim().startsWith('```')) {\n inCodeBlock = !inCodeBlock;\n continue;\n }\n \n // Skip lines inside code blocks\n if (inCodeBlock) {\n continue;\n }\n \n const match = line.match(/^(#{1,6})\\s+(.+)$/);\n if (match) {\n headings.push({\n level: match[1].length,\n text: match[2].trim(),\n line: i + 1,\n });\n }\n }\n \n return headings;\n }\n\n /**\n * Find empty sections (sections with no content until next heading)\n */\n private findEmptySections(content: string, headings: Array<{ level: number; text: string; line: number }>): string[] {\n const emptySections: string[] = [];\n const lines = content.split('\\n');\n\n for (let i = 0; i < headings.length; i++) {\n const heading = headings[i];\n \n // Only check H2 sections\n if (heading.level !== 2) {\n continue;\n }\n\n // Find the next heading at the same or higher level (end of this section)\n let nextSameLevelIndex = i + 1;\n while (nextSameLevelIndex < headings.length && headings[nextSameLevelIndex].level > heading.level) {\n nextSameLevelIndex++;\n }\n \n const nextHeading = headings[nextSameLevelIndex];\n \n // Get content between this heading and next same-level heading\n const startLine = heading.line;\n const endLine = nextHeading ? nextHeading.line - 1 : lines.length;\n \n // Extract content lines (excluding the heading itself)\n const sectionLines = lines.slice(startLine, endLine);\n \n // Check if section has any subsections\n const hasSubsections = headings.some((h, idx) => \n idx > i && \n idx < nextSameLevelIndex && \n h.level > heading.level\n );\n \n // If there are subsections, the section is not empty\n if (hasSubsections) {\n continue;\n }\n \n // Check if section is empty (only whitespace or comments)\n const hasContent = sectionLines.some(line => {\n const trimmed = line.trim();\n return trimmed.length > 0 && !trimmed.startsWith('<!--') && !trimmed.startsWith('//');\n });\n\n if (!hasContent) {\n emptySections.push(heading.text);\n }\n }\n\n return emptySections;\n }\n\n /**\n * Find duplicate headers at the same level\n */\n private findDuplicateHeaders(headings: Array<{ level: number; text: string; line: number }>): Array<{ level: number; text: string }> {\n const seen = new Map<string, number>();\n const duplicates: Array<{ level: number; text: string }> = [];\n\n for (const heading of headings) {\n const key = `${heading.level}:${heading.text.toLowerCase()}`;\n const count = seen.get(key) ?? 0;\n seen.set(key, count + 1);\n\n if (count === 1) {\n // Found a duplicate (second occurrence)\n duplicates.push({ level: heading.level, text: heading.text });\n }\n }\n\n return duplicates;\n }\n}\n","/**\n * Corruption validator - detects file corruption from failed edits\n * \n * Focus on visually apparent corruption that breaks rendering:\n * - Unclosed code blocks (breaks syntax highlighting)\n * - Unclosed formatting in actual content (not code blocks)\n * - Duplicate content blocks (merge artifacts, failed edits)\n * \n * Intentionally excludes:\n * - YAML/JSON validation (code examples often show invalid syntax)\n */\n\nimport type { ValidationRule, ValidationResult, ValidationError, ValidationWarning } from '../utils/validation-framework.js';\nimport type { SpecInfo } from '../spec-loader.js';\n\n/**\n * Represents a code block range in the document\n */\ninterface CodeBlockRange {\n start: number; // Line number (1-indexed)\n end: number; // Line number (1-indexed)\n}\n\nexport interface CorruptionOptions {\n // Enable/disable specific checks\n checkCodeBlocks?: boolean;\n checkMarkdownStructure?: boolean;\n checkDuplicateContent?: boolean;\n // Duplicate detection tuning (reduced false positives)\n duplicateBlockSize?: number; // Lines to match (default: 8)\n duplicateMinLength?: number; // Min chars (default: 200)\n}\n\nexport class CorruptionValidator implements ValidationRule {\n name = 'corruption';\n description = 'Detect file corruption from failed edits';\n\n private options: Required<CorruptionOptions>;\n\n constructor(options: CorruptionOptions = {}) {\n this.options = {\n checkCodeBlocks: options.checkCodeBlocks ?? true,\n checkMarkdownStructure: options.checkMarkdownStructure ?? true,\n checkDuplicateContent: options.checkDuplicateContent ?? true,\n duplicateBlockSize: options.duplicateBlockSize ?? 8,\n duplicateMinLength: options.duplicateMinLength ?? 200,\n };\n }\n\n validate(_spec: SpecInfo, content: string): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Parse code block ranges once for reuse\n const codeBlockRanges = this.parseCodeBlockRanges(content);\n\n // Check code blocks (unclosed blocks)\n if (this.options.checkCodeBlocks) {\n const codeBlockErrors = this.validateCodeBlocks(content);\n errors.push(...codeBlockErrors);\n }\n\n // Check markdown structure (but exclude code blocks)\n if (this.options.checkMarkdownStructure) {\n const markdownErrors = this.validateMarkdownStructure(content, codeBlockRanges);\n errors.push(...markdownErrors);\n }\n\n // Check for duplicate content (but exclude code blocks)\n if (this.options.checkDuplicateContent) {\n const duplicateWarnings = this.detectDuplicateContent(content);\n warnings.push(...duplicateWarnings);\n }\n\n return {\n passed: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Parse all code block ranges in the document\n * Returns array of {start, end} line numbers (1-indexed)\n */\n private parseCodeBlockRanges(content: string): CodeBlockRange[] {\n const ranges: CodeBlockRange[] = [];\n const lines = content.split('\\n');\n \n let inCodeBlock = false;\n let blockStart = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim().startsWith('```')) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n blockStart = i + 1; // 1-indexed\n } else {\n ranges.push({\n start: blockStart,\n end: i + 1 // 1-indexed, inclusive\n });\n inCodeBlock = false;\n blockStart = -1;\n }\n }\n }\n\n return ranges;\n }\n\n /**\n * Check if a line number is inside a code block\n */\n private isInCodeBlock(lineNumber: number, codeBlockRanges: CodeBlockRange[]): boolean {\n return codeBlockRanges.some(\n range => lineNumber >= range.start && lineNumber <= range.end\n );\n }\n\n /**\n * Get content outside code blocks for analysis\n */\n private getContentOutsideCodeBlocks(content: string, codeBlockRanges: CodeBlockRange[]): string {\n const lines = content.split('\\n');\n const filteredLines = lines.filter((_, index) => {\n const lineNumber = index + 1; // 1-indexed\n return !this.isInCodeBlock(lineNumber, codeBlockRanges);\n });\n return filteredLines.join('\\n');\n }\n\n /**\n * Validate code blocks are properly closed\n * This is the #1 indicator of corruption - causes visible syntax highlighting issues\n */\n private validateCodeBlocks(content: string): ValidationError[] {\n const errors: ValidationError[] = [];\n const lines = content.split('\\n');\n \n let inCodeBlock = false;\n let codeBlockStartLine = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim().startsWith('```')) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeBlockStartLine = i + 1;\n } else {\n inCodeBlock = false;\n codeBlockStartLine = -1;\n }\n }\n }\n\n // If still in code block at end, it's unclosed\n if (inCodeBlock) {\n errors.push({\n message: `Unclosed code block starting at line ${codeBlockStartLine}`,\n suggestion: 'Add closing ``` to complete the code block',\n });\n }\n\n return errors;\n }\n\n /**\n * Detect duplicate content blocks\n * Improved tuning to reduce false positives\n * \n * Thresholds:\n * - Block size: 8 lines - requires substantial duplication\n * - Min length: 200 chars - ignores short similar sections\n * - Filters overlapping windows - prevents adjacent line false positives\n */\n private detectDuplicateContent(content: string): ValidationWarning[] {\n const warnings: ValidationWarning[] = [];\n \n const lines = content.split('\\n');\n \n // Look for significant duplicate blocks\n const blockSize = this.options.duplicateBlockSize!;\n const minLength = this.options.duplicateMinLength!;\n const blocks = new Map<string, number[]>();\n\n for (let i = 0; i <= lines.length - blockSize; i++) {\n const block = lines.slice(i, i + blockSize)\n .map(l => l.trim())\n .filter(l => l.length > 0)\n .join('\\n');\n\n if (block.length >= minLength) { // Only check substantial blocks\n if (!blocks.has(block)) {\n blocks.set(block, []);\n }\n blocks.get(block)!.push(i + 1); // Store 1-indexed line number\n }\n }\n\n // Report blocks that appear multiple times\n // Filter out overlapping detections (false positives from sliding window)\n for (const [block, lineNumbers] of blocks.entries()) {\n if (lineNumbers.length > 1) {\n // Remove line numbers that are within blockSize of each other\n // (these are overlapping windows, not true duplicates)\n const nonOverlapping: number[] = [];\n for (const lineNum of lineNumbers) {\n const isOverlapping = nonOverlapping.some(\n existing => Math.abs(existing - lineNum) < blockSize\n );\n if (!isOverlapping) {\n nonOverlapping.push(lineNum);\n }\n }\n \n // Only report if we still have multiple non-overlapping occurrences\n if (nonOverlapping.length > 1) {\n warnings.push({\n message: `Duplicate content block found at lines: ${nonOverlapping.join(', ')}`,\n suggestion: 'Check for merge artifacts or failed edits',\n });\n }\n }\n }\n\n return warnings;\n }\n\n /**\n * Validate markdown structure (excluding code blocks)\n * Only checks actual content for formatting issues\n */\n private validateMarkdownStructure(content: string, codeBlockRanges: CodeBlockRange[]): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Get content outside code blocks\n const contentOutsideCodeBlocks = this.getContentOutsideCodeBlocks(content, codeBlockRanges);\n\n // Remove list markers first (before checking asterisks)\n const lines = contentOutsideCodeBlocks.split('\\n');\n const linesWithoutListMarkers = lines.map(line => {\n const trimmed = line.trim();\n // Replace list markers: \"- item\" or \"* item\" or \"+ item\"\n if (trimmed.match(/^[-*+]\\s/)) {\n return line.replace(/^(\\s*)([-*+]\\s)/, '$1 '); // Replace marker with spaces\n }\n return line;\n });\n let contentWithoutListMarkers = linesWithoutListMarkers.join('\\n');\n\n // Also remove inline code (backticks) which might contain asterisks\n // Replace `code` with empty string to exclude from asterisk counting\n contentWithoutListMarkers = contentWithoutListMarkers.replace(/`[^`]*`/g, '');\n\n // Check for unclosed formatting\n const boldMatches = contentWithoutListMarkers.match(/\\*\\*/g) || [];\n \n // For italic, count single asterisks that are not part of bold\n // Split by ** first, then count * in the remaining text\n const withoutBold = contentWithoutListMarkers.split('**').join('');\n const italicMatches = withoutBold.match(/\\*/g) || [];\n \n if (boldMatches.length % 2 !== 0) {\n errors.push({\n message: 'Unclosed bold formatting (**)',\n suggestion: 'Check for missing closing ** in markdown content (not code blocks)',\n });\n }\n\n if (italicMatches.length % 2 !== 0) {\n errors.push({\n message: 'Unclosed italic formatting (*)',\n suggestion: 'Check for missing closing * in markdown content (not code blocks)',\n });\n }\n\n return errors;\n }\n}\n","/**\n * Sub-spec validator - validates sub-spec files per spec 012 conventions\n * \n * Phase 3.5: Sub-Spec Validation\n * - Validates sub-spec naming conventions\n * - Checks README.md references all sub-specs\n * - Validates complexity (token count + structure) per sub-spec file\n * - Detects orphaned sub-spec files (not linked from README)\n * - Validates cross-document references\n * \n * Updated per spec 066: Uses complexity scoring instead of line counts\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { countTokens } from '@leanspec/core';\nimport matter from 'gray-matter';\nimport type { ValidationRule, ValidationResult, ValidationError, ValidationWarning } from '../utils/validation-framework.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport { loadSubFiles, type SubFileInfo } from '../spec-loader.js';\n\nexport interface SubSpecOptions {\n // Token thresholds (same as ComplexityValidator)\n excellentThreshold?: number; // Default: 2000 tokens\n goodThreshold?: number; // Default: 3500 tokens\n warningThreshold?: number; // Default: 5000 tokens\n \n // Line count backstop (safety net)\n maxLines?: number; // Default: 500 lines\n\n // Cross-reference validation toggle\n checkCrossReferences?: boolean; // Default: true\n}\n\nexport class SubSpecValidator implements ValidationRule {\n name = 'sub-specs';\n description = 'Validate sub-spec files using direct token thresholds (spec 071)';\n\n private excellentThreshold: number;\n private goodThreshold: number;\n private warningThreshold: number;\n private maxLines: number;\n private checkCrossRefs: boolean;\n\n constructor(options: SubSpecOptions = {}) {\n // Token thresholds (hypothesis values based on research)\n this.excellentThreshold = options.excellentThreshold ?? 2000;\n this.goodThreshold = options.goodThreshold ?? 3500;\n this.warningThreshold = options.warningThreshold ?? 5000;\n \n // Line count backstop\n this.maxLines = options.maxLines ?? 500;\n\n // Cross-reference validation toggle\n this.checkCrossRefs = options.checkCrossReferences ?? true;\n }\n\n async validate(spec: SpecInfo, content: string): Promise<ValidationResult> {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Load sub-files for this spec\n const subFiles = await loadSubFiles(spec.fullPath, { includeContent: true });\n \n // Filter to only markdown documents (sub-specs)\n const subSpecs = subFiles.filter(f => f.type === 'document');\n\n // If no sub-specs, validation passes (nothing to check)\n if (subSpecs.length === 0) {\n return { passed: true, errors, warnings };\n }\n\n // Validate naming conventions\n this.validateNamingConventions(subSpecs, warnings);\n\n // Validate complexity (token count + structure) for each sub-spec\n await this.validateComplexity(subSpecs, errors, warnings);\n\n // Check for orphaned sub-specs (not referenced in README.md)\n this.checkOrphanedSubSpecs(subSpecs, content, warnings);\n\n if (this.checkCrossRefs) {\n this.validateCrossReferences(subSpecs, warnings);\n }\n\n return {\n passed: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Validate sub-spec naming conventions\n * Convention: Uppercase filenames (e.g., DESIGN.md, TESTING.md, IMPLEMENTATION.md)\n */\n private validateNamingConventions(subSpecs: SubFileInfo[], warnings: ValidationWarning[]): void {\n for (const subSpec of subSpecs) {\n const baseName = path.basename(subSpec.name, '.md');\n \n // Check if filename follows uppercase convention\n if (baseName !== baseName.toUpperCase()) {\n warnings.push({\n message: `Sub-spec filename should be uppercase: ${subSpec.name}`,\n suggestion: `Consider renaming to ${baseName.toUpperCase()}.md`,\n });\n }\n }\n }\n\n /**\n * Validate complexity for each sub-spec file using direct token thresholds\n * Same approach as ComplexityValidator (spec 071)\n */\n private async validateComplexity(\n subSpecs: SubFileInfo[], \n errors: ValidationError[], \n warnings: ValidationWarning[]\n ): Promise<void> {\n for (const subSpec of subSpecs) {\n if (!subSpec.content) {\n continue;\n }\n\n const lines = subSpec.content.split('\\n');\n const lineCount = lines.length;\n\n // Count sections (## headings, excluding code blocks)\n let sectionCount = 0;\n let inCodeBlock = false;\n for (const line of lines) {\n if (line.trim().startsWith('```')) {\n inCodeBlock = !inCodeBlock;\n continue;\n }\n if (!inCodeBlock && line.match(/^#{2,4}\\s/)) {\n sectionCount++;\n }\n }\n\n // Count tokens (async, accurate)\n const tokenResult = await countTokens(subSpec.content);\n const tokenCount = tokenResult.total;\n\n // PRIMARY CHECK: Direct token thresholds\n if (tokenCount > this.warningThreshold) {\n errors.push({\n message: `Sub-spec ${subSpec.name} has ${tokenCount.toLocaleString()} tokens (threshold: ${this.warningThreshold.toLocaleString()}) - should split`,\n suggestion: 'Consider splitting for Context Economy (attention and cognitive load)',\n });\n } else if (tokenCount > this.goodThreshold) {\n warnings.push({\n message: `Sub-spec ${subSpec.name} has ${tokenCount.toLocaleString()} tokens (threshold: ${this.goodThreshold.toLocaleString()})`,\n suggestion: 'Consider simplification or further splitting',\n });\n }\n\n // STRUCTURE CHECK: Sectioning\n if (sectionCount < 8 && lineCount > 200) {\n warnings.push({\n message: `Sub-spec ${subSpec.name} has only ${sectionCount} sections - too monolithic`,\n suggestion: 'Break into 15-35 sections for better readability (7±2 cognitive chunks)',\n });\n }\n }\n }\n\n /**\n * Check for orphaned sub-specs not referenced in README.md\n */\n private checkOrphanedSubSpecs(\n subSpecs: SubFileInfo[], \n readmeContent: string,\n warnings: ValidationWarning[]\n ): void {\n for (const subSpec of subSpecs) {\n // Check if sub-spec is referenced in README\n // Look for markdown links like [text](./FILENAME.md) or [text](FILENAME.md)\n const fileName = subSpec.name;\n // Escape special regex characters in filename\n const escapedFileName = fileName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n // Match with optional ./ prefix\n const linkPattern = new RegExp(`\\\\[([^\\\\]]+)\\\\]\\\\((?:\\\\.\\\\/)?${escapedFileName}\\\\)`, 'gi');\n const isReferenced = linkPattern.test(readmeContent);\n\n if (!isReferenced) {\n warnings.push({\n message: `Orphaned sub-spec: ${fileName} (not linked from README.md)`,\n suggestion: `Add a link to ${fileName} in README.md to document its purpose`,\n });\n }\n }\n }\n\n /**\n * Detect cross-document references that point to missing files\n */\n private validateCrossReferences(\n subSpecs: SubFileInfo[],\n warnings: ValidationWarning[]\n ): void {\n const availableFiles = new Set<string>(\n subSpecs.map(subSpec => subSpec.name.toLowerCase())\n );\n availableFiles.add('readme.md');\n\n const linkPattern = /\\[[^\\]]+\\]\\(([^)]+)\\)/gi;\n\n for (const subSpec of subSpecs) {\n if (!subSpec.content) continue;\n\n for (const match of subSpec.content.matchAll(linkPattern)) {\n const rawTarget = match[1].split('#')[0]?.trim();\n if (!rawTarget || !rawTarget.toLowerCase().endsWith('.md')) {\n continue;\n }\n\n const normalized = rawTarget.replace(/^\\.\\//, '');\n const normalizedLower = normalized.toLowerCase();\n\n if (availableFiles.has(normalizedLower)) {\n continue;\n }\n\n warnings.push({\n message: `Broken reference in ${subSpec.name}: ${normalized}`,\n suggestion: `Ensure ${normalized} exists or update the link`,\n });\n }\n }\n }\n\n}\n","/**\n * Dependency Alignment Validator\n * \n * Detects when spec content references other specs but those references\n * are not reflected in frontmatter depends_on/related fields.\n * \n * This catches a common AI agent failure mode: writing content that mentions\n * dependencies but forgetting to use `lean-spec link` to add them to frontmatter.\n */\n\nimport type { ValidationRule, ValidationResult, ValidationError, ValidationWarning } from '../utils/validation-framework.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport matter from 'gray-matter';\nimport yaml from 'js-yaml';\n\nexport interface DependencyAlignmentOptions {\n /** Treat misalignment as errors instead of warnings */\n strict?: boolean;\n /** Set of existing spec numbers to validate against (only warn about refs to existing specs) */\n existingSpecNumbers?: Set<string>;\n}\n\n/**\n * Patterns to detect spec references in content\n */\nconst SPEC_REF_PATTERNS = [\n // \"spec 045\", \"Spec 045\", \"spec-045\"\n /\\bspec[- ]?(\\d{3})\\b/gi,\n // \"045-unified-dashboard\" (full spec folder name)\n /\\b(\\d{3})-[a-z][a-z0-9-]+\\b/gi,\n];\n\n/**\n * Patterns that indicate blocking dependencies (depends_on)\n */\nconst DEPENDS_ON_PATTERNS = [\n /depends on[:\\s]+.*?\\b(\\d{3})\\b/gi,\n /blocked by[:\\s]+.*?\\b(\\d{3})\\b/gi,\n /requires[:\\s]+.*?spec[:\\s]*(\\d{3})\\b/gi,\n /prerequisite[:\\s]+.*?\\b(\\d{3})\\b/gi,\n /after[:\\s]+.*?spec[:\\s]*(\\d{3})\\b/gi,\n];\n\n/**\n * Patterns that indicate soft relationships (related)\n */\nconst RELATED_PATTERNS = [\n /related to[:\\s]+.*?\\b(\\d{3})\\b/gi,\n /see (also )?spec[:\\s]*(\\d{3})\\b/gi,\n /builds on[:\\s]+.*?\\b(\\d{3})\\b/gi,\n /similar to[:\\s]+.*?\\b(\\d{3})\\b/gi,\n /complements[:\\s]+.*?\\b(\\d{3})\\b/gi,\n /\\brelated[:\\s]+\\[?(\\d{3})/gi,\n];\n\ninterface DetectedRef {\n specNumber: string;\n type: 'depends_on' | 'related' | 'unknown';\n context: string;\n}\n\nexport class DependencyAlignmentValidator implements ValidationRule {\n name = 'dependency-alignment';\n description = 'Detect content references to specs not linked in frontmatter';\n\n private strict: boolean;\n private existingSpecNumbers: Set<string> | null;\n\n constructor(options: DependencyAlignmentOptions = {}) {\n this.strict = options.strict ?? false;\n this.existingSpecNumbers = options.existingSpecNumbers ?? null;\n }\n\n /**\n * Set the existing spec numbers to validate against\n */\n setExistingSpecNumbers(numbers: Set<string>): void {\n this.existingSpecNumbers = numbers;\n }\n\n validate(spec: SpecInfo, content: string): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Parse frontmatter to get current deps\n let parsed;\n try {\n parsed = matter(content, {\n engines: {\n yaml: (str) => yaml.load(str, { schema: yaml.FAILSAFE_SCHEMA }) as Record<string, unknown>\n }\n });\n } catch {\n // If frontmatter parsing fails, skip this validator (frontmatter validator will catch it)\n return { passed: true, errors: [], warnings: [] };\n }\n\n const frontmatter = parsed.data;\n const bodyContent = parsed.content;\n\n // Get current frontmatter dependencies\n const currentDependsOn = this.normalizeDeps(frontmatter.depends_on);\n const currentRelated = this.normalizeDeps(frontmatter.related);\n const allCurrentDeps = new Set([...currentDependsOn, ...currentRelated]);\n\n // Get this spec's number to exclude self-references\n const selfNumber = this.extractSpecNumber(spec.name);\n\n // Detect references in content\n const detectedRefs = this.detectReferences(bodyContent, selfNumber);\n\n // Find missing dependencies (only for specs that exist)\n const missingDependsOn: DetectedRef[] = [];\n const missingRelated: DetectedRef[] = [];\n\n for (const ref of detectedRefs) {\n // Skip if already linked\n if (allCurrentDeps.has(ref.specNumber)) continue;\n \n // Skip if we have existing spec numbers and this one doesn't exist\n if (this.existingSpecNumbers && !this.existingSpecNumbers.has(ref.specNumber)) continue;\n\n if (ref.type === 'depends_on') {\n missingDependsOn.push(ref);\n } else {\n missingRelated.push(ref);\n }\n }\n\n // Generate warnings/errors for missing deps\n if (missingDependsOn.length > 0) {\n const specNumbers = [...new Set(missingDependsOn.map(r => r.specNumber))];\n const issue = {\n message: `Content references blocking dependencies not in frontmatter: ${specNumbers.join(', ')}`,\n suggestion: `Run: lean-spec link ${spec.name} --depends-on ${specNumbers.join(' ')}`,\n };\n if (this.strict) {\n errors.push(issue);\n } else {\n warnings.push(issue);\n }\n }\n\n if (missingRelated.length > 0) {\n const specNumbers = [...new Set(missingRelated.map(r => r.specNumber))];\n const issue = {\n message: `Content references related specs not in frontmatter: ${specNumbers.join(', ')}`,\n suggestion: `Run: lean-spec link ${spec.name} --related ${specNumbers.join(' ')}`,\n };\n if (this.strict) {\n errors.push(issue);\n } else {\n warnings.push(issue);\n }\n }\n\n return {\n passed: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Normalize dependency field to array of spec numbers\n */\n private normalizeDeps(deps: unknown): string[] {\n if (!deps) return [];\n \n const depArray = Array.isArray(deps) ? deps : [deps];\n return depArray.map(d => {\n const str = String(d);\n // Extract just the number part\n const match = str.match(/(\\d{3})/);\n return match ? match[1] : str;\n }).filter(Boolean);\n }\n\n /**\n * Extract spec number from spec name (e.g., \"045-unified-dashboard\" -> \"045\")\n */\n private extractSpecNumber(specName: string): string | null {\n const match = specName.match(/^(\\d{3})/);\n return match ? match[1] : null;\n }\n\n /**\n * Detect spec references in content\n */\n private detectReferences(content: string, selfNumber: string | null): DetectedRef[] {\n const refs: DetectedRef[] = [];\n const seenNumbers = new Set<string>();\n\n // First check for explicit dependency patterns\n for (const pattern of DEPENDS_ON_PATTERNS) {\n const matches = content.matchAll(new RegExp(pattern));\n for (const match of matches) {\n const specNumber = match[1];\n if (specNumber && specNumber !== selfNumber && !seenNumbers.has(specNumber)) {\n seenNumbers.add(specNumber);\n refs.push({\n specNumber,\n type: 'depends_on',\n context: match[0].substring(0, 50),\n });\n }\n }\n }\n\n // Check for explicit related patterns\n for (const pattern of RELATED_PATTERNS) {\n const matches = content.matchAll(new RegExp(pattern));\n for (const match of matches) {\n // Some patterns have the number in group 1, some in group 2\n const specNumber = match[2] || match[1];\n if (specNumber && specNumber !== selfNumber && !seenNumbers.has(specNumber)) {\n seenNumbers.add(specNumber);\n refs.push({\n specNumber,\n type: 'related',\n context: match[0].substring(0, 50),\n });\n }\n }\n }\n\n // Check for general spec references (default to related)\n for (const pattern of SPEC_REF_PATTERNS) {\n const matches = content.matchAll(new RegExp(pattern));\n for (const match of matches) {\n const specNumber = match[1];\n if (specNumber && specNumber !== selfNumber && !seenNumbers.has(specNumber)) {\n seenNumbers.add(specNumber);\n refs.push({\n specNumber,\n type: 'related', // Default to related for ambiguous refs\n context: match[0].substring(0, 50),\n });\n }\n }\n }\n\n return refs;\n }\n}\n","/**\n * Validate output formatter - ESLint/TypeScript style formatting\n * \n * Implements file-centric, severity-first output format for spec validation.\n */\n\nimport chalk from 'chalk';\nimport type { ValidationResult } from './validation-framework.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport { formatStatusBadge, formatPriorityBadge } from './colors.js';\n\nexport interface ValidationIssue {\n severity: 'error' | 'warning';\n message: string;\n suggestion?: string;\n ruleName: string;\n filePath: string; // Full path to the spec file or sub-spec file\n spec?: SpecInfo; // Reference to spec for metadata display\n}\n\nexport interface FileValidationResult {\n filePath: string; // Display path (relative to specs directory)\n issues: ValidationIssue[];\n spec?: SpecInfo; // Reference to spec for metadata display\n}\n\nexport interface FormatOptions {\n verbose?: boolean; // Show passing specs\n quiet?: boolean; // Suppress warnings and only show errors\n format?: 'default' | 'json' | 'compact';\n rule?: string; // Filter by specific rule name\n}\n\n/**\n * Convert validation results to issue format grouped by file\n */\nexport function groupIssuesByFile(\n results: Array<{\n spec: SpecInfo;\n validatorName: string;\n result: ValidationResult;\n content: string;\n }>\n): FileValidationResult[] {\n const fileMap = new Map<string, { issues: ValidationIssue[], spec?: SpecInfo }>();\n\n // Helper function to add issue to fileMap\n const addIssue = (filePath: string, issue: ValidationIssue, spec: SpecInfo) => {\n if (!fileMap.has(filePath)) {\n fileMap.set(filePath, { issues: [], spec });\n }\n fileMap.get(filePath)!.issues.push(issue);\n };\n\n for (const { spec, validatorName, result } of results) {\n // Process errors - they are associated with the main spec file\n for (const error of result.errors) {\n addIssue(spec.filePath, {\n severity: 'error',\n message: error.message,\n suggestion: error.suggestion,\n ruleName: validatorName,\n filePath: spec.filePath,\n spec,\n }, spec);\n }\n\n // Process warnings - they are associated with the main spec file\n for (const warning of result.warnings) {\n addIssue(spec.filePath, {\n severity: 'warning',\n message: warning.message,\n suggestion: warning.suggestion,\n ruleName: validatorName,\n filePath: spec.filePath,\n spec,\n }, spec);\n }\n }\n\n // Convert map to array and sort\n const fileResults: FileValidationResult[] = [];\n for (const [filePath, data] of fileMap.entries()) {\n // Sort issues: errors first, then warnings\n data.issues.sort((a, b) => {\n if (a.severity === b.severity) return 0;\n return a.severity === 'error' ? -1 : 1;\n });\n\n fileResults.push({ filePath, issues: data.issues, spec: data.spec });\n }\n\n // Sort files by spec name (natural order)\n fileResults.sort((a, b) => {\n if (a.spec?.name && b.spec?.name) {\n return a.spec.name.localeCompare(b.spec.name);\n }\n return a.filePath.localeCompare(b.filePath);\n });\n\n return fileResults;\n}\n\n/**\n * Normalize file path to be relative to current working directory\n */\nfunction normalizeFilePath(filePath: string): string {\n const cwd = process.cwd();\n \n if (filePath.startsWith(cwd)) {\n // Remove cwd prefix and leading slash\n return filePath.substring(cwd.length + 1);\n } else if (filePath.includes('/specs/')) {\n // Extract from /specs/ onwards\n const specsIndex = filePath.indexOf('/specs/');\n return filePath.substring(specsIndex + 1);\n }\n \n return filePath;\n}\n\n/**\n * Format issues for a single file (ESLint-style)\n */\nexport function formatFileIssues(fileResult: FileValidationResult, specsDir: string): string {\n const lines: string[] = [];\n \n // Display path (relative to current working directory or specs directory)\n const relativePath = normalizeFilePath(fileResult.filePath);\n \n // Check if this is a main spec file (ends with README.md)\n const isMainSpec = relativePath.endsWith('README.md');\n \n if (isMainSpec && fileResult.spec) {\n // For main spec: Show spec name with metadata\n const specName = fileResult.spec.name;\n const status = fileResult.spec.frontmatter.status;\n const priority = fileResult.spec.frontmatter.priority || 'medium';\n \n const statusBadge = formatStatusBadge(status);\n const priorityBadge = formatPriorityBadge(priority);\n \n lines.push(chalk.bold.cyan(`${specName} ${statusBadge} ${priorityBadge}`));\n } else {\n // For sub-specs: Show relative path\n lines.push(chalk.cyan.underline(relativePath));\n }\n\n // Format each issue with aligned columns\n for (const issue of fileResult.issues) {\n const severityColor = issue.severity === 'error' ? chalk.red : chalk.yellow;\n const severityText = severityColor(issue.severity.padEnd(9)); // \"error \" or \"warning \"\n const ruleText = chalk.gray(issue.ruleName);\n \n lines.push(` ${severityText}${issue.message.padEnd(60)} ${ruleText}`);\n \n if (issue.suggestion) {\n lines.push(chalk.gray(` → ${issue.suggestion}`));\n }\n }\n\n lines.push(''); // Empty line after each file\n return lines.join('\\n');\n}\n\n/**\n * Format summary line\n */\nexport function formatSummary(\n totalSpecs: number,\n errorCount: number,\n warningCount: number,\n cleanCount: number\n): string {\n if (errorCount > 0) {\n const errorText = errorCount === 1 ? 'error' : 'errors';\n const warningText = warningCount === 1 ? 'warning' : 'warnings';\n return chalk.red.bold(\n `✖ ${errorCount} ${errorText}, ${warningCount} ${warningText} (${totalSpecs} specs checked, ${cleanCount} clean)`\n );\n } else if (warningCount > 0) {\n const warningText = warningCount === 1 ? 'warning' : 'warnings';\n return chalk.yellow.bold(\n `⚠ ${warningCount} ${warningText} (${totalSpecs} specs checked, ${cleanCount} clean)`\n );\n } else {\n return chalk.green.bold(`✓ All ${totalSpecs} specs passed`);\n }\n}\n\n/**\n * Format passing specs list (for --verbose mode)\n */\nexport function formatPassingSpecs(specs: SpecInfo[], specsDir: string): string {\n const lines: string[] = [];\n lines.push(chalk.green.bold(`\\n✓ ${specs.length} specs passed:`));\n \n for (const spec of specs) {\n const relativePath = normalizeFilePath(spec.filePath);\n lines.push(chalk.gray(` ${relativePath}`));\n }\n \n return lines.join('\\n');\n}\n\n/**\n * Format validation results in JSON format\n */\nexport function formatJson(\n fileResults: FileValidationResult[],\n totalSpecs: number,\n errorCount: number,\n warningCount: number\n): string {\n const output = {\n summary: {\n totalSpecs,\n errorCount,\n warningCount,\n cleanCount: totalSpecs - fileResults.length,\n },\n files: fileResults.map(fr => ({\n filePath: fr.filePath,\n issues: fr.issues.map(issue => ({\n severity: issue.severity,\n message: issue.message,\n suggestion: issue.suggestion,\n rule: issue.ruleName,\n })),\n })),\n };\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Main formatting function\n */\nexport function formatValidationResults(\n results: Array<{\n spec: SpecInfo;\n validatorName: string;\n result: ValidationResult;\n content: string;\n }>,\n specs: SpecInfo[],\n specsDir: string,\n options: FormatOptions = {}\n): string {\n const fileResults = groupIssuesByFile(results);\n \n // Filter by rule if specified\n const filteredResults = options.rule\n ? fileResults\n .map(fr => ({\n ...fr,\n issues: fr.issues.filter(issue => issue.ruleName === options.rule),\n }))\n .filter(fr => fr.issues.length > 0)\n : fileResults;\n\n // Filter by quiet mode (only errors)\n const displayResults = options.quiet\n ? filteredResults.map(fr => ({\n ...fr,\n issues: fr.issues.filter(issue => issue.severity === 'error'),\n })).filter(fr => fr.issues.length > 0)\n : filteredResults;\n\n // JSON format\n if (options.format === 'json') {\n const errorCount = displayResults.reduce(\n (sum, fr) => sum + fr.issues.filter(i => i.severity === 'error').length,\n 0\n );\n const warningCount = displayResults.reduce(\n (sum, fr) => sum + fr.issues.filter(i => i.severity === 'warning').length,\n 0\n );\n return formatJson(displayResults, specs.length, errorCount, warningCount);\n }\n\n // Default format\n const lines: string[] = [];\n \n // Header\n lines.push(chalk.bold(`\\nValidating ${specs.length} specs...\\n`));\n\n // Track previous spec to add separators\n let previousSpecName: string | undefined;\n\n // File issues\n for (const fileResult of displayResults) {\n // Add separator between different specs\n if (fileResult.spec && previousSpecName && fileResult.spec.name !== previousSpecName) {\n lines.push(chalk.gray('─'.repeat(80)));\n lines.push('');\n }\n \n lines.push(formatFileIssues(fileResult, specsDir));\n \n if (fileResult.spec) {\n previousSpecName = fileResult.spec.name;\n }\n }\n\n // Summary\n const errorCount = displayResults.reduce(\n (sum, fr) => sum + fr.issues.filter(i => i.severity === 'error').length,\n 0\n );\n const warningCount = displayResults.reduce(\n (sum, fr) => sum + fr.issues.filter(i => i.severity === 'warning').length,\n 0\n );\n const cleanCount = specs.length - fileResults.length;\n\n lines.push(formatSummary(specs.length, errorCount, warningCount, cleanCount));\n\n // Verbose mode: show passing specs\n if (options.verbose && cleanCount > 0) {\n const specsWithIssues = new Set(fileResults.map(fr => fr.filePath));\n const passingSpecs = specs.filter(spec => !specsWithIssues.has(spec.filePath));\n lines.push(formatPassingSpecs(passingSpecs, specsDir));\n }\n\n // Add hint for verbose mode if not already in verbose mode\n if (!options.verbose && cleanCount > 0 && displayResults.length > 0) {\n lines.push(chalk.gray('\\nRun with --verbose to see passing specs.'));\n }\n\n return lines.join('\\n');\n}\n","/**\n * Validate command - validates specs for quality issues\n * \n * Phase 1a: Basic framework + line count validation\n * Phase 1b: Frontmatter validation\n * Phase 2: Structure validation\n * Phase 3: Corruption detection\n * Phase 3.5: Sub-spec validation\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { loadAllSpecs, type SpecInfo } from '../spec-loader.js';\nimport { withSpinner } from '../utils/ui.js';\nimport { LineCountValidator } from '../validators/line-count.js';\nimport { FrontmatterValidator } from '../validators/frontmatter.js';\nimport { StructureValidator } from '../validators/structure.js';\nimport { CorruptionValidator } from '../validators/corruption.js';\nimport { SubSpecValidator } from '../validators/sub-spec.js';\nimport { ComplexityValidator } from '../validators/complexity.js';\nimport { DependencyAlignmentValidator } from '../validators/dependency-alignment.js';\nimport type { ValidationRule, ValidationResult } from '../utils/validation-framework.js';\nimport { formatValidationResults, type FormatOptions } from '../utils/validate-formatter.js';\n\nexport interface ValidateOptions {\n maxLines?: number; // Custom line limit (default: 400)\n specs?: string[]; // Specific specs to validate, or all if not provided\n verbose?: boolean; // Show passing specs\n quiet?: boolean; // Suppress warnings, only show errors\n format?: 'default' | 'json' | 'compact'; // Output format\n json?: boolean; // Shorthand for --format json\n rule?: string; // Filter by specific rule name\n warningsOnly?: boolean; // Treat all issues as warnings, never fail (useful for CI)\n checkDeps?: boolean; // Include dependency alignment check\n}\n\ninterface ValidationResultWithSpec {\n spec: SpecInfo;\n validatorName: string;\n result: ValidationResult;\n content: string; // Store content to avoid duplicate reads\n}\n\n/**\n * Validate command - validate specs for quality issues\n */\nexport function validateCommand(): Command {\n return new Command('validate')\n .description('Validate specs for quality issues')\n .argument('[specs...]', 'Specific specs to validate (optional)')\n .option('--max-lines <number>', 'Custom line limit (default: 400)', parseInt)\n .option('--verbose', 'Show passing specs')\n .option('--quiet', 'Suppress warnings, only show errors')\n .option('--format <format>', 'Output format: default, json, compact', 'default')\n .option('--json', 'Output as JSON (shorthand for --format json)')\n .option('--rule <rule>', 'Filter by specific rule name (e.g., max-lines, frontmatter)')\n .option('--warnings-only', 'Treat all issues as warnings, never fail (useful for CI pre-release checks)')\n .option('--check-deps', 'Check for content/frontmatter dependency alignment')\n .action(async (specs: string[] | undefined, options: ValidateOptions) => {\n const passed = await validateSpecs({\n maxLines: options.maxLines,\n specs: specs && specs.length > 0 ? specs : undefined,\n verbose: options.verbose,\n quiet: options.quiet,\n format: options.json ? 'json' : options.format,\n rule: options.rule,\n warningsOnly: options.warningsOnly,\n checkDeps: options.checkDeps,\n });\n process.exit(passed ? 0 : 1);\n });\n}\n\n/**\n * Validate specs for quality issues\n */\nexport async function validateSpecs(options: ValidateOptions = {}): Promise<boolean> {\n const config = await loadConfig();\n\n // Load specs to validate\n let specs: SpecInfo[];\n if (options.specs && options.specs.length > 0) {\n // Validate specific specs - load all specs once and filter\n const allSpecs = await loadAllSpecs();\n specs = [];\n for (const specPath of options.specs) {\n const spec = allSpecs.find(s => \n s.path.includes(specPath) || \n path.basename(s.path).includes(specPath)\n );\n if (spec) {\n specs.push(spec);\n } else {\n console.error(chalk.red(`Error: Spec not found: ${specPath}`));\n return false;\n }\n }\n } else {\n // Validate all specs\n specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({ includeArchived: false })\n );\n }\n\n if (specs.length === 0) {\n console.log('No specs found to validate.');\n return true;\n }\n\n // Initialize validators\n const validators: ValidationRule[] = [\n new ComplexityValidator({ maxLines: options.maxLines }), // Token-based complexity (primary), line count (backstop)\n new FrontmatterValidator(),\n new StructureValidator(),\n new CorruptionValidator(),\n new SubSpecValidator({ maxLines: options.maxLines }),\n ];\n\n // Add dependency alignment validator if requested\n if (options.checkDeps) {\n // Collect existing spec numbers for validation (only active specs, not archived)\n const activeSpecs = await loadAllSpecs({ includeArchived: false });\n const existingSpecNumbers = new Set<string>();\n for (const s of activeSpecs) {\n const match = s.name.match(/^(\\d{3})/);\n if (match) {\n existingSpecNumbers.add(match[1]);\n }\n }\n validators.push(new DependencyAlignmentValidator({ existingSpecNumbers }));\n }\n\n // Run validation\n const results: ValidationResultWithSpec[] = [];\n \n for (const spec of specs) {\n // Read spec content once\n let content: string;\n try {\n content = await fs.readFile(spec.filePath, 'utf-8');\n } catch (error) {\n console.error(chalk.red(`Error reading ${spec.filePath}:`), error);\n continue;\n }\n\n // Run all validators\n for (const validator of validators) {\n try {\n const result = await validator.validate(spec, content);\n results.push({ \n spec, \n validatorName: validator.name,\n result, \n content,\n });\n } catch (error) {\n console.error(chalk.yellow(`Warning: Validator ${validator.name} failed:`), error instanceof Error ? error.message : error);\n }\n }\n }\n\n // Format and display results using new formatter\n const formatOptions: FormatOptions = {\n verbose: options.verbose,\n quiet: options.quiet,\n format: options.format,\n rule: options.rule,\n };\n\n const output = formatValidationResults(results, specs, config.specsDir, formatOptions);\n console.log(output);\n\n // Determine if validation passed\n if (options.warningsOnly) {\n // In warnings-only mode, always pass (just report issues)\n return true;\n }\n \n // Normal mode: any errors = failed\n const hasErrors = results.some(r => !r.result.passed);\n return !hasErrors;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\n\nexport interface MigrationOptions {\n inputPath: string;\n aiProvider?: 'copilot' | 'claude' | 'gemini';\n dryRun?: boolean;\n batchSize?: number;\n skipValidation?: boolean;\n backfill?: boolean;\n}\n\nexport interface DocumentInfo {\n path: string;\n name: string;\n size: number;\n}\n\nexport function migrateCommand(): Command;\nexport function migrateCommand(inputPath: string, options?: Partial<MigrationOptions>): Promise<void>;\nexport function migrateCommand(inputPath?: string, options: Partial<MigrationOptions> = {}): Command | Promise<void> {\n if (typeof inputPath === 'string') {\n return migrateSpecs(inputPath, options);\n }\n\n return new Command('migrate')\n .description('Migrate specs from other SDD tools (ADR, RFC, OpenSpec, spec-kit, etc.)')\n .argument('<input-path>', 'Path to directory containing specs to migrate')\n .option('--with <provider>', 'AI-assisted migration (copilot, claude, gemini)')\n .option('--dry-run', 'Preview without making changes')\n .option('--batch-size <n>', 'Process N docs at a time', parseInt)\n .option('--skip-validation', \"Don't validate after migration\")\n .option('--backfill', 'Auto-run backfill after migration')\n .action(async (target: string, opts: {\n with?: string;\n dryRun?: boolean;\n batchSize?: number;\n skipValidation?: boolean;\n backfill?: boolean;\n }) => {\n if (opts.with && !['copilot', 'claude', 'gemini'].includes(opts.with)) {\n console.error('\\x1b[31m❌ Error:\\x1b[0m Invalid AI provider. Use: copilot, claude, or gemini');\n process.exit(1);\n }\n await migrateSpecs(target, {\n aiProvider: opts.with as 'copilot' | 'claude' | 'gemini' | undefined,\n dryRun: opts.dryRun,\n batchSize: opts.batchSize,\n skipValidation: opts.skipValidation,\n backfill: opts.backfill,\n });\n });\n}\n\n/**\n * Main migration command - generates instructions for migrating specs from other tools\n */\nexport async function migrateSpecs(inputPath: string, options: Partial<MigrationOptions> = {}): Promise<void> {\n const config = await loadConfig();\n \n // Validate input path exists\n try {\n const stats = await fs.stat(inputPath);\n if (!stats.isDirectory()) {\n console.error('\\x1b[31m❌ Error:\\x1b[0m Input path must be a directory');\n process.exit(1);\n }\n } catch (error) {\n console.error(`\\x1b[31m❌ Error:\\x1b[0m Path not found: ${inputPath}`);\n process.exit(1);\n }\n \n // Scan for documents\n console.log(`\\x1b[36mScanning:\\x1b[0m ${inputPath}\\n`);\n const documents = await scanDocuments(inputPath);\n \n if (documents.length === 0) {\n console.error(`\\x1b[31m❌ Error:\\x1b[0m No documents found in ${inputPath}`);\n console.error(' Check path and try again');\n process.exit(1);\n }\n \n console.log(`\\x1b[32m✓\\x1b[0m Found ${documents.length} document${documents.length === 1 ? '' : 's'}\\n`);\n \n // If AI provider specified, verify and execute\n if (options.aiProvider) {\n await migrateWithAI(inputPath, documents, options as MigrationOptions);\n } else {\n // Default: Output manual migration instructions\n await outputManualInstructions(inputPath, documents, config);\n }\n}\n\n/**\n * Scan directory for markdown documents (format-agnostic)\n */\nexport async function scanDocuments(dirPath: string): Promise<DocumentInfo[]> {\n const documents: DocumentInfo[] = [];\n \n async function scanRecursive(currentPath: string): Promise<void> {\n const entries = await fs.readdir(currentPath, { withFileTypes: true });\n \n for (const entry of entries) {\n const fullPath = path.join(currentPath, entry.name);\n \n if (entry.isDirectory()) {\n // Skip node_modules, .git, etc.\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n await scanRecursive(fullPath);\n }\n } else if (entry.isFile()) {\n // Look for markdown files\n if (entry.name.endsWith('.md') || entry.name.endsWith('.markdown')) {\n const stats = await fs.stat(fullPath);\n documents.push({\n path: fullPath,\n name: entry.name,\n size: stats.size,\n });\n }\n }\n }\n }\n \n await scanRecursive(dirPath);\n return documents;\n}\n\n/**\n * Output manual migration instructions (default mode)\n */\nasync function outputManualInstructions(\n inputPath: string,\n documents: DocumentInfo[],\n config: any\n): Promise<void> {\n const specsDir = config.specsDir || 'specs';\n \n console.log('═'.repeat(70));\n console.log('\\x1b[1m\\x1b[36m📋 LeanSpec Migration Instructions\\x1b[0m');\n console.log('═'.repeat(70));\n console.log();\n console.log('\\x1b[1mSource Location:\\x1b[0m');\n console.log(` ${inputPath} (${documents.length} documents found)`);\n console.log();\n console.log('\\x1b[1mMigration Prompt:\\x1b[0m');\n console.log(' Copy this prompt to your AI assistant (Copilot, Claude, ChatGPT, etc.):');\n console.log();\n console.log('─'.repeat(70));\n console.log();\n console.log('You are helping migrate specification documents to LeanSpec format.');\n console.log();\n console.log(`\\x1b[1mSource:\\x1b[0m ${inputPath}`);\n console.log();\n console.log('\\x1b[1mYour Task:\\x1b[0m');\n console.log('1. Analyze the source documents to understand their format and structure');\n console.log('2. For each document, extract:');\n console.log(' - Title/name');\n console.log(' - Status (map to: planned, in-progress, complete, archived)');\n console.log(' - Creation date');\n console.log(' - Priority (if present)');\n console.log(' - Main content sections');\n console.log(' - Relationships to other documents');\n console.log();\n console.log('3. Migrate each document by running these commands:');\n console.log();\n console.log(' # Create spec');\n console.log(' lean-spec create <name>');\n console.log();\n console.log(' # Set metadata (NEVER edit frontmatter manually)');\n console.log(' lean-spec update <name> --status <status>');\n console.log(' lean-spec update <name> --priority <priority>');\n console.log(' lean-spec update <name> --tags <tag1,tag2>');\n console.log();\n console.log(' # Edit content with your preferred tool');\n console.log(' # Map original sections to LeanSpec structure:');\n console.log(' # - Overview: Problem statement and context');\n console.log(' # - Design: Technical approach and decisions');\n console.log(' # - Plan: Implementation steps (if applicable)');\n console.log(' # - Test: Validation criteria (if applicable)');\n console.log(' # - Notes: Additional context, trade-offs, alternatives');\n console.log();\n console.log('4. After migration, run:');\n console.log();\n console.log(' lean-spec validate # Check for issues');\n console.log(' lean-spec board # Verify migration');\n console.log();\n console.log('\\x1b[1mImportant Rules:\\x1b[0m');\n console.log('- Preserve decision rationale and context');\n console.log('- Map status appropriately to LeanSpec states');\n console.log('- Link related specs using `related` field (manual frontmatter edit)');\n console.log('- Follow LeanSpec first principles: clarity over completeness');\n console.log('- Keep specs under 400 lines (split if needed)');\n console.log();\n console.log('─'.repeat(70));\n console.log();\n console.log('\\x1b[36mℹ\\x1b[0m \\x1b[1mTip:\\x1b[0m For AI-assisted migration, use:');\n console.log(' \\x1b[90mlean-spec migrate <path> --with copilot\\x1b[0m');\n console.log();\n}\n\n/**\n * AI-assisted migration (when --with flag specified)\n */\nasync function migrateWithAI(\n inputPath: string,\n documents: DocumentInfo[],\n options: MigrationOptions\n): Promise<void> {\n const provider = options.aiProvider!;\n \n console.log(`\\x1b[36m🤖 AI-Assisted Migration:\\x1b[0m ${provider}\\n`);\n \n // Verify AI CLI tool\n const tool = await verifyAITool(provider);\n \n if (!tool.installed) {\n console.error(`\\x1b[31m❌ ${tool.name} CLI not found\\x1b[0m`);\n console.error(` Install: ${tool.installCmd}`);\n console.error(' Or run without --with flag for manual instructions');\n process.exit(1);\n }\n \n if (!tool.compatible) {\n console.error(`\\x1b[31m❌ ${tool.name} version ${tool.version} too old\\x1b[0m`);\n console.error(` Required: >=${tool.minVersion}`);\n console.error(` Update: ${tool.updateCmd}`);\n process.exit(1);\n }\n \n console.log(`\\x1b[32m✓\\x1b[0m ${tool.name} CLI verified (v${tool.version})\\n`);\n \n // AI-assisted mode is a placeholder for future implementation\n console.log('\\x1b[33m⚠ AI-assisted migration is not yet fully implemented\\x1b[0m');\n console.log(' This feature will automatically execute migration via AI CLI tools.');\n console.log();\n console.log(' For now, use manual mode (without --with flag) to get migration instructions.');\n console.log();\n}\n\n/**\n * AI CLI tool definitions\n */\ninterface AICliTool {\n name: string;\n cliCommand: string;\n installCmd: string;\n updateCmd: string;\n versionCmd: string;\n minVersion: string;\n installed: boolean;\n version?: string;\n compatible: boolean;\n}\n\n/**\n * Verify AI CLI tool is installed and compatible\n */\nasync function verifyAITool(provider: 'copilot' | 'claude' | 'gemini'): Promise<AICliTool> {\n const tools: Record<string, Omit<AICliTool, 'installed' | 'version' | 'compatible'>> = {\n copilot: {\n name: 'GitHub Copilot CLI',\n cliCommand: 'github-copilot-cli',\n installCmd: 'npm install -g @githubnext/github-copilot-cli',\n updateCmd: 'npm update -g @githubnext/github-copilot-cli',\n versionCmd: 'github-copilot-cli --version',\n minVersion: '0.1.0',\n },\n claude: {\n name: 'Claude CLI',\n cliCommand: 'claude',\n installCmd: 'pip install claude-cli',\n updateCmd: 'pip install --upgrade claude-cli',\n versionCmd: 'claude --version',\n minVersion: '1.0.0',\n },\n gemini: {\n name: 'Gemini CLI',\n cliCommand: 'gemini-cli',\n installCmd: 'npm install -g @google/gemini-cli',\n updateCmd: 'npm update -g @google/gemini-cli',\n versionCmd: 'gemini-cli --version',\n minVersion: '1.0.0',\n },\n };\n \n const toolDef = tools[provider];\n \n // Check if installed\n let installed = false;\n let version: string | undefined;\n \n try {\n const { execSync } = await import('node:child_process');\n // Check if command exists\n execSync(`which ${toolDef.cliCommand}`, { stdio: 'ignore' });\n installed = true;\n \n // Get version\n try {\n const versionOutput = execSync(toolDef.versionCmd, { \n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore']\n });\n const versionMatch = versionOutput.match(/(\\d+\\.\\d+\\.\\d+)/);\n if (versionMatch) {\n version = versionMatch[1];\n }\n } catch {\n // Version check failed, but tool is installed\n version = 'unknown';\n }\n } catch {\n // Command not found\n installed = false;\n }\n \n // Check compatibility\n const compatible = installed && (version === 'unknown' || (version !== undefined && satisfiesVersion(version, toolDef.minVersion)));\n \n return {\n ...toolDef,\n installed,\n version,\n compatible,\n };\n}\n\n/**\n * Simple semver comparison\n */\nfunction satisfiesVersion(version: string, minVersion: string): boolean {\n const vParts = version.split('.').map(Number);\n const minParts = minVersion.split('.').map(Number);\n \n for (let i = 0; i < 3; i++) {\n const v = vParts[i] || 0;\n const min = minParts[i] || 0;\n \n if (v > min) return true;\n if (v < min) return false;\n }\n \n return true; // equal\n}\n","import dayjs from 'dayjs';\nimport type { SpecInfo } from '../spec-loader.js';\n\nexport interface CompletionMetrics {\n score: number; // 0-100 (simple completion rate: complete/total * 100)\n totalSpecs: number;\n activeSpecs: number;\n completeSpecs: number;\n criticalIssues: string[];\n warnings: string[];\n}\n\n/**\n * Check if a spec is critical and overdue\n */\nfunction isCriticalOverdue(spec: SpecInfo): boolean {\n if (spec.frontmatter.status === 'complete' || spec.frontmatter.status === 'archived') {\n return false;\n }\n \n if (!spec.frontmatter.due) {\n return false;\n }\n \n const isOverdue = dayjs(spec.frontmatter.due).isBefore(dayjs(), 'day');\n const isCritical = spec.frontmatter.priority === 'critical' || spec.frontmatter.priority === 'high';\n \n return isOverdue && isCritical;\n}\n\n/**\n * Check if a spec has been in progress for too long (> 7 days)\n */\nfunction isLongRunning(spec: SpecInfo): boolean {\n if (spec.frontmatter.status !== 'in-progress') {\n return false;\n }\n \n const updatedAt = spec.frontmatter.updated || spec.frontmatter.updated_at || spec.frontmatter.created || spec.frontmatter.created_at;\n \n if (!updatedAt) {\n return false;\n }\n \n const daysSinceUpdate = dayjs().diff(dayjs(updatedAt), 'day');\n return daysSinceUpdate > 7;\n}\n\n/**\n * Calculate completion metrics for a set of specs\n * Score is simple completion rate: (complete / total) * 100\n */\nexport function calculateCompletion(specs: SpecInfo[]): CompletionMetrics {\n const criticalIssues: string[] = [];\n const warnings: string[] = [];\n \n // Filter out archived specs (by path or status)\n // Specs in archived/ folder may have status: complete, so check path too\n const activeAndCompleteSpecs = specs.filter(s => \n s.frontmatter.status !== 'archived' && \n !s.path.startsWith('archived/')\n );\n \n for (const spec of activeAndCompleteSpecs) {\n // Detect critical issues\n if (isCriticalOverdue(spec)) {\n criticalIssues.push(spec.path);\n }\n \n // Detect warnings (long-running WIP)\n if (isLongRunning(spec)) {\n warnings.push(spec.path);\n }\n }\n \n // Count active and complete specs (excluding archived by path and status)\n const activeSpecs = specs.filter(\n s => (s.frontmatter.status === 'planned' || s.frontmatter.status === 'in-progress') &&\n !s.path.startsWith('archived/')\n );\n const completeSpecs = specs.filter(s => \n s.frontmatter.status === 'complete' && \n !s.path.startsWith('archived/')\n );\n \n // Calculate simple completion rate (avoid division by zero)\n const totalSpecs = activeAndCompleteSpecs.length;\n const score = totalSpecs > 0 ? Math.round((completeSpecs.length / totalSpecs) * 100) : 0;\n \n return {\n score,\n totalSpecs,\n activeSpecs: activeSpecs.length,\n completeSpecs: completeSpecs.length,\n criticalIssues,\n warnings,\n };\n}\n\n/**\n * Get a completion status indicator based on score\n */\nexport function getCompletionStatus(score: number): { emoji: string; label: string; color: string } {\n if (score >= 70) {\n return { emoji: '✓', label: 'Good', color: 'green' };\n } else if (score >= 40) {\n return { emoji: '⚠', label: 'Fair', color: 'yellow' };\n } else {\n return { emoji: '✗', label: 'Needs Attention', color: 'red' };\n }\n}\n","import dayjs from 'dayjs';\nimport type { SpecInfo } from '../spec-loader.js';\n\n/**\n * Velocity metrics for measuring SDD effectiveness\n */\nexport interface VelocityMetrics {\n cycleTime: {\n average: number; // Average days from created to completed\n median: number;\n p90: number; // 90th percentile\n };\n leadTime: {\n plannedToInProgress: number; // Average days in planned\n inProgressToComplete: number; // Average days in progress\n };\n throughput: {\n perWeek: number;\n perMonth: number;\n trend: 'up' | 'down' | 'stable';\n };\n wip: {\n current: number; // Current work in progress\n average: number; // Average WIP over time\n };\n}\n\n/**\n * Calculate cycle time (created → completed) in days\n */\nexport function calculateCycleTime(spec: SpecInfo): number | null {\n if (spec.frontmatter.status !== 'complete' && spec.frontmatter.status !== 'archived') {\n return null;\n }\n\n const createdAt = spec.frontmatter.created_at || spec.frontmatter.created;\n const completedAt = spec.frontmatter.completed_at || spec.frontmatter.completed;\n\n if (!createdAt || !completedAt) {\n return null;\n }\n\n const created = dayjs(createdAt);\n const completed = dayjs(completedAt);\n\n return completed.diff(created, 'day', true);\n}\n\n/**\n * Calculate lead time for a specific stage\n */\nexport function calculateLeadTime(\n spec: SpecInfo,\n fromStatus: string,\n toStatus: string\n): number | null {\n const transitions = spec.frontmatter.transitions;\n if (!transitions || !Array.isArray(transitions)) {\n return null;\n }\n\n const fromTransition = transitions.find((t) => t.status === fromStatus);\n const toTransition = transitions.find((t) => t.status === toStatus);\n\n if (!fromTransition || !toTransition) {\n return null;\n }\n\n const from = dayjs(fromTransition.at);\n const to = dayjs(toTransition.at);\n\n return to.diff(from, 'day', true);\n}\n\n/**\n * Calculate throughput (completed specs in a time period)\n */\nexport function calculateThroughput(specs: SpecInfo[], days: number): number {\n const cutoff = dayjs().subtract(days, 'day');\n\n return specs.filter((s) => {\n if (s.frontmatter.status !== 'complete' && s.frontmatter.status !== 'archived') {\n return false;\n }\n\n const completedAt = s.frontmatter.completed_at || s.frontmatter.completed;\n if (!completedAt) {\n return false;\n }\n\n return dayjs(completedAt).isAfter(cutoff);\n }).length;\n}\n\n/**\n * Calculate work in progress at a specific point in time\n */\nexport function calculateWIP(specs: SpecInfo[], date: dayjs.Dayjs = dayjs()): number {\n return specs.filter((s) => {\n const createdAt = s.frontmatter.created_at || s.frontmatter.created;\n const created = dayjs(createdAt);\n\n // Must be created before the target date\n if (created.isAfter(date)) {\n return false;\n }\n\n // Check if completed after the target date (or not completed)\n const completedAt = s.frontmatter.completed_at || s.frontmatter.completed;\n if (completedAt) {\n const completed = dayjs(completedAt);\n return completed.isAfter(date);\n }\n\n // Not completed yet - check if still active\n return s.frontmatter.status !== 'complete' && s.frontmatter.status !== 'archived';\n }).length;\n}\n\n/**\n * Calculate comprehensive velocity metrics\n */\nexport function calculateVelocityMetrics(specs: SpecInfo[]): VelocityMetrics {\n // Calculate cycle times for completed specs\n const cycleTimes = specs\n .map((s) => calculateCycleTime(s))\n .filter((t): t is number => t !== null)\n .sort((a, b) => a - b);\n\n const averageCycleTime = cycleTimes.length > 0\n ? cycleTimes.reduce((sum, t) => sum + t, 0) / cycleTimes.length\n : 0;\n\n const medianCycleTime = cycleTimes.length > 0\n ? cycleTimes.length % 2 === 0\n ? (cycleTimes[cycleTimes.length / 2 - 1] + cycleTimes[cycleTimes.length / 2]) / 2\n : cycleTimes[Math.floor(cycleTimes.length / 2)]\n : 0;\n\n const p90CycleTime = cycleTimes.length > 0\n ? cycleTimes[Math.min(Math.floor(cycleTimes.length * 0.9), cycleTimes.length - 1)]\n : 0;\n\n // Calculate lead times (if transition data available)\n const plannedToInProgressTimes = specs\n .map((s) => calculateLeadTime(s, 'planned', 'in-progress'))\n .filter((t): t is number => t !== null);\n\n const inProgressToCompleteTimes = specs\n .map((s) => calculateLeadTime(s, 'in-progress', 'complete'))\n .filter((t): t is number => t !== null);\n\n const avgPlannedToInProgress = plannedToInProgressTimes.length > 0\n ? plannedToInProgressTimes.reduce((sum, t) => sum + t, 0) / plannedToInProgressTimes.length\n : 0;\n\n const avgInProgressToComplete = inProgressToCompleteTimes.length > 0\n ? inProgressToCompleteTimes.reduce((sum, t) => sum + t, 0) / inProgressToCompleteTimes.length\n : 0;\n\n // Calculate throughput\n const throughputWeek = calculateThroughput(specs, 7);\n const throughputMonth = calculateThroughput(specs, 30);\n \n // Calculate throughput for previous week for trend\n const prevWeekStart = dayjs().subtract(14, 'day');\n const prevWeekEnd = dayjs().subtract(7, 'day');\n const throughputPrevWeek = specs.filter((s) => {\n const completedAt = s.frontmatter.completed_at || s.frontmatter.completed;\n if (!completedAt) return false;\n const completed = dayjs(completedAt);\n return completed.isAfter(prevWeekStart) && !completed.isAfter(prevWeekEnd);\n }).length;\n\n const throughputTrend: 'up' | 'down' | 'stable' =\n throughputWeek > throughputPrevWeek ? 'up' :\n throughputWeek < throughputPrevWeek ? 'down' : 'stable';\n\n // Calculate WIP\n const currentWIP = calculateWIP(specs);\n\n // Calculate average WIP over last 30 days\n const wipSamples: number[] = [];\n for (let i = 0; i < 30; i++) {\n const sampleDate = dayjs().subtract(i, 'day');\n wipSamples.push(calculateWIP(specs, sampleDate));\n }\n const avgWIP = wipSamples.length > 0\n ? wipSamples.reduce((sum, w) => sum + w, 0) / wipSamples.length\n : 0;\n\n return {\n cycleTime: {\n average: Math.round(averageCycleTime * 10) / 10,\n median: Math.round(medianCycleTime * 10) / 10,\n p90: Math.round(p90CycleTime * 10) / 10,\n },\n leadTime: {\n plannedToInProgress: Math.round(avgPlannedToInProgress * 10) / 10,\n inProgressToComplete: Math.round(avgInProgressToComplete * 10) / 10,\n },\n throughput: {\n perWeek: throughputWeek,\n perMonth: throughputMonth,\n trend: throughputTrend,\n },\n wip: {\n current: currentWIP,\n average: Math.round(avgWIP * 10) / 10,\n },\n };\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport type { SpecFilterOptions, SpecStatus, SpecPriority } from '../frontmatter.js';\nimport { withSpinner } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { calculateCompletion, getCompletionStatus } from '../utils/completion.js';\nimport { calculateVelocityMetrics } from '../utils/velocity.js';\nimport { STATUS_CONFIG, PRIORITY_CONFIG } from '../utils/colors.js';\n\n/**\n * Board command - show Kanban-style board view\n */\nexport function boardCommand(): Command {\n return new Command('board')\n .description('Show Kanban-style board view with project completion summary')\n .option('--complete', 'Include complete specs (default: hidden)')\n .option('--simple', 'Hide completion summary (kanban only)')\n .option('--completion-only', 'Show only completion summary (no kanban)')\n .option('--tag <tag>', 'Filter by tag')\n .option('--assignee <name>', 'Filter by assignee')\n .option('--json', 'Output as JSON')\n .action(async (options: {\n showComplete?: boolean;\n simple?: boolean;\n completionOnly?: boolean;\n tag?: string;\n assignee?: string;\n json?: boolean;\n }) => {\n await showBoard(options);\n });\n}\n\nexport async function showBoard(options: {\n showComplete?: boolean;\n simple?: boolean;\n completionOnly?: boolean;\n tag?: string;\n assignee?: string;\n json?: boolean;\n}): Promise<void> {\n // Auto-check for conflicts before display\n await autoCheckIfEnabled();\n \n // Build filter\n const filter: SpecFilterOptions = {};\n if (options.tag) {\n filter.tags = [options.tag];\n }\n if (options.assignee) {\n filter.assignee = options.assignee;\n }\n\n // Load all specs with spinner (include archived for accurate metrics, but don't display in columns)\n const specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({\n includeArchived: true,\n filter,\n })\n );\n\n if (specs.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ columns: {}, total: 0 }, null, 2));\n } else {\n console.log(chalk.dim('No specs found.'));\n }\n return;\n }\n\n // Group specs by status (we loaded archived for metrics, but don't show them in board columns)\n const columns: Record<SpecStatus, SpecInfo[]> = {\n planned: [],\n 'in-progress': [],\n complete: [],\n archived: [],\n };\n\n for (const spec of specs) {\n // Handle invalid status by treating as 'planned'\n const status = columns[spec.frontmatter.status] !== undefined \n ? spec.frontmatter.status \n : 'planned';\n \n // Only add to columns if not archived (archived specs are included in metrics but not displayed)\n if (status !== 'archived') {\n columns[status].push(spec);\n }\n }\n\n // JSON output\n if (options.json) {\n const completionMetrics = calculateCompletion(specs);\n const velocityMetrics = calculateVelocityMetrics(specs);\n \n const jsonOutput = {\n columns: {\n planned: columns.planned.map(s => ({ path: s.path, priority: s.frontmatter.priority, assignee: s.frontmatter.assignee, tags: s.frontmatter.tags })),\n 'in-progress': columns['in-progress'].map(s => ({ path: s.path, priority: s.frontmatter.priority, assignee: s.frontmatter.assignee, tags: s.frontmatter.tags })),\n complete: columns.complete.map(s => ({ path: s.path, priority: s.frontmatter.priority, assignee: s.frontmatter.assignee, tags: s.frontmatter.tags })),\n },\n summary: {\n total: completionMetrics.totalSpecs,\n active: completionMetrics.activeSpecs,\n complete: completionMetrics.completeSpecs,\n completionRate: completionMetrics.score,\n velocity: {\n avgCycleTime: velocityMetrics.cycleTime.average,\n throughputPerWeek: velocityMetrics.throughput.perWeek / 7 * 7,\n },\n },\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Display header\n console.log(chalk.bold.cyan('📋 Spec Kanban Board'));\n \n // Filter info\n if (options.tag || options.assignee) {\n const filterParts: string[] = [];\n if (options.tag) filterParts.push(`tag=${options.tag}`);\n if (options.assignee) filterParts.push(`assignee=${options.assignee}`);\n console.log(chalk.dim(`Filtered by: ${filterParts.join(', ')}`));\n }\n console.log('');\n\n // Show completion summary unless --simple flag is set\n if (!options.simple) {\n const completionMetrics = calculateCompletion(specs);\n const velocityMetrics = calculateVelocityMetrics(specs);\n const completionStatus = getCompletionStatus(completionMetrics.score);\n \n // Health summary box\n const boxWidth = 62;\n const topBorder = '╔' + '═'.repeat(boxWidth - 2) + '╗';\n const bottomBorder = '╚' + '═'.repeat(boxWidth - 2) + '╝';\n \n // Helper to pad line with ANSI code awareness\n const padLine = (content: string): string => {\n const visibleLength = stripAnsi(content).length;\n const padding = boxWidth - 2 - visibleLength;\n return content + ' '.repeat(Math.max(0, padding));\n };\n \n console.log(chalk.dim(topBorder));\n \n const headerLine = chalk.bold(' Project Overview');\n console.log(chalk.dim('║') + padLine(headerLine) + chalk.dim('║'));\n \n // Completion rate percentage\n const percentageColor = completionMetrics.score >= 70 ? chalk.green : \n completionMetrics.score >= 40 ? chalk.yellow : \n chalk.red;\n \n const line1 = ` ${completionMetrics.totalSpecs} total · ${completionMetrics.activeSpecs} active · ${completionMetrics.completeSpecs} complete ${percentageColor('(' + completionMetrics.score + '%)')}`;\n console.log(chalk.dim('║') + padLine(line1) + chalk.dim('║'));\n \n // Alerts line\n if (completionMetrics.criticalIssues.length > 0 || completionMetrics.warnings.length > 0) {\n const alerts: string[] = [];\n if (completionMetrics.criticalIssues.length > 0) {\n alerts.push(`${completionMetrics.criticalIssues.length} critical overdue`);\n }\n if (completionMetrics.warnings.length > 0) {\n alerts.push(`${completionMetrics.warnings.length} specs WIP > 7 days`);\n }\n const alertLine = ` ${chalk.yellow('⚠️ ' + alerts.join(' · '))}`;\n console.log(chalk.dim('║') + padLine(alertLine) + chalk.dim('║'));\n }\n \n // Velocity line\n const velocityLine = ` ${chalk.cyan('🚀 Velocity:')} ${velocityMetrics.cycleTime.average.toFixed(1)}d avg cycle · ${(velocityMetrics.throughput.perWeek / 7 * 7).toFixed(1)}/wk throughput`;\n console.log(chalk.dim('║') + padLine(velocityLine) + chalk.dim('║'));\n \n console.log(chalk.dim(bottomBorder));\n console.log('');\n\n // If --completion-only, stop here\n if (options.completionOnly) {\n return;\n }\n } // Render columns\n renderColumn(STATUS_CONFIG.planned.label, STATUS_CONFIG.planned.emoji, columns.planned, true, STATUS_CONFIG.planned.colorFn);\n \n // Separator between status sections\n console.log(chalk.dim('━'.repeat(70)));\n console.log('');\n \n renderColumn(STATUS_CONFIG['in-progress'].label, STATUS_CONFIG['in-progress'].emoji, columns['in-progress'], true, STATUS_CONFIG['in-progress'].colorFn);\n \n // Separator between status sections\n console.log(chalk.dim('━'.repeat(70)));\n console.log('');\n \n renderColumn(STATUS_CONFIG.complete.label, STATUS_CONFIG.complete.emoji, columns.complete, options.showComplete || false, STATUS_CONFIG.complete.colorFn);\n}\n\nfunction renderColumn(\n title: string,\n emoji: string,\n specs: SpecInfo[],\n expanded: boolean,\n colorFn: (s: string) => string\n): void {\n // Column header\n console.log(`${emoji} ${colorFn(chalk.bold(`${title} (${specs.length})`))}`);\n console.log('');\n\n if (expanded && specs.length > 0) {\n // Group specs by priority\n const priorityGroups: Record<string, SpecInfo[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n none: []\n };\n\n for (const spec of specs) {\n const priority = spec.frontmatter.priority || 'none';\n priorityGroups[priority].push(spec);\n }\n\n // Render each priority group\n const priorityOrder: Array<keyof typeof priorityGroups> = ['critical', 'high', 'medium', 'low', 'none'];\n let firstGroup = true;\n\n for (const priority of priorityOrder) {\n const groupSpecs = priorityGroups[priority];\n if (groupSpecs.length === 0) continue;\n\n // Add spacing between groups\n if (!firstGroup) {\n console.log('');\n }\n firstGroup = false;\n\n // Priority group header - minimal, modern style\n const priorityLabel = priority === 'none' ? 'No Priority' : priority.charAt(0).toUpperCase() + priority.slice(1);\n const priorityEmoji = priority === 'none' ? '⚪' : PRIORITY_CONFIG[priority as SpecPriority].emoji;\n const priorityColor = priority === 'none' ? chalk.dim : PRIORITY_CONFIG[priority as SpecPriority].colorFn;\n \n console.log(` ${priorityColor(`${priorityEmoji} ${chalk.bold(priorityLabel)} ${chalk.dim(`(${groupSpecs.length})`)}`)}`);;\n\n for (const spec of groupSpecs) {\n // Build spec line with metadata\n let assigneeStr = '';\n if (spec.frontmatter.assignee) {\n assigneeStr = ' ' + chalk.cyan(`@${sanitizeUserInput(spec.frontmatter.assignee)}`);\n }\n \n let tagsStr = '';\n if (spec.frontmatter.tags?.length) {\n // Defensive check: ensure tags is an array\n const tags = Array.isArray(spec.frontmatter.tags) ? spec.frontmatter.tags : [];\n if (tags.length > 0) {\n const tagStr = tags.map(tag => `#${sanitizeUserInput(tag)}`).join(' ');\n tagsStr = ' ' + chalk.dim(chalk.magenta(tagStr));\n }\n }\n\n console.log(` ${chalk.cyan(sanitizeUserInput(spec.path))}${assigneeStr}${tagsStr}`);\n }\n }\n\n console.log('');\n } else if (!expanded && specs.length > 0) {\n console.log(` ${chalk.dim('(collapsed, use --complete to expand)')}`);\n console.log('');\n } else {\n console.log(` ${chalk.dim('(empty)')}`);\n console.log('');\n }\n}\n\n// Helper function to strip ANSI codes for accurate length calculation\nfunction stripAnsi(str: string): string {\n return str.replace(/\\u001b\\[\\d+m/g, '');\n}\n","import type { SpecInfo } from '../spec-loader.js';\nimport type { SpecStatus, SpecPriority } from '../frontmatter.js';\n\n/**\n * Count specs by status and priority\n * Shared utility to avoid duplication between analytics and dashboard\n */\nexport function countSpecsByStatusAndPriority(specs: SpecInfo[]): {\n statusCounts: Record<SpecStatus, number>;\n priorityCounts: Record<SpecPriority, number>;\n tagCounts: Record<string, number>;\n} {\n const statusCounts: Record<SpecStatus, number> = {\n planned: 0,\n 'in-progress': 0,\n complete: 0,\n archived: 0,\n };\n\n const priorityCounts: Record<SpecPriority, number> = {\n low: 0,\n medium: 0,\n high: 0,\n critical: 0,\n };\n\n const tagCounts: Record<string, number> = {};\n\n for (const spec of specs) {\n // Specs in archived/ folder should be counted as archived, regardless of frontmatter status\n const isInArchivedFolder = spec.path.startsWith('archived/');\n const status = isInArchivedFolder ? 'archived' : spec.frontmatter.status;\n \n if (status && status in statusCounts) {\n statusCounts[status]++;\n }\n\n const priority = spec.frontmatter.priority;\n if (priority && priority in priorityCounts) {\n priorityCounts[priority]++;\n }\n\n if (spec.frontmatter.tags) {\n for (const tag of spec.frontmatter.tags) {\n tagCounts[tag] = (tagCounts[tag] || 0) + 1;\n }\n }\n }\n\n return { statusCounts, priorityCounts, tagCounts };\n}\n","import dayjs from 'dayjs';\nimport type { SpecInfo } from '../spec-loader.js';\n\nexport interface Insight {\n severity: 'critical' | 'warning' | 'info';\n message: string;\n specs: string[];\n}\n\n/**\n * Generate smart insights for specs that need attention\n * Returns top 5 most important insights\n */\nexport function generateInsights(specs: SpecInfo[]): Insight[] {\n const insights: Insight[] = [];\n \n // 1. Critical overdue specs\n const criticalOverdue = specs.filter(s => \n s.frontmatter.priority === 'critical' &&\n s.frontmatter.due && \n dayjs(s.frontmatter.due).isBefore(dayjs(), 'day') &&\n s.frontmatter.status !== 'complete' &&\n s.frontmatter.status !== 'archived'\n );\n \n if (criticalOverdue.length > 0) {\n insights.push({\n severity: 'critical',\n message: `${criticalOverdue.length} critical spec${criticalOverdue.length > 1 ? 's' : ''} overdue`,\n specs: criticalOverdue.map(s => s.path),\n });\n }\n \n // 2. High priority overdue specs\n const highOverdue = specs.filter(s => \n s.frontmatter.priority === 'high' &&\n s.frontmatter.due && \n dayjs(s.frontmatter.due).isBefore(dayjs(), 'day') &&\n s.frontmatter.status !== 'complete' &&\n s.frontmatter.status !== 'archived'\n );\n \n if (highOverdue.length > 0) {\n insights.push({\n severity: 'warning',\n message: `${highOverdue.length} high priority spec${highOverdue.length > 1 ? 's' : ''} overdue`,\n specs: highOverdue.map(s => s.path),\n });\n }\n \n // 3. Long-running WIP (in-progress > 7 days)\n const longRunning = specs.filter(s => {\n if (s.frontmatter.status !== 'in-progress') {\n return false;\n }\n \n const updatedAt = s.frontmatter.updated || s.frontmatter.updated_at || s.frontmatter.created || s.frontmatter.created_at;\n \n if (!updatedAt) {\n return false;\n }\n \n const daysSinceUpdate = dayjs().diff(dayjs(updatedAt), 'day');\n return daysSinceUpdate > 7;\n });\n \n if (longRunning.length > 0) {\n insights.push({\n severity: 'warning',\n message: `${longRunning.length} spec${longRunning.length > 1 ? 's' : ''} in-progress > 7 days`,\n specs: longRunning.map(s => s.path),\n });\n }\n \n // 4. Critical specs not started\n const criticalNotStarted = specs.filter(s =>\n s.frontmatter.priority === 'critical' &&\n s.frontmatter.status === 'planned'\n );\n \n if (criticalNotStarted.length > 0) {\n insights.push({\n severity: 'warning',\n message: `${criticalNotStarted.length} critical spec${criticalNotStarted.length > 1 ? 's' : ''} not started`,\n specs: criticalNotStarted.map(s => s.path),\n });\n }\n \n // 5. High priority specs not started (if we have room)\n const highNotStarted = specs.filter(s =>\n s.frontmatter.priority === 'high' &&\n s.frontmatter.status === 'planned'\n );\n \n if (highNotStarted.length > 0 && insights.length < 5) {\n insights.push({\n severity: 'info',\n message: `${highNotStarted.length} high priority spec${highNotStarted.length > 1 ? 's' : ''} not started`,\n specs: highNotStarted.map(s => s.path),\n });\n }\n \n // Return top 5 insights\n return insights.slice(0, 5);\n}\n\n/**\n * Get detailed insight for a specific spec (with days overdue, etc.)\n */\nexport function getSpecInsightDetails(spec: SpecInfo): string | null {\n // Check if overdue\n if (spec.frontmatter.due && \n dayjs(spec.frontmatter.due).isBefore(dayjs(), 'day') &&\n spec.frontmatter.status !== 'complete' &&\n spec.frontmatter.status !== 'archived') {\n const daysOverdue = dayjs().diff(dayjs(spec.frontmatter.due), 'day');\n return `overdue by ${daysOverdue} day${daysOverdue > 1 ? 's' : ''}`;\n }\n \n // Check if long-running\n if (spec.frontmatter.status === 'in-progress') {\n const updatedAt = spec.frontmatter.updated || spec.frontmatter.updated_at || spec.frontmatter.created || spec.frontmatter.created_at;\n \n if (updatedAt) {\n const daysSinceUpdate = dayjs().diff(dayjs(updatedAt), 'day');\n if (daysSinceUpdate > 7) {\n return `in-progress for ${daysSinceUpdate} days`;\n }\n }\n }\n \n return null;\n}\n","import chalk from 'chalk';\nimport dayjs from 'dayjs';\nimport { Command } from 'commander';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecStatus, SpecPriority, SpecFilterOptions } from '../frontmatter.js';\nimport { withSpinner } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { calculateVelocityMetrics } from '../utils/velocity.js';\nimport { countSpecsByStatusAndPriority } from '../utils/spec-stats.js';\nimport { calculateCompletion, getCompletionStatus } from '../utils/completion.js';\nimport { generateInsights, getSpecInsightDetails } from '../utils/insights.js';\n\n/**\n * Stats command - show aggregate statistics\n */\nexport function statsCommand(): Command {\n return new Command('stats')\n .description('Show aggregate statistics (default: simplified view)')\n .option('--tag <tag>', 'Filter by tag')\n .option('--assignee <name>', 'Filter by assignee')\n .option('--full', 'Show full detailed analytics (all sections)')\n .option('--timeline', 'Show only timeline section')\n .option('--velocity', 'Show only velocity section')\n .option('--json', 'Output as JSON')\n .action(async (options: {\n tag?: string;\n assignee?: string;\n full?: boolean;\n timeline?: boolean;\n velocity?: boolean;\n json?: boolean;\n }) => {\n await showStats(options);\n });\n}\n\nexport async function showStats(options: {\n tag?: string;\n assignee?: string;\n full?: boolean;\n timeline?: boolean;\n velocity?: boolean;\n json?: boolean;\n}): Promise<void> {\n // Auto-check for conflicts before stats\n await autoCheckIfEnabled();\n \n // Build filter\n const filter: SpecFilterOptions = {};\n if (options.tag) {\n filter.tags = [options.tag];\n }\n if (options.assignee) {\n filter.assignee = options.assignee;\n }\n\n // Load all specs with spinner (including archived for total count)\n const specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({\n includeArchived: true,\n filter,\n })\n );\n\n if (specs.length === 0) {\n console.log('No specs found.');\n return;\n }\n\n // Determine what sections to show\n // --full shows everything (like old analytics)\n // --timeline or --velocity shows specific section\n // Default (no flags): show simplified view with insights\n const showFull = options.full || false;\n const showStats = options.full || (!options.timeline && !options.velocity);\n const showTimeline = options.timeline || options.full;\n const showVelocity = options.velocity || options.full;\n const showSimplified = !options.full && !options.timeline && !options.velocity;\n\n // Calculate all metrics upfront\n const { statusCounts, priorityCounts, tagCounts } = countSpecsByStatusAndPriority(specs);\n const velocityMetrics = calculateVelocityMetrics(specs);\n const completionMetrics = calculateCompletion(specs);\n const insights = generateInsights(specs);\n\n // JSON output\n if (options.json) {\n const data = {\n total: specs.length,\n status: statusCounts,\n priority: priorityCounts,\n tags: tagCounts,\n completion: completionMetrics,\n velocity: velocityMetrics,\n insights: insights,\n filter,\n };\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n // Display statistics\n console.log(chalk.bold.cyan('📊 Spec Stats'));\n console.log('');\n\n // Filter info\n if (options.tag || options.assignee) {\n const filterParts: string[] = [];\n if (options.tag) filterParts.push(`tag=${options.tag}`);\n if (options.assignee) filterParts.push(`assignee=${options.assignee}`);\n console.log(chalk.dim(`Filtered by: ${filterParts.join(', ')}`));\n console.log('');\n }\n\n // ============================================================\n // SIMPLIFIED VIEW (Default)\n // ============================================================\n if (showSimplified) {\n // Overview with completion rate\n console.log(chalk.bold('📈 Overview'));\n console.log('');\n \n const completionStatus = getCompletionStatus(completionMetrics.score);\n const completionColor = completionStatus.color === 'green' ? chalk.green : \n completionStatus.color === 'yellow' ? chalk.yellow : \n chalk.red;\n \n console.log(` Total Specs ${chalk.cyan(completionMetrics.totalSpecs)}`);\n console.log(` Active (Planned+WIP) ${chalk.yellow(completionMetrics.activeSpecs)}`);\n console.log(` Complete ${chalk.green(completionMetrics.completeSpecs)}`);\n console.log(` Completion Rate ${completionColor(`${completionMetrics.score}% ${completionStatus.emoji}`)}`);\n console.log('');\n\n // Status (simplified)\n console.log(chalk.bold('📊 Status'));\n console.log('');\n \n const labelWidth = 15;\n const barWidth = 20;\n const maxStatusCount = Math.max(...Object.values(statusCounts));\n const createBar = (count: number, maxCount: number, char: string = '█') => {\n const width = Math.round((count / maxCount) * barWidth);\n const filledWidth = Math.min(width, barWidth);\n const emptyWidth = barWidth - filledWidth;\n return char.repeat(filledWidth) + chalk.dim('░').repeat(emptyWidth);\n };\n \n console.log(` 📅 ${'Planned'.padEnd(labelWidth)} ${chalk.cyan(createBar(statusCounts.planned, maxStatusCount))} ${chalk.cyan(statusCounts.planned)}`);\n console.log(` ⏳ ${'In Progress'.padEnd(labelWidth)} ${chalk.yellow(createBar(statusCounts['in-progress'], maxStatusCount))} ${chalk.yellow(statusCounts['in-progress'])}`);\n console.log(` ✅ ${'Complete'.padEnd(labelWidth)} ${chalk.green(createBar(statusCounts.complete, maxStatusCount))} ${chalk.green(statusCounts.complete)}`);\n if (statusCounts.archived > 0) {\n console.log(` 📦 ${'Archived'.padEnd(labelWidth)} ${chalk.dim(createBar(statusCounts.archived, maxStatusCount))} ${chalk.dim(statusCounts.archived)}`);\n }\n console.log('');\n\n // Priority Focus (only critical/high with issues)\n const criticalCount = priorityCounts.critical || 0;\n const highCount = priorityCounts.high || 0;\n \n if (criticalCount > 0 || highCount > 0) {\n console.log(chalk.bold('🎯 Priority Focus'));\n console.log('');\n \n if (criticalCount > 0) {\n const criticalPlanned = specs.filter(s => s.frontmatter.priority === 'critical' && s.frontmatter.status === 'planned').length;\n const criticalInProgress = specs.filter(s => s.frontmatter.priority === 'critical' && s.frontmatter.status === 'in-progress').length;\n const criticalComplete = specs.filter(s => s.frontmatter.priority === 'critical' && s.frontmatter.status === 'complete').length;\n const criticalOverdue = specs.filter(s => \n s.frontmatter.priority === 'critical' && \n s.frontmatter.due && \n dayjs(s.frontmatter.due).isBefore(dayjs(), 'day') &&\n s.frontmatter.status !== 'complete'\n ).length;\n \n const parts = [];\n if (criticalPlanned > 0) parts.push(chalk.dim(`${criticalPlanned} planned`));\n if (criticalInProgress > 0) parts.push(`${criticalInProgress} in-progress`);\n if (criticalComplete > 0) parts.push(chalk.green(`${criticalComplete} complete`));\n if (criticalOverdue > 0) parts.push(chalk.red(`${criticalOverdue} overdue!`));\n \n console.log(` 🔴 Critical ${chalk.red(criticalCount)} specs${parts.length > 0 ? ` (${parts.join(', ')})` : ''}`);\n }\n \n if (highCount > 0) {\n const highPlanned = specs.filter(s => s.frontmatter.priority === 'high' && s.frontmatter.status === 'planned').length;\n const highInProgress = specs.filter(s => s.frontmatter.priority === 'high' && s.frontmatter.status === 'in-progress').length;\n const highComplete = specs.filter(s => s.frontmatter.priority === 'high' && s.frontmatter.status === 'complete').length;\n const highOverdue = specs.filter(s => \n s.frontmatter.priority === 'high' && \n s.frontmatter.due && \n dayjs(s.frontmatter.due).isBefore(dayjs(), 'day') &&\n s.frontmatter.status !== 'complete'\n ).length;\n \n const parts = [];\n if (highPlanned > 0) parts.push(chalk.dim(`${highPlanned} planned`));\n if (highInProgress > 0) parts.push(`${highInProgress} in-progress`);\n if (highComplete > 0) parts.push(chalk.green(`${highComplete} complete`));\n if (highOverdue > 0) parts.push(chalk.yellow(`${highOverdue} overdue`));\n \n console.log(` 🟠 High ${chalk.hex('#FFA500')(highCount)} specs${parts.length > 0 ? ` (${parts.join(', ')})` : ''}`);\n }\n \n console.log('');\n }\n\n // Needs Attention (insights)\n if (insights.length > 0) {\n console.log(chalk.bold.yellow('⚠️ Needs Attention'));\n console.log('');\n \n for (const insight of insights) {\n const color = insight.severity === 'critical' ? chalk.red :\n insight.severity === 'warning' ? chalk.yellow :\n chalk.cyan;\n \n console.log(` ${color('•')} ${insight.message}`);\n \n // Show up to 3 spec examples\n for (const specPath of insight.specs.slice(0, 3)) {\n const spec = specs.find(s => s.path === specPath);\n const details = spec ? getSpecInsightDetails(spec) : null;\n console.log(` ${chalk.dim(specPath)}${details ? chalk.dim(` (${details})`) : ''}`);\n }\n \n if (insight.specs.length > 3) {\n console.log(` ${chalk.dim(`...and ${insight.specs.length - 3} more`)}`);\n }\n }\n \n console.log('');\n } else if (completionMetrics.activeSpecs === 0 && completionMetrics.completeSpecs > 0) {\n // Celebrate completion!\n console.log(chalk.bold.green('🎉 All Specs Complete!'));\n console.log('');\n console.log(` ${chalk.dim('Great work! All active specs are complete.')}`);\n console.log('');\n } else if (completionMetrics.activeSpecs > 0) {\n // Positive message\n console.log(chalk.bold.green('✨ All Clear!'));\n console.log('');\n console.log(` ${chalk.dim('No critical issues detected. Keep up the good work!')}`);\n console.log('');\n }\n\n // Velocity Summary\n console.log(chalk.bold('🚀 Velocity Summary'));\n console.log('');\n \n const cycleTimeStatus = velocityMetrics.cycleTime.average <= 7 ? chalk.green('✓') : chalk.yellow('⚠');\n const throughputTrend = velocityMetrics.throughput.trend === 'up' ? chalk.green('↑') : \n velocityMetrics.throughput.trend === 'down' ? chalk.red('↓') : \n chalk.yellow('→');\n \n console.log(` Avg Cycle Time ${chalk.cyan(velocityMetrics.cycleTime.average.toFixed(1))} days ${cycleTimeStatus}${velocityMetrics.cycleTime.average <= 7 ? chalk.dim(' (target: 7d)') : ''}`);\n console.log(` Throughput ${chalk.cyan((velocityMetrics.throughput.perWeek / 7 * 7).toFixed(1))}/week ${throughputTrend}`);\n console.log(` WIP ${chalk.yellow(velocityMetrics.wip.current)} specs`);\n console.log('');\n\n // Prompt for full view\n console.log(chalk.dim('💡 Use `lean-spec stats --full` for detailed analytics'));\n console.log(chalk.dim(' Use `lean-spec stats --velocity` for velocity breakdown'));\n console.log(chalk.dim(' Use `lean-spec stats --timeline` for activity timeline'));\n console.log('');\n \n return;\n }\n\n // ============================================================\n // FULL VIEW (--full or specific flags)\n // ============================================================\n // Common layout constants\n const labelWidth = 20;\n const barWidth = 20;\n const valueWidth = 5;\n\n // Helper to create bars\n const createBar = (count: number, maxCount: number, char: string = '━') => {\n const width = Math.round((count / maxCount) * barWidth);\n return char.repeat(width);\n };\n\n // ============================================================\n // STATS SECTION\n // ============================================================\n if (showStats) {\n // Overview\n const totalWithPriority = Object.values(priorityCounts).reduce(\n (sum, count) => sum + count,\n 0\n );\n console.log(chalk.bold('📈 Overview'));\n console.log('');\n\n console.log(\n ` ${'Metric'.padEnd(labelWidth)} ${'Value'.padStart(valueWidth)}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`\n );\n console.log(\n ` ${'Total Specs'.padEnd(labelWidth)} ${chalk.green(specs.length.toString().padStart(valueWidth))}`\n );\n console.log(\n ` ${'With Priority'.padEnd(labelWidth)} ${chalk.cyan(totalWithPriority.toString().padStart(valueWidth))}`\n );\n console.log(\n ` ${'Unique Tags'.padEnd(labelWidth)} ${chalk.magenta(Object.keys(tagCounts).length.toString().padStart(valueWidth))}`\n );\n console.log('');\n\n // Status Distribution\n console.log(chalk.bold('📊 Status Distribution'));\n console.log('');\n\n const maxStatusCount = Math.max(...Object.values(statusCounts));\n const colWidth = barWidth + 3;\n\n console.log(\n ` ${'Status'.padEnd(labelWidth)} ${chalk.cyan('Count'.padEnd(colWidth))}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(colWidth))}`\n );\n console.log(\n ` 📋 ${'Planned'.padEnd(labelWidth - 3)} ${chalk.cyan(createBar(statusCounts.planned, maxStatusCount).padEnd(barWidth))}${chalk.cyan(statusCounts.planned.toString().padStart(3))}`\n );\n console.log(\n ` ⏳ ${'In Progress'.padEnd(labelWidth - 3)} ${chalk.yellow(createBar(statusCounts['in-progress'], maxStatusCount).padEnd(barWidth))}${chalk.yellow(statusCounts['in-progress'].toString().padStart(3))}`\n );\n console.log(\n ` ✅ ${'Complete'.padEnd(labelWidth - 3)} ${chalk.green(createBar(statusCounts.complete, maxStatusCount).padEnd(barWidth))}${chalk.green(statusCounts.complete.toString().padStart(3))}`\n );\n console.log(\n ` 📦 ${'Archived'.padEnd(labelWidth - 3)} ${chalk.dim(createBar(statusCounts.archived, maxStatusCount).padEnd(barWidth))}${chalk.dim(statusCounts.archived.toString().padStart(3))}`\n );\n console.log('');\n\n // Priority Breakdown\n if (totalWithPriority > 0) {\n console.log(chalk.bold('🎯 Priority Breakdown'));\n console.log('');\n\n const maxPriorityCount = Math.max(\n ...Object.values(priorityCounts).filter((c) => c > 0)\n );\n\n console.log(\n ` ${'Priority'.padEnd(labelWidth)} ${chalk.cyan('Count'.padEnd(colWidth))}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(colWidth))}`\n );\n\n if (priorityCounts.critical > 0) {\n console.log(\n ` 🔴 ${'Critical'.padEnd(labelWidth - 3)} ${chalk.red(createBar(priorityCounts.critical, maxPriorityCount).padEnd(barWidth))}${chalk.red(priorityCounts.critical.toString().padStart(3))}`\n );\n }\n if (priorityCounts.high > 0) {\n console.log(\n ` 🟠 ${'High'.padEnd(labelWidth - 3)} ${chalk.hex('#FFA500')(createBar(priorityCounts.high, maxPriorityCount).padEnd(barWidth))}${chalk.hex('#FFA500')(priorityCounts.high.toString().padStart(3))}`\n );\n }\n if (priorityCounts.medium > 0) {\n console.log(\n ` 🟡 ${'Medium'.padEnd(labelWidth - 3)} ${chalk.yellow(createBar(priorityCounts.medium, maxPriorityCount).padEnd(barWidth))}${chalk.yellow(priorityCounts.medium.toString().padStart(3))}`\n );\n }\n if (priorityCounts.low > 0) {\n console.log(\n ` 🟢 ${'Low'.padEnd(labelWidth - 3)} ${chalk.green(createBar(priorityCounts.low, maxPriorityCount).padEnd(barWidth))}${chalk.green(priorityCounts.low.toString().padStart(3))}`\n );\n }\n console.log('');\n }\n\n // Top Tags\n const topTags = Object.entries(tagCounts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n\n if (topTags.length > 0) {\n console.log(chalk.bold('🏷️ Popular Tags'));\n console.log('');\n\n const maxTagCount = Math.max(...topTags.map(([, count]) => count));\n\n console.log(\n ` ${'Tag'.padEnd(labelWidth)} ${chalk.magenta('Count'.padEnd(colWidth))}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(colWidth))}`\n );\n\n for (const [tag, count] of topTags) {\n const truncatedTag =\n tag.length > labelWidth ? tag.substring(0, labelWidth - 1) + '…' : tag;\n const bar = createBar(count, maxTagCount);\n console.log(\n ` ${truncatedTag.padEnd(labelWidth)} ${chalk.magenta(bar.padEnd(barWidth))}${chalk.magenta(count.toString().padStart(3))}`\n );\n }\n console.log('');\n }\n }\n\n // ============================================================\n // TIMELINE SECTION\n // ============================================================\n if (showTimeline) {\n const days = 30;\n const today = dayjs();\n const startDate = today.subtract(days, 'day');\n\n // Count specs by date\n const createdByDate: Record<string, number> = {};\n const completedByDate: Record<string, number> = {};\n\n for (const spec of specs) {\n const created = dayjs(spec.frontmatter.created);\n\n // Count created specs within date range\n if (created.isAfter(startDate)) {\n const dateKey = created.format('YYYY-MM-DD');\n createdByDate[dateKey] = (createdByDate[dateKey] || 0) + 1;\n }\n\n // Count completed specs\n if (spec.frontmatter.completed) {\n const completed = dayjs(spec.frontmatter.completed);\n if (completed.isAfter(startDate)) {\n const dateKey = completed.format('YYYY-MM-DD');\n completedByDate[dateKey] = (completedByDate[dateKey] || 0) + 1;\n }\n }\n }\n\n // Display timeline\n const allDates = new Set([\n ...Object.keys(createdByDate),\n ...Object.keys(completedByDate),\n ]);\n const sortedDates = Array.from(allDates).sort();\n\n if (sortedDates.length > 0) {\n console.log(chalk.bold(`📅 Activity (Last ${days} Days)`));\n console.log('');\n\n const colWidth = barWidth + 3;\n\n console.log(\n ` ${'Date'.padEnd(15)} ${chalk.cyan('Created'.padEnd(colWidth))} ${chalk.green('Completed'.padEnd(colWidth))}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(15))} ${chalk.dim('─'.repeat(colWidth))} ${chalk.dim('─'.repeat(colWidth))}`\n );\n\n const maxCount = Math.max(\n ...Object.values(createdByDate),\n ...Object.values(completedByDate)\n );\n\n // Show only last 10 days with activity\n for (const date of sortedDates.slice(-10)) {\n const created = createdByDate[date] || 0;\n const completed = completedByDate[date] || 0;\n\n const createdBar = createBar(created, maxCount, '━');\n const completedBar = createBar(completed, maxCount, '━');\n\n const createdCol = `${createdBar.padEnd(barWidth)}${created.toString().padStart(3)}`;\n const completedCol = `${completedBar.padEnd(barWidth)}${completed.toString().padStart(3)}`;\n\n console.log(\n ` ${chalk.dim(date.padEnd(15))} ${chalk.cyan(createdCol)} ${chalk.green(completedCol)}`\n );\n }\n console.log('');\n }\n }\n\n // ============================================================\n // VELOCITY SECTION\n // ============================================================\n if (showVelocity) {\n console.log(chalk.bold('🚀 Velocity Metrics'));\n console.log('');\n\n // Cycle Time\n console.log(chalk.bold('⏱️ Cycle Time (Created → Completed)'));\n console.log('');\n console.log(\n ` ${'Metric'.padEnd(labelWidth)} ${'Days'.padStart(valueWidth)}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`\n );\n console.log(\n ` ${'Average'.padEnd(labelWidth)} ${chalk.cyan(velocityMetrics.cycleTime.average.toFixed(1).padStart(valueWidth))}`\n );\n console.log(\n ` ${'Median'.padEnd(labelWidth)} ${chalk.cyan(velocityMetrics.cycleTime.median.toFixed(1).padStart(valueWidth))}`\n );\n console.log(\n ` ${'90th Percentile'.padEnd(labelWidth)} ${chalk.yellow(velocityMetrics.cycleTime.p90.toFixed(1).padStart(valueWidth))}`\n );\n console.log('');\n\n // Throughput\n console.log(chalk.bold('📦 Throughput'));\n console.log('');\n console.log(\n ` ${'Period'.padEnd(labelWidth)} ${'Specs'.padStart(valueWidth)}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`\n );\n console.log(\n ` ${'Last 7 days'.padEnd(labelWidth)} ${chalk.green(velocityMetrics.throughput.perWeek.toString().padStart(valueWidth))}`\n );\n console.log(\n ` ${'Last 30 days'.padEnd(labelWidth)} ${chalk.green(velocityMetrics.throughput.perMonth.toString().padStart(valueWidth))}`\n );\n\n const trendColor =\n velocityMetrics.throughput.trend === 'up'\n ? chalk.green\n : velocityMetrics.throughput.trend === 'down'\n ? chalk.red\n : chalk.yellow;\n const trendSymbol =\n velocityMetrics.throughput.trend === 'up'\n ? '↑'\n : velocityMetrics.throughput.trend === 'down'\n ? '↓'\n : '→';\n console.log(\n ` ${'Trend'.padEnd(labelWidth)} ${trendColor(trendSymbol + ' ' + velocityMetrics.throughput.trend.padStart(valueWidth - 2))}`\n );\n console.log('');\n\n // WIP\n console.log(chalk.bold('🔄 Work In Progress'));\n console.log('');\n console.log(\n ` ${'Metric'.padEnd(labelWidth)} ${'Specs'.padStart(valueWidth)}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`\n );\n console.log(\n ` ${'Current'.padEnd(labelWidth)} ${chalk.yellow(velocityMetrics.wip.current.toString().padStart(valueWidth))}`\n );\n console.log(\n ` ${'30-day Average'.padEnd(labelWidth)} ${chalk.cyan(velocityMetrics.wip.average.toFixed(1).padStart(valueWidth))}`\n );\n console.log('');\n\n // Lead Time (if available)\n if (\n velocityMetrics.leadTime.plannedToInProgress > 0 ||\n velocityMetrics.leadTime.inProgressToComplete > 0\n ) {\n console.log(chalk.bold('🔀 Lead Time by Stage'));\n console.log('');\n console.log(\n ` ${'Stage'.padEnd(labelWidth)} ${'Days'.padStart(valueWidth)}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`\n );\n if (velocityMetrics.leadTime.plannedToInProgress > 0) {\n console.log(\n ` ${'Planned → In Progress'.padEnd(labelWidth)} ${chalk.cyan(velocityMetrics.leadTime.plannedToInProgress.toFixed(1).padStart(valueWidth))}`\n );\n }\n if (velocityMetrics.leadTime.inProgressToComplete > 0) {\n console.log(\n ` ${'In Progress → Complete'.padEnd(labelWidth)} ${chalk.green(velocityMetrics.leadTime.inProgressToComplete.toFixed(1).padStart(valueWidth))}`\n );\n }\n console.log('');\n }\n }\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecStatus, SpecPriority, SpecFilterOptions } from '../frontmatter.js';\nimport { withSpinner } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { advancedSearchSpecs, getSearchSyntaxHelp, type SearchableSpec } from '@leanspec/core';\nimport { parseCustomFieldOptions } from '../utils/cli-helpers.js';\n\n/**\n * Search command - full-text search with metadata filters and advanced query syntax\n */\nexport function searchCommand(): Command {\n return new Command('search')\n .description('Full-text search with advanced query syntax')\n .argument('[query]', 'Search query (supports AND, OR, NOT, field:value, fuzzy~)')\n .option('--status <status>', 'Filter by status')\n .option('--tag <tag>', 'Filter by tag')\n .option('--priority <priority>', 'Filter by priority')\n .option('--assignee <name>', 'Filter by assignee')\n .option('--field <name=value...>', 'Filter by custom field (can specify multiple)')\n .option('--json', 'Output as JSON')\n .option('--help-syntax', 'Show advanced query syntax help')\n .action(async (query: string | undefined, options: {\n status?: SpecStatus;\n tag?: string;\n priority?: SpecPriority;\n assignee?: string;\n field?: string[];\n json?: boolean;\n helpSyntax?: boolean;\n }) => {\n // Show syntax help\n if (options.helpSyntax) {\n console.log('');\n console.log(chalk.cyan('Advanced Search Syntax'));\n console.log(chalk.gray('─'.repeat(60)));\n console.log('');\n console.log(getSearchSyntaxHelp());\n console.log('');\n return;\n }\n\n if (!query) {\n console.log(chalk.yellow('Usage: lean-spec search <query>'));\n console.log(chalk.gray('Use --help-syntax for advanced query syntax'));\n return;\n }\n\n const customFields = parseCustomFieldOptions(options.field);\n await performSearch(query, {\n status: options.status,\n tag: options.tag,\n priority: options.priority,\n assignee: options.assignee,\n customFields: Object.keys(customFields).length > 0 ? customFields : undefined,\n json: options.json,\n });\n });\n}\n\nexport async function performSearch(query: string, options: {\n status?: SpecStatus;\n tag?: string;\n priority?: SpecPriority;\n assignee?: string;\n customFields?: Record<string, unknown>;\n json?: boolean;\n}): Promise<void> {\n // Auto-check for conflicts before search\n await autoCheckIfEnabled();\n \n // Build filter\n const filter: SpecFilterOptions = {};\n if (options.status) filter.status = options.status;\n if (options.tag) filter.tags = [options.tag];\n if (options.priority) filter.priority = options.priority;\n if (options.assignee) filter.assignee = options.assignee;\n if (options.customFields) filter.customFields = options.customFields;\n\n // Load all specs with content and spinner\n const specs = await withSpinner(\n 'Searching specs...',\n () => loadAllSpecs({\n includeArchived: true,\n includeContent: true,\n filter,\n })\n );\n\n if (specs.length === 0) {\n console.log('No specs found matching filters.');\n return;\n }\n\n // Convert to searchable format\n const searchableSpecs: SearchableSpec[] = specs.map(spec => ({\n path: spec.path,\n name: spec.path,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n tags: spec.frontmatter.tags,\n title: typeof spec.frontmatter.title === 'string' ? spec.frontmatter.title : undefined,\n description: typeof spec.frontmatter.description === 'string' ? spec.frontmatter.description : undefined,\n content: spec.content,\n created: spec.frontmatter.created,\n updated: spec.frontmatter.updated_at,\n assignee: spec.frontmatter.assignee,\n }));\n\n // Use advanced search engine (supports boolean operators, field filters, fuzzy matching)\n const searchResult = advancedSearchSpecs(query, searchableSpecs, {\n maxMatchesPerSpec: 5,\n contextLength: 80,\n });\n\n const { results, metadata } = searchResult;\n\n // JSON output\n if (options.json) {\n const jsonOutput = {\n query,\n results: results.map(r => ({\n spec: r.spec.path,\n score: r.score,\n totalMatches: r.totalMatches,\n matches: r.matches.map(m => ({\n field: m.field,\n text: m.text,\n lineNumber: m.lineNumber,\n })),\n })),\n metadata,\n filters: filter,\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Display results\n if (results.length === 0) {\n console.log('');\n console.log(chalk.yellow(`🔍 No specs found matching \"${sanitizeUserInput(query)}\"`));\n \n // Show active filters\n if (Object.keys(filter).length > 0) {\n const filters: string[] = [];\n if (options.status) filters.push(`status=${sanitizeUserInput(options.status)}`);\n if (options.tag) filters.push(`tag=${sanitizeUserInput(options.tag)}`);\n if (options.priority) filters.push(`priority=${sanitizeUserInput(options.priority)}`);\n if (options.assignee) filters.push(`assignee=${sanitizeUserInput(options.assignee)}`);\n console.log(chalk.gray(`With filters: ${filters.join(', ')}`));\n }\n console.log('');\n return;\n }\n\n // Show summary header with metadata\n console.log('');\n console.log(chalk.green(`🔍 Found ${results.length} spec${results.length === 1 ? '' : 's'} matching \"${sanitizeUserInput(query)}\"`));\n console.log(chalk.gray(` Searched ${metadata.specsSearched} specs in ${metadata.searchTime}ms`));\n \n // Show active filters\n if (Object.keys(filter).length > 0) {\n const filters: string[] = [];\n if (options.status) filters.push(`status=${sanitizeUserInput(options.status)}`);\n if (options.tag) filters.push(`tag=${sanitizeUserInput(options.tag)}`);\n if (options.priority) filters.push(`priority=${sanitizeUserInput(options.priority)}`);\n if (options.assignee) filters.push(`assignee=${sanitizeUserInput(options.assignee)}`);\n console.log(chalk.gray(` With filters: ${filters.join(', ')}`));\n }\n console.log('');\n\n // Display each result with matches\n for (const result of results) {\n const { spec, matches, score, totalMatches } = result;\n \n // Spec header with relevance score\n const statusEmoji = spec.status === 'in-progress' ? '🔨' : \n spec.status === 'complete' ? '✅' : '📅';\n console.log(chalk.cyan(`${statusEmoji} ${sanitizeUserInput(spec.path)} ${chalk.gray(`(${score}% match)`)}`));\n \n // Metadata\n const meta: string[] = [];\n if (spec.priority) {\n const priorityEmoji = spec.priority === 'critical' ? '🔴' : \n spec.priority === 'high' ? '🟡' :\n spec.priority === 'medium' ? '🟠' : '🟢';\n meta.push(`${priorityEmoji} ${sanitizeUserInput(spec.priority)}`);\n }\n if (spec.tags && spec.tags.length > 0) {\n meta.push(`[${spec.tags.map(tag => sanitizeUserInput(tag)).join(', ')}]`);\n }\n if (meta.length > 0) {\n console.log(chalk.gray(` ${meta.join(' • ')}`));\n }\n \n // Show title if it matched\n const titleMatch = matches.find(m => m.field === 'title');\n if (titleMatch) {\n console.log(` ${chalk.bold('Title:')} ${highlightMatches(titleMatch.text, titleMatch.highlights)}`);\n }\n \n // Show description if it matched\n const descMatch = matches.find(m => m.field === 'description');\n if (descMatch) {\n console.log(` ${chalk.bold('Description:')} ${highlightMatches(descMatch.text, descMatch.highlights)}`);\n }\n \n // Show tag matches\n const tagMatches = matches.filter(m => m.field === 'tags');\n if (tagMatches.length > 0) {\n console.log(` ${chalk.bold('Tags:')} ${tagMatches.map(m => highlightMatches(m.text, m.highlights)).join(', ')}`);\n }\n \n // Show content matches\n const contentMatches = matches.filter(m => m.field === 'content');\n if (contentMatches.length > 0) {\n console.log(` ${chalk.bold('Content matches:')}`);\n for (const match of contentMatches) {\n const lineInfo = match.lineNumber ? chalk.gray(`[L${match.lineNumber}]`) : '';\n console.log(` ${lineInfo} ${highlightMatches(match.text, match.highlights)}`);\n }\n }\n \n if (totalMatches > matches.length) {\n console.log(chalk.gray(` ... and ${totalMatches - matches.length} more match${totalMatches - matches.length === 1 ? '' : 'es'}`));\n }\n \n console.log('');\n }\n}\n\n/**\n * Highlight matches in text using character ranges\n */\nfunction highlightMatches(text: string, highlights: Array<[number, number]>): string {\n if (highlights.length === 0) return text;\n\n let result = '';\n let lastEnd = 0;\n\n for (const [start, end] of highlights) {\n result += text.substring(lastEnd, start);\n result += chalk.yellow(text.substring(start, end));\n lastEnd = end;\n }\n result += text.substring(lastEnd);\n\n return result;\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getSpec, loadAllSpecs, type SpecInfo } from '../spec-loader.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { loadConfig } from '../config.js';\nimport * as path from 'node:path';\nimport { getStatusIndicator } from '../utils/colors.js';\nimport { SpecDependencyGraph } from '@leanspec/core';\n\nexport interface DepsOptions {\n depth?: number;\n graph?: boolean;\n json?: boolean;\n mode?: 'complete' | 'upstream' | 'downstream' | 'impact';\n}\n\nexport function depsCommand(): Command;\nexport function depsCommand(specPath: string, options?: DepsOptions): Promise<void>;\nexport function depsCommand(specPath?: string, options: DepsOptions = {}): Command | Promise<void> {\n if (typeof specPath === 'string') {\n return showDeps(specPath, options);\n }\n\n return new Command('deps')\n .description('Show dependency graph for a spec. Related specs (⟷) are shown bidirectionally, depends_on (→) are directional.')\n .argument('<spec>', 'Spec to show dependencies for')\n .option('--depth <n>', 'Show N levels deep (default: 3)', parseInt)\n .option('--graph', 'ASCII graph visualization')\n .option('--json', 'Output as JSON')\n .option('--complete', 'Show complete graph (default: all relationships)')\n .option('--upstream', 'Show only upstream dependencies')\n .option('--downstream', 'Show only downstream dependents')\n .option('--impact', 'Show impact radius (all affected specs)')\n .action(async (target: string, opts: DepsOptions) => {\n await showDeps(target, opts);\n });\n}\n\nexport async function showDeps(specPath: string, options: DepsOptions = {}): Promise<void> {\n // Auto-check for conflicts before display\n await autoCheckIfEnabled();\n \n // Resolve spec path (handles numbers like \"14\" or \"014\")\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n \n const spec = await getSpec(resolvedPath);\n \n if (!spec) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Load all specs and build dependency graph\n const allSpecs = await loadAllSpecs({ includeArchived: true });\n const graph = new SpecDependencyGraph(allSpecs);\n \n // Determine mode from options (explicit flags take precedence)\n let mode: 'complete' | 'upstream' | 'downstream' | 'impact' = 'complete';\n if (options.mode) {\n mode = options.mode;\n } else if ((options as any).upstream) {\n mode = 'upstream';\n } else if ((options as any).downstream) {\n mode = 'downstream';\n } else if ((options as any).impact) {\n mode = 'impact';\n }\n \n const specMap = new Map<string, SpecInfo>();\n for (const s of allSpecs) {\n specMap.set(s.path, s);\n }\n\n // Get dependency information based on mode\n let dependsOn: SpecInfo[] = [];\n let requiredBy: SpecInfo[] = [];\n let related: SpecInfo[] = [];\n \n if (mode === 'complete') {\n const completeGraph = graph.getCompleteGraph(spec.path);\n dependsOn = completeGraph.dependsOn;\n requiredBy = completeGraph.requiredBy;\n related = completeGraph.related;\n } else if (mode === 'upstream') {\n dependsOn = graph.getUpstream(spec.path, options.depth || 3);\n } else if (mode === 'downstream') {\n requiredBy = graph.getDownstream(spec.path, options.depth || 3);\n } else if (mode === 'impact') {\n const impact = graph.getImpactRadius(spec.path, options.depth || 3);\n dependsOn = impact.upstream;\n requiredBy = impact.downstream;\n related = impact.related;\n }\n\n // Output as JSON if requested\n if (options.json) {\n const data: any = {\n spec: spec.path,\n mode,\n };\n \n if (mode === 'complete' || mode === 'upstream' || mode === 'impact') {\n data.dependsOn = dependsOn.map(s => ({ path: s.path, status: s.frontmatter.status }));\n }\n \n if (mode === 'complete' || mode === 'downstream' || mode === 'impact') {\n data.requiredBy = requiredBy.map(s => ({ path: s.path, status: s.frontmatter.status }));\n }\n \n if (mode === 'complete' || mode === 'impact') {\n data.related = related.map(s => ({ path: s.path, status: s.frontmatter.status }));\n }\n \n if (mode === 'complete' && (options.graph || dependsOn.length > 0)) {\n data.chain = buildDependencyChain(spec, specMap, options.depth || 3);\n }\n \n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n // Display dependencies\n console.log('');\n console.log(chalk.green(`📦 Dependencies for ${chalk.cyan(sanitizeUserInput(spec.path))}`));\n console.log('');\n\n // Check if there are any relationships at all\n const hasAnyRelationships = dependsOn.length > 0 || requiredBy.length > 0 || related.length > 0;\n \n if (!hasAnyRelationships) {\n console.log(chalk.gray(' No dependencies or relationships'));\n console.log('');\n return;\n }\n\n // Depends On section (Upstream)\n if ((mode === 'complete' || mode === 'upstream' || mode === 'impact') && dependsOn.length > 0) {\n const label = mode === 'complete' ? 'Depends On' : mode === 'upstream' ? 'Upstream Dependencies' : 'Upstream (Impact)';\n console.log(chalk.bold(`${label}:`));\n for (const dep of dependsOn) {\n const status = getStatusIndicator(dep.frontmatter.status);\n console.log(` → ${sanitizeUserInput(dep.path)} ${status}`);\n }\n console.log('');\n }\n\n // Required By section (Downstream)\n if ((mode === 'complete' || mode === 'downstream' || mode === 'impact') && requiredBy.length > 0) {\n const label = mode === 'complete' ? 'Required By' : mode === 'downstream' ? 'Downstream Dependents' : 'Downstream (Impact)';\n console.log(chalk.bold(`${label}:`));\n for (const blocked of requiredBy) {\n const status = getStatusIndicator(blocked.frontmatter.status);\n console.log(` ← ${sanitizeUserInput(blocked.path)} ${status}`);\n }\n console.log('');\n }\n\n // Related Specs section (bidirectional)\n if ((mode === 'complete' || mode === 'impact') && related.length > 0) {\n console.log(chalk.bold('Related Specs:'));\n for (const rel of related) {\n const status = getStatusIndicator(rel.frontmatter.status);\n console.log(` ⟷ ${sanitizeUserInput(rel.path)} ${status}`);\n }\n console.log('');\n }\n\n // Dependency chain (tree view) - only for complete mode or when graph is requested\n if (mode === 'complete' && (options.graph || dependsOn.length > 0)) {\n console.log(chalk.bold('Dependency Chain:'));\n const chain = buildDependencyChain(spec, specMap, options.depth || 3);\n displayChain(chain, 0);\n console.log('');\n }\n \n // Impact summary for impact mode\n if (mode === 'impact') {\n const total = dependsOn.length + requiredBy.length + related.length;\n console.log(chalk.bold(`Impact Summary:`));\n console.log(` Changing this spec affects ${chalk.yellow(total)} specs total`);\n console.log(` Upstream: ${dependsOn.length} | Downstream: ${requiredBy.length} | Related: ${related.length}`);\n console.log('');\n }\n}\n\ninterface DependencyNode {\n spec: SpecInfo;\n dependencies: DependencyNode[];\n}\n\nfunction buildDependencyChain(\n spec: SpecInfo,\n specMap: Map<string, SpecInfo>,\n maxDepth: number,\n currentDepth: number = 0,\n visited: Set<string> = new Set()\n): DependencyNode {\n const node: DependencyNode = {\n spec,\n dependencies: [],\n };\n \n // Prevent infinite loops\n if (visited.has(spec.path)) {\n return node;\n }\n visited.add(spec.path);\n \n // Stop at max depth\n if (currentDepth >= maxDepth) {\n return node;\n }\n \n // Find dependencies from frontmatter\n if (spec.frontmatter.depends_on) {\n for (const depPath of spec.frontmatter.depends_on) {\n const dep = specMap.get(depPath);\n if (dep) {\n node.dependencies.push(buildDependencyChain(dep, specMap, maxDepth, currentDepth + 1, visited));\n }\n }\n }\n \n return node;\n}\n\nfunction displayChain(node: DependencyNode, level: number): void {\n const indent = ' '.repeat(level);\n const status = getStatusIndicator(node.spec.frontmatter.status);\n const name = level === 0 ? chalk.cyan(node.spec.path) : node.spec.path;\n \n console.log(`${indent}${name} ${status}`);\n \n for (const dep of node.dependencies) {\n const prefix = ' '.repeat(level) + '└─ ';\n const depStatus = getStatusIndicator(dep.spec.frontmatter.status);\n console.log(`${prefix}${dep.spec.path} ${depStatus}`);\n \n // Recursively display nested dependencies with increased indent\n for (const nestedDep of dep.dependencies) {\n displayChain(nestedDep, level + 2);\n }\n }\n}\n","import chalk from 'chalk';\nimport dayjs from 'dayjs';\nimport { Command } from 'commander';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecFilterOptions } from '../frontmatter.js';\nimport { autoCheckIfEnabled } from './check.js';\n\n/**\n * Timeline command - show creation/completion over time\n */\nexport function timelineCommand(): Command {\n return new Command('timeline')\n .description('Show creation/completion over time')\n .option('--days <n>', 'Show last N days (default: 30)', parseInt)\n .option('--by-tag', 'Group by tag')\n .option('--by-assignee', 'Group by assignee')\n .option('--json', 'Output as JSON')\n .action(async (options: { days?: number; byTag?: boolean; byAssignee?: boolean; json?: boolean }) => {\n await showTimeline(options);\n });\n}\n\nexport async function showTimeline(options: {\n days?: number;\n byTag?: boolean;\n byAssignee?: boolean;\n json?: boolean;\n}): Promise<void> {\n // Auto-check for conflicts before display\n await autoCheckIfEnabled();\n \n // Helper to create bars\n const createBar = (count: number, maxCount: number, width: number, char: string = '━') => {\n const barLen = Math.round((count / maxCount) * width);\n return char.repeat(barLen);\n };\n \n const days = options.days || 30;\n \n // Load all specs (including archived for completion history)\n const specs = await loadAllSpecs({\n includeArchived: true,\n });\n\n if (specs.length === 0) {\n console.log('No specs found.');\n return;\n }\n\n // Calculate date range\n const today = dayjs();\n const startDate = today.subtract(days, 'day');\n\n // Count specs by date\n const createdByDate: Record<string, number> = {};\n const completedByDate: Record<string, number> = {};\n const createdByMonth: Record<string, number> = {};\n\n for (const spec of specs) {\n const created = dayjs(spec.frontmatter.created);\n \n // Count created specs within date range\n if (created.isAfter(startDate)) {\n const dateKey = created.format('YYYY-MM-DD');\n createdByDate[dateKey] = (createdByDate[dateKey] || 0) + 1;\n }\n\n // Count by month for all time\n const monthKey = created.format('MMM YYYY');\n createdByMonth[monthKey] = (createdByMonth[monthKey] || 0) + 1;\n\n // Count completed specs\n if (spec.frontmatter.completed) {\n const completed = dayjs(spec.frontmatter.completed);\n if (completed.isAfter(startDate)) {\n const dateKey = completed.format('YYYY-MM-DD');\n completedByDate[dateKey] = (completedByDate[dateKey] || 0) + 1;\n }\n }\n }\n\n // JSON output\n if (options.json) {\n const jsonOutput = {\n days,\n createdByDate,\n completedByDate,\n createdByMonth,\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Display timeline\n console.log(chalk.bold.cyan('📈 Spec Timeline'));\n console.log('');\n\n // Show daily activity (only days with activity)\n const allDates = new Set([...Object.keys(createdByDate), ...Object.keys(completedByDate)]);\n const sortedDates = Array.from(allDates).sort();\n\n if (sortedDates.length > 0) {\n console.log(chalk.bold(`📅 Activity (Last ${days} Days)`));\n console.log('');\n \n // Column headers - aligned with stats.ts\n const labelWidth = 15;\n const barWidth = 20;\n const specsWidth = 3;\n const colWidth = barWidth + specsWidth;\n \n console.log(` ${'Date'.padEnd(labelWidth)} ${chalk.cyan('Created'.padEnd(colWidth))} ${chalk.green('Completed'.padEnd(colWidth))}`);\n console.log(` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(colWidth))} ${chalk.dim('─'.repeat(colWidth))}`);\n \n const maxCount = Math.max(...Object.values(createdByDate), ...Object.values(completedByDate));\n \n for (const date of sortedDates) {\n const created = createdByDate[date] || 0;\n const completed = completedByDate[date] || 0;\n \n const createdBar = createBar(created, maxCount, barWidth);\n const completedBar = createBar(completed, maxCount, barWidth);\n \n const createdCol = `${createdBar.padEnd(barWidth)}${created.toString().padStart(specsWidth)}`;\n const completedCol = `${completedBar.padEnd(barWidth)}${completed.toString().padStart(specsWidth)}`;\n \n console.log(` ${chalk.dim(date.padEnd(labelWidth))} ${chalk.cyan(createdCol)} ${chalk.green(completedCol)}`);\n }\n console.log('');\n }\n\n // Show creation by month (all time)\n const sortedMonths = Object.entries(createdByMonth)\n .sort((a, b) => {\n const dateA = dayjs(a[0], 'MMM YYYY');\n const dateB = dayjs(b[0], 'MMM YYYY');\n return dateB.diff(dateA);\n })\n .slice(0, 6); // Last 6 months\n\n if (sortedMonths.length > 0) {\n console.log(chalk.bold('📊 Monthly Overview'));\n console.log('');\n \n // Aligned with stats.ts\n const labelWidth = 15;\n const barWidth = 20;\n const specsWidth = 3;\n const colWidth = barWidth + specsWidth;\n \n console.log(` ${'Month'.padEnd(labelWidth)} ${chalk.magenta('Specs'.padEnd(colWidth))}`);\n console.log(` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(colWidth))}`);\n \n const maxCount = Math.max(...sortedMonths.map(([, count]) => count));\n for (const [month, count] of sortedMonths) {\n const bar = createBar(count, maxCount, barWidth);\n console.log(` ${month.padEnd(labelWidth)} ${chalk.magenta(bar.padEnd(barWidth))}${chalk.magenta(count.toString().padStart(specsWidth))}`);\n }\n console.log('');\n }\n\n // Completion rate\n const last7Days = specs.filter(s => {\n if (!s.frontmatter.completed) return false;\n const completed = dayjs(s.frontmatter.completed);\n return completed.isAfter(today.subtract(7, 'day'));\n }).length;\n\n const last30Days = specs.filter(s => {\n if (!s.frontmatter.completed) return false;\n const completed = dayjs(s.frontmatter.completed);\n return completed.isAfter(today.subtract(30, 'day'));\n }).length;\n\n console.log(chalk.bold('✅ Completion Rate'));\n console.log('');\n \n // Aligned with stats.ts\n const labelWidth = 15;\n const valueWidth = 5;\n \n console.log(` ${'Period'.padEnd(labelWidth)} ${'Specs'.padStart(valueWidth)}`);\n console.log(` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`);\n console.log(` ${'Last 7 days'.padEnd(labelWidth)} ${chalk.green(last7Days.toString().padStart(valueWidth))}`);\n console.log(` ${'Last 30 days'.padEnd(labelWidth)} ${chalk.green(last30Days.toString().padStart(valueWidth))}`);\n console.log('');\n\n // By tag breakdown (if requested)\n if (options.byTag) {\n const tagStats: Record<string, { created: number; completed: number }> = {};\n \n for (const spec of specs) {\n const created = dayjs(spec.frontmatter.created);\n const isInRange = created.isAfter(startDate);\n \n if (isInRange && spec.frontmatter.tags) {\n for (const tag of spec.frontmatter.tags) {\n if (!tagStats[tag]) tagStats[tag] = { created: 0, completed: 0 };\n tagStats[tag].created++;\n \n if (spec.frontmatter.completed) {\n const completed = dayjs(spec.frontmatter.completed);\n if (completed.isAfter(startDate)) {\n tagStats[tag].completed++;\n }\n }\n }\n }\n }\n \n const sortedTags = Object.entries(tagStats)\n .sort((a, b) => b[1].created - a[1].created)\n .slice(0, 10);\n \n if (sortedTags.length > 0) {\n console.log(chalk.bold('🏷️ By Tag'));\n for (const [tag, stats] of sortedTags) {\n console.log(` ${chalk.dim('#')}${tag.padEnd(20)} ${chalk.cyan(stats.created)} created · ${chalk.green(stats.completed)} completed`);\n }\n console.log('');\n }\n }\n\n // By assignee breakdown (if requested)\n if (options.byAssignee) {\n const assigneeStats: Record<string, { created: number; completed: number }> = {};\n \n for (const spec of specs) {\n if (!spec.frontmatter.assignee) continue;\n \n const created = dayjs(spec.frontmatter.created);\n const isInRange = created.isAfter(startDate);\n \n if (isInRange) {\n const assignee = spec.frontmatter.assignee;\n if (!assigneeStats[assignee]) assigneeStats[assignee] = { created: 0, completed: 0 };\n assigneeStats[assignee].created++;\n \n if (spec.frontmatter.completed) {\n const completed = dayjs(spec.frontmatter.completed);\n if (completed.isAfter(startDate)) {\n assigneeStats[assignee].completed++;\n }\n }\n }\n }\n \n const sortedAssignees = Object.entries(assigneeStats)\n .sort((a, b) => b[1].created - a[1].created);\n \n if (sortedAssignees.length > 0) {\n console.log(chalk.bold('👤 By Assignee'));\n for (const [assignee, stats] of sortedAssignees) {\n console.log(` ${chalk.dim('@')}${assignee.padEnd(20)} ${chalk.cyan(stats.created)} created · ${chalk.green(stats.completed)} completed`);\n }\n console.log('');\n }\n }\n}\n","import chalk from 'chalk';\nimport dayjs from 'dayjs';\nimport { Command } from 'commander';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport type { SpecStatus, SpecPriority } from '../frontmatter.js';\nimport { withSpinner } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\n\n// Column width constants (aligned with stats.ts and timeline.ts)\nconst SPEC_COLUMN_WIDTH = 43; // Includes status emoji + 1 space + spec name\nconst COLUMN_SEPARATOR = ' '; // 2 spaces between columns\nconst SPEC_INDENT = ' '; // 2 spaces for spec indentation within priority groups\n\n// Timeline bar characters\nconst FILLED_BAR_CHAR = '█';\nconst EMPTY_BAR_CHAR = '░';\n\nconst STATUS_CONFIG: Record<SpecStatus, { emoji: string; color: string }> = {\n planned: { emoji: '📅', color: 'gray' },\n 'in-progress': { emoji: '⏳', color: 'yellow' },\n complete: { emoji: '✅', color: 'green' },\n archived: { emoji: '📦', color: 'gray' },\n};\n\nconst PRIORITY_CONFIG: Record<SpecPriority, { emoji: string; label: string; colorFn: (s: string) => string }> = {\n critical: { emoji: '🔴', label: 'CRITICAL', colorFn: chalk.red },\n high: { emoji: '🟠', label: 'HIGH', colorFn: chalk.hex('#FFA500') },\n medium: { emoji: '🟡', label: 'MEDIUM', colorFn: chalk.yellow },\n low: { emoji: '🟢', label: 'LOW', colorFn: chalk.green },\n};\n\n/**\n * Gantt command - show timeline with dependencies\n */\nexport function ganttCommand(): Command {\n return new Command('gantt')\n .description('Show timeline with dependencies')\n .option('--weeks <n>', 'Show N weeks (default: 4)', parseInt)\n .option('--show-complete', 'Include completed specs')\n .option('--critical-path', 'Highlight critical path')\n .option('--json', 'Output as JSON')\n .action(async (options: { weeks?: number; showComplete?: boolean; criticalPath?: boolean; json?: boolean }) => {\n await showGantt(options);\n });\n}\n\nexport async function showGantt(options: {\n weeks?: number;\n showComplete?: boolean;\n criticalPath?: boolean;\n json?: boolean;\n}): Promise<void> {\n // Auto-check for conflicts before display\n await autoCheckIfEnabled();\n \n const weeks = options.weeks || 4;\n const timelineColumnWidth = weeks * 8; // 8 chars per week\n \n // Load all specs with spinner\n const specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({\n includeArchived: false,\n })\n );\n\n if (specs.length === 0) {\n console.log('No specs found.');\n return;\n }\n\n // Filter relevant specs\n const relevantSpecs = specs.filter(spec => {\n // Hide completed specs unless explicitly requested\n if (!options.showComplete && spec.frontmatter.status === 'complete') {\n return false;\n }\n // Show all non-archived specs (planned, in-progress, complete with flag)\n return spec.frontmatter.status !== 'archived';\n });\n\n if (relevantSpecs.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ specs: [], weeks }, null, 2));\n } else {\n console.log(chalk.dim('No active specs found.'));\n console.log(chalk.dim('Tip: Use --show-complete to include completed specs.'));\n }\n return;\n }\n\n // JSON output\n if (options.json) {\n const jsonOutput = {\n weeks,\n specs: relevantSpecs.map(spec => ({\n path: spec.path,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n created: spec.frontmatter.created,\n completed: spec.frontmatter.completed,\n due: spec.frontmatter.due,\n dependsOn: spec.frontmatter.depends_on,\n })),\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Group specs by priority\n const groupedSpecs: Record<SpecPriority, SpecInfo[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n \n const noPrioritySpecs: SpecInfo[] = [];\n \n for (const spec of relevantSpecs) {\n if (spec.frontmatter.priority && spec.frontmatter.priority in groupedSpecs) {\n groupedSpecs[spec.frontmatter.priority].push(spec);\n } else {\n noPrioritySpecs.push(spec);\n }\n }\n \n // Sort specs within each group by status (in-progress first), then by due date\n const sortSpecs = (specs: SpecInfo[]) => {\n return [...specs].sort((a, b) => {\n const statusOrder = { 'in-progress': 0, 'planned': 1, 'complete': 2 };\n const aOrder = statusOrder[a.frontmatter.status as keyof typeof statusOrder] ?? 3;\n const bOrder = statusOrder[b.frontmatter.status as keyof typeof statusOrder] ?? 3;\n \n if (aOrder !== bOrder) return aOrder - bOrder;\n \n if (a.frontmatter.due && !b.frontmatter.due) return -1;\n if (!a.frontmatter.due && b.frontmatter.due) return 1;\n if (a.frontmatter.due && b.frontmatter.due) {\n return dayjs(a.frontmatter.due).diff(dayjs(b.frontmatter.due));\n }\n \n return 0;\n });\n };\n\n // Calculate date range (start from today)\n const today = dayjs();\n const startDate = today.startOf('week');\n const endDate = startDate.add(weeks, 'week');\n\n // Calculate stats\n const inProgress = relevantSpecs.filter(s => s.frontmatter.status === 'in-progress').length;\n const planned = relevantSpecs.filter(s => s.frontmatter.status === 'planned').length;\n const overdue = relevantSpecs.filter(s => \n s.frontmatter.due && \n dayjs(s.frontmatter.due).isBefore(today) && \n s.frontmatter.status !== 'complete'\n ).length;\n\n // Display header\n console.log(chalk.bold.cyan(`📅 Gantt Chart (${weeks} weeks from ${startDate.format('MMM D, YYYY')})`));\n console.log('');\n\n // Column headers\n const specHeader = 'Spec'.padEnd(SPEC_COLUMN_WIDTH);\n const timelineHeader = 'Timeline';\n console.log(specHeader + COLUMN_SEPARATOR + timelineHeader);\n \n // Calendar dates in timeline header (right-aligned to column)\n const calendarDates: string[] = [];\n for (let i = 0; i < weeks; i++) {\n const date = startDate.add(i, 'week');\n const dateStr = date.format('MMM D').padEnd(8);\n calendarDates.push(dateStr);\n }\n const dateRow = ' '.repeat(SPEC_COLUMN_WIDTH) + COLUMN_SEPARATOR + calendarDates.join('');\n console.log(chalk.dim(dateRow));\n \n // Separator line\n const specSeparator = '─'.repeat(SPEC_COLUMN_WIDTH);\n const timelineSeparator = '─'.repeat(timelineColumnWidth);\n console.log(chalk.dim(specSeparator + COLUMN_SEPARATOR + timelineSeparator));\n \n // Today marker (aligned to current week)\n const todayWeekOffset = today.diff(startDate, 'week');\n const todayMarkerPos = todayWeekOffset * 8;\n let todayMarker = ' '.repeat(SPEC_COLUMN_WIDTH) + COLUMN_SEPARATOR;\n if (todayMarkerPos >= 0 && todayMarkerPos < timelineColumnWidth) {\n todayMarker += ' '.repeat(todayMarkerPos) + '│ Today';\n }\n console.log(chalk.dim(todayMarker));\n console.log('');\n\n // Display priority groups\n const priorities: SpecPriority[] = ['critical', 'high', 'medium', 'low'];\n \n for (const priority of priorities) {\n const specsInGroup = sortSpecs(groupedSpecs[priority]);\n \n // Skip empty priority groups\n if (specsInGroup.length === 0) {\n continue;\n }\n \n const config = PRIORITY_CONFIG[priority];\n \n // Show priority header with count\n console.log(config.colorFn(`${config.emoji} ${config.label} (${specsInGroup.length})`));\n \n // Display specs in this priority group\n for (const spec of specsInGroup) {\n renderSpecRow(spec, startDate, endDate, weeks, today);\n }\n \n console.log('');\n }\n\n // Summary\n const summaryParts: string[] = [];\n if (inProgress > 0) summaryParts.push(`${inProgress} in-progress`);\n if (planned > 0) summaryParts.push(`${planned} planned`);\n if (overdue > 0) summaryParts.push(chalk.red(`${overdue} overdue`));\n \n console.log(chalk.bold('Summary: ') + summaryParts.join(' · '));\n console.log(chalk.dim('💡 Tip: Add \"due: YYYY-MM-DD\" to frontmatter for timeline planning'));\n}\n\nfunction renderSpecRow(\n spec: SpecInfo,\n startDate: dayjs.Dayjs,\n endDate: dayjs.Dayjs,\n weeks: number,\n today: dayjs.Dayjs\n): void {\n const statusConfig = STATUS_CONFIG[spec.frontmatter.status];\n const timelineColumnWidth = weeks * 8;\n \n // Format spec name with status emoji\n // Format: {emoji} {spec-name} (must be exactly SPEC_COLUMN_WIDTH chars)\n const emoji = statusConfig.emoji;\n const maxNameLength = SPEC_COLUMN_WIDTH - 2; // 2 chars for emoji + space\n let specName = spec.name; // Use spec.name instead of spec.path\n \n // Truncate name if too long\n if (specName.length > maxNameLength) {\n specName = specName.substring(0, maxNameLength - 1) + '…';\n }\n \n const specColumn = `${SPEC_INDENT}${emoji} ${specName}`.padEnd(SPEC_COLUMN_WIDTH);\n \n // Build timeline column\n let timelineColumn: string;\n \n if (!spec.frontmatter.due) {\n // No due date set\n timelineColumn = chalk.dim('(no due date set)');\n } else {\n // Render timeline bar\n timelineColumn = renderTimelineBar(spec, startDate, endDate, weeks, today);\n }\n \n console.log(specColumn + COLUMN_SEPARATOR + timelineColumn);\n}\n\nfunction renderTimelineBar(\n spec: SpecInfo,\n startDate: dayjs.Dayjs,\n endDate: dayjs.Dayjs,\n weeks: number,\n today: dayjs.Dayjs\n): string {\n const charsPerWeek = 8;\n const totalChars = weeks * charsPerWeek;\n \n const due = dayjs(spec.frontmatter.due!);\n const specStart = today; // Start from today, not creation date\n \n // Calculate bar position\n const startDaysFromStart = specStart.diff(startDate, 'day');\n const dueDaysFromStart = due.diff(startDate, 'day');\n \n const startPos = Math.max(0, Math.floor((startDaysFromStart / 7) * charsPerWeek));\n const duePos = Math.floor((dueDaysFromStart / 7) * charsPerWeek);\n \n // Clamp to visible range\n const barStart = Math.max(0, startPos);\n const barEnd = Math.min(totalChars, Math.max(barStart, duePos));\n const barLength = Math.max(0, barEnd - barStart);\n \n // Build bar string\n let result = '';\n \n // Leading space\n if (barStart > 0) {\n result += ' '.repeat(barStart);\n }\n \n // Bar content based on status\n if (spec.frontmatter.status === 'complete') {\n result += chalk.green(FILLED_BAR_CHAR.repeat(barLength));\n } else if (spec.frontmatter.status === 'in-progress') {\n // Half-filled bar\n const halfLength = Math.floor(barLength / 2);\n result += chalk.yellow(FILLED_BAR_CHAR.repeat(halfLength));\n result += chalk.dim(EMPTY_BAR_CHAR.repeat(barLength - halfLength));\n } else {\n // Planned - light shade bar\n result += chalk.dim(EMPTY_BAR_CHAR.repeat(barLength));\n }\n \n // Trailing space\n const trailingSpace = totalChars - barEnd;\n if (trailingSpace > 0) {\n result += ' '.repeat(trailingSpace);\n }\n \n return result;\n}\n","/**\n * Tokens command - count tokens in specs and sub-specs\n * \n * Implements spec 069: Token Counting Utilities\n */\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { TokenCounter, type TokenCount } from '@leanspec/core';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { sanitizeUserInput, withSpinner } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { loadConfig } from '../config.js';\nimport * as path from 'node:path';\n\nexport interface TokensOptions {\n detailed?: boolean; // Show content breakdown\n includeSubSpecs?: boolean; // Count sub-spec files\n all?: boolean; // Show all specs\n sortBy?: 'tokens' | 'lines' | 'name'; // Sort order\n json?: boolean; // JSON output\n}\n\nexport function tokensCommand(): Command;\nexport function tokensCommand(specPath: string, options?: TokensOptions): Promise<void>;\nexport function tokensCommand(specPath?: string, options: TokensOptions = {}): Command | Promise<void> {\n if (typeof specPath === 'string') {\n return countSpecTokens(specPath, options);\n }\n\n return new Command('tokens')\n .description('Count tokens in spec(s) for LLM context management')\n .argument('[spec]', 'Spec to count tokens for (optional)')\n .option('--detailed', 'Show content type breakdown (code, prose, tables)')\n .option('--include-sub-specs', 'Count all sub-spec files (DESIGN.md, etc.)')\n .option('--all', 'Show all specs (when [spec] is omitted)')\n .option('--sort-by <field>', 'Sort by: tokens, lines, name (default: tokens)')\n .option('--json', 'Output as JSON')\n .action(async (specPathArg: string | undefined, opts: TokensOptions) => {\n if (specPathArg) {\n await countSpecTokens(specPathArg, opts);\n } else {\n await tokensAllCommand(opts);\n }\n });\n}\n\n/**\n * Count tokens in a single spec\n */\nexport async function countSpecTokens(specPath: string, options: TokensOptions = {}): Promise<void> {\n await autoCheckIfEnabled();\n\n const counter = new TokenCounter();\n \n try {\n // Resolve spec path (handles numbers like \"14\" or \"014\")\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Extract spec name from path\n const specName = path.basename(resolvedPath);\n \n // Count tokens\n const result = await counter.countSpec(resolvedPath, {\n detailed: options.detailed,\n includeSubSpecs: options.includeSubSpecs,\n });\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify({\n spec: specName,\n path: resolvedPath,\n ...result,\n }, null, 2));\n return;\n }\n\n // Display results\n console.log(chalk.bold.cyan(`📊 Token Count: ${specName}`));\n console.log('');\n \n // Total\n const indicators = counter.getPerformanceIndicators(result.total);\n const levelEmoji = indicators.level === 'excellent' ? '✅' :\n indicators.level === 'good' ? '👍' :\n indicators.level === 'warning' ? '⚠️' : '🔴';\n \n console.log(` Total: ${chalk.cyan(result.total.toLocaleString())} tokens ${levelEmoji}`);\n console.log('');\n\n // Files breakdown\n if (result.files.length > 1 || options.detailed) {\n console.log(chalk.bold('Files:'));\n console.log('');\n \n for (const file of result.files) {\n const lineInfo = file.lines ? chalk.dim(` (${file.lines} lines)`) : '';\n console.log(` ${file.path.padEnd(25)} ${chalk.cyan(file.tokens.toLocaleString().padStart(6))} tokens${lineInfo}`);\n }\n console.log('');\n }\n\n // Content breakdown\n if (options.detailed && result.breakdown) {\n const b = result.breakdown;\n const total = b.code + b.prose + b.tables + b.frontmatter;\n \n console.log(chalk.bold('Content Breakdown:'));\n console.log('');\n console.log(` Prose ${chalk.cyan(b.prose.toLocaleString().padStart(6))} tokens ${chalk.dim(`(${Math.round(b.prose / total * 100)}%)`)}`);\n console.log(` Code ${chalk.cyan(b.code.toLocaleString().padStart(6))} tokens ${chalk.dim(`(${Math.round(b.code / total * 100)}%)`)}`);\n console.log(` Tables ${chalk.cyan(b.tables.toLocaleString().padStart(6))} tokens ${chalk.dim(`(${Math.round(b.tables / total * 100)}%)`)}`);\n console.log(` Frontmatter ${chalk.cyan(b.frontmatter.toLocaleString().padStart(6))} tokens ${chalk.dim(`(${Math.round(b.frontmatter / total * 100)}%)`)}`);\n console.log('');\n }\n\n // Performance indicators\n console.log(chalk.bold('Performance Indicators:'));\n console.log('');\n \n const costColor = indicators.costMultiplier < 2 ? chalk.green :\n indicators.costMultiplier < 4 ? chalk.yellow :\n chalk.red;\n const effectivenessColor = indicators.effectiveness >= 95 ? chalk.green :\n indicators.effectiveness >= 85 ? chalk.yellow :\n chalk.red;\n \n console.log(` Cost multiplier: ${costColor(`${indicators.costMultiplier}x`)} ${chalk.dim('vs 1,200 token baseline')}`);\n console.log(` AI effectiveness: ${effectivenessColor(`~${indicators.effectiveness}%`)} ${chalk.dim('(hypothesis)')}`);\n console.log(` Context Economy: ${levelEmoji} ${indicators.recommendation}`);\n console.log('');\n\n // Show hint about sub-specs\n if (!options.includeSubSpecs && result.files.length === 1) {\n console.log(chalk.dim('💡 Use `--include-sub-specs` to count all sub-spec files'));\n }\n } finally {\n counter.dispose();\n }\n}\n\n/**\n * Show token counts for all specs\n */\nexport async function tokensAllCommand(options: TokensOptions = {}): Promise<void> {\n await autoCheckIfEnabled();\n\n // Load all specs\n const specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({ includeArchived: false })\n );\n\n if (specs.length === 0) {\n console.log('No specs found.');\n return;\n }\n\n // Count tokens for each spec\n const counter = new TokenCounter();\n const results: Array<{\n name: string;\n path: string;\n tokens: number;\n lines: number;\n level: string;\n }> = [];\n\n try {\n for (const spec of specs) {\n const result = await counter.countSpec(spec.fullPath, {\n includeSubSpecs: options.includeSubSpecs,\n });\n \n const indicators = counter.getPerformanceIndicators(result.total);\n const totalLines = result.files.reduce((sum: number, f: { lines?: number }) => sum + (f.lines || 0), 0);\n \n results.push({\n name: spec.name,\n path: spec.fullPath,\n tokens: result.total,\n lines: totalLines,\n level: indicators.level,\n });\n }\n } finally {\n counter.dispose();\n }\n\n // Sort results\n const sortBy = options.sortBy || 'tokens';\n results.sort((a, b) => {\n if (sortBy === 'tokens') return b.tokens - a.tokens;\n if (sortBy === 'lines') return b.lines - a.lines;\n return a.name.localeCompare(b.name);\n });\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n // Display results\n console.log(chalk.bold.cyan('📊 Token Counts'));\n console.log('');\n console.log(chalk.dim(`Sorted by: ${sortBy}`));\n console.log('');\n\n // Calculate stats\n const totalTokens = results.reduce((sum, r) => sum + r.tokens, 0);\n const avgTokens = Math.round(totalTokens / results.length);\n const warningCount = results.filter(r => r.level === 'warning' || r.level === 'problem').length;\n\n // Summary\n console.log(chalk.bold('Summary:'));\n console.log('');\n console.log(` Total specs: ${chalk.cyan(results.length)}`);\n console.log(` Total tokens: ${chalk.cyan(totalTokens.toLocaleString())}`);\n console.log(` Average tokens: ${chalk.cyan(avgTokens.toLocaleString())}`);\n \n if (warningCount > 0) {\n console.log(` Needs review: ${chalk.yellow(warningCount)} specs ${chalk.dim('(⚠️ or 🔴)')}`);\n }\n console.log('');\n\n // Table header\n const nameCol = 35;\n const tokensCol = 10;\n const linesCol = 8;\n \n console.log(chalk.bold(\n 'Spec'.padEnd(nameCol) + \n 'Tokens'.padStart(tokensCol) + \n 'Lines'.padStart(linesCol) + \n ' Status'\n ));\n console.log(chalk.dim('─'.repeat(nameCol + tokensCol + linesCol + 10)));\n\n // Table rows (show top 20 or all if --all)\n const displayCount = options.all ? results.length : Math.min(20, results.length);\n \n for (let i = 0; i < displayCount; i++) {\n const r = results[i];\n const emoji = r.level === 'excellent' ? '✅' :\n r.level === 'good' ? '👍' :\n r.level === 'warning' ? '⚠️' : '🔴';\n \n const tokensColor = r.level === 'excellent' || r.level === 'good' ? chalk.cyan :\n r.level === 'warning' ? chalk.yellow :\n chalk.red;\n \n const name = r.name.length > nameCol - 2 ? r.name.substring(0, nameCol - 3) + '…' : r.name;\n \n console.log(\n name.padEnd(nameCol) +\n tokensColor(r.tokens.toLocaleString().padStart(tokensCol)) +\n chalk.dim(r.lines.toString().padStart(linesCol)) +\n ` ${emoji}`\n );\n }\n\n if (results.length > displayCount) {\n console.log('');\n console.log(chalk.dim(`... and ${results.length - displayCount} more specs`));\n console.log(chalk.dim(`Use --all to show all specs`));\n }\n\n console.log('');\n console.log(chalk.dim('Legend: ✅ excellent (<2K) | 👍 good (<3.5K) | ⚠️ warning (<5K) | 🔴 problem (>5K)'));\n console.log('');\n}\n","/**\n * Analyze command - programmatic spec analysis for AI agents\n * \n * Implements spec 059: Programmatic Spec Management\n * \n * Returns structured data about spec complexity and structure.\n * AI agents use this to decide transformation strategies.\n * \n * No semantic analysis - just mechanical structure parsing.\n */\n\nimport chalk from 'chalk';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { TokenCounter, analyzeMarkdownStructure, type Section } from '@leanspec/core';\nimport { loadConfig } from '../config.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { readFile } from 'node:fs/promises';\n\nexport interface AnalyzeOptions {\n json?: boolean; // Output as JSON for AI agents\n verbose?: boolean; // Include detailed breakdown\n}\n\n/**\n * Analyze command - analyze spec complexity and structure\n */\nexport function analyzeCommand(): Command {\n return new Command('analyze')\n .description('Analyze spec complexity and structure (spec 059)')\n .argument('<spec>', 'Spec to analyze')\n .option('--json', 'Output as JSON for AI agents')\n .option('--verbose', 'Include detailed section breakdown')\n .action(async (specPath: string, options: { json?: boolean; verbose?: boolean }) => {\n await analyzeSpec(specPath, options);\n });\n}\n\nexport interface AnalyzeResult {\n spec: string;\n path: string;\n metrics: {\n tokens: number;\n lines: number;\n characters: number;\n sections: {\n h1: number;\n h2: number;\n h3: number;\n h4: number;\n h5: number;\n h6: number;\n total: number;\n };\n codeBlocks: number;\n maxNesting: number;\n };\n threshold: {\n status: 'excellent' | 'good' | 'warning' | 'problem';\n limit: number;\n message: string;\n };\n structure: Array<{\n section: string;\n level: number;\n lineRange: [number, number];\n tokens: number;\n subsections: string[];\n }>;\n recommendation: {\n action: 'none' | 'compact' | 'split' | 'review';\n reason: string;\n confidence: 'low' | 'medium' | 'high';\n };\n}\n\n/**\n * Analyze spec complexity and structure\n */\nexport async function analyzeSpec(specPath: string, options: AnalyzeOptions = {}): Promise<void> {\n await autoCheckIfEnabled();\n\n const counter = new TokenCounter();\n \n try {\n // Resolve spec path\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Read spec content\n const specName = path.basename(resolvedPath);\n const readmePath = path.join(resolvedPath, 'README.md');\n const content = await readFile(readmePath, 'utf-8');\n \n // Analyze structure\n const structure = analyzeMarkdownStructure(content);\n \n // Count tokens\n const tokenResult = await counter.countSpec(resolvedPath, {\n detailed: true,\n includeSubSpecs: false, // Only analyze README.md for structure\n });\n \n // Get performance indicators\n const indicators = counter.getPerformanceIndicators(tokenResult.total);\n \n // Calculate tokens per section (estimate based on line count)\n const sectionsWithTokens = await Promise.all(\n structure.allSections.map(async (section) => {\n const sectionContent = content.split('\\n').slice(section.startLine - 1, section.endLine).join('\\n');\n const sectionTokens = await counter.countTokensInContent(sectionContent);\n \n return {\n section: section.title,\n level: section.level,\n lineRange: [section.startLine, section.endLine] as [number, number],\n tokens: sectionTokens,\n subsections: section.subsections.map(s => s.title),\n };\n })\n );\n \n // Generate recommendation\n const recommendation = generateRecommendation(tokenResult.total, structure, indicators.level);\n \n // Build result\n const result: AnalyzeResult = {\n spec: specName,\n path: resolvedPath,\n metrics: {\n tokens: tokenResult.total,\n lines: structure.lines,\n characters: content.length,\n sections: structure.sectionsByLevel,\n codeBlocks: structure.codeBlocks,\n maxNesting: structure.maxNesting,\n },\n threshold: {\n status: indicators.level,\n limit: getThresholdLimit(indicators.level),\n message: indicators.recommendation,\n },\n structure: sectionsWithTokens,\n recommendation,\n };\n\n // Output as JSON\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display human-readable output\n displayAnalysis(result, options.verbose);\n \n } finally {\n counter.dispose();\n }\n}\n\n/**\n * Generate transformation recommendation\n */\nfunction generateRecommendation(\n tokens: number,\n structure: ReturnType<typeof analyzeMarkdownStructure>,\n level: string\n): AnalyzeResult['recommendation'] {\n // Excellent - no action needed\n if (tokens < 2000) {\n return {\n action: 'none',\n reason: 'Spec is under 2,000 tokens (optimal)',\n confidence: 'high',\n };\n }\n \n // Good - might benefit from compaction\n if (tokens < 3500) {\n return {\n action: 'compact',\n reason: 'Spec could benefit from removing redundancy',\n confidence: 'medium',\n };\n }\n \n // Warning - should split\n if (tokens < 5000) {\n // Check if we have clear concerns (h2 sections)\n const h2Count = structure.sectionsByLevel.h2;\n \n if (h2Count >= 3) {\n return {\n action: 'split',\n reason: `Exceeds 3,500 token threshold with ${h2Count} concerns`,\n confidence: 'high',\n };\n } else {\n return {\n action: 'split',\n reason: 'Exceeds 3,500 token threshold',\n confidence: 'medium',\n };\n }\n }\n \n // Problem - must split\n return {\n action: 'split',\n reason: 'Critically oversized - must split immediately',\n confidence: 'high',\n };\n}\n\n/**\n * Get threshold limit for status\n */\nfunction getThresholdLimit(level: string): number {\n switch (level) {\n case 'excellent': return 2000;\n case 'good': return 3500;\n case 'warning': return 5000;\n case 'problem': return 5000;\n default: return 2000;\n }\n}\n\n/**\n * Display analysis in human-readable format\n */\nfunction displayAnalysis(result: AnalyzeResult, verbose?: boolean): void {\n console.log(chalk.bold.cyan(`📊 Spec Analysis: ${result.spec}`));\n console.log('');\n \n // Token count with status indicator\n const statusEmoji = result.threshold.status === 'excellent' ? '✅' :\n result.threshold.status === 'good' ? '👍' :\n result.threshold.status === 'warning' ? '⚠️' : '🔴';\n \n const tokenColor = result.threshold.status === 'excellent' || result.threshold.status === 'good' ? chalk.cyan :\n result.threshold.status === 'warning' ? chalk.yellow :\n chalk.red;\n \n console.log(chalk.bold('Token Count:'), tokenColor(result.metrics.tokens.toLocaleString()), 'tokens', statusEmoji);\n console.log(chalk.dim(` Threshold: ${result.threshold.limit.toLocaleString()} tokens`));\n console.log(chalk.dim(` Status: ${result.threshold.message}`));\n console.log('');\n \n // Structure metrics\n console.log(chalk.bold('Structure:'));\n console.log(` Lines: ${chalk.cyan(result.metrics.lines.toLocaleString())}`);\n console.log(` Sections: ${chalk.cyan(result.metrics.sections.total)} (H1:${result.metrics.sections.h1}, H2:${result.metrics.sections.h2}, H3:${result.metrics.sections.h3}, H4:${result.metrics.sections.h4})`);\n console.log(` Code blocks: ${chalk.cyan(result.metrics.codeBlocks)}`);\n console.log(` Max nesting: ${chalk.cyan(result.metrics.maxNesting)} levels`);\n console.log('');\n \n // Top sections by size\n if (verbose && result.structure.length > 0) {\n const topSections = result.structure\n .filter(s => s.level <= 2) // Only show h1 and h2\n .sort((a, b) => b.tokens - a.tokens)\n .slice(0, 5);\n \n console.log(chalk.bold('Top Sections by Size:'));\n console.log('');\n \n for (let i = 0; i < topSections.length; i++) {\n const s = topSections[i];\n const percentage = Math.round((s.tokens / result.metrics.tokens) * 100);\n const indent = ' '.repeat(s.level - 1);\n \n console.log(` ${i + 1}. ${indent}${s.section}`);\n console.log(` ${chalk.cyan(s.tokens.toLocaleString())} tokens / ${s.lineRange[1] - s.lineRange[0] + 1} lines ${chalk.dim(`(${percentage}%)`)}`);\n console.log(chalk.dim(` Lines ${s.lineRange[0]}-${s.lineRange[1]}`));\n }\n console.log('');\n }\n \n // Recommendation\n const actionColor = result.recommendation.action === 'none' ? chalk.green :\n result.recommendation.action === 'compact' ? chalk.yellow :\n result.recommendation.action === 'split' ? chalk.red :\n chalk.blue;\n \n console.log(chalk.bold('Recommendation:'), actionColor(result.recommendation.action.toUpperCase()));\n console.log(chalk.dim(` ${result.recommendation.reason}`));\n console.log(chalk.dim(` Confidence: ${result.recommendation.confidence}`));\n console.log('');\n \n // Hints\n if (result.recommendation.action === 'split') {\n console.log(chalk.dim('💡 Use `lean-spec split` to partition into sub-specs'));\n console.log(chalk.dim('💡 Consider splitting by H2 sections (concerns)'));\n } else if (result.recommendation.action === 'compact') {\n console.log(chalk.dim('💡 Use `lean-spec compact` to remove redundancy'));\n }\n \n console.log('');\n}\n","/**\n * Split command - partition spec into sub-spec files\n * \n * Implements spec 059: Programmatic Spec Management\n * \n * Mechanically splits spec based on explicit line ranges.\n * AI agents decide what goes where, this tool executes.\n * \n * No semantic analysis - just mechanical file operations.\n */\n\nimport chalk from 'chalk';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { \n extractLines, \n countLines,\n parseFrontmatterFromString,\n createUpdatedFrontmatter,\n} from '@leanspec/core';\nimport { loadConfig } from '../config.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\n\nexport interface SplitOptions {\n outputs: Array<{\n file: string;\n lines: string; // Format: \"1-150\" or \"151-528\"\n }>;\n updateRefs?: boolean; // Update cross-references in README\n dryRun?: boolean; // Show what would be created\n force?: boolean; // Overwrite existing files\n}\n\ninterface ParsedOutput {\n file: string;\n startLine: number;\n endLine: number;\n}\n\n// Helper function to collect multiple --output options\nfunction collectOutputs(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Split command - split spec into multiple files\n */\nexport function splitCommand(): Command {\n return new Command('split')\n .description('Split spec into multiple files by line ranges (spec 059)')\n .argument('<spec>', 'Spec to split')\n .option('--output <file:lines>', 'Output file with line range (e.g., README.md:1-150)', collectOutputs, [])\n .option('--update-refs', 'Update cross-references in README.md')\n .option('--dry-run', 'Show what would be created without making changes')\n .option('--force', 'Overwrite existing files')\n .action(async (specPath: string, options: { \n output: Array<string>;\n updateRefs?: boolean;\n dryRun?: boolean;\n force?: boolean;\n }) => {\n const outputs = options.output.map((opt: string) => {\n const [file, lines] = opt.split(':');\n if (!file || !lines) {\n throw new Error(`Invalid --output format: ${opt}. Expected: file.md:1-150`);\n }\n return { file, lines };\n });\n await splitSpec(specPath, {\n outputs,\n updateRefs: options.updateRefs,\n dryRun: options.dryRun,\n force: options.force,\n });\n });\n}\n\n/**\n * Split spec into multiple files\n */\nexport async function splitSpec(specPath: string, options: SplitOptions): Promise<void> {\n await autoCheckIfEnabled();\n \n try {\n // Validate options\n if (!options.outputs || options.outputs.length === 0) {\n throw new Error('At least one --output option is required');\n }\n \n // Resolve spec path\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Read source spec\n const specName = path.basename(resolvedPath);\n const readmePath = path.join(resolvedPath, 'README.md');\n const content = await readFile(readmePath, 'utf-8');\n \n // Parse output specifications\n const parsedOutputs = parseOutputSpecs(options.outputs);\n \n // Validate no overlapping ranges\n validateNoOverlaps(parsedOutputs);\n \n // Extract content for each output\n const extractions: Array<{\n file: string;\n content: string;\n tokens: number;\n lines: number;\n }> = [];\n \n for (const output of parsedOutputs) {\n const extracted = extractLines(content, output.startLine, output.endLine);\n const lineCount = countLines(extracted);\n \n extractions.push({\n file: output.file,\n content: extracted,\n tokens: 0, // Will be calculated in dry-run or actual execution\n lines: lineCount,\n });\n }\n \n // Dry run mode\n if (options.dryRun) {\n await displayDryRun(specName, extractions);\n return;\n }\n \n // Execute split\n await executeSplit(resolvedPath, specName, content, extractions, options);\n \n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n throw error;\n }\n}\n\n/**\n * Parse output specifications from command line\n */\nfunction parseOutputSpecs(outputs: SplitOptions['outputs']): ParsedOutput[] {\n const parsed: ParsedOutput[] = [];\n \n for (const output of outputs) {\n // Format: \"file.md:1-150\" or \"file.md:151-528\"\n const match = output.lines.match(/^(\\d+)-(\\d+)$/);\n \n if (!match) {\n throw new Error(`Invalid line range format: ${output.lines}. Expected format: \"1-150\"`);\n }\n \n const startLine = parseInt(match[1], 10);\n const endLine = parseInt(match[2], 10);\n \n if (startLine < 1 || endLine < startLine) {\n throw new Error(`Invalid line range: ${output.lines}`);\n }\n \n parsed.push({\n file: output.file,\n startLine,\n endLine,\n });\n }\n \n return parsed;\n}\n\n/**\n * Validate no overlapping line ranges\n */\nfunction validateNoOverlaps(outputs: ParsedOutput[]): void {\n const sorted = [...outputs].sort((a, b) => a.startLine - b.startLine);\n \n for (let i = 0; i < sorted.length - 1; i++) {\n const current = sorted[i];\n const next = sorted[i + 1];\n \n if (current.endLine >= next.startLine) {\n throw new Error(\n `Overlapping line ranges: ${current.file} (${current.startLine}-${current.endLine}) ` +\n `overlaps with ${next.file} (${next.startLine}-${next.endLine})`\n );\n }\n }\n}\n\n/**\n * Display dry-run output\n */\nasync function displayDryRun(\n specName: string,\n extractions: Array<{ file: string; content: string; lines: number }>\n): Promise<void> {\n console.log(chalk.bold.cyan(`📋 Split Preview: ${specName}`));\n console.log('');\n \n console.log(chalk.bold('Would create:'));\n console.log('');\n \n for (const ext of extractions) {\n console.log(` ${chalk.cyan(ext.file)}`);\n console.log(` Lines: ${ext.lines}`);\n \n // Show first few lines as preview\n const previewLines = ext.content.split('\\n').slice(0, 3);\n console.log(chalk.dim(' Preview:'));\n for (const line of previewLines) {\n console.log(chalk.dim(` ${line.substring(0, 60)}${line.length > 60 ? '...' : ''}`));\n }\n console.log('');\n }\n \n console.log(chalk.dim('No files modified (dry run)'));\n console.log(chalk.dim('Run without --dry-run to apply changes'));\n console.log('');\n}\n\n/**\n * Execute the split operation\n */\nasync function executeSplit(\n specPath: string,\n specName: string,\n originalContent: string,\n extractions: Array<{ file: string; content: string; lines: number }>,\n options: SplitOptions\n): Promise<void> {\n console.log(chalk.bold.cyan(`✂️ Splitting: ${specName}`));\n console.log('');\n \n // Parse frontmatter from original\n const frontmatter = parseFrontmatterFromString(originalContent);\n \n // Create each output file\n for (const ext of extractions) {\n const outputPath = path.join(specPath, ext.file);\n \n // For README.md, include frontmatter\n let finalContent = ext.content;\n if (ext.file === 'README.md' && frontmatter) {\n // Rebuild with frontmatter\n const { content: contentWithFrontmatter } = createUpdatedFrontmatter(\n ext.content,\n frontmatter\n );\n finalContent = contentWithFrontmatter;\n }\n \n await writeFile(outputPath, finalContent, 'utf-8');\n \n console.log(chalk.green(`✓ Created ${ext.file} (${ext.lines} lines)`));\n }\n \n // Update README.md to add sub-spec links if requested\n if (options.updateRefs) {\n const readmePath = path.join(specPath, 'README.md');\n const readmeContent = await readFile(readmePath, 'utf-8');\n \n // Add sub-specs section if it doesn't exist\n const updatedReadme = await addSubSpecLinks(\n readmeContent,\n extractions.map(e => e.file).filter(f => f !== 'README.md')\n );\n \n await writeFile(readmePath, updatedReadme, 'utf-8');\n console.log(chalk.green(`✓ Updated README.md with sub-spec links`));\n }\n \n console.log('');\n console.log(chalk.bold.green('Split complete!'));\n console.log(chalk.dim(`Created ${extractions.length} files in ${specName}`));\n console.log('');\n}\n\n/**\n * Add sub-spec links to README\n */\nasync function addSubSpecLinks(content: string, subSpecs: string[]): Promise<string> {\n if (subSpecs.length === 0) {\n return content;\n }\n \n // Check if sub-specs section already exists\n if (content.includes('## Sub-Specs') || content.includes('## Sub-specs')) {\n // Section exists, don't modify\n return content;\n }\n \n // Find a good place to insert (after overview/decision, before implementation)\n const lines = content.split('\\n');\n let insertIndex = -1;\n \n // Look for common section markers\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].toLowerCase();\n if (line.includes('## implementation') || \n line.includes('## plan') || \n line.includes('## test')) {\n insertIndex = i;\n break;\n }\n }\n \n // If no good spot found, add at end\n if (insertIndex === -1) {\n insertIndex = lines.length;\n }\n \n // Build sub-specs section\n const subSpecsSection = [\n '',\n '## Sub-Specs',\n '',\n 'This spec is organized using sub-spec files:',\n '',\n ...subSpecs.map(file => {\n const name = file.replace('.md', '');\n return `- **[${name}](./${file})** - ${getFileDescription(file)}`;\n }),\n '',\n ];\n \n // Insert section\n lines.splice(insertIndex, 0, ...subSpecsSection);\n \n return lines.join('\\n');\n}\n\n/**\n * Get description for common sub-spec files\n */\nfunction getFileDescription(file: string): string {\n const lower = file.toLowerCase();\n \n if (lower.includes('design')) return 'Architecture and design details';\n if (lower.includes('implementation')) return 'Implementation plan and phases';\n if (lower.includes('testing') || lower.includes('test')) return 'Test strategy and cases';\n if (lower.includes('rationale')) return 'Design rationale and decisions';\n if (lower.includes('api')) return 'API specification';\n if (lower.includes('migration')) return 'Migration plan and strategy';\n if (lower.includes('context')) return 'Context and research';\n \n return 'Additional documentation';\n}\n","/**\n * Compact command - remove specified content\n * \n * Implements spec 059: Programmatic Spec Management\n * \n * Mechanically removes specified line ranges.\n * AI agents identify redundancy, this tool executes removal.\n * \n * No semantic analysis - just mechanical deletion.\n */\n\nimport chalk from 'chalk';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { removeLines, countLines, extractLines } from '@leanspec/core';\nimport { loadConfig } from '../config.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\n\nexport interface CompactOptions {\n removes: string[]; // Array of line ranges like \"145-153\"\n dryRun?: boolean; // Show what would be removed\n force?: boolean; // Skip confirmation\n}\n\ninterface ParsedRemove {\n startLine: number;\n endLine: number;\n originalIndex: number; // Track original order for better reporting\n}\n\n// Helper function to collect multiple --remove options\nfunction collectRemoves(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Compact command - remove specified line ranges\n */\nexport function compactCommand(): Command {\n return new Command('compact')\n .description('Remove specified line ranges from spec (spec 059)')\n .argument('<spec>', 'Spec to compact')\n .option('--remove <lines>', 'Line range to remove (e.g., 145-153)', collectRemoves, [])\n .option('--dry-run', 'Show what would be removed without making changes')\n .option('--force', 'Skip confirmation')\n .action(async (specPath: string, options: { remove: string[]; dryRun?: boolean; force?: boolean }) => {\n await compactSpec(specPath, {\n removes: options.remove,\n dryRun: options.dryRun,\n force: options.force,\n });\n });\n}\n\n/**\n * Compact spec by removing specified line ranges\n */\nexport async function compactSpec(specPath: string, options: CompactOptions): Promise<void> {\n await autoCheckIfEnabled();\n \n try {\n // Validate options\n if (!options.removes || options.removes.length === 0) {\n throw new Error('At least one --remove option is required');\n }\n \n // Resolve spec path\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Read source spec\n const specName = path.basename(resolvedPath);\n const readmePath = path.join(resolvedPath, 'README.md');\n const content = await readFile(readmePath, 'utf-8');\n \n // Parse remove specifications\n const parsedRemoves = parseRemoveSpecs(options.removes);\n \n // Validate no overlapping ranges\n validateNoOverlaps(parsedRemoves);\n \n // Dry run mode\n if (options.dryRun) {\n await displayDryRun(specName, content, parsedRemoves);\n return;\n }\n \n // Execute compaction\n await executeCompact(readmePath, specName, content, parsedRemoves);\n \n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n throw error;\n }\n}\n\n/**\n * Parse remove specifications from command line\n */\nfunction parseRemoveSpecs(removes: string[]): ParsedRemove[] {\n const parsed: ParsedRemove[] = [];\n \n for (let i = 0; i < removes.length; i++) {\n const spec = removes[i];\n \n // Format: \"145-153\" or \"234-256\"\n const match = spec.match(/^(\\d+)-(\\d+)$/);\n \n if (!match) {\n throw new Error(`Invalid line range format: ${spec}. Expected format: \"145-153\"`);\n }\n \n const startLine = parseInt(match[1], 10);\n const endLine = parseInt(match[2], 10);\n \n if (startLine < 1 || endLine < startLine) {\n throw new Error(`Invalid line range: ${spec}`);\n }\n \n parsed.push({\n startLine,\n endLine,\n originalIndex: i,\n });\n }\n \n return parsed;\n}\n\n/**\n * Validate no overlapping line ranges\n */\nfunction validateNoOverlaps(removes: ParsedRemove[]): void {\n const sorted = [...removes].sort((a, b) => a.startLine - b.startLine);\n \n for (let i = 0; i < sorted.length - 1; i++) {\n const current = sorted[i];\n const next = sorted[i + 1];\n \n if (current.endLine >= next.startLine) {\n throw new Error(\n `Overlapping line ranges: ${current.startLine}-${current.endLine} ` +\n `overlaps with ${next.startLine}-${next.endLine}`\n );\n }\n }\n}\n\n/**\n * Display dry-run output\n */\nasync function displayDryRun(\n specName: string,\n content: string,\n removes: ParsedRemove[]\n): Promise<void> {\n console.log(chalk.bold.cyan(`📋 Compact Preview: ${specName}`));\n console.log('');\n \n console.log(chalk.bold('Would remove:'));\n console.log('');\n \n let totalLines = 0;\n \n for (const remove of removes) {\n const lineCount = remove.endLine - remove.startLine + 1;\n totalLines += lineCount;\n \n // Extract content to show what will be removed\n const removedContent = extractLines(content, remove.startLine, remove.endLine);\n const previewLines = removedContent.split('\\n').slice(0, 3);\n \n console.log(` Lines ${remove.startLine}-${remove.endLine} (${lineCount} lines)`);\n console.log(chalk.dim(' Preview:'));\n for (const line of previewLines) {\n console.log(chalk.dim(` ${line.substring(0, 60)}${line.length > 60 ? '...' : ''}`));\n }\n if (removedContent.split('\\n').length > 3) {\n console.log(chalk.dim(` ... (${removedContent.split('\\n').length - 3} more lines)`));\n }\n console.log('');\n }\n \n // Calculate stats\n const originalLines = countLines(content);\n const remainingLines = originalLines - totalLines;\n const percentage = Math.round((totalLines / originalLines) * 100);\n \n console.log(chalk.bold('Summary:'));\n console.log(` Original lines: ${chalk.cyan(originalLines)}`);\n console.log(` Removing: ${chalk.yellow(totalLines)} lines (${percentage}%)`);\n console.log(` Remaining lines: ${chalk.cyan(remainingLines)}`);\n console.log('');\n \n console.log(chalk.dim('No files modified (dry run)'));\n console.log(chalk.dim('Run without --dry-run to apply changes'));\n console.log('');\n}\n\n/**\n * Execute the compaction operation\n */\nasync function executeCompact(\n readmePath: string,\n specName: string,\n content: string,\n removes: ParsedRemove[]\n): Promise<void> {\n console.log(chalk.bold.cyan(`🗜️ Compacting: ${specName}`));\n console.log('');\n \n // Sort removes in reverse order to maintain line numbers during removal\n const sorted = [...removes].sort((a, b) => b.startLine - a.startLine);\n \n // Apply each removal\n let updatedContent = content;\n let totalRemoved = 0;\n \n for (const remove of sorted) {\n const lineCount = remove.endLine - remove.startLine + 1;\n updatedContent = removeLines(updatedContent, remove.startLine, remove.endLine);\n totalRemoved += lineCount;\n \n console.log(chalk.green(`✓ Removed lines ${remove.startLine}-${remove.endLine} (${lineCount} lines)`));\n }\n \n // Write updated content\n await writeFile(readmePath, updatedContent, 'utf-8');\n \n // Calculate final stats\n const originalLines = countLines(content);\n const finalLines = countLines(updatedContent);\n const percentage = Math.round((totalRemoved / originalLines) * 100);\n \n console.log('');\n console.log(chalk.bold.green('Compaction complete!'));\n console.log(chalk.dim(`Removed ${totalRemoved} lines (${percentage}%)`));\n console.log(chalk.dim(`${originalLines} → ${finalLines} lines`));\n console.log('');\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { marked } from 'marked';\nimport { markedTerminal } from 'marked-terminal';\nimport { loadConfig } from '../config.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { getSpecFile, parseFrontmatter } from '../frontmatter.js';\nimport type { SpecFrontmatter } from '../frontmatter.js';\nimport { spawn } from 'node:child_process';\n\n// Configure marked for terminal output\nmarked.use(markedTerminal() as Parameters<typeof marked.use>[0]);\n\ninterface SpecContent {\n frontmatter: SpecFrontmatter;\n content: string;\n rawContent: string;\n path: string;\n name: string;\n fullPath?: string; // Full absolute path to spec directory for sub-spec loading\n}\n\nexport interface ViewOptions {\n raw?: boolean;\n json?: boolean;\n noColor?: boolean;\n}\n\n/**\n * Read and parse a spec by path/name/number\n * Supports sub-spec files like: \"045/DESIGN.md\" or \"045-dashboard/TESTING.md\"\n */\nexport async function readSpecContent(\n specPath: string,\n cwd: string = process.cwd()\n): Promise<SpecContent | null> {\n const config = await loadConfig(cwd);\n const specsDir = path.join(cwd, config.specsDir);\n\n // Check if specPath includes a sub-file (e.g., \"045/DESIGN.md\" or \"045-dashboard/TESTING.md\")\n let resolvedPath: string | null = null;\n let targetFile: string | null = null;\n \n // Split path to check for sub-file\n const pathParts = specPath.split('/').filter(p => p);\n \n if (pathParts.length > 1 && pathParts[pathParts.length - 1].endsWith('.md')) {\n // Last part looks like a file, try to resolve the directory\n const specPart = pathParts.slice(0, -1).join('/');\n const filePart = pathParts[pathParts.length - 1];\n \n resolvedPath = await resolveSpecPath(specPart, cwd, specsDir);\n if (resolvedPath) {\n targetFile = path.join(resolvedPath, filePart);\n \n // Verify the sub-file exists\n try {\n await fs.access(targetFile);\n } catch {\n // Sub-file doesn't exist\n return null;\n }\n }\n }\n \n // If no sub-file detected or resolution failed, try normal spec resolution\n if (!resolvedPath) {\n resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n return null;\n }\n\n // Get the default spec file (README.md)\n targetFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n \n if (!targetFile) {\n return null;\n }\n }\n\n // Ensure targetFile is not null before proceeding\n if (!targetFile) {\n return null;\n }\n\n // Read file content\n const rawContent = await fs.readFile(targetFile, 'utf-8');\n const fileName = path.basename(targetFile);\n const isSubSpec = fileName !== config.structure.defaultFile;\n\n // Parse frontmatter (only exists in main spec file)\n let frontmatter: SpecFrontmatter | null = null;\n \n if (!isSubSpec) {\n frontmatter = await parseFrontmatter(targetFile, config);\n if (!frontmatter) {\n return null;\n }\n } else {\n // Sub-spec files don't have frontmatter, load from main spec\n const mainSpecFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n if (mainSpecFile) {\n frontmatter = await parseFrontmatter(mainSpecFile, config);\n }\n \n // If we still can't get frontmatter, create a minimal one\n if (!frontmatter) {\n frontmatter = {\n status: 'planned',\n created: new Date().toISOString().split('T')[0],\n };\n }\n }\n\n // Extract content without frontmatter (if present)\n const lines = rawContent.split('\\n');\n let contentStartIndex = 0;\n \n // Skip frontmatter if present (only in main spec)\n if (!isSubSpec && lines[0] === '---') {\n const closingIndex = lines.findIndex((line, i) => i > 0 && line === '---');\n if (closingIndex > 0) {\n contentStartIndex = closingIndex + 1;\n }\n }\n \n const content = lines.slice(contentStartIndex).join('\\n').trim();\n const specName = path.basename(resolvedPath);\n const displayName = isSubSpec ? `${specName}/${fileName}` : specName;\n\n return {\n frontmatter,\n content,\n rawContent,\n path: resolvedPath,\n name: displayName,\n fullPath: resolvedPath, // Add fullPath for sub-spec loading\n };\n}\n\n/**\n * Format frontmatter for display\n */\nfunction formatFrontmatter(frontmatter: SpecFrontmatter): string {\n const lines: string[] = [];\n \n // Status with emoji\n const statusEmojis = {\n planned: '📅',\n 'in-progress': '🔨',\n complete: '✅',\n blocked: '🚫',\n cancelled: '❌',\n archived: '📦',\n };\n const statusEmoji = statusEmojis[frontmatter.status] || '📄';\n lines.push(chalk.bold(`${statusEmoji} Status: `) + chalk.cyan(frontmatter.status));\n\n // Priority with emoji\n if (frontmatter.priority) {\n const priorityEmojis = {\n low: '🟢',\n medium: '🟠',\n high: '🟡',\n critical: '🔴',\n };\n const priorityEmoji = priorityEmojis[frontmatter.priority] || '';\n lines.push(chalk.bold(`${priorityEmoji} Priority: `) + chalk.yellow(frontmatter.priority));\n }\n\n // Created date\n if (frontmatter.created) {\n lines.push(chalk.bold('📆 Created: ') + chalk.gray(String(frontmatter.created)));\n }\n\n // Tags\n if (frontmatter.tags && frontmatter.tags.length > 0) {\n const tagStr = frontmatter.tags.map(tag => chalk.blue(`#${tag}`)).join(' ');\n lines.push(chalk.bold('🏷️ Tags: ') + tagStr);\n }\n\n // Assignee\n if (frontmatter.assignee) {\n lines.push(chalk.bold('👤 Assignee: ') + chalk.green(frontmatter.assignee));\n }\n\n // Custom fields\n const standardFields = ['status', 'priority', 'created', 'tags', 'assignee'];\n const customFields = Object.entries(frontmatter)\n .filter(([key]) => !standardFields.includes(key))\n .filter(([_, value]) => value !== undefined && value !== null);\n\n if (customFields.length > 0) {\n lines.push('');\n lines.push(chalk.bold('Custom Fields:'));\n for (const [key, value] of customFields) {\n lines.push(` ${chalk.gray(key)}: ${chalk.white(String(value))}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Display spec with formatted output\n */\nfunction displayFormattedSpec(spec: SpecContent): string {\n const output: string[] = [];\n \n // Header\n output.push('');\n output.push(chalk.bold.cyan(`━━━ ${spec.name} ━━━`));\n output.push('');\n \n // Frontmatter\n output.push(formatFrontmatter(spec.frontmatter));\n output.push('');\n output.push(chalk.gray('─'.repeat(60)));\n output.push('');\n \n return output.join('\\n');\n}\n\nexport function viewCommand(): Command;\nexport function viewCommand(specPath: string, options?: ViewOptions): Promise<void>;\nexport function viewCommand(specPath?: string, options: ViewOptions = {}): Command | Promise<void> {\n if (typeof specPath === 'string') {\n return viewSpec(specPath, options);\n }\n\n return new Command('view')\n .description('View spec content (supports sub-specs like \"045/DESIGN.md\")')\n .argument('<spec>', 'Spec to view')\n .option('--raw', 'Output raw markdown (for piping/scripting)')\n .option('--json', 'Output as JSON')\n .option('--no-color', 'Disable colors')\n .action(async (target: string, opts: { raw?: boolean; json?: boolean; color?: boolean }) => {\n try {\n await viewSpec(target, {\n raw: opts.raw,\n json: opts.json,\n noColor: opts.color === false,\n });\n } catch (error) {\n console.error('\\x1b[31mError:\\x1b[0m', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n/**\n * lean-spec view <spec-name>\n * Display spec with rendered markdown, or output raw/json\n */\nexport async function viewSpec(\n specPath: string,\n options: ViewOptions = {}\n): Promise<void> {\n const spec = await readSpecContent(specPath, process.cwd());\n \n if (!spec) {\n throw new Error(`Spec not found: ${specPath}. Try: lean-spec list`);\n }\n\n // Handle JSON output\n if (options.json) {\n const jsonOutput = {\n name: spec.name,\n path: spec.path,\n frontmatter: spec.frontmatter,\n content: spec.content,\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Handle raw markdown output\n if (options.raw) {\n console.log(spec.rawContent);\n return;\n }\n\n // Default: Display formatted header and frontmatter\n console.log(displayFormattedSpec(spec));\n \n // Render markdown content\n const rendered = await marked(spec.content);\n console.log(rendered);\n}\n\n/**\n * Open command - open spec in editor\n */\nexport interface OpenOptions {\n editor?: string;\n}\n\nexport function openCommand(): Command;\nexport function openCommand(specPath: string, options?: OpenOptions): Promise<void>;\nexport function openCommand(specPath?: string, options: OpenOptions = {}): Command | Promise<void> {\n if (typeof specPath === 'string') {\n return openSpec(specPath, options);\n }\n\n return new Command('open')\n .description('Open spec in editor')\n .argument('<spec>', 'Spec to open')\n .option('--editor <editor>', 'Specify editor command')\n .action(async (target: string, opts: OpenOptions) => {\n try {\n await openSpec(target, {\n editor: opts.editor,\n });\n } catch (error) {\n console.error('\\x1b[31mError:\\x1b[0m', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n/**\n * lean-spec open <spec-name>\n * Open spec in editor\n */\nexport async function openSpec(\n specPath: string,\n options: OpenOptions = {}\n): Promise<void> {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n const specsDir = path.join(cwd, config.specsDir);\n\n // Check if specPath includes a sub-file\n let resolvedPath: string | null = null;\n let targetFile: string | null = null;\n \n const pathParts = specPath.split('/').filter(p => p);\n \n if (pathParts.length > 1 && pathParts[pathParts.length - 1].endsWith('.md')) {\n // Last part looks like a file\n const specPart = pathParts.slice(0, -1).join('/');\n const filePart = pathParts[pathParts.length - 1];\n \n resolvedPath = await resolveSpecPath(specPart, cwd, specsDir);\n if (resolvedPath) {\n targetFile = path.join(resolvedPath, filePart);\n \n // Verify the sub-file exists\n try {\n await fs.access(targetFile);\n } catch {\n targetFile = null;\n }\n }\n }\n \n // If no sub-file detected, use default file\n if (!resolvedPath) {\n resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n\n targetFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n \n if (!targetFile) {\n throw new Error(`Spec file not found in: ${resolvedPath}`);\n }\n } else if (!targetFile) {\n throw new Error(`Sub-spec file not found: ${specPath}`);\n }\n \n const specFile = targetFile;\n\n // Determine editor\n let editor = options.editor;\n \n if (!editor) {\n // Check environment variables\n editor = process.env.VISUAL || process.env.EDITOR;\n }\n\n if (!editor) {\n // Fall back to system defaults\n const platform = process.platform;\n if (platform === 'darwin') {\n editor = 'open';\n } else if (platform === 'win32') {\n editor = 'start';\n } else {\n editor = 'xdg-open';\n }\n }\n\n console.log(chalk.gray(`Opening ${targetFile} with ${editor}...`));\n\n // Spawn editor process - wrap in promise to handle errors properly\n const child = spawn(editor, [targetFile], {\n stdio: 'inherit',\n shell: true,\n });\n\n // Don't wait for editor to close for GUI editors\n const guiEditors = ['open', 'start', 'xdg-open', 'code', 'atom', 'subl'];\n const editorCommand = editor.trim().split(' ')[0];\n if (editorCommand && guiEditors.includes(editorCommand)) {\n // For GUI editors, handle spawn errors but don't wait for close\n return new Promise<void>((resolve, reject) => {\n child.on('error', (error) => {\n reject(new Error(`Error opening editor: ${error.message}`));\n });\n // Resolve immediately after spawn for GUI editors\n child.unref();\n resolve();\n });\n } else {\n // Wait for terminal editors\n return new Promise<void>((resolve, reject) => {\n child.on('error', (error) => {\n reject(new Error(`Error opening editor: ${error.message}`));\n });\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Editor exited with code ${code}`));\n }\n });\n });\n }\n}\n\n","/**\n * MCP Server Command\n * \n * Starts the LeanSpec MCP (Model Context Protocol) server for integration\n * with AI assistants like Claude Desktop, Cline, and other MCP clients.\n */\n\nimport { Command } from 'commander';\nimport { createMcpServer } from '../mcp-server.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\n/**\n * MCP command - start MCP server\n */\nexport function mcpCommand(): Command {\n return new Command('mcp')\n .description('Start MCP server for AI assistants (Claude Desktop, Cline, etc.)')\n .action(async () => {\n await startMcpServer();\n });\n}\n\nexport async function startMcpServer(): Promise<void> {\n try {\n const server = await createMcpServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n // Log to stderr so it doesn't interfere with MCP protocol on stdout\n console.error('LeanSpec MCP Server started successfully');\n } catch (error) {\n console.error('Failed to start LeanSpec MCP Server:', error);\n process.exit(1);\n }\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type PackageManager = 'pnpm' | 'yarn' | 'npm';\n\nexport function detectPackageManager(baseDir: string = process.cwd()): PackageManager {\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) {\n return 'pnpm';\n }\n\n if (userAgent.includes('yarn')) {\n return 'yarn';\n }\n\n if (userAgent.includes('npm')) {\n return 'npm';\n }\n\n if (existsSync(join(baseDir, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n\n if (existsSync(join(baseDir, 'yarn.lock'))) {\n return 'yarn';\n }\n\n if (existsSync(join(baseDir, 'package-lock.json'))) {\n return 'npm';\n }\n\n return 'npm';\n}\n","import { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { loadConfig } from '../config.js';\nimport { detectPackageManager, PackageManager } from '../utils/package-manager.js';\n\n/**\n * UI command - start local web UI for spec management\n */\nexport function uiCommand(): Command {\n return new Command('ui')\n .description('Start local web UI for spec management')\n .option('-s, --specs <dir>', 'Specs directory (auto-detected if not specified)')\n .option('-p, --port <port>', 'Port to run on', '3000')\n .option('--no-open', \"Don't open browser automatically\")\n .option('--multi-project', 'Enable multi-project mode')\n .option('--add-project <path>', 'Add a project to multi-project registry')\n .option('--discover <path>', 'Discover LeanSpec projects in directory tree')\n .option('--dev', 'Run in development mode (only works in LeanSpec monorepo)')\n .option('--dry-run', 'Show what would run without executing')\n .action(async (options: {\n specs?: string;\n port: string;\n open: boolean;\n multiProject?: boolean;\n addProject?: string;\n discover?: string;\n dev?: boolean;\n dryRun?: boolean;\n }) => {\n try {\n await startUi(options);\n } catch (error) {\n // Error message already printed, just exit\n process.exit(1);\n }\n });\n}\n\n/**\n * Start the web UI\n */\nexport async function startUi(options: {\n specs?: string;\n port: string;\n open: boolean;\n multiProject?: boolean;\n addProject?: string;\n discover?: string;\n dev?: boolean;\n dryRun?: boolean;\n}): Promise<void> {\n // Validate port\n const portNum = parseInt(options.port, 10);\n if (isNaN(portNum) || portNum < 1 || portNum > 65535) {\n console.error(chalk.red(`✗ Invalid port number: ${options.port}`));\n console.log(chalk.dim('Port must be between 1 and 65535'));\n throw new Error(`Invalid port: ${options.port}`);\n }\n\n const cwd = process.cwd();\n\n // Determine mode based on flags\n const specsMode = options.multiProject ? 'multi-project' : 'filesystem';\n\n // Determine specs directory (only for single-project mode)\n let specsDir: string = '';\n if (!options.multiProject) {\n if (options.specs) {\n specsDir = resolve(cwd, options.specs);\n } else {\n // Auto-detect from config\n const config = await loadConfig(cwd);\n specsDir = join(cwd, config.specsDir);\n }\n\n // Verify specs directory exists\n if (!existsSync(specsDir)) {\n console.error(chalk.red(`✗ Specs directory not found: ${specsDir}`));\n console.log(chalk.dim('\\nRun `lean-spec init` to initialize LeanSpec in this directory.'));\n throw new Error(`Specs directory not found: ${specsDir}`);\n }\n } else {\n console.log(chalk.cyan('→ Multi-project mode enabled'));\n \n // Handle --add-project flag\n if (options.addProject) {\n console.log(chalk.dim(` Adding project: ${options.addProject}`));\n // The project will be added via API after UI starts\n }\n \n // Handle --discover flag\n if (options.discover) {\n console.log(chalk.dim(` Will discover projects in: ${options.discover}`));\n // Projects will be discovered via API after UI starts\n }\n }\n\n // Check if --dev flag is set and we're in LeanSpec monorepo\n if (options.dev) {\n const isLeanSpecMonorepo = checkIsLeanSpecMonorepo(cwd);\n if (!isLeanSpecMonorepo) {\n console.error(chalk.red(`✗ Development mode only works in the LeanSpec monorepo`));\n console.log(chalk.dim('Remove --dev flag to use production mode'));\n throw new Error('Not in LeanSpec monorepo');\n }\n const localUiDir = join(cwd, 'packages/ui');\n return runLocalWeb(localUiDir, specsDir, specsMode, options);\n }\n\n // Production mode: use published @leanspec/ui\n return runPublishedUI(cwd, specsDir, specsMode, options);\n}\n\n/**\n * Check if we're in the LeanSpec monorepo\n * \n * This is more specific than just checking for packages/ui to avoid\n * false positives in other projects with similar structure.\n */\nfunction checkIsLeanSpecMonorepo(cwd: string): boolean {\n // Check for LeanSpec-specific markers\n const localUiDir = join(cwd, 'packages/ui');\n const uiPackageJson = join(localUiDir, 'package.json');\n \n if (!existsSync(uiPackageJson)) {\n return false;\n }\n \n try {\n const packageJson = JSON.parse(readFileSync(uiPackageJson, 'utf-8'));\n // Check if it's the @leanspec/ui package\n return packageJson.name === '@leanspec/ui';\n } catch {\n return false;\n }\n}\n\n/**\n * Run local ui package (monorepo dev mode)\n * \n * Spawns the ui dev server as a child process with appropriate environment\n * variables. Only works within the LeanSpec monorepo structure.\n * \n * @param uiDir - Absolute path to packages/ui directory\n * @param specsDir - Absolute path to specs directory\n * @param options - Command options including port, open, and dryRun flags\n * @throws {Error} If server fails to start\n */\nasync function runLocalWeb(\n uiDir: string,\n specsDir: string,\n specsMode: string,\n options: {\n port: string;\n open: boolean;\n multiProject?: boolean;\n addProject?: string;\n discover?: string;\n dev?: boolean;\n dryRun?: boolean;\n }\n): Promise<void> {\n console.log(chalk.dim('→ Detected LeanSpec monorepo, using local ui package\\n'));\n\n const repoRoot = resolve(uiDir, '..', '..');\n const packageManager = detectPackageManager(repoRoot);\n\n if (options.dryRun) {\n console.log(chalk.cyan('Would run:'));\n console.log(chalk.dim(` cd ${uiDir}`));\n\n console.log(chalk.dim(` SPECS_MODE=${specsMode} SPECS_DIR=${specsDir} PORT=${options.port} ${packageManager} run dev`));\n if (options.open) {\n console.log(chalk.dim(` open http://localhost:${options.port}`));\n }\n return;\n }\n\n const spinner = ora('Starting web UI...').start();\n\n // Set environment variables for the web server\n const env = {\n ...process.env,\n SPECS_MODE: specsMode,\n SPECS_DIR: specsDir || '',\n PORT: options.port,\n };\n\n const child = spawn(packageManager, ['run', 'dev'], {\n cwd: uiDir,\n stdio: 'inherit',\n env,\n detached: true,\n });\n\n // Wait for server to be ready\n const readyTimeout = setTimeout(async () => {\n spinner.succeed('Web UI running');\n console.log(chalk.green(`\\n✨ LeanSpec UI: http://localhost:${options.port}\\n`));\n \n if (options.multiProject) {\n console.log(chalk.cyan('Multi-project mode is active'));\n \n // Handle addProject\n if (options.addProject) {\n try {\n const res = await fetch(`http://localhost:${options.port}/api/projects`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: options.addProject }),\n });\n if (res.ok) {\n console.log(chalk.green(` ✓ Added project: ${options.addProject}`));\n } else {\n console.error(chalk.red(` ✗ Failed to add project: ${options.addProject}`));\n }\n } catch (e) {\n console.error(chalk.red(` ✗ Failed to connect to server for adding project`));\n }\n }\n\n // Handle discover\n if (options.discover) {\n console.log(chalk.dim(` Discovering projects in: ${options.discover}...`));\n try {\n const res = await fetch(`http://localhost:${options.port}/api/local-projects/discover`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: options.discover }),\n });\n \n if (res.ok) {\n const data = await res.json() as any;\n const discovered = data.discovered || [];\n console.log(chalk.green(` ✓ Found ${discovered.length} projects`));\n \n // Add discovered projects\n for (const p of discovered) {\n const addRes = await fetch(`http://localhost:${options.port}/api/projects`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: p.path }),\n });\n if (addRes.ok) {\n console.log(chalk.dim(` + Added: ${p.name} (${p.path})`));\n }\n }\n } else {\n console.error(chalk.red(` ✗ Failed to discover projects`));\n }\n } catch (e) {\n console.error(chalk.red(` ✗ Failed to connect to server for discovery`));\n }\n }\n }\n\n console.log(chalk.dim('\\nPress Ctrl+C to stop\\n'));\n\n if (options.open) {\n try {\n // Dynamic import of open package\n const openModule = await import('open');\n const open = openModule.default;\n await open(`http://localhost:${options.port}`);\n } catch (error) {\n // If open package not available, just show the URL\n console.log(chalk.yellow('⚠ Could not open browser automatically'));\n console.log(chalk.dim('Please visit the URL above manually\\n'));\n console.error(chalk.dim(`Debug: ${error instanceof Error ? error.message : String(error)}`));\n }\n }\n }, 3000);\n\n // Handle shutdown gracefully (forward signals to child process group)\n const shutdown = (signal?: NodeJS.Signals) => {\n clearTimeout(readyTimeout);\n spinner.stop();\n try {\n if (child && child.pid) {\n // Try killing the whole process group (POSIX)\n try {\n process.kill(-child.pid, signal ?? 'SIGTERM');\n } catch (err) {\n // Fallback to killing the child directly\n child.kill(signal ?? 'SIGTERM');\n }\n }\n } catch (err) {\n // ignore failures to kill\n }\n\n console.log(chalk.dim('\\n✓ Web UI stopped'));\n // Ensure we exit after cleanup\n process.exit(0);\n };\n\n process.once('SIGINT', () => shutdown('SIGINT'));\n process.once('SIGTERM', () => shutdown('SIGTERM'));\n process.once('SIGHUP', () => shutdown('SIGHUP'));\n\n // If stdin closes (Ctrl+D) treat it as an exit request\n if (process.stdin && !process.stdin.destroyed) {\n process.stdin.once('end', () => shutdown('SIGTERM'));\n }\n\n // Handle child process exit\n child.on('exit', (code) => {\n clearTimeout(readyTimeout);\n spinner.stop();\n if (code !== 0 && code !== null) {\n spinner.fail('Web UI failed to start');\n console.error(chalk.red(`\\nProcess exited with code ${code}`));\n process.exit(code);\n }\n // If child exited cleanly, exit too\n process.exit(0);\n });\n}\n\nasync function runPublishedUI(\n cwd: string,\n specsDir: string,\n specsMode: string,\n options: {\n port: string;\n open: boolean;\n multiProject?: boolean;\n addProject?: string;\n discover?: string;\n dev?: boolean;\n dryRun?: boolean;\n }\n): Promise<void> {\n console.log(chalk.dim('→ Using published @leanspec/ui package\\n'));\n\n const packageManager = detectPackageManager(cwd);\n const { command, args, preview } = buildUiRunner(packageManager, specsDir, specsMode, options.port, options.open, options.multiProject);\n\n if (options.dryRun) {\n console.log(chalk.cyan('Would run:'));\n console.log(chalk.dim(` ${preview}`));\n return;\n }\n\n const child = spawn(command, args, {\n stdio: 'inherit',\n env: process.env,\n detached: true,\n });\n\n const shutdownPublished = (signal?: NodeJS.Signals) => {\n try {\n if (child && child.pid) {\n try {\n process.kill(-child.pid, signal ?? 'SIGINT');\n } catch (err) {\n child.kill(signal ?? 'SIGINT');\n }\n }\n } catch (err) {\n // ignore\n }\n console.log(chalk.dim('\\n✓ Web UI stopped'));\n process.exit(0);\n };\n\n process.once('SIGINT', () => shutdownPublished('SIGINT'));\n process.once('SIGTERM', () => shutdownPublished('SIGTERM'));\n process.once('SIGHUP', () => shutdownPublished('SIGHUP'));\n if (process.stdin && !process.stdin.destroyed) {\n process.stdin.once('end', () => shutdownPublished('SIGTERM'));\n }\n\n child.on('exit', (code) => {\n if (code === 0 || code === null) {\n process.exit(0);\n return;\n }\n console.error(chalk.red(`\\n@leanspec/ui exited with code ${code}`));\n console.log(chalk.dim('Make sure npm can download @leanspec/ui (https://www.npmjs.com/package/@leanspec/ui).'));\n process.exit(code);\n });\n\n child.on('error', (error) => {\n console.error(chalk.red(`Failed to launch @leanspec/ui: ${error instanceof Error ? error.message : String(error)}`));\n console.log(chalk.dim('You can also run it manually with `npx @leanspec/ui --specs <dir>`'));\n process.exit(1);\n });\n}\n\nfunction buildUiRunner(\n packageManager: PackageManager,\n specsDir: string,\n specsMode: string,\n port: string,\n openBrowser: boolean,\n multiProject?: boolean\n): { command: string; args: string[]; preview: string } {\n const uiArgs = ['@leanspec/ui'];\n \n if (!multiProject) {\n uiArgs.push('--specs', specsDir);\n } else {\n uiArgs.push('--multi-project');\n }\n \n uiArgs.push('--port', port);\n \n if (!openBrowser) {\n uiArgs.push('--no-open');\n }\n\n if (packageManager === 'pnpm') {\n const args = ['dlx', ...uiArgs];\n return { command: 'pnpm', args, preview: `pnpm ${args.join(' ')}` };\n }\n\n if (packageManager === 'yarn') {\n const args = ['dlx', ...uiArgs];\n return { command: 'yarn', args, preview: `yarn ${args.join(' ')}` };\n }\n\n const args = ['--yes', ...uiArgs];\n return { command: 'npx', args, preview: `npx ${args.join(' ')}` };\n}\n","/**\n * Archive tool - Move a spec to archived directory\n */\n\nimport { z } from 'zod';\nimport { archiveSpec } from '../../commands/index.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Archive tool definition\n */\nexport function archiveTool(): ToolDefinition {\n return [\n 'archive',\n {\n title: 'Archive Spec',\n description: 'Move a specification to the archived/ directory. Use this when a spec is complete or no longer active. The spec will be moved but not deleted.',\n inputSchema: {\n specPath: z.string().describe('The spec to archive. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), or full folder name (e.g., \"045-unified-dashboard\").'),\n },\n outputSchema: {\n success: z.boolean(),\n message: z.string(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await archiveSpec(input.specPath);\n\n const output = {\n success: true,\n message: `Spec archived successfully`,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error archiving spec', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n","/**\n * Backfill tool - Backfill missing timestamps from git history\n */\n\nimport { z } from 'zod';\nimport { backfillTimestamps } from '../../commands/index.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Backfill tool definition\n */\nexport function backfillTool(): ToolDefinition {\n return [\n 'backfill',\n {\n title: 'Backfill Timestamps',\n description: 'Backfill missing timestamps and metadata from git history. Use this to populate created/completed dates, assignees, or status transitions for specs that lack this data.',\n inputSchema: {\n specs: z.array(z.string()).optional().describe('Specific specs to backfill. If omitted, processes all specs.'),\n dryRun: z.boolean().optional().describe('Preview changes without applying them (default: false).'),\n force: z.boolean().optional().describe('Overwrite existing timestamp values (default: false).'),\n includeAssignee: z.boolean().optional().describe('Backfill assignee from first commit author (default: false).'),\n includeTransitions: z.boolean().optional().describe('Include full status transition history (default: false).'),\n },\n outputSchema: {\n success: z.boolean(),\n updated: z.array(z.string()).optional(),\n message: z.string(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n const originalError = console.error;\n try {\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n console.error = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await backfillTimestamps({\n specs: input.specs,\n dryRun: input.dryRun,\n force: input.force,\n includeAssignee: input.includeAssignee,\n includeTransitions: input.includeTransitions,\n });\n\n // Parse output to extract updated specs\n const updated = capturedOutput\n .split('\\n')\n .filter((l: string) => l.includes('Updated:') || l.includes('✓'))\n .map((l: string) => l.replace(/.*Updated:\\s*/, '').replace(/✓\\s*/, '').trim())\n .filter(Boolean);\n\n const output = {\n success: true,\n updated: updated.length > 0 ? updated : undefined,\n message: input.dryRun \n ? `Dry run complete. ${updated.length} specs would be updated`\n : `Backfill complete. ${updated.length} specs updated`,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error backfilling timestamps', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n }\n ];\n}\n","/**\n * Board tool - Get Kanban board view\n */\n\nimport { z } from 'zod';\nimport { loadAllSpecs } from '../../spec-loader.js';\nimport { formatErrorMessage, specToData, getStaleSpecs } from '../helpers.js';\nimport type { ToolDefinition, BoardData } from '../types.js';\n\n/**\n * Get Kanban board view\n */\nexport async function getBoardData(): Promise<BoardData> {\n const specs = await loadAllSpecs({\n includeArchived: false,\n });\n\n const columns: BoardData['columns'] = {\n planned: [],\n 'in-progress': [],\n complete: [],\n archived: [],\n };\n\n for (const spec of specs) {\n columns[spec.frontmatter.status].push(specToData(spec));\n }\n\n return { columns };\n}\n\n/**\n * Board tool definition\n */\nexport function boardTool(): ToolDefinition {\n return [\n 'board',\n {\n title: 'Get Kanban Board',\n description: 'Get Kanban board view of all specs organized by status. Use this to visualize workflow, see what\\'s in progress, or identify bottlenecks. Returns specs grouped into planned/in-progress/complete/archived columns.',\n inputSchema: {},\n outputSchema: {\n board: z.any(),\n warnings: z.array(z.string()).optional(),\n },\n },\n async (_input, _extra) => {\n try {\n const board = await getBoardData();\n \n // Check for stale specs (in-progress for > 7 days)\n const staleSpecs = getStaleSpecs(board);\n const warnings: string[] = [];\n \n if (staleSpecs.length > 0) {\n for (const spec of staleSpecs) {\n warnings.push(`⚠️ Spec \"${spec.name}\" has been in-progress for ${spec.daysStale} days. Consider updating status.`);\n }\n }\n \n const output = { \n board,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n \n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error getting board', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Check tool - Check for sequence number conflicts\n */\n\nimport { z } from 'zod';\nimport { checkSpecs } from '../../commands/index.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Check tool definition\n */\nexport function checkTool(): ToolDefinition {\n return [\n 'check',\n {\n title: 'Check Sequence Conflicts',\n description: 'Check for sequence number conflicts in the specs directory. Use this to detect duplicate sequence numbers or naming issues. Returns list of conflicts if any.',\n inputSchema: {},\n outputSchema: {\n hasConflicts: z.boolean(),\n conflicts: z.array(z.any()).optional(),\n message: z.string(),\n },\n },\n async (_input, _extra) => {\n const originalLog = console.log;\n const originalError = console.error;\n try {\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n console.error = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n const hasNoConflicts = await checkSpecs({ quiet: false });\n\n const output = {\n hasConflicts: !hasNoConflicts,\n message: hasNoConflicts ? 'No sequence conflicts found' : 'Sequence conflicts detected',\n conflicts: !hasNoConflicts ? capturedOutput.split('\\n').filter(l => l.trim()) : undefined,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error checking specs', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n }\n ];\n}\n","/**\n * Create tool - Create a new specification\n */\n\nimport { z } from 'zod';\nimport { createSpec } from '../../commands/index.js';\nimport type { SpecPriority } from '../../frontmatter.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Create tool definition\n */\nexport function createTool(): ToolDefinition {\n return [\n 'create',\n {\n title: 'Create Spec',\n description: 'Create a new specification for a feature, design, or project. Use this when starting new work that needs documentation. The system auto-generates the sequence number.',\n inputSchema: {\n name: z.string().describe('The spec name/slug only (e.g., \"unified-dashboard\"). Do NOT include sequence numbers like \"045-\". The system automatically prepends the next sequence number.'),\n title: z.string().optional().describe('Human-readable title for the spec. If omitted, the name is used as the title.'),\n description: z.string().optional().describe('Initial description text to add to the Overview section.'),\n tags: z.array(z.string()).optional().describe('Tags to categorize the spec (e.g., [\"api\", \"frontend\", \"v2.0\"]).'),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Priority level for the spec. Defaults to \"medium\" if not specified.'),\n assignee: z.string().optional().describe('Person responsible for this spec.'),\n template: z.string().optional().describe('Template name to use (e.g., \"minimal\", \"enterprise\"). Uses default template if omitted.'),\n dependsOn: z.array(z.string()).optional().describe('Specs this depends on (e.g., [\"045-api-design\", \"046-database\"]). Creates upstream dependencies.'),\n related: z.array(z.string()).optional().describe('Related specs (e.g., [\"047-frontend\"]). Creates bidirectional relationships.'),\n },\n outputSchema: {\n success: z.boolean(),\n path: z.string(),\n message: z.string(),\n reminder: z.string().optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n // Capture output\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await createSpec(input.name, {\n title: input.title,\n description: input.description,\n tags: input.tags,\n priority: input.priority as SpecPriority | undefined,\n assignee: input.assignee,\n template: input.template,\n dependsOn: input.dependsOn,\n related: input.related,\n });\n\n const output = {\n success: true,\n path: capturedOutput.includes('Created:') ? capturedOutput.split('Created:')[1].split('\\n')[0].trim() : '',\n message: `Spec '${input.name}' created successfully`,\n reminder: \"💡 Remember to update status to 'in-progress' when you start implementing! Use: update tool with status='in-progress'\",\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const output = {\n success: false,\n path: '',\n message: formatErrorMessage('Error creating spec', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n","/**\n * Deps tool - Analyze spec dependencies\n */\n\nimport { z } from 'zod';\nimport { formatErrorMessage } from '../helpers.js';\nimport { loadAllSpecs } from '../../spec-loader.js';\nimport { resolveSpecPath } from '../../utils/path-helpers.js';\nimport { loadConfig } from '../../config.js';\nimport { SpecDependencyGraph } from '@leanspec/core';\nimport type { ToolDefinition } from '../types.js';\nimport * as path from 'node:path';\n\n/**\n * Get spec dependencies using the complete dependency graph\n */\nexport async function getDepsData(specPath: string, mode: string = 'complete'): Promise<any> {\n // Resolve spec path\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n \n // Load all specs and build dependency graph\n const allSpecs = await loadAllSpecs({ includeArchived: true });\n const graph = new SpecDependencyGraph(allSpecs);\n \n // Get dependency information based on mode\n const spec = allSpecs.find(s => s.path === resolvedPath);\n if (!spec) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n \n if (mode === 'complete') {\n const completeGraph = graph.getCompleteGraph(spec.path);\n return {\n spec: {\n path: completeGraph.current.path,\n status: completeGraph.current.frontmatter.status,\n priority: completeGraph.current.frontmatter.priority,\n },\n dependsOn: completeGraph.dependsOn.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n requiredBy: completeGraph.requiredBy.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n related: completeGraph.related.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n };\n } else if (mode === 'upstream') {\n const upstream = graph.getUpstream(spec.path, 3);\n return {\n spec: {\n path: spec.path,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n },\n dependsOn: upstream.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n };\n } else if (mode === 'downstream') {\n const downstream = graph.getDownstream(spec.path, 3);\n return {\n spec: {\n path: spec.path,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n },\n requiredBy: downstream.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n };\n } else if (mode === 'impact') {\n const impact = graph.getImpactRadius(spec.path, 3);\n return {\n spec: {\n path: impact.current.path,\n status: impact.current.frontmatter.status,\n priority: impact.current.frontmatter.priority,\n },\n upstream: impact.upstream.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n downstream: impact.downstream.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n related: impact.related.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n total: impact.upstream.length + impact.downstream.length + impact.related.length,\n };\n }\n \n // Default to complete\n return getDepsData(specPath, 'complete');\n}\n\n/**\n * Deps tool definition\n */\nexport function depsTool(): ToolDefinition {\n return [\n 'deps',\n {\n title: 'Get Dependencies',\n description: 'Analyze complete spec dependency graph (upstream, downstream, bidirectional). Shows which specs this depends on (dependsOn), which depend on this spec (requiredBy), and related work (related). Use this to understand impact of changes and work order.',\n inputSchema: {\n specPath: z.string().describe('The spec to analyze. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), or full folder name (e.g., \"045-unified-dashboard\").'),\n mode: z.enum(['complete', 'upstream', 'downstream', 'impact']).optional().describe('View mode: complete (all relationships), upstream (dependencies only), downstream (dependents only), impact (full impact radius with summary). Defaults to complete.'),\n },\n outputSchema: {\n dependencies: z.any(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n const mode = input.mode || 'complete';\n const deps = await getDepsData(input.specPath, mode);\n const output = { dependencies: deps, mode };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error getting dependencies', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Files tool - List all files in a specification directory\n */\n\nimport { z } from 'zod';\nimport { showFiles } from '../../commands/files.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Files tool definition\n */\nexport function filesTool(): ToolDefinition {\n return [\n 'files',\n {\n title: 'List Spec Files',\n description: 'List all files in a specification directory. Use this to explore sub-specs, assets, or supplementary documentation in complex specs.',\n inputSchema: {\n specPath: z.string().describe('The spec to list files for. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), or full folder name (e.g., \"045-unified-dashboard\").'),\n type: z.enum(['docs', 'assets']).optional().describe('Filter by file type: \"docs\" for markdown files, \"assets\" for images/diagrams.'),\n },\n outputSchema: {\n files: z.array(z.any()),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n const originalError = console.error;\n try {\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n console.error = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await showFiles(input.specPath, {\n type: input.type as 'docs' | 'assets' | undefined,\n tree: false,\n });\n\n // Parse the captured output to extract file list\n const lines = capturedOutput.split('\\n').filter((l: string) => l.trim());\n const files = lines\n .filter((l: string) => l.includes('├──') || l.includes('└──') || l.match(/^\\s*[-•]/))\n .map((l: string) => l.replace(/[├└│─•-]\\s*/g, '').trim());\n\n const output = { files };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error listing files', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n }\n ];\n}\n","/**\n * List tool - List all specifications with optional filtering\n */\n\nimport { z } from 'zod';\nimport { loadAllSpecs } from '../../spec-loader.js';\nimport type { SpecStatus, SpecPriority, SpecFilterOptions } from '../../frontmatter.js';\nimport { formatErrorMessage, specToData, loadSubSpecMetadata, getStaleSpecs } from '../helpers.js';\nimport type { ToolDefinition, SpecData, BoardData } from '../types.js';\n\n/**\n * List specs with optional filtering\n */\nexport async function listSpecsData(options: {\n status?: SpecStatus | SpecStatus[];\n tags?: string[];\n priority?: SpecPriority | SpecPriority[];\n assignee?: string;\n customFields?: Record<string, unknown>;\n includeArchived?: boolean;\n}): Promise<SpecData[]> {\n const filter: SpecFilterOptions = {};\n if (options.status) filter.status = options.status;\n if (options.tags) filter.tags = options.tags;\n if (options.priority) filter.priority = options.priority;\n if (options.assignee) filter.assignee = options.assignee;\n if (options.customFields) filter.customFields = options.customFields;\n\n const specs = await loadAllSpecs({\n includeArchived: options.includeArchived || false,\n filter,\n });\n\n // Convert specs to data and add sub-spec metadata\n const specsData = await Promise.all(\n specs.map(async (spec) => {\n const data = specToData(spec);\n \n // Load sub-spec metadata for progressive disclosure\n const subSpecs = await loadSubSpecMetadata(spec.fullPath);\n if (subSpecs.length > 0) {\n data.subSpecs = subSpecs;\n }\n \n return data;\n })\n );\n\n return specsData;\n}\n\n/**\n * List tool definition\n */\nexport function listTool(): ToolDefinition {\n return [\n 'list',\n {\n title: 'List Specs',\n description: 'List all specifications with optional filtering. Use this to get an overview of the project, find specs by status/priority, or discover what specs exist. Returns basic metadata for each spec.',\n inputSchema: {\n status: z.enum(['planned', 'in-progress', 'complete', 'archived']).optional().describe('Filter by spec status. Use to find specs in a specific state.'),\n tags: z.array(z.string()).optional().describe('Filter by tags (e.g., [\"api\", \"frontend\"]). Only specs with ALL specified tags will be returned.'),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Filter by priority level. Use to find urgent or important specs.'),\n assignee: z.string().optional().describe('Filter by assignee name. Use to find specs assigned to a specific person.'),\n includeArchived: z.boolean().optional().describe('Include archived specs in results (default: false). Set to true to see completed/archived work.'),\n },\n outputSchema: {\n specs: z.array(z.any()),\n warnings: z.array(z.string()).optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n const specs = await listSpecsData({\n status: input.status as SpecStatus | undefined,\n tags: input.tags,\n priority: input.priority as SpecPriority | undefined,\n assignee: input.assignee,\n includeArchived: input.includeArchived,\n });\n\n // Check for stale specs (only when not filtering by status)\n const warnings: string[] = [];\n if (!input.status) {\n // Build a minimal board structure for stale detection\n const inProgressSpecs = specs.filter(s => s.status === 'in-progress');\n const mockBoard: BoardData = {\n columns: {\n planned: [],\n 'in-progress': inProgressSpecs,\n complete: [],\n archived: [],\n },\n };\n const staleSpecs = getStaleSpecs(mockBoard);\n for (const spec of staleSpecs) {\n warnings.push(`⚠️ Spec \"${spec.name}\" has been in-progress for ${spec.daysStale} days. Consider updating status.`);\n }\n }\n\n const output = { \n specs,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error listing specs', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Search tool - Intelligent relevance-ranked search across spec content\n */\n\nimport { z } from 'zod';\nimport { loadAllSpecs } from '../../spec-loader.js';\nimport type { SpecStatus, SpecPriority, SpecFilterOptions } from '../../frontmatter.js';\nimport { advancedSearchSpecs, type SearchableSpec } from '@leanspec/core';\nimport { formatErrorMessage, loadSubSpecMetadata } from '../helpers.js';\nimport type { ToolDefinition, SpecData } from '../types.js';\n\n/**\n * Search specs for a query\n */\nexport async function searchSpecsData(query: string, options: {\n status?: SpecStatus;\n tags?: string[];\n priority?: SpecPriority;\n assignee?: string;\n customFields?: Record<string, unknown>;\n}): Promise<{\n results: Array<{\n spec: SpecData;\n score: number;\n totalMatches: number;\n matches: Array<{\n field: string;\n text: string;\n lineNumber?: number;\n score: number;\n highlights: Array<[number, number]>;\n }>;\n }>;\n metadata: {\n totalResults: number;\n searchTime: number;\n query: string;\n specsSearched: number;\n };\n}> {\n const filter: SpecFilterOptions = {};\n if (options.status) filter.status = options.status;\n if (options.tags) filter.tags = options.tags;\n if (options.priority) filter.priority = options.priority;\n if (options.assignee) filter.assignee = options.assignee;\n if (options.customFields) filter.customFields = options.customFields;\n\n const specs = await loadAllSpecs({\n includeArchived: true,\n includeContent: true,\n filter,\n });\n\n // Convert to searchable format\n const searchableSpecs: SearchableSpec[] = specs.map(spec => ({\n path: spec.path,\n name: spec.path,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n tags: spec.frontmatter.tags,\n title: spec.frontmatter.title as string | undefined,\n description: spec.frontmatter.description as string | undefined,\n content: spec.content,\n created: spec.frontmatter.created,\n updated: spec.frontmatter.updated_at,\n assignee: spec.frontmatter.assignee,\n }));\n\n // Use advanced search engine (supports boolean operators, field filters, fuzzy matching)\n const searchResult = advancedSearchSpecs(query, searchableSpecs, {\n maxMatchesPerSpec: 5,\n contextLength: 80,\n });\n\n // Convert to MCP format\n const results = await Promise.all(\n searchResult.results.map(async (result) => {\n const specInfo = specs.find(s => s.path === result.spec.path);\n \n const spec: SpecData = {\n name: result.spec.name,\n path: result.spec.path,\n status: result.spec.status as SpecStatus,\n created: specInfo?.frontmatter.created || '',\n title: result.spec.title,\n tags: result.spec.tags,\n priority: result.spec.priority as SpecPriority | undefined,\n assignee: specInfo?.frontmatter.assignee,\n description: result.spec.description,\n customFields: specInfo?.frontmatter.custom as Record<string, unknown> | undefined,\n };\n \n // Add sub-spec metadata for progressive disclosure\n if (specInfo?.fullPath) {\n const subSpecs = await loadSubSpecMetadata(specInfo.fullPath);\n if (subSpecs.length > 0) {\n spec.subSpecs = subSpecs;\n }\n }\n \n return {\n spec,\n score: result.score,\n totalMatches: result.totalMatches,\n matches: result.matches.map(match => ({\n field: match.field,\n text: match.text,\n lineNumber: match.lineNumber,\n score: match.score,\n highlights: match.highlights,\n })),\n };\n })\n );\n\n return {\n results,\n metadata: searchResult.metadata,\n };\n}\n\n/**\n * Search tool definition\n */\nexport function searchTool(): ToolDefinition {\n return [\n 'search',\n {\n title: 'Search Specs',\n description: `Advanced search across all specification content with support for boolean operators, field filters, date ranges, and fuzzy matching.\n\n**Query Syntax:**\n- Simple terms: \\`api authentication\\` (implicit AND)\n- Boolean: \\`api AND auth\\`, \\`frontend OR backend\\`, \\`api NOT deprecated\\`\n- Field filters: \\`status:in-progress\\`, \\`tag:api\\`, \\`priority:high\\`, \\`title:dashboard\\`\n- Date filters: \\`created:>2025-11-01\\`, \\`created:2025-01..2025-11-15\\`\n- Fuzzy matching: \\`authetication~\\` (matches \"authentication\" despite typo)\n- Exact phrases: \\`\"token refresh\"\\`\n- Grouping: \\`(frontend OR backend) AND api\\`\n\n**Query Tips:**\n- Use 2-4 specific terms for best results\n- Cross-field matching: terms can span title, tags, description, content\n- Combine field filters with search terms: \\`tag:api status:planned oauth\\`\n\n**Examples:**\n- \\`api authentication\\` - Find specs with both terms\n- \\`status:in-progress tag:api\\` - API specs being worked on\n- \\`created:>2025-11-01\\` - Recently created specs\n- \\`\"user session\" OR \"token refresh\"\\` - Either phrase\n\nReturns matching specs with relevance scores, highlighted excerpts, and metadata.`,\n inputSchema: {\n query: z.string().describe('Search query with optional advanced syntax. Supports: boolean operators (AND/OR/NOT), field filters (status:, tag:, priority:, title:, created:), fuzzy matching (term~), exact phrases (\"phrase\"), and parentheses for grouping.'),\n status: z.enum(['planned', 'in-progress', 'complete', 'archived']).optional().describe('Pre-filter by status (applied before query parsing).'),\n tags: z.array(z.string()).optional().describe('Pre-filter by tags (applied before query parsing).'),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Pre-filter by priority (applied before query parsing).'),\n },\n outputSchema: {\n results: z.array(z.object({\n spec: z.any(),\n score: z.number(),\n totalMatches: z.number(),\n matches: z.array(z.object({\n field: z.string(),\n text: z.string(),\n lineNumber: z.number().optional(),\n score: z.number(),\n highlights: z.array(z.tuple([z.number(), z.number()])),\n })),\n })),\n metadata: z.object({\n totalResults: z.number(),\n searchTime: z.number(),\n query: z.string(),\n specsSearched: z.number(),\n }),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n const searchResult = await searchSpecsData(input.query, {\n status: input.status as SpecStatus | undefined,\n tags: input.tags,\n priority: input.priority as SpecPriority | undefined,\n });\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(searchResult, null, 2) }],\n structuredContent: searchResult,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error searching specs', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Stats tool - Get project statistics and metrics\n */\n\nimport { z } from 'zod';\nimport { loadAllSpecs } from '../../spec-loader.js';\nimport type { SpecStatus, SpecPriority } from '../../frontmatter.js';\nimport { formatErrorMessage, specToData } from '../helpers.js';\nimport type { ToolDefinition, StatsData } from '../types.js';\n\n/**\n * Get project statistics\n */\nexport async function getStatsData(): Promise<StatsData> {\n const specs = await loadAllSpecs({\n includeArchived: false,\n });\n\n const byStatus: Record<SpecStatus, number> = {\n planned: 0,\n 'in-progress': 0,\n complete: 0,\n archived: 0,\n };\n\n const byPriority: Record<SpecPriority, number> = {\n low: 0,\n medium: 0,\n high: 0,\n critical: 0,\n };\n\n const byTag: Record<string, number> = {};\n\n for (const spec of specs) {\n byStatus[spec.frontmatter.status] = (byStatus[spec.frontmatter.status] || 0) + 1;\n if (spec.frontmatter.priority) {\n byPriority[spec.frontmatter.priority] = (byPriority[spec.frontmatter.priority] || 0) + 1;\n }\n if (spec.frontmatter.tags) {\n for (const tag of spec.frontmatter.tags) {\n byTag[tag] = (byTag[tag] || 0) + 1;\n }\n }\n }\n\n // Get recently updated (sort by path which includes date in many configs)\n const recentlyUpdated = specs\n .sort((a, b) => b.path.localeCompare(a.path))\n .slice(0, 5)\n .map(specToData);\n\n return {\n total: specs.length,\n byStatus,\n byPriority,\n byTag,\n recentlyUpdated,\n };\n}\n\n/**\n * Stats tool definition\n */\nexport function statsTool(): ToolDefinition {\n return [\n 'stats',\n {\n title: 'Get Statistics',\n description: 'Get project statistics and metrics. Use this to understand project completion, workload distribution, or get a high-level overview. Returns counts by status, priority, tags, and recent activity.',\n inputSchema: {},\n outputSchema: {\n stats: z.any(),\n },\n },\n async (_input, _extra) => {\n try {\n const stats = await getStatsData();\n const output = { stats };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error getting stats', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Tokens tool - Count tokens in spec for LLM context management\n */\n\nimport { z } from 'zod';\nimport * as path from 'node:path';\nimport { loadConfig } from '../../config.js';\nimport { resolveSpecPath } from '../../utils/path-helpers.js';\nimport { TokenCounter } from '@leanspec/core';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Tokens tool definition\n */\nexport function tokensTool(): ToolDefinition {\n return [\n 'tokens',\n {\n title: 'Count Tokens',\n description: 'Count tokens in spec or sub-spec for LLM context management. Use this before loading specs to check if they fit in context budget.',\n inputSchema: {\n specPath: z.string().describe('Spec name, number, or file path (e.g., \"059\", \"unified-dashboard\", \"059/DESIGN.md\")'),\n includeSubSpecs: z.boolean().optional().describe('Include all sub-spec files in count (default: false)'),\n detailed: z.boolean().optional().describe('Return breakdown by content type (code, prose, tables, frontmatter)'),\n },\n outputSchema: {\n spec: z.string(),\n total: z.number(),\n files: z.array(z.any()),\n breakdown: z.any().optional(),\n performance: z.any().optional(),\n recommendation: z.string().optional(),\n },\n },\n async (input) => {\n const counter = new TokenCounter();\n \n try {\n // Resolve spec path\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(input.specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ \n error: `Spec not found: ${input.specPath}`,\n code: 'SPEC_NOT_FOUND'\n }, null, 2) }],\n isError: true,\n };\n }\n\n // Get spec name from path\n const specName = path.basename(resolvedPath);\n \n // Count tokens\n const result = await counter.countSpec(resolvedPath, {\n detailed: input.detailed,\n includeSubSpecs: input.includeSubSpecs,\n });\n\n // Build response\n const output: any = {\n spec: specName,\n total: result.total,\n files: result.files,\n };\n\n // Add detailed breakdown if requested\n if (input.detailed && result.breakdown) {\n output.breakdown = result.breakdown;\n \n // Add performance indicators\n const indicators = counter.getPerformanceIndicators(result.total);\n output.performance = {\n level: indicators.level,\n costMultiplier: indicators.costMultiplier,\n effectiveness: indicators.effectiveness,\n recommendation: indicators.recommendation,\n };\n }\n\n // Add recommendation for large specs\n if (result.total > 5000) {\n output.recommendation = '⚠️ Total >5K tokens - consider loading README.md only';\n } else if (result.total > 3500) {\n output.recommendation = '⚠️ Total >3.5K tokens - consider loading in sections';\n }\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error counting tokens', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n } finally {\n counter.dispose();\n }\n }\n ];\n}\n","/**\n * Update tool - Update specification metadata\n */\n\nimport { z } from 'zod';\nimport { updateSpec } from '../../commands/index.js';\nimport type { SpecStatus, SpecPriority } from '../../frontmatter.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Get contextual reminder based on status change\n */\nfunction getStatusReminder(newStatus?: SpecStatus): string | undefined {\n switch (newStatus) {\n case 'in-progress':\n return \"💡 Spec marked in-progress. Remember to document decisions in the spec as you work, and update to 'complete' when done!\";\n case 'complete':\n return \"✅ Spec marked complete! Consider: Did you document what you learned? Are there follow-up specs needed?\";\n case 'planned':\n return \"📋 Spec marked as planned. Update to 'in-progress' before you start implementing!\";\n default:\n return undefined;\n }\n}\n\n/**\n * Update tool definition\n */\nexport function updateTool(): ToolDefinition {\n return [\n 'update',\n {\n title: 'Update Spec',\n description: 'Update specification metadata (status, priority, tags, assignee). Use this to track progress, change priorities, or reassign work. Does NOT modify the spec content itself.',\n inputSchema: {\n specPath: z.string().describe('The spec to update. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), or full folder name (e.g., \"045-unified-dashboard\").'),\n status: z.enum(['planned', 'in-progress', 'complete', 'archived']).optional().describe('Update the spec status. Use \"in-progress\" when work starts, \"complete\" when done.'),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Update the priority level.'),\n tags: z.array(z.string()).optional().describe('Replace tags entirely with this new array. To add/remove individual tags, read first then update.'),\n assignee: z.string().optional().describe('Update who is responsible for this spec.'),\n },\n outputSchema: {\n success: z.boolean(),\n message: z.string(),\n reminder: z.string().optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n // Capture output\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n // Filter out undefined values to prevent YAML serialization errors\n const updates: Record<string, unknown> = {};\n if (input.status !== undefined) updates.status = input.status as SpecStatus;\n if (input.priority !== undefined) updates.priority = input.priority as SpecPriority;\n if (input.tags !== undefined) updates.tags = input.tags;\n if (input.assignee !== undefined) updates.assignee = input.assignee;\n\n await updateSpec(input.specPath, updates);\n\n const reminder = getStatusReminder(input.status as SpecStatus | undefined);\n const output = {\n success: true,\n message: `Spec updated successfully`,\n ...(reminder ? { reminder } : {}),\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error updating spec', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n","/**\n * Validate tool - Validate specs for quality issues\n */\n\nimport { z } from 'zod';\nimport { validateSpecs } from '../../commands/validate.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Validate tool definition\n */\nexport function validateTool(): ToolDefinition {\n return [\n 'validate',\n {\n title: 'Validate Specs',\n description: 'Validate specifications for quality issues like excessive length, missing sections, or complexity problems. Use this before committing changes or for project health checks. Use checkDeps to detect content/frontmatter dependency misalignment.',\n inputSchema: {\n specs: z.array(z.string()).optional().describe('Specific specs to validate. If omitted, validates all specs in the project.'),\n maxLines: z.number().optional().describe('Custom line limit for complexity checks (default: 400 lines).'),\n checkDeps: z.boolean().optional().describe('Check for content/frontmatter dependency alignment. Detects when spec content references other specs but those references are not in frontmatter depends_on/related fields.'),\n },\n outputSchema: {\n passed: z.boolean(),\n issues: z.array(z.any()).optional(),\n message: z.string(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n const originalError = console.error;\n try {\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n console.error = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n const passed = await validateSpecs({\n maxLines: input.maxLines,\n specs: input.specs,\n checkDeps: input.checkDeps,\n });\n\n const output = {\n passed,\n message: passed ? 'All specs passed validation' : 'Some specs have validation issues',\n issues: !passed ? capturedOutput.split('\\n').filter((l: string) => l.trim()) : undefined,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error validating specs', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n }\n ];\n}\n","/**\n * View tool - Read complete content of a specification\n */\n\nimport { z } from 'zod';\nimport { readSpecContent } from '../../commands/viewer.js';\nimport { formatErrorMessage, loadSubSpecMetadata } from '../helpers.js';\nimport type { ToolDefinition, SpecData } from '../types.js';\n\n/**\n * Read full spec content (supports sub-spec files like \"045/DESIGN.md\")\n */\nexport async function readSpecData(specPath: string): Promise<{ spec: SpecData; content: string }> {\n const cwd = process.cwd();\n \n // Use readSpecContent which handles both main specs and sub-spec files\n const specContent = await readSpecContent(specPath, cwd);\n \n if (!specContent) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n\n const spec: SpecData = {\n name: specContent.name,\n path: specContent.path,\n status: specContent.frontmatter.status,\n created: String(specContent.frontmatter.created),\n priority: specContent.frontmatter.priority,\n tags: specContent.frontmatter.tags,\n assignee: specContent.frontmatter.assignee,\n };\n\n // Only include subSpecs when viewing main spec (not a sub-spec file)\n // Check if the specPath contains a slash (indicates sub-spec file like \"045/DESIGN.md\")\n const isSubSpecFile = specPath.includes('/') && specPath.split('/')[1].includes('.');\n \n if (!isSubSpecFile && specContent.fullPath) {\n // Load sub-spec metadata for progressive disclosure\n const subSpecs = await loadSubSpecMetadata(specContent.fullPath);\n if (subSpecs.length > 0) {\n spec.subSpecs = subSpecs;\n }\n }\n\n return {\n spec,\n content: specContent.content,\n };\n}\n\n/**\n * View tool definition\n */\nexport function viewTool(): ToolDefinition {\n return [\n 'view',\n {\n title: 'View Spec',\n description: 'Read the complete content of a specification. Use this to understand spec details, review design decisions, or check implementation status. Returns metadata and full content.',\n inputSchema: {\n specPath: z.string().describe('The spec to view. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), full folder name (e.g., \"045-unified-dashboard\"), or sub-spec file (e.g., \"045/DESIGN.md\" or \"unified-dashboard/TESTING.md\").'),\n raw: z.boolean().optional().describe('Output raw markdown instead of formatted'),\n json: z.boolean().optional().describe('Output as JSON instead of formatted'),\n },\n outputSchema: {\n spec: z.any(),\n content: z.string(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n const result = await readSpecData(input.specPath);\n \n // If json flag is set, return structured data\n if (input.json) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: result,\n };\n }\n \n // If raw flag is set, return raw markdown but include structured content\n if (input.raw) {\n const rawMarkdown = `---\\nstatus: ${result.spec.status}\\ncreated: ${result.spec.created}\\n${result.spec.priority ? `priority: ${result.spec.priority}\\n` : ''}${result.spec.tags ? `tags:\\n${result.spec.tags.map(t => ` - ${t}`).join('\\n')}\\n` : ''}${result.spec.assignee ? `assignee: ${result.spec.assignee}\\n` : ''}---\\n\\n${result.content}`;\n return {\n content: [{ type: 'text' as const, text: rawMarkdown }],\n structuredContent: result,\n };\n }\n \n // Default: formatted output with structured content\n const formatted = `# ${result.spec.name}\\n\\nStatus: ${result.spec.status}\\nCreated: ${result.spec.created}\\n${result.spec.priority ? `Priority: ${result.spec.priority}\\n` : ''}${result.spec.tags ? `Tags: ${result.spec.tags.join(', ')}\\n` : ''}${result.spec.assignee ? `Assignee: ${result.spec.assignee}\\n` : ''}\\n\\n${result.content}`;\n return {\n content: [{ type: 'text' as const, text: formatted }],\n structuredContent: result,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error viewing spec', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Tool registry - Register all MCP tools in alphabetical order\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { agentListTool, agentRunTool, agentStatusTool } from './agent.js';\nimport { archiveTool } from './archive.js';\nimport { backfillTool } from './backfill.js';\nimport { boardTool } from './board.js';\nimport { checkTool } from './check.js';\nimport { createTool } from './create.js';\nimport { depsTool } from './deps.js';\nimport { filesTool } from './files.js';\nimport { listTool } from './list.js';\nimport { searchTool } from './search.js';\nimport { statsTool } from './stats.js';\nimport { tokensTool } from './tokens.js';\nimport { updateTool } from './update.js';\nimport { validateTool } from './validate.js';\nimport { viewTool } from './view.js';\n\n/**\n * Register all tools with the MCP server in alphabetical order\n */\nexport function registerTools(server: McpServer): void {\n // Alphabetically sorted tool registration \n // Note: Using any cast to work around MCP SDK type narrowing issues\n \n // Agent tools (spec 123)\n const [agentListName, agentListConfig, agentListHandler] = agentListTool();\n server.registerTool(agentListName, agentListConfig, agentListHandler as any);\n \n const [agentRunName, agentRunConfig, agentRunHandler] = agentRunTool();\n server.registerTool(agentRunName, agentRunConfig, agentRunHandler as any);\n \n const [agentStatusName, agentStatusConfig, agentStatusHandler] = agentStatusTool();\n server.registerTool(agentStatusName, agentStatusConfig, agentStatusHandler as any);\n \n const [name1, config1, handler1] = archiveTool();\n server.registerTool(name1, config1, handler1 as any);\n \n const [name2, config2, handler2] = backfillTool();\n server.registerTool(name2, config2, handler2 as any);\n \n const [name3, config3, handler3] = boardTool();\n server.registerTool(name3, config3, handler3 as any);\n \n const [name4, config4, handler4] = checkTool();\n server.registerTool(name4, config4, handler4 as any);\n \n const [name5, config5, handler5] = createTool();\n server.registerTool(name5, config5, handler5 as any);\n \n const [name6, config6, handler6] = depsTool();\n server.registerTool(name6, config6, handler6 as any);\n \n const [name7, config7, handler7] = filesTool();\n server.registerTool(name7, config7, handler7 as any);\n \n const [name8, config8, handler8] = listTool();\n server.registerTool(name8, config8, handler8 as any);\n \n const [name9, config9, handler9] = searchTool();\n server.registerTool(name9, config9, handler9 as any);\n \n const [name10, config10, handler10] = statsTool();\n server.registerTool(name10, config10, handler10 as any);\n \n const [name11, config11, handler11] = tokensTool();\n server.registerTool(name11, config11, handler11 as any);\n \n const [name12, config12, handler12] = updateTool();\n server.registerTool(name12, config12, handler12 as any);\n \n const [name13, config13, handler13] = validateTool();\n server.registerTool(name13, config13, handler13 as any);\n \n const [name14, config14, handler14] = viewTool();\n server.registerTool(name14, config14, handler14 as any);\n}\n","/**\n * Board resource - Kanban board view\n */\n\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport { getBoardData } from '../tools/board.js';\n\n/**\n * Board resource definition\n */\nexport function boardResource() {\n return [\n 'board',\n new ResourceTemplate('board://kanban', { list: undefined }),\n {\n title: 'Kanban Board',\n description: 'Current Kanban board state organized by status',\n },\n async (uri: URL, _variables: Record<string, string | string[]>, _extra: any) => {\n try {\n const board = await getBoardData();\n const text = Object.entries(board.columns)\n .map(([status, specs]) => {\n const header = `## ${status.toUpperCase()} (${specs.length})`;\n const items = specs.map(s => `- ${s.name} ${s.priority ? `[${s.priority}]` : ''}`).join('\\n');\n return `${header}\\n${items || '(empty)'}`;\n })\n .join('\\n\\n');\n\n return {\n contents: [\n {\n uri: uri.href,\n text,\n mimeType: 'text/markdown',\n },\n ],\n };\n } catch (error) {\n throw new Error(formatErrorMessage('Failed to get board resource', error));\n }\n }\n ] as const;\n}\n","/**\n * Spec resource - Read individual specification content\n */\n\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport { readSpecData } from '../tools/view.js';\n\n/**\n * Spec resource definition\n */\nexport function specResource() {\n return [\n 'spec',\n new ResourceTemplate('spec://{specPath}', { list: undefined }),\n {\n title: 'Spec Content',\n description: 'Read individual specification content by path or name',\n },\n async (uri: URL, variables: Record<string, string | string[]>, _extra: any) => {\n try {\n const specPath = variables.specPath;\n const pathString = Array.isArray(specPath) ? specPath[0] : specPath;\n const { spec, content } = await readSpecData(pathString);\n return {\n contents: [\n {\n uri: uri.href,\n text: `# ${spec.name}\\n\\nStatus: ${spec.status}\\nCreated: ${spec.created}\\n${spec.priority ? `Priority: ${spec.priority}\\n` : ''}${spec.tags ? `Tags: ${spec.tags.join(', ')}\\n` : ''}\\n\\n${content}`,\n mimeType: 'text/markdown',\n },\n ],\n };\n } catch (error) {\n throw new Error(formatErrorMessage('Failed to read spec resource', error));\n }\n }\n ] as const;\n}\n","/**\n * Stats resource - Project statistics overview\n */\n\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport { getStatsData } from '../tools/stats.js';\n\n/**\n * Stats resource definition\n */\nexport function statsResource() {\n return [\n 'stats',\n new ResourceTemplate('stats://overview', { list: undefined }),\n {\n title: 'Project Statistics',\n description: 'Overview of project statistics',\n },\n async (uri: URL, _variables: Record<string, string | string[]>, _extra: any) => {\n try {\n const stats = await getStatsData();\n \n const statusSection = Object.entries(stats.byStatus)\n .map(([status, count]) => `- ${status}: ${count}`)\n .join('\\n');\n \n const prioritySection = Object.entries(stats.byPriority)\n .filter(([_, count]) => count > 0)\n .map(([priority, count]) => `- ${priority}: ${count}`)\n .join('\\n');\n \n const tagSection = Object.entries(stats.byTag)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([tag, count]) => `- ${tag}: ${count}`)\n .join('\\n');\n\n const text = `# Project Statistics\n\n## Total Specs: ${stats.total}\n\n## By Status\n${statusSection}\n\n## By Priority\n${prioritySection || '(none)'}\n\n## Top Tags\n${tagSection || '(none)'}\n\n## Recently Updated\n${stats.recentlyUpdated.map(s => `- ${s.name} (${s.status})`).join('\\n') || '(none)'}`;\n\n return {\n contents: [\n {\n uri: uri.href,\n text,\n mimeType: 'text/markdown',\n },\n ],\n };\n } catch (error) {\n throw new Error(formatErrorMessage('Failed to get stats resource', error));\n }\n }\n ] as const;\n}\n","/**\n * Resource registry - Register all MCP resources\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { boardResource } from './board.js';\nimport { specResource } from './spec.js';\nimport { statsResource } from './stats.js';\n\n/**\n * Register all resources with the MCP server\n */\nexport function registerResources(server: McpServer): void {\n server.registerResource(...boardResource());\n server.registerResource(...specResource());\n server.registerResource(...statsResource());\n}\n","/**\n * Plan project roadmap prompt\n */\n\nimport { z } from 'zod';\n\n/**\n * Plan project roadmap prompt definition\n */\nexport function planProjectRoadmapPrompt() {\n return [\n 'plan-project-roadmap',\n {\n title: 'Plan Project Roadmap',\n description: 'Interactive roadmap planning with phases, tasks, and dependencies',\n argsSchema: {\n goal: z.string(),\n },\n },\n ({ goal }: { goal: string }) => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Plan a project roadmap for: ${goal}\n\n1. **Review Existing Work**: Analyze current specs using \\`list\\`/\\`board\\`, identify what's already planned/in-progress, assess how existing work relates to the new goal\n2. **Break Down Goal**: Decompose the goal into logical phases or milestones\n3. **Identify Tasks**: List key tasks and work items for each phase\n4. **Map Dependencies**: Establish dependencies between tasks (what must be done first)\n5. **Create Specs**: Create specification documents for major work items using the \\`create\\` tool\n6. **Set Relationships**: Use \\`link\\` tool to establish \\`depends_on\\` and \\`related\\` relationships\n7. **Timeline Estimation**: Provide realistic timeline based on task complexity and project velocity\n8. **Risk Analysis**: Identify risks, unknowns, and mitigation strategies\n\nUse the following tools to build the roadmap:\n- \\`list\\` / \\`board\\` / \\`stats\\` - Understand current project state\n- \\`create\\` - Create new specs for roadmap items\n- \\`link\\` - Establish dependencies between specs\n- \\`update\\` - Set priority and metadata\n\nProvide a clear roadmap with:\n- Phases/milestones with descriptions\n- Key specs to create\n- Dependency relationships\n- Recommended execution order\n- Actionable next steps to implement this plan`,\n },\n },\n ],\n })\n ] as const;\n}\n","/**\n * Project progress overview prompt\n */\n\n/**\n * Project progress overview prompt definition\n */\nexport function projectProgressOverviewPrompt() {\n return [\n 'project-progress-overview',\n {\n title: 'Project Progress Overview',\n description: 'Generate comprehensive project status report combining specs, git history, and metrics',\n },\n () => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Analyze project progress and provide a comprehensive overview:\n\n1. **Spec Analysis**: Review all specs using \\`board\\` and \\`stats\\`, group by status (planned/in-progress/complete), highlight any blockers or dependencies\n2. **Recent Activity**: Examine git commit history (last 2 weeks), identify key changes and development patterns\n3. **Current State**: Assess what's actively being worked on, what's completed, what's planned\n4. **Velocity Metrics**: Calculate completion rates, average time in each status, and throughput trends\n5. **Risk Assessment**: Identify stalled specs, missing dependencies, potential bottlenecks\n6. **Next Steps**: Recommend priority actions based on current project state\n\nUse the following tools to gather data:\n- \\`board\\` - Get Kanban view of specs by status\n- \\`stats\\` - Get project metrics\n- \\`list\\` - List specs with filters\n- \\`deps\\` - Analyze dependencies for critical specs\n- Terminal git commands - Analyze recent commit history\n\nProvide a clear, actionable summary that helps understand project health and next steps.`,\n },\n },\n ],\n })\n ] as const;\n}\n","/**\n * SDD Checkpoint prompt - Periodic reminder for SDD compliance\n */\n\n/**\n * SDD Checkpoint prompt definition\n * Call this periodically during long sessions to maintain SDD compliance\n */\nexport function sddCheckpointPrompt() {\n return [\n 'checkpoint',\n {\n title: 'SDD Compliance Checkpoint',\n description: 'Periodic reminder to verify SDD workflow compliance - check spec status, update progress, ensure specs are in sync',\n },\n () => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `## SDD Checkpoint ✅\n\n**Before continuing, let's verify SDD compliance:**\n\n### Step 1: Review Current State\nUse the \\`board\\` tool to see project status and identify:\n- Specs marked \"in-progress\" - are they still being worked on?\n- Specs that should be \"complete\" but aren't marked\n- Any work being done without a spec\n\n### Step 2: Check Your Current Task\nFor the work you're currently doing:\n- **Is there a spec for it?** If not, create one with \\`create\\`\n- **Is the status correct?** Update with \\`update\\` if needed\n- **Have you documented decisions?** Add notes to the spec\n\n### Step 3: Update Progress\nFor any specs you've worked on:\n1. Update status if changed (\\`planned\\` → \\`in-progress\\` → \\`complete\\`)\n2. Document key decisions or changes in the spec content\n3. Link related specs if you discovered connections\n\n### Step 4: Validate (Before Completing)\nBefore marking any spec as complete, run validation:\n\\`\\`\\`\nvalidate { \"checkDeps\": true }\n\\`\\`\\`\n\nThis checks:\n- Spec structure and frontmatter\n- Content/frontmatter dependency alignment\n- Any referenced specs are properly linked\n\nFix any warnings before marking specs complete.\n\n### Action Items\nBased on the board review:\n1. List any specs with stale status\n2. Identify work being done without specs\n3. Suggest status updates needed\n4. Fix any dependency alignment warnings\n\n**Remember:** \n- Specs track implementation, not documentation\n- Update status BEFORE starting work, AFTER completing\n- Keep specs in sync with actual progress\n- Always validate with \\`--check-deps\\` before completing`,\n },\n },\n ],\n })\n ] as const;\n}\n","/**\n * Spec Creation Workflow prompt - Guide complete spec creation with dependency linking\n */\n\n/**\n * Spec Creation Workflow prompt definition\n * Use this when creating new specs to ensure proper dependency linking\n */\nexport function specCreationWorkflowPrompt() {\n return [\n 'create-spec',\n {\n title: 'Create Spec with Dependencies',\n description: 'Complete workflow for creating a new spec including proper dependency linking. Prevents the common issue of content referencing specs without frontmatter links.',\n },\n () => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `## Create Spec Workflow 📝\n\nFollow these steps to create a well-linked spec:\n\n### Step 1: Pre-Creation Research\nBefore creating, use \\`search\\` to find related specs:\n- Search for similar features or components\n- Identify potential dependencies\n- Note specs to reference\n\n### Step 2: Create the Spec\nUse \\`create\\` with the spec details:\n\\`\\`\\`\ncreate {\n \"name\": \"your-spec-name\",\n \"title\": \"Human Readable Title\",\n \"description\": \"Initial overview content...\",\n \"priority\": \"medium\",\n \"tags\": [\"relevant\", \"tags\"]\n}\n\\`\\`\\`\n\n### Step 3: Link Dependencies (CRITICAL)\nAfter creating, **immediately** link any referenced specs:\n\nFor each spec mentioned in content:\n- \"Depends on spec 045\" → \\`link { \"spec\": \"your-spec\", \"dependsOn\": [\"045\"] }\\`\n- \"Related to spec 072\" → \\`link { \"spec\": \"your-spec\", \"related\": [\"072\"] }\\`\n- \"See spec 110\" → \\`link { \"spec\": \"your-spec\", \"related\": [\"110\"] }\\`\n\n### Step 4: Verify\nUse \\`deps\\` to verify all links are in place:\n\\`\\`\\`\ndeps { \"spec\": \"your-spec\" }\n\\`\\`\\`\n\n### Step 5: Validate (REQUIRED)\nRun dependency alignment check to ensure content matches frontmatter:\n\\`\\`\\`\nvalidate { \"specs\": [\"your-spec\"], \"checkDeps\": true }\n\\`\\`\\`\n\n⚠️ **Do not consider spec creation complete until validation passes with 0 dependency warnings!**\n\n### Common Patterns to Link\n\n| Content Pattern | Link Type |\n|----------------|-----------|\n| \"depends on\", \"blocked by\", \"requires\" | dependsOn |\n| \"related to\", \"see also\", \"similar to\" | related |\n| \"builds on\" | dependsOn (if blocking) or related |\n| \"## Related Specs\" section | related (link each one) |\n\n**Remember:** Content and frontmatter must stay aligned!`,\n },\n },\n ],\n })\n ] as const;\n}\n","/**\n * Update spec status prompt\n */\n\nimport { z } from 'zod';\n\n/**\n * Update spec status prompt definition\n */\nexport function updateSpecStatusPrompt() {\n return [\n 'update-spec-status',\n {\n title: 'Update Spec Status',\n description: 'Quick workflow to update specification status',\n argsSchema: {\n specPath: z.string(),\n status: z.enum(['planned', 'in-progress', 'complete', 'archived']),\n },\n },\n ({ specPath, status }: { specPath: string; status: string }) => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Update the status of spec \"${specPath}\" to \"${status}\".\n\nUse the \\`update\\` tool: \\`update <spec> --status ${status}\\``,\n },\n },\n ],\n })\n ] as const;\n}\n","/**\n * Prompt registry - Register all MCP prompts\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { planProjectRoadmapPrompt } from './plan-project-roadmap.js';\nimport { projectProgressOverviewPrompt } from './project-progress-overview.js';\nimport { sddCheckpointPrompt } from './sdd-checkpoint.js';\nimport { specCreationWorkflowPrompt } from './spec-creation-workflow.js';\nimport { updateSpecStatusPrompt } from './update-spec-status.js';\n\n/**\n * Register all prompts with the MCP server\n */\nexport function registerPrompts(server: McpServer): void {\n server.registerPrompt(...projectProgressOverviewPrompt());\n server.registerPrompt(...planProjectRoadmapPrompt());\n server.registerPrompt(...sddCheckpointPrompt());\n server.registerPrompt(...specCreationWorkflowPrompt());\n server.registerPrompt(...updateSpecStatusPrompt());\n}\n","#!/usr/bin/env node\n/**\n * LeanSpec MCP Server\n * \n * Model Context Protocol server that exposes LeanSpec functionality to AI assistants.\n * This enables AI agents to interact with LeanSpec projects directly from their environment.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { registerTools } from './mcp/tools/registry.js';\nimport { registerResources } from './mcp/resources/registry.js';\nimport { registerPrompts } from './mcp/prompts/registry.js';\n\n// Get version from package.json\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '../package.json'), 'utf-8')\n);\n\n/**\n * Create the MCP server with all tools, resources, and prompts\n */\nasync function createMcpServer(): Promise<McpServer> {\n const server = new McpServer({\n name: 'lean-spec',\n version: packageJson.version,\n });\n\n // Register all components\n registerTools(server);\n registerResources(server);\n registerPrompts(server);\n\n return server;\n}\n\n/**\n * Main entry point\n */\nasync function main() {\n try {\n const server = await createMcpServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n // Log to stderr so it doesn't interfere with MCP protocol on stdout\n console.error('LeanSpec MCP Server started successfully');\n } catch (error) {\n console.error('Failed to start LeanSpec MCP Server:', error);\n process.exit(1);\n }\n}\n\nexport { createMcpServer };\n\n// Run if executed directly\nif (import.meta.url === `file://${process.argv[1]}`) {\n main().catch(console.error);\n}\n"]}
|