compound-agent 1.3.2 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli-utils.ts","../src/memory/embeddings/model.ts","../src/memory/embeddings/nomic.ts","../src/memory/types.ts","../src/memory/storage/jsonl.ts","../src/memory/storage/sqlite/availability.ts","../src/memory/storage/sqlite/schema.ts","../src/memory/storage/sqlite/connection.ts","../src/memory/storage/sqlite/cache.ts","../src/memory/storage/sqlite/sync.ts","../src/memory/storage/sqlite/search.ts","../src/utils.ts","../src/memory/storage/compact.ts","../src/memory/search/vector.ts","../src/memory/search/ranking.ts","../src/compound/clustering.ts","../src/compound/types.ts","../src/compound/io.ts","../src/compound/synthesis.ts","../src/commands/compound.ts","../src/version.ts","../src/setup/banner-audio.ts","../src/setup/banner.ts","../src/setup/beads-check.ts","../src/memory/capture/quality.ts","../src/memory/capture/triggers.ts","../src/memory/capture/integration.ts","../src/memory/retrieval/session.ts","../src/memory/retrieval/plan.ts","../src/audit/checks/lessons.ts","../src/rules/types.ts","../src/rules/checks/glob-utils.ts","../src/rules/checks/file-pattern.ts","../src/rules/checks/file-size.ts","../src/rules/checks/script.ts","../src/rules/engine.ts","../src/audit/checks/patterns.ts","../src/audit/checks/rules.ts","../src/audit/engine.ts","../src/audit/types.ts","../src/setup/templates.ts","../src/setup/claude-helpers.ts","../src/setup/scope-check.ts","../src/setup/display-utils.ts","../src/setup/gitignore.ts","../src/cli-error-format.ts","../src/commands/phase-check.ts","../src/setup/hooks-phase-guard.ts","../src/setup/hooks-read-tracker.ts","../src/setup/hooks-stop-audit.ts","../src/setup/hooks.ts","../src/setup/templates/agents-external.ts","../src/setup/templates/agents-phase11.ts","../src/setup/templates/agents-review.ts","../src/setup/templates/agents.ts","../src/setup/templates/agent-role-skills-workflow.ts","../src/setup/templates/agent-role-skills-review.ts","../src/setup/templates/agent-role-skills-phase11.ts","../src/setup/templates/agent-role-skills.ts","../src/setup/templates/commands.ts","../src/setup/templates/docs.ts","../src/setup/templates/skills.ts","../src/setup/primitives.ts","../src/setup/uninstall.ts","../src/setup/upgrade.ts","../src/setup/all.ts","../src/setup/claude.ts","../src/setup/download-model.ts","../src/setup/init.ts","../src/commands/shared.ts","../src/commands/management-helpers.ts","../src/commands/management-crud.ts","../src/commands/doctor.ts","../src/commands/management-invalidation.ts","../src/commands/management-io.ts","../src/commands/management-maintenance.ts","../src/commands/management-prime.ts","../src/commands/audit.ts","../src/config/config.ts","../src/commands/reviewer.ts","../src/commands/rules.ts","../src/commands/test-summary.ts","../src/commands/verify-gates.ts","../src/changelog-data.ts","../src/commands/about.ts","../src/commands/worktree.ts","../src/commands/capture.ts","../src/commands/loop.ts","../src/commands/retrieval.ts","../src/commands/index.ts","../src/cli.ts"],"names":["getLlama","join","require","dirname","createHash","mtime","readFile","mkdir","lines","appendFile","z","program","createRequire","out","unlinkSync","cleanup","existsSync","DEFAULT_LIMIT","SeveritySchema","statSync","readFileSync","execSync","configPath","homedir","writeFile","rename","EPIC_ID_PATTERN","mkdirSync","writeFileSync","path","content","pkg","rm","result","modelPath","size","printPnpmConfigStatus","chalk","execFileSync","resolve","formatSource"],"mappings":"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AAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EA2Hf,kBAAA,EAAoB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAqJpB,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;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","file":"cli.js","sourcesContent":["/**\n * CLI utility functions.\n *\n * Pure functions extracted from cli.ts for testability.\n */\n\n/**\n * Format bytes to human-readable string.\n *\n * @param bytes - Number of bytes\n * @returns Formatted string (e.g., \"1.5 KB\", \"2.0 MB\")\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n if (bytes < 1024) return `${bytes} B`;\n const kb = bytes / 1024;\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\n const mb = kb / 1024;\n return `${mb.toFixed(1)} MB`;\n}\n\n/**\n * Parse limit option and validate it's a positive integer.\n *\n * @param value - String value from command option\n * @param name - Option name for error message\n * @returns Parsed integer\n * @throws Error if value is not a valid positive integer\n */\nexport function parseLimit(value: string, name: string): number {\n const parsed = parseInt(value, 10);\n if (Number.isNaN(parsed) || parsed <= 0) {\n throw new Error(`Invalid ${name}: must be a positive integer`);\n }\n return parsed;\n}\n\n/**\n * Get repository root from environment variable or current directory.\n *\n * @returns Repository root path for lesson storage\n */\nexport function getRepoRoot(): string {\n return process.env['COMPOUND_AGENT_ROOT'] ?? process.cwd();\n}\n\n// ============================================================================\n// Beads shared utilities\n// ============================================================================\n\n/** Strict pattern for valid beads epic/task IDs. */\nexport const EPIC_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\n/** Validate an epic ID, throwing if invalid. */\nexport function validateEpicId(epicId: string): void {\n if (!EPIC_ID_PATTERN.test(epicId)) {\n throw new Error(`Invalid epic ID: \"${epicId}\" (must be alphanumeric with hyphens/underscores)`);\n }\n}\n\nexport interface BeadsDep {\n id: string;\n title: string;\n status: string;\n}\n\n/** Parse dependencies from `bd show --json` output. */\nexport function parseBdShowDeps(raw: string): BeadsDep[] {\n const data = JSON.parse(raw);\n const issue = Array.isArray(data) ? data[0] : data;\n if (!issue) return [];\n const depsArray = issue.depends_on ?? issue.dependencies ?? [];\n return depsArray.map((dep: { id?: string; title?: string; status?: string }) => ({\n id: dep.id ?? '',\n title: dep.title ?? '',\n status: dep.status ?? 'open',\n }));\n}\n\n/**\n * Extract short ID from full beads ID (e.g., \"learning_agent-m001\" -> \"m001\").\n * Assumes beads short IDs are the last hyphen-delimited segment.\n */\nexport function shortId(fullId: string): string {\n const parts = fullId.split('-');\n return parts[parts.length - 1] ?? fullId;\n}\n","/**\n * Embedding model resolution using node-llama-cpp's built-in resolver.\n *\n * Uses resolveModelFile for automatic download and caching.\n * Model is stored in ~/.node-llama-cpp/models/ by default.\n */\n\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { getLlama, resolveModelFile } from 'node-llama-cpp';\n\n/**\n * HuggingFace URI for EmbeddingGemma-300M (Q4_0 quantization).\n *\n * - Size: ~278MB\n * - Dimensions: 768 (default), supports MRL truncation to 512/256/128\n * - Context: 2048 tokens\n */\nexport const MODEL_URI = 'hf:ggml-org/embeddinggemma-300M-qat-q4_0-GGUF/embeddinggemma-300M-qat-Q4_0.gguf';\n\n/**\n * Expected model filename after download.\n * node-llama-cpp uses format: hf_{org}_{filename}\n */\nexport const MODEL_FILENAME = 'hf_ggml-org_embeddinggemma-300M-qat-Q4_0.gguf';\n\n/** Default model directory used by node-llama-cpp */\nconst DEFAULT_MODEL_DIR = join(homedir(), '.node-llama-cpp', 'models');\n\n/** Cached usability result (per-process) */\nlet cachedUsability: UsabilityResult | null = null;\n\n/**\n * Check if the embedding model is available locally.\n *\n * @returns true if model file exists\n */\nexport function isModelAvailable(): boolean {\n return existsSync(join(DEFAULT_MODEL_DIR, MODEL_FILENAME));\n}\n\n/**\n * Result of checking if the model is usable at runtime.\n *\n * A discriminated union where `usable` determines which fields are present:\n * - usable=true: Model can initialize and create embedding context\n * - usable=false: Model cannot be used, with reason and actionable fix\n */\nexport type UsabilityResult =\n | { usable: true; reason?: undefined; action?: undefined }\n | { usable: false; reason: string; action: string };\n\n/**\n * Check if the embedding model is usable at runtime.\n *\n * Goes beyond file existence to verify the model can actually initialize:\n * 1. Checks if model file exists (fast fail)\n * 2. Attempts to load llama runtime\n * 3. Attempts to load model\n * 4. Attempts to create embedding context\n * 5. Cleans up all resources after check\n *\n * @returns UsabilityResult with usable status and actionable error if failed\n */\nexport async function isModelUsable(): Promise<UsabilityResult> {\n // Return cached result if available (avoids double initialization)\n if (cachedUsability !== null) {\n return cachedUsability;\n }\n\n // Fast fail if model file doesn't exist\n if (!isModelAvailable()) {\n cachedUsability = {\n usable: false,\n reason: 'Embedding model file not found',\n action: 'Run: npx ca download-model',\n };\n return cachedUsability;\n }\n\n // Attempt runtime initialization\n let llama = null;\n let model = null;\n let context = null;\n\n try {\n const modelPath = join(DEFAULT_MODEL_DIR, MODEL_FILENAME);\n\n // Step 1: Get llama runtime\n llama = await getLlama();\n\n // Step 2: Load model\n model = await llama.loadModel({ modelPath });\n\n // Step 3: Create embedding context\n context = await model.createEmbeddingContext();\n\n // Success - cache and return\n cachedUsability = { usable: true };\n return cachedUsability;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n cachedUsability = {\n usable: false,\n reason: `Embedding model runtime initialization failed: ${message}`,\n action: 'Check system compatibility or reinstall: npx ca download-model',\n };\n return cachedUsability;\n } finally {\n // Clean up resources in reverse order\n if (context) {\n try {\n context.dispose();\n } catch {\n // Ignore cleanup errors\n }\n }\n // Note: model and llama don't have explicit dispose methods in node-llama-cpp\n // The GC will handle them when references are released\n }\n}\n\n/**\n * Clear the cached usability result.\n *\n * Primarily for testing purposes. Clears the cached result so the next\n * call to isModelUsable() will perform a fresh check.\n */\nexport function clearUsabilityCache(): void {\n cachedUsability = null;\n}\n\n/**\n * Resolve the embedding model path, downloading if necessary.\n *\n * Uses node-llama-cpp's resolveModelFile for automatic download with progress.\n *\n * @param options - Optional configuration\n * @param options.cli - Show download progress in console (default: true)\n * @returns Path to the resolved model file\n *\n * @example\n * ```typescript\n * const modelPath = await resolveModel();\n * const llama = await getLlama();\n * const model = await llama.loadModel({ modelPath });\n * ```\n */\nexport async function resolveModel(options: { cli?: boolean } = {}): Promise<string> {\n const { cli = true } = options;\n return resolveModelFile(MODEL_URI, { cli });\n}\n","/**\n * Text embedding via node-llama-cpp with EmbeddingGemma model\n *\n * **Resource lifecycle:**\n * - Model is loaded lazily on first embedding call (~150MB in memory)\n * - Once loaded, the model remains in memory until `unloadEmbedding()` is called\n * - Loading is slow (~1-3s); keeping loaded improves subsequent call performance\n *\n * **Memory usage:**\n * - Embedding model: ~150MB RAM when loaded\n * - Embeddings themselves: ~3KB per embedding (768 dimensions x 4 bytes)\n *\n * @see {@link unloadEmbedding} for releasing memory\n * @see {@link getEmbedding} for the lazy-loading mechanism\n */\n\nimport type { Llama, LlamaModel } from 'node-llama-cpp';\nimport { getLlama, LlamaEmbeddingContext } from 'node-llama-cpp';\n\nimport { isModelAvailable, resolveModel } from './model.js';\n\n/** Singleton embedding context */\nlet embeddingContext: LlamaEmbeddingContext | null = null;\n/** Pending initialization promise (prevents concurrent duplicate loads) */\nlet pendingInit: Promise<LlamaEmbeddingContext> | null = null;\n/** Native resource refs for proper cleanup */\nlet llamaInstance: Llama | null = null;\nlet modelInstance: LlamaModel | null = null;\n\n/**\n * Get the LlamaEmbeddingContext instance for generating embeddings.\n *\n * **Lazy loading behavior:**\n * - First call loads the embedding model (~150MB) into memory\n * - Loading takes ~1-3 seconds depending on hardware\n * - Subsequent calls return the cached instance immediately\n * - Downloads model automatically if not present\n *\n * **Resource lifecycle:**\n * - Once loaded, model stays in memory until `unloadEmbedding()` is called\n * - For CLI commands: typically load once, use, then unload on exit\n * - For long-running processes: keep loaded for performance\n *\n * @returns The singleton embedding context\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * // Direct usage (prefer embedText for simple cases)\n * const ctx = await getEmbedding();\n * const result = await ctx.getEmbeddingFor('some text');\n *\n * // Ensure cleanup\n * process.on('exit', () => unloadEmbedding());\n * ```\n *\n * @see {@link embedText} for simpler text-to-vector conversion\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function getEmbedding(): Promise<LlamaEmbeddingContext> {\n if (embeddingContext) return embeddingContext;\n if (pendingInit) return pendingInit;\n\n pendingInit = (async () => {\n try {\n const modelPath = await resolveModel({ cli: true });\n llamaInstance = await getLlama();\n modelInstance = await llamaInstance.loadModel({ modelPath });\n embeddingContext = await modelInstance.createEmbeddingContext();\n return embeddingContext;\n } catch (err) {\n pendingInit = null; // Allow retry on failure\n throw err;\n }\n })();\n\n return pendingInit;\n}\n\n/**\n * Unload the embedding context to free memory (~150MB).\n *\n * **Resource lifecycle:**\n * - Disposes the underlying LlamaEmbeddingContext\n * - Releases ~150MB of RAM used by the model\n * - After unloading, subsequent embedding calls will reload the model\n *\n * **When to call:**\n * - At the end of CLI commands to ensure clean process exit\n * - In memory-constrained environments after batch processing\n * - Before process exit in graceful shutdown handlers\n * - When switching to a different model (if supported in future)\n *\n * **Best practices:**\n * - For single-operation scripts: call before exit\n * - For daemon/server processes: call in shutdown handler\n * - Not needed between embedding calls in the same process\n *\n * @example\n * ```typescript\n * // CLI command pattern\n * try {\n * const embedding = await embedText('some text');\n * // ... use embedding\n * } finally {\n * unloadEmbedding();\n * closeDb();\n * }\n *\n * // Graceful shutdown pattern\n * process.on('SIGTERM', () => {\n * unloadEmbedding();\n * closeDb();\n * process.exit(0);\n * });\n * ```\n *\n * @see {@link getEmbedding} for loading the model\n * @see {@link closeDb} for database cleanup (often used together)\n */\nexport function unloadEmbedding(): void {\n if (embeddingContext) {\n embeddingContext.dispose();\n embeddingContext = null;\n }\n if (modelInstance) {\n modelInstance.dispose().catch(() => {});\n modelInstance = null;\n }\n if (llamaInstance) {\n llamaInstance.dispose().catch(() => {});\n llamaInstance = null;\n }\n pendingInit = null;\n}\n\n/**\n * Embed a single text string into a vector.\n *\n * **Lazy loading:** First call loads the embedding model (~150MB, ~1-3s).\n * Subsequent calls use the cached model and complete in milliseconds.\n *\n * @param text - The text to embed\n * @returns A 768-dimensional vector (number[])\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * const vector = await embedText('TypeScript error handling');\n * console.log(vector.length); // 768\n *\n * // Remember to clean up when done\n * unloadEmbedding();\n * ```\n *\n * @see {@link embedTexts} for batch embedding\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function embedText(text: string): Promise<number[]> {\n const ctx = await getEmbedding();\n const result = await ctx.getEmbeddingFor(text);\n return Array.from(result.vector);\n}\n\n/**\n * Embed multiple texts into vectors.\n *\n * **Lazy loading:** First call loads the embedding model (~150MB, ~1-3s).\n * Subsequent calls use the cached model.\n *\n * **Note:** Texts are embedded sequentially (node-llama-cpp uses a mutex lock).\n * The only advantage over a manual loop is shared model initialization.\n *\n * @param texts - Array of texts to embed\n * @returns Array of 768-dimensional vectors, same order as input\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * const texts = ['first text', 'second text'];\n * const vectors = await embedTexts(texts);\n * console.log(vectors.length); // 2\n * console.log(vectors[0].length); // 768\n *\n * // Remember to clean up when done\n * unloadEmbedding();\n * ```\n *\n * @see {@link embedText} for single text embedding\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function embedTexts(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n\n const ctx = await getEmbedding();\n const results: number[][] = [];\n\n for (const text of texts) {\n const result = await ctx.getEmbeddingFor(text);\n results.push(Array.from(result.vector));\n }\n\n return results;\n}\n\n// Re-export isModelAvailable for test utilities\nexport { isModelAvailable };\n","/**\n * Memory item type definitions using Zod schemas.\n *\n * Supports 4 memory item types via discriminated union:\n * - lesson: Knowledge learned from mistakes\n * - solution: Problem-resolution pairs\n * - pattern: Code pattern transformations (bad -> good)\n * - preference: User workflow preferences\n *\n * Deletion model:\n * - Set `deleted: true` and `deletedAt` on an item to mark it deleted\n * - LegacyTombstoneSchema handles backward-compat reads of old\n * minimal tombstone records { id, deleted: true, deletedAt }\n * - LegacyLessonSchema handles old quick/full type records\n */\n\nimport { createHash } from 'node:crypto';\nimport { z } from 'zod';\n\n// Source of lesson capture\nexport const SourceSchema = z.enum([\n 'user_correction',\n 'self_correction',\n 'test_failure',\n 'manual',\n]);\n\n// Context about when lesson was learned\nexport const ContextSchema = z.object({\n tool: z.string(),\n intent: z.string(),\n});\n\n// Code pattern (bad -> good)\nexport const PatternSchema = z.object({\n bad: z.string(),\n good: z.string(),\n});\n\n// Citation for lesson provenance tracking\nexport const CitationSchema = z.object({\n file: z.string().min(1), // Source file path (required, non-empty)\n line: z.number().int().positive().optional(), // Line number (optional, must be positive)\n commit: z.string().optional(), // Git commit hash (optional)\n});\n\n// Severity levels for lessons\nexport const SeveritySchema = z.enum(['high', 'medium', 'low']);\n\n// Compaction levels for age-based validity\nexport const CompactionLevelSchema = z.union([\n z.literal(0), // Active\n z.literal(1), // Flagged (>90 days)\n z.literal(2), // Archived\n]);\n\n/** @deprecated Use MemoryItemTypeSchema instead. Kept for parsing old JSONL records. */\nexport const LessonTypeSchema = z.enum(['quick', 'full']);\n\n/** Memory item type enum: lesson, solution, pattern, preference. */\nexport const MemoryItemTypeSchema = z.enum(['lesson', 'solution', 'pattern', 'preference']);\n\n// ---------------------------------------------------------------------------\n// Base fields shared by all memory item types\n// ---------------------------------------------------------------------------\n\nconst baseFields = {\n // Core identity (required)\n id: z.string(),\n trigger: z.string(),\n insight: z.string(),\n\n // Metadata (required)\n tags: z.array(z.string()),\n source: SourceSchema,\n context: ContextSchema,\n created: z.string(), // ISO8601\n confirmed: z.boolean(),\n\n // Relationships (required, can be empty arrays)\n supersedes: z.array(z.string()),\n related: z.array(z.string()),\n\n // Extended fields (optional)\n evidence: z.string().optional(),\n severity: SeveritySchema.optional(),\n\n // Lifecycle fields (optional)\n deleted: z.boolean().optional(),\n deletedAt: z.string().optional(),\n retrievalCount: z.number().optional(),\n\n // Provenance tracking (optional)\n citation: CitationSchema.optional(),\n\n // Age-based validity fields (optional)\n compactionLevel: CompactionLevelSchema.optional(),\n compactedAt: z.string().optional(),\n lastRetrieved: z.string().optional(),\n\n // Invalidation fields (optional)\n invalidatedAt: z.string().optional(),\n invalidationReason: z.string().optional(),\n} as const;\n\n// ---------------------------------------------------------------------------\n// Type-specific schemas\n// ---------------------------------------------------------------------------\n\n/**\n * Lesson memory item schema.\n * Replaces the old quick/full distinction with a single 'lesson' type.\n * Pattern field is optional for lessons.\n */\nexport const LessonItemSchema = z.object({\n ...baseFields,\n type: z.literal('lesson'),\n pattern: PatternSchema.optional(),\n});\n\n/**\n * Solution memory item schema.\n * Uses trigger as \"problem\" and insight as \"resolution\".\n * Pattern field is optional.\n */\nexport const SolutionItemSchema = z.object({\n ...baseFields,\n type: z.literal('solution'),\n pattern: PatternSchema.optional(),\n});\n\n/**\n * Pattern memory item schema.\n * Pattern field is REQUIRED (bad -> good code transformation).\n */\nexport const PatternItemSchema = z.object({\n ...baseFields,\n type: z.literal('pattern'),\n pattern: PatternSchema,\n});\n\n/**\n * Preference memory item schema.\n * Captures user workflow preferences.\n * Pattern field is optional.\n */\nexport const PreferenceItemSchema = z.object({\n ...baseFields,\n type: z.literal('preference'),\n pattern: PatternSchema.optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Discriminated union of all memory item types\n// ---------------------------------------------------------------------------\n\n/**\n * Unified memory item schema (discriminated union on 'type' field).\n * Accepts: lesson, solution, pattern, preference.\n */\nexport const MemoryItemSchema = z.discriminatedUnion('type', [\n LessonItemSchema,\n SolutionItemSchema,\n PatternItemSchema,\n PreferenceItemSchema,\n]);\n\n// ---------------------------------------------------------------------------\n// Backward compatibility\n// ---------------------------------------------------------------------------\n\n/**\n * Legacy lesson schema for reading old JSONL records with type: 'quick' | 'full'.\n * Use this only for parsing existing data files; new records use MemoryItemSchema.\n */\nexport const LegacyLessonSchema = z.object({\n ...baseFields,\n type: LessonTypeSchema,\n pattern: PatternSchema.optional(),\n});\n\n/**\n * LessonSchema - now equivalent to LessonItemSchema.\n *\n * For backward compatibility, existing code that imports LessonSchema\n * continues to work. The type field is now z.literal('lesson').\n *\n * To parse old quick/full records, use LegacyLessonSchema.\n */\nexport const LessonSchema = LessonItemSchema;\n\n/**\n * Legacy tombstone format for backward-compatible reads.\n * Old JSONL files may contain minimal { id, deleted, deletedAt } records.\n */\nexport const LegacyTombstoneSchema = z.object({\n id: z.string(),\n deleted: z.literal(true),\n deletedAt: z.string(), // ISO8601\n});\n\n/**\n * LessonRecord schema - union for reading JSONL files.\n *\n * Accepts:\n * 1. Any new memory item type (lesson, solution, pattern, preference)\n * 2. A legacy lesson (type: 'quick' | 'full')\n * 3. A legacy tombstone (minimal: { id, deleted: true, deletedAt })\n */\nexport const LessonRecordSchema = z.union([\n MemoryItemSchema,\n LegacyLessonSchema,\n LegacyTombstoneSchema,\n]);\n\n/**\n * MemoryItemRecord schema - alias for LessonRecordSchema.\n * Parses all memory item types plus legacy formats.\n */\nexport const MemoryItemRecordSchema = LessonRecordSchema;\n\n// ---------------------------------------------------------------------------\n// Type exports\n// ---------------------------------------------------------------------------\n\nexport type Lesson = z.infer<typeof LessonSchema>;\n/** @deprecated Use MemoryItemType instead. */\nexport type LessonType = z.infer<typeof LessonTypeSchema>;\nexport type LessonRecord = z.infer<typeof LessonRecordSchema>;\nexport type Source = z.infer<typeof SourceSchema>;\nexport type Severity = z.infer<typeof SeveritySchema>;\nexport type Context = z.infer<typeof ContextSchema>;\nexport type Pattern = z.infer<typeof PatternSchema>;\nexport type Citation = z.infer<typeof CitationSchema>;\nexport type CompactionLevel = z.infer<typeof CompactionLevelSchema>;\n\n/** Unified memory item type (discriminated union). */\nexport type MemoryItem = z.infer<typeof MemoryItemSchema>;\n/** Memory item type enum: 'lesson' | 'solution' | 'pattern' | 'preference'. */\nexport type MemoryItemType = z.infer<typeof MemoryItemTypeSchema>;\n/** Solution memory item. */\nexport type Solution = z.infer<typeof SolutionItemSchema>;\n/** Pattern memory item (not to be confused with Pattern = {bad, good}). */\nexport type PatternItem = z.infer<typeof PatternItemSchema>;\n/** Preference memory item. */\nexport type Preference = z.infer<typeof PreferenceItemSchema>;\n/** Record type for reading JSONL files (all types + legacy). */\nexport type MemoryItemRecord = z.infer<typeof MemoryItemRecordSchema>;\n\n// ---------------------------------------------------------------------------\n// ID generation\n// ---------------------------------------------------------------------------\n\n/** Prefix mapping for memory item types. */\nconst TYPE_PREFIXES: Record<MemoryItemType, string> = {\n lesson: 'L',\n solution: 'S',\n pattern: 'P',\n preference: 'R',\n};\n\n/**\n * Generate deterministic memory item ID from insight text.\n * Format: {prefix} + 8 hex characters from SHA-256 hash.\n *\n * @param insight - The insight text to hash\n * @param type - Memory item type (default: 'lesson' for backward compat)\n * @returns ID string like L1a2b3c4d, S1a2b3c4d, P1a2b3c4d, or R1a2b3c4d\n */\nexport function generateId(insight: string, type?: MemoryItemType): string {\n const prefix = TYPE_PREFIXES[type ?? 'lesson'];\n const hash = createHash('sha256').update(insight).digest('hex');\n return `${prefix}${hash.slice(0, 8)}`;\n}\n","/**\n * JSONL storage layer for memory items\n *\n * Append-only storage with last-write-wins deduplication.\n * Source of truth - git trackable.\n *\n * Primary API:\n * appendMemoryItem() - Append any memory item type\n * readMemoryItems() - Read all non-deleted memory items\n *\n * Backward-compatible API:\n * appendLesson() - Append a lesson (delegates to appendMemoryItem)\n * readLessons() - Read lesson-type items only\n *\n * Deletion: append the item with `deleted: true` and `deletedAt`.\n * Read path also accepts old minimal tombstone records for backward compat.\n * Legacy type:'quick'/'full' records are converted to type:'lesson' on read.\n */\n\nimport { appendFile, mkdir, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport {\n MemoryItemRecordSchema,\n type Lesson,\n type LessonRecord,\n type MemoryItem,\n} from '../types.js';\n\n/** Relative path to lessons file from repo root */\nexport const LESSONS_PATH = '.claude/lessons/index.jsonl';\n\n/** Options for reading memory items */\nexport interface ReadLessonsOptions {\n /** If true, throw on first parse error. Default: false (skip errors) */\n strict?: boolean;\n /** Callback for each parse error in non-strict mode */\n onParseError?: (error: ParseError) => void;\n}\n\n/** Parse error details */\nexport interface ParseError {\n /** 1-based line number */\n line: number;\n /** Error message */\n message: string;\n /** Original error */\n cause: unknown;\n}\n\n/** Result of reading lessons (backward-compat) */\nexport interface ReadLessonsResult {\n /** Successfully parsed lessons */\n lessons: Lesson[];\n /** Number of lines skipped due to errors */\n skippedCount: number;\n}\n\n/** Result of reading memory items */\nexport interface ReadMemoryItemsResult {\n /** Successfully parsed memory items */\n items: MemoryItem[];\n /** Number of lines skipped due to errors */\n skippedCount: number;\n}\n\n\n/**\n * Append a memory item to the JSONL file.\n * Creates directory structure if missing.\n * Primary write function for all memory item types.\n *\n * @param repoRoot - Repository root directory\n * @param item - Memory item to append (any type: lesson, solution, pattern, preference)\n */\nexport async function appendMemoryItem(repoRoot: string, item: MemoryItem): Promise<void> {\n const filePath = join(repoRoot, LESSONS_PATH);\n await mkdir(dirname(filePath), { recursive: true });\n\n const line = JSON.stringify(item) + '\\n';\n await appendFile(filePath, line, 'utf-8');\n}\n\n/**\n * Append a lesson to the JSONL file.\n * Backward-compatible wrapper around appendMemoryItem.\n *\n * @param repoRoot - Repository root directory\n * @param lesson - Lesson to append\n */\nexport async function appendLesson(repoRoot: string, lesson: Lesson): Promise<void> {\n return appendMemoryItem(repoRoot, lesson);\n}\n\n/**\n * Parse and validate a single JSON line.\n *\n * Accepts:\n * - New memory item types (lesson, solution, pattern, preference)\n * - Legacy lessons (type: 'quick' | 'full')\n * - Canonical tombstones ({ id, deleted: true, deletedAt })\n * - Legacy tombstones (full record with deleted:true)\n *\n * @returns Parsed record or null if invalid\n */\nfunction parseJsonLine(\n line: string,\n lineNumber: number,\n strict: boolean,\n onParseError?: (error: ParseError) => void\n): LessonRecord | null {\n // Try to parse JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (err) {\n const parseError: ParseError = {\n line: lineNumber,\n message: `Invalid JSON: ${(err as Error).message}`,\n cause: err,\n };\n if (strict) {\n throw new Error(`Parse error on line ${lineNumber}: ${parseError.message}`);\n }\n onParseError?.(parseError);\n return null;\n }\n\n // Validate against MemoryItemRecordSchema (accepts all types + legacy)\n const result = MemoryItemRecordSchema.safeParse(parsed);\n if (!result.success) {\n const parseError: ParseError = {\n line: lineNumber,\n message: `Schema validation failed: ${result.error.message}`,\n cause: result.error,\n };\n if (strict) {\n throw new Error(`Parse error on line ${lineNumber}: ${parseError.message}`);\n }\n onParseError?.(parseError);\n return null;\n }\n\n return result.data;\n}\n\n/**\n * Convert a parsed record to a MemoryItem.\n * Legacy type:'quick'/'full' records are converted to type:'lesson'.\n * Returns null for tombstone-only records (no MemoryItem data).\n */\nfunction toMemoryItem(record: LessonRecord): MemoryItem | null {\n // Tombstone records that are minimal (no type field) cannot be converted\n if (record.deleted === true) {\n return null;\n }\n\n // Legacy type conversion: quick/full -> lesson\n if (record.type === 'quick' || record.type === 'full') {\n return { ...record, type: 'lesson' } as MemoryItem;\n }\n\n // Already a valid MemoryItem type\n return record as MemoryItem;\n}\n\n/**\n * Read all non-deleted memory items from the JSONL file.\n * Primary read function for the unified memory API.\n *\n * Applies last-write-wins deduplication by ID.\n * Converts legacy type:'quick'/'full' to type:'lesson'.\n *\n * Handles tombstone formats:\n * - Canonical: { id, deleted: true, deletedAt }\n * - Legacy: Full record with deleted:true field\n *\n * @param repoRoot - Repository root directory\n * @param options - Optional settings for error handling\n * @returns Result with items array and count of skipped lines\n */\nexport async function readMemoryItems(\n repoRoot: string,\n options: ReadLessonsOptions = {}\n): Promise<ReadMemoryItemsResult> {\n const { strict = false, onParseError } = options;\n const filePath = join(repoRoot, LESSONS_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return { items: [], skippedCount: 0 };\n }\n throw err;\n }\n\n const items = new Map<string, MemoryItem>();\n let skippedCount = 0;\n\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i]!.trim();\n if (!trimmed) continue;\n\n const record = parseJsonLine(trimmed, i + 1, strict, onParseError);\n if (!record) {\n skippedCount++;\n continue;\n }\n\n // Check if record is a tombstone (canonical or legacy)\n if (record.deleted === true) {\n items.delete(record.id);\n } else {\n const item = toMemoryItem(record);\n if (item) {\n items.set(record.id, item);\n }\n }\n }\n\n return { items: Array.from(items.values()), skippedCount };\n}\n\n/**\n * Read all non-deleted lessons from the JSONL file.\n * Backward-compatible wrapper that filters to lesson-type items only.\n *\n * @param repoRoot - Repository root directory\n * @param options - Optional settings for error handling\n * @returns Result with lessons array and count of skipped lines\n */\nexport async function readLessons(\n repoRoot: string,\n options: ReadLessonsOptions = {}\n): Promise<ReadLessonsResult> {\n const result = await readMemoryItems(repoRoot, options);\n\n // Filter to lesson-type items only\n const lessons = result.items.filter((item): item is Lesson => item.type === 'lesson');\n\n return { lessons, skippedCount: result.skippedCount };\n}\n","/**\n * SQLite availability check.\n *\n * Verifies that better-sqlite3 can be loaded. If it cannot, an error\n * is thrown -- there is no silent fallback to JSONL-only mode.\n */\n\nimport { createRequire } from 'node:module';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\n// Create require function for ESM compatibility\nconst require = createRequire(import.meta.url);\n\n/** Cached availability state */\nlet checked = false;\nlet DatabaseConstructor: (new (path: string) => DatabaseType) | null = null;\n\n/**\n * Ensure SQLite (better-sqlite3) is loadable.\n * Throws a clear error if the native module cannot be loaded.\n */\nexport function ensureSqliteAvailable(): void {\n if (checked) return;\n\n try {\n const module = require('better-sqlite3');\n const Constructor = module.default || module;\n const testDb = new Constructor(':memory:');\n testDb.close();\n DatabaseConstructor = Constructor;\n checked = true;\n } catch (cause) {\n throw new Error(\n 'better-sqlite3 failed to load.\\n' +\n 'Run: npx ca setup (auto-configures pnpm native builds)\\n' +\n 'Or manually add to your package.json:\\n' +\n ' \"pnpm\": { \"onlyBuiltDependencies\": [\"better-sqlite3\", \"node-llama-cpp\"] }\\n' +\n 'Then run: pnpm install && pnpm rebuild better-sqlite3\\n' +\n 'For npm/yarn, run: npm rebuild better-sqlite3',\n { cause }\n );\n }\n}\n\n/**\n * Get the SQLite Database constructor.\n * @returns Database constructor (never null -- throws if unavailable)\n */\nexport function getDatabaseConstructor(): new (path: string) => DatabaseType {\n ensureSqliteAvailable();\n return DatabaseConstructor!;\n}\n","/**\n * SQLite schema definition for lessons database.\n *\n * The SQLite database is a rebuildable cache (JSONL is source of truth).\n * When SCHEMA_VERSION changes, the DB file is deleted and recreated.\n */\n\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\n/**\n * Schema version for the SQLite cache.\n * Bump this when making incompatible schema changes.\n * The connection module auto-rebuilds when the DB version is older.\n */\nexport const SCHEMA_VERSION = 3;\n\n/** SQL schema for lessons database with FTS5 full-text search */\nconst SCHEMA_SQL = `\n CREATE TABLE IF NOT EXISTS lessons (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n trigger TEXT NOT NULL,\n insight TEXT NOT NULL,\n evidence TEXT,\n severity TEXT,\n tags TEXT NOT NULL DEFAULT '',\n source TEXT NOT NULL,\n context TEXT NOT NULL DEFAULT '{}',\n supersedes TEXT NOT NULL DEFAULT '[]',\n related TEXT NOT NULL DEFAULT '[]',\n created TEXT NOT NULL,\n confirmed INTEGER NOT NULL DEFAULT 0,\n deleted INTEGER NOT NULL DEFAULT 0,\n retrieval_count INTEGER NOT NULL DEFAULT 0,\n last_retrieved TEXT,\n embedding BLOB,\n content_hash TEXT,\n invalidated_at TEXT,\n invalidation_reason TEXT,\n citation_file TEXT,\n citation_line INTEGER,\n citation_commit TEXT,\n compaction_level INTEGER DEFAULT 0,\n compacted_at TEXT,\n pattern_bad TEXT,\n pattern_good TEXT\n );\n\n CREATE VIRTUAL TABLE IF NOT EXISTS lessons_fts USING fts5(\n id, trigger, insight, tags, pattern_bad, pattern_good,\n content='lessons', content_rowid='rowid'\n );\n\n CREATE TRIGGER IF NOT EXISTS lessons_ai AFTER INSERT ON lessons BEGIN\n INSERT INTO lessons_fts(rowid, id, trigger, insight, tags, pattern_bad, pattern_good)\n VALUES (new.rowid, new.id, new.trigger, new.insight, new.tags, new.pattern_bad, new.pattern_good);\n END;\n\n CREATE TRIGGER IF NOT EXISTS lessons_ad AFTER DELETE ON lessons BEGIN\n INSERT INTO lessons_fts(lessons_fts, rowid, id, trigger, insight, tags, pattern_bad, pattern_good)\n VALUES ('delete', old.rowid, old.id, old.trigger, old.insight, old.tags, old.pattern_bad, old.pattern_good);\n END;\n\n CREATE TRIGGER IF NOT EXISTS lessons_au AFTER UPDATE ON lessons BEGIN\n INSERT INTO lessons_fts(lessons_fts, rowid, id, trigger, insight, tags, pattern_bad, pattern_good)\n VALUES ('delete', old.rowid, old.id, old.trigger, old.insight, old.tags, old.pattern_bad, old.pattern_good);\n INSERT INTO lessons_fts(rowid, id, trigger, insight, tags, pattern_bad, pattern_good)\n VALUES (new.rowid, new.id, new.trigger, new.insight, new.tags, new.pattern_bad, new.pattern_good);\n END;\n\n CREATE INDEX IF NOT EXISTS idx_lessons_created ON lessons(created);\n CREATE INDEX IF NOT EXISTS idx_lessons_confirmed ON lessons(confirmed);\n CREATE INDEX IF NOT EXISTS idx_lessons_severity ON lessons(severity);\n CREATE INDEX IF NOT EXISTS idx_lessons_type ON lessons(type);\n\n CREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n`;\n\n/**\n * Create the database schema and set the version pragma.\n * @param database - SQLite database instance\n */\nexport function createSchema(database: DatabaseType): void {\n database.exec(SCHEMA_SQL);\n database.pragma(`user_version = ${SCHEMA_VERSION}`);\n}\n","/**\n * SQLite database connection management.\n */\n\nimport { mkdirSync, unlinkSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { DbOptions } from './types.js';\nimport { getDatabaseConstructor } from './availability.js';\nimport { createSchema, SCHEMA_VERSION } from './schema.js';\n\n/** Relative path to database file from repo root */\nexport const DB_PATH = '.claude/.cache/lessons.sqlite';\n\n/** Database connections keyed by resolved DB path */\nconst dbMap = new Map<string, DatabaseType>();\n\n/**\n * Check if the database has the expected schema version.\n * @param database - SQLite database instance\n * @returns true if the version matches SCHEMA_VERSION\n */\nfunction hasExpectedVersion(database: DatabaseType): boolean {\n const row = database.pragma('user_version', { simple: true }) as number;\n return row === SCHEMA_VERSION;\n}\n\n/**\n * Open the SQLite database connection.\n * If the database has an older schema version, it is deleted and recreated.\n * Throws if better-sqlite3 cannot be loaded.\n * @param repoRoot - Absolute path to repository root\n * @param options - Database options (e.g., inMemory for testing)\n * @returns Database instance\n */\nexport function openDb(repoRoot: string, options: DbOptions = {}): DatabaseType {\n const { inMemory = false } = options;\n\n // In-memory DBs are keyed by repoRoot so different repos stay isolated\n const key = inMemory ? `:memory:${repoRoot}` : join(repoRoot, DB_PATH);\n\n const cached = dbMap.get(key);\n if (cached) {\n return cached;\n }\n\n const Database = getDatabaseConstructor();\n let database: DatabaseType;\n\n if (inMemory) {\n database = new Database(':memory:');\n } else {\n const dir = dirname(key);\n mkdirSync(dir, { recursive: true });\n database = new Database(key);\n\n if (!hasExpectedVersion(database)) {\n database.close();\n unlinkSync(key);\n database = new Database(key);\n }\n\n database.pragma('journal_mode = WAL');\n }\n\n createSchema(database);\n dbMap.set(key, database);\n return database;\n}\n\n/**\n * Close the SQLite database connection.\n */\nexport function closeDb(): void {\n for (const database of dbMap.values()) {\n database.close();\n }\n dbMap.clear();\n}\n","/**\n * Embedding cache operations for SQLite storage.\n */\n\nimport { createHash } from 'node:crypto';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { CachedEmbeddingData } from './types.js';\nimport { openDb } from './connection.js';\n\n/**\n * Compute content hash for a lesson's trigger and insight.\n * Used to detect content changes for embedding cache invalidation.\n * @param trigger - The lesson trigger text\n * @param insight - The lesson insight text\n * @returns SHA-256 hash of the combined content\n */\nexport function contentHash(trigger: string, insight: string): string {\n return createHash('sha256').update(`${trigger} ${insight}`).digest('hex');\n}\n\n/**\n * Get cached embedding for a lesson.\n * @param repoRoot - Absolute path to repository root\n * @param lessonId - ID of the lesson\n * @param expectedHash - Optional content hash to validate cache freshness\n * @returns Embedding array or null if not cached\n */\nexport function getCachedEmbedding(\n repoRoot: string,\n lessonId: string,\n expectedHash?: string\n): number[] | null {\n const database = openDb(repoRoot);\n\n const row = database\n .prepare('SELECT embedding, content_hash FROM lessons WHERE id = ?')\n .get(lessonId) as { embedding: Buffer | null; content_hash: string | null } | undefined;\n\n if (!row || !row.embedding || !row.content_hash) {\n return null;\n }\n\n if (expectedHash && row.content_hash !== expectedHash) {\n return null;\n }\n\n const float32 = new Float32Array(\n row.embedding.buffer,\n row.embedding.byteOffset,\n row.embedding.byteLength / 4\n );\n return Array.from(float32);\n}\n\n/**\n * Cache embedding for a lesson in SQLite.\n *\n * Uses UPDATE-only (not INSERT) — the row must already exist in the\n * lessons table. If the row hasn't been synced from JSONL yet, the\n * write is a silent no-op and the embedding will be recomputed on\n * next access. This is by-design: the cache is an optional\n * optimization, not the source of truth.\n *\n * @param repoRoot - Absolute path to repository root\n * @param lessonId - ID of the lesson\n * @param embedding - Embedding vector (Float32Array or number array)\n * @param hash - Content hash for cache validation\n */\nexport function setCachedEmbedding(\n repoRoot: string,\n lessonId: string,\n embedding: Float32Array | number[],\n hash: string\n): void {\n const database = openDb(repoRoot);\n\n const float32 = embedding instanceof Float32Array ? embedding : new Float32Array(embedding);\n const buffer = Buffer.from(float32.buffer, float32.byteOffset, float32.byteLength);\n\n database\n .prepare('UPDATE lessons SET embedding = ?, content_hash = ? WHERE id = ?')\n .run(buffer, hash, lessonId);\n}\n\n/**\n * Collect all cached embeddings from the database.\n * Used during index rebuild to preserve valid caches.\n * @param database - SQLite database instance\n * @returns Map of lesson ID to cached embedding data\n */\nexport function collectCachedEmbeddings(database: DatabaseType): Map<string, CachedEmbeddingData> {\n const cache = new Map<string, CachedEmbeddingData>();\n const rows = database\n .prepare('SELECT id, embedding, content_hash FROM lessons WHERE embedding IS NOT NULL')\n .all() as Array<{ id: string; embedding: Buffer; content_hash: string | null }>;\n\n for (const row of rows) {\n if (row.embedding && row.content_hash) {\n cache.set(row.id, { embedding: row.embedding, contentHash: row.content_hash });\n }\n }\n return cache;\n}\n","/**\n * SQLite index synchronization with JSONL source of truth.\n */\n\nimport { statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { MemoryItem } from '../../types.js';\nimport { LESSONS_PATH, readMemoryItems } from '../jsonl.js';\n\nimport type { SyncOptions } from './types.js';\nimport { openDb } from './connection.js';\nimport { collectCachedEmbeddings, contentHash } from './cache.js';\n\n/** SQL for inserting a lesson record */\nconst INSERT_LESSON_SQL = `\n INSERT INTO lessons (id, type, trigger, insight, evidence, severity, tags, source, context, supersedes, related, created, confirmed, deleted, retrieval_count, last_retrieved, embedding, content_hash, invalidated_at, invalidation_reason, citation_file, citation_line, citation_commit, compaction_level, compacted_at, pattern_bad, pattern_good)\n VALUES (@id, @type, @trigger, @insight, @evidence, @severity, @tags, @source, @context, @supersedes, @related, @created, @confirmed, @deleted, @retrieval_count, @last_retrieved, @embedding, @content_hash, @invalidated_at, @invalidation_reason, @citation_file, @citation_line, @citation_commit, @compaction_level, @compacted_at, @pattern_bad, @pattern_good)\n`;\n\n/**\n * Get the modification time of the JSONL file.\n * @param repoRoot - Absolute path to repository root\n * @returns Modification time in milliseconds or null if file doesn't exist\n */\nfunction getJsonlMtime(repoRoot: string): number | null {\n const jsonlPath = join(repoRoot, LESSONS_PATH);\n try {\n const stat = statSync(jsonlPath);\n return stat.mtimeMs;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the last sync modification time from metadata.\n * @param database - SQLite database instance\n * @returns Last sync mtime or null if not set\n */\nfunction getLastSyncMtime(database: DatabaseType): number | null {\n const row = database\n .prepare('SELECT value FROM metadata WHERE key = ?')\n .get('last_sync_mtime') as { value: string } | undefined;\n return row ? parseFloat(row.value) : null;\n}\n\n/**\n * Set the last sync modification time in metadata.\n * @param database - SQLite database instance\n * @param mtime - Modification time to store\n */\nfunction setLastSyncMtime(database: DatabaseType, mtime: number): void {\n database\n .prepare('INSERT OR REPLACE INTO metadata (key, value) VALUES (?, ?)')\n .run('last_sync_mtime', mtime.toString());\n}\n\n/**\n * Rebuild the SQLite index from JSONL source of truth.\n * Preserves cached embeddings when item content hasn't changed.\n * @param repoRoot - Absolute path to repository root\n */\nexport async function rebuildIndex(repoRoot: string): Promise<void> {\n const database = openDb(repoRoot);\n\n const { items } = await readMemoryItems(repoRoot);\n const cachedEmbeddings = collectCachedEmbeddings(database);\n database.exec('DELETE FROM lessons');\n\n if (items.length === 0) {\n const mtime = getJsonlMtime(repoRoot);\n if (mtime !== null) {\n setLastSyncMtime(database, mtime);\n }\n return;\n }\n\n const insert = database.prepare(INSERT_LESSON_SQL);\n const insertMany = database.transaction((memoryItems: MemoryItem[]) => {\n for (const item of memoryItems) {\n const newHash = contentHash(item.trigger, item.insight);\n const cached = cachedEmbeddings.get(item.id);\n const hasValidCache = cached && cached.contentHash === newHash;\n\n insert.run({\n id: item.id,\n type: item.type,\n trigger: item.trigger,\n insight: item.insight,\n evidence: item.evidence ?? null,\n severity: item.severity ?? null,\n tags: item.tags.join(','),\n source: item.source,\n context: JSON.stringify(item.context),\n supersedes: JSON.stringify(item.supersedes),\n related: JSON.stringify(item.related),\n created: item.created,\n confirmed: item.confirmed ? 1 : 0,\n deleted: item.deleted ? 1 : 0,\n retrieval_count: item.retrievalCount ?? 0,\n last_retrieved: item.lastRetrieved ?? null,\n embedding: hasValidCache ? cached.embedding : null,\n content_hash: hasValidCache ? cached.contentHash : null,\n invalidated_at: item.invalidatedAt ?? null,\n invalidation_reason: item.invalidationReason ?? null,\n citation_file: item.citation?.file ?? null,\n citation_line: item.citation?.line ?? null,\n citation_commit: item.citation?.commit ?? null,\n compaction_level: item.compactionLevel ?? 0,\n compacted_at: item.compactedAt ?? null,\n pattern_bad: item.pattern?.bad ?? null,\n pattern_good: item.pattern?.good ?? null,\n });\n }\n });\n\n insertMany(items);\n\n const mtime = getJsonlMtime(repoRoot);\n if (mtime !== null) {\n setLastSyncMtime(database, mtime);\n }\n}\n\n/**\n * Sync SQLite index if JSONL has changed.\n * @param repoRoot - Absolute path to repository root\n * @param options - Sync options\n * @returns true if sync was performed, false otherwise\n */\nexport async function syncIfNeeded(\n repoRoot: string,\n options: SyncOptions = {}\n): Promise<boolean> {\n const { force = false } = options;\n const jsonlMtime = getJsonlMtime(repoRoot);\n if (jsonlMtime === null && !force) {\n return false;\n }\n\n const database = openDb(repoRoot);\n\n const lastSyncMtime = getLastSyncMtime(database);\n const needsRebuild = force || lastSyncMtime === null || (jsonlMtime !== null && jsonlMtime > lastSyncMtime);\n\n if (needsRebuild) {\n await rebuildIndex(repoRoot);\n return true;\n }\n\n return false;\n}\n","/**\n * SQLite search operations using FTS5 full-text search.\n */\n\nimport { MemoryItemSchema } from '../../types.js';\nimport type { MemoryItem, MemoryItemType } from '../../types.js';\n\nimport type { MemoryItemRow, RetrievalStat } from './types.js';\nimport { openDb } from './connection.js';\n\n/**\n * Convert a database row to a MemoryItem object.\n * @param row - Database row\n * @returns MemoryItem object\n */\nfunction rowToMemoryItem(row: MemoryItemRow): MemoryItem | null {\n const item = {\n id: row.id,\n type: row.type,\n trigger: row.trigger,\n insight: row.insight,\n tags: row.tags ? row.tags.split(',').filter(Boolean) : [],\n source: row.source,\n context: JSON.parse(row.context),\n supersedes: JSON.parse(row.supersedes),\n related: JSON.parse(row.related),\n created: row.created,\n confirmed: row.confirmed === 1,\n } as Record<string, unknown>;\n\n if (row.evidence !== null) item.evidence = row.evidence;\n if (row.severity !== null) item.severity = row.severity;\n if (row.deleted === 1) item.deleted = true;\n if (row.retrieval_count > 0) item.retrievalCount = row.retrieval_count;\n if (row.invalidated_at !== null) item.invalidatedAt = row.invalidated_at;\n if (row.invalidation_reason !== null) item.invalidationReason = row.invalidation_reason;\n if (row.citation_file !== null) {\n item.citation = {\n file: row.citation_file,\n ...(row.citation_line !== null && { line: row.citation_line }),\n ...(row.citation_commit !== null && { commit: row.citation_commit }),\n };\n }\n if (row.compaction_level !== null && row.compaction_level !== 0) {\n item.compactionLevel = row.compaction_level;\n }\n if (row.compacted_at !== null) item.compactedAt = row.compacted_at;\n if (row.last_retrieved !== null) item.lastRetrieved = row.last_retrieved;\n if (row.pattern_bad !== null && row.pattern_good !== null) {\n item.pattern = { bad: row.pattern_bad, good: row.pattern_good };\n }\n\n const result = MemoryItemSchema.safeParse(item);\n if (!result.success) return null;\n return result.data;\n}\n\n\n/** FTS5 operator tokens to remove */\nconst FTS_OPERATORS = new Set(['AND', 'OR', 'NOT', 'NEAR']);\n\n/**\n * Sanitize a query string for safe use with FTS5 MATCH.\n * Strips special FTS5 syntax characters and operators.\n * @param query - Raw user query\n * @returns Sanitized query safe for FTS5\n */\nexport function sanitizeFtsQuery(query: string): string {\n // Strip FTS5 special chars: \" * ^ - +\n const stripped = query.replace(/[\"*^+-]/g, '');\n // Tokenize by whitespace, remove FTS operators, filter empty\n const tokens = stripped\n .split(/\\s+/)\n .filter((t) => t.length > 0 && !FTS_OPERATORS.has(t));\n return tokens.join(' ');\n}\n\n/**\n * Increment retrieval count for lessons.\n * @param repoRoot - Absolute path to repository root\n * @param lessonIds - IDs of retrieved lessons\n */\nexport function incrementRetrievalCount(repoRoot: string, lessonIds: string[]): void {\n if (lessonIds.length === 0) return;\n\n const database = openDb(repoRoot);\n\n const now = new Date().toISOString();\n\n const update = database.prepare(`\n UPDATE lessons\n SET retrieval_count = retrieval_count + 1,\n last_retrieved = ?\n WHERE id = ?\n `);\n\n const updateMany = database.transaction((ids: string[]) => {\n for (const id of ids) {\n update.run(now, id);\n }\n });\n\n updateMany(lessonIds);\n}\n\n/**\n * Search lessons using FTS5 full-text search.\n * @param repoRoot - Absolute path to repository root\n * @param query - FTS5 query string\n * @param limit - Maximum number of results\n * @param typeFilter - Optional memory item type to filter by\n * @returns Matching lessons\n */\nexport async function searchKeyword(\n repoRoot: string,\n query: string,\n limit: number,\n typeFilter?: MemoryItemType\n): Promise<MemoryItem[]> {\n const database = openDb(repoRoot);\n\n const countResult = database.prepare('SELECT COUNT(*) as cnt FROM lessons').get() as {\n cnt: number;\n };\n if (countResult.cnt === 0) return [];\n\n const sanitized = sanitizeFtsQuery(query);\n if (sanitized === '') return [];\n\n try {\n if (typeFilter) {\n const rows = database\n .prepare(\n `\n SELECT l.*\n FROM lessons l\n JOIN lessons_fts fts ON l.rowid = fts.rowid\n WHERE lessons_fts MATCH ?\n AND l.invalidated_at IS NULL\n AND l.type = ?\n LIMIT ?\n `\n )\n .all(sanitized, typeFilter, limit) as MemoryItemRow[];\n return rows.map(rowToMemoryItem).filter((x): x is MemoryItem => x !== null);\n }\n\n const rows = database\n .prepare(\n `\n SELECT l.*\n FROM lessons l\n JOIN lessons_fts fts ON l.rowid = fts.rowid\n WHERE lessons_fts MATCH ?\n AND l.invalidated_at IS NULL\n LIMIT ?\n `\n )\n .all(sanitized, limit) as MemoryItemRow[];\n\n return rows.map(rowToMemoryItem).filter((x): x is MemoryItem => x !== null);\n } catch (err) {\n // Log for debugging — sanitization should prevent most FTS5 errors,\n // but real issues (e.g. DB corruption) should not be fully silent\n const message = err instanceof Error ? err.message : 'Unknown FTS5 error';\n console.error(`[compound-agent] search error: ${message}`);\n return [];\n }\n}\n\n/**\n * Get retrieval statistics for all lessons.\n * @param repoRoot - Absolute path to repository root\n * @returns Array of retrieval statistics\n */\nexport function getRetrievalStats(repoRoot: string): RetrievalStat[] {\n const database = openDb(repoRoot);\n\n const rows = database\n .prepare('SELECT id, retrieval_count, last_retrieved FROM lessons')\n .all() as Array<{ id: string; retrieval_count: number; last_retrieved: string | null }>;\n\n return rows.map((row) => ({\n id: row.id,\n count: row.retrieval_count,\n lastRetrieved: row.last_retrieved,\n }));\n}\n","/**\n * Shared utility functions for the Learning Agent.\n */\n\n/** Milliseconds per day for time calculations */\nexport const MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n/**\n * Calculate the age of a lesson in days from its created date.\n *\n * @param lesson - Object with a created field (ISO8601 string)\n * @returns Age in days (integer, rounded down)\n */\nexport function getLessonAgeDays(lesson: { created: string }): number {\n const created = new Date(lesson.created).getTime();\n const now = Date.now();\n return Math.floor((now - created) / MS_PER_DAY);\n}\n","/**\n * Compaction and auto-archive for lessons\n *\n * Handles:\n * - Archiving old lessons (>90 days with 0 retrievals)\n * - Removing tombstones through JSONL rewrite\n * - Tracking compaction thresholds\n */\n\nimport { appendFile, mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport { MemoryItemSchema } from '../types.js';\nimport type { MemoryItem } from '../types.js';\nimport { getLessonAgeDays } from '../../utils.js';\n\nimport { LESSONS_PATH } from './jsonl.js';\n\n/** Relative path to archive directory from repo root */\nexport const ARCHIVE_DIR = '.claude/lessons/archive';\n\n/** Number of tombstones that triggers automatic compaction */\nexport const TOMBSTONE_THRESHOLD = 100;\n\n/** Age threshold for archiving (in days) */\nexport const ARCHIVE_AGE_DAYS = 90;\n\n/** Month offset for JavaScript's 0-indexed months */\nconst MONTH_INDEX_OFFSET = 1;\n\n/** Padding length for month in archive filename (e.g., \"01\" not \"1\") */\nconst MONTH_PAD_LENGTH = 2;\n\n/**\n * Result of a compaction operation\n */\nexport interface CompactResult {\n /** Number of lessons moved to archive */\n archived: number;\n /** Number of tombstones removed */\n tombstonesRemoved: number;\n /** Number of lessons remaining in index.jsonl */\n lessonsRemaining: number;\n /** Number of records dropped due to invalid schema */\n droppedInvalid: number;\n}\n\n/**\n * Generate archive file path for a given date.\n * Format: .claude/lessons/archive/YYYY-MM.jsonl\n */\nexport function getArchivePath(repoRoot: string, date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + MONTH_INDEX_OFFSET).padStart(MONTH_PAD_LENGTH, '0');\n return join(repoRoot, ARCHIVE_DIR, `${year}-${month}.jsonl`);\n}\n\n/**\n * Parse raw JSONL lines from the lessons file.\n * Returns all lines (including invalid ones) as parsed objects or null.\n */\nasync function parseRawJsonlLines(\n repoRoot: string\n): Promise<Array<{ line: string; parsed: Record<string, unknown> | null }>> {\n const filePath = join(repoRoot, LESSONS_PATH);\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n return [];\n }\n\n const results: Array<{ line: string; parsed: Record<string, unknown> | null }> = [];\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const parsed = JSON.parse(trimmed) as Record<string, unknown>;\n results.push({ line: trimmed, parsed });\n } catch {\n results.push({ line: trimmed, parsed: null });\n }\n }\n return results;\n}\n\n/**\n * Count the number of tombstones (deleted: true records) in the JSONL file.\n */\nexport async function countTombstones(repoRoot: string): Promise<number> {\n const lines = await parseRawJsonlLines(repoRoot);\n let count = 0;\n for (const { parsed } of lines) {\n if (parsed && parsed['deleted'] === true) {\n count++;\n }\n }\n return count;\n}\n\n/**\n * Check if compaction is needed based on tombstone count.\n */\nexport async function needsCompaction(repoRoot: string): Promise<boolean> {\n const count = await countTombstones(repoRoot);\n return count >= TOMBSTONE_THRESHOLD;\n}\n\n/**\n * Determine if a lesson should be archived based on age and retrieval count.\n * Lessons are archived if older than ARCHIVE_AGE_DAYS and never retrieved.\n *\n * @param lesson - The lesson to evaluate\n * @returns true if lesson should be archived\n */\nfunction shouldArchive(lesson: MemoryItem): boolean {\n const ageDays = getLessonAgeDays(lesson);\n\n // Archive if: older than threshold AND never retrieved\n return ageDays > ARCHIVE_AGE_DAYS && (lesson.retrievalCount === undefined || lesson.retrievalCount === 0);\n}\n\n/**\n * Run full compaction: archive old lessons and remove tombstones.\n *\n * Reads the JSONL file exactly once, computes all operations in-memory,\n * then writes archive files and atomically replaces the main file.\n */\nexport async function compact(repoRoot: string): Promise<CompactResult> {\n const filePath = join(repoRoot, LESSONS_PATH);\n\n // 1. Read file ONCE\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n return { archived: 0, tombstonesRemoved: 0, lessonsRemaining: 0, droppedInvalid: 0 };\n }\n\n // 2. Parse all records in-memory with last-write-wins dedup\n const lessonMap = new Map<string, MemoryItem>();\n let tombstoneCount = 0;\n let droppedCount = 0;\n\n for (const rawLine of content.split('\\n')) {\n const trimmed = rawLine.trim();\n if (!trimmed) continue;\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(trimmed) as Record<string, unknown>;\n } catch {\n continue;\n }\n\n if (parsed['deleted'] === true) {\n lessonMap.delete(parsed['id'] as string);\n tombstoneCount++;\n } else {\n const result = MemoryItemSchema.safeParse(parsed);\n if (result.success) {\n lessonMap.set(result.data.id, result.data);\n } else {\n droppedCount++;\n }\n }\n }\n\n // 3. Split into archivable and kept\n const toArchive: MemoryItem[] = [];\n const toKeep: MemoryItem[] = [];\n\n for (const lesson of lessonMap.values()) {\n if (shouldArchive(lesson)) {\n toArchive.push(lesson);\n } else {\n toKeep.push(lesson);\n }\n }\n\n // 4. Write archive files\n if (toArchive.length > 0) {\n const archiveGroups = new Map<string, MemoryItem[]>();\n for (const lesson of toArchive) {\n const created = new Date(lesson.created);\n const archivePath = getArchivePath(repoRoot, created);\n const group = archiveGroups.get(archivePath) ?? [];\n group.push(lesson);\n archiveGroups.set(archivePath, group);\n }\n\n const archiveDir = join(repoRoot, ARCHIVE_DIR);\n await mkdir(archiveDir, { recursive: true });\n\n for (const [archivePath, archiveLessons] of archiveGroups) {\n const lines = archiveLessons.map((l) => JSON.stringify(l) + '\\n').join('');\n await appendFile(archivePath, lines, 'utf-8');\n }\n }\n\n // 5. Atomic write of main JSONL with only kept lessons\n await mkdir(dirname(filePath), { recursive: true });\n const tempPath = filePath + '.tmp';\n const lines = toKeep.map((lesson) => JSON.stringify(lesson) + '\\n');\n await writeFile(tempPath, lines.join(''), 'utf-8');\n await rename(tempPath, filePath);\n\n return {\n archived: toArchive.length,\n tombstonesRemoved: tombstoneCount,\n lessonsRemaining: toKeep.length,\n droppedInvalid: droppedCount,\n };\n}\n","/**\n * Vector search with cosine similarity\n *\n * Embeds query text and ranks lessons by semantic similarity.\n * Uses SQLite cache to avoid recomputing embeddings.\n */\n\nimport { readCctPatterns, type CctPattern } from '../../compound/index.js';\nimport { embedText } from '../embeddings/index.js';\nimport { contentHash, getCachedEmbedding, readMemoryItems, setCachedEmbedding } from '../storage/index.js';\nimport type { MemoryItem } from '../types.js';\n\n/**\n * In-memory embedding cache for CCT patterns.\n * CCT patterns don't have rows in the SQLite lessons table,\n * so setCachedEmbedding (UPDATE-only) is a no-op for them.\n * This Map caches embeddings keyed by \"id:contentHash\".\n */\nconst cctEmbeddingCache = new Map<string, number[]>();\n\n/** Clear the CCT embedding cache. Exported for testing. */\nexport function clearCctEmbeddingCache(): void {\n cctEmbeddingCache.clear();\n}\n\n/**\n * Calculate cosine similarity between two vectors.\n * Returns value between -1 (opposite) and 1 (identical).\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Vectors must have same length');\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i]! * b[i]!;\n normA += a[i]! * a[i]!;\n normB += b[i]! * b[i]!;\n }\n\n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n if (magnitude === 0) return 0;\n\n return dotProduct / magnitude;\n}\n\n/**\n * Memory item with similarity score.\n * The `lesson` field holds any MemoryItem type (not just Lesson).\n * Field name kept for backward compatibility.\n */\nexport interface ScoredLesson {\n lesson: MemoryItem;\n score: number;\n}\n\n/** Options for vector search */\nexport interface SearchVectorOptions {\n /** Maximum number of results to return (default: 10) */\n limit?: number;\n}\n\n/** Default number of results to return */\nconst DEFAULT_LIMIT = 10;\n\n/**\n * Search lessons by vector similarity to query text.\n * Returns top N lessons sorted by similarity score (descending).\n * Uses embedding cache to avoid recomputing embeddings.\n */\n/**\n * Convert a CctPattern to a MemoryItem-like shape for search results.\n */\nfunction cctToMemoryItem(pattern: CctPattern): MemoryItem {\n return {\n id: pattern.id,\n type: 'lesson',\n trigger: pattern.name,\n insight: pattern.description,\n tags: [],\n source: 'manual',\n context: { tool: 'compound', intent: 'synthesis' },\n created: pattern.created,\n confirmed: true,\n supersedes: [],\n related: pattern.sourceIds,\n };\n}\n\nexport async function searchVector(\n repoRoot: string,\n query: string,\n options?: SearchVectorOptions\n): Promise<ScoredLesson[]> {\n const limit = options?.limit ?? DEFAULT_LIMIT;\n // Read all memory items (all types)\n const { items } = await readMemoryItems(repoRoot);\n\n // Read CCT patterns if available\n let cctPatterns: CctPattern[] = [];\n try {\n cctPatterns = await readCctPatterns(repoRoot);\n } catch {\n // File doesn't exist or is unreadable — proceed without CCT patterns\n }\n\n if (items.length === 0 && cctPatterns.length === 0) return [];\n\n // Embed the query\n const queryVector = await embedText(query);\n\n // Score each item, skipping invalidated ones\n const scored: ScoredLesson[] = [];\n for (const item of items) {\n // Skip invalidated items\n if (item.invalidatedAt) continue;\n\n try {\n const itemText = `${item.trigger} ${item.insight}`;\n const hash = contentHash(item.trigger, item.insight);\n\n // Try cache first\n let itemVector = getCachedEmbedding(repoRoot, item.id, hash);\n\n if (!itemVector) {\n // Cache miss - compute and store\n itemVector = await embedText(itemText);\n setCachedEmbedding(repoRoot, item.id, itemVector, hash);\n }\n\n const score = cosineSimilarity(queryVector, itemVector);\n scored.push({ lesson: item, score });\n } catch {\n // Skip items that fail embedding — return partial results\n continue;\n }\n }\n\n // Score CCT patterns (use in-memory cache since they lack SQLite rows)\n for (const pattern of cctPatterns) {\n try {\n const text = `${pattern.name} ${pattern.description}`;\n const hash = contentHash(pattern.name, pattern.description);\n const cacheKey = `${pattern.id}:${hash}`;\n\n let vec = cctEmbeddingCache.get(cacheKey);\n if (!vec) {\n vec = await embedText(text);\n cctEmbeddingCache.set(cacheKey, vec);\n }\n\n const score = cosineSimilarity(queryVector, vec);\n scored.push({ lesson: cctToMemoryItem(pattern), score });\n } catch {\n continue;\n }\n }\n\n // Sort by score descending and take top N\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, limit);\n}\n","/**\n * Multi-factor memory item ranking system\n *\n * Combines vector similarity with semantic boosts:\n * - Severity: high=1.5, medium=1.0, low=0.8\n * - Recency: 1.2 for items ≤30 days old\n * - Confirmation: 1.3 for confirmed items\n */\n\nimport type { MemoryItem } from '../types.js';\nimport { getLessonAgeDays } from '../../utils.js';\n\nimport type { ScoredLesson } from './vector.js';\n\n/** Lesson/memory item with final ranked score */\nexport interface RankedLesson extends ScoredLesson {\n finalScore?: number;\n}\n\nconst RECENCY_THRESHOLD_DAYS = 30;\nconst HIGH_SEVERITY_BOOST = 1.5;\nconst MEDIUM_SEVERITY_BOOST = 1.0;\nconst LOW_SEVERITY_BOOST = 0.8;\nconst RECENCY_BOOST = 1.2;\nconst CONFIRMATION_BOOST = 1.3;\n\n/**\n * Maximum combined boost multiplier.\n *\n * Without clamping, the max boost is 1.5 * 1.2 * 1.3 = 2.34x, which lets\n * a 0.4 similarity item outrank a 0.9 similarity item. With a 1.8 cap,\n * an item needs at least ~0.53 similarity with all boosts to beat a 0.95\n * unboosted match, keeping semantic relevance as the primary ranking signal.\n */\nconst MAX_COMBINED_BOOST = 1.8;\n\n/**\n * Calculate severity boost based on item severity.\n * Items without severity get 1.0 (medium boost).\n */\nexport function severityBoost(item: MemoryItem): number {\n switch (item.severity) {\n case 'high':\n return HIGH_SEVERITY_BOOST;\n case 'medium':\n return MEDIUM_SEVERITY_BOOST;\n case 'low':\n return LOW_SEVERITY_BOOST;\n default:\n return MEDIUM_SEVERITY_BOOST;\n }\n}\n\n/**\n * Calculate recency boost based on item age.\n * Items ≤30 days old get 1.2, older get 1.0.\n */\nexport function recencyBoost(item: MemoryItem): number {\n const ageDays = getLessonAgeDays(item);\n return ageDays <= RECENCY_THRESHOLD_DAYS ? RECENCY_BOOST : 1.0;\n}\n\n/**\n * Calculate confirmation boost.\n * Confirmed items get 1.3, unconfirmed get 1.0.\n */\nexport function confirmationBoost(item: MemoryItem): number {\n return item.confirmed ? CONFIRMATION_BOOST : 1.0;\n}\n\n/**\n * Calculate combined score for a memory item.\n * score = vectorSimilarity * min(severity * recency * confirmation, MAX_COMBINED_BOOST)\n */\nexport function calculateScore(item: MemoryItem, vectorSimilarity: number): number {\n const boost = Math.min(\n severityBoost(item) * recencyBoost(item) * confirmationBoost(item),\n MAX_COMBINED_BOOST,\n );\n return vectorSimilarity * boost;\n}\n\n/**\n * Rank lessons by combined score.\n * Returns new array sorted by finalScore descending.\n *\n * Works with ScoredLesson[] (uses .lesson field).\n */\nexport function rankLessons(lessons: ScoredLesson[]): RankedLesson[] {\n return lessons\n .map((scored) => ({\n ...scored,\n finalScore: calculateScore(scored.lesson, scored.score),\n }))\n .sort((a, b) => (b.finalScore ?? 0) - (a.finalScore ?? 0));\n}\n\n","/**\n * Clustering module for grouping similar memory items.\n *\n * Uses single-linkage agglomerative clustering with cosine similarity.\n */\n\nimport { cosineSimilarity } from '../memory/search/index.js';\nimport type { MemoryItem } from '../memory/index.js';\nimport type { ClusterResult } from './types.js';\n\n/** Default similarity threshold for clustering */\nconst DEFAULT_THRESHOLD = 0.75;\n\n/**\n * Build a pairwise cosine similarity matrix from embedding vectors.\n *\n * @param embeddings - Array of embedding vectors\n * @returns NxN similarity matrix\n */\nexport function buildSimilarityMatrix(embeddings: number[][]): number[][] {\n const n = embeddings.length;\n const matrix: number[][] = Array.from({ length: n }, () => new Array<number>(n).fill(0));\n\n for (let i = 0; i < n; i++) {\n matrix[i]![i] = 1.0;\n for (let j = i + 1; j < n; j++) {\n const sim = cosineSimilarity(embeddings[i]!, embeddings[j]!);\n matrix[i]![j] = sim;\n matrix[j]![i] = sim;\n }\n }\n\n return matrix;\n}\n\n/**\n * Cluster memory items by embedding similarity using single-linkage\n * agglomerative clustering.\n *\n * @param items - Memory items to cluster\n * @param embeddings - Embedding vectors (same order as items)\n * @param threshold - Minimum similarity to merge clusters (default: 0.75)\n * @returns Clusters of similar items and noise (unclustered items)\n */\nexport function clusterBySimilarity(\n items: MemoryItem[],\n embeddings: number[][],\n threshold: number = DEFAULT_THRESHOLD\n): ClusterResult {\n const n = items.length;\n if (n === 0) return { clusters: [], noise: [] };\n\n const matrix = buildSimilarityMatrix(embeddings);\n\n // Union-Find for single-linkage clustering\n const parent = Array.from({ length: n }, (_, i) => i);\n\n function find(x: number): number {\n while (parent[x] !== x) {\n parent[x] = parent[parent[x]!]!; // path compression\n x = parent[x]!;\n }\n return x;\n }\n\n function union(a: number, b: number): void {\n const rootA = find(a);\n const rootB = find(b);\n if (rootA !== rootB) parent[rootA] = rootB;\n }\n\n // Merge pairs above threshold\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (matrix[i]![j]! >= threshold) {\n union(i, j);\n }\n }\n }\n\n // Group items by their root\n const groups = new Map<number, MemoryItem[]>();\n for (let i = 0; i < n; i++) {\n const root = find(i);\n let group = groups.get(root);\n if (!group) {\n group = [];\n groups.set(root, group);\n }\n group.push(items[i]!);\n }\n\n const clusters = Array.from(groups.values());\n return { clusters, noise: [] };\n}\n","/**\n * Types for the compounding module.\n *\n * CctPattern represents a cross-cutting pattern synthesized\n * from multiple similar lessons.\n */\n\nimport { createHash } from 'node:crypto';\nimport { z } from 'zod';\n\nimport type { MemoryItem } from '../memory/index.js';\n\n/** Relative path to CCT patterns file from repo root */\nexport const CCT_PATTERNS_PATH = '.claude/lessons/cct-patterns.jsonl';\n\n/** Schema for a cross-cutting pattern */\nexport const CctPatternSchema = z.object({\n id: z.string().regex(/^CCT-[a-f0-9]{8}$/),\n name: z.string().min(1),\n description: z.string().min(1),\n frequency: z.number().int().positive(),\n testable: z.boolean(),\n testApproach: z.string().optional(),\n sourceIds: z.array(z.string()).min(1),\n created: z.string(), // ISO8601\n});\n\n/** Inferred type from CctPatternSchema */\nexport type CctPattern = z.infer<typeof CctPatternSchema>;\n\n/** Result from clustering operation */\nexport interface ClusterResult {\n /** Groups of similar items */\n clusters: MemoryItem[][];\n /** Items that didn't fit any cluster */\n noise: MemoryItem[];\n}\n\n/**\n * Generate a CCT pattern ID from a cluster ID string.\n * Format: \"CCT-\" + first 8 hex chars of SHA-256 hash.\n */\nexport function generateCctId(input: string): string {\n const hash = createHash('sha256').update(input).digest('hex');\n return `CCT-${hash.slice(0, 8)}`;\n}\n","/**\n * I/O module for CctPattern persistence.\n *\n * Append-only JSONL storage, following the same pattern as\n * src/memory/storage/jsonl.ts.\n */\n\nimport { appendFile, mkdir, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport { CCT_PATTERNS_PATH, CctPatternSchema, type CctPattern } from './types.js';\n\n/**\n * Read all CCT patterns from the JSONL file.\n *\n * @param repoRoot - Repository root directory\n * @returns Array of CctPattern objects\n */\nexport async function readCctPatterns(repoRoot: string): Promise<CctPattern[]> {\n const filePath = join(repoRoot, CCT_PATTERNS_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw err;\n }\n\n const patterns: CctPattern[] = [];\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n const parsed = JSON.parse(trimmed) as unknown;\n const result = CctPatternSchema.safeParse(parsed);\n if (result.success) {\n patterns.push(result.data);\n }\n }\n\n return patterns;\n}\n\n/**\n * Append CCT patterns to the JSONL file (append-only).\n *\n * @param repoRoot - Repository root directory\n * @param patterns - Patterns to append\n */\nexport async function writeCctPatterns(repoRoot: string, patterns: CctPattern[]): Promise<void> {\n const filePath = join(repoRoot, CCT_PATTERNS_PATH);\n await mkdir(dirname(filePath), { recursive: true });\n\n const lines = patterns.map((p) => JSON.stringify(p) + '\\n').join('');\n await appendFile(filePath, lines, 'utf-8');\n}\n","/**\n * Synthesis module for extracting cross-cutting patterns from clusters.\n *\n * Takes a cluster of similar memory items and produces a CctPattern\n * summarizing the common theme.\n */\n\nimport type { MemoryItem } from '../memory/index.js';\nimport { generateCctId, type CctPattern } from './types.js';\n\n/**\n * Synthesize a CctPattern from a cluster of similar memory items.\n *\n * @param cluster - Group of similar memory items\n * @param clusterId - Identifier for this cluster (used for ID generation)\n * @returns A CctPattern summarizing the cluster\n */\nexport function synthesizePattern(cluster: MemoryItem[], clusterId: string): CctPattern {\n const id = generateCctId(clusterId);\n const frequency = cluster.length;\n const sourceIds = cluster.map((item) => item.id);\n\n // Collect all tags with frequency counts\n const tagCounts = new Map<string, number>();\n for (const item of cluster) {\n for (const tag of item.tags) {\n tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);\n }\n }\n\n // Sort tags by frequency (descending)\n const sortedTags = [...tagCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([tag]) => tag);\n\n // Build name from top tags or first insight\n const name = sortedTags.length > 0\n ? sortedTags.slice(0, 3).join(', ')\n : cluster[0]!.insight.slice(0, 50);\n\n // Build description from all insights\n const description = cluster.map((item) => item.insight).join('; ');\n\n // Determine testability: true if any item has high severity or evidence\n const hasHighSeverity = cluster.some(\n (item) => 'severity' in item && item.severity === 'high'\n );\n const hasEvidence = cluster.some(\n (item) => 'evidence' in item && item.evidence\n );\n const testable = hasHighSeverity || hasEvidence;\n\n // Generate test approach when testable\n const testApproach = testable\n ? `Verify pattern: ${name}. Check ${frequency} related lesson(s).`\n : undefined;\n\n return {\n id,\n name,\n description,\n frequency,\n testable,\n ...(testApproach !== undefined && { testApproach }),\n sourceIds,\n created: new Date().toISOString(),\n };\n}\n","/**\n * Compound command: synthesize CCT patterns from lessons.\n *\n * Reads all memory items, clusters them by embedding similarity,\n * and writes synthesized cross-cutting patterns to cct-patterns.jsonl.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { clusterBySimilarity, synthesizePattern, writeCctPatterns } from '../compound/index.js';\nimport { embedText, isModelUsable } from '../memory/embeddings/index.js';\nimport {\n closeDb,\n contentHash,\n getCachedEmbedding,\n openDb,\n readMemoryItems,\n setCachedEmbedding,\n} from '../memory/storage/index.js';\n\n/**\n * Register compound commands on the program.\n */\nexport function registerCompoundCommands(program: Command): void {\n program\n .command('compound')\n .description('Synthesize cross-cutting patterns from lessons')\n .action(async () => {\n const repoRoot = getRepoRoot();\n\n // Read all memory items\n const { items } = await readMemoryItems(repoRoot);\n if (items.length === 0) {\n console.log('Synthesized 0 patterns from 0 lessons.');\n return;\n }\n\n // Check if embedding model is available\n const modelCheck = await isModelUsable();\n if (!modelCheck.usable) {\n console.error(`Error: Embedding model unavailable — ${modelCheck.reason}`);\n console.error('Run: npx ca download-model');\n process.exitCode = 1;\n return;\n }\n\n // Open DB to enable embedding cache\n openDb(repoRoot);\n\n // Compute embeddings for all items (with cache)\n const embeddings: number[][] = [];\n try {\n for (const item of items) {\n const text = `${item.trigger} ${item.insight}`;\n const hash = contentHash(item.trigger, item.insight);\n\n let vec = getCachedEmbedding(repoRoot, item.id, hash);\n if (!vec) {\n vec = await embedText(text);\n setCachedEmbedding(repoRoot, item.id, vec, hash);\n }\n\n embeddings.push(Array.isArray(vec) ? vec : Array.from(vec));\n }\n } catch (err) {\n console.error(`Error computing embeddings: ${err instanceof Error ? err.message : String(err)}`);\n console.error('Run: npx ca download-model');\n process.exitCode = 1;\n return;\n } finally {\n closeDb();\n }\n\n // Cluster by similarity\n const { clusters } = clusterBySimilarity(items, embeddings);\n\n // Filter clusters with 2+ items (single-item clusters are noise)\n const multiClusters = clusters.filter((c) => c.length >= 2);\n\n // Synthesize patterns from clusters\n const patterns = multiClusters.map((cluster) => {\n const clusterId = cluster.map((item) => item.id).join('-');\n return synthesizePattern(cluster, clusterId);\n });\n\n // Write patterns to file\n if (patterns.length > 0) {\n await writeCctPatterns(repoRoot, patterns);\n }\n\n const lessonCount = items.length;\n console.log(`Synthesized ${patterns.length} pattern(s) from ${lessonCount} lessons.`);\n });\n}\n","/**\n * Package version - lightweight module to avoid circular dependency chains.\n */\n\nimport { createRequire } from 'node:module';\n\nconst _require = createRequire(import.meta.url);\nconst _pkg = _require('../package.json') as { version: string };\n\nexport const VERSION: string = _pkg.version;\n","/**\n * Banner audio — generates a short melodic sequence as a WAV buffer\n * and plays it via the platform's built-in audio player.\n *\n * Zero external dependencies. Pure sine-wave synthesis.\n */\n\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\n\n// -- Audio constants --\nconst SAMPLE_RATE = 22050;\nconst BITS = 16;\nconst MAX_AMP = 0x6000; // ~75% of int16 range to avoid clipping\n\n// -- Note frequencies (Hz) --\nconst NOTE: Record<string, number> = {\n C3: 131, E3: 165, G3: 196,\n C4: 262, D4: 294, E4: 330, G4: 392, A4: 440,\n C5: 523, E5: 659, G5: 784,\n C6: 1047,\n};\n\n// -- Envelope: smooth attack/release to avoid clicks --\nfunction envelope(i: number, total: number, attack: number, release: number): number {\n if (i < attack) return i / attack;\n if (i > total - release) return (total - i) / release;\n return 1;\n}\n\n// -- Generate samples for a single tone --\nfunction tone(freq: number, durationMs: number, amp = 1.0): number[] {\n const samples = Math.floor(SAMPLE_RATE * durationMs / 1000);\n const attack = Math.min(Math.floor(samples * 0.05), 200);\n const release = Math.min(Math.floor(samples * 0.15), 400);\n const out: number[] = [];\n for (let i = 0; i < samples; i++) {\n const env = envelope(i, samples, attack, release);\n out.push(Math.sin(2 * Math.PI * freq * i / SAMPLE_RATE) * env * amp);\n }\n return out;\n}\n\n// -- Mix multiple frequency arrays into one (for chords) --\nfunction chord(freqs: number[], durationMs: number, amp = 1.0): number[] {\n const tones = freqs.map(f => tone(f, durationMs, 1.0));\n const len = tones[0]!.length;\n const out: number[] = [];\n const scale = amp / freqs.length;\n for (let i = 0; i < len; i++) {\n let sum = 0;\n for (const t of tones) sum += t[i]!;\n out.push(sum * scale);\n }\n return out;\n}\n\n// -- Silence --\nfunction silence(durationMs: number): number[] {\n return new Array(Math.floor(SAMPLE_RATE * durationMs / 1000)).fill(0);\n}\n\n// -- Compose the banner melody --\nfunction composeMelody(): number[] {\n const samples: number[] = [];\n\n // Phase 1 — Seed pulse: low warm tones\n samples.push(...tone(NOTE.C3!, 250, 0.3));\n samples.push(...silence(150));\n samples.push(...tone(NOTE.C3!, 250, 0.35));\n samples.push(...silence(100));\n samples.push(...tone(NOTE.E3!, 200, 0.3));\n\n // Phase 2 — Growth: rising pentatonic arpeggio\n samples.push(...silence(80));\n samples.push(...tone(NOTE.C4!, 140, 0.45));\n samples.push(...silence(30));\n samples.push(...tone(NOTE.E4!, 140, 0.5));\n samples.push(...silence(30));\n samples.push(...tone(NOTE.G4!, 140, 0.5));\n samples.push(...silence(30));\n samples.push(...tone(NOTE.C5!, 160, 0.55));\n samples.push(...silence(30));\n samples.push(...tone(NOTE.E5!, 160, 0.55));\n samples.push(...silence(30));\n samples.push(...tone(NOTE.G5!, 180, 0.6));\n samples.push(...silence(60));\n // Second wave — faster\n samples.push(...tone(NOTE.C4!, 100, 0.4));\n samples.push(...tone(NOTE.E4!, 100, 0.45));\n samples.push(...tone(NOTE.G4!, 100, 0.45));\n samples.push(...tone(NOTE.C5!, 120, 0.5));\n samples.push(...tone(NOTE.E5!, 120, 0.55));\n samples.push(...tone(NOTE.G5!, 140, 0.6));\n\n // Phase 3 — Shimmer: sparkly high tones\n samples.push(...silence(60));\n samples.push(...tone(NOTE.C6!, 80, 0.3));\n samples.push(...silence(40));\n samples.push(...tone(NOTE.G5!, 80, 0.35));\n samples.push(...silence(40));\n samples.push(...tone(NOTE.C6!, 80, 0.3));\n samples.push(...silence(40));\n samples.push(...tone(NOTE.E5!, 100, 0.35));\n samples.push(...silence(60));\n\n // Phase 4 — Title: triumphant major chord\n samples.push(...chord([NOTE.C4!, NOTE.E4!, NOTE.G4!], 600, 0.7));\n samples.push(...chord([NOTE.C4!, NOTE.E4!, NOTE.G4!, NOTE.C5!], 500, 0.6));\n\n // Phase 5 — Hold: gentle fade\n samples.push(...chord([NOTE.C3!, NOTE.G3!, NOTE.C4!], 1200, 0.35));\n\n return samples;\n}\n\n// -- WAV file encoding --\nfunction encodeWav(samples: number[]): Buffer {\n const dataSize = samples.length * (BITS / 8);\n const fileSize = 44 + dataSize;\n const buf = Buffer.alloc(fileSize);\n\n // RIFF header\n buf.write('RIFF', 0);\n buf.writeUInt32LE(fileSize - 8, 4);\n buf.write('WAVE', 8);\n\n // fmt chunk\n buf.write('fmt ', 12);\n buf.writeUInt32LE(16, 16); // chunk size\n buf.writeUInt16LE(1, 20); // PCM format\n buf.writeUInt16LE(1, 22); // mono\n buf.writeUInt32LE(SAMPLE_RATE, 24); // sample rate\n buf.writeUInt32LE(SAMPLE_RATE * BITS / 8, 28); // byte rate\n buf.writeUInt16LE(BITS / 8, 32); // block align\n buf.writeUInt16LE(BITS, 34); // bits per sample\n\n // data chunk\n buf.write('data', 36);\n buf.writeUInt32LE(dataSize, 40);\n\n // PCM samples\n let offset = 44;\n for (const s of samples) {\n const clamped = Math.max(-1, Math.min(1, s));\n buf.writeInt16LE(Math.round(clamped * MAX_AMP), offset);\n offset += 2;\n }\n\n return buf;\n}\n\n// -- Cross-platform playback --\nfunction spawnPlayer(filePath: string): ChildProcess | null {\n try {\n switch (process.platform) {\n case 'darwin':\n return spawn('afplay', [filePath], { stdio: 'ignore', detached: true });\n case 'linux':\n return spawn('aplay', ['-q', filePath], { stdio: 'ignore', detached: true });\n case 'win32':\n return spawn('powershell', ['-c',\n `(New-Object Media.SoundPlayer '${filePath}').PlaySync()`\n ], { stdio: 'ignore', detached: true });\n default:\n return null;\n }\n } catch {\n return null; // audio player not found — silent skip\n }\n}\n\n/** Start playing the banner melody. Returns a stop handle, or null if audio unavailable. */\nexport function playBannerAudio(): { stop: () => void } | null {\n try {\n const wav = encodeWav(composeMelody());\n const tmpPath = join(tmpdir(), `ca-banner-${process.pid}.wav`);\n writeFileSync(tmpPath, wav);\n\n const proc = spawnPlayer(tmpPath);\n if (!proc) {\n try { unlinkSync(tmpPath); } catch { /* ignore */ }\n return null;\n }\n\n // Unref so the player doesn't prevent Node from exiting\n proc.unref();\n\n const cleanup = () => {\n try { proc.kill(); } catch { /* already dead */ }\n try { unlinkSync(tmpPath); } catch { /* already cleaned */ }\n };\n\n proc.on('exit', () => {\n try { unlinkSync(tmpPath); } catch { /* ignore */ }\n });\n\n return { stop: cleanup };\n } catch {\n return null; // any failure — silent skip\n }\n}\n","/**\n * Install banner - Organic Tendril Growth animation.\n * Neural knowledge brain builds itself from a single seed.\n */\n\nimport { VERSION } from '../version.js';\nimport { playBannerAudio } from './banner-audio.js';\n\n// -- Dimensions --\nconst W = 62;\nconst H = 22;\n\n// -- ANSI escapes --\nconst CO = {\n VOID: '\\x1B[0;90m',\n DUST: '\\x1B[2;90m',\n OLD: '\\x1B[0;34m',\n SETTLED: '\\x1B[0;36m',\n WARM: '\\x1B[0;35m',\n ACTIVE: '\\x1B[1;36m',\n TIP: '\\x1B[1;35m',\n SPARK: '\\x1B[1;33m',\n FLASH: '\\x1B[1;37m',\n TITLE: '\\x1B[1;36m',\n DIM: '\\x1B[0;90m',\n RESET: '\\x1B[0m',\n} as const;\n\n// -- Brain topology (26 nodes, 44 edges) --\n// Stored as flat arrays; accessor functions provide type-safe index access.\nconst _NX = [30, 22, 38, 15, 25, 35, 45, 11, 19, 28, 36, 43, 49, 13, 21, 30, 39, 47, 17, 25, 34, 43, 23, 30, 37, 30];\nconst _NY = [2, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, 14, 16];\nconst _EA = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 20, 20, 21, 22, 23, 24];\nconst _EB = [1, 2, 4, 5, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 25];\n\nconst nx = (i: number): number => _NX[i]!;\nconst ny = (i: number): number => _NY[i]!;\nconst ea = (i: number): number => _EA[i]!;\nconst eb = (i: number): number => _EB[i]!;\n\nconst CENTER = 15;\nconst nc = _NX.length;\nconst ec = _EA.length;\n\n// -- Tendril characters --\nconst H_CH = ['-', '~', '-', '.', '-'];\nconst V_CH = ['|', ':', '|', '.', '|'];\nconst D_CH = ['.', ':', '.', \"'\", '.'];\n\ntype Canvas = { ch: string[]; co: string[] };\ninterface Particle { x: number; y: number; born: number; life: number; dx: number; dy: number }\n\nconst sleep = (ms: number): Promise<void> => new Promise(r => setTimeout(r, ms));\n\nfunction tendrilChar(adx: number, ady: number, s: number): string {\n if (ady < 2) return H_CH[s % 5]!;\n if (adx < 2) return V_CH[s % 5]!;\n return D_CH[s % 5]!;\n}\n\n// -- Canvas --\n\nfunction mkCanvas(): Canvas {\n return { ch: new Array<string>(W * H).fill(' '), co: new Array<string>(W * H).fill(CO.VOID) };\n}\n\nfunction put(cvs: Canvas, x: number, y: number, ch: string, co: string): void {\n if (x >= 0 && x < W && y >= 0 && y < H) { const i = y * W + x; cvs.ch[i] = ch; cvs.co[i] = co; }\n}\n\nfunction canvasAt(cvs: Canvas, x: number, y: number): string {\n return (x >= 0 && x < W && y >= 0 && y < H) ? cvs.ch[y * W + x]! : ' ';\n}\n\nfunction flush(cvs: Canvas): string {\n let buf = '\\x1B[H\\n\\n';\n let prev = '';\n for (let y = 0; y < H; y++) {\n buf += ' ';\n for (let x = 0; x < W; x++) {\n const i = y * W + x;\n const co = cvs.co[i]!;\n if (co !== prev) { buf += co; prev = co; }\n buf += cvs.ch[i]!;\n }\n buf += `${CO.RESET}\\n`;\n prev = '';\n }\n return buf;\n}\n\n// -- Growth BFS from center --\n\nfunction computeGrowth(): { order: number[]; parent: number[] } {\n const order = [CENTER];\n const parent = [-1];\n const vis = new Uint8Array(nc);\n vis[CENTER] = 1;\n const q = [CENTER];\n\n while (q.length > 0 && order.length < nc) {\n const qi = Math.floor(Math.random() * q.length);\n const cur = q[qi]!;\n const nb: number[] = [];\n for (let e = 0; e < ec; e++) {\n if (ea(e) === cur && !vis[eb(e)]) nb.push(eb(e));\n if (eb(e) === cur && !vis[ea(e)]) nb.push(ea(e));\n }\n if (nb.length > 0) {\n const nxt = nb[Math.floor(Math.random() * nb.length)]!;\n vis[nxt] = 1;\n order.push(nxt);\n parent.push(cur);\n q.push(nxt);\n } else {\n q.splice(qi, 1);\n }\n }\n return { order, parent };\n}\n\n// -- Drawing --\n\nfunction drawTendril(cvs: Canvas, x1: number, y1: number, x2: number, y2: number, color: string): void {\n const dx = x2 - x1, dy = y2 - y1;\n const adx = Math.abs(dx), ady = Math.abs(dy);\n const steps = Math.max(adx, ady, 1);\n for (let s = 1; s < steps; s++) {\n const px = x1 + Math.trunc(dx * s / steps), py = y1 + Math.trunc(dy * s / steps);\n const ex = canvasAt(cvs, px, py);\n if (ex !== ' ' && ex !== '.') continue;\n put(cvs, px, py, tendrilChar(adx, ady, s), color);\n }\n}\n\nfunction drawTendrilPartial(\n cvs: Canvas, x1: number, y1: number, x2: number, y2: number,\n color: string, progress: number,\n): [number, number] {\n const dx = x2 - x1, dy = y2 - y1;\n const adx = Math.abs(dx), ady = Math.abs(dy);\n const steps = Math.max(adx, ady, 1);\n const drawTo = Math.trunc(steps * progress / 100);\n for (let s = 1; s <= drawTo && s < steps; s++) {\n const px = x1 + Math.trunc(dx * s / steps), py = y1 + Math.trunc(dy * s / steps);\n const ex = canvasAt(cvs, px, py);\n if (ex !== ' ' && ex !== '.') continue;\n put(cvs, px, py, tendrilChar(adx, ady, s), color);\n }\n if (drawTo > 0 && drawTo <= steps) {\n return [x1 + Math.trunc(dx * drawTo / steps), y1 + Math.trunc(dy * drawTo / steps)];\n }\n return [x1, y1];\n}\n\n// -- Particles --\n\nfunction spawnParticles(ps: Particle[], x: number, y: number, n: number, frame: number): void {\n for (let i = 0; i < n; i++) {\n ps.push({\n x, y, born: frame, life: Math.floor(Math.random() * 5) + 3,\n dx: Math.floor(Math.random() * 3) - 1, dy: Math.floor(Math.random() * 3) - 1,\n });\n }\n}\n\nfunction renderParticles(cvs: Canvas, ps: Particle[], frame: number): void {\n for (const p of ps) {\n const age = frame - p.born;\n if (age < 0 || age >= p.life) continue;\n p.x += p.dx; p.y += p.dy;\n let ch: string, co: string;\n if (age === 0) { ch = '*'; co = CO.SPARK; }\n else if (age === 1) { ch = '+'; co = CO.TIP; }\n else if (age < 4) { ch = '.'; co = CO.WARM; }\n else { ch = '.'; co = CO.VOID; }\n put(cvs, p.x, p.y, ch, co);\n }\n}\n\n// -- Background dust --\n\nfunction renderBg(cvs: Canvas, frame: number): void {\n for (let y = 1; y < H - 1; y += 2) {\n for (let x = 2; x < W - 2; x += 4) {\n if ((x * 7 + y * 13 + frame) % 11 < 2) put(cvs, x, y, '.', CO.DUST);\n }\n }\n}\n\n// -- Node style during growth phase --\n\nfunction growthNodeStyle(frame: number, i: number, born: number): [string, string] {\n const age = frame - born;\n if (age < 2) return ['*', CO.SPARK];\n if (age < 4) return ['@', CO.FLASH];\n if (age < 8) return ['@', CO.ACTIVE];\n const breath = (frame + i * 3) % 10;\n if (breath < 3 || breath >= 7) return ['o', CO.SETTLED];\n return ['O', CO.ACTIVE];\n}\n\n// -- Main animation --\n\n// eslint-disable-next-line max-lines-per-function -- sequential 5-phase animation loop\nexport async function playInstallBanner(): Promise<void> {\n const { order, parent } = computeGrowth();\n const gc = order.length;\n const ps: Particle[] = [];\n const write = (s: string) => process.stdout.write(s);\n\n write('\\x1B[?25l\\x1B[2J\\x1B[H');\n\n // Start background audio (silently skips if unavailable)\n const audio = playBannerAudio();\n\n // Use 'exit' event (not SIGINT) so cursor restore runs reliably even when\n // cli.ts's own SIGINT handler calls process.exit() before us.\n const restoreCursor = () => process.stdout.write('\\x1B[?25h\\x1B[0m');\n process.on('exit', restoreCursor);\n\n try {\n // Phase 1: Seed pulse (8 frames)\n const seedCh = ['.', 'o', 'O', '@'] as const;\n const seedCo = [CO.VOID, CO.WARM, CO.TIP, CO.FLASH] as const;\n for (let f = 0; f < 8; f++) {\n const cvs = mkCanvas();\n renderBg(cvs, f);\n put(cvs, nx(CENTER), ny(CENTER), seedCh[f % 4 as 0 | 1 | 2 | 3], seedCo[f % 4 as 0 | 1 | 2 | 3]);\n write(flush(cvs));\n write(`\\n ${CO.DIM}Seed detected...\\x1B[K${CO.VOID}\\n`);\n await sleep(60);\n }\n spawnParticles(ps, nx(CENTER), ny(CENTER), 5, 8);\n\n // Phase 2: Tendril growth\n const GSPEED = 4;\n const isGrown = new Uint8Array(nc);\n const grownAt = new Int32Array(nc).fill(999);\n isGrown[CENTER] = 1;\n grownAt[CENTER] = 0;\n const sched = order.map((_: number, g: number) => 8 + g * 2);\n const total = 8 + gc * 2 + GSPEED + 5;\n\n for (let f = 8; f < total; f++) {\n const cvs = mkCanvas();\n renderBg(cvs, f);\n\n for (let g = 0; g < gc; g++) {\n const node = order[g]!;\n if (f < sched[g]!) continue;\n isGrown[node] = 1;\n if (grownAt[node] === 999) { grownAt[node] = f; spawnParticles(ps, nx(node), ny(node), 4, f); }\n }\n\n for (let e = 0; e < ec; e++) {\n const a = ea(e), b = eb(e);\n if (!isGrown[a] || !isGrown[b]) continue;\n const minAge = Math.min(f - grownAt[a]!, f - grownAt[b]!);\n drawTendril(cvs, nx(a), ny(a), nx(b), ny(b), minAge > 12 ? CO.OLD : minAge > 6 ? CO.SETTLED : CO.WARM);\n }\n\n for (let g = 1; g < gc; g++) {\n const node = order[g]!, par = parent[g]!;\n if (f < sched[g]! || f >= sched[g]! + GSPEED) continue;\n const progress = Math.trunc((f - sched[g]!) * 100 / GSPEED);\n const [tipX, tipY] = drawTendrilPartial(cvs, nx(par), ny(par), nx(node), ny(node), CO.TIP, progress);\n if (tipX > 0 && tipY > 0) put(cvs, tipX, tipY, '*', CO.SPARK);\n }\n\n for (let i = 0; i < nc; i++) {\n if (!isGrown[i]) continue;\n const [ch, co] = growthNodeStyle(f, i, grownAt[i]!);\n put(cvs, nx(i), ny(i), ch, co);\n }\n\n renderParticles(cvs, ps, f);\n write(flush(cvs));\n let active = 0;\n for (let i = 0; i < nc; i++) if (isGrown[i]) active++;\n write(`\\n \\x1B[0;35mNodes \\x1B[1;36m${active}\\x1B[0;35m/${nc}\\x1B[0m \\x1B[0;90mGrowing neural tendrils...\\x1B[K\\x1B[0m\\n`);\n await sleep(40);\n }\n\n // Phase 3: Shimmer wave (10 frames)\n for (let f = total; f < total + 10; f++) {\n const cvs = mkCanvas();\n renderBg(cvs, f);\n const wave = (f - total) * 3;\n\n for (let e = 0; e < ec; e++) {\n const a = ea(e), b = eb(e);\n const avgY = Math.trunc((ny(a) + ny(b)) / 2);\n const d = Math.abs(avgY - wave);\n drawTendril(cvs, nx(a), ny(a), nx(b), ny(b), d < 2 ? CO.FLASH : d < 4 ? CO.ACTIVE : d < 6 ? CO.SETTLED : CO.OLD);\n }\n\n for (let i = 0; i < nc; i++) {\n const d = Math.abs(ny(i) - wave);\n if (d < 2) put(cvs, nx(i), ny(i), '@', CO.FLASH);\n else if (d < 4) put(cvs, nx(i), ny(i), '@', CO.ACTIVE);\n else put(cvs, nx(i), ny(i), 'O', CO.SETTLED);\n }\n\n renderParticles(cvs, ps, f);\n write(flush(cvs));\n write(`\\n ${CO.SETTLED}Crystallizing pathways...\\x1B[K${CO.VOID}\\n`);\n await sleep(60);\n }\n\n // Phase 4: Title reveal (15 frames)\n const TITLE = 'COMPOUND';\n const SUBTITLE = 'AGENT';\n const TX = Math.trunc((W - TITLE.length) / 2);\n const TY = 9;\n const SX = Math.trunc((W - SUBTITLE.length) / 2);\n const SY = 11;\n const TAGLINE = 'Break once. Learn forever.';\n const LX = Math.trunc((W - TAGLINE.length) / 2);\n const LY = 19;\n\n for (let f = 0; f < 15; f++) {\n const cvs = mkCanvas();\n renderBg(cvs, f);\n\n for (let e = 0; e < ec; e++) {\n drawTendril(cvs, nx(ea(e)), ny(ea(e)), nx(eb(e)), ny(eb(e)), CO.OLD);\n }\n for (let i = 0; i < nc; i++) {\n const breath = (f + i * 3) % 8;\n if (breath < 2) put(cvs, nx(i), ny(i), 'o', CO.SETTLED);\n else if (breath < 6) put(cvs, nx(i), ny(i), 'O', CO.ACTIVE);\n else put(cvs, nx(i), ny(i), 'o', CO.SETTLED);\n }\n\n let shown = Math.trunc((f + 1) * TITLE.length / 8);\n if (shown > TITLE.length) shown = TITLE.length;\n for (let c = 0; c < shown; c++) {\n put(cvs, TX + c, TY, TITLE.charAt(c), c === shown - 1 && f < 8 ? CO.FLASH : CO.TITLE);\n }\n\n if (f > 5) {\n let sub = Math.trunc((f - 5) * SUBTITLE.length / 6);\n if (sub > SUBTITLE.length) sub = SUBTITLE.length;\n for (let c = 0; c < sub; c++) {\n put(cvs, SX + c, SY, SUBTITLE.charAt(c), c === sub - 1 && f < 12 ? CO.FLASH : CO.TITLE);\n }\n }\n\n if (f > 10) {\n let tag = Math.trunc((f - 10) * TAGLINE.length / 4);\n if (tag > TAGLINE.length) tag = TAGLINE.length;\n for (let c = 0; c < tag; c++) put(cvs, LX + c, LY, TAGLINE.charAt(c), CO.DIM);\n }\n\n write(flush(cvs));\n write('\\n');\n await sleep(70);\n }\n\n // Phase 5: Breathing hold (12 frames)\n const ver = `v${VERSION}`;\n const vx = SX + SUBTITLE.length + 2;\n\n for (let f = 0; f < 12; f++) {\n const cvs = mkCanvas();\n for (let y = 1; y < H - 1; y += 3) {\n for (let x = 2; x < W - 2; x += 5) {\n if ((x + y + f) % 9 < 2) put(cvs, x, y, '.', CO.DUST);\n }\n }\n\n const bp = f % 6;\n const cco = bp < 4 && bp >= 2 ? CO.SETTLED : CO.OLD;\n for (let e = 0; e < ec; e++) {\n drawTendril(cvs, nx(ea(e)), ny(ea(e)), nx(eb(e)), ny(eb(e)), cco);\n }\n\n for (let i = 0; i < nc; i++) {\n const b = (f + i * 2) % 8;\n if (b < 2) put(cvs, nx(i), ny(i), 'o', CO.SETTLED);\n else if (b < 4) put(cvs, nx(i), ny(i), 'O', CO.ACTIVE);\n else if (b < 6) put(cvs, nx(i), ny(i), '@', CO.ACTIVE);\n else put(cvs, nx(i), ny(i), 'O', CO.SETTLED);\n }\n\n for (let c = 0; c < TITLE.length; c++) put(cvs, TX + c, TY, TITLE.charAt(c), CO.TITLE);\n for (let c = 0; c < SUBTITLE.length; c++) put(cvs, SX + c, SY, SUBTITLE.charAt(c), CO.TITLE);\n for (let c = 0; c < TAGLINE.length; c++) put(cvs, LX + c, LY, TAGLINE.charAt(c), CO.DIM);\n for (let c = 0; c < ver.length; c++) put(cvs, vx + c, SY, ver.charAt(c), CO.DIM);\n\n write(flush(cvs));\n write('\\n');\n await sleep(120);\n }\n } finally {\n audio?.stop();\n process.removeListener('exit', restoreCursor);\n restoreCursor();\n write('\\n');\n }\n}\n","/**\n * Beads CLI availability checker.\n *\n * Informational only -- never blocks setup.\n * Synchronous: uses execSync internally.\n */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/** Result of Beads CLI availability check. */\nexport interface BeadsCheckResult {\n /** Whether the `bd` CLI is available on PATH. */\n available: boolean;\n /** Informational message when not available. */\n message?: string;\n}\n\n/**\n * Check whether the Beads CLI (`bd`) is available.\n *\n * Non-blocking: never throws.\n */\nexport function checkBeadsAvailable(): BeadsCheckResult {\n try {\n execSync('command -v bd', { shell: '/bin/sh', stdio: 'pipe', encoding: 'utf-8' });\n return { available: true };\n } catch {\n return {\n available: false,\n message:\n 'Beads CLI not found. Recommended for full workflow (issue tracking, deps, TDD pipeline). Install: https://github.com/Nathandela/beads',\n };\n }\n}\n\n/** Check whether the beads repository is initialized (.beads/ directory exists). */\nexport function checkBeadsInitialized(repoRoot: string): boolean {\n return existsSync(join(repoRoot, '.beads'));\n}\n\n/** Run `bd doctor` and check if beads is healthy. Non-blocking: never throws. */\nexport function checkBeadsHealthy(repoRoot: string): { healthy: boolean; message?: string } {\n try {\n execSync('bd doctor', { cwd: repoRoot, shell: '/bin/sh', stdio: 'pipe', encoding: 'utf-8' });\n return { healthy: true };\n } catch (e: unknown) {\n const msg = e instanceof Error && 'stderr' in e ? String((e as { stderr: unknown }).stderr).trim() : 'bd doctor failed';\n return { healthy: false, message: msg };\n }\n}\n\n/** Full beads health check combining CLI, init, and doctor. */\nexport interface BeadsFullCheck {\n cliAvailable: boolean;\n initialized: boolean;\n healthy: boolean;\n healthMessage?: string;\n}\n\nexport function runFullBeadsCheck(repoRoot: string): BeadsFullCheck {\n const cli = checkBeadsAvailable();\n if (!cli.available) {\n return { cliAvailable: false, initialized: false, healthy: false, healthMessage: cli.message };\n }\n const initialized = checkBeadsInitialized(repoRoot);\n if (!initialized) {\n return { cliAvailable: true, initialized: false, healthy: false };\n }\n const health = checkBeadsHealthy(repoRoot);\n return { cliAvailable: true, initialized: true, healthy: health.healthy, healthMessage: health.message };\n}\n","/**\n * Quality filters for lesson capture\n *\n * Filters to ensure lessons are:\n * - Novel (not duplicate)\n * - Specific (not vague)\n *\n * Actionability check is available but not part of the capture gate.\n * Strategy: capture aggressively, prune later.\n */\n\nimport { searchKeyword, syncIfNeeded } from '../storage/index.js';\nimport type { MemoryItem } from '../types.js';\n\n/** Default similarity threshold for duplicate detection */\nconst DEFAULT_SIMILARITY_THRESHOLD = 0.8;\n\n/** Result of novelty check */\nexport interface NoveltyResult {\n novel: boolean;\n reason?: string;\n existingId?: string;\n}\n\n/** Options for novelty check */\nexport interface NoveltyOptions {\n threshold?: number;\n}\n\n/**\n * Check if an insight is novel (not a duplicate of existing lessons).\n * Uses keyword search to find potentially similar lessons.\n */\nexport async function isNovel(\n repoRoot: string,\n insight: string,\n options: NoveltyOptions = {}\n): Promise<NoveltyResult> {\n const threshold = options.threshold ?? DEFAULT_SIMILARITY_THRESHOLD;\n\n // Sync index if JSONL has changed\n await syncIfNeeded(repoRoot);\n\n // Extract key words for search (take first 3 significant words)\n const words = insight\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n .slice(0, 3);\n\n if (words.length === 0) {\n return { novel: true };\n }\n\n // Search for each word and collect results\n const searchQuery = words.join(' OR ');\n const results = await searchKeyword(repoRoot, searchQuery, 10);\n\n if (results.length === 0) {\n return { novel: true };\n }\n\n return checkSimilarity(insight, results, threshold);\n}\n\n/**\n * Check similarity between insight and existing lessons using Jaccard similarity.\n */\nfunction checkSimilarity(\n insight: string,\n lessons: MemoryItem[],\n threshold: number\n): NoveltyResult {\n const insightWords = new Set(insight.toLowerCase().split(/\\s+/));\n\n for (const lesson of lessons) {\n const lessonWords = new Set(lesson.insight.toLowerCase().split(/\\s+/));\n\n // Calculate Jaccard similarity\n const intersection = [...insightWords].filter((w) => lessonWords.has(w)).length;\n const union = new Set([...insightWords, ...lessonWords]).size;\n const similarity = union > 0 ? intersection / union : 0;\n\n if (similarity >= threshold) {\n return {\n novel: false,\n reason: `Found similar existing lesson: \"${lesson.insight.slice(0, 50)}...\"`,\n existingId: lesson.id,\n };\n }\n }\n\n return { novel: true };\n}\n\n/** Minimum word count for a specific insight */\nconst MIN_WORD_COUNT = 4;\n\n/** Vague patterns that indicate non-specific advice */\nconst VAGUE_PATTERNS = [\n /\\bwrite better\\b/i,\n /\\bbe careful\\b/i,\n /\\bremember to\\b/i,\n /\\bmake sure\\b/i,\n /\\btry to\\b/i,\n /\\bdouble check\\b/i,\n];\n\n/** Generic \"always/never\" phrases (short, lacking specificity) */\nconst GENERIC_IMPERATIVE_PATTERN = /^(always|never)\\s+\\w+(\\s+\\w+){0,2}$/i;\n\n/** Result of specificity check */\nexport interface SpecificityResult {\n specific: boolean;\n reason?: string;\n}\n\n/**\n * Check if an insight is specific enough to be useful.\n * Rejects vague, generic advice that doesn't provide actionable guidance.\n */\nexport function isSpecific(insight: string): SpecificityResult {\n // Check minimum length first\n const words = insight.trim().split(/\\s+/).filter((w) => w.length > 0);\n if (words.length < MIN_WORD_COUNT) {\n return { specific: false, reason: 'Insight is too short to be actionable' };\n }\n\n // Check for vague patterns\n for (const pattern of VAGUE_PATTERNS) {\n if (pattern.test(insight)) {\n return { specific: false, reason: 'Insight matches a vague pattern' };\n }\n }\n\n // Check for generic \"Always X\" or \"Never X\" phrases\n if (GENERIC_IMPERATIVE_PATTERN.test(insight)) {\n return { specific: false, reason: 'Insight matches a vague pattern' };\n }\n\n return { specific: true };\n}\n\n/** Action word patterns that indicate actionable guidance */\nconst ACTION_PATTERNS = [\n /\\buse\\s+.+\\s+instead\\s+of\\b/i, // \"use X instead of Y\"\n /\\bprefer\\s+.+\\s+(over|to)\\b/i, // \"prefer X over Y\" or \"prefer X to Y\"\n /\\balways\\s+.+\\s+when\\b/i, // \"always X when Y\"\n /\\bnever\\s+.+\\s+without\\b/i, // \"never X without Y\"\n /\\bavoid\\s+(using\\s+)?\\w+/i, // \"avoid X\" or \"avoid using X\"\n /\\bcheck\\s+.+\\s+before\\b/i, // \"check X before Y\"\n /^(run|use|add|remove|install|update|configure|set|enable|disable)\\s+/i, // Imperative commands at start\n];\n\n/** Result of actionability check */\nexport interface ActionabilityResult {\n actionable: boolean;\n reason?: string;\n}\n\n/**\n * Check if an insight contains actionable guidance.\n * Returns false for pure observations or questions.\n */\nexport function isActionable(insight: string): ActionabilityResult {\n // Check for action patterns\n for (const pattern of ACTION_PATTERNS) {\n if (pattern.test(insight)) {\n return { actionable: true };\n }\n }\n\n return { actionable: false, reason: 'Insight lacks clear action guidance' };\n}\n\n/** Result of combined quality check */\nexport interface ProposeResult {\n shouldPropose: boolean;\n reason?: string;\n}\n\n/**\n * Combined quality check for lesson proposals.\n * Returns true only if insight is novel AND specific.\n * Actionability gate removed: capture aggressively, prune later.\n */\nexport async function shouldPropose(\n repoRoot: string,\n insight: string\n): Promise<ProposeResult> {\n // Check specificity first (fast, no DB)\n const specificResult = isSpecific(insight);\n if (!specificResult.specific) {\n return { shouldPropose: false, reason: specificResult.reason };\n }\n\n // Check novelty (requires DB lookup)\n const noveltyResult = await isNovel(repoRoot, insight);\n if (!noveltyResult.novel) {\n return { shouldPropose: false, reason: noveltyResult.reason };\n }\n\n return { shouldPropose: true };\n}\n","/**\n * Trigger detection for automatic memory capture\n *\n * Detects patterns that indicate potential learning opportunities:\n * - User corrections\n * - Self-corrections\n * - Test failures\n *\n * Also infers memory item type from insight text:\n * - pattern: \"use X instead of Y\", \"prefer X over Y\"\n * - solution: \"when X, do Y\", \"if X then Y\", \"to fix X\"\n * - preference: \"always X\", \"never X\"\n * - lesson: default for unclassified insights\n */\n\nimport type { Context, MemoryItemType } from '../types.js';\n\n/** Signal data for correction detection */\nexport interface CorrectionSignal {\n messages: string[];\n context: Context;\n}\n\n/** Detected correction result */\nexport interface DetectedCorrection {\n trigger: string;\n correctionMessage: string;\n context: Context;\n}\n\n/** User correction patterns */\nconst USER_CORRECTION_PATTERNS = [\n /\\bno\\b[,.]?\\s/i, // \"no, ...\" or \"no ...\"\n /\\bwrong\\b/i, // \"wrong\"\n /\\bactually\\b/i, // \"actually...\"\n /\\bnot that\\b/i, // \"not that\"\n /\\bi meant\\b/i, // \"I meant\"\n];\n\n/**\n * Detect user correction signals in conversation.\n *\n * Looks for patterns that indicate the user is correcting Claude's\n * understanding or actions.\n *\n * @param signals - Messages and context to analyze\n * @returns Detected correction or null if none found\n */\nexport function detectUserCorrection(signals: CorrectionSignal): DetectedCorrection | null {\n const { messages, context } = signals;\n\n if (messages.length < 2) {\n return null;\n }\n\n // Check later messages for correction patterns\n for (let i = 1; i < messages.length; i++) {\n const message = messages[i];\n if (!message) continue;\n\n for (const pattern of USER_CORRECTION_PATTERNS) {\n if (pattern.test(message)) {\n return {\n trigger: `User correction during ${context.intent}`,\n correctionMessage: message,\n context,\n };\n }\n }\n }\n\n return null;\n}\n\n/** Edit history entry */\nexport interface EditEntry {\n file: string;\n success: boolean;\n timestamp: number;\n}\n\n/** Edit history for self-correction detection */\nexport interface EditHistory {\n edits: EditEntry[];\n}\n\n/** Detected self-correction */\nexport interface DetectedSelfCorrection {\n file: string;\n trigger: string;\n}\n\n/**\n * Detect self-correction patterns in edit history.\n *\n * Looks for edit→fail→re-edit patterns on the same file,\n * which indicate Claude had to correct its own work.\n *\n * @param history - Edit history to analyze\n * @returns Detected self-correction or null if none found\n */\nexport function detectSelfCorrection(history: EditHistory): DetectedSelfCorrection | null {\n const { edits } = history;\n\n if (edits.length < 3) {\n return null;\n }\n\n // Look for edit→fail→re-edit pattern on same file\n for (let i = 0; i <= edits.length - 3; i++) {\n const first = edits[i];\n const second = edits[i + 1];\n const third = edits[i + 2];\n\n if (!first || !second || !third) continue;\n\n // Pattern: success → fail → success on same file\n if (\n first.file === second.file &&\n second.file === third.file &&\n first.success &&\n !second.success &&\n third.success\n ) {\n return {\n file: first.file,\n trigger: `Self-correction on ${first.file}`,\n };\n }\n }\n\n return null;\n}\n\n/** Test result for failure detection */\nexport interface TestResult {\n passed: boolean;\n output: string;\n testFile: string;\n}\n\n/** Detected test failure */\nexport interface DetectedTestFailure {\n testFile: string;\n errorOutput: string;\n trigger: string;\n}\n\n/**\n * Detect test failure patterns.\n *\n * When tests fail, this creates a potential learning opportunity\n * if the failure is later fixed.\n *\n * @param testResult - Test result to analyze\n * @returns Detected test failure or null if tests passed\n */\nexport function detectTestFailure(testResult: TestResult): DetectedTestFailure | null {\n if (testResult.passed) {\n return null;\n }\n\n // Extract first meaningful error line for trigger\n const lines = testResult.output.split('\\n').filter((line) => line.trim().length > 0);\n const errorLine = lines.find((line) => /error|fail|assert/i.test(line)) ?? lines[0] ?? '';\n\n return {\n testFile: testResult.testFile,\n errorOutput: testResult.output,\n trigger: `Test failure in ${testResult.testFile}: ${errorLine.slice(0, 100)}`,\n };\n}\n\n/** Patterns indicating a code pattern (bad -> good transformation) */\nconst PATTERN_INDICATORS = [\n /\\buse\\s+.+\\s+instead\\s+of\\b/i,\n /\\bprefer\\s+.+\\s+(over|to)\\b/i,\n];\n\n/** Patterns indicating a solution (problem -> resolution) */\nconst SOLUTION_INDICATORS = [\n /\\bwhen\\s+.+,\\s/i,\n /\\bif\\s+.+\\bthen\\b/i,\n /\\bif\\s+.+,\\s/i,\n /\\bto\\s+fix\\b/i,\n];\n\n/** Patterns indicating a preference (user workflow choice) */\nconst PREFERENCE_INDICATORS = [\n /\\balways\\s+/i,\n /\\bnever\\s+/i,\n];\n\n/**\n * Infer the memory item type from insight text.\n *\n * Rules (checked in priority order):\n * - \"use X instead of Y\" / \"prefer X over Y\" → pattern\n * - \"when X, do Y\" / \"if X then Y\" / \"to fix X\" → solution\n * - \"always X\" / \"never X\" → preference\n * - Default → lesson\n *\n * @param insight - The insight text to classify\n * @returns The inferred memory item type\n */\nexport function inferMemoryItemType(insight: string): MemoryItemType {\n for (const pattern of PATTERN_INDICATORS) {\n if (pattern.test(insight)) return 'pattern';\n }\n\n for (const pattern of SOLUTION_INDICATORS) {\n if (pattern.test(insight)) return 'solution';\n }\n\n for (const pattern of PREFERENCE_INDICATORS) {\n if (pattern.test(insight)) return 'preference';\n }\n\n return 'lesson';\n}\n","/**\n * Trigger detection integration\n *\n * Orchestrates detection -> quality filter -> memory item proposal flow.\n * Infers memory item type from insight content.\n * Provides a high-level API for CLI and hooks.\n */\n\nimport * as fs from 'node:fs/promises';\n\nimport { z } from 'zod';\n\nimport { ContextSchema } from '../types.js';\nimport type { MemoryItemType, Source } from '../types.js';\nimport { shouldPropose } from './quality.js';\nimport {\n detectUserCorrection,\n detectSelfCorrection,\n detectTestFailure,\n inferMemoryItemType,\n} from './triggers.js';\nimport type {\n CorrectionSignal,\n EditHistory,\n TestResult,\n} from './triggers.js';\n\n/** Detection input types */\nexport type DetectionType = 'user' | 'self' | 'test';\n\n/** Input for user correction detection */\nexport interface UserDetectionInput {\n type: 'user';\n data: CorrectionSignal;\n}\n\n/** Input for self correction detection */\nexport interface SelfDetectionInput {\n type: 'self';\n data: EditHistory;\n}\n\n/** Input for test failure detection */\nexport interface TestDetectionInput {\n type: 'test';\n data: TestResult;\n}\n\n/** Union type for all detection inputs */\nexport type DetectionInput = UserDetectionInput | SelfDetectionInput | TestDetectionInput;\n\n/** Result of successful detection */\nexport interface DetectionResult {\n trigger: string;\n source: Source;\n proposedInsight: string;\n memoryItemType: MemoryItemType;\n}\n\n/**\n * Detect triggers and propose lessons.\n *\n * Runs the appropriate detector based on input type, then filters\n * through quality checks. Returns a proposal if detection passes\n * all quality filters.\n *\n * @param repoRoot - Repository root path\n * @param input - Detection input with type and data\n * @returns Detection result with proposed insight, or null\n */\nexport async function detectAndPropose(\n repoRoot: string,\n input: DetectionInput\n): Promise<DetectionResult | null> {\n const detected = runDetector(input);\n if (!detected) {\n return null;\n }\n\n const { trigger, source, proposedInsight } = detected;\n\n // Run quality filters on proposed insight\n const quality = await shouldPropose(repoRoot, proposedInsight);\n if (!quality.shouldPropose) {\n return null;\n }\n\n // Infer memory item type from insight content\n const memoryItemType = inferMemoryItemType(proposedInsight);\n\n return { trigger, source, proposedInsight, memoryItemType };\n}\n\n/** Internal detection result before quality filtering */\ninterface RawDetection {\n trigger: string;\n source: Source;\n proposedInsight: string;\n}\n\n/**\n * Run the appropriate detector based on input type.\n */\nfunction runDetector(input: DetectionInput): RawDetection | null {\n switch (input.type) {\n case 'user':\n return detectUserCorrectionFlow(input.data);\n case 'self':\n return detectSelfCorrectionFlow(input.data);\n case 'test':\n return detectTestFailureFlow(input.data);\n }\n}\n\n/**\n * Detect user correction and extract insight.\n */\nfunction detectUserCorrectionFlow(data: CorrectionSignal): RawDetection | null {\n const result = detectUserCorrection(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'user_correction',\n proposedInsight: result.correctionMessage,\n };\n}\n\n/**\n * Detect self correction and extract insight.\n */\nfunction detectSelfCorrectionFlow(data: EditHistory): RawDetection | null {\n const result = detectSelfCorrection(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'self_correction',\n // Self-corrections need context to form useful insights\n proposedInsight: `Check ${result.file} for common errors before editing`,\n };\n}\n\n/**\n * Detect test failure and extract insight.\n */\nfunction detectTestFailureFlow(data: TestResult): RawDetection | null {\n const result = detectTestFailure(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'test_failure',\n proposedInsight: result.errorOutput,\n };\n}\n\n/** Zod schema for CorrectionSignal */\nconst CorrectionSignalSchema = z.object({\n messages: z.array(z.string()),\n context: ContextSchema,\n});\n\n/** Zod schema for EditEntry */\nconst EditEntrySchema = z.object({\n file: z.string(),\n success: z.boolean(),\n timestamp: z.number(),\n});\n\n/** Zod schema for EditHistory */\nconst EditHistorySchema = z.object({\n edits: z.array(EditEntrySchema),\n});\n\n/** Zod schema for TestResult */\nconst TestResultSchema = z.object({\n passed: z.boolean(),\n output: z.string(),\n testFile: z.string(),\n});\n\n/** Zod discriminated union for DetectionInput */\nconst DetectionInputSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('user'), data: CorrectionSignalSchema }),\n z.object({ type: z.literal('self'), data: EditHistorySchema }),\n z.object({ type: z.literal('test'), data: TestResultSchema }),\n]);\n\n/**\n * Parse detection input from a JSON file.\n *\n * @param filePath - Path to JSON input file\n * @returns Parsed detection input\n * @throws ZodError if file content doesn't match expected schema\n */\nexport async function parseInputFile(filePath: string): Promise<DetectionInput> {\n const content = await fs.readFile(filePath, 'utf-8');\n const data: unknown = JSON.parse(content);\n return DetectionInputSchema.parse(data);\n}\n","/**\n * Session-start lesson retrieval\n *\n * Loads high-severity lessons at the start of a session.\n * No vector search - just filter by severity and recency.\n */\n\nimport { incrementRetrievalCount, readMemoryItems } from '../storage/index.js';\nimport type { MemoryItem, Severity } from '../types.js';\n\n/** Default number of lessons to load at session start */\nconst DEFAULT_LIMIT = 5;\n\n/** A memory item with severity field present */\ntype LessonWithSeverity = MemoryItem & { severity: Severity };\n\n/**\n * Type guard to check if a memory item has severity set\n */\nfunction hasSeverity(item: MemoryItem): item is MemoryItem & { severity: Severity } {\n return item.severity !== undefined;\n}\n\n/**\n * Load high-severity lessons for session start.\n *\n * Returns confirmed, high-severity lessons sorted by recency.\n * These are the most important lessons to surface at the start\n * of a coding session.\n *\n * @param repoRoot - Repository root directory\n * @param limit - Maximum number of lessons to return (default: 5)\n * @returns Array of high-severity lessons, most recent first\n */\nexport async function loadSessionLessons(\n repoRoot: string,\n limit: number = DEFAULT_LIMIT\n): Promise<LessonWithSeverity[]> {\n const { items } = await readMemoryItems(repoRoot);\n\n // Filter for high-severity, confirmed items of any type (excluding invalidated)\n const highSeverityLessons = items.filter(\n (item): item is MemoryItem & { severity: Severity } =>\n hasSeverity(item) &&\n item.severity === 'high' &&\n item.confirmed &&\n !item.invalidatedAt\n );\n\n // Sort by recency (most recent first)\n highSeverityLessons.sort((a, b) => {\n const dateA = new Date(a.created).getTime();\n const dateB = new Date(b.created).getTime();\n return dateB - dateA;\n });\n\n // Return top N and track surfaced lessons as retrieved.\n const topLessons = highSeverityLessons.slice(0, limit);\n if (topLessons.length > 0) {\n incrementRetrievalCount(repoRoot, topLessons.map((lesson) => lesson.id));\n }\n\n return topLessons;\n}\n","/**\n * Plan-time lesson retrieval\n *\n * Retrieves relevant lessons when planning an implementation.\n * Uses vector search to find semantically similar lessons.\n */\n\nimport { rankLessons, searchVector, type RankedLesson, type ScoredLesson } from '../search/index.js';\nimport { incrementRetrievalCount } from '../storage/index.js';\n\n/** Default number of lessons to retrieve */\nconst DEFAULT_LIMIT = 5;\n\n/** Result of plan-time retrieval */\nexport interface PlanRetrievalResult {\n lessons: RankedLesson[];\n message: string;\n}\n\n/**\n * Retrieve relevant lessons for a plan.\n *\n * Uses vector search to find semantically similar lessons,\n * then applies ranking boosts for severity, recency, and confirmation.\n *\n * Hard-fails if embeddings are unavailable (propagates error from embedText).\n *\n * @param repoRoot - Repository root directory\n * @param planText - The plan text to search against\n * @param limit - Maximum number of lessons to return (default: 5)\n * @returns Ranked lessons and formatted message\n */\nexport async function retrieveForPlan(\n repoRoot: string,\n planText: string,\n limit: number = DEFAULT_LIMIT\n): Promise<PlanRetrievalResult> {\n // Get lessons by vector similarity (will throw if embeddings unavailable)\n const scored = await searchVector(repoRoot, planText, { limit: limit * 2 });\n\n // Apply ranking boosts\n const ranked = rankLessons(scored);\n\n // Take top N after ranking\n const topLessons = ranked.slice(0, limit);\n\n // Track actual plan-time retrieval usage only for surfaced lessons.\n if (topLessons.length > 0) {\n incrementRetrievalCount(repoRoot, topLessons.map((item) => item.lesson.id));\n }\n\n // Format the Lessons Check message\n const message = formatLessonsCheck(topLessons);\n\n return { lessons: topLessons, message };\n}\n\n/**\n * Format a \"Lessons Check\" message for display.\n *\n * This message is intended to be shown at plan-time to remind\n * the developer of relevant lessons before implementation.\n *\n * @param lessons - Ranked lessons to include in the message\n * @returns Formatted message string\n */\nexport function formatLessonsCheck(lessons: ScoredLesson[]): string {\n const header = 'Lessons Check\\n' + '─'.repeat(40);\n\n if (lessons.length === 0) {\n return `${header}\\nNo relevant lessons found for this plan.`;\n }\n\n const lessonLines = lessons.map((l, i) => {\n const bullet = `${i + 1}.`;\n const insight = l.lesson.insight;\n return `${bullet} ${insight}`;\n });\n\n return `${header}\\n${lessonLines.join('\\n')}`;\n}\n","/**\n * Lessons audit check.\n *\n * Surfaces high-severity lessons as info-level findings.\n */\n\nimport { LESSONS_PATH, readMemoryItems } from '../../memory/storage/index.js';\nimport type { AuditCheckResult } from '../types.js';\n\n/**\n * Check for high-severity lessons and return as info findings.\n *\n * @param repoRoot - Repository root directory\n * @returns Audit check result with findings and filesChecked\n */\nexport async function checkLessons(repoRoot: string): Promise<AuditCheckResult> {\n const { items } = await readMemoryItems(repoRoot);\n const findings: AuditCheckResult['findings'] = [];\n\n for (const item of items) {\n if (item.severity === 'high') {\n findings.push({\n file: '',\n issue: `High-severity lesson: ${item.insight}`,\n severity: 'info',\n relatedLessonId: item.id,\n source: 'lesson',\n });\n }\n }\n\n const filesChecked = items.length > 0 ? [LESSONS_PATH] : [];\n return { findings, filesChecked };\n}\n","/**\n * Zod schemas for rule configuration.\n *\n * Rules are defined in .claude/rules.json and describe mechanical checks\n * that can be run against a codebase.\n */\n\nimport { z } from 'zod';\n\n/** Rule severity levels. */\nexport const SeveritySchema = z.enum(['error', 'warning', 'info']);\n\n/** File-pattern check: regex match on files matching a glob. */\nexport const FilePatternCheckSchema = z.object({\n type: z.literal('file-pattern'),\n glob: z.string(),\n pattern: z.string(),\n mustMatch: z.boolean().optional(),\n});\n\n/** File-size check: line count limit on files matching a glob. */\nexport const FileSizeCheckSchema = z.object({\n type: z.literal('file-size'),\n glob: z.string(),\n maxLines: z.number().int().positive(),\n});\n\n/** Script check: run a shell command and check exit code. */\nexport const ScriptCheckSchema = z.object({\n type: z.literal('script'),\n command: z.string(),\n expectExitCode: z.number().int().optional(),\n});\n\n/** Discriminated union of all check types. */\nexport const RuleCheckSchema = z.discriminatedUnion('type', [\n FilePatternCheckSchema,\n FileSizeCheckSchema,\n ScriptCheckSchema,\n]);\n\n/** A single rule definition. */\nexport const RuleSchema = z.object({\n id: z.string().min(1),\n description: z.string(),\n severity: SeveritySchema,\n check: RuleCheckSchema,\n remediation: z.string(),\n});\n\n/** Top-level rule configuration file schema. */\nexport const RuleConfigSchema = z.object({\n rules: z.array(RuleSchema),\n});\n\n// Type exports\nexport type Severity = z.infer<typeof SeveritySchema>;\nexport type FilePatternCheck = z.infer<typeof FilePatternCheckSchema>;\nexport type FileSizeCheck = z.infer<typeof FileSizeCheckSchema>;\nexport type ScriptCheck = z.infer<typeof ScriptCheckSchema>;\nexport type RuleCheck = z.infer<typeof RuleCheckSchema>;\nexport type Rule = z.infer<typeof RuleSchema>;\nexport type RuleConfig = z.infer<typeof RuleConfigSchema>;\n","/**\n * Simple glob-like file finder using Node.js built-in fs.\n *\n * Supports basic glob patterns: **, *, and extension matching.\n * No external dependencies required.\n */\n\nimport { readdirSync, statSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\n/**\n * Convert a simple glob pattern to a regex.\n * Supports: ** (any path), * (any segment), .ext matching.\n *\n * @param glob - Glob pattern (e.g., \"**\\/*.ts\", \"src/*.js\")\n * @returns RegExp that matches the pattern\n */\nexport function globToRegex(glob: string): RegExp {\n const pattern = glob\n .replace(/\\./g, '\\\\.') // escape dots\n .replace(/\\*\\*\\//g, '(.+/)?') // ** matches any directory depth\n .replace(/\\*/g, '[^/]*'); // * matches within a single segment\n return new RegExp(`^${pattern}$`);\n}\n\n/**\n * Find files in baseDir matching a glob pattern.\n *\n * @param baseDir - Root directory to search from\n * @param glob - Glob pattern to match\n * @returns Array of relative file paths matching the pattern\n */\nexport function findFiles(baseDir: string, glob: string): string[] {\n const regex = globToRegex(glob);\n const results: string[] = [];\n\n function walk(dir: string): void {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n // Skip hidden directories and node_modules\n if (entry.startsWith('.') || entry === 'node_modules') continue;\n\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n walk(fullPath);\n } else {\n const relPath = relative(baseDir, fullPath);\n if (regex.test(relPath)) {\n results.push(relPath);\n }\n }\n }\n }\n\n walk(baseDir);\n return results.sort();\n}\n","/**\n * File-pattern rule check implementation.\n *\n * Scans files matching a glob for a regex pattern.\n * By default, matches are violations. With mustMatch=true,\n * files missing the pattern are violations.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { FilePatternCheck } from '../types.js';\nimport type { Violation } from '../engine.js';\n\nimport { findFiles } from './glob-utils.js';\n\n/**\n * Run a file-pattern check against files in baseDir.\n *\n * @param baseDir - Root directory to search from\n * @param check - The file-pattern check configuration\n * @returns Array of violations found\n */\nexport function runFilePatternCheck(\n baseDir: string,\n check: FilePatternCheck,\n): Violation[] {\n const files = findFiles(baseDir, check.glob);\n const regex = new RegExp(check.pattern);\n const violations: Violation[] = [];\n\n for (const file of files) {\n const fullPath = join(baseDir, file);\n const content = readFileSync(fullPath, 'utf-8');\n const lines = content.split('\\n');\n\n if (check.mustMatch) {\n const found = lines.some((line) => regex.test(line));\n if (!found) {\n violations.push({\n file,\n message: `Pattern ${check.pattern} missing from file`,\n });\n }\n } else {\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i]!)) {\n violations.push({\n file,\n line: i + 1,\n message: `Pattern ${check.pattern} matched`,\n });\n }\n }\n }\n }\n\n return violations;\n}\n","/**\n * File-size rule check implementation.\n *\n * Checks that files matching a glob do not exceed a line count limit.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { FileSizeCheck } from '../types.js';\nimport type { Violation } from '../engine.js';\n\nimport { findFiles } from './glob-utils.js';\n\n/**\n * Run a file-size check against files in baseDir.\n *\n * @param baseDir - Root directory to search from\n * @param check - The file-size check configuration\n * @returns Array of violations found\n */\nexport function runFileSizeCheck(\n baseDir: string,\n check: FileSizeCheck,\n): Violation[] {\n const files = findFiles(baseDir, check.glob);\n const violations: Violation[] = [];\n\n for (const file of files) {\n const content = readFileSync(join(baseDir, file), 'utf-8');\n // Count non-empty trailing: split and filter trailing empty from final newline\n const lineCount = content === '' ? 0 : content.split('\\n').filter((_, i, arr) => i < arr.length - 1 || arr[i] !== '').length;\n\n if (lineCount > check.maxLines) {\n violations.push({\n file,\n message: `File has ${lineCount} lines, exceeds limit of ${check.maxLines}`,\n });\n }\n }\n\n return violations;\n}\n","/**\n * Script rule check implementation.\n *\n * Runs a shell command and checks the exit code.\n */\n\nimport { execSync } from 'node:child_process';\n\nimport type { ScriptCheck } from '../types.js';\nimport type { Violation } from '../engine.js';\n\n/**\n * Run a script check by executing a shell command.\n *\n * @param check - The script check configuration\n * @returns Array of violations (empty if command exits with expected code)\n */\nexport function runScriptCheck(check: ScriptCheck, baseDir?: string): Violation[] {\n const expectedCode = check.expectExitCode ?? 0;\n\n try {\n execSync(check.command, { stdio: ['pipe', 'pipe', 'pipe'], cwd: baseDir });\n // Exit code 0\n if (expectedCode !== 0) {\n return [{ message: `Script exited with exit code 0, expected ${expectedCode}` }];\n }\n return [];\n } catch (err: unknown) {\n const exitCode = (err as { status?: number }).status ?? 1;\n if (exitCode === expectedCode) {\n return [];\n }\n const stderr = ((err as { stderr?: Buffer }).stderr ?? Buffer.alloc(0))\n .toString('utf-8')\n .trim();\n const msg = stderr\n ? `Script exited with exit code ${exitCode} (expected ${expectedCode}): ${stderr}`\n : `Script exited with exit code ${exitCode} (expected ${expectedCode})`;\n return [{ message: msg }];\n }\n}\n","/**\n * Rule engine: loads config, runs checks, formats output.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { RuleConfigSchema } from './types.js';\nimport type { Rule, RuleConfig } from './types.js';\n\nimport { runFilePatternCheck } from './checks/file-pattern.js';\nimport { runFileSizeCheck } from './checks/file-size.js';\nimport { runScriptCheck } from './checks/script.js';\n\n/** A single violation found by a rule check. */\nexport interface Violation {\n file?: string;\n line?: number;\n message: string;\n}\n\n/** Result of running a single rule. */\nexport interface RuleResult {\n rule: Rule;\n violations: Violation[];\n passed: boolean;\n}\n\n/** Severity label mapping for output formatting. */\nconst SEVERITY_LABELS: Record<string, string> = {\n error: 'ERROR',\n warning: 'WARN',\n info: 'INFO',\n};\n\n/**\n * Load rule configuration from .claude/rules.json.\n *\n * @param baseDir - Repository root directory\n * @returns Parsed rule configuration (empty rules if no config file)\n * @throws On invalid JSON or schema validation failure\n */\nexport function loadRuleConfig(baseDir: string): RuleConfig {\n const configPath = join(baseDir, '.claude', 'rules.json');\n if (!existsSync(configPath)) {\n return { rules: [] };\n }\n\n const raw = readFileSync(configPath, 'utf-8');\n const json: unknown = JSON.parse(raw);\n return RuleConfigSchema.parse(json);\n}\n\n/**\n * Run all rules against the codebase.\n *\n * @param baseDir - Repository root directory\n * @param rules - Array of rules to check\n * @returns Array of results, one per rule\n */\nexport function runRules(baseDir: string, rules: Rule[]): RuleResult[] {\n return rules.map((rule) => {\n try {\n const violations = runCheck(baseDir, rule);\n return { rule, violations, passed: violations.length === 0 };\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Rule check failed';\n return { rule, violations: [{ message: `Rule check error: ${message}` }], passed: false };\n }\n });\n}\n\n/**\n * Format a single violation as an agent-legible line.\n *\n * Format: SEVERITY [rules] rule-id: file:line -- remediation\n *\n * @param rule - The rule that was violated\n * @param violation - The specific violation\n * @returns Formatted single-line string\n */\nexport function formatViolation(rule: Rule, violation: Violation): string {\n const label = SEVERITY_LABELS[rule.severity] ?? 'INFO';\n const location = violation.file\n ? violation.line\n ? `${violation.file}:${violation.line}`\n : violation.file\n : '';\n const locationPart = location ? ` ${location} --` : '';\n const messagePart = violation.message ? ` ${violation.message} --` : '';\n return `${label} [rules] ${rule.id}:${locationPart}${messagePart} ${rule.remediation}`;\n}\n\n/** Dispatch a rule check to the appropriate handler. */\nfunction runCheck(baseDir: string, rule: Rule): Violation[] {\n switch (rule.check.type) {\n case 'file-pattern':\n return runFilePatternCheck(baseDir, rule.check);\n case 'file-size':\n return runFileSizeCheck(baseDir, rule.check);\n case 'script':\n return runScriptCheck(rule.check, baseDir);\n }\n}\n","/**\n * Patterns audit check.\n *\n * Searches source files for known bad patterns from memory items.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { readMemoryItems } from '../../memory/storage/index.js';\nimport { findFiles } from '../../rules/index.js';\nimport type { AuditCheckResult } from '../types.js';\n\n/**\n * Check for bad patterns in source files.\n *\n * @param repoRoot - Repository root directory\n * @returns Audit check result with findings and filesChecked\n */\nexport async function checkPatterns(repoRoot: string): Promise<AuditCheckResult> {\n const { items } = await readMemoryItems(repoRoot);\n\n // Filter items that have pattern.bad defined\n const patterned = items.filter((item) => item.pattern?.bad);\n if (patterned.length === 0) {\n return { findings: [], filesChecked: [] };\n }\n\n // Find source files to scan\n const sourceFiles = findFiles(repoRoot, '**/*.ts');\n const findings: AuditCheckResult['findings'] = [];\n\n for (const item of patterned) {\n const bad = item.pattern!.bad;\n for (const relPath of sourceFiles) {\n const content = readFileSync(join(repoRoot, relPath), 'utf-8');\n if (content.includes(bad)) {\n findings.push({\n file: relPath,\n issue: `Bad pattern found: \"${bad}\" (${item.insight})`,\n severity: 'warning',\n relatedLessonId: item.id,\n suggestedFix: item.pattern!.good ? `Use: ${item.pattern!.good}` : undefined,\n source: 'pattern',\n });\n }\n }\n }\n\n return { findings, filesChecked: sourceFiles };\n}\n","/**\n * Rules audit check.\n *\n * Wraps loadRuleConfig + runRules and converts violations to AuditFinding format.\n */\n\nimport { loadRuleConfig, runRules } from '../../rules/index.js';\nimport type { AuditCheckResult } from '../types.js';\n\n/**\n * Check rules and return findings with files checked.\n *\n * @param repoRoot - Repository root directory\n * @returns Audit check result with findings and filesChecked\n */\nexport function checkRules(repoRoot: string): AuditCheckResult {\n let config;\n try {\n config = loadRuleConfig(repoRoot);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to load rules config';\n return {\n findings: [{\n file: '.claude/rules.json',\n issue: `Invalid rules configuration: ${message}`,\n severity: 'error',\n source: 'rule',\n }],\n filesChecked: [],\n };\n }\n\n if (config.rules.length === 0) {\n return { findings: [], filesChecked: [] };\n }\n\n const results = runRules(repoRoot, config.rules);\n const findings: AuditCheckResult['findings'] = [];\n const filesCheckedSet = new Set<string>();\n\n for (const result of results) {\n for (const violation of result.violations) {\n if (violation.file) {\n filesCheckedSet.add(violation.file);\n }\n findings.push({\n file: violation.file ?? '',\n issue: violation.message,\n severity: result.rule.severity,\n suggestedFix: result.rule.remediation,\n source: 'rule',\n });\n }\n }\n\n return { findings, filesChecked: [...filesCheckedSet] };\n}\n","/**\n * Audit engine: orchestrates checks and builds report.\n */\n\nimport { checkLessons } from './checks/lessons.js';\nimport { checkPatterns } from './checks/patterns.js';\nimport { checkRules } from './checks/rules.js';\nimport type { AuditCheckResult, AuditFinding, AuditOptions, AuditReport } from './types.js';\n\n/**\n * Run audit checks and build a report.\n *\n * @param repoRoot - Repository root directory\n * @param options - Toggle individual checks (all enabled by default)\n * @returns Complete audit report with findings and summary\n */\nexport async function runAudit(\n repoRoot: string,\n options: AuditOptions = {}\n): Promise<AuditReport> {\n const { includeRules = true, includePatterns = true, includeLessons = true } = options;\n\n const findings: AuditFinding[] = [];\n const allCheckedFiles = new Set<string>();\n\n function collect(result: AuditCheckResult): void {\n findings.push(...result.findings);\n for (const f of result.filesChecked) {\n allCheckedFiles.add(f);\n }\n }\n\n if (includeRules) {\n collect(checkRules(repoRoot));\n }\n\n if (includePatterns) {\n collect(await checkPatterns(repoRoot));\n }\n\n if (includeLessons) {\n collect(await checkLessons(repoRoot));\n }\n\n const errors = findings.filter((f) => f.severity === 'error').length;\n const warnings = findings.filter((f) => f.severity === 'warning').length;\n const infos = findings.filter((f) => f.severity === 'info').length;\n\n return {\n findings,\n summary: { errors, warnings, infos, filesChecked: allCheckedFiles.size },\n timestamp: new Date().toISOString(),\n };\n}\n","/**\n * Audit module types and Zod schemas.\n */\n\nimport { z } from 'zod';\n\n/** Schema for a single audit finding. */\nexport const AuditFindingSchema = z.object({\n file: z.string(),\n issue: z.string(),\n severity: z.enum(['error', 'warning', 'info']),\n relatedLessonId: z.string().optional(),\n suggestedFix: z.string().optional(),\n source: z.enum(['rule', 'pattern', 'lesson']),\n});\n\n/** Schema for the audit summary. */\nexport const AuditSummarySchema = z.object({\n errors: z.number(),\n warnings: z.number(),\n infos: z.number(),\n filesChecked: z.number(),\n});\n\n/** Schema for a complete audit report. */\nexport const AuditReportSchema = z.object({\n findings: z.array(AuditFindingSchema),\n summary: AuditSummarySchema,\n timestamp: z.string(),\n});\n\nexport type AuditFinding = z.infer<typeof AuditFindingSchema>;\nexport type AuditSummary = z.infer<typeof AuditSummarySchema>;\nexport type AuditReport = z.infer<typeof AuditReportSchema>;\n\n/** Return type for individual audit check functions. */\nexport interface AuditCheckResult {\n findings: AuditFinding[];\n filesChecked: string[];\n}\n\n/** Options to toggle individual audit checks. */\nexport interface AuditOptions {\n includeRules?: boolean;\n includePatterns?: boolean;\n includeLessons?: boolean;\n}\n","/**\n * Templates and constants for setup commands.\n */\n\nimport { VERSION } from '../index.js';\n\n// ============================================================================\n// Hooks Constants\n// ============================================================================\n\n/** Pre-commit hook reminder message */\nexport const PRE_COMMIT_MESSAGE = `\n╔══════════════════════════════════════════════════════════════╗\n║ LESSON CAPTURE CHECKPOINT ║\n╠══════════════════════════════════════════════════════════════╣\n║ STOP. Before this commit, take a moment to reflect: ║\n║ ║\n║ [ ] Did I learn something relevant during this session? ║\n║ [ ] Is there anything worth remembering for next time? ║\n║ ║\n║ If so, consider capturing a lesson: ║\n║ npx ca learn \"<insight>\" --trigger \"<what happened>\" ║\n╚══════════════════════════════════════════════════════════════╝`;\n\n/** Pre-commit hook shell script template */\nexport const PRE_COMMIT_HOOK_TEMPLATE = `#!/bin/sh\n# Compound Agent pre-commit hook\n# Reminds Claude to consider capturing lessons before commits\n\nnpx ca hooks run pre-commit\n`;\n\n/** Marker comment to identify our hook */\nexport const HOOK_MARKER = '# Compound Agent pre-commit hook';\n\n/** Block to insert into existing hooks */\nexport const COMPOUND_AGENT_HOOK_BLOCK = `\n# Compound Agent pre-commit hook (appended)\nnpx ca hooks run pre-commit\n`;\n\n// ============================================================================\n// Claude Code Hooks Configuration\n// ============================================================================\n\n/** Markers to identify our hook in Claude Code settings (current and legacy) */\nexport const CLAUDE_HOOK_MARKERS = [\n 'ca prime',\n 'ca load-session',\n 'compound-agent load-session',\n 'ca hooks run user-prompt',\n 'ca hooks run post-tool-failure',\n 'ca hooks run post-tool-success',\n 'ca hooks run phase-guard',\n 'ca hooks run read-tracker',\n 'ca hooks run stop-audit',\n // v1.2.9 canonical names\n 'ca hooks run post-read',\n 'ca hooks run phase-audit',\n];\n\n/** Claude Code SessionStart hook configuration (v0.2.4: uses prime for trust language) */\nexport const CLAUDE_HOOK_CONFIG = {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: 'npx ca prime 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code PreCompact hook configuration */\nexport const CLAUDE_PRECOMPACT_HOOK_CONFIG = {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: 'npx ca prime 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code UserPromptSubmit hook configuration */\nexport const CLAUDE_USER_PROMPT_HOOK_CONFIG = {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run user-prompt 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code PostToolUseFailure hook configuration */\nexport const CLAUDE_POST_TOOL_FAILURE_HOOK_CONFIG = {\n matcher: 'Bash|Edit|Write',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run post-tool-failure 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code PostToolUse hook configuration (for success reset) */\nexport const CLAUDE_POST_TOOL_SUCCESS_HOOK_CONFIG = {\n matcher: 'Bash|Edit|Write',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run post-tool-success 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code PreToolUse hook config for phase guard */\nexport const CLAUDE_PHASE_GUARD_HOOK_CONFIG = {\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run phase-guard 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code PostToolUse hook config for skill-read tracking. */\nexport const CLAUDE_POST_READ_HOOK_CONFIG = {\n matcher: 'Read',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run post-read 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code Stop hook config for phase gate verification. */\nexport const CLAUDE_PHASE_AUDIT_HOOK_CONFIG = {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run phase-audit 2>/dev/null || true',\n },\n ],\n};\n\n// Back-compat aliases for test imports and older references.\nexport const CLAUDE_READ_TRACKER_HOOK_CONFIG = CLAUDE_POST_READ_HOOK_CONFIG;\nexport const CLAUDE_STOP_AUDIT_HOOK_CONFIG = CLAUDE_PHASE_AUDIT_HOOK_CONFIG;\n\n// Note: PreCommit is NOT a valid Claude Code hook type.\n// The remind-capture functionality is handled by git pre-commit hooks instead.\n// See installPreCommitHook() in hooks.ts for git hook installation.\n\n// ============================================================================\n// Init Command Constants\n// ============================================================================\n\n/** Section header to check for idempotency */\nexport const COMPOUND_AGENT_SECTION_HEADER = '## Compound Agent Integration';\n\n// ============================================================================\n// CLAUDE.md Reference Constants (lfy)\n// ============================================================================\n\n/** Start marker for CLAUDE.md reference section */\nexport const CLAUDE_REF_START_MARKER = '<!-- compound-agent:claude-ref:start -->';\n\n/** End marker for CLAUDE.md reference section */\nexport const CLAUDE_REF_END_MARKER = '<!-- compound-agent:claude-ref:end -->';\n\n/** Reference content to add to CLAUDE.md */\nexport const CLAUDE_MD_REFERENCE = `\n${CLAUDE_REF_START_MARKER}\n## Compound Agent\nSee AGENTS.md for lesson capture workflow.\n${CLAUDE_REF_END_MARKER}\n`;\n\n// ============================================================================\n// AGENTS.md Section Markers (e2r)\n// ============================================================================\n\n/** Start marker for AGENTS.md Learning Agent section */\nexport const AGENTS_SECTION_START_MARKER = '<!-- compound-agent:start -->';\n\n/** End marker for AGENTS.md Learning Agent section */\nexport const AGENTS_SECTION_END_MARKER = '<!-- compound-agent:end -->';\n\n/** Template content for AGENTS.md */\nexport const AGENTS_MD_TEMPLATE = `\n${AGENTS_SECTION_START_MARKER}\n## Compound Agent Integration\n\nThis project uses compound-agent for session memory via **CLI commands**.\n\n### CLI Commands (ALWAYS USE THESE)\n\n**You MUST use CLI commands for lesson management:**\n\n| Command | Purpose |\n|---------|---------|\n| \\`npx ca search \"query\"\\` | Search lessons - use BEFORE architectural decisions |\n| \\`npx ca learn \"insight\"\\` | Capture lessons - use AFTER corrections or discoveries |\n| \\`npx ca list\\` | List all stored lessons |\n| \\`npx ca show <id>\\` | Show details of a specific lesson |\n| \\`npx ca wrong <id>\\` | Mark a lesson as incorrect |\n\n### Mandatory Recall\n\nYou MUST call \\`npx ca search\\` BEFORE:\n- Architectural decisions or complex planning\n- Patterns you've implemented before in this repo\n- After user corrections (\"actually...\", \"wrong\", \"use X instead\")\n\n**NEVER skip search for complex decisions.** Past mistakes will repeat.\n\n### Capture Protocol\n\nRun \\`npx ca learn\\` AFTER:\n- User corrects you\n- Test fail → fix → pass cycles\n- You discover project-specific knowledge\n\n**Workflow**: Search BEFORE deciding, capture AFTER learning.\n\n### Quality Gate\n\nBefore capturing, verify the lesson is:\n- **Novel** - Not already stored\n- **Specific** - Clear guidance\n- **Actionable** (preferred) - Obvious what to do\n\n### Never Edit JSONL Directly\n\n**WARNING: NEVER edit .claude/lessons/index.jsonl directly.**\n\nThe JSONL file requires proper ID generation, schema validation, and SQLite sync.\nUse CLI (\\`npx ca learn\\`) — never manual edits.\n\nSee [documentation](https://github.com/Nathandela/compound_agent) for more details.\n${AGENTS_SECTION_END_MARKER}\n`;\n\n// ============================================================================\n// Legacy Slash Commands (removed in v1.1 — now in WORKFLOW_COMMANDS)\n// ============================================================================\n\n/** File names of slash commands that used to live at .claude/commands/ root level.\n * Used by --update to clean up stale files from v1.0 deployments. */\nexport const LEGACY_ROOT_SLASH_COMMANDS = [\n 'learn.md', 'search.md', 'list.md', 'prime.md', 'show.md', 'wrong.md', 'stats.md',\n];\n\n// ============================================================================\n// Plugin Configuration (ctv)\n// ============================================================================\n\n/** Plugin manifest for .claude/plugin.json */\nexport const PLUGIN_MANIFEST = {\n name: 'compound-agent',\n description: 'Session memory for Claude Code - capture and retrieve lessons',\n version: VERSION,\n author: {\n name: 'Nathan Delacrétaz',\n url: 'https://github.com/Nathandela',\n },\n repository: 'https://github.com/Nathandela/compound_agent',\n license: 'MIT',\n hooks: {\n SessionStart: [\n {\n matcher: '',\n hooks: [\n { type: 'command', command: 'npx ca prime 2>/dev/null || true' },\n ],\n },\n ],\n PreCompact: [\n {\n matcher: '',\n hooks: [{ type: 'command', command: 'npx ca prime 2>/dev/null || true' }],\n },\n ],\n UserPromptSubmit: [\n {\n matcher: '',\n hooks: [{ type: 'command', command: 'npx ca hooks run user-prompt 2>/dev/null || true' }],\n },\n ],\n PostToolUseFailure: [\n {\n matcher: 'Bash|Edit|Write',\n hooks: [{ type: 'command', command: 'npx ca hooks run post-tool-failure 2>/dev/null || true' }],\n },\n ],\n PostToolUse: [\n {\n matcher: 'Bash|Edit|Write',\n hooks: [{ type: 'command', command: 'npx ca hooks run post-tool-success 2>/dev/null || true' }],\n },\n {\n matcher: 'Read',\n hooks: [{ type: 'command', command: 'npx ca hooks run post-read 2>/dev/null || true' }],\n },\n ],\n PreToolUse: [\n {\n matcher: 'Edit|Write',\n hooks: [{ type: 'command', command: 'npx ca hooks run phase-guard 2>/dev/null || true' }],\n },\n ],\n Stop: [\n {\n matcher: '',\n hooks: [{ type: 'command', command: 'npx ca hooks run phase-audit 2>/dev/null || true' }],\n },\n ],\n // Note: PreCommit is handled by git hooks, not Claude Code hooks\n },\n};\n","/**\n * Claude Code settings helpers.\n *\n * Functions for reading, writing, and manipulating Claude Code settings.json.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport {\n AGENTS_SECTION_END_MARKER,\n AGENTS_SECTION_START_MARKER,\n CLAUDE_HOOK_CONFIG,\n CLAUDE_HOOK_MARKERS,\n CLAUDE_PHASE_AUDIT_HOOK_CONFIG,\n CLAUDE_PHASE_GUARD_HOOK_CONFIG,\n CLAUDE_POST_READ_HOOK_CONFIG,\n CLAUDE_POST_TOOL_FAILURE_HOOK_CONFIG,\n CLAUDE_POST_TOOL_SUCCESS_HOOK_CONFIG,\n CLAUDE_PRECOMPACT_HOOK_CONFIG,\n CLAUDE_REF_END_MARKER,\n CLAUDE_REF_START_MARKER,\n CLAUDE_USER_PROMPT_HOOK_CONFIG,\n} from './templates.js';\nimport type { ClaudeHooksResult } from './types.js';\n\n/**\n * Get the path to Claude Code settings file.\n *\n * @param global - If true, return global path (~/.claude/settings.json).\n * If false (default), return project-local path (.claude/settings.json).\n */\nexport function getClaudeSettingsPath(global: boolean): string {\n if (global) {\n return join(homedir(), '.claude', 'settings.json');\n }\n const repoRoot = getRepoRoot();\n return join(repoRoot, '.claude', 'settings.json');\n}\n\n/**\n * Read and parse Claude Code settings.\n */\nexport async function readClaudeSettings(settingsPath: string): Promise<Record<string, unknown>> {\n if (!existsSync(settingsPath)) {\n return {};\n }\n const content = await readFile(settingsPath, 'utf-8');\n return JSON.parse(content) as Record<string, unknown>;\n}\n\n/**\n * Check if our hook is already installed.\n * Checks for both current (ca) and legacy (compound-agent) markers in any hook type.\n */\nexport function hasClaudeHook(settings: Record<string, unknown>): boolean {\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks) return false;\n\n // Check all hook types we manage\n const hookTypes = ['SessionStart', 'PreCompact', 'UserPromptSubmit', 'PostToolUseFailure', 'PostToolUse', 'PreToolUse', 'Stop'];\n\n return hookTypes.some((hookType) => {\n const hookArray = hooks[hookType];\n if (!hookArray) return false;\n\n return hookArray.some((entry) => {\n const hookEntry = entry as { hooks?: Array<{ command?: string }> };\n return hookEntry.hooks?.some((h) =>\n CLAUDE_HOOK_MARKERS.some((marker) => h.command?.includes(marker))\n );\n });\n });\n}\n\n/**\n * Check whether every required hook type/config is installed.\n * This is stricter than hasClaudeHook(), which only checks for any marker.\n */\nexport function hasAllCompoundAgentHooks(settings: Record<string, unknown>): boolean {\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks) return false;\n\n return (\n hasHookTypeAny(hooks.SessionStart ?? [], ['ca prime']) &&\n hasHookTypeAny(hooks.PreCompact ?? [], ['ca prime']) &&\n hasHookTypeAny(hooks.UserPromptSubmit ?? [], ['ca hooks run user-prompt']) &&\n hasHookTypeAny(hooks.PostToolUseFailure ?? [], ['ca hooks run post-tool-failure']) &&\n hasHookTypeAny(hooks.PostToolUse ?? [], ['ca hooks run post-tool-success']) &&\n hasHookTypeAny(hooks.PostToolUse ?? [], ['ca hooks run post-read', 'ca hooks run read-tracker']) &&\n hasHookTypeAny(hooks.PreToolUse ?? [], ['ca hooks run phase-guard']) &&\n hasHookTypeAny(hooks.Stop ?? [], ['ca hooks run phase-audit', 'ca hooks run stop-audit'])\n );\n}\n\n/**\n * Add our hook to SessionStart array.\n */\nexport function addCompoundAgentHook(settings: Record<string, unknown>): void {\n if (!settings.hooks) {\n settings.hooks = {};\n }\n const hooks = settings.hooks as Record<string, unknown[]>;\n if (!hooks.SessionStart) {\n hooks.SessionStart = [];\n }\n hooks.SessionStart.push(CLAUDE_HOOK_CONFIG);\n}\n\n/**\n * Add all hooks managed by compound-agent.\n * Note: PreCommit is handled by git hooks, not Claude Code hooks.\n */\nexport function addAllCompoundAgentHooks(settings: Record<string, unknown>): void {\n if (!settings.hooks) {\n settings.hooks = {};\n }\n const hooks = settings.hooks as Record<string, unknown[]>;\n\n // SessionStart - prime context\n if (!hooks.SessionStart) {\n hooks.SessionStart = [];\n }\n if (!hasHookTypeAny(hooks.SessionStart, ['ca prime'])) {\n hooks.SessionStart.push(CLAUDE_HOOK_CONFIG);\n }\n\n // PreCompact - re-inject prime before compaction\n if (!hooks.PreCompact) {\n hooks.PreCompact = [];\n }\n if (!hasHookTypeAny(hooks.PreCompact, ['ca prime'])) {\n hooks.PreCompact.push(CLAUDE_PRECOMPACT_HOOK_CONFIG);\n }\n\n // UserPromptSubmit - gentle lesson tool reminders\n if (!hooks.UserPromptSubmit) {\n hooks.UserPromptSubmit = [];\n }\n if (!hasHookTypeAny(hooks.UserPromptSubmit, ['ca hooks run user-prompt'])) {\n hooks.UserPromptSubmit.push(CLAUDE_USER_PROMPT_HOOK_CONFIG);\n }\n\n // PostToolUseFailure - smart failure detection\n if (!hooks.PostToolUseFailure) {\n hooks.PostToolUseFailure = [];\n }\n if (!hasHookTypeAny(hooks.PostToolUseFailure, ['ca hooks run post-tool-failure'])) {\n hooks.PostToolUseFailure.push(CLAUDE_POST_TOOL_FAILURE_HOOK_CONFIG);\n }\n\n // PostToolUse - reset failure state on success\n if (!hooks.PostToolUse) {\n hooks.PostToolUse = [];\n }\n if (!hasHookTypeAny(hooks.PostToolUse, ['ca hooks run post-tool-success'])) {\n hooks.PostToolUse.push(CLAUDE_POST_TOOL_SUCCESS_HOOK_CONFIG);\n }\n\n // PostToolUse - read tracker (tracks skill file reads)\n if (!hasHookTypeAny(hooks.PostToolUse, ['ca hooks run post-read', 'ca hooks run read-tracker'])) {\n hooks.PostToolUse.push(CLAUDE_POST_READ_HOOK_CONFIG);\n }\n\n // PreToolUse - phase guard (warns before Edit/Write without skill read)\n if (!hooks.PreToolUse) {\n hooks.PreToolUse = [];\n }\n if (!hasHookTypeAny(hooks.PreToolUse, ['ca hooks run phase-guard'])) {\n hooks.PreToolUse.push(CLAUDE_PHASE_GUARD_HOOK_CONFIG);\n }\n\n // Stop - audit hook (blocks stop when phase gate not passed)\n if (!hooks.Stop) {\n hooks.Stop = [];\n }\n if (!hasHookTypeAny(hooks.Stop, ['ca hooks run phase-audit', 'ca hooks run stop-audit'])) {\n hooks.Stop.push(CLAUDE_PHASE_AUDIT_HOOK_CONFIG);\n }\n\n // Note: remind-capture functionality is handled by git pre-commit hooks\n // (see installPreCommitHook in hooks.ts), not Claude Code hooks\n}\n\n/**\n * Check if a hook type already has a command containing any marker.\n */\nfunction hasHookTypeAny(hookArray: unknown[], markers: string[]): boolean {\n return hookArray.some((entry) => {\n const hookEntry = entry as { hooks?: Array<{ command?: string }> };\n return hookEntry.hooks?.some((h) => markers.some((marker) => h.command?.includes(marker)));\n });\n}\n\n/**\n * Remove our hooks from all hook arrays.\n * Removes both current (ca) and legacy (compound-agent) hooks from all hook types.\n */\nexport function removeCompoundAgentHook(settings: Record<string, unknown>): boolean {\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks) return false;\n\n let anyRemoved = false;\n\n // Hook types we manage\n const hookTypes = ['SessionStart', 'PreCompact', 'UserPromptSubmit', 'PostToolUseFailure', 'PostToolUse', 'PreToolUse', 'Stop'];\n\n for (const hookType of hookTypes) {\n if (!hooks[hookType]) continue;\n\n const originalLength = hooks[hookType].length;\n hooks[hookType] = hooks[hookType].filter((entry) => {\n const hookEntry = entry as { hooks?: Array<{ command?: string }> };\n return !hookEntry.hooks?.some((h) =>\n CLAUDE_HOOK_MARKERS.some((marker) => h.command?.includes(marker))\n );\n });\n\n if (hooks[hookType].length < originalLength) {\n anyRemoved = true;\n }\n }\n\n return anyRemoved;\n}\n\n/**\n * Write Claude Code settings atomically.\n */\nexport async function writeClaudeSettings(settingsPath: string, settings: Record<string, unknown>): Promise<void> {\n const dir = dirname(settingsPath);\n await mkdir(dir, { recursive: true });\n\n // Write to temp file, then rename (atomic)\n const tempPath = settingsPath + '.tmp';\n await writeFile(tempPath, JSON.stringify(settings, null, 2) + '\\n', 'utf-8');\n await rename(tempPath, settingsPath);\n}\n\n/**\n * Install Claude hooks for init command.\n * Handles errors gracefully - returns error info instead of throwing.\n * @param repoRoot - Repository root path\n * @returns Result indicating success/failure\n */\nexport async function installClaudeHooksForInit(repoRoot: string): Promise<ClaudeHooksResult> {\n const settingsPath = join(repoRoot, '.claude', 'settings.json');\n\n let settings: Record<string, unknown>;\n try {\n settings = await readClaudeSettings(settingsPath);\n } catch {\n return { installed: false, action: 'error', error: 'Failed to parse settings.json' };\n }\n\n if (hasAllCompoundAgentHooks(settings)) {\n return { installed: true, action: 'already_installed' };\n }\n\n try {\n addAllCompoundAgentHooks(settings);\n await writeClaudeSettings(settingsPath, settings);\n return { installed: true, action: 'installed' };\n } catch (err) {\n return { installed: false, action: 'error', error: String(err) };\n }\n}\n\n// ============================================================================\n// AGENTS.md and CLAUDE.md Cleanup (e2r)\n// ============================================================================\n\n/**\n * Remove Learning Agent section from AGENTS.md.\n * Uses markers to find and remove the section.\n *\n * @param repoRoot - Repository root path\n * @returns true if section was removed, false if not found\n */\nexport async function removeAgentsSection(repoRoot: string): Promise<boolean> {\n const agentsPath = join(repoRoot, 'AGENTS.md');\n\n if (!existsSync(agentsPath)) {\n return false;\n }\n\n const content = await readFile(agentsPath, 'utf-8');\n const startIdx = content.indexOf(AGENTS_SECTION_START_MARKER);\n const endIdx = content.indexOf(AGENTS_SECTION_END_MARKER);\n\n if (startIdx === -1 || endIdx === -1) {\n return false;\n }\n\n // Remove from start marker to end marker (inclusive)\n const before = content.slice(0, startIdx);\n const after = content.slice(endIdx + AGENTS_SECTION_END_MARKER.length);\n\n // Clean up: remove trailing newlines from before, keep single newline separation\n const newContent = (before.trimEnd() + after).trim();\n\n // Only write if file would not be empty\n if (newContent.length > 0) {\n await writeFile(agentsPath, newContent + '\\n', 'utf-8');\n } else {\n // File would be empty - could optionally delete it\n await writeFile(agentsPath, '', 'utf-8');\n }\n\n return true;\n}\n\n/**\n * Remove Learning Agent reference from CLAUDE.md.\n * Uses markers to find and remove the reference section.\n *\n * @param repoRoot - Repository root path\n * @returns true if reference was removed, false if not found\n */\nexport async function removeClaudeMdReference(repoRoot: string): Promise<boolean> {\n const claudeMdPath = join(repoRoot, '.claude', 'CLAUDE.md');\n\n if (!existsSync(claudeMdPath)) {\n return false;\n }\n\n const content = await readFile(claudeMdPath, 'utf-8');\n const startIdx = content.indexOf(CLAUDE_REF_START_MARKER);\n const endIdx = content.indexOf(CLAUDE_REF_END_MARKER);\n\n if (startIdx === -1 || endIdx === -1) {\n return false;\n }\n\n // Remove from start marker to end marker (inclusive)\n const before = content.slice(0, startIdx);\n const after = content.slice(endIdx + CLAUDE_REF_END_MARKER.length);\n\n // Clean up: remove trailing newlines from before, keep single newline separation\n const newContent = (before.trimEnd() + after).trim();\n\n // Only write if file would not be empty\n if (newContent.length > 0) {\n await writeFile(claudeMdPath, newContent + '\\n', 'utf-8');\n } else {\n await writeFile(claudeMdPath, '', 'utf-8');\n }\n\n return true;\n}\n","/**\n * User-scope detection - warns when installing at home directory level.\n */\n\nimport { homedir } from 'node:os';\nimport { dirname, resolve } from 'node:path';\n\n/** Result of scope detection. */\nexport interface ScopeCheckResult {\n /** Whether the repo root is at user scope (homedir or direct child). */\n isUserScope: boolean;\n /** Warning message when user-scope is detected. */\n message?: string;\n}\n\n/**\n * Detect whether repoRoot is at user scope (homedir or direct child of homedir).\n *\n * User-scope reduces compounding value because lessons are shared across projects.\n */\nexport function checkUserScope(repoRoot: string): ScopeCheckResult {\n const home = homedir();\n const resolved = resolve(repoRoot);\n\n const isHome = resolved === home;\n const isDirectChild = dirname(resolved) === home;\n\n if (isHome || isDirectChild) {\n return {\n isUserScope: true,\n message:\n 'Warning: Installing at user scope. compound-agent works best at repository scope where lessons are codebase-specific. User-scope means lessons shared across all projects, reducing compounding value. Consider running inside a specific repository.',\n };\n }\n\n return { isUserScope: false };\n}\n","/**\n * Shared display/print utilities for setup commands.\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { runFullBeadsCheck, type BeadsFullCheck } from './beads-check.js';\nimport {\n getClaudeSettingsPath,\n hasAllCompoundAgentHooks,\n readClaudeSettings,\n} from './claude-helpers.js';\nimport type { GitignoreResult } from './gitignore.js';\nimport type { HookInstallResult } from './hooks.js';\nimport type { PnpmConfigResult } from './primitives.js';\nimport { checkUserScope, type ScopeCheckResult } from './scope-check.js';\n\nexport function printGitignoreStatus(result: GitignoreResult): void {\n if (result.added.length > 0) {\n console.log(` .gitignore: Added [${result.added.join(', ')}]`);\n } else {\n console.log(' .gitignore: Already configured');\n }\n}\n\nexport function printSetupGitHooksStatus(gitHooks: HookInstallResult['status'] | 'skipped'): void {\n if (gitHooks === 'skipped') {\n console.log(' Git hooks: Skipped (--skip-hooks)');\n return;\n }\n if (gitHooks === 'not_git_repo') {\n console.log(' Git hooks: Skipped (not a git repository)');\n return;\n }\n if (gitHooks === 'installed') {\n console.log(' Git hooks: Installed');\n return;\n }\n if (gitHooks === 'appended') {\n console.log(' Git hooks: Appended to existing pre-commit hook');\n return;\n }\n console.log(' Git hooks: Already configured');\n}\n\nexport function printPnpmConfigStatus(result: PnpmConfigResult): void {\n if (!result.isPnpm) return;\n if (result.alreadyConfigured) {\n console.log(' pnpm config: onlyBuiltDependencies already configured');\n } else if (result.added.length > 0) {\n console.log(` pnpm config: Added onlyBuiltDependencies [${result.added.join(', ')}]`);\n }\n}\n\nexport function printBeadsFullStatus(check: BeadsFullCheck): void {\n console.log(` Beads CLI: ${check.cliAvailable ? 'OK' : 'not found'}`);\n if (check.cliAvailable) {\n console.log(` Beads repo: ${check.initialized ? 'OK' : 'not initialized (run: bd init)'}`);\n if (check.initialized) {\n console.log(` Beads health: ${check.healthy ? 'OK' : `issues found${check.healthMessage ? ` — ${check.healthMessage}` : ''}`}`);\n }\n }\n}\n\nexport function printScopeStatus(scope: ScopeCheckResult): void {\n if (scope.isUserScope) {\n console.log(' Scope: user-scope (reduced compounding value)');\n } else {\n console.log(' Scope: OK (repository scope)');\n }\n}\n\n/**\n * Show installation status (used by `ca setup --status`).\n */\nexport async function runStatus(repoRoot: string): Promise<void> {\n const agentsDir = join(repoRoot, '.claude', 'agents', 'compound');\n const commandsDir = join(repoRoot, '.claude', 'commands', 'compound');\n const skillsDir = join(repoRoot, '.claude', 'skills', 'compound');\n const pluginPath = join(repoRoot, '.claude', 'plugin.json');\n\n console.log('Compound Agent Status:');\n console.log(` Agent templates: ${existsSync(agentsDir) ? 'installed' : 'not installed'}`);\n console.log(` Workflow commands: ${existsSync(commandsDir) ? 'installed' : 'not installed'}`);\n console.log(` Phase skills: ${existsSync(skillsDir) ? 'installed' : 'not installed'}`);\n console.log(` Plugin manifest: ${existsSync(pluginPath) ? 'installed' : 'not installed'}`);\n\n const settingsPath = getClaudeSettingsPath(false);\n let hooksInstalled = false;\n try {\n const settings = await readClaudeSettings(settingsPath);\n hooksInstalled = hasAllCompoundAgentHooks(settings);\n } catch {\n // No settings\n }\n console.log(` Hooks: ${hooksInstalled ? 'installed' : 'not installed'}`);\n\n const fullBeads = runFullBeadsCheck(repoRoot);\n printBeadsFullStatus(fullBeads);\n const scope = checkUserScope(repoRoot);\n printScopeStatus(scope);\n}\n","/**\n * .gitignore injection - ensures required patterns exist.\n */\n\nimport { existsSync } from 'node:fs';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\n/** Patterns compound-agent needs in .gitignore. */\nconst REQUIRED_PATTERNS = ['node_modules/', '.claude/.cache/'];\n\n/** Section comment marker. */\nconst SECTION_COMMENT = '# compound-agent';\n\n/** Result of ensureGitignore operation. */\nexport interface GitignoreResult {\n /** Patterns that were added. */\n added: string[];\n}\n\n/**\n * Ensure .gitignore has required patterns.\n *\n * - Creates .gitignore if missing\n * - Appends missing patterns under a section comment\n * - Never duplicates existing patterns\n */\nexport async function ensureGitignore(repoRoot: string): Promise<GitignoreResult> {\n const gitignorePath = join(repoRoot, '.gitignore');\n let content = '';\n\n if (existsSync(gitignorePath)) {\n content = await readFile(gitignorePath, 'utf-8');\n }\n\n const lines = content.split('\\n');\n const existingPatterns = new Set(lines.map(l => l.trim()));\n\n const missing = REQUIRED_PATTERNS.filter(p => !existingPatterns.has(p));\n\n if (missing.length === 0) {\n return { added: [] };\n }\n\n const section = [SECTION_COMMENT, ...missing].join('\\n');\n const separator = content.length > 0 && !content.endsWith('\\n') ? '\\n\\n' : content.length > 0 ? '\\n' : '';\n const newContent = content + separator + section + '\\n';\n\n await writeFile(gitignorePath, newContent, 'utf-8');\n\n return { added: missing };\n}\n","/**\n * Standardized CLI error/warning/info format helpers.\n *\n * Format:\n * ERROR [command] CODE: message — remediation\n * WARN [command] CODE: message — suggestion\n * INFO [command]: message\n */\n\n/**\n * Format an error message with command, code, message, and remediation.\n *\n * @param command - CLI command name (e.g., \"search\", \"learn\")\n * @param code - Error code (e.g., \"INVALID_LIMIT\", \"FILE_NOT_FOUND\")\n * @param message - Human-readable error description\n * @param remediation - How to fix the error\n * @returns Formatted error string\n */\nexport function formatError(command: string, code: string, message: string, remediation: string): string {\n return `ERROR [${command}] ${code}: ${message} \\u2014 ${remediation}`;\n}\n\n/**\n * Format a warning message with command, code, message, and optional suggestion.\n *\n * @param command - CLI command name\n * @param code - Warning code\n * @param message - Human-readable warning description\n * @param suggestion - Optional suggestion for resolution\n * @returns Formatted warning string\n */\nexport function formatWarn(command: string, code: string, message: string, suggestion?: string): string {\n const base = `WARN [${command}] ${code}: ${message}`;\n return suggestion ? `${base} \\u2014 ${suggestion}` : base;\n}\n\n/**\n * Format an informational message with command and message.\n *\n * @param command - CLI command name\n * @param message - Human-readable info message\n * @returns Formatted info string\n */\nexport function formatInfo(command: string, message: string): string {\n return `INFO [${command}]: ${message}`;\n}\n","/**\n * Phase check state machine.\n *\n * Manages LFG phase state in .claude/.ca-phase-state.json.\n */\n\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nconst STATE_DIR = '.claude';\nconst STATE_FILE = '.ca-phase-state.json';\nconst EPIC_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\nexport const PHASES = ['brainstorm', 'plan', 'work', 'review', 'compound'] as const;\nexport type PhaseName = (typeof PHASES)[number];\n\nexport const GATES = ['post-plan', 'gate-3', 'gate-4', 'final'] as const;\nexport type GateName = (typeof GATES)[number];\n\nconst PHASE_INDEX: Record<PhaseName, number> = {\n brainstorm: 1,\n plan: 2,\n work: 3,\n review: 4,\n compound: 5,\n};\n\nexport interface PhaseState {\n lfg_active: boolean;\n epic_id: string;\n current_phase: PhaseName;\n phase_index: number;\n skills_read: string[];\n gates_passed: GateName[];\n started_at: string;\n}\n\nfunction getStatePath(repoRoot: string): string {\n return join(repoRoot, STATE_DIR, STATE_FILE);\n}\n\nfunction isPhaseName(value: unknown): value is PhaseName {\n return typeof value === 'string' && (PHASES as readonly string[]).includes(value);\n}\n\nfunction isGateName(value: unknown): value is GateName {\n return typeof value === 'string' && (GATES as readonly string[]).includes(value);\n}\n\nfunction isIsoDate(value: unknown): value is string {\n if (typeof value !== 'string') return false;\n return !Number.isNaN(Date.parse(value));\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\n\nfunction validatePhaseState(raw: unknown): raw is PhaseState {\n if (typeof raw !== 'object' || raw === null) return false;\n const state = raw as Record<string, unknown>;\n\n return (\n typeof state.lfg_active === 'boolean' &&\n typeof state.epic_id === 'string' &&\n isPhaseName(state.current_phase) &&\n typeof state.phase_index === 'number' &&\n state.phase_index >= 1 &&\n state.phase_index <= 5 &&\n isStringArray(state.skills_read) &&\n Array.isArray(state.gates_passed) &&\n state.gates_passed.every((gate) => isGateName(gate)) &&\n isIsoDate(state.started_at)\n );\n}\n\nexport function expectedGateForPhase(phaseIndex: number): GateName | null {\n if (phaseIndex === 2) return 'post-plan';\n if (phaseIndex === 3) return 'gate-3';\n if (phaseIndex === 4) return 'gate-4';\n if (phaseIndex === 5) return 'final';\n return null;\n}\n\nexport function initPhaseState(repoRoot: string, epicId: string): PhaseState {\n const dir = join(repoRoot, STATE_DIR);\n mkdirSync(dir, { recursive: true });\n\n const state: PhaseState = {\n lfg_active: true,\n epic_id: epicId,\n current_phase: 'brainstorm',\n phase_index: PHASE_INDEX.brainstorm,\n skills_read: [],\n gates_passed: [],\n started_at: new Date().toISOString(),\n };\n writeFileSync(getStatePath(repoRoot), JSON.stringify(state, null, 2), 'utf-8');\n return state;\n}\n\nexport function getPhaseState(repoRoot: string): PhaseState | null {\n try {\n const path = getStatePath(repoRoot);\n if (!existsSync(path)) return null;\n const raw = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(raw) as unknown;\n return validatePhaseState(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function updatePhaseState(repoRoot: string, partial: Partial<PhaseState>): PhaseState | null {\n const current = getPhaseState(repoRoot);\n if (current === null) return null;\n\n const updated: PhaseState = {\n ...current,\n ...partial,\n };\n\n if (!validatePhaseState(updated)) return null;\n\n writeFileSync(getStatePath(repoRoot), JSON.stringify(updated, null, 2), 'utf-8');\n return updated;\n}\n\nexport function startPhase(repoRoot: string, phase: PhaseName): PhaseState | null {\n return updatePhaseState(repoRoot, {\n current_phase: phase,\n phase_index: PHASE_INDEX[phase],\n });\n}\n\nexport function cleanPhaseState(repoRoot: string): void {\n try {\n const path = getStatePath(repoRoot);\n if (existsSync(path)) unlinkSync(path);\n } catch {\n // Silent cleanup\n }\n}\n\nexport function recordGatePassed(repoRoot: string, gate: GateName): PhaseState | null {\n const current = getPhaseState(repoRoot);\n if (current === null) return null;\n\n const gatesPassed = current.gates_passed.includes(gate)\n ? current.gates_passed\n : [...current.gates_passed, gate];\n const updated: PhaseState = { ...current, gates_passed: gatesPassed };\n\n // Final gate closes the active loop state.\n if (gate === 'final') {\n cleanPhaseState(repoRoot);\n return updated;\n }\n\n writeFileSync(getStatePath(repoRoot), JSON.stringify(updated, null, 2), 'utf-8');\n return updated;\n}\n\nfunction printStatusHuman(state: PhaseState | null): void {\n if (state === null) {\n console.log('No active LFG session.');\n return;\n }\n console.log('Active LFG Session');\n console.log(` Epic: ${state.epic_id}`);\n console.log(` Phase: ${state.current_phase} (${state.phase_index}/5)`);\n console.log(` Skills read: ${state.skills_read.length === 0 ? '(none)' : state.skills_read.join(', ')}`);\n console.log(` Gates passed: ${state.gates_passed.length === 0 ? '(none)' : state.gates_passed.join(', ')}`);\n console.log(` Started: ${state.started_at}`);\n}\n\n// eslint-disable-next-line max-lines-per-function -- command router registers multiple subcommands\nfunction registerPhaseSubcommands(\n phaseCheck: Command,\n getDryRun: () => boolean,\n repoRoot: () => string\n): void {\n phaseCheck\n .command('init <epic-id>')\n .description('Initialize phase state for an epic')\n .action((epicId: string) => {\n if (!EPIC_ID_PATTERN.test(epicId)) {\n console.error(`Invalid epic ID: \"${epicId}\"`);\n process.exitCode = 1;\n return;\n }\n if (getDryRun()) { console.log(`[dry-run] Would initialize phase state for epic ${epicId} in ${repoRoot()}`); return; }\n initPhaseState(repoRoot(), epicId);\n console.log(`Phase state initialized for ${epicId}. Current phase: brainstorm (1/5).`);\n });\n\n phaseCheck\n .command('start <phase>')\n .description('Start or resume a phase')\n .action((phase: string) => {\n if (!isPhaseName(phase)) {\n console.error(`Invalid phase: \"${phase}\". Valid phases: ${PHASES.join(', ')}`);\n process.exitCode = 1;\n return;\n }\n if (getDryRun()) { console.log(`[dry-run] Would start phase ${phase}`); return; }\n const state = startPhase(repoRoot(), phase);\n if (state === null) {\n console.error('No active phase state. Run: ca phase-check init <epic-id>');\n process.exitCode = 1;\n return;\n }\n console.log(`Phase updated: ${state.current_phase} (${state.phase_index}/5).`);\n });\n\n phaseCheck\n .command('gate <gate-name>')\n .description('Record a phase gate as passed')\n .action((gateName: string) => {\n if (!isGateName(gateName)) {\n console.error(`Invalid gate: \"${gateName}\". Valid gates: ${GATES.join(', ')}`);\n process.exitCode = 1;\n return;\n }\n if (getDryRun()) { console.log(`[dry-run] Would record gate ${gateName}`); return; }\n const state = recordGatePassed(repoRoot(), gateName);\n if (state === null) {\n console.error('No active phase state. Run: ca phase-check init <epic-id>');\n process.exitCode = 1;\n return;\n }\n if (gateName === 'final') {\n console.log('Final gate recorded. Phase state cleaned.');\n return;\n }\n console.log(`Gate recorded: ${gateName}.`);\n });\n\n phaseCheck\n .command('status')\n .description('Show current phase state')\n .option('--json', 'Output raw JSON')\n .action((options: { json?: boolean }) => {\n const state = getPhaseState(repoRoot());\n if (options.json) { console.log(JSON.stringify(state ?? { lfg_active: false })); return; }\n printStatusHuman(state);\n });\n\n phaseCheck\n .command('clean')\n .description('Remove phase state file')\n .action(() => {\n if (getDryRun()) { console.log('[dry-run] Would delete phase state file'); return; }\n cleanPhaseState(repoRoot());\n console.log('Phase state cleaned.');\n });\n}\n\nexport function registerPhaseCheckCommand(program: Command): void {\n const phaseCheck = program\n .command('phase-check')\n .description('Manage LFG phase state')\n .option('--dry-run', 'Show what would be done without making changes');\n\n const getDryRun = (): boolean => phaseCheck.opts<{ dryRun?: boolean }>().dryRun ?? false;\n const repoRoot = (): string => process.cwd();\n\n registerPhaseSubcommands(phaseCheck, getDryRun, repoRoot);\n\n program\n .command('phase-clean')\n .description('Remove phase state file (alias for `phase-check clean`)')\n .action(() => { cleanPhaseState(repoRoot()); console.log('Phase state cleaned.'); });\n}\n","/**\n * Phase guard hook for PreToolUse.\n *\n * Warns when Edit or Write tools are used without having read\n * the current phase skill file.\n */\n\n// eslint-disable-next-line compound-agent/enforce-barrel-exports -- avoids setup<->commands barrel cycle during hook startup\nimport { getPhaseState } from '../commands/phase-check.js';\n\nexport interface PhaseGuardOutput {\n hookSpecificOutput?: {\n hookEventName: 'PreToolUse';\n additionalContext?: string;\n };\n}\n\n/**\n * Process a PreToolUse event and check phase compliance.\n *\n * Returns a warning if Edit/Write is attempted without reading\n * the current phase skill. Returns {} in all other cases.\n */\nexport function processPhaseGuard(\n repoRoot: string,\n toolName: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _toolInput: Record<string, unknown>\n): PhaseGuardOutput {\n try {\n if (toolName !== 'Edit' && toolName !== 'Write') return {};\n\n const state = getPhaseState(repoRoot);\n if (state === null || !state.lfg_active) return {};\n\n const expectedSkillPath = `.claude/skills/compound/${state.current_phase}/SKILL.md`;\n const skillRead = state.skills_read.includes(expectedSkillPath);\n\n if (!skillRead) {\n return {\n hookSpecificOutput: {\n hookEventName: 'PreToolUse',\n additionalContext:\n `PHASE GUARD WARNING: You are in LFG phase ${state.phase_index}/5 (${state.current_phase}) ` +\n `but have NOT read the skill file yet. Read ${expectedSkillPath} before continuing.`,\n },\n };\n }\n\n return {};\n } catch {\n return {};\n }\n}\n","/**\n * Read tracker hook for PostToolUse.\n *\n * Tracks when skill files are Read and appends them to the\n * phase state's skills_read array.\n */\n\n// eslint-disable-next-line compound-agent/enforce-barrel-exports -- avoids setup<->commands barrel cycle during hook startup\nimport { getPhaseState, updatePhaseState } from '../commands/phase-check.js';\n\nconst SKILL_PATH_PATTERN = /(?:^|\\/)\\.claude\\/skills\\/compound\\/([^/]+)\\/SKILL\\.md$/;\n\nfunction normalizePath(path: string): string {\n return path.replaceAll('\\\\', '/');\n}\n\nfunction toCanonicalSkillPath(filePath: string): string | null {\n const normalized = normalizePath(filePath);\n const match = SKILL_PATH_PATTERN.exec(normalized);\n if (!match?.[1]) return null;\n return `.claude/skills/compound/${match[1]}/SKILL.md`;\n}\n\n/**\n * Process a PostToolUse Read event and track skill file reads.\n *\n * Appends the file path to skills_read when a skill file is read.\n * Returns {} in all other cases.\n */\nexport function processReadTracker(\n repoRoot: string,\n toolName: string,\n toolInput: Record<string, unknown>\n): Record<string, never> {\n try {\n if (toolName !== 'Read') return {};\n\n const state = getPhaseState(repoRoot);\n if (state === null || !state.lfg_active) return {};\n\n const filePath = typeof toolInput.file_path === 'string' ? toolInput.file_path : null;\n if (filePath === null) return {};\n\n const canonicalPath = toCanonicalSkillPath(filePath);\n if (canonicalPath === null) return {};\n\n if (!state.skills_read.includes(canonicalPath)) {\n updatePhaseState(repoRoot, {\n skills_read: [...state.skills_read, canonicalPath],\n });\n }\n\n return {};\n } catch {\n return {};\n }\n}\n","/**\n * Stop audit hook.\n *\n * Verifies required phase gates before allowing Claude to stop.\n */\n\n// eslint-disable-next-line compound-agent/enforce-barrel-exports -- avoids setup<->commands barrel cycle during hook startup\nimport { expectedGateForPhase, getPhaseState, PHASES } from '../commands/phase-check.js';\n\nexport interface StopAuditOutput {\n continue?: false;\n stopReason?: string;\n}\n\nfunction hasTransitionEvidence(state: {\n phase_index: number;\n skills_read: string[];\n}): boolean {\n // Final phase requires explicit final-gate verification.\n if (state.phase_index === 5) return true;\n\n // For phases 2-4, only block when there is evidence Claude moved on:\n // reading the next phase skill file.\n const nextPhase = PHASES[state.phase_index];\n if (nextPhase === undefined) return false;\n const nextSkillPath = `.claude/skills/compound/${nextPhase}/SKILL.md`;\n return state.skills_read.includes(nextSkillPath);\n}\n\n/**\n * Process a Stop event and check if the expected gate is passed.\n *\n * Returns { continue: false, stopReason } when stop is blocked.\n * Returns {} in all other cases (no state, lfg inactive, gate passed, etc.).\n */\nexport function processStopAudit(repoRoot: string, stopHookActive = false): StopAuditOutput {\n try {\n // Prevent recursive blocking loops from Stop hook retries.\n if (stopHookActive) return {};\n\n const state = getPhaseState(repoRoot);\n if (state === null || !state.lfg_active) return {};\n\n const expectedGate = expectedGateForPhase(state.phase_index);\n if (expectedGate === null) return {};\n\n if (state.gates_passed.includes(expectedGate)) return {};\n if (!hasTransitionEvidence(state)) return {};\n\n return {\n continue: false,\n stopReason: `PHASE GATE NOT VERIFIED: ${state.current_phase} requires gate '${expectedGate}'. Run: npx ca phase-check gate ${expectedGate}`,\n };\n } catch {\n return {};\n }\n}\n","/**\n * Hooks command - Git hooks management.\n */\n\nimport { chmodSync, existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatError } from '../cli-error-format.js';\nimport { processPhaseGuard } from './hooks-phase-guard.js';\nimport { processReadTracker } from './hooks-read-tracker.js';\nimport { processStopAudit } from './hooks-stop-audit.js';\nimport {\n HOOK_MARKER,\n COMPOUND_AGENT_HOOK_BLOCK,\n PRE_COMMIT_HOOK_TEMPLATE,\n PRE_COMMIT_MESSAGE,\n} from './templates.js';\n\n/** Make hook file executable (mode 0o755) */\nconst HOOK_FILE_MODE = 0o755;\n\n/**\n * Result of pre-commit hook installation.\n * Discriminated union for clear status messages.\n */\nexport type HookInstallResult =\n | { status: 'installed' }\n | { status: 'already_installed' }\n | { status: 'not_git_repo' }\n | { status: 'appended' };\n\n// ============================================================================\n// UserPromptSubmit Hook: Gentle memory tool reminders\n// ============================================================================\n\n/** Patterns that suggest user is correcting Claude */\nconst CORRECTION_PATTERNS = [\n /\\bactually\\b/i,\n /\\bno[,.]?\\s/i,\n /\\bwrong\\b/i,\n /\\bthat'?s not right\\b/i,\n /\\bthat'?s incorrect\\b/i,\n /\\buse .+ instead\\b/i,\n /\\bi told you\\b/i,\n /\\bi already said\\b/i,\n /\\bnot like that\\b/i,\n /\\byou forgot\\b/i,\n /\\byou missed\\b/i,\n /\\bstop\\s*(,\\s*)?(doing|using|that)\\b/i,\n /\\bwait\\s*(,\\s*)?(that|no|wrong)\\b/i,\n];\n\n/** High-confidence planning patterns (single match sufficient) */\nconst HIGH_CONFIDENCE_PLANNING = [\n /\\bdecide\\b/i,\n /\\bchoose\\b/i,\n /\\bpick\\b/i,\n /\\bwhich approach\\b/i,\n /\\bwhat do you think\\b/i,\n /\\bshould we\\b/i,\n /\\bwould you\\b/i,\n /\\bhow should\\b/i,\n /\\bwhat'?s the best\\b/i,\n /\\badd feature\\b/i,\n /\\bset up\\b/i,\n];\n\n/** Low-confidence planning patterns (need 2+ matches) */\nconst LOW_CONFIDENCE_PLANNING = [\n /\\bimplement\\b/i,\n /\\bbuild\\b/i,\n /\\bcreate\\b/i,\n /\\brefactor\\b/i,\n /\\bfix\\b/i,\n /\\bwrite\\b/i,\n /\\bdevelop\\b/i,\n];\n\n/** Reminder messages */\nconst CORRECTION_REMINDER =\n 'Remember: You have memory tools available - `npx ca learn` to save insights, `npx ca search` to find past solutions.';\n\nconst PLANNING_REMINDER =\n 'If you\\'re uncertain or hesitant, remember your memory tools: `npx ca search` may have relevant context from past sessions.';\n\n/** Check if prompt matches correction patterns */\nexport function detectCorrection(prompt: string): boolean {\n return CORRECTION_PATTERNS.some((pattern) => pattern.test(prompt));\n}\n\n/** Check if prompt matches planning patterns */\nexport function detectPlanning(prompt: string): boolean {\n if (HIGH_CONFIDENCE_PLANNING.some((pattern) => pattern.test(prompt))) {\n return true;\n }\n const lowMatches = LOW_CONFIDENCE_PLANNING.filter((pattern) => pattern.test(prompt));\n return lowMatches.length >= 2;\n}\n\n/**\n * UserPromptSubmit hook output format.\n * Claude Code expects this structure for additionalContext injection.\n */\nexport interface UserPromptHookOutput {\n hookSpecificOutput?: {\n hookEventName: 'UserPromptSubmit';\n additionalContext?: string;\n };\n}\n\n/**\n * Process a user prompt and determine if a reminder should be injected.\n *\n * @param prompt - The user's message text\n * @returns Hook output with optional additionalContext\n */\nexport function processUserPrompt(prompt: string): UserPromptHookOutput {\n // Priority: corrections first, then planning\n if (detectCorrection(prompt)) {\n return {\n hookSpecificOutput: {\n hookEventName: 'UserPromptSubmit',\n additionalContext: CORRECTION_REMINDER,\n },\n };\n }\n\n if (detectPlanning(prompt)) {\n return {\n hookSpecificOutput: {\n hookEventName: 'UserPromptSubmit',\n additionalContext: PLANNING_REMINDER,\n },\n };\n }\n\n // No reminder needed\n return {};\n}\n\n// ============================================================================\n// PostToolUseFailure Hook: In-memory failure tracking with memory tip\n// ============================================================================\n\n/** Threshold constants */\nconst SAME_TARGET_THRESHOLD = 2;\nconst TOTAL_FAILURE_THRESHOLD = 3;\n\n/** State file name for cross-process persistence */\nexport const STATE_FILE_NAME = '.ca-failure-state.json';\n\n/** Max age for state file before it's considered stale (1 hour) */\nconst STATE_MAX_AGE_MS = 60 * 60 * 1000;\n\n/** Persisted failure state shape */\nexport interface FailureState {\n count: number;\n lastTarget: string | null;\n sameTargetCount: number;\n timestamp: number;\n}\n\n/** In-memory failure counters (fallback when no stateDir provided) */\nlet failureCount = 0;\nlet lastFailedTarget: string | null = null;\nlet sameTargetCount = 0;\n\n/** Default (empty) failure state */\nfunction defaultState(): FailureState {\n return { count: 0, lastTarget: null, sameTargetCount: 0, timestamp: Date.now() };\n}\n\n/** Read failure state from file. Returns defaults on any error or if stale. */\nexport function readFailureState(stateDir: string): FailureState {\n try {\n const filePath = join(stateDir, STATE_FILE_NAME);\n if (!existsSync(filePath)) return defaultState();\n const raw = readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw) as FailureState;\n // Check staleness\n if (Date.now() - parsed.timestamp > STATE_MAX_AGE_MS) return defaultState();\n return parsed;\n } catch {\n return defaultState();\n }\n}\n\n/** Write failure state to file. Silently ignores errors. */\nexport function writeFailureState(stateDir: string, state: FailureState): void {\n try {\n const filePath = join(stateDir, STATE_FILE_NAME);\n writeFileSync(filePath, JSON.stringify(state), 'utf-8');\n } catch {\n // Fall back silently - never crash the hook process\n }\n}\n\n/** Delete state file. Silently ignores errors. */\nfunction deleteStateFile(stateDir: string): void {\n try {\n const filePath = join(stateDir, STATE_FILE_NAME);\n if (existsSync(filePath)) unlinkSync(filePath);\n } catch {\n // Fall back silently\n }\n}\n\n/** Tip message for failures */\nconst FAILURE_TIP = 'Tip: Multiple failures detected. `npx ca search` may have solutions for similar issues.';\n\n/**\n * PostToolUseFailure hook output format.\n */\nexport interface PostToolFailureHookOutput {\n hookSpecificOutput?: {\n hookEventName: 'PostToolUseFailure';\n additionalContext?: string;\n };\n}\n\n/** Reset failure state (exported for testing). Deletes state file when stateDir provided. */\nexport function resetFailureState(stateDir?: string): void {\n failureCount = 0;\n lastFailedTarget = null;\n sameTargetCount = 0;\n if (stateDir) deleteStateFile(stateDir);\n}\n\n/** Extract a failure target from tool name and input */\nfunction getFailureTarget(toolName: string, toolInput: Record<string, unknown>): string | null {\n if (toolName === 'Bash' && typeof toolInput.command === 'string') {\n const trimmed = toolInput.command.trim();\n const firstSpace = trimmed.indexOf(' ');\n return firstSpace === -1 ? trimmed : trimmed.slice(0, firstSpace);\n }\n if ((toolName === 'Edit' || toolName === 'Write') && typeof toolInput.file_path === 'string') {\n return toolInput.file_path;\n }\n return null;\n}\n\n/**\n * Process a tool failure and determine if a tip should be shown.\n * When stateDir is provided, persists state to file for cross-process tracking.\n */\nexport function processToolFailure(\n toolName: string,\n toolInput: Record<string, unknown>,\n stateDir?: string\n): PostToolFailureHookOutput {\n // Load persisted state if stateDir provided, otherwise use in-memory\n if (stateDir) {\n const persisted = readFailureState(stateDir);\n failureCount = persisted.count;\n lastFailedTarget = persisted.lastTarget;\n sameTargetCount = persisted.sameTargetCount;\n }\n\n failureCount++;\n const target = getFailureTarget(toolName, toolInput);\n if (target !== null && target === lastFailedTarget) {\n sameTargetCount++;\n } else {\n sameTargetCount = 1;\n lastFailedTarget = target;\n }\n const shouldShowTip =\n sameTargetCount >= SAME_TARGET_THRESHOLD ||\n failureCount >= TOTAL_FAILURE_THRESHOLD;\n if (shouldShowTip) {\n resetFailureState(stateDir);\n return {\n hookSpecificOutput: {\n hookEventName: 'PostToolUseFailure',\n additionalContext: FAILURE_TIP,\n },\n };\n }\n\n // Persist updated state if stateDir provided\n if (stateDir) {\n writeFailureState(stateDir, {\n count: failureCount,\n lastTarget: lastFailedTarget,\n sameTargetCount,\n timestamp: Date.now(),\n });\n }\n\n return {};\n}\n\n/**\n * Process a tool success - clear failure state.\n * When stateDir is provided, deletes the state file.\n */\nexport function processToolSuccess(stateDir?: string): void {\n resetFailureState(stateDir);\n}\n\n/**\n * Check if a pre-commit hook already exists with our marker.\n */\nfunction hasCompoundAgentHook(content: string): boolean {\n return content.includes(HOOK_MARKER);\n}\n\n/**\n * Get the git hooks directory, respecting core.hooksPath if set.\n */\nasync function getGitHooksDir(repoRoot: string): Promise<string | null> {\n const gitDir = join(repoRoot, '.git');\n\n // Check if .git directory exists\n if (!existsSync(gitDir)) {\n return null;\n }\n\n // Check for core.hooksPath in .git/config\n const configPath = join(gitDir, 'config');\n if (existsSync(configPath)) {\n const config = await readFile(configPath, 'utf-8');\n const match = /hooksPath\\s*=\\s*(.+)$/m.exec(config);\n if (match?.[1]) {\n const hooksPath = match[1].trim();\n // Resolve relative paths from repo root\n return hooksPath.startsWith('/') ? hooksPath : join(repoRoot, hooksPath);\n }\n }\n\n // Default to .git/hooks\n const defaultHooksDir = join(gitDir, 'hooks');\n return existsSync(defaultHooksDir) ? defaultHooksDir : null;\n}\n\n/**\n * Find the line index of the first top-level exit statement in a shell script.\n *\n * Top-level means not inside:\n * - Function definitions (between { and })\n * - Heredocs (between <<EOF and EOF)\n *\n * Returns -1 if no top-level exit found.\n */\nexport function findFirstTopLevelExitLine(lines: string[]): number {\n let insideFunction = 0; // Brace nesting depth\n let heredocDelimiter: string | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n const trimmed = line.trim();\n\n // Check for heredoc end\n if (heredocDelimiter !== null) {\n if (trimmed === heredocDelimiter) {\n heredocDelimiter = null;\n }\n continue;\n }\n\n // Check for heredoc start: <<EOF, <<'EOF', <<\"EOF\", <<-EOF\n const heredocMatch = /<<-?\\s*['\"]?(\\w+)['\"]?/.exec(line);\n if (heredocMatch?.[1]) {\n heredocDelimiter = heredocMatch[1];\n continue;\n }\n\n // Track function braces (simple heuristic)\n // Count opening and closing braces\n for (const char of line) {\n if (char === '{') insideFunction++;\n if (char === '}') insideFunction = Math.max(0, insideFunction - 1);\n }\n\n // Skip if inside function\n if (insideFunction > 0) {\n continue;\n }\n\n // Check for top-level exit: exit followed by number, $var, or $?\n // Pattern: start of line, optional whitespace, exit, space, code, end\n if (/^\\s*exit\\s+(\\d+|\\$\\w+|\\$\\?)\\s*$/.test(trimmed)) {\n return i;\n }\n }\n\n return -1;\n}\n\n/**\n * Install pre-commit hook, respecting core.hooksPath and existing hooks.\n *\n * - Respects core.hooksPath when configured\n * - Appends to existing hooks instead of overwriting\n * - Uses marker to ensure idempotency\n *\n * @returns Discriminated union indicating the installation result\n */\nexport async function installPreCommitHook(repoRoot: string): Promise<HookInstallResult> {\n const gitHooksDir = await getGitHooksDir(repoRoot);\n\n // Not a git repo or no hooks directory\n if (!gitHooksDir) {\n return { status: 'not_git_repo' };\n }\n\n // Ensure hooks directory exists\n await mkdir(gitHooksDir, { recursive: true });\n\n const hookPath = join(gitHooksDir, 'pre-commit');\n\n // Check if hook already exists\n if (existsSync(hookPath)) {\n const content = await readFile(hookPath, 'utf-8');\n if (hasCompoundAgentHook(content)) {\n return { status: 'already_installed' };\n }\n\n // Find insertion point: before first top-level exit, or at end\n const lines = content.split('\\n');\n const exitLineIndex = findFirstTopLevelExitLine(lines);\n\n let newContent: string;\n if (exitLineIndex === -1) {\n // No top-level exit found - append to end\n newContent = content.trimEnd() + '\\n' + COMPOUND_AGENT_HOOK_BLOCK;\n } else {\n // Insert before the exit line\n const before = lines.slice(0, exitLineIndex);\n const after = lines.slice(exitLineIndex);\n newContent = before.join('\\n') + COMPOUND_AGENT_HOOK_BLOCK + after.join('\\n');\n }\n\n await writeFile(hookPath, newContent, 'utf-8');\n chmodSync(hookPath, HOOK_FILE_MODE);\n return { status: 'appended' };\n }\n\n // Create new hook file with full template\n await writeFile(hookPath, PRE_COMMIT_HOOK_TEMPLATE, 'utf-8');\n chmodSync(hookPath, HOOK_FILE_MODE);\n\n return { status: 'installed' };\n}\n\n/**\n * Read stdin as a string.\n */\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString('utf-8');\n}\n\n/**\n * Run the UserPromptSubmit hook.\n * Reads JSON from stdin, processes the prompt, outputs hook result.\n */\nasync function runUserPromptHook(): Promise<void> {\n try {\n const input = await readStdin();\n const data = JSON.parse(input) as { prompt?: string };\n\n if (!data.prompt) {\n // No prompt provided, exit silently\n console.log(JSON.stringify({}));\n return;\n }\n\n const result = processUserPrompt(data.prompt);\n console.log(JSON.stringify(result));\n } catch {\n // On any error, exit silently with empty output\n console.log(JSON.stringify({}));\n }\n}\n\n/**\n * Run the PostToolUseFailure hook.\n * Reads JSON from stdin, tracks failure, outputs tip if threshold reached.\n * Uses file-based persistence for cross-process failure tracking.\n */\nasync function runPostToolFailureHook(): Promise<void> {\n try {\n const input = await readStdin();\n const data = JSON.parse(input) as {\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n };\n\n if (!data.tool_name) {\n console.log(JSON.stringify({}));\n return;\n }\n\n const stateDir = join(process.cwd(), '.claude');\n const result = processToolFailure(data.tool_name, data.tool_input ?? {}, stateDir);\n console.log(JSON.stringify(result));\n } catch {\n console.log(JSON.stringify({}));\n }\n}\n\n/**\n * Run the PostToolUse hook for success.\n * Reads JSON from stdin, clears failure state and state file.\n */\nasync function runPostToolSuccessHook(): Promise<void> {\n try {\n await readStdin();\n const stateDir = join(process.cwd(), '.claude');\n processToolSuccess(stateDir);\n console.log(JSON.stringify({}));\n } catch {\n console.log(JSON.stringify({}));\n }\n}\n\n/** Run a tool-based hook: read stdin JSON, extract tool_name/tool_input, call processor. */\nasync function runToolHook(\n processor: (repoRoot: string, toolName: string, toolInput: Record<string, unknown>) => unknown\n): Promise<void> {\n try {\n const input = await readStdin();\n const data = JSON.parse(input) as { tool_name?: string; tool_input?: Record<string, unknown> };\n if (!data.tool_name) { console.log(JSON.stringify({})); return; }\n console.log(JSON.stringify(processor(process.cwd(), data.tool_name, data.tool_input ?? {})));\n } catch { console.log(JSON.stringify({})); }\n}\n\n/** Run the Stop audit hook. */\nasync function runStopAuditHook(): Promise<void> {\n try {\n const input = await readStdin();\n const data = JSON.parse(input) as { stop_hook_active?: boolean };\n console.log(JSON.stringify(processStopAudit(process.cwd(), data.stop_hook_active ?? false)));\n } catch { console.log(JSON.stringify({})); }\n}\n\n/**\n * Register the hooks command on the program.\n */\nexport function registerHooksCommand(program: Command): void {\n const hooksCommand = program.command('hooks').description('Git hooks management');\n\n hooksCommand\n .command('run <hook>')\n .description('Run a hook script (called by git/Claude hooks)')\n .option('--json', 'Output as JSON')\n .action(async (hook: string, options: { json?: boolean }) => {\n if (hook === 'pre-commit') {\n if (options.json) {\n console.log(JSON.stringify({ hook: 'pre-commit', message: PRE_COMMIT_MESSAGE }));\n } else {\n console.log(PRE_COMMIT_MESSAGE);\n }\n } else if (hook === 'user-prompt') {\n // UserPromptSubmit hook - reads from stdin, outputs JSON\n await runUserPromptHook();\n } else if (hook === 'post-tool-failure') {\n // PostToolUseFailure hook - tracks failures, outputs tip if threshold\n await runPostToolFailureHook();\n } else if (hook === 'post-tool-success') {\n // PostToolUse hook - clears failure state on success\n await runPostToolSuccessHook();\n } else if (hook === 'phase-guard') {\n await runToolHook(processPhaseGuard);\n } else if (hook === 'post-read' || hook === 'read-tracker') {\n await runToolHook(processReadTracker);\n } else if (hook === 'phase-audit' || hook === 'stop-audit') {\n // Stop hook - stop audit\n await runStopAuditHook();\n } else {\n if (options.json) {\n console.log(JSON.stringify({ error: `Unknown hook: ${hook}` }));\n } else {\n console.error(\n formatError(\n 'hooks',\n 'UNKNOWN_HOOK',\n `Unknown hook: ${hook}`,\n 'Valid hooks: pre-commit, user-prompt, post-tool-failure, post-tool-success, post-read (or read-tracker), phase-guard, phase-audit (or stop-audit)'\n )\n );\n }\n process.exitCode = 1;\n }\n });\n}\n","/**\n * External reviewer agent templates.\n * Optional cross-model reviewers (Gemini CLI, Codex CLI) that run\n * after /implementation-reviewer in the review pipeline.\n */\n\nexport const EXTERNAL_AGENT_TEMPLATES: Record<string, string> = {\n 'external-reviewer-gemini.md': `---\nname: External Reviewer (Gemini)\ndescription: Cross-model review using Gemini CLI in headless mode\nmodel: sonnet\n---\n\n# External Reviewer — Gemini\n\n## Role\nRun a cross-model code review by invoking the Gemini CLI in headless mode. Provides an independent perspective from a different LLM to catch issues Claude may miss.\n\n## Prerequisites\n- Gemini CLI installed (\\`npm i -g @google/gemini-cli\\`)\n- Authenticated (\\`gemini auth login\\`)\n\n## Instructions\n1. **Check availability** — run \\`command -v gemini\\` via Bash. If not found, report \"Gemini CLI not installed — skipping external review\" and stop.\n2. **Gather context**:\n - Get the beads issue being worked on: \\`bd list --status=in_progress\\` then \\`bd show <id>\\` to get the issue title and description.\n - Get the diff: \\`git diff HEAD~1\\` (or the appropriate range for this session's changes).\n3. **Build the review prompt** combining beads context + diff:\n \\`\\`\\`\n ISSUE: <title>\n DESCRIPTION: <description>\n DIFF:\n <git diff output>\n\n Review these changes for:\n 1. Correctness bugs and logic errors\n 2. Security vulnerabilities\n 3. Missed edge cases\n 4. Code quality issues\n Output a numbered list of findings. Be concise and actionable. Skip praise.\n \\`\\`\\`\n4. **Call Gemini headless**:\n \\`\\`\\`bash\n echo \"<prompt>\" | gemini -p \"Review the following code changes\" --output-format json\n \\`\\`\\`\n5. **Parse the response** — extract the \\`.response\\` field from the JSON output.\n6. **Present findings** to the user as a numbered list with severity tags (P1/P2/P3).\n7. **If Gemini returns an error** (auth failure, rate limit, timeout), report the error and skip gracefully. Never block the pipeline on external reviewer failure.\n\n## Output Format\n\\`\\`\\`\n## Gemini External Review\n\n**Status**: Completed | Skipped (reason)\n**Findings**: N items\n\n1. [P2] <finding description> — <file:line>\n2. [P3] <finding description> — <file:line>\n...\n\\`\\`\\`\n\n## Important\n- This is **advisory, not blocking**. Findings inform but do not gate the pipeline.\n- Do NOT retry more than once on failure.\n- Do NOT feed the entire codebase — only the diff and issue context.\n`,\n\n 'external-reviewer-codex.md': `---\nname: External Reviewer (Codex)\ndescription: Cross-model review using OpenAI Codex CLI in headless mode\nmodel: sonnet\n---\n\n# External Reviewer — Codex\n\n## Role\nRun a cross-model code review by invoking the OpenAI Codex CLI in headless exec mode. Provides an independent perspective from OpenAI's reasoning models to catch issues Claude may miss.\n\n## Prerequisites\n- Codex CLI installed (\\`npm i -g @openai/codex\\`)\n- Authenticated (\\`codex login --api-key\\`)\n\n## Instructions\n1. **Check availability** — run \\`command -v codex\\` via Bash. If not found, report \"Codex CLI not installed — skipping external review\" and stop.\n2. **Gather context**:\n - Get the beads issue being worked on: \\`bd list --status=in_progress\\` then \\`bd show <id>\\` to get the issue title and description.\n - Get the diff: \\`git diff HEAD~1\\` (or the appropriate range for this session's changes).\n3. **Build the review prompt** combining beads context + diff:\n \\`\\`\\`\n ISSUE: <title>\n DESCRIPTION: <description>\n DIFF:\n <git diff output>\n\n Review these changes for:\n 1. Correctness bugs and logic errors\n 2. Security vulnerabilities\n 3. Missed edge cases\n 4. Code quality issues\n Output a numbered list of findings. Be concise and actionable. Skip praise.\n \\`\\`\\`\n4. **Call Codex headless**:\n \\`\\`\\`bash\n echo \"<prompt>\" | codex exec --quiet \"Review the following code changes for bugs, security issues, and missed edge cases\"\n \\`\\`\\`\n5. **Parse the response** — Codex exec prints the final answer to stdout.\n6. **Present findings** to the user as a numbered list with severity tags (P1/P2/P3).\n7. **If Codex returns an error** (auth failure, rate limit, timeout), report the error and skip gracefully. Never block the pipeline on external reviewer failure.\n\n## Output Format\n\\`\\`\\`\n## Codex External Review\n\n**Status**: Completed | Skipped (reason)\n**Findings**: N items\n\n1. [P2] <finding description> — <file:line>\n2. [P3] <finding description> — <file:line>\n...\n\\`\\`\\`\n\n## Important\n- This is **advisory, not blocking**. Findings inform but do not gate the pipeline.\n- Do NOT retry more than once on failure.\n- Do NOT feed the entire codebase — only the diff and issue context.\n`,\n};\n","/**\n * Phase 11 agent templates: thin subagent wrappers.\n *\n * 4 subagents (audit, doc-gardener, cct-subagent, drift-detector).\n * The compounding agent is now an AgentTeam role skill.\n */\n\nexport const PHASE11_AGENT_TEMPLATES: Record<string, string> = {\n 'audit.md': `---\nname: Audit Agent\ndescription: Deep semantic analysis of codebase against rules, patterns, and lessons\nmodel: sonnet\n---\n\n# Audit Agent\n\nSpawned as a **subagent**. Follow the **audit** role skill for full instructions. Return findings to the caller.\n`,\n\n 'doc-gardener.md': `---\nname: Doc Gardener\ndescription: Audits project documentation for freshness, accuracy, and completeness\nmodel: sonnet\n---\n\n# Doc Gardener\n\nSpawned as a **subagent**. Follow the **doc-gardener** role skill for full instructions. Return findings to the caller.\n`,\n\n 'cct-subagent.md': `---\nname: CCT Subagent\ndescription: Injects mistake-derived test requirements into the TDD pipeline\nmodel: sonnet\n---\n\n# CCT Subagent\n\nSpawned as a **subagent**. Follow the **cct-subagent** role skill for full instructions. Return findings to the caller.\n`,\n\n 'drift-detector.md': `---\nname: Drift Detector\ndescription: Checks implementation for drift from established constraints\nmodel: sonnet\n---\n\n# Drift Detector\n\nSpawned as a **subagent**. Follow the **drift-detector** role skill for full instructions. Return findings to the caller.\n`,\n};\n","/**\n * Review agent templates: thin subagent wrappers for plan/brainstorm phases.\n *\n * 2 research subagents (repo-analyst, memory-analyst).\n * The 5 reviewer agents are now AgentTeam role skills.\n */\n\nexport const REVIEW_AGENT_TEMPLATES: Record<string, string> = {\n 'repo-analyst.md': `---\nname: Repo Analyst\ndescription: Analyzes repository structure, conventions, and patterns\nmodel: sonnet\n---\n\n# Repo Analyst\n\nSpawned as a **subagent**. Follow the **repo-analyst** role skill for full instructions. Return findings to the caller.\n`,\n\n 'memory-analyst.md': `---\nname: Memory Analyst\ndescription: Searches and retrieves relevant memory items for context\nmodel: sonnet\n---\n\n# Memory Analyst\n\nSpawned as a **subagent**. Follow the **memory-analyst** role skill for full instructions. Return findings to the caller.\n`,\n};\n","/**\n * Agent definition templates for .claude/agents/compound/.\n * Each entry is a markdown file that Claude Code discovers as a spawnable agent.\n *\n * Templates are split across multiple files to stay within the 400-line limit:\n * - agents-review.ts: Research + review agents (7 templates)\n * - agents-phase11.ts: Phase 11 intelligent compounding agents (5 templates)\n */\n\nimport { EXTERNAL_AGENT_TEMPLATES } from './agents-external.js';\nimport { PHASE11_AGENT_TEMPLATES } from './agents-phase11.js';\nimport { REVIEW_AGENT_TEMPLATES } from './agents-review.js';\n\nexport const AGENT_TEMPLATES: Record<string, string> = {\n ...REVIEW_AGENT_TEMPLATES,\n ...PHASE11_AGENT_TEMPLATES,\n ...EXTERNAL_AGENT_TEMPLATES,\n};\n","/**\n * Workflow agent role skills for the compound and work phases.\n *\n * 4 compound-phase analysts + 2 TDD work agents = 6 entries.\n * These are installed as .claude/skills/compound/agents/<name>/SKILL.md.\n */\n\nexport const WORKFLOW_ROLE_SKILLS: Record<string, string> = {\n 'context-analyzer': `---\nname: Context Analyzer\ndescription: Analyzes completed work to identify what was done and learned\n---\n\n# Context Analyzer\n\n## Role\nAnalyze the current session's work context: what was accomplished, what problems arose, what corrections were made, and what knowledge was gained. Examine git diff output, git log history, and test output to build a complete picture.\n\n## Instructions\n1. Run git diff and git log to review recent changes\n2. Check test results and test output for failures or regressions\n3. Review plan context to understand what was intended\n4. Use \\`npx ca search\\` to check existing knowledge for relevant context\n5. Identify problems encountered and how they were solved\n6. Note any user corrections or redirections\n7. Summarize the work context for lesson extraction\n8. For large diffs spanning multiple modules, spawn opus subagents to analyze each module in parallel. Merge findings before sharing.\n\n## Collaboration\nShare findings with lesson-extractor via direct message so it can extract actionable lessons from the context. Pass results to other compound agents as needed.\n\n## Deployment\nAgentTeam member in the **compound** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **Completed**: What was accomplished\n- **Problems**: Issues encountered and resolutions\n- **Corrections**: User feedback that changed approach\n- **Patterns**: Recurring themes or techniques\n`,\n\n 'lesson-extractor': `---\nname: Lesson Extractor\ndescription: Extracts actionable lessons from work context\n---\n\n# Lesson Extractor\n\n## Role\nExtract actionable, specific lessons from analyzed work context. Identify corrections, mistakes, and discoveries. Transform observations into structured knowledge that prevents future mistakes.\n\n## Instructions\n1. Review the context analysis output\n2. Look for mistake patterns, correction moments, and surprises\n3. Discover insights from how problems were solved\n4. Use \\`npx ca search\\` to check for duplicate lessons\n5. For each problem/correction, ask: \"What should be done differently next time?\"\n6. Filter out lessons that are too generic or obvious\n7. Each lesson must be specific; prefer actionable guidance when possible\n8. For many corrections/discoveries, spawn opus subagents to extract lessons from different domain areas in parallel.\n\n## Collaboration\nShare findings with pattern-matcher and solution-writer via direct message so they can classify and store the lessons. Collaborate with context-analyzer to clarify ambiguous findings.\n\n## Deployment\nAgentTeam member in the **compound** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\nPer lesson:\n- **Insight**: The actionable directive\n- **Trigger**: When this lesson applies\n- **Context**: Why this matters\n`,\n\n 'pattern-matcher': `---\nname: Pattern Matcher\ndescription: Matches lessons against existing memory to avoid duplicates\n---\n\n# Pattern Matcher\n\n## Role\nCompare extracted lessons against existing memory items to prevent duplicates, find connections, and identify lessons that strengthen existing knowledge.\n\n## Instructions\n1. Take the list of extracted lessons\n2. For each lesson, search existing memory with \\`npx ca search\\`\n3. Classify each lesson:\n - **New**: No similar existing item\n - **Duplicate**: Already captured\n - **Reinforcement**: Strengthens existing item\n - **Contradiction**: Conflicts with existing item\n4. Only recommend storing New lessons\n5. Flag Contradictions for user review\n\n## Collaboration\nShare classifications with solution-writer via direct message so it knows which lessons to store. Pass results to the team for review.\n\n## Deployment\nAgentTeam member in the **compound** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\nPer lesson:\n- **Classification**: New / Duplicate / Reinforcement / Contradiction\n- **Match**: ID of matching item if applicable\n- **Recommendation**: Store / Skip / Review\n`,\n\n 'solution-writer': `---\nname: Solution Writer\ndescription: Writes final memory items in correct schema format\n---\n\n# Solution Writer\n\n## Role\nTransform approved lessons into properly formatted memory items that follow the compound-agent schema. Apply quality filters before storage.\n\n## Instructions\n1. Take approved lessons from pattern-matcher\n2. For each lesson, format as a memory item:\n - Clear, imperative insight statement\n - Specific trigger condition\n - Appropriate type classification\n3. Apply quality filters:\n - Is it novel? (not already stored)\n - Is it specific? (not vague advice)\n4. Assign severity: high (data loss/security/contradictions), medium (workflow/patterns), low (style/optimizations)\n5. Set supersedes or related links when the lesson updates existing knowledge\n6. Store via \\`npx ca learn\\`\n\n## Collaboration\nShare findings with other agents via direct message to communicate storage outcomes. Collaborate with pattern-matcher on borderline classifications.\n\n## Deployment\nAgentTeam member in the **compound** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **Stored**: List of captured items with IDs\n- **Rejected**: Items that failed quality filters, with reasons\n`,\n\n 'test-writer': `---\nname: Test Writer\ndescription: Writes failing tests before implementation exists\n---\n\n# Test Writer\n\n## Role\nWrite comprehensive failing tests that define expected behavior before any implementation exists. Follow strict TDD -- tests must fail for the right reason.\n\n## Instructions\n1. Understand the requirements (read spec, issue, or task description)\n2. Identify the public API surface to test\n3. Write tests that call the real (not-yet-existing) functions\n4. Include:\n - Happy path tests\n - Edge cases (empty input, boundaries, nulls)\n - Error cases (invalid input, failure modes)\n5. Use clear test names describing expected behavior\n6. Run tests to verify they fail for the RIGHT reason (missing implementation, not syntax errors)\n7. Do NOT mock the thing being tested\n8. For multiple test files, spawn opus subagents to write tests in parallel (1 subagent per test file or module). Coordinate to avoid duplicate test setup.\n\n## Memory Integration\nRun \\`npx ca search\\` with the task description before writing tests. Look for known patterns, edge cases, and past mistakes relevant to the feature area.\n\n## Collaboration\nCommunicate with the implementer via direct message when tests are ready for implementation.\n\n## Deployment\nAgentTeam member in the **work** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- Test file path\n- Number of tests written\n- Confirmation that tests fail correctly\n`,\n\n 'implementer': `---\nname: Implementer\ndescription: Implements minimal code to pass failing tests\n---\n\n# Implementer\n\n## Role\nWrite the minimum code necessary to make failing tests pass. Follow the TDD green phase -- NEVER modify test files, only write implementation code.\n\n## Instructions\n1. Run the failing tests to understand what is expected\n2. Read the test file to understand the API contract\n3. Write the simplest implementation that passes each test\n4. Work one test at a time (run after each change)\n5. NEVER modify the test files to make them pass\n6. If a test seems wrong, stop and report it -- do not change it\n7. After all tests pass, look for obvious refactoring opportunities\n8. For multiple implementation files, spawn opus subagents to implement in parallel (1 subagent per module). Coordinate on shared interfaces via SendMessage.\n\n## Memory Integration\nRun \\`npx ca search\\` with the task description for known patterns, solutions, and implementation approaches relevant to the feature area.\n\n## Collaboration\nCommunicate with the test-writer via direct message when implementation questions arise.\n\n## Deployment\nAgentTeam member in the **work** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- Implementation file path\n- Tests passing: X/Y\n- Any concerns about test correctness\n`,\n};\n","/**\n * Review agent role skills for the plan, brainstorm, and review phases.\n *\n * 2 research subagents + 5 specialized reviewers = 7 entries.\n * These are installed as .claude/skills/compound/agents/<name>/SKILL.md.\n */\n\nexport const REVIEW_ROLE_SKILLS: Record<string, string> = {\n 'repo-analyst': `---\nname: Repo Analyst\ndescription: Analyzes repository structure, conventions, and patterns\n---\n\n# Repo Analyst\n\n## Role\nAnalyze the repository to understand its structure, coding conventions, tech stack, and established patterns. Provides context for planning and decision-making.\n\n## Instructions\n1. Read the project root for config files (package.json, tsconfig, etc.)\n2. Map the directory structure (src/, tests/, docs/)\n3. Identify the tech stack and dependencies\n4. Note coding conventions (naming, file organization, patterns)\n5. Check for existing documentation (README, CONTRIBUTING, CLAUDE.md)\n6. Summarize findings concisely\n7. For large repositories, spawn opus subagents to analyze different directory trees in parallel. Merge findings.\n\n## Collaboration\nReturn findings directly to the caller for synthesis into the plan.\n\n## Deployment\nSubagent spawned via the Task tool during the **plan** and **brainstorm** phases. Return findings directly to the caller.\n\n## Output Format\nReturn a structured summary:\n- **Stack**: Language, framework, key dependencies\n- **Structure**: Directory layout and module organization\n- **Conventions**: Naming, patterns, style\n- **Entry points**: Main files, CLI, API surface\n`,\n\n 'memory-analyst': `---\nname: Memory Analyst\ndescription: Searches and retrieves relevant memory items for context\n---\n\n# Memory Analyst\n\n## Role\nSearch compound-agent memory to find relevant lessons, patterns, and decisions from past sessions. Injects historical knowledge into the current workflow.\n\n## Instructions\n1. Identify the key topics from the current task\n2. Use \\`npx ca search\\` with relevant queries\n3. Search with multiple query variations for coverage\n4. Filter results by relevance and recency\n5. Summarize applicable lessons concisely\n6. For broad topics, spawn opus subagents with different query variations in parallel. Merge and deduplicate results.\n\n## Collaboration\nReturn findings directly to the caller for synthesis into the plan.\n\n## Deployment\nSubagent spawned via the Task tool during the **plan** and **brainstorm** phases. Return findings directly to the caller.\n\n## Output Format\nReturn a list of relevant memory items:\n- **Item ID**: For reference\n- **Summary**: What was learned\n- **Applicability**: How it relates to the current task\n`,\n\n 'security-reviewer': `---\nname: Security Reviewer\ndescription: Reviews code for security vulnerabilities\n---\n\n# Security Reviewer\n\n## Role\nReview code changes for security vulnerabilities including OWASP top 10, injection attacks, authentication issues, and data exposure risks.\n\n## Instructions\n1. Read the changed files completely\n2. Check for injection vulnerabilities (SQL, command, XSS)\n3. Verify input validation and sanitization\n4. Review authentication and authorization logic\n5. Check for hardcoded secrets or credentials\n6. Verify error messages do not leak sensitive info\n7. Check dependency versions for known CVEs\n8. For large diffs, spawn opus subagents to review different file groups in parallel (e.g., 1 per module). Merge findings and deduplicate.\n\n## Collaboration\nShare cross-cutting findings via SendMessage: security issues impacting architecture go to architecture-reviewer; secrets in test fixtures go to test-coverage-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\nReturn findings as:\n- **CRITICAL**: Must fix before merge\n- **WARNING**: Should fix, potential risk\n- **INFO**: Best practice suggestion\n`,\n\n 'architecture-reviewer': `---\nname: Architecture Reviewer\ndescription: Reviews code for architectural compliance and design integrity\n---\n\n# Architecture Reviewer\n\n## Role\nReview code for architectural consistency, pattern compliance, module boundary integrity, and adherence to established project conventions.\n\n## Instructions\n1. Read CLAUDE.md and project docs for established patterns\n2. Review the changed code against those patterns\n3. Check module boundaries are respected (no circular deps)\n4. Verify public API surface is minimal\n5. Ensure new code follows existing conventions\n6. Check that dependencies flow in the correct direction\n7. For changes spanning multiple modules, spawn opus subagents to review each module boundary in parallel.\n\n## Collaboration\nShare cross-cutting findings via SendMessage: architecture issues with performance implications go to performance-reviewer; structural violations creating security risks go to security-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **VIOLATION**: Breaks established architecture\n- **DRIFT**: Inconsistent with conventions but functional\n- **SUGGESTION**: Improvement opportunity\n`,\n\n 'performance-reviewer': `---\nname: Performance Reviewer\ndescription: Reviews code for performance issues and resource usage\n---\n\n# Performance Reviewer\n\n## Role\nReview code for performance bottlenecks, algorithmic complexity issues, unnecessary resource consumption, and scalability concerns.\n\n## Instructions\n1. Read the changed code and identify hot paths\n2. Check algorithmic complexity (avoid O(n^2) where O(n) works)\n3. Look for unnecessary allocations or copies\n4. Verify I/O operations are batched where possible\n5. Check for missing indexes on database queries\n6. Verify resources are properly closed/released\n7. For multiple hot paths, spawn opus subagents to profile different modules in parallel.\n\n## Collaboration\nShare cross-cutting findings via SendMessage: performance issues needing test coverage go to test-coverage-reviewer; performance fixes requiring architectural changes go to architecture-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **BOTTLENECK**: Measurable performance issue\n- **CONCERN**: Potential issue at scale\n- **OK**: No issues found\n`,\n\n 'test-coverage-reviewer': `---\nname: Test Coverage Reviewer\ndescription: Reviews test quality, assertions, and edge case coverage\n---\n\n# Test Coverage Reviewer\n\n## Role\nReview tests for meaningful assertions, edge case coverage, and absence of cargo-cult patterns. Ensures tests actually verify behavior, not just run without errors.\n\n## Instructions\n1. Read each test file completely\n2. Verify every test has meaningful assertions (not just expect(true))\n3. Check that tests would fail if the implementation is wrong\n4. Look for missing edge cases (empty input, nulls, boundaries)\n5. Verify no mocked business logic (vi.mock on the thing being tested)\n6. Check test names describe expected behavior\n7. Ensure property-based tests exist for pure functions\n8. For many test files, spawn opus subagents to review test files in parallel (1 per test file).\n\n## Collaboration\nShare cross-cutting findings via SendMessage: cargo-cult tests hiding security issues go to security-reviewer; unnecessary test complexity goes to simplicity-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **CARGO-CULT**: Test passes regardless of implementation\n- **GAP**: Missing edge case or scenario\n- **WEAK**: Assertion exists but is insufficient\n- **GOOD**: Test is meaningful and complete\n`,\n\n 'simplicity-reviewer': `---\nname: Simplicity Reviewer\ndescription: Reviews code for unnecessary complexity and over-engineering\n---\n\n# Simplicity Reviewer\n\n## Role\nReview code for unnecessary complexity, over-engineering, premature abstraction, and YAGNI violations. Champion the simplest solution that works.\n\n## Instructions\n1. Read the changed code and its context\n2. Ask: \"Could this be simpler while still correct?\"\n3. Flag premature abstractions (used in only one place)\n4. Flag unnecessary indirection or wrapper layers\n5. Flag feature flags or config for single-use cases\n6. Verify no \"just in case\" code exists\n\n## Collaboration\nShare cross-cutting findings via SendMessage: over-engineering obscuring security concerns goes to security-reviewer; premature abstractions creating wrong module boundaries goes to architecture-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **OVER-ENGINEERED**: Simpler solution exists\n- **YAGNI**: Feature not needed yet\n- **OK**: Appropriate complexity for the task\n`,\n};\n","/**\n * Phase 11 agent role skills: compounding, audit, doc-gardener, CCT, drift detection.\n *\n * 1 AgentTeam member (compounding) + 4 subagents = 5 entries.\n * These are installed as .claude/skills/compound/agents/<name>/SKILL.md.\n */\n\nexport const PHASE11_ROLE_SKILLS: Record<string, string> = {\n 'compounding': `---\nname: Compounding Agent\ndescription: Clusters similar lessons and synthesizes testable patterns\n---\n\n# Compounding Agent\n\n## Role\nCluster similar lessons from memory and synthesize them into testable CCT (Compound Corrective Test) patterns. Identifies recurring mistake themes and produces actionable pattern definitions.\n\n## Instructions\n1. Read existing lessons from \\`.claude/lessons/index.jsonl\\`\n2. Use \\`npx ca search\\` with broad queries to find related items\n3. Cluster lessons by similarity (same root cause, same domain, same mistake type)\n4. For each cluster with 2+ items, synthesize a CCT pattern:\n - Pattern name and trigger condition\n - What tests should exist to prevent recurrence\n - Confidence level based on cluster size\n5. Write patterns to \\`.claude/lessons/cct-patterns.jsonl\\`\n6. Skip singleton lessons (not enough signal to form a pattern)\n7. For many clusters, spawn opus subagents to synthesize patterns from different clusters in parallel.\n\n## Collaboration\nShare synthesized patterns with the team lead via direct message for review.\n\n## Deployment\nAgentTeam member in the **compound** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **Patterns written**: Count and file path\n- **Clusters found**: Summary of each cluster\n- **Singletons skipped**: Count of unclustered lessons\n`,\n\n 'audit': `---\nname: Audit Agent\ndescription: Deep semantic analysis of codebase against rules, patterns, and lessons\n---\n\n# Audit Agent\n\n## Role\nPerform deep semantic analysis of the codebase against project rules, established patterns, and stored lessons. Identifies violations, drift, and improvement opportunities.\n\n## Instructions\n1. Run \\`npx ca audit --json\\` to get structured audit findings\n2. Interpret each finding's severity and context\n3. Cross-reference findings with \\`npx ca search\\` for known exceptions or decisions\n4. For each finding, suggest a specific fix or explain why it can be ignored\n5. Group findings by category (security, architecture, testing, conventions)\n6. Prioritize by impact: data loss risks first, then correctness, then style\n\n## Deployment\nSubagent spawned via the Task tool. Return findings directly to the caller.\n\n## Output Format\n- **CRITICAL**: Must fix immediately (security, data loss)\n- **WARNING**: Should fix soon (correctness, architecture drift)\n- **INFO**: Improvement suggestion (conventions, style)\n`,\n\n 'doc-gardener': `---\nname: Doc Gardener\ndescription: Audits project documentation for freshness, accuracy, and completeness\n---\n\n# Doc Gardener\n\n## Role\nAudit project documentation for freshness, accuracy, and completeness. Identify stale docs, missing references, and broken links. Ensure docs/INDEX.md accurately reflects the documentation tree.\n\n## Instructions\n1. Read \\`docs/INDEX.md\\` to get the documentation map\n2. Use Glob to find all .md files under docs/\n3. Cross-reference: every doc in INDEX should exist on disk, every doc on disk should be in INDEX\n4. For each doc, check:\n - Does it reference files/functions that still exist? (use Grep)\n - Does it describe the current behavior? (compare with source)\n - Is the last-modified date reasonable?\n5. Flag issues and create beads issues for stale docs\n\n## Deployment\nSubagent spawned via the Task tool. Return findings directly to the caller.\n\n## Output Format\nPer document:\n- **STALE**: References outdated code or behavior\n- **MISSING**: Referenced in INDEX but file not found\n- **SUPERSEDED**: Content duplicated or replaced elsewhere\n- **OK**: Current and accurate\n`,\n\n 'cct-subagent': `---\nname: CCT Subagent\ndescription: Injects mistake-derived test requirements into the TDD pipeline\n---\n\n# CCT Subagent\n\n## Role\nInject mistake-derived test requirements into the TDD pipeline. Runs between invariant-designer and test-first-enforcer to ensure past mistakes generate preventive tests.\n\n## Pipeline Position\ninvariant-designer -> **CCT Subagent** -> test-first-enforcer\n\n## Instructions\n1. Read CCT patterns from \\`.claude/lessons/cct-patterns.jsonl\\`\n2. Read the current task description and changed files\n3. Match patterns against the current task:\n - Compare task domain, file paths, and error categories\n - Check if the pattern's trigger condition applies\n4. For each matching pattern, output a test requirement:\n - What the test should verify\n - Why it matters (link to historical mistakes)\n - Priority (REQUIRED vs SUGGESTED)\n5. Pass requirements to test-first-enforcer for inclusion\n\n## Deployment\nSubagent in the TDD pipeline. Return findings directly to the caller.\n\n## Output Format\nPer match:\n- **REQUIRED TEST**: Must be written (high-confidence pattern match)\n- **SUGGESTED TEST**: Should consider (partial match)\n- **NO MATCH**: Pattern does not apply to current task\n`,\n\n 'drift-detector': `---\nname: Drift Detector\ndescription: Checks implementation for drift from established constraints\n---\n\n# Drift Detector\n\n## Role\nDetect drift between implementation and established constraints (invariants, ADRs, architectural decisions). Runs between module-boundary-reviewer and implementation-reviewer as a final consistency check.\n\n## Pipeline Position\nmodule-boundary-reviewer -> **Drift Detector** -> implementation-reviewer\n\n## Instructions\n1. Run \\`npx ca audit --json\\` for automated constraint checking\n2. Read invariants from \\`docs/invariants/\\` if present\n3. Read relevant ADRs from \\`docs/adr/\\` if present\n4. Compare the current implementation against each constraint:\n - Are module boundaries respected?\n - Do data flows match documented architecture?\n - Are naming conventions consistent?\n5. Use \\`npx ca search\\` for past architectural decisions that may apply\n6. Report any deviation, even if the implementation \"works\"\n\n## Deployment\nSubagent in the TDD pipeline. Return findings directly to the caller.\n\n## Output Format\n- **DRIFT**: Implementation violates a documented constraint\n- **RISK**: Implementation is borderline; may drift further\n- **CLEAR**: Implementation aligns with all constraints\n`,\n};\n","import { WORKFLOW_ROLE_SKILLS } from './agent-role-skills-workflow.js';\nimport { REVIEW_ROLE_SKILLS } from './agent-role-skills-review.js';\nimport { PHASE11_ROLE_SKILLS } from './agent-role-skills-phase11.js';\n\nexport const AGENT_ROLE_SKILLS: Record<string, string> = {\n ...WORKFLOW_ROLE_SKILLS,\n ...REVIEW_ROLE_SKILLS,\n ...PHASE11_ROLE_SKILLS,\n};\n","/**\n * Workflow slash command templates for .claude/commands/compound/.\n */\n\nexport const WORKFLOW_COMMANDS: Record<string, string> = {\n 'brainstorm.md': `---\nname: compound:brainstorm\ndescription: Explore requirements through collaborative dialogue before committing to a plan\nargument-hint: \"<goal or topic to brainstorm>\"\n---\n$ARGUMENTS\n\n# Brainstorm\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/brainstorm/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'plan.md': `---\nname: compound:plan\ndescription: Create a structured implementation plan with concrete tasks and dependencies\nargument-hint: \"<goal or epic to plan>\"\n---\n$ARGUMENTS\n\n# Plan\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/plan/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'work.md': `---\nname: compound:work\ndescription: Execute implementation by delegating to an agent team\nargument-hint: \"<task ID or description>\"\n---\n$ARGUMENTS\n\n# Work\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/work/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'review.md': `---\nname: compound:review\ndescription: Multi-agent code review with severity classification and mandatory gate\nargument-hint: \"<scope or git diff range>\"\n---\n$ARGUMENTS\n\n# Review\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/review/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'compound.md': `---\nname: compound:compound\ndescription: Capture high-quality lessons from completed work into the memory system\nargument-hint: \"<topic or epic context>\"\n---\n$ARGUMENTS\n\n# Compound\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/compound/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'lfg.md': `---\nname: compound:lfg\ndescription: Full workflow cycle chaining all five phases\nargument-hint: \"<goal>\"\ndisable-model-invocation: true\n---\n$ARGUMENTS\n\n# LFG\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/lfg/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full orchestration workflow you must follow.\n`,\n\n 'set-worktree.md': `---\nname: compound:set-worktree\ndescription: Set up a git worktree for isolated epic execution\nargument-hint: \"<epic-id>\"\n---\n$ARGUMENTS\n\n# Set Worktree\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/set-worktree/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'research.md': `---\nname: compound:research\ndescription: Deep research on a topic producing a structured survey document\nargument-hint: \"<topic to research>\"\n---\n$ARGUMENTS\n\n# Research\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/researcher/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'test-clean.md': `---\nname: compound:test-clean\ndescription: Multi-phase test suite optimization with adversarial review\nargument-hint: \"<scope or module to analyze>\"\n---\n$ARGUMENTS\n\n# Test Clean\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/test-cleaner/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n // =========================================================================\n // Utility commands (kept: learn, prime)\n // Removed in v1.3: search, list, show, wrong, stats (CLI wrappers)\n // =========================================================================\n\n 'learn.md': `---\nname: compound:learn\ndescription: Capture a lesson from this session into the memory system\nargument-hint: \"<insight to remember>\"\n---\nCapture a lesson from this session.\n\nUsage: /compound learn <insight>\n\nExamples:\n- /compound learn \"Always use Polars for large CSV files\"\n- /compound learn \"API requires X-Request-ID header\"\n\n\\`\\`\\`bash\nnpx ca learn \"$ARGUMENTS\"\n\\`\\`\\`\n`,\n 'prime.md': `---\nname: compound:prime\ndescription: Load compound-agent workflow context after compaction or context loss\n---\nLoad compound-agent workflow context after compaction or context loss.\n\n\\`\\`\\`bash\nnpx ca prime\n\\`\\`\\`\n`,\n};\n","/* eslint-disable max-lines -- template data file; multiline string constant */\n/**\n * Documentation templates deployed to consumer repos.\n * Written to docs/compound/ during setup.\n *\n * Split into 5 files for maintainability:\n * README.md, WORKFLOW.md, CLI_REFERENCE.md, SKILLS.md, INTEGRATION.md\n */\n\nexport const DOC_TEMPLATES: Record<string, string> = {\n 'README.md': `---\nversion: \"{{VERSION}}\"\nlast-updated: \"{{DATE}}\"\nsummary: \"Overview and getting started guide for compound-agent\"\n---\n\n# Compound Agent\n\nA learning system for Claude Code that captures, indexes, and retrieves lessons learned during development sessions -- so the same mistakes are not repeated.\n\n---\n\n## What is compound-agent?\n\nCompound-agent is a TypeScript CLI plugin for Claude Code. When Claude makes a mistake and gets corrected, or discovers a useful pattern, that knowledge is stored as a **memory item** in \\`.claude/lessons/index.jsonl\\`. Future sessions search this memory before planning and implementing.\n\nThe system uses:\n\n- **JSONL storage** (\\`.claude/lessons/index.jsonl\\`) as the git-tracked source of truth\n- **SQLite + FTS5** (\\`.claude/.cache/lessons.sqlite\\`) as a rebuildable search index\n- **Semantic embeddings** (EmbeddingGemma-300M via node-llama-cpp) for vector similarity search\n- **Claude Code hooks** to inject memory at session start, before compaction, and on tool failures\n\nMemory items have four types: \\`lesson\\`, \\`solution\\`, \\`pattern\\`, and \\`preference\\`. Each has a trigger, an insight, tags, severity, and optional citations.\n\n---\n\n## Quick start\n\n\\`\\`\\`bash\n# Initialize in your project:\nnpx ca init\n\n# Full setup (includes embedding model download):\nnpx ca setup\n\n# Verify installation:\nnpx ca doctor\n\\`\\`\\`\n\n### What \\`init\\` does\n\n1. Creates \\`.claude/lessons/\\` directory and empty \\`index.jsonl\\`\n2. Updates \\`AGENTS.md\\` with a compound-agent section\n3. Adds a reference to \\`.claude/CLAUDE.md\\`\n4. Creates \\`.claude/plugin.json\\` manifest\n5. Installs agent templates, workflow commands, phase skills, and agent role skills\n6. Installs a git pre-commit hook (lesson capture reminder)\n7. Installs Claude Code hooks (SessionStart, PreCompact, UserPromptSubmit, PostToolUseFailure, PostToolUse)\n8. For pnpm projects: auto-configures \\`onlyBuiltDependencies\\` for native addons\n\n\\`setup\\` does everything \\`init\\` does, plus downloads the EmbeddingGemma-300M model (~278MB). Use \\`--skip-model\\` to skip the download.\n\n---\n\n## Directory structure\n\n\\`\\`\\`\n.claude/\n CLAUDE.md # Project instructions (always loaded)\n compound-agent.json # Config (created by \\`npx ca reviewer enable\\`)\n settings.json # Claude Code hooks\n plugin.json # Plugin manifest\n agents/compound/ # Subagent definitions\n commands/compound/ # Slash commands (brainstorm, plan, work, review, compound, lfg)\n skills/compound/ # Phase skills + agent role skills\n lessons/\n index.jsonl # Memory items (git-tracked source of truth)\n .cache/\n lessons.sqlite # Rebuildable search index (.gitignore)\n\\`\\`\\`\n\n---\n\n## Quick reference\n\n| Task | Command |\n|------|---------|\n| Capture a lesson | \\`npx ca learn \"insight\" --trigger \"what happened\"\\` |\n| Search memory | \\`npx ca search \"keywords\"\\` |\n| Check plan against memory | \\`npx ca check-plan --plan \"description\"\\` |\n| View stats | \\`npx ca stats\\` |\n| Run full workflow | \\`/compound:lfg <epic-id>\\` |\n| Health check | \\`npx ca doctor\\` |\n\n---\n\n## Further reading\n\n- [WORKFLOW.md](WORKFLOW.md) -- The 5-phase development workflow and LFG orchestrator\n- [CLI_REFERENCE.md](CLI_REFERENCE.md) -- Complete CLI command reference\n- [SKILLS.md](SKILLS.md) -- Phase skills and agent role skills\n- [INTEGRATION.md](INTEGRATION.md) -- Memory system, hooks, beads, and agent guidance\n`,\n\n 'WORKFLOW.md': `---\nversion: \"{{VERSION}}\"\nlast-updated: \"{{DATE}}\"\nsummary: \"The 5-phase compound-agent workflow and LFG orchestrator\"\n---\n\n# Workflow\n\nEvery feature or epic follows five phases. The \\`/compound:lfg\\` skill chains them with enforcement gates.\n\n---\n\n## Phase 1: Brainstorm\n\nExplore the problem space before committing to a solution.\n\n- Ask \"why\" before \"how\"\n- Search memory for similar past features\n- Generate multiple approaches, then converge\n- Create a beads epic: \\`bd create --title=\"...\" --type=epic\\`\n\n## Phase 2: Plan\n\nDecompose work into small, testable tasks with dependencies.\n\n- Review brainstorm output\n- Create beads tasks: \\`bd create --title=\"...\" --type=task\\`\n- Create Review and Compound blocking tasks (these survive compaction)\n- Run \\`npx ca worktree wire-deps <epic-id>\\` if using worktrees\n\n## Phase 3: Work\n\nExecute implementation through agent teams using TDD.\n\n- Pick tasks from \\`bd ready\\`\n- Delegate to test-writer and implementer agents\n- Commit incrementally as tests pass\n- Run \\`/implementation-reviewer\\` before closing tasks\n\n## Phase 4: Review\n\nMulti-agent code review with severity classification.\n\n- Run quality gates: \\`pnpm test && pnpm lint\\`\n- Spawn specialized reviewers (security, architecture, performance, etc.)\n- Classify findings as P1/P2/P3\n- Fix all P1 findings before proceeding\n\n## Phase 5: Compound\n\nExtract and store lessons learned. This is what makes the system compound.\n\n- Analyze what happened during the cycle\n- Capture lessons via \\`npx ca learn\\`\n- Cluster patterns via \\`npx ca compound\\`\n- Update outdated docs and ADRs\n\n---\n\n## LFG orchestrator\n\n\\`/compound:lfg\\` chains all 5 phases with enforcement gates.\n\n### Invocation\n\n\\`\\`\\`\n/compound:lfg <epic-id>\n/compound:lfg <epic-id> from plan\n\\`\\`\\`\n\n### Phase execution protocol\n\nFor each phase, LFG:\n\n1. Announces progress: \\`[Phase N/5] PHASE_NAME\\`\n2. Initializes state: \\`npx ca phase-check start <phase>\\`\n3. Reads the phase skill file (non-negotiable -- never from memory)\n4. Runs \\`npx ca search\\` with the current goal\n5. Executes the phase following skill instructions\n6. Updates epic notes: \\`bd update <epic-id> --notes=\"Phase: NAME COMPLETE | Next: NEXT\"\\`\n7. Verifies the phase gate before proceeding\n\n### Phase gates\n\n| Gate | When | Verification |\n|------|------|-------------|\n| Post-plan | After Plan | \\`bd list --status=open\\` shows Review + Compound tasks |\n| Gate 3 | After Work | \\`bd list --status=in_progress\\` returns empty |\n| Gate 4 | After Review | \\`/implementation-reviewer\\` returned APPROVED |\n| Final | After Compound | \\`npx ca verify-gates <epic-id>\\` passes, \\`pnpm test\\` and \\`pnpm lint\\` pass |\n\nIf any gate fails, LFG stops. You must fix the issue before proceeding.\n\n### Resumption\n\nIf interrupted, LFG can resume:\n\n1. Run \\`bd show <epic-id>\\` and read the notes for phase state\n2. Re-invoke with \\`from <phase>\\` to skip completed phases\n\n### Phase state tracking\n\nLFG persists state in \\`.claude/.ca-phase-state.json\\`. Useful commands:\n\n\\`\\`\\`bash\nnpx ca phase-check status # See current phase state\nnpx ca phase-check clean # Reset phase state (escape hatch)\n\\`\\`\\`\n\n### Session close\n\nBefore saying \"done\", LFG runs this inviolable checklist:\n\n\\`\\`\\`bash\ngit status\ngit add <files>\nbd sync\ngit commit -m \"...\"\nbd sync\ngit push\n\\`\\`\\`\n`,\n\n 'CLI_REFERENCE.md': `---\nversion: \"{{VERSION}}\"\nlast-updated: \"{{DATE}}\"\nsummary: \"Complete CLI command reference for compound-agent\"\n---\n\n# CLI Reference\n\nAll commands use \\`npx ca\\` (or \\`npx compound-agent\\`). Global flags: \\`-v, --verbose\\` and \\`-q, --quiet\\`.\n\n---\n\n## Capture commands\n\n\\`\\`\\`bash\n# Capture a lesson (primary command)\nnpx ca learn \"Always validate epic IDs before shell execution\" \\\\\n --trigger \"Shell injection via bd show\" \\\\\n --tags \"security,validation\" \\\\\n --severity high \\\\\n --type lesson\n\n# Capture a pattern (requires --pattern-bad and --pattern-good)\nnpx ca learn \"Use execFileSync instead of execSync\" \\\\\n --type pattern \\\\\n --pattern-bad \"execSync(\\\\\\`bd show \\\\\\${id}\\\\\\`)\" \\\\\n --pattern-good \"execFileSync('bd', ['show', id])\"\n\n# Capture from trigger/insight flags\nnpx ca capture --trigger \"Tests failed after refactor\" --insight \"Run full suite after moving files\" --yes\n\n# Detect learning triggers from input file\nnpx ca detect --input corrections.json\nnpx ca detect --input corrections.json --save --yes\n\\`\\`\\`\n\n**Types**: \\`lesson\\` (default), \\`solution\\`, \\`pattern\\`, \\`preference\\`\n**Severity**: \\`high\\`, \\`medium\\`, \\`low\\`\n\n## Retrieval commands\n\n\\`\\`\\`bash\nnpx ca search \"sqlite validation\" # Keyword search\nnpx ca search \"security\" --limit 5\nnpx ca list # List all memory items\nnpx ca list --limit 20\nnpx ca list --invalidated # Show only invalidated items\nnpx ca check-plan --plan \"Implement git worktree integration\"\necho \"Add caching layer\" | npx ca check-plan # Semantic search against a plan\nnpx ca load-session # Load high-severity lessons\nnpx ca load-session --json\n\\`\\`\\`\n\n## Management commands\n\n\\`\\`\\`bash\nnpx ca show <id> # View a specific item\nnpx ca show <id> --json\nnpx ca update <id> --insight \"Updated text\" # Update item fields\nnpx ca update <id> --severity high --tags \"security,input-validation\"\nnpx ca delete <id> # Soft delete (creates tombstone)\nnpx ca delete <id1> <id2> <id3>\nnpx ca wrong <id> --reason \"Incorrect\" # Mark as invalid\nnpx ca validate <id> # Re-enable an invalidated item\nnpx ca export # Export as JSON\nnpx ca export --since 2026-01-01 --tags \"security\"\nnpx ca import lessons-backup.jsonl # Import from JSONL file\nnpx ca compact # Remove tombstones and archive old items\nnpx ca compact --dry-run\nnpx ca compact --force\nnpx ca rebuild # Rebuild SQLite index from JSONL\nnpx ca rebuild --force\nnpx ca stats # Show database health and statistics\nnpx ca prime # Reload workflow context after compaction\n\\`\\`\\`\n\n## Setup commands\n\n\\`\\`\\`bash\nnpx ca init # Initialize in current repo\nnpx ca init --skip-agents # Skip AGENTS.md and template installation\nnpx ca init --skip-hooks # Skip git hook installation\nnpx ca init --skip-claude # Skip Claude Code hooks\nnpx ca init --json # Output result as JSON\nnpx ca setup # Full setup (init + model download)\nnpx ca setup --update # Regenerate templates (preserves user files)\nnpx ca setup --uninstall # Remove compound-agent integration\nnpx ca setup --status # Show installation status\nnpx ca setup --skip-model # Skip embedding model download\nnpx ca setup claude # Install Claude Code hooks only\nnpx ca setup claude --status # Check hook status\nnpx ca hooks # Install git hooks\nnpx ca download-model # Download embedding model (~278MB)\n\\`\\`\\`\n\n## Reviewer commands\n\n\\`\\`\\`bash\nnpx ca reviewer enable gemini # Enable Gemini as external reviewer\nnpx ca reviewer enable codex # Enable Codex as external reviewer\nnpx ca reviewer disable gemini # Disable a reviewer\nnpx ca reviewer list # List enabled reviewers\n\\`\\`\\`\n\n## Loop command\n\n\\`\\`\\`bash\nnpx ca loop # Generate infinity loop script for autonomous processing\nnpx ca loop --epics epic-1 epic-2\nnpx ca loop --output my-loop.sh\nnpx ca loop --max-retries 5\nnpx ca loop --model claude-opus-4-6\nnpx ca loop --force # Overwrite existing script\n\\`\\`\\`\n\n## Health, audit, and verification commands\n\n\\`\\`\\`bash\nnpx ca about # Show version, animation, and recent changelog\nnpx ca doctor # Check external dependencies and project health\nnpx ca audit # Run pattern, rule, and lesson quality checks\nnpx ca rules check # Check codebase against .claude/rules.json\nnpx ca test-summary # Run tests and output compact pass/fail summary\nnpx ca verify-gates <epic-id> # Verify workflow gates before epic closure\nnpx ca phase-check init <epic-id>\nnpx ca phase-check status\nnpx ca phase-check start <phase>\nnpx ca phase-check gate <gate-name> # post-plan, gate-3, gate-4, final\nnpx ca phase-check clean\n\\`\\`\\`\n\n## Worktree commands\n\n\\`\\`\\`bash\nnpx ca worktree create <epic-id> # Create isolated worktree\nnpx ca worktree wire-deps <epic-id> # Connect merge dependencies\nnpx ca worktree merge <epic-id> # Merge worktree back to main\nnpx ca worktree list # List active worktrees\nnpx ca worktree cleanup <epic-id> # Remove worktree and clean up\nnpx ca worktree cleanup <epic-id> --force # Force cleanup of dirty worktrees\n\\`\\`\\`\n\n## Compound command\n\n\\`\\`\\`bash\nnpx ca compound # Synthesize cross-cutting patterns from accumulated lessons\n\\`\\`\\`\n`,\n\n 'SKILLS.md': `---\nversion: \"{{VERSION}}\"\nlast-updated: \"{{DATE}}\"\nsummary: \"Phase skills and agent role skills reference\"\n---\n\n# Skills Reference\n\nSkills are instructions that Claude reads before executing each phase. They live in \\`.claude/skills/compound/\\` and are auto-installed by \\`npx ca setup\\`.\n\n---\n\n## Phase skills\n\n### \\`/compound:brainstorm\\`\n\n**Purpose**: Divergent-then-convergent thinking to explore the solution space.\n\n**When invoked**: At the start of a new feature or epic, before any planning.\n\n**What it does**: Spawns research subagents, searches memory for similar past features, generates multiple approaches, converges on a decision with documented rationale, and creates a beads epic.\n\n### \\`/compound:plan\\`\n\n**Purpose**: Decompose work into small testable tasks with dependencies.\n\n**When invoked**: After brainstorm, before any implementation.\n\n**What it does**: Reviews brainstorm output, spawns analysts, decomposes into tasks with acceptance criteria, creates beads issues, and creates Review + Compound blocking tasks. Runs \\`npx ca worktree wire-deps\\` if a worktree is active.\n\n### \\`/compound:work\\`\n\n**Purpose**: Team-based TDD execution with adaptive complexity.\n\n**When invoked**: After plan, when tasks are ready in beads.\n\n**What it does**: Picks tasks from \\`bd ready\\`, deploys an AgentTeam with test-writers and implementers, coordinates agent work, commits incrementally, runs \\`/implementation-reviewer\\` as mandatory gate.\n\n### \\`/compound:review\\`\n\n**Purpose**: Multi-agent review with parallel specialized reviewers.\n\n**When invoked**: After all work tasks are closed.\n\n**What it does**: Runs quality gates, selects reviewer tier based on diff size (4-11 reviewers), spawns reviewers in an AgentTeam, classifies findings by severity, fixes all P1s, runs \\`/implementation-reviewer\\`.\n\n### \\`/compound:compound\\`\n\n**Purpose**: Reflect on the cycle and capture lessons for future sessions.\n\n**When invoked**: After review is approved.\n\n**What it does**: Spawns an analysis pipeline (context-analyzer, lesson-extractor, pattern-matcher, solution-writer, compounding), applies quality filters, classifies items by type and severity, stores via \\`npx ca learn\\`, runs \\`npx ca verify-gates\\`.\n\n### \\`/compound:lfg\\`\n\n**Purpose**: Full-cycle orchestrator chaining all five phases.\n\n**When invoked**: When you want to run an entire epic end-to-end.\n\n**What it does**: Sequences all 5 phases with mandatory gates between them, tracks progress in beads notes, handles resumption after interruption. See [WORKFLOW.md](WORKFLOW.md) for full details.\n\n### \\`/compound:set-worktree\\`\n\n**Purpose**: Set up an isolated git worktree before running LFG.\n\n**When invoked**: Before \\`/compound:lfg\\` when you want parallel epic execution.\n\n**What it does**: Validates the epic, runs \\`npx ca worktree create <epic-id>\\`, verifies output, and informs the user they can proceed with \\`/compound:lfg\\`.\n\n---\n\n## Skill invocation\n\nSkills are invoked as Claude Code slash commands:\n\n\\`\\`\\`\n/compound:brainstorm # Start brainstorm phase\n/compound:plan # Start plan phase\n/compound:work # Start work phase\n/compound:review # Start review phase\n/compound:compound # Start compound phase\n/compound:lfg <epic-id> # Run all phases end-to-end\n/compound:set-worktree <epic-id> # Set up worktree before LFG\n\\`\\`\\`\n\nEach skill reads its SKILL.md file from \\`.claude/skills/compound/<phase>/SKILL.md\\` at invocation time. Skills are never executed from memory.\n`,\n\n 'INTEGRATION.md': `---\nversion: \"{{VERSION}}\"\nlast-updated: \"{{DATE}}\"\nsummary: \"Memory system, hooks, beads integration, and agent guidance\"\n---\n\n# Integration\n\nDeep integration topics for compound-agent: memory system internals, Claude Code hooks, beads workflow, worktree integration, and agent guidance.\n\n---\n\n## Memory system\n\n### Storage format\n\nMemory items are stored as newline-delimited JSON in \\`.claude/lessons/index.jsonl\\`. Each line is a complete JSON object:\n\n\\`\\`\\`json\n{\"id\":\"L-abc123\",\"type\":\"lesson\",\"trigger\":\"Shell injection via execSync\",\"insight\":\"Use execFileSync with array args\",\"tags\":[\"security\"],\"source\":\"manual\",\"context\":{\"tool\":\"cli\",\"intent\":\"manual learning\"},\"created\":\"2026-02-15T10:00:00Z\",\"confirmed\":true,\"severity\":\"high\",\"supersedes\":[],\"related\":[]}\n\\`\\`\\`\n\n### Indexing\n\nThe SQLite index at \\`.claude/.cache/lessons.sqlite\\` provides:\n\n- **FTS5 full-text search** for keyword queries (\\`npx ca search\\`)\n- **Embedding cache** for vector similarity (avoids re-computing embeddings)\n- **Retrieval count tracking** for usage statistics\n\nThe index is rebuilt automatically when the JSONL changes. Force rebuild with \\`npx ca rebuild --force\\`.\n\n### Search mechanisms\n\n**Keyword search** (\\`npx ca search\\`): Uses SQLite FTS5 to match words in trigger, insight, and tags.\n\n**Semantic search** (\\`npx ca check-plan\\`): Embeds the query text and compares cosine similarity against stored lesson embeddings. Results are ranked with configurable boosts for severity, recency, and confirmation status.\n\n**Session loading** (\\`npx ca load-session\\`): Returns high-severity confirmed lessons for injection at session start.\n\n### Data lifecycle\n\n| Operation | Effect |\n|-----------|--------|\n| \\`npx ca learn\\` | Appends a new item to JSONL |\n| \\`npx ca update\\` | Appends an updated version (last-write-wins) |\n| \\`npx ca delete\\` | Appends with \\`deleted: true\\` flag |\n| \\`npx ca wrong\\` | Sets \\`invalidatedAt\\` (excluded from retrieval, preserved in storage) |\n| \\`npx ca compact\\` | Removes tombstones and archives old items, then rebuilds index |\n\n---\n\n## Claude Code hooks\n\nCompound-agent installs five hooks into \\`.claude/settings.json\\`:\n\n| Hook | Trigger | Action |\n|------|---------|--------|\n| **SessionStart** | New session or resume | Runs \\`npx ca prime\\` to load workflow context and high-severity lessons |\n| **PreCompact** | Before context compaction | Runs \\`npx ca prime\\` to preserve context across compaction |\n| **UserPromptSubmit** | Every user message | Detects correction/planning language, injects memory reminders |\n| **PostToolUseFailure** | Bash/Edit/Write failures | After 2 failures on same file or 3 total, suggests \\`npx ca search\\` |\n| **PostToolUse** | After successful tool use | Resets failure tracking; tracks skill file reads for phase guard |\n\n### Memory usage during sessions\n\n**At session start**: High-severity lessons are automatically loaded via the SessionStart hook.\n\n**Before planning**: Search memory for relevant context:\n\n\\`\\`\\`bash\nnpx ca search \"feature area keywords\"\nnpx ca check-plan --plan \"description of what you are about to implement\"\n\\`\\`\\`\n\n**After corrections**: Capture what you learned:\n\n\\`\\`\\`bash\nnpx ca learn \"The insight\" --trigger \"What happened\" --severity medium\n\\`\\`\\`\n\n**At session end**: Run the compound phase to extract patterns:\n\n\\`\\`\\`bash\nnpx ca compound\n\\`\\`\\`\n\n---\n\n## Beads integration\n\nCompound-agent works with beads (\\`bd\\`) for issue tracking:\n\n\\`\\`\\`bash\nbd ready # Find available tasks\nbd show <id> # View task details\nbd create --title=\"...\" --type=task --priority=2\nbd update <id> --status=in_progress\nbd close <id>\nbd sync # Sync with git remote\n\\`\\`\\`\n\nThe plan phase creates Review and Compound blocking tasks that depend on work tasks. This ensures these phases surface via \\`bd ready\\` after work completes, surviving context compaction.\n\n### Verification gates\n\nBefore closing an epic, verify all gates pass:\n\n\\`\\`\\`bash\nnpx ca verify-gates <epic-id>\n\\`\\`\\`\n\nThis checks that a Review task, Compound task, and (if applicable) Merge task all exist and are closed.\n\n---\n\n## Worktree integration\n\nWorktrees let you run epics in isolation, enabling parallel execution across multiple Claude Code sessions.\n\n\\`\\`\\`bash\nnpx ca worktree create <epic-id> # Creates worktree + installs deps + copies lessons\nnpx ca worktree merge <epic-id> # Two-phase merge back to main\nnpx ca worktree cleanup <epic-id> # Remove worktree, delete branch, close Merge task\nnpx ca worktree list # Show active worktrees\n\\`\\`\\`\n\nSee [CLI_REFERENCE.md](CLI_REFERENCE.md) for full worktree command details.\n\n---\n\n## For AI agents\n\n### Integrating into CLAUDE.md\n\nAdd a reference to compound-agent in your project's \\`.claude/CLAUDE.md\\`:\n\n\\`\\`\\`markdown\n## References\n\n- docs/compound/README.md -- Compound-agent overview and getting started\n\\`\\`\\`\n\nThe \\`npx ca init\\` command does this automatically.\n\n### Session completion checklist\n\n\\`\\`\\`bash\nnpx ca verify-gates <epic-id> # Verify review + compound tasks closed\ngit status # Check what changed\ngit add <files> # Stage code changes\nbd sync # Commit beads changes\ngit commit -m \"...\" # Commit code\nbd sync # Commit any new beads changes\ngit push # Push to remote\n\\`\\`\\`\n\nWork is not complete until \\`git push\\` succeeds.\n`,\n};\n","/* eslint-disable max-lines -- template data file; each skill is a multiline string constant */\n/**\n * Phase skill SKILL.md templates for compound workflow phases.\n * Written to .claude/skills/compound/<phase>/SKILL.md during setup.\n */\n\nexport const PHASE_SKILLS: Record<string, string> = {\n brainstorm: `---\nname: Brainstorm\ndescription: Divergent-then-convergent thinking to explore solution space\n---\n\n# Brainstorm Skill\n\n## Overview\nExplore the problem space before committing to a solution. This phase produces a structured brainstorm document with decisions, open questions, and a beads epic for handoff to planning.\n\n## Methodology\n1. Ask \"why\" before \"how\" -- understand the real problem\n2. Search memory with \\`npx ca search\\` for similar past features and known constraints\n3. Spawn **subagents** via Task tool in parallel for research (lightweight, no inter-agent coordination):\n - Available agents: \\`.claude/agents/compound/repo-analyst.md\\`, \\`memory-analyst.md\\`\n - Or use \\`subagent_type: Explore\\` for ad-hoc research\n - Deploy MULTIPLE when topic spans several domains; synthesize all findings before proceeding\n4. When facing deep unknowns or complex technical domains, invoke the **researcher skill** (read \\`.claude/skills/compound/researcher/SKILL.md\\`) to produce a structured survey document before narrowing approaches\n5. Use \\`AskUserQuestion\\` to clarify scope, constraints, and preferences\n6. Divergent phase: generate multiple approaches without filtering\n7. Identify constraints and non-functional requirements (performance, security, etc.)\n8. Convergent phase: evaluate approaches against constraints\n9. Document decisions with rationale, list open questions, and create a beads epic\n10. Auto-create ADR files in \\`docs/decisions/\\` for significant decisions (lightweight: Status, Context, Decision, Consequences)\n\n## Memory Integration\n- Run \\`npx ca search\\` with relevant keywords before generating approaches\n- Look for past architectural decisions, pitfalls, and preferences\n- If the problem domain matches past work, review those lessons first\n\n## Docs Integration\n- Spawn docs-explorer to scan \\`docs/\\` for relevant architecture docs, research, and standards\n- Review existing ADRs in \\`docs/decisions/\\` -- prior decisions may constrain the brainstorm\n- Auto-create ADR for each significant decision made during convergence\n\n## Common Pitfalls\n- Jumping to the first solution without exploring alternatives\n- Ignoring non-functional requirements (scalability, maintainability)\n- Not searching memory for similar past features\n- Not checking existing docs and ADRs for prior decisions\n- Over-scoping: trying to solve everything at once\n- Skipping the \"why\" and diving into \"how\"\n- Not invoking the researcher skill when the domain requires deep investigation\n- Not creating a beads epic from conclusions (losing brainstorm output)\n\n## Quality Criteria\n- Multiple approaches were considered (at least 2-3)\n- Constraints and requirements are explicitly listed\n- Memory was searched for relevant context\n- Existing docs and ADRs were reviewed for prior decisions\n- User was engaged via \\`AskUserQuestion\\` for clarification\n- A clear decision was made with documented rationale\n- ADRs created for significant architectural decisions\n- Open questions are captured for the plan phase\n- A beads epic was created from conclusions via \\`bd create\\`\n`,\n\n plan: `---\nname: Plan\ndescription: Decompose work into small testable tasks with clear dependencies\n---\n\n# Plan Skill\n\n## Overview\nCreate a concrete implementation plan by decomposing work into small, testable tasks with dependencies and acceptance criteria.\n\n## Methodology\n1. Review brainstorm output for decisions and open questions\n2. Search memory with \\`npx ca search\\` for architectural patterns and past mistakes\n3. Spawn **subagents** via Task tool in parallel for research (lightweight, no inter-agent coordination):\n - Available agents: \\`.claude/agents/compound/repo-analyst.md\\`, \\`memory-analyst.md\\`\n - For complex features, deploy MULTIPLE analysts per domain area\n - Synthesize all findings before decomposing into tasks\n4. For decisions requiring deep technical grounding, invoke the **researcher skill** to produce a survey document. Review findings before decomposing into tasks.\n5. Synthesize research findings into a coherent approach. Flag conflicts between ADRs and proposed plan.\n6. Use \\`AskUserQuestion\\` to resolve ambiguities, conflicting constraints, or priority trade-offs before decomposing\n7. Decompose into tasks small enough to verify individually\n8. Define acceptance criteria for each task\n9. Map dependencies between tasks\n10. Create beads issues: \\`bd create --title=\"...\" --type=task\\`\n11. Create review and compound blocking tasks (\\`bd create\\` + \\`bd dep add\\`) that depend on work tasks — these survive compaction and surface via \\`bd ready\\` after work completes\n12. Run \\`npx ca worktree wire-deps <epic-id>\\` to connect merge dependencies (graceful no-op if no worktree is active)\n\n## Memory Integration\n- Run \\`npx ca search\\` for patterns related to the feature area\n- Look for past planning mistakes (missing dependencies, unclear criteria)\n- Check for preferred architectural patterns in this codebase\n\n## Docs Integration\n- Spawn docs-analyst to scan \\`docs/\\` for relevant specs, standards, and research\n- Check \\`docs/decisions/\\` for existing ADRs that constrain or inform the plan\n- If the plan contradicts an ADR, flag it for the user before proceeding\n\n## Common Pitfalls\n- Creating too many fine-grained tasks (aim for 3-7 per feature)\n- Unclear acceptance criteria (\"make it work\" is not a criterion)\n- Missing dependencies between tasks\n- Not checking memory for past architectural decisions\n- Not reviewing existing ADRs and docs for constraints\n- Making architectural decisions without research backing (use the researcher skill for complex domains)\n- Planning implementation details too early (stay at task level)\n\n## Quality Criteria\n- Each task has clear acceptance criteria\n- Dependencies are mapped and no circular dependencies exist\n- Tasks are ordered so each can be verified independently\n- Memory was searched for relevant patterns and past mistakes\n- Existing docs and ADRs were checked for constraints\n- Ambiguities resolved via \\`AskUserQuestion\\` before decomposing\n- Complexity estimates are realistic (no \"should be quick\")\n\n## POST-PLAN VERIFICATION -- MANDATORY\nAfter creating all tasks, verify review and compound tasks exist:\n- Run \\`bd list --status=open\\` and check for a \"Review:\" task and a \"Compound:\" task\n- If either is missing, CREATE THEM NOW. The plan is NOT complete without these gates.\n- If a Merge: task exists in the dependency graph, verify it has Review and Compound as blockers (run \\`bd show <merge-id>\\` to confirm)\n`,\n\n work: `---\nname: Work\ndescription: Team-based TDD execution with adaptive complexity and agent delegation\n---\n\n# Work Skill\n\n## Overview\nExecute implementation through an AgentTeam using adaptive TDD. The lead coordinates and delegates -- agents write code.\n\n## Methodology\n1. Pick tasks from \\`bd ready\\` or \\`$ARGUMENTS\\`\n2. Mark tasks in progress: \\`bd update <id> --status=in_progress\\`\n3. Run \\`npx ca search\\` per agent/subtask for targeted context. Display results.\n4. Assess parallelization: identify independent tasks that can be worked simultaneously\n5. Deploy an **AgentTeam** (TeamCreate + Task with \\`team_name\\`) with MULTIPLE test-writers and implementers:\n - Role skills: \\`.claude/skills/compound/agents/{test-writer,implementer}/SKILL.md\\`\n - Scale teammate count to independent tasks; pairs coordinate via SendMessage on shared interfaces\n6. Agents communicate via SendMessage when working on overlapping areas.\n7. Lead coordinates: review agent outputs, resolve conflicts, verify tests pass. Do not write code directly.\n8. If blocked, use AskUserQuestion to get user direction.\n9. Shut down the team when done: send shutdown_request to all teammates.\n10. Commit incrementally as tests pass.\n11. Run full test suite for regressions.\n12. Close tasks: \\`bd close <id>\\`\n\n## Memory Integration\n- Run \\`npx ca search\\` per delegated subtask with the subtask's specific description\n- Each agent receives memory items tailored to their assigned task, not a shared blob\n- Run \\`npx ca learn\\` after corrections or novel discoveries\n\n## MANDATORY VERIFICATION -- DO NOT CLOSE TASK WITHOUT THIS\nBefore \\`bd close\\`, you MUST:\n1. Run \\`pnpm test\\` then \\`pnpm lint\\` (quality gates)\n2. Run \\`/implementation-reviewer\\` on changed code -- wait for APPROVED\nIf REJECTED: fix ALL issues, re-run tests, resubmit. INVIOLABLE per CLAUDE.md.\n\nThe full 8-step pipeline (invariant-designer through implementation-reviewer) is recommended\nfor complex changes. For all changes, \\`/implementation-reviewer\\` is the minimum required gate.\n\n## Beads Lifecycle\n- \\`bd ready\\` to find available tasks\n- \\`bd update <id> --status=in_progress\\` when starting\n- \\`bd close <id>\\` when all tests pass\n\n## Parallelization Strategy\n- **Always prefer parallel work**: independent tasks should be assigned to different teammate pairs simultaneously\n- **Scale the team adaptively**: deploy multiple test-writer + implementer pairs proportional to independent task count\n- **Subagent spawning within teammates**: each teammate should spawn opus subagents for independent subtasks (e.g., a test-writer spawning subagents to write tests for multiple modules in parallel)\n- **Coordinate on shared interfaces**: teammates working on overlapping APIs must communicate via SendMessage before implementing\n\n## Common Pitfalls\n- Lead writing code instead of delegating to agents\n- Not injecting memory context into agent prompts\n- Modifying tests to make them pass instead of fixing implementation\n- Not running the full test suite after agent work completes\n\n## Quality Criteria\n- Tests existed before implementation code\n- Agents received relevant memory context\n- Lead coordinated without writing implementation code\n- Incremental commits made as tests pass\n- All tests pass after refactoring\n- Task lifecycle tracked via beads (\\`bd\\`)\n\n## PHASE GATE 3 -- MANDATORY\nBefore starting Review, verify ALL work tasks are closed:\n- \\`bd list --status=in_progress\\` must return empty\n- \\`bd list --status=open\\` should only have Review and Compound tasks remaining\nIf any work tasks remain open, DO NOT proceed. Complete them first.\n`,\n\n review: `---\nname: Review\ndescription: Multi-agent review with parallel specialized reviewers and severity classification\n---\n\n# Review Skill\n\n## Overview\nPerform thorough code review by spawning specialized reviewers in parallel, consolidating findings with severity classification (P1/P2/P3), and gating completion on implementation-reviewer approval.\n\n## Methodology\n1. Run quality gates first: \\`pnpm test && pnpm lint\\`\n2. Search memory with \\`npx ca search\\` for known patterns and recurring issues\n3. Select reviewer tier based on diff size:\n - **Small** (<100 lines): 4 core -- security, test-coverage, simplicity, cct-reviewer\n - **Medium** (100-500): add architecture, performance, edge-case (7 total)\n - **Large** (500+): all 11 reviewers including docs, consistency, error-handling, pattern-matcher\n4. Spawn reviewers in an **AgentTeam** (TeamCreate + Task with \\`team_name\\`):\n - Role skills: \\`.claude/skills/compound/agents/{security-reviewer,architecture-reviewer,performance-reviewer,test-coverage-reviewer,simplicity-reviewer}/SKILL.md\\`\n - For large diffs (500+), deploy MULTIPLE instances; split files across instances, coordinate via SendMessage\n5. Reviewers communicate findings to each other via \\`SendMessage\\`\n6. Collect, consolidate, and deduplicate all findings\n7. Classify by severity: P1 (critical/blocking), P2 (important), P3 (minor)\n8. Use \\`AskUserQuestion\\` when severity is ambiguous or fix has multiple valid options\n9. Create beads issues for P1 findings: \\`bd create --title=\"P1: ...\"\\`\n10. Fix all P1 findings before proceeding\n11. Run \\`/implementation-reviewer\\` as mandatory gate\n12. Capture novel findings with \\`npx ca learn\\`; pattern-matcher auto-reinforces recurring issues\n\n## Memory Integration\n- Run \\`npx ca search\\` before review for known recurring issues\n- **pattern-matcher** auto-reinforces: recurring findings get severity increased via \\`npx ca learn\\`\n- **cct-reviewer** reads CCT patterns for known Claude failure patterns\n- Capture the review report via \\`npx ca learn\\` with \\`type=solution\\`\n\n## Docs Integration\n- **docs-reviewer** checks code/docs alignment and ADR compliance\n- Flags undocumented public APIs and ADR violations\n\n## Common Pitfalls\n- Ignoring reviewer feedback because \"it works\"\n- Not running all 11 reviewer perspectives (skipping dimensions)\n- Treating all findings as equal priority (classify P1/P2/P3 first)\n- Not creating beads issues for deferred fixes\n- Skipping quality gates before review\n- Bypassing the implementation-reviewer gate\n- Not checking CCT patterns for known Claude mistakes\n\n## Quality Criteria\n- All quality gates pass (\\`pnpm test\\`, lint)\n- All 11 reviewer perspectives were applied in parallel\n- Findings are classified P1/P2/P3 and deduplicated\n- pattern-matcher checked memory and reinforced recurring issues\n- cct-reviewer checked against known Claude failure patterns\n- docs-reviewer confirmed docs/ADR alignment\n- All P1 findings fixed before \\`/implementation-reviewer\\` approval\n- \\`/implementation-reviewer\\` approved as mandatory gate\n\n## PHASE GATE 4 -- MANDATORY\nBefore starting Compound, verify review is complete:\n- \\`/implementation-reviewer\\` must have returned APPROVED\n- All P1 findings must be resolved\n\n**CRITICAL**: Use \\`npx ca learn\\` for ALL lesson storage -- NOT MEMORY.md.\n`,\n\n compound: `---\nname: Compound\ndescription: Reflect on the cycle and capture high-quality lessons for future sessions\n---\n\n# Compound Skill\n\n## Overview\nExtract and store lessons learned during the cycle, and update project documentation. This is what makes the system compound -- each session leaves the next one better equipped.\n\n**CRITICAL**: Store all lessons via \\`npx ca learn\\` -- NOT via MEMORY.md, NOT via markdown files.\nLessons go to \\`.claude/lessons/index.jsonl\\` through the CLI. MEMORY.md is a different system and MUST NOT be used for compounding.\n\n## Methodology\n1. Review what happened during this cycle (git diff, test results, plan context)\n2. Spawn the analysis pipeline in an **AgentTeam** (TeamCreate + Task with \\`team_name\\`):\n - Role skills: \\`.claude/skills/compound/agents/{context-analyzer,lesson-extractor,pattern-matcher,solution-writer,compounding}/SKILL.md\\`\n - For large diffs, deploy MULTIPLE context-analyzers and lesson-extractors\n - Pipeline: context-analyzers -> lesson-extractors -> pattern-matcher + solution-writer -> compounding\n - Agents coordinate via SendMessage throughout the pipeline\n3. Agents pass results through the pipeline via \\`SendMessage\\`. The lead coordinates: context-analyzer and lesson-extractor feed pattern-matcher and solution-writer, which feed compounding.\n4. Apply quality filters: novelty check (>0.85 similarity = skip), specificity check\n5. Classify each item by type: lesson, solution, pattern, or preference\n6. Classify severity: high (data loss/security/contradictions), medium (workflow/patterns), low (style/optimizations)\n7. Store via \\`npx ca learn\\` with supersedes/related links where applicable.\n At minimum, capture 1 lesson per significant decision made during this cycle\n8. Delegate to the \\`compounding\\` subagent to run synthesis: cluster accumulated lessons by similarity and write CCT patterns to \\`.claude/lessons/cct-patterns.jsonl\\`\n9. Update outdated docs and deprecate superseded ADRs (set status to \\`deprecated\\`)\n10. Use \\`AskUserQuestion\\` to confirm high-severity items with the user before storing; medium/low items are auto-stored\n\n## Docs Integration\n- docs-reviewer checks if \\`docs/\\` content is outdated after the cycle\n- Check \\`docs/decisions/\\` for ADRs contradicted by the work done\n- Set ADR status to \\`deprecated\\` if a decision was reversed, referencing the new ADR\n\n## Common Pitfalls\n- Not spawning the analysis team (analyzing solo misses cross-cutting patterns)\n- Capturing without checking for duplicates via \\`npx ca search\\`\n- Skipping supersedes/related linking when an item updates prior knowledge\n- Not checking if docs or ADRs need updating after the cycle\n- Requiring user confirmation for every item (only high-severity needs it)\n- Not classifying items by type (lesson/solution/pattern/preference)\n- Capturing vague lessons (\"be careful with X\") -- be specific and concrete\n\n## Quality Criteria\n- Analysis team was spawned and agents coordinated via pipeline\n- Quality filters applied (novelty + specificity)\n- Duplicates checked via \\`npx ca search\\` before capture\n- Items classified by type (lesson/solution/pattern/preference)\n- Supersedes/related links set where applicable\n- Outdated docs and ADRs were updated or deprecated\n- User confirmed high-severity items\n- Beads checked for related issues (\\`bd\\`)\n- Each item gives clear, concrete guidance for future sessions\n\n## FINAL GATE -- EPIC CLOSURE\nBefore closing the epic:\n- Run \\`npx ca verify-gates <epic-id>\\` -- must return PASS for both gates\n- Run \\`pnpm test\\` and \\`pnpm lint\\` -- must pass\nIf verify-gates fails, the missing phase was SKIPPED. Go back and complete it.\nCRITICAL: 3/5 phases is NOT success. All 5 phases are required.\n`,\n\n 'set-worktree': `---\nname: Set Worktree\ndescription: Configure an isolated git worktree for parallel epic execution\n---\n\n# Set Worktree Skill\n\n## Overview\nSet up a git worktree to isolate epic work from the main branch. This creates a separate working directory, installs dependencies, and creates a Merge beads task that orchestrates the merge lifecycle.\n\n## Methodology\n1. Validate the epic exists: run \\`bd show <epic-id>\\` to confirm the epic is open\n2. Search memory with \\`npx ca search \"worktree\"\\` for past worktree lessons\n3. Run the worktree creation command: \\`npx ca worktree create <epic-id>\\`\n4. Verify output: confirm worktree path, branch name, and Merge task ID are reported\n5. Note the Merge task ID -- it will surface via \\`bd ready\\` after all work tasks complete\n6. Confirm the worktree is ready: check that \\`.claude/\\` directory exists in the worktree\n7. Inform the user: the worktree is set up, they can now run \\`/compound:lfg\\` to start work\n\n## What Happens Under the Hood\n- A git worktree is created at \\`../<repo>-wt-<epic-id>\\` on branch \\`epic/<epic-id>\\`\n- Dependencies are installed via \\`pnpm install --frozen-lockfile\\`\n- Lessons JSONL is copied (not symlinked) to the worktree\n- A Merge beads task is created with the epic as its dependent\n- When all work completes, the Merge task surfaces via \\`bd ready\\`\n\n## Memory Integration\n- Run \\`npx ca search \"worktree\"\\` before creating to check for known issues\n- Run \\`npx ca learn\\` if you discover worktree-specific knowledge\n\n## Common Pitfalls\n- Creating a worktree for an epic that already has one (the command checks for this)\n- Forgetting to run \\`/compound:lfg\\` after setup (the worktree alone does nothing)\n- Not noting the Merge task ID (needed for later reference)\n- Running from inside an existing worktree (must run from main repo)\n\n## Quality Criteria\n- Worktree was created successfully (path exists)\n- \\`pnpm install\\` completed without errors\n- Merge beads task exists and is linked to the epic\n- User was informed of next steps (\\`/compound:lfg\\`)\n`,\n\n researcher: `---\nname: Researcher\ndescription: Deep research producing structured survey documents for informed decision-making\n---\n\n# Researcher Skill\n\n## Overview\nConduct deep research on a topic and produce a structured survey document following the project's research template. This skill spawns parallel research subagents to gather comprehensive information, then synthesizes findings into a PhD-depth document stored in \\`docs/research/\\`.\n\n## Methodology\n1. Identify the research question, scope, and exclusions\n2. Search memory with \\`npx ca search\\` for existing knowledge on the topic\n3. Spawn parallel research subagents via Task tool:\n - **Web search specialist**: Uses WebSearch/WebFetch for academic papers, blog posts, benchmarks, and tools\n - **Codebase explorer**: Uses \\`subagent_type: Explore\\` to find relevant existing code patterns\n - **Docs scanner**: Reads \\`docs/\\` for prior research, ADRs, and standards that inform the topic\n4. Collect and deduplicate findings from all subagents\n5. Synthesize into TEMPLATE_FOR_RESEARCH.md format:\n - Abstract (2-3 paragraphs)\n - Introduction (problem statement, scope, definitions)\n - Foundations (theoretical background)\n - Taxonomy of Approaches (classification framework, visual table/tree)\n - Analysis (one subsection per approach with theory, evidence, implementations, strengths/limitations)\n - Comparative Synthesis (cross-cutting trade-off table)\n - Open Problems & Gaps\n - Conclusion\n - References (full citations)\n - Practitioner Resources (annotated tools/repos)\n6. Store output at \\`docs/research/<topic-slug>.md\\` (kebab-case filename)\n7. Report key findings back for upstream skill (brainstorm/plan) to act on\n\n## Memory Integration\n- Run \\`npx ca search\\` with topic keywords before starting research\n- Check for existing research docs in \\`docs/research/\\` that overlap\n- After completion, key findings can be captured via \\`npx ca learn\\`\n\n## Docs Integration\n- Scan \\`docs/research/\\` for prior survey documents on related topics\n- Check \\`docs/decisions/\\` for ADRs that inform or constrain the research scope\n- Reference existing project docs as primary sources where relevant\n\n## Output Format\n\nEvery research document MUST follow this exact structure:\n\n# [Topic Title]\n\n*[Date]*\n\n## Abstract\n2-3 paragraph summary: what this survey covers, main approaches, key trade-offs.\n\n## 1. Introduction\n- Problem statement\n- Scope: covered and excluded\n- Key definitions\n\n## 2. Foundations\nTheoretical background. Assume technical reader, not domain specialist.\n\n## 3. Taxonomy of Approaches\nClassification framework. Present visually (table or tree) before details.\n\n## 4. Analysis\nOne subsection per approach:\n### 4.x [Approach Name]\n- **Theory & mechanism**\n- **Literature evidence**\n- **Implementations & benchmarks**\n- **Strengths & limitations**\n\n## 5. Comparative Synthesis\nCross-cutting trade-off table. No recommendations.\n\n## 6. Open Problems & Gaps\nUnsolved, under-researched, or risky areas.\n\n## 7. Conclusion\nSynthesis. No verdict.\n\n## References\nFull citations with URLs.\n\n## Practitioner Resources\nAnnotated tools, repos, articles grouped by category.\n\n## Common Pitfalls\n- Shallow treatment: each approach needs theory, evidence, AND implementation examples\n- Missing taxonomy: always classify approaches before diving into analysis\n- Recommendation bias: present trade-offs, never recommend (ADR process decides)\n- Ignoring gaps: explicitly state where evidence is thin or conflicting\n- Not deduplicating subagent findings (leads to repetitive content)\n- Skipping the comparative synthesis table\n\n## Quality Criteria\n- PhD academic depth (reads like a technical survey paper)\n- Multiple research subagents were deployed in parallel\n- Memory was searched for existing knowledge\n- Existing docs/research were checked for overlap\n- Every approach has: theory, evidence, implementations, strengths/limitations\n- Comparative synthesis table present with clear trade-offs\n- Open problems honestly identified\n- Full references with URLs\n- Practitioner resources annotated\n- No recommendations -- landscape presentation only\n`,\n\n lfg: `---\nname: LFG\ndescription: Full-cycle orchestrator chaining all five phases with gates and controls\n---\n\n# LFG Skill\n\n## Overview\nChain all 5 phases end-to-end: Brainstorm, Plan, Work, Review, Compound. This skill governs the orchestration -- phase sequencing, gates, progress tracking, and error recovery.\n\n## CRITICAL RULE -- READ BEFORE EXECUTE\nBefore starting EACH phase, you MUST use the Read tool to open its skill file:\n- .claude/skills/compound/brainstorm/SKILL.md\n- .claude/skills/compound/plan/SKILL.md\n- .claude/skills/compound/work/SKILL.md\n- .claude/skills/compound/review/SKILL.md\n- .claude/skills/compound/compound/SKILL.md\n\nDo NOT proceed from memory. Read the skill, then follow it exactly.\n\n## Phase Execution Protocol\n0. Initialize state: \\`npx ca phase-check init <epic-id>\\`\nFor each phase:\n1. Announce: \"[Phase N/5] PHASE_NAME\"\n2. Start state: \\`npx ca phase-check start <phase>\\`\n3. Read the phase skill file (see above)\n4. Run \\`npx ca search\\` with the current goal -- display results before proceeding\n5. Execute the phase following the skill instructions\n6. Update epic state: \\`bd update <epic-id> --notes=\"Phase: NAME COMPLETE | Next: NEXT\"\\`\n7. Verify phase gate before proceeding to the next phase\n\n## Phase Gates (MANDATORY)\n- **After Plan**: Run \\`bd list --status=open\\` and verify Review + Compound tasks exist, then run \\`npx ca phase-check gate post-plan\\`\n- **After Work (GATE 3)**: \\`bd list --status=in_progress\\` must be empty. Then run \\`npx ca phase-check gate gate-3\\`\n- **After Review (GATE 4)**: /implementation-reviewer must have returned APPROVED. Then run \\`npx ca phase-check gate gate-4\\`\n- **After Compound (FINAL GATE)**: Run \\`npx ca verify-gates <epic-id>\\` (must PASS), \\`pnpm test\\`, and \\`pnpm lint\\`, then run \\`npx ca phase-check gate final\\` (auto-cleans phase state)\n\nIf a gate fails, DO NOT proceed. Fix the issue first.\n\n## Phase Control\n- **Skip phases**: Parse arguments for \"from PHASE\" (e.g., \"from plan\"). Skip earlier phases.\n- **Resume**: After interruption, run \\`bd show <epic-id>\\` and read notes for phase state. Resume from that phase.\n- **Retry**: If a phase fails, report and ask user to retry, skip, or abort via AskUserQuestion.\n- **Progress**: Always announce current phase number before starting.\n\n## Stop Conditions\n- Brainstorm reveals goal is unclear -- stop, ask user\n- Tests produce unresolvable failures -- stop, report\n- Review finds critical security issues -- stop, report\n\n## Common Pitfalls\n- Skipping the Read step for a phase skill (NON-NEGOTIABLE)\n- Not running phase gates between phases\n- Not announcing progress (\"[Phase N/5]\")\n- Proceeding after a failed gate\n- Not updating epic notes with phase state (loses resume ability)\n- Batching all commits to the end instead of committing incrementally\n\n## Quality Criteria\n- All 5 phases were executed (3/5 is NOT success)\n- Each phase skill was Read before execution\n- Phase gates verified between each transition\n- Epic notes updated after each phase\n- Memory searched at the start of each phase\n- \\`npx ca verify-gates\\` passed at the end\n\n## SESSION CLOSE -- INVIOLABLE\nBefore saying \"done\": git status, git add, bd sync, git commit, bd sync, git push.\nIf phase state gets stuck, use the escape hatch: \\`npx ca phase-check clean\\` (or \\`npx ca phase-clean\\`).\n`,\n\n 'test-cleaner': `---\nname: Test Cleaner\ndescription: Multi-phase test suite optimization with adversarial review\n---\n\n# Test Cleaner Skill\n\n## Overview\nAnalyze, optimize, and clean a project's test suite through a multi-phase workflow with adversarial review. Produces machine-readable output and feeds findings into compound-agent memory.\n\n## Methodology\n\n### Phase 1: Analysis\nSpawn multiple analysis subagents in parallel:\n- **Cargo-cult detector**: Find fake tests, mocked business logic, trivial assertions\n- **Redundancy analyzer**: Identify overlapping/duplicate test coverage\n- **Independence checker**: Verify tests don't depend on execution order or shared state\n- **Invariant tracer**: Map which invariants each test verifies (Lamport framework)\n- **Coverage analyzer**: Identify untested code paths and modules\n\n### Phase 2: Planning\nSynthesize analysis results into a refined optimization plan:\n- Categorize findings by severity (P1/P2/P3)\n- Propose specific changes for each finding\n- Estimate impact on test suite speed and coverage\n- Iterate with subagents until the plan is comprehensive\n\n### Phase 3: Adversarial Review (CRITICAL QUALITY GATE)\n**This is THE KEY PHASE -- the most important phase in the entire workflow. NEVER skip, NEVER rush, NEVER settle for \"good enough.\"**\n\nExpose the plan to two neutral reviewer subagents:\n- **Reviewer A** (Opus): Independent critique of the optimization plan\n- **Reviewer B** (Sonnet): Independent critique from a different perspective\n\nBoth reviewers challenge assumptions, identify risks, and suggest improvements.\n\n**Mandatory iteration loop**: After each reviewer pass, if ANY issues, concerns, or suggestions remain from EITHER reviewer, revise the plan and re-submit to BOTH reviewers. Repeat until BOTH reviewers explicitly approve with ZERO reservations. Do not proceed to Phase 4 until unanimous, unconditional approval is reached.\n\nThis is the critical quality gate. Loop as many times as needed. The test suite must be bulletproof before execution begins.\n\n### Phase 4: Execution\nApply the agreed changes:\n- Machine-readable output format: \\`ERROR [file:line] type: description\\`\n- Include \\`REMEDIATION\\` suggestions and \\`SEE\\` references\n- Use \\`pnpm test:segment\\`, \\`pnpm test:random\\`, \\`pnpm test:critical\\` for targeted validation\n\n### Phase 5: Verification\n- Run full test suite after changes\n- Compare before/after metrics (count, duration, coverage)\n- Feed findings into compound-agent memory via \\`npx ca learn\\`\n\n## Test Scripts Integration\n- \\`pnpm test:segment <module>\\` -- Test specific module in isolation\n- \\`pnpm test:random <pct>\\` -- Deterministic random subset (seeded per-agent)\n- \\`pnpm test:critical\\` -- P1/critical tests only (fast CI feedback)\n\n## Memory Integration\n- Run \\`npx ca search \"test optimization\"\\` before starting\n- After completion, capture findings via \\`npx ca learn\\`\n- Feed patterns into CCT system for future sessions\n\n## Common Pitfalls\n- Deleting tests without verifying coverage is maintained elsewhere\n- Optimizing for speed at the cost of correctness\n- Settling for partial approval or cutting the Phase 3 review loop short before BOTH reviewers approve with zero reservations\n- Making changes without machine-readable output\n- Not feeding results back into compound-agent memory\n\n## Quality Criteria\n- All 5 phases completed (analysis, planning, review, execution, verification)\n- Both adversarial reviewers approved with zero reservations after iterative refinement\n- Machine-readable output format used throughout\n- Full test suite passes after changes\n- Coverage not degraded\n- Findings captured in compound-agent memory\n`,\n};\n","/**\n * Shared primitives for setup commands.\n * Used by both init.ts and setup-all.ts to avoid duplication.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { VERSION } from '../version.js';\nimport {\n AGENTS_MD_TEMPLATE,\n CLAUDE_MD_REFERENCE,\n CLAUDE_REF_START_MARKER,\n COMPOUND_AGENT_SECTION_HEADER,\n PLUGIN_MANIFEST,\n} from './templates.js';\nimport { AGENT_TEMPLATES, AGENT_ROLE_SKILLS, DOC_TEMPLATES, WORKFLOW_COMMANDS, PHASE_SKILLS } from './templates/index.js';\n\n/**\n * @deprecated Kept for backward compatibility with all.ts --update detection.\n * New installs use path-based detection (file inside compound/ = managed).\n */\nexport const GENERATED_MARKER = '<!-- generated by compound-agent -->\\n';\n\n/**\n * Check if AGENTS.md already has the Compound Agent section.\n */\nexport function hasCompoundAgentSection(content: string): boolean {\n return content.includes(COMPOUND_AGENT_SECTION_HEADER);\n}\n\n/**\n * Check if CLAUDE.md already has the Compound Agent reference.\n */\nexport function hasClaudeMdReference(content: string): boolean {\n return content.includes('Compound Agent') || content.includes(CLAUDE_REF_START_MARKER);\n}\n\n/**\n * Create or update AGENTS.md with Compound Agent section.\n */\nexport async function updateAgentsMd(repoRoot: string): Promise<boolean> {\n const agentsPath = join(repoRoot, 'AGENTS.md');\n let content = '';\n let existed = false;\n\n if (existsSync(agentsPath)) {\n content = await readFile(agentsPath, 'utf-8');\n existed = true;\n if (hasCompoundAgentSection(content)) {\n return false; // Already has section, no update needed\n }\n }\n\n // Append the template\n const newContent = existed ? content.trimEnd() + '\\n' + AGENTS_MD_TEMPLATE : AGENTS_MD_TEMPLATE.trim() + '\\n';\n await writeFile(agentsPath, newContent, 'utf-8');\n return true;\n}\n\n/**\n * Ensure CLAUDE.md has a reference to AGENTS.md for Compound Agent workflow.\n * Creates CLAUDE.md if it doesn't exist, appends reference if not present.\n * Uses markers for clean uninstall support.\n */\nexport async function ensureClaudeMdReference(repoRoot: string): Promise<boolean> {\n const claudeMdPath = join(repoRoot, '.claude', 'CLAUDE.md');\n\n // Ensure .claude directory exists\n await mkdir(join(repoRoot, '.claude'), { recursive: true });\n\n if (!existsSync(claudeMdPath)) {\n // Create new CLAUDE.md with reference\n const content = `# Project Instructions\n${CLAUDE_MD_REFERENCE}`;\n await writeFile(claudeMdPath, content, 'utf-8');\n return true;\n }\n\n // File exists - check if reference is already present\n const content = await readFile(claudeMdPath, 'utf-8');\n if (hasClaudeMdReference(content)) {\n return false; // Already has reference\n }\n\n // Append reference\n const newContent = content.trimEnd() + '\\n' + CLAUDE_MD_REFERENCE;\n await writeFile(claudeMdPath, newContent, 'utf-8');\n return true;\n}\n\n/**\n * Create plugin.json in .claude/ directory.\n * Idempotent: does not overwrite existing file.\n *\n * @returns true if plugin.json was created\n */\nexport async function createPluginManifest(repoRoot: string): Promise<boolean> {\n const pluginPath = join(repoRoot, '.claude', 'plugin.json');\n\n // Ensure .claude directory exists\n await mkdir(join(repoRoot, '.claude'), { recursive: true });\n\n if (existsSync(pluginPath)) {\n return false; // Already exists\n }\n\n await writeFile(pluginPath, JSON.stringify(PLUGIN_MANIFEST, null, 2) + '\\n', 'utf-8');\n return true;\n}\n\n\n/**\n * Install agent templates to .claude/agents/compound/.\n * Idempotent: does not overwrite existing files.\n *\n * @returns true if any agent templates were created\n */\nexport async function installAgentTemplates(repoRoot: string): Promise<boolean> {\n const agentsDir = join(repoRoot, '.claude', 'agents', 'compound');\n await mkdir(agentsDir, { recursive: true });\n\n let created = false;\n for (const [filename, content] of Object.entries(AGENT_TEMPLATES)) {\n const filePath = join(agentsDir, filename);\n if (!existsSync(filePath)) {\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n return created;\n}\n\n/**\n * Install workflow commands to .claude/commands/compound/.\n * Idempotent: does not overwrite existing files.\n *\n * @returns true if any workflow commands were created\n */\nexport async function installWorkflowCommands(repoRoot: string): Promise<boolean> {\n const commandsDir = join(repoRoot, '.claude', 'commands', 'compound');\n await mkdir(commandsDir, { recursive: true });\n\n let created = false;\n for (const [filename, content] of Object.entries(WORKFLOW_COMMANDS)) {\n const filePath = join(commandsDir, filename);\n if (!existsSync(filePath)) {\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n return created;\n}\n\n/**\n * Install phase skill templates to .claude/skills/compound/<phase>/SKILL.md.\n * Idempotent: does not overwrite existing files.\n *\n * @returns true if any skill templates were created\n */\nexport async function installPhaseSkills(repoRoot: string): Promise<boolean> {\n let created = false;\n for (const [phase, content] of Object.entries(PHASE_SKILLS)) {\n const skillDir = join(repoRoot, '.claude', 'skills', 'compound', phase);\n await mkdir(skillDir, { recursive: true });\n const filePath = join(skillDir, 'SKILL.md');\n if (!existsSync(filePath)) {\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n return created;\n}\n\n/**\n * Install agent role skill templates to .claude/skills/compound/agents/<name>/SKILL.md.\n * Idempotent: does not overwrite existing files.\n *\n * @returns true if any agent role skills were created\n */\nexport async function installAgentRoleSkills(repoRoot: string): Promise<boolean> {\n let created = false;\n for (const [name, content] of Object.entries(AGENT_ROLE_SKILLS)) {\n const skillDir = join(repoRoot, '.claude', 'skills', 'compound', 'agents', name);\n await mkdir(skillDir, { recursive: true });\n const filePath = join(skillDir, 'SKILL.md');\n if (!existsSync(filePath)) {\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n return created;\n}\n\n/**\n * Install documentation templates to docs/compound/.\n * Idempotent: does not overwrite existing files.\n * Replaces {{VERSION}} placeholder with the actual package version.\n *\n * @returns true if any doc templates were created\n */\nexport async function installDocTemplates(repoRoot: string): Promise<boolean> {\n const docsDir = join(repoRoot, 'docs', 'compound');\n await mkdir(docsDir, { recursive: true });\n\n let created = false;\n for (const [filename, template] of Object.entries(DOC_TEMPLATES)) {\n const filePath = join(docsDir, filename);\n if (!existsSync(filePath)) {\n const content = template.replace('{{VERSION}}', VERSION).replace('{{DATE}}', new Date().toISOString().slice(0, 10));\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n return created;\n}\n\n// ============================================================================\n// pnpm native build configuration\n// ============================================================================\n\n/** Native addon packages that require pnpm onlyBuiltDependencies opt-in. */\nconst REQUIRED_BUILD_DEPS = ['better-sqlite3', 'node-llama-cpp'];\n\n/** Result of pnpm build config check/update. */\nexport interface PnpmConfigResult {\n /** Whether this is a pnpm project (pnpm-lock.yaml or packageManager field). */\n isPnpm: boolean;\n /** Whether the config was already correct (no changes needed). */\n alreadyConfigured: boolean;\n /** Package names that were added to onlyBuiltDependencies. */\n added: string[];\n}\n\n/**\n * Ensure pnpm projects have onlyBuiltDependencies configured for native addons.\n *\n * pnpm v9+ blocks native addon compilation by default. This function detects\n * pnpm projects (via pnpm-lock.yaml or packageManager field) and adds the\n * required packages to pnpm.onlyBuiltDependencies in the consumer's package.json.\n *\n * Idempotent: does not duplicate entries or overwrite existing config.\n */\nexport async function ensurePnpmBuildConfig(repoRoot: string): Promise<PnpmConfigResult> {\n const lockPath = join(repoRoot, 'pnpm-lock.yaml');\n const hasLockfile = existsSync(lockPath);\n const pkgPath = join(repoRoot, 'package.json');\n const hasPkgJson = existsSync(pkgPath);\n\n // Detect pnpm: lockfile OR packageManager field starting with \"pnpm\"\n if (!hasLockfile) {\n if (!hasPkgJson) {\n return { isPnpm: false, alreadyConfigured: false, added: [] };\n }\n const pkg = readPkgJsonSafe(pkgPath, await readFile(pkgPath, 'utf-8'));\n if (pkg === null) return { isPnpm: false, alreadyConfigured: false, added: [] };\n const pm = typeof pkg.packageManager === 'string' ? pkg.packageManager : '';\n if (!pm.startsWith('pnpm')) {\n return { isPnpm: false, alreadyConfigured: false, added: [] };\n }\n // pnpm detected via packageManager field — fall through to config merge\n return mergePnpmConfig(pkgPath, pkg);\n }\n\n if (!hasPkgJson) {\n return { isPnpm: true, alreadyConfigured: false, added: [] };\n }\n\n const pkg = readPkgJsonSafe(pkgPath, await readFile(pkgPath, 'utf-8'));\n if (pkg === null) return { isPnpm: true, alreadyConfigured: false, added: [] };\n return mergePnpmConfig(pkgPath, pkg);\n}\n\nfunction readPkgJsonSafe(pkgPath: string, raw: string): Record<string, unknown> | null {\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n console.error(`Warning: Could not parse ${pkgPath} — skipping pnpm build config.\\nFix the JSON syntax and re-run setup.`);\n return null;\n }\n}\n\nasync function mergePnpmConfig(pkgPath: string, pkg: Record<string, unknown>): Promise<PnpmConfigResult> {\n // Get or create pnpm.onlyBuiltDependencies\n if (!pkg.pnpm || typeof pkg.pnpm !== 'object') {\n pkg.pnpm = {};\n }\n const pnpmConfig = pkg.pnpm as Record<string, unknown>;\n\n if (!Array.isArray(pnpmConfig.onlyBuiltDependencies)) {\n pnpmConfig.onlyBuiltDependencies = [];\n }\n const existing = pnpmConfig.onlyBuiltDependencies as string[];\n\n const added: string[] = [];\n for (const dep of REQUIRED_BUILD_DEPS) {\n if (!existing.includes(dep)) {\n existing.push(dep);\n added.push(dep);\n }\n }\n\n if (added.length === 0) {\n return { isPnpm: true, alreadyConfigured: true, added: [] };\n }\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n return { isPnpm: true, alreadyConfigured: false, added };\n}\n","/**\n * Uninstall command - Remove all generated compound-agent files.\n * NEVER removes .claude/lessons/ (user data).\n */\n\nimport { existsSync } from 'node:fs';\nimport { readFile, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport {\n getClaudeSettingsPath,\n hasClaudeHook,\n readClaudeSettings,\n removeAgentsSection,\n removeClaudeMdReference,\n removeCompoundAgentHook,\n writeClaudeSettings,\n} from './claude-helpers.js';\nimport { GENERATED_MARKER } from './primitives.js';\nimport { LEGACY_ROOT_SLASH_COMMANDS } from './templates.js';\n\nexport async function runUninstall(repoRoot: string, dryRun: boolean): Promise<string[]> {\n const actions: string[] = [];\n\n // Remove generated directories\n const dirsToRemove = [\n join(repoRoot, '.claude', 'agents', 'compound'),\n join(repoRoot, '.claude', 'commands', 'compound'),\n join(repoRoot, '.claude', 'skills', 'compound'),\n ];\n for (const dir of dirsToRemove) {\n if (existsSync(dir)) {\n if (!dryRun) await rm(dir, { recursive: true, force: true });\n actions.push(`Removed ${dir}`);\n }\n }\n\n // Remove legacy root-level slash commands (v1.0 migration)\n for (const filename of LEGACY_ROOT_SLASH_COMMANDS) {\n const filePath = join(repoRoot, '.claude', 'commands', filename);\n if (existsSync(filePath)) {\n const content = await readFile(filePath, 'utf-8');\n if (content.startsWith(GENERATED_MARKER)) {\n if (!dryRun) await rm(filePath);\n actions.push(`Removed ${filePath}`);\n }\n }\n }\n\n // Remove plugin.json (only if it belongs to compound-agent)\n const pluginPath = join(repoRoot, '.claude', 'plugin.json');\n if (existsSync(pluginPath)) {\n try {\n const content = JSON.parse(await readFile(pluginPath, 'utf-8'));\n if (content?.name === 'compound-agent') {\n if (!dryRun) await rm(pluginPath);\n actions.push(`Removed ${pluginPath}`);\n }\n } catch {\n // Malformed JSON — not ours, skip\n }\n }\n\n // Remove hooks from settings.json\n const settingsPath = getClaudeSettingsPath(false);\n try {\n const settings = await readClaudeSettings(settingsPath);\n if (hasClaudeHook(settings)) {\n if (!dryRun) {\n removeCompoundAgentHook(settings);\n await writeClaudeSettings(settingsPath, settings);\n }\n actions.push('Removed compound-agent hooks from settings.json');\n }\n } catch {\n // settings.json may not exist\n }\n\n // Remove AGENTS.md section\n if (!dryRun) {\n const removed = await removeAgentsSection(repoRoot);\n if (removed) actions.push('Removed compound-agent section from AGENTS.md');\n } else {\n const agentsPath = join(repoRoot, 'AGENTS.md');\n if (existsSync(agentsPath)) {\n const content = await readFile(agentsPath, 'utf-8');\n if (content.includes('compound-agent:start')) {\n actions.push('Removed compound-agent section from AGENTS.md');\n }\n }\n }\n\n // Remove CLAUDE.md reference\n if (!dryRun) {\n const removed = await removeClaudeMdReference(repoRoot);\n if (removed) actions.push('Removed compound-agent reference from CLAUDE.md');\n } else {\n const claudeMdPath = join(repoRoot, '.claude', 'CLAUDE.md');\n if (existsSync(claudeMdPath)) {\n const content = await readFile(claudeMdPath, 'utf-8');\n if (content.includes('compound-agent:claude-ref:start')) {\n actions.push('Removed compound-agent reference from CLAUDE.md');\n }\n }\n }\n\n return actions;\n}\n","/**\n * Upgrade module for cleaning up existing compound-agent installs.\n * Handles: deprecated command removal, generated header stripping.\n */\n\nimport { existsSync } from 'node:fs';\nimport { readdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { VERSION } from '../version.js';\n\nexport interface UpgradeResult {\n isUpgrade: boolean;\n removedCommands: string[];\n strippedHeaders: number;\n docVersionUpdated: boolean;\n message: string;\n}\n\nconst GENERATED_HEADER = '<!-- generated by compound-agent -->\\n';\n\n/** CLI wrapper commands deprecated in v1.3. */\nconst DEPRECATED_COMMANDS = ['search.md', 'list.md', 'show.md', 'stats.md', 'wrong.md'];\n\n/** Detect if this is an existing install (upgrade scenario). */\nexport function detectExistingInstall(repoRoot: string): boolean {\n return existsSync(join(repoRoot, '.claude', 'lessons', 'index.jsonl'));\n}\n\n/** Remove deprecated CLI wrapper command files from .claude/commands/compound/. */\nexport async function removeDeprecatedCommands(repoRoot: string, dryRun = false): Promise<string[]> {\n const commandsDir = join(repoRoot, '.claude', 'commands', 'compound');\n if (!existsSync(commandsDir)) return [];\n\n const removed: string[] = [];\n for (const filename of DEPRECATED_COMMANDS) {\n const filePath = join(commandsDir, filename);\n if (existsSync(filePath)) {\n const content = await readFile(filePath, 'utf-8');\n if (content.includes('npx ca') || content.includes('compound-agent')) {\n if (!dryRun) await rm(filePath);\n removed.push(filename);\n }\n }\n }\n return removed;\n}\n\n/** Strip generated headers from installed files in compound/ dirs. */\nexport async function stripGeneratedHeaders(repoRoot: string, dryRun = false): Promise<number> {\n const dirs = [\n join(repoRoot, '.claude', 'commands', 'compound'),\n join(repoRoot, '.claude', 'skills', 'compound'),\n join(repoRoot, '.claude', 'agents', 'compound'),\n ];\n\n let count = 0;\n for (const dir of dirs) {\n if (!existsSync(dir)) continue;\n count += await stripHeadersRecursive(dir, dryRun);\n }\n return count;\n}\n\n/** Recursively walk a directory and strip headers from .md files. */\nasync function stripHeadersRecursive(dir: string, dryRun = false): Promise<number> {\n let count = 0;\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n count += await stripHeadersRecursive(fullPath, dryRun);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n const content = await readFile(fullPath, 'utf-8');\n if (content.startsWith(GENERATED_HEADER)) {\n if (!dryRun) await writeFile(fullPath, content.slice(GENERATED_HEADER.length), 'utf-8');\n count++;\n }\n }\n }\n return count;\n}\n\n/**\n * Update the version line in docs/compound/README.md during upgrade.\n * Returns true if the file was updated, false if missing or already current.\n */\nexport async function upgradeDocVersion(repoRoot: string, newVersion: string, dryRun = false): Promise<boolean> {\n const docPath = join(repoRoot, 'docs', 'compound', 'README.md');\n if (!existsSync(docPath)) return false;\n\n const content = await readFile(docPath, 'utf-8');\n const updated = content.replace(/^(version: \")([^\"]+)(\")/m, `$1${newVersion}$3`);\n if (updated === content) return false;\n\n if (!dryRun) await writeFile(docPath, updated, 'utf-8');\n return true;\n}\n\n/** Run full upgrade flow. */\nexport async function runUpgrade(repoRoot: string, dryRun = false): Promise<UpgradeResult> {\n const isUpgrade = detectExistingInstall(repoRoot);\n\n if (!isUpgrade) {\n return {\n isUpgrade: false,\n removedCommands: [],\n strippedHeaders: 0,\n docVersionUpdated: false,\n message: 'No existing install detected. Nothing to upgrade.',\n };\n }\n\n const removedCommands = await removeDeprecatedCommands(repoRoot, dryRun);\n const strippedHeaders = await stripGeneratedHeaders(repoRoot, dryRun);\n const docVersionUpdated = await upgradeDocVersion(repoRoot, VERSION, dryRun);\n\n const parts: string[] = [];\n if (removedCommands.length > 0) {\n parts.push(`Removed ${removedCommands.length} deprecated command(s)`);\n }\n if (strippedHeaders > 0) {\n parts.push(`Stripped headers from ${strippedHeaders} file(s)`);\n }\n if (docVersionUpdated) {\n parts.push('Updated doc version');\n }\n const message = parts.length > 0\n ? `Upgrade complete: ${parts.join(', ')}.`\n : 'Upgrade complete: no changes needed.';\n\n return { isUpgrade, removedCommands, strippedHeaders, docVersionUpdated, message };\n}\n","/**\n * One-shot setup command - Configure everything for compound-agent.\n *\n * Combines: init + Claude hooks + optionally model download.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { isModelAvailable, resolveModel } from '../memory/embeddings/index.js';\nimport { LESSONS_PATH } from '../memory/storage/index.js';\nimport { getGlobalOpts, out } from '../commands/index.js';\nimport { playInstallBanner } from './banner.js';\nimport { checkBeadsAvailable, runFullBeadsCheck, type BeadsCheckResult } from './beads-check.js';\nimport { printBeadsFullStatus, printGitignoreStatus, printPnpmConfigStatus, printScopeStatus, printSetupGitHooksStatus, runStatus } from './display-utils.js';\nimport {\n addAllCompoundAgentHooks,\n getClaudeSettingsPath,\n hasAllCompoundAgentHooks,\n readClaudeSettings,\n writeClaudeSettings,\n} from './claude-helpers.js';\nimport { ensureGitignore, type GitignoreResult } from './gitignore.js';\nimport { installPreCommitHook, type HookInstallResult } from './hooks.js';\nimport {\n createPluginManifest,\n ensureClaudeMdReference,\n ensurePnpmBuildConfig,\n GENERATED_MARKER,\n installAgentRoleSkills,\n installAgentTemplates,\n installDocTemplates,\n installPhaseSkills,\n installWorkflowCommands,\n updateAgentsMd,\n type PnpmConfigResult,\n} from './primitives.js';\nimport { checkUserScope, type ScopeCheckResult } from './scope-check.js';\nimport { LEGACY_ROOT_SLASH_COMMANDS } from './templates.js';\nimport { AGENT_TEMPLATES, AGENT_ROLE_SKILLS, DOC_TEMPLATES, WORKFLOW_COMMANDS, PHASE_SKILLS } from './templates/index.js';\nimport { VERSION } from '../version.js';\nimport { runUninstall } from './uninstall.js';\nimport { runUpgrade, detectExistingInstall, type UpgradeResult } from './upgrade.js';\n\n/** Result of one-shot setup */\ninterface SetupResult {\n lessonsDir: string;\n agentsMd: boolean;\n hooks: boolean;\n gitHooks: HookInstallResult['status'] | 'skipped';\n model: 'downloaded' | 'already_exists' | 'failed' | 'skipped';\n pnpmConfig: PnpmConfigResult;\n beads: BeadsCheckResult;\n scope: ScopeCheckResult;\n upgrade: UpgradeResult | null;\n gitignore: GitignoreResult;\n}\n\n/**\n * Ensure lessons directory and index file exist.\n */\nasync function ensureLessonsDirectory(repoRoot: string): Promise<string> {\n const lessonsDir = dirname(join(repoRoot, LESSONS_PATH));\n await mkdir(lessonsDir, { recursive: true });\n\n const indexPath = join(repoRoot, LESSONS_PATH);\n if (!existsSync(indexPath)) {\n await writeFile(indexPath, '', 'utf-8');\n }\n\n return lessonsDir;\n}\n\n/**\n * Configure Claude Code settings: hooks in settings.json.\n */\nasync function configureClaudeSettings(): Promise<{ hooks: boolean }> {\n const settingsPath = getClaudeSettingsPath(false);\n let settings: Record<string, unknown>;\n try {\n settings = await readClaudeSettings(settingsPath);\n } catch {\n // File exists but has malformed JSON — warn and skip to avoid data loss\n console.error(`Warning: Could not parse ${settingsPath} — skipping hook installation.\\nFix the JSON syntax and re-run setup.`);\n return { hooks: false };\n }\n\n const hadHooks = hasAllCompoundAgentHooks(settings);\n addAllCompoundAgentHooks(settings);\n await writeClaudeSettings(settingsPath, settings);\n\n return {\n hooks: !hadHooks,\n };\n}\n\n/**\n * Run one-shot setup.\n */\nexport async function runSetup(options: { skipModel?: boolean; skipHooks?: boolean }): Promise<SetupResult> {\n const repoRoot = getRepoRoot();\n\n // Pre-flight checks\n const scope = checkUserScope(repoRoot);\n const beads = checkBeadsAvailable();\n\n // Upgrade detection\n let upgrade: UpgradeResult | null = null;\n if (detectExistingInstall(repoRoot)) {\n upgrade = await runUpgrade(repoRoot);\n }\n\n // 0. Ensure pnpm native build config (before anything that needs native addons)\n const pnpmConfig = await ensurePnpmBuildConfig(repoRoot);\n\n // 1. Initialize lessons directory\n const lessonsDir = await ensureLessonsDirectory(repoRoot);\n\n // 2. Update AGENTS.md\n const agentsMdUpdated = await updateAgentsMd(repoRoot);\n\n // 3. Ensure CLAUDE.md reference\n await ensureClaudeMdReference(repoRoot);\n\n // 4. Create plugin manifest\n await createPluginManifest(repoRoot);\n\n // 5. Install agent templates\n await installAgentTemplates(repoRoot);\n\n // 6. Install workflow commands (includes utility commands)\n await installWorkflowCommands(repoRoot);\n\n // 7. Install phase skills\n await installPhaseSkills(repoRoot);\n\n // 8. Install agent role skills\n await installAgentRoleSkills(repoRoot);\n\n // 9. Install documentation templates\n await installDocTemplates(repoRoot);\n\n // 10. Install pre-commit git hook\n let gitHooks: HookInstallResult['status'] | 'skipped' = 'skipped';\n if (!options.skipHooks) {\n gitHooks = (await installPreCommitHook(repoRoot)).status;\n }\n\n // 11. Configure Claude settings (hooks in settings.json)\n const { hooks } = await configureClaudeSettings();\n\n // 12. Ensure .gitignore has required patterns\n const gitignore = await ensureGitignore(repoRoot);\n\n // 13. Download model (unless skipped)\n let modelStatus: 'downloaded' | 'already_exists' | 'failed' | 'skipped' = 'skipped';\n if (!options.skipModel) {\n try {\n const alreadyExisted = isModelAvailable();\n if (!alreadyExisted) {\n await resolveModel({ cli: false });\n modelStatus = 'downloaded';\n } else {\n modelStatus = 'already_exists';\n }\n } catch {\n modelStatus = 'failed';\n }\n }\n\n return {\n lessonsDir,\n agentsMd: agentsMdUpdated,\n hooks,\n gitHooks,\n model: modelStatus,\n pnpmConfig,\n beads,\n scope,\n upgrade,\n gitignore,\n };\n}\n\n\n/**\n * Update generated files with latest templates.\n * Files inside compound/ subdirectories are always managed and overwritten.\n */\nexport async function runUpdate(repoRoot: string, dryRun: boolean): Promise<{\n updated: number;\n added: number;\n configUpdated: boolean;\n upgrade: UpgradeResult;\n gitignore: GitignoreResult;\n}> {\n // Run upgrade pipeline (deprecated commands, headers, doc version)\n const upgrade = await runUpgrade(repoRoot, dryRun);\n\n let updated = 0;\n let added = 0;\n\n async function processFile(filePath: string, content: string): Promise<void> {\n if (!existsSync(filePath)) {\n if (!dryRun) {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content, 'utf-8');\n }\n added++;\n } else {\n const existing = await readFile(filePath, 'utf-8');\n // Strip any legacy marker for comparison\n const cleanExisting = existing.startsWith(GENERATED_MARKER)\n ? existing.slice(GENERATED_MARKER.length)\n : existing;\n if (cleanExisting !== content) {\n if (!dryRun) await writeFile(filePath, content, 'utf-8');\n updated++;\n }\n }\n }\n\n for (const [filename, content] of Object.entries(AGENT_TEMPLATES)) {\n await processFile(join(repoRoot, '.claude', 'agents', 'compound', filename), content);\n }\n for (const [filename, content] of Object.entries(WORKFLOW_COMMANDS)) {\n await processFile(join(repoRoot, '.claude', 'commands', 'compound', filename), content);\n }\n for (const [phase, content] of Object.entries(PHASE_SKILLS)) {\n await processFile(join(repoRoot, '.claude', 'skills', 'compound', phase, 'SKILL.md'), content);\n }\n for (const [name, content] of Object.entries(AGENT_ROLE_SKILLS)) {\n await processFile(join(repoRoot, '.claude', 'skills', 'compound', 'agents', name, 'SKILL.md'), content);\n }\n for (const [filename, template] of Object.entries(DOC_TEMPLATES)) {\n const content = template\n .replace('{{VERSION}}', VERSION)\n .replace('{{DATE}}', new Date().toISOString().slice(0, 10));\n await processFile(join(repoRoot, 'docs', 'compound', filename), content);\n }\n\n // Migration: clean up legacy root-level slash commands from v1.0\n // Only remove files that were generated by compound-agent (have the marker).\n // User-authored files with the same name are preserved.\n for (const filename of LEGACY_ROOT_SLASH_COMMANDS) {\n const filePath = join(repoRoot, '.claude', 'commands', filename);\n if (existsSync(filePath)) {\n const content = await readFile(filePath, 'utf-8');\n if (content.startsWith(GENERATED_MARKER)) {\n if (!dryRun) await rm(filePath);\n }\n }\n }\n\n // Migration: remove old monolithic HOW_TO_COMPOUND.md (replaced by split docs)\n const oldDocPath = join(repoRoot, 'docs', 'compound', 'HOW_TO_COMPOUND.md');\n if (existsSync(oldDocPath)) {\n const oldContent = await readFile(oldDocPath, 'utf-8');\n // Only remove if it has the version frontmatter (was generated by us)\n if (oldContent.startsWith('---\\nversion:')) {\n if (!dryRun) await rm(oldDocPath);\n updated++;\n }\n }\n\n // Ensure hooks config is current\n let configUpdated = false;\n if (!dryRun) {\n const { hooks } = await configureClaudeSettings();\n configUpdated = hooks;\n }\n\n // Ensure .gitignore has required patterns\n const gitignore = dryRun ? { added: [] } : await ensureGitignore(repoRoot);\n\n return { updated, added, configUpdated, upgrade, gitignore };\n}\n\n\nconst MODEL_STATUS_MSG: Record<string, string> = {\n skipped: 'Skipped (--skip-model)',\n downloaded: 'Downloaded',\n already_exists: 'Already exists',\n failed: 'Download failed (run `ca download-model` manually)',\n};\n\nasync function printSetupResult(result: SetupResult, quiet: boolean, repoRoot: string): Promise<void> {\n if (!quiet) {\n if (result.upgrade?.isUpgrade) {\n console.log(` ${result.upgrade.message}`);\n console.log(' Tip: Run with --update to regenerate managed files with latest templates.');\n }\n if (process.stdout.isTTY) await playInstallBanner();\n }\n out.success('Compound agent setup complete');\n console.log(` Lessons directory: ${result.lessonsDir}`);\n console.log(` AGENTS.md: ${result.agentsMd ? 'Updated' : 'Already configured'}`);\n console.log(` Claude hooks: ${result.hooks ? 'Installed' : 'Already configured'}`);\n printSetupGitHooksStatus(result.gitHooks);\n printPnpmConfigStatus(result.pnpmConfig);\n printGitignoreStatus(result.gitignore);\n console.log(` Model: ${MODEL_STATUS_MSG[result.model]}`);\n const fullBeads = runFullBeadsCheck(repoRoot);\n printBeadsFullStatus(fullBeads);\n printScopeStatus(result.scope);\n console.log('\\nNext steps:\\n 1. Restart Claude Code to load hooks\\n 2. Use `npx ca search` and `npx ca learn` commands');\n}\n\n/**\n * Register the one-shot setup action as the default subcommand of setup.\n * Using a default subcommand prevents its options (--uninstall, --dry-run)\n * from being consumed by the parent when other subcommands like \"claude\"\n * define the same flags.\n */\nexport function registerSetupAllCommand(setupCommand: Command): void {\n setupCommand.description('One-shot setup: init + hooks + model');\n\n setupCommand\n .command('all', { isDefault: true })\n .description('Run full setup (default)')\n .option('--skip-model', 'Skip embedding model download')\n .option('--skip-hooks', 'Skip git hooks installation')\n .option('--uninstall', 'Remove all generated files and configuration')\n .option('--update', 'Regenerate managed files in compound/ directories')\n .option('--status', 'Show installation status')\n .option('--dry-run', 'Show what would change without changing')\n .action(async function (this: Command, options: {\n skipModel?: boolean;\n skipHooks?: boolean;\n uninstall?: boolean;\n update?: boolean;\n status?: boolean;\n dryRun?: boolean;\n }) {\n const repoRoot = getRepoRoot();\n const dryRun = options.dryRun ?? false;\n\n if (options.uninstall) {\n const prefix = dryRun ? '[dry-run] Would have: ' : '';\n const actions = await runUninstall(repoRoot, dryRun);\n if (actions.length === 0) {\n console.log('Nothing to uninstall.');\n } else {\n for (const action of actions) {\n console.log(` ${prefix}${action}`);\n }\n out.success(dryRun ? 'Dry run complete (no changes made)' : 'Uninstall complete');\n }\n return;\n }\n\n if (options.update) {\n if (!dryRun && process.stdout.isTTY) await playInstallBanner();\n const result = await runUpdate(repoRoot, dryRun);\n const prefix = dryRun ? '[dry-run] ' : '';\n if (result.upgrade.isUpgrade) {\n console.log(` ${prefix}${result.upgrade.message}`);\n }\n if (result.updated === 0 && result.added === 0) {\n console.log(`${prefix}All generated files are up to date.`);\n } else {\n if (result.updated > 0) console.log(` ${prefix}Updated: ${result.updated} file(s)`);\n if (result.added > 0) console.log(` ${prefix}Added: ${result.added} file(s)`);\n }\n if (result.gitignore.added.length > 0) {\n console.log(` ${prefix}.gitignore: Added [${result.gitignore.added.join(', ')}]`);\n }\n if (result.configUpdated) console.log(` ${prefix}Config: hooks updated`);\n const fullBeads = runFullBeadsCheck(repoRoot);\n printBeadsFullStatus(fullBeads);\n const scope = checkUserScope(repoRoot);\n printScopeStatus(scope);\n return;\n }\n\n if (options.status) {\n await runStatus(repoRoot);\n return;\n }\n\n // Default: full setup\n const result = await runSetup({ skipModel: options.skipModel, skipHooks: options.skipHooks });\n const { quiet } = getGlobalOpts(this);\n await printSetupResult(result, quiet, repoRoot);\n });\n}\n","/**\n * Setup Claude command - Configure Claude Code SessionStart hooks.\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatError } from '../cli-error-format.js';\nimport { out } from '../commands/index.js';\nimport { getRepoRoot } from '../cli-utils.js';\nimport {\n addAllCompoundAgentHooks,\n getClaudeSettingsPath,\n hasAllCompoundAgentHooks,\n readClaudeSettings,\n removeAgentsSection,\n removeClaudeMdReference,\n removeCompoundAgentHook,\n writeClaudeSettings,\n} from './claude-helpers.js';\n\n/** Status check result */\ninterface StatusResult {\n settingsFile: string;\n exists: boolean;\n validJson: boolean;\n hookInstalled: boolean;\n slashCommands: {\n learn: boolean;\n search: boolean;\n };\n status: 'connected' | 'partial' | 'disconnected';\n}\n\n// ============================================================================\n// Action helpers\n// ============================================================================\n\nasync function handleStatus(\n alreadyInstalled: boolean,\n displayPath: string,\n settingsPath: string,\n options: { json?: boolean }\n): Promise<void> {\n const repoRoot = getRepoRoot();\n const learnMdPath = join(repoRoot, '.claude', 'commands', 'learn.md');\n const searchMdPath = join(repoRoot, '.claude', 'commands', 'search.md');\n\n const learnExists = existsSync(learnMdPath);\n const searchExists = existsSync(searchMdPath);\n\n let status: 'connected' | 'partial' | 'disconnected';\n if (alreadyInstalled && learnExists && searchExists) {\n status = 'connected';\n } else if (alreadyInstalled || learnExists || searchExists) {\n status = 'partial';\n } else {\n status = 'disconnected';\n }\n\n const result: StatusResult = {\n settingsFile: displayPath,\n exists: existsSync(settingsPath),\n validJson: true,\n hookInstalled: alreadyInstalled,\n slashCommands: { learn: learnExists, search: searchExists },\n status,\n };\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log('Claude Code Integration Status');\n console.log('\\u2500'.repeat(40));\n console.log('');\n console.log(`Hooks file: ${displayPath}`);\n console.log(` ${result.exists ? '[ok]' : '[missing]'} File exists`);\n console.log(` ${result.validJson ? '[ok]' : '[error]'} Valid JSON`);\n console.log(` ${result.hookInstalled ? '[ok]' : '[warn]'} Compound Agent hooks installed`);\n console.log('');\n console.log('Slash commands:');\n console.log(` ${learnExists ? '[ok]' : '[warn]'} /learn command`);\n console.log(` ${searchExists ? '[ok]' : '[warn]'} /search command`);\n console.log('');\n\n if (status === 'connected') {\n out.success('All checks passed. Integration is connected.');\n } else if (status === 'partial') {\n out.warn('Partial setup detected.');\n console.log('');\n console.log(\"Run 'npx ca setup' to complete setup.\");\n } else {\n out.error('Not connected.');\n console.log('');\n console.log(\"Run 'npx ca setup' to set up Compound Agent.\");\n }\n}\n\nasync function handleUninstall(\n settings: Record<string, unknown>,\n settingsPath: string,\n alreadyInstalled: boolean,\n displayPath: string,\n options: { global?: boolean; dryRun?: boolean; json?: boolean }\n): Promise<void> {\n const repoRoot = getRepoRoot();\n\n if (options.dryRun) {\n if (options.json) {\n console.log(JSON.stringify({ dryRun: true, wouldRemove: alreadyInstalled, location: displayPath }));\n } else {\n if (alreadyInstalled) {\n console.log(`Would remove compound-agent hooks from ${displayPath}`);\n } else {\n console.log('No compound-agent hooks to remove');\n }\n }\n return;\n }\n\n const removedHook = removeCompoundAgentHook(settings);\n if (removedHook) {\n await writeClaudeSettings(settingsPath, settings);\n }\n\n const removedAgents = await removeAgentsSection(repoRoot);\n const removedClaudeMd = await removeClaudeMdReference(repoRoot);\n\n const anyRemoved = removedHook || removedAgents || removedClaudeMd;\n\n if (anyRemoved) {\n if (options.json) {\n console.log(JSON.stringify({\n installed: false,\n location: displayPath,\n action: 'removed',\n agentsMdRemoved: removedAgents,\n claudeMdRemoved: removedClaudeMd,\n }));\n } else {\n out.success('Compound agent removed');\n if (removedHook) console.log(` Hooks: ${displayPath}`);\n if (removedAgents) console.log(' AGENTS.md: Compound Agent section removed');\n if (removedClaudeMd) console.log(' CLAUDE.md: Compound Agent reference removed');\n }\n } else {\n if (options.json) {\n console.log(JSON.stringify({ installed: false, location: displayPath, action: 'unchanged' }));\n } else {\n out.info('No compound agent hooks to remove');\n if (options.global) {\n console.log(' Hint: Try without --global to check project settings.');\n } else {\n console.log(' Hint: Try with --global flag to check global settings.');\n }\n }\n }\n}\n\nasync function handleInstall(\n settings: Record<string, unknown>,\n settingsPath: string,\n alreadyInstalled: boolean,\n displayPath: string,\n options: { global?: boolean; dryRun?: boolean; json?: boolean }\n): Promise<void> {\n if (options.dryRun) {\n if (options.json) {\n console.log(JSON.stringify({ dryRun: true, wouldInstall: !alreadyInstalled, location: displayPath }));\n } else {\n if (alreadyInstalled) {\n console.log('Compound agent hooks already installed');\n } else {\n console.log(`Would install compound-agent hooks to ${displayPath}`);\n }\n }\n return;\n }\n\n if (alreadyInstalled) {\n if (options.json) {\n console.log(JSON.stringify({\n installed: true,\n location: displayPath,\n hooks: ['SessionStart', 'PreCompact', 'UserPromptSubmit', 'PostToolUseFailure', 'PostToolUse', 'PreToolUse', 'Stop'],\n action: 'unchanged',\n }));\n } else {\n out.info('Compound agent hooks already installed');\n console.log(` Location: ${displayPath}`);\n }\n return;\n }\n\n const fileExists = existsSync(settingsPath);\n addAllCompoundAgentHooks(settings);\n await writeClaudeSettings(settingsPath, settings);\n\n if (options.json) {\n console.log(JSON.stringify({\n installed: true,\n location: displayPath,\n hooks: ['SessionStart', 'PreCompact', 'UserPromptSubmit', 'PostToolUseFailure', 'PostToolUse', 'PreToolUse', 'Stop'],\n action: fileExists ? 'updated' : 'created',\n }));\n } else {\n out.success(options.global ? 'Claude Code hooks installed (global)' : 'Claude Code hooks installed (project-level)');\n console.log(` Location: ${displayPath}`);\n console.log(' Hooks: SessionStart, PreCompact, UserPromptSubmit, PostToolUseFailure, PostToolUse, PreToolUse, Stop');\n console.log('');\n console.log('Lessons will be loaded automatically at session start.');\n if (!options.global) {\n console.log('');\n console.log('Note: Project hooks override global hooks.');\n }\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register the claude subcommand on an existing setup command.\n */\nexport function registerClaudeSubcommand(setupCommand: Command): void {\n setupCommand\n .command('claude')\n .description('Install Claude Code hooks')\n .option('--global', 'Install to global ~/.claude/ instead of project')\n .option('--uninstall', 'Remove compound-agent hooks')\n .option('--status', 'Check status of Claude Code integration')\n .option('--dry-run', 'Show what would change without writing')\n .option('--json', 'Output as JSON')\n .action(async (options: { global?: boolean; uninstall?: boolean; status?: boolean; dryRun?: boolean; json?: boolean }) => {\n const settingsPath = getClaudeSettingsPath(options.global ?? false);\n const displayPath = options.global ? '~/.claude/settings.json' : '.claude/settings.json';\n\n let settings: Record<string, unknown>;\n try {\n settings = await readClaudeSettings(settingsPath);\n } catch {\n if (options.json) {\n console.log(JSON.stringify({ error: 'Failed to parse settings file' }));\n } else {\n console.error(formatError('setup', 'PARSE_ERROR', 'Failed to parse settings file', 'Check if JSON is valid'));\n }\n process.exitCode = 1;\n return;\n }\n\n const alreadyInstalled = hasAllCompoundAgentHooks(settings);\n\n if (options.status) {\n await handleStatus(alreadyInstalled, displayPath, settingsPath, options);\n } else if (options.uninstall) {\n await handleUninstall(settings, settingsPath, alreadyInstalled, displayPath, options);\n } else {\n await handleInstall(settings, settingsPath, alreadyInstalled, displayPath, options);\n }\n });\n}\n","/**\n * Download-model command - Download the embedding model for semantic search.\n */\n\nimport { statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatBytes } from '../cli-utils.js';\nimport { isModelAvailable, MODEL_FILENAME, resolveModel } from '../memory/embeddings/index.js';\n\n/**\n * Register the download-model command on the program.\n */\nexport function registerDownloadModelCommand(program: Command): void {\n program\n .command('download-model')\n .description('Download the embedding model for semantic search')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n const alreadyExisted = isModelAvailable();\n\n if (alreadyExisted) {\n // Model already exists - get path and size\n const modelPath = join(homedir(), '.node-llama-cpp', 'models', MODEL_FILENAME);\n const size = statSync(modelPath).size;\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, path: modelPath, size, alreadyExisted: true }));\n } else {\n console.log('Model already exists.');\n console.log(`Path: ${modelPath}`);\n console.log(`Size: ${formatBytes(size)}`);\n }\n return;\n }\n\n // Download the model\n if (!options.json) {\n console.log('Downloading embedding model...');\n }\n\n const modelPath = await resolveModel({ cli: !options.json });\n const size = statSync(modelPath).size;\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, path: modelPath, size, alreadyExisted: false }));\n } else {\n console.log(`\\nModel downloaded successfully!`);\n console.log(`Path: ${modelPath}`);\n console.log(`Size: ${formatBytes(size)}`);\n }\n });\n}\n","/**\n * Init command - Initialize compound-agent in a repository.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { LESSONS_PATH } from '../memory/storage/index.js';\nimport { getGlobalOpts, out } from '../commands/index.js';\nimport { playInstallBanner } from './banner.js';\nimport { runFullBeadsCheck, type BeadsFullCheck } from './beads-check.js';\nimport { printBeadsFullStatus, printGitignoreStatus, printScopeStatus } from './display-utils.js';\nimport { installClaudeHooksForInit } from './claude-helpers.js';\nimport { ensureGitignore, type GitignoreResult } from './gitignore.js';\nimport { installPreCommitHook, type HookInstallResult } from './hooks.js';\nimport {\n createPluginManifest,\n ensureClaudeMdReference,\n ensurePnpmBuildConfig,\n installAgentRoleSkills,\n installAgentTemplates,\n installDocTemplates,\n installPhaseSkills,\n installWorkflowCommands,\n updateAgentsMd,\n type PnpmConfigResult,\n} from './primitives.js';\nimport { checkUserScope } from './scope-check.js';\nimport type { ClaudeHooksResult } from './types.js';\nimport { runUpgrade, detectExistingInstall, type UpgradeResult } from './upgrade.js';\n\n/**\n * Create the lessons directory structure.\n */\nasync function createLessonsDirectory(repoRoot: string): Promise<void> {\n const lessonsDir = dirname(join(repoRoot, LESSONS_PATH));\n await mkdir(lessonsDir, { recursive: true });\n}\n\n/**\n * Create empty index.jsonl if it doesn't exist.\n */\nasync function createIndexFile(repoRoot: string): Promise<void> {\n const indexPath = join(repoRoot, LESSONS_PATH);\n if (!existsSync(indexPath)) {\n await writeFile(indexPath, '', 'utf-8');\n }\n}\n\n// ============================================================================\n// Action Handler\n// ============================================================================\n\nasync function initAction(\n cmd: Command,\n options: { skipAgents?: boolean; skipHooks?: boolean; skipClaude?: boolean; json?: boolean; update?: boolean }\n): Promise<void> {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(cmd);\n\n // Pre-flight checks\n const scopeResult = checkUserScope(repoRoot);\n\n // Upgrade detection\n let upgradeResult: UpgradeResult | null = null;\n if (options.update || detectExistingInstall(repoRoot)) {\n upgradeResult = await runUpgrade(repoRoot);\n if (!quiet && !options.json && upgradeResult.isUpgrade) {\n console.log(` ${upgradeResult.message}`);\n if (!options.update) {\n console.log(' Tip: Run with --update to regenerate managed files with latest templates.');\n }\n }\n }\n\n if (!quiet && !options.json && process.stdout.isTTY) {\n await playInstallBanner();\n }\n\n // Ensure pnpm native build config before anything else\n const pnpmConfig = await ensurePnpmBuildConfig(repoRoot);\n\n await createLessonsDirectory(repoRoot);\n await createIndexFile(repoRoot);\n const lessonsDir = dirname(join(repoRoot, LESSONS_PATH));\n\n let agentsMdUpdated = false;\n if (!options.skipAgents) {\n agentsMdUpdated = await updateAgentsMd(repoRoot);\n }\n\n if (!options.skipAgents) {\n await ensureClaudeMdReference(repoRoot);\n }\n\n if (!options.skipAgents) {\n await createPluginManifest(repoRoot);\n await installAgentTemplates(repoRoot);\n await installWorkflowCommands(repoRoot);\n await installPhaseSkills(repoRoot);\n await installAgentRoleSkills(repoRoot);\n await installDocTemplates(repoRoot);\n }\n\n let hookResult: HookInstallResult | null = null;\n if (!options.skipHooks) {\n hookResult = await installPreCommitHook(repoRoot);\n }\n\n let claudeHooksResult: ClaudeHooksResult = { installed: false, action: 'error', error: 'skipped' };\n if (!options.skipClaude) {\n claudeHooksResult = await installClaudeHooksForInit(repoRoot);\n }\n\n // Ensure .gitignore has required patterns\n const gitignoreResult = await ensureGitignore(repoRoot);\n\n const fullBeads = runFullBeadsCheck(repoRoot);\n\n if (options.json) {\n printInitJson({ lessonsDir, agentsMdUpdated, hookResult, claudeHooksResult, pnpmConfig, fullBeads, scopeResult, upgradeResult, gitignoreResult });\n return;\n }\n\n if (quiet) return;\n\n out.success('Compound agent initialized');\n console.log(` Lessons directory: ${lessonsDir}`);\n printAgentsMdStatus(agentsMdUpdated, options.skipAgents);\n printHookStatus(hookResult, options.skipHooks);\n printClaudeHooksStatus(claudeHooksResult, options.skipClaude);\n printPnpmConfigStatus(pnpmConfig);\n printGitignoreStatus(gitignoreResult);\n printBeadsFullStatus(fullBeads);\n printScopeStatus(scopeResult);\n}\n\nfunction printInitJson(ctx: {\n lessonsDir: string; agentsMdUpdated: boolean; hookResult: HookInstallResult | null;\n claudeHooksResult: ClaudeHooksResult; pnpmConfig: PnpmConfigResult;\n fullBeads: BeadsFullCheck; scopeResult: { isUserScope: boolean };\n upgradeResult: UpgradeResult | null; gitignoreResult: GitignoreResult;\n}): void {\n const claudeHooksInstalled = ctx.claudeHooksResult.action === 'installed';\n const hooksChanged = ctx.hookResult?.status === 'installed' || ctx.hookResult?.status === 'appended';\n console.log(JSON.stringify({\n initialized: true, lessonsDir: ctx.lessonsDir, agentsMd: ctx.agentsMdUpdated,\n hooks: hooksChanged, hookStatus: ctx.hookResult?.status ?? 'skipped',\n claudeHooks: claudeHooksInstalled,\n pnpmConfig: ctx.pnpmConfig.isPnpm ? { added: ctx.pnpmConfig.added, alreadyConfigured: ctx.pnpmConfig.alreadyConfigured } : null,\n beadsAvailable: ctx.fullBeads.cliAvailable, beadsInitialized: ctx.fullBeads.initialized, beadsHealthy: ctx.fullBeads.healthy,\n userScope: ctx.scopeResult.isUserScope,\n upgrade: ctx.upgradeResult ? { isUpgrade: ctx.upgradeResult.isUpgrade, removedCommands: ctx.upgradeResult.removedCommands, strippedHeaders: ctx.upgradeResult.strippedHeaders } : null,\n gitignore: ctx.gitignoreResult.added,\n }));\n}\n\nfunction printAgentsMdStatus(updated: boolean, skipped?: boolean): void {\n if (updated) {\n console.log(' AGENTS.md: Updated with Compound Agent section');\n } else if (skipped) {\n console.log(' AGENTS.md: Skipped (--skip-agents)');\n } else {\n console.log(' AGENTS.md: Already has Compound Agent section');\n }\n}\n\nfunction printHookStatus(hookResult: HookInstallResult | null, skipped?: boolean): void {\n if (skipped) {\n console.log(' Git hooks: Skipped (--skip-hooks)');\n } else if (hookResult?.status === 'installed') {\n console.log(' Git hooks: Installed');\n } else if (hookResult?.status === 'appended') {\n console.log(' Git hooks: Appended to existing pre-commit hook');\n } else if (hookResult?.status === 'already_installed') {\n console.log(' Git hooks: Already installed');\n } else if (hookResult?.status === 'not_git_repo') {\n console.log(' Git hooks: Skipped (not a git repository)');\n }\n}\n\nfunction printClaudeHooksStatus(result: ClaudeHooksResult, skipped?: boolean): void {\n if (skipped) {\n console.log(' Claude hooks: Skipped (--skip-claude)');\n } else if (result.action === 'installed') {\n console.log(' Claude hooks: Installed to .claude/settings.json');\n } else if (result.action === 'already_installed') {\n console.log(' Claude hooks: Already installed');\n } else if (result.error) {\n console.log(` Claude hooks: Error - ${result.error}`);\n }\n}\n\nfunction printPnpmConfigStatus(result: PnpmConfigResult): void {\n if (!result.isPnpm) return;\n if (result.alreadyConfigured) {\n console.log(' pnpm config: onlyBuiltDependencies already configured');\n } else if (result.added.length > 0) {\n console.log(` pnpm config: Added onlyBuiltDependencies [${result.added.join(', ')}]`);\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register the init command on the program.\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Initialize compound-agent in this repository')\n .option('--skip-agents', 'Skip AGENTS.md modification')\n .option('--skip-hooks', 'Skip git hooks installation')\n .option('--skip-claude', 'Skip Claude Code hooks installation')\n .option('--json', 'Output result as JSON')\n .option('--update', 'Run upgrade logic on existing install')\n .action(async function (this: Command, options: { skipAgents?: boolean; skipHooks?: boolean; skipClaude?: boolean; json?: boolean; update?: boolean }) {\n await initAction(this, options);\n });\n}\n","/**\n * Shared types, constants, and utilities for CLI commands.\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\n// Re-export centralized utilities (utils.ts remains in src/ root)\nexport { getLessonAgeDays, MS_PER_DAY } from '../utils.js';\n\n// ============================================================================\n// Output Formatting Helpers\n// ============================================================================\n\n/** Output helper functions for consistent formatting */\nexport const out = {\n success: (msg: string): void => console.log(chalk.green('[ok]'), msg),\n error: (msg: string): void => console.error(chalk.red('[error]'), msg),\n info: (msg: string): void => console.log(chalk.blue('[info]'), msg),\n warn: (msg: string): void => console.log(chalk.yellow('[warn]'), msg),\n};\n\n/** Global options interface */\nexport interface GlobalOpts {\n verbose: boolean;\n quiet: boolean;\n}\n\n/**\n * Get global options from command.\n */\nexport function getGlobalOpts(cmd: Command): GlobalOpts {\n const opts = cmd.optsWithGlobals() as { verbose?: boolean; quiet?: boolean };\n return {\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n };\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default limit for search results */\nexport const DEFAULT_SEARCH_LIMIT = '10';\n\n/** Default limit for list results */\nexport const DEFAULT_LIST_LIMIT = '20';\n\n/** Default limit for search results */\nexport const DEFAULT_CHECK_PLAN_LIMIT = '5';\n\n/** Threshold for lesson count warning (context pollution prevention) */\nexport const LESSON_COUNT_WARNING_THRESHOLD = 20;\n\n/** Age threshold in days for flagging old lessons */\nexport const AGE_FLAG_THRESHOLD_DAYS = 90;\n\n/** Length of ISO date prefix (YYYY-MM-DD) */\nexport const ISO_DATE_PREFIX_LENGTH = 10;\n\n/** Decimal places for average calculations */\nexport const AVG_DECIMAL_PLACES = 1;\n\n/** Decimal places for relevance scores */\nexport const RELEVANCE_DECIMAL_PLACES = 2;\n\n/** Indentation for JSON pretty-printing */\nexport const JSON_INDENT_SPACES = 2;\n","/**\n * Helper functions for management commands.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { LESSONS_PATH } from '../memory/storage/index.js';\nimport type { MemoryItem } from '../memory/index.js';\n\n/**\n * Format a memory item for human-readable display.\n */\nexport function formatLessonHuman(lesson: MemoryItem): string {\n const lines: string[] = [];\n\n lines.push(`ID: ${lesson.id}`);\n lines.push(`Type: ${lesson.type}`);\n lines.push(`Trigger: ${lesson.trigger}`);\n lines.push(`Insight: ${lesson.insight}`);\n\n if (lesson.evidence) {\n lines.push(`Evidence: ${lesson.evidence}`);\n }\n\n if (lesson.severity) {\n lines.push(`Severity: ${lesson.severity}`);\n }\n\n lines.push(`Tags: ${lesson.tags.length > 0 ? lesson.tags.join(', ') : '(none)'}`);\n lines.push(`Source: ${lesson.source}`);\n\n if (lesson.context) {\n lines.push(`Context: ${lesson.context.tool} - ${lesson.context.intent}`);\n }\n\n lines.push(`Created: ${lesson.created}`);\n lines.push(`Confirmed: ${lesson.confirmed ? 'yes' : 'no'}`);\n\n if (lesson.supersedes && lesson.supersedes.length > 0) {\n lines.push(`Supersedes: ${lesson.supersedes.join(', ')}`);\n }\n\n if (lesson.related && lesson.related.length > 0) {\n lines.push(`Related: ${lesson.related.join(', ')}`);\n }\n\n if (lesson.pattern) {\n lines.push('Pattern:');\n lines.push(` Bad: ${lesson.pattern.bad}`);\n lines.push(` Good: ${lesson.pattern.good}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Check if a lesson ID has been deleted (has a tombstone).\n */\nexport async function wasLessonDeleted(repoRoot: string, id: string): Promise<boolean> {\n const filePath = join(repoRoot, LESSONS_PATH);\n try {\n const content = await readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const record = JSON.parse(trimmed) as { id: string; deleted?: boolean };\n if (record.id === id && record.deleted === true) {\n return true;\n }\n } catch {\n // Skip invalid lines\n }\n }\n } catch {\n // File doesn't exist\n }\n return false;\n}\n","/**\n * CRUD commands: show, update, delete\n *\n * Commands for reading, updating, and deleting lessons.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { appendMemoryItem, readMemoryItems, syncIfNeeded } from '../memory/storage/index.js';\nimport { MemoryItemSchema, SeveritySchema } from '../memory/index.js';\nimport type { MemoryItem, Severity } from '../memory/index.js';\n\nimport { formatError } from '../cli-error-format.js';\n\nimport { out } from './shared.js';\nimport { formatLessonHuman, wasLessonDeleted } from './management-helpers.js';\n\n/** JSON indentation for show output */\nconst SHOW_JSON_INDENT = 2;\n\n// ============================================================================\n// Action Handlers\n// ============================================================================\n\nasync function showAction(id: string, options: { json?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n\n const { items } = await readMemoryItems(repoRoot);\n const item = items.find((i) => i.id === id);\n\n if (!item) {\n const wasDeleted = await wasLessonDeleted(repoRoot, id);\n\n if (options.json) {\n console.log(JSON.stringify({ error: wasDeleted ? `Lesson ${id} not found (deleted)` : `Lesson ${id} not found` }));\n } else {\n const msg = wasDeleted ? `Lesson ${id} not found (deleted)` : `Lesson ${id} not found`;\n console.error(formatError('show', 'NOT_FOUND', msg, 'Use \"ca list\" to see available lessons'));\n }\n process.exitCode = 1;\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(item, null, SHOW_JSON_INDENT));\n } else {\n console.log(formatLessonHuman(item));\n }\n}\n\ninterface UpdateOptions {\n insight?: string;\n trigger?: string;\n evidence?: string;\n severity?: string;\n tags?: string;\n confirmed?: string;\n json?: boolean;\n}\n\nfunction buildUpdatedItem(item: MemoryItem, options: UpdateOptions): MemoryItem {\n return {\n ...item,\n ...(options.insight !== undefined && { insight: options.insight }),\n ...(options.trigger !== undefined && { trigger: options.trigger }),\n ...(options.evidence !== undefined && { evidence: options.evidence }),\n ...(options.severity !== undefined && { severity: options.severity as Severity }),\n ...(options.tags !== undefined && {\n tags: [...new Set(\n options.tags\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n )],\n }),\n ...(options.confirmed !== undefined && { confirmed: options.confirmed === 'true' }),\n };\n}\n\nasync function updateAction(id: string, options: UpdateOptions): Promise<void> {\n const repoRoot = getRepoRoot();\n\n const hasUpdates = options.insight !== undefined\n || options.trigger !== undefined\n || options.evidence !== undefined\n || options.severity !== undefined\n || options.tags !== undefined\n || options.confirmed !== undefined;\n\n if (!hasUpdates) {\n if (options.json) {\n console.log(JSON.stringify({ error: 'No fields to update (specify at least one: --insight, --tags, --severity, ...)' }));\n } else {\n console.error(formatError('update', 'NO_FIELDS', 'No fields to update', 'Specify at least one: --insight, --tags, --severity, ...'));\n }\n process.exitCode = 1;\n return;\n }\n\n const { items } = await readMemoryItems(repoRoot);\n const item = items.find((i) => i.id === id);\n\n if (!item) {\n const wasDeleted = await wasLessonDeleted(repoRoot, id);\n if (options.json) {\n console.log(JSON.stringify({ error: wasDeleted ? `Lesson ${id} is deleted` : `Lesson ${id} not found` }));\n } else {\n const msg = wasDeleted ? `Lesson ${id} is deleted` : `Lesson ${id} not found`;\n console.error(formatError('update', 'NOT_FOUND', msg, 'Use \"ca list\" to see available lessons'));\n }\n process.exitCode = 1;\n return;\n }\n\n if (options.severity !== undefined) {\n const result = SeveritySchema.safeParse(options.severity);\n if (!result.success) {\n if (options.json) {\n console.log(JSON.stringify({ error: `Invalid severity '${options.severity}' (must be: high, medium, low)` }));\n } else {\n console.error(formatError('update', 'INVALID_SEVERITY', `Invalid severity: \"${options.severity}\"`, 'Use --severity high|medium|low'));\n }\n process.exitCode = 1;\n return;\n }\n }\n\n const updatedItem = buildUpdatedItem(item, options);\n\n const validationResult = MemoryItemSchema.safeParse(updatedItem);\n if (!validationResult.success) {\n if (options.json) {\n console.log(JSON.stringify({ error: `Schema validation failed: ${validationResult.error.message}` }));\n } else {\n console.error(formatError('update', 'VALIDATION_FAILED', `Schema validation failed: ${validationResult.error.message}`, 'Check field values and try again'));\n }\n process.exitCode = 1;\n return;\n }\n\n await appendMemoryItem(repoRoot, updatedItem);\n await syncIfNeeded(repoRoot);\n\n if (options.json) {\n console.log(JSON.stringify(updatedItem, null, SHOW_JSON_INDENT));\n } else {\n out.success(`Updated lesson ${id}`);\n }\n}\n\nasync function deleteAction(ids: string[], options: { json?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n\n const { items } = await readMemoryItems(repoRoot);\n const itemMap = new Map(items.map((i) => [i.id, i]));\n\n const deleted: string[] = [];\n const warnings: Array<{ id: string; message: string }> = [];\n\n for (const id of ids) {\n const item = itemMap.get(id);\n\n if (!item) {\n const wasDeleted = await wasLessonDeleted(repoRoot, id);\n warnings.push({ id, message: wasDeleted ? 'already deleted' : 'not found' });\n continue;\n }\n\n const deletedItem: MemoryItem = {\n ...item,\n deleted: true,\n deletedAt: new Date().toISOString(),\n };\n\n await appendMemoryItem(repoRoot, deletedItem);\n deleted.push(id);\n }\n\n if (deleted.length > 0) {\n await syncIfNeeded(repoRoot);\n }\n\n if (options.json) {\n console.log(JSON.stringify({ deleted, warnings }));\n } else {\n if (deleted.length > 0) {\n out.success(`Deleted ${deleted.length} lesson(s): ${deleted.join(', ')}`);\n }\n for (const warning of warnings) {\n out.warn(`${warning.id}: ${warning.message}`);\n }\n if (deleted.length === 0 && warnings.length > 0) {\n process.exitCode = 1;\n return;\n }\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register CRUD commands on the program.\n */\nexport function registerCrudCommands(program: Command): void {\n program\n .command('show <id>')\n .description('Show details of a specific lesson')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options: { json?: boolean }) => {\n await showAction(id, options);\n });\n\n program\n .command('update <id>')\n .description('Update a lesson')\n .option('--insight <text>', 'Update insight')\n .option('--trigger <text>', 'Update trigger')\n .option('--evidence <text>', 'Update evidence')\n .option('--severity <level>', 'Update severity (low/medium/high)')\n .option('--tags <tags>', 'Update tags (comma-separated)')\n .option('--confirmed <bool>', 'Update confirmed status (true/false)')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options: {\n insight?: string;\n trigger?: string;\n evidence?: string;\n severity?: string;\n tags?: string;\n confirmed?: string;\n json?: boolean;\n }) => {\n await updateAction(id, options);\n });\n\n program\n .command('delete <ids...>')\n .description('Soft delete lessons (creates tombstone)')\n .option('--json', 'Output as JSON')\n .action(async (ids: string[], options: { json?: boolean }) => {\n await deleteAction(ids, options);\n });\n}\n","/**\n * Doctor command — verify external dependencies and project health.\n *\n * Usage: ca doctor\n */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { isModelAvailable } from '../memory/embeddings/index.js';\nimport { LESSONS_PATH } from '../memory/storage/index.js';\nimport {\n checkBeadsAvailable,\n checkUserScope,\n getClaudeSettingsPath,\n hasAllCompoundAgentHooks,\n readClaudeSettings,\n} from '../setup/index.js';\n\nexport interface DoctorCheck {\n name: string;\n status: 'pass' | 'fail' | 'warn';\n fix?: string;\n}\n\nfunction checkGitignoreHealth(repoRoot: string): boolean {\n const gitignorePath = join(repoRoot, '.gitignore');\n if (!existsSync(gitignorePath)) return false;\n try {\n const content = readFileSync(gitignorePath, 'utf-8');\n const lines = new Set(content.split('\\n').map(l => l.trim()));\n return ['node_modules/', '.claude/.cache/'].every(p => lines.has(p));\n } catch {\n return false;\n }\n}\n\n/**\n * Run all health checks and return results.\n */\nexport async function runDoctor(repoRoot: string): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n\n // 1. .claude/ directory\n const claudeDir = join(repoRoot, '.claude');\n checks.push(existsSync(claudeDir)\n ? { name: '.claude directory', status: 'pass' }\n : { name: '.claude directory', status: 'fail', fix: 'Run: npx ca setup' });\n\n // 2. Lessons index\n const lessonsPath = join(repoRoot, LESSONS_PATH);\n checks.push(existsSync(lessonsPath)\n ? { name: 'Lessons index', status: 'pass' }\n : { name: 'Lessons index', status: 'warn', fix: 'Run: npx ca setup' });\n\n // 3. Agent templates\n const agentsDir = join(repoRoot, '.claude', 'agents', 'compound');\n checks.push(existsSync(agentsDir)\n ? { name: 'Agent templates', status: 'pass' }\n : { name: 'Agent templates', status: 'fail', fix: 'Run: npx ca setup' });\n\n // 4. Workflow commands\n const commandsDir = join(repoRoot, '.claude', 'commands', 'compound');\n checks.push(existsSync(commandsDir)\n ? { name: 'Workflow commands', status: 'pass' }\n : { name: 'Workflow commands', status: 'fail', fix: 'Run: npx ca setup' });\n\n // 5. Hooks\n const settingsPath = getClaudeSettingsPath(false);\n let hooksOk = false;\n try {\n const settings = await readClaudeSettings(settingsPath);\n hooksOk = hasAllCompoundAgentHooks(settings);\n } catch {\n // settings.json may not exist\n }\n checks.push(hooksOk\n ? { name: 'Claude hooks', status: 'pass' }\n : { name: 'Claude hooks', status: 'fail', fix: 'Run: npx ca setup' });\n\n // 6. Embedding model\n let modelOk = false;\n try {\n modelOk = isModelAvailable();\n } catch {\n // model check may fail\n }\n checks.push(modelOk\n ? { name: 'Embedding model', status: 'pass' }\n : { name: 'Embedding model', status: 'warn', fix: 'Run: npx ca download-model' });\n\n // 7. Beads CLI available\n const beadsResult = checkBeadsAvailable();\n checks.push(beadsResult.available\n ? { name: 'Beads CLI', status: 'pass' }\n : { name: 'Beads CLI', status: 'warn', fix: 'Install beads: https://github.com/Nathandela/beads' });\n\n // 8. .gitignore health\n checks.push(checkGitignoreHealth(repoRoot)\n ? { name: '.gitignore health', status: 'pass' }\n : { name: '.gitignore health', status: 'warn', fix: 'Run: npx ca setup --update' });\n\n // 9. Usage documentation\n const docPath = join(repoRoot, 'docs', 'compound', 'README.md');\n checks.push(existsSync(docPath)\n ? { name: 'Usage documentation', status: 'pass' }\n : { name: 'Usage documentation', status: 'warn', fix: 'Run: npx ca setup' });\n\n // 10. Beads initialized\n const beadsDir = join(repoRoot, '.beads');\n checks.push(existsSync(beadsDir)\n ? { name: 'Beads initialized', status: 'pass' }\n : { name: 'Beads initialized', status: 'warn', fix: 'Run: bd init' });\n\n // 11. Beads healthy\n if (beadsResult.available && existsSync(beadsDir)) {\n try {\n execSync('bd doctor', { cwd: repoRoot, shell: '/bin/sh', stdio: 'pipe' });\n checks.push({ name: 'Beads healthy', status: 'pass' });\n } catch {\n checks.push({ name: 'Beads healthy', status: 'warn', fix: 'Run: bd doctor' });\n }\n }\n\n // 12. Codebase scope\n const scope = checkUserScope(repoRoot);\n checks.push(!scope.isUserScope\n ? { name: 'Codebase scope', status: 'pass' }\n : { name: 'Codebase scope', status: 'warn', fix: 'Install in a specific repository, not home directory' });\n\n return checks;\n}\n\nconst STATUS_ICONS: Record<string, string> = {\n pass: 'OK',\n fail: 'FAIL',\n warn: 'WARN',\n};\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command('doctor')\n .description('Verify external dependencies and project health')\n .action(async () => {\n const repoRoot = getRepoRoot();\n const checks = await runDoctor(repoRoot);\n\n console.log('Compound Agent Health Check:\\n');\n for (const check of checks) {\n const icon = STATUS_ICONS[check.status];\n const line = ` [${icon}] ${check.name}`;\n console.log(line);\n if (check.fix) {\n console.log(` Fix: ${check.fix}`);\n }\n }\n\n const failures = checks.filter(c => c.status === 'fail');\n const warnings = checks.filter(c => c.status === 'warn');\n console.log('');\n if (failures.length === 0 && warnings.length === 0) {\n console.log('All checks passed.');\n } else {\n if (failures.length > 0) console.log(`${failures.length} check(s) failed.`);\n if (warnings.length > 0) console.log(`${warnings.length} warning(s).`);\n }\n });\n}\n","/**\n * Invalidation commands: wrong, validate\n *\n * Commands for managing lesson validity state.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { appendMemoryItem, readMemoryItems } from '../memory/storage/index.js';\nimport type { MemoryItem } from '../memory/index.js';\n\nimport { formatError } from '../cli-error-format.js';\n\nimport { out } from './shared.js';\n\n/**\n * Register invalidation commands on the program.\n */\nexport function registerInvalidationCommands(program: Command): void {\n /**\n * Wrong command - Mark a lesson as invalid/wrong.\n *\n * Appends an invalidatedAt timestamp and optional reason to the lesson.\n * Invalidated lessons are excluded from retrieval but remain in storage.\n *\n * @example npx ca wrong L12345678\n * @example npx ca wrong L12345678 --reason \"This advice was incorrect\"\n */\n program\n .command('wrong <id>')\n .description('Mark a lesson as invalid/wrong')\n .option('-r, --reason <text>', 'Reason for invalidation')\n .action(async function (this: Command, id: string, options: { reason?: string }) {\n const repoRoot = getRepoRoot();\n\n // Read all lessons\n const { items } = await readMemoryItems(repoRoot);\n\n // Find the lesson\n const lesson = items.find((l) => l.id === id);\n if (!lesson) {\n console.error(formatError('wrong', 'NOT_FOUND', `Lesson not found: ${id}`, 'Use \"ca list\" to see available lessons'));\n process.exitCode = 1;\n return;\n }\n\n // Check if already invalidated\n if (lesson.invalidatedAt) {\n out.warn(`Lesson ${id} is already marked as invalid.`);\n return;\n }\n\n // Create updated lesson with invalidation\n const updatedItem: MemoryItem = {\n ...lesson,\n invalidatedAt: new Date().toISOString(),\n ...(options.reason !== undefined && { invalidationReason: options.reason }),\n };\n\n // Append the updated lesson (JSONL append-only pattern)\n await appendMemoryItem(repoRoot, updatedItem);\n out.success(`Lesson ${id} marked as invalid.`);\n if (options.reason) {\n console.log(` Reason: ${options.reason}`);\n }\n });\n\n /**\n * Validate command - Remove invalidation from a lesson.\n *\n * Re-enables a previously invalidated lesson for retrieval.\n *\n * @example npx ca validate L12345678\n */\n program\n .command('validate <id>')\n .description('Re-enable a previously invalidated lesson')\n .action(async function (this: Command, id: string) {\n const repoRoot = getRepoRoot();\n\n // Read all lessons\n const { items } = await readMemoryItems(repoRoot);\n\n // Find the lesson\n const lesson = items.find((l) => l.id === id);\n if (!lesson) {\n console.error(formatError('validate', 'NOT_FOUND', `Lesson not found: ${id}`, 'Use \"ca list\" to see available lessons'));\n process.exitCode = 1;\n return;\n }\n\n // Check if not invalidated\n if (!lesson.invalidatedAt) {\n out.info(`Lesson ${id} is not invalidated.`);\n return;\n }\n\n // Remove invalidation fields (keep everything else)\n const updatedItem: MemoryItem = {\n ...lesson,\n invalidatedAt: undefined,\n invalidationReason: undefined,\n };\n\n // Append the updated lesson (JSONL append-only pattern)\n await appendMemoryItem(repoRoot, updatedItem);\n out.success(`Lesson ${id} re-enabled (validated).`);\n });\n}\n","/**\n * I/O commands: export, import\n *\n * Commands for importing and exporting lessons.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { appendMemoryItem, readMemoryItems } from '../memory/storage/index.js';\nimport { MemoryItemSchema } from '../memory/index.js';\nimport type { MemoryItem } from '../memory/index.js';\n\nimport { formatError } from '../cli-error-format.js';\n\nimport { JSON_INDENT_SPACES } from './shared.js';\n\n// ============================================================================\n// Action Handlers\n// ============================================================================\n\nasync function exportAction(options: { since?: string; tags?: string }): Promise<void> {\n const repoRoot = getRepoRoot();\n\n const { items } = await readMemoryItems(repoRoot);\n\n let filtered = items;\n\n if (options.since) {\n const sinceDate = new Date(options.since);\n if (Number.isNaN(sinceDate.getTime())) {\n console.error(formatError('export', 'INVALID_DATE', `Invalid date format: ${options.since}`, 'Use ISO8601 format (e.g., 2024-01-15)'));\n process.exitCode = 1;\n return;\n }\n filtered = filtered.filter((item) => new Date(item.created) >= sinceDate);\n }\n\n if (options.tags) {\n const filterTags = options.tags.split(',').map((t) => t.trim());\n filtered = filtered.filter((item) => item.tags.some((tag) => filterTags.includes(tag)));\n }\n\n console.log(JSON.stringify(filtered, null, JSON_INDENT_SPACES));\n}\n\nasync function importAction(file: string): Promise<void> {\n const repoRoot = getRepoRoot();\n\n let content: string;\n try {\n content = await readFile(file, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n console.error(formatError('import', 'FILE_NOT_FOUND', `File not found: ${file}`, 'Check the path and try again'));\n } else {\n console.error(formatError('import', 'READ_ERROR', `Error reading file: ${(err as Error).message}`, 'Check file permissions'));\n }\n process.exitCode = 1;\n return;\n }\n\n const { items: existingItems } = await readMemoryItems(repoRoot);\n const existingIds = new Set(existingItems.map((item) => item.id));\n\n const lines = content.split('\\n');\n let imported = 0;\n let skipped = 0;\n let invalid = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n invalid++;\n continue;\n }\n\n const result = MemoryItemSchema.safeParse(parsed);\n if (!result.success) {\n invalid++;\n continue;\n }\n\n const item: MemoryItem = result.data;\n\n if (existingIds.has(item.id)) {\n skipped++;\n continue;\n }\n\n await appendMemoryItem(repoRoot, item);\n existingIds.add(item.id);\n imported++;\n }\n\n const lessonWord = imported === 1 ? 'lesson' : 'lessons';\n const parts: string[] = [];\n if (skipped > 0) parts.push(`${skipped} skipped`);\n if (invalid > 0) parts.push(`${invalid} invalid`);\n\n if (parts.length > 0) {\n console.log(`Imported ${imported} ${lessonWord} (${parts.join(', ')})`);\n } else {\n console.log(`Imported ${imported} ${lessonWord}`);\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register I/O commands on the program.\n */\nexport function registerIOCommands(program: Command): void {\n program\n .command('export')\n .description('Export lessons as JSON to stdout')\n .option('--since <date>', 'Only include lessons created after this date (ISO8601)')\n .option('--tags <tags>', 'Filter by tags (comma-separated, OR logic)')\n .action(async (options: { since?: string; tags?: string }) => {\n await exportAction(options);\n });\n\n program\n .command('import <file>')\n .description('Import lessons from a JSONL file')\n .action(async (file: string) => {\n await importAction(file);\n });\n}\n","/**\n * Maintenance commands: compact, rebuild, stats\n *\n * Commands for database health and maintenance.\n */\n\nimport { statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatBytes, getRepoRoot } from '../cli-utils.js';\nimport {\n compact,\n countTombstones,\n DB_PATH,\n getRetrievalStats,\n LESSONS_PATH,\n needsCompaction,\n readMemoryItems,\n rebuildIndex,\n syncIfNeeded,\n TOMBSTONE_THRESHOLD,\n} from '../memory/storage/index.js';\n\nimport {\n AGE_FLAG_THRESHOLD_DAYS,\n AVG_DECIMAL_PLACES,\n getLessonAgeDays,\n LESSON_COUNT_WARNING_THRESHOLD,\n out,\n} from './shared.js';\n\n// ============================================================================\n// Action Handlers\n// ============================================================================\n\nasync function compactAction(options: { force?: boolean; dryRun?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n\n const tombstones = await countTombstones(repoRoot);\n const needs = await needsCompaction(repoRoot);\n\n if (options.dryRun) {\n console.log('Dry run - no changes will be made.\\n');\n console.log(`Tombstones found: ${tombstones}`);\n console.log(`Compaction needed: ${needs ? 'yes' : 'no'}`);\n return;\n }\n\n if (!needs && !options.force) {\n console.log(`Compaction not needed (${tombstones} tombstones, threshold is ${TOMBSTONE_THRESHOLD}).`);\n console.log('Use --force to compact anyway.');\n return;\n }\n\n console.log('Running compaction...');\n const result = await compact(repoRoot);\n\n console.log('\\nCompaction complete:');\n console.log(` Archived: ${result.archived} lesson(s)`);\n console.log(` Tombstones removed: ${result.tombstonesRemoved}`);\n console.log(` Lessons remaining: ${result.lessonsRemaining}`);\n if (result.droppedInvalid > 0) {\n console.log(` Invalid records dropped: ${result.droppedInvalid}`);\n }\n\n await rebuildIndex(repoRoot);\n console.log(' Index rebuilt.');\n}\n\nasync function rebuildAction(options: { force?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n if (options.force) {\n console.log('Forcing index rebuild...');\n await rebuildIndex(repoRoot);\n console.log('Index rebuilt.');\n } else {\n const rebuilt = await syncIfNeeded(repoRoot);\n if (rebuilt) {\n console.log('Index rebuilt (JSONL changed).');\n } else {\n console.log('Index is up to date.');\n }\n }\n}\n\nasync function statsAction(): Promise<void> {\n const repoRoot = getRepoRoot();\n\n await syncIfNeeded(repoRoot);\n\n const { items } = await readMemoryItems(repoRoot);\n const deletedCount = await countTombstones(repoRoot);\n const totalLessons = items.length;\n\n const retrievalStats = getRetrievalStats(repoRoot);\n const totalRetrievals = retrievalStats.reduce((sum, s) => sum + s.count, 0);\n const avgRetrievals = totalLessons > 0 ? (totalRetrievals / totalLessons).toFixed(AVG_DECIMAL_PLACES) : '0.0';\n\n const jsonlPath = join(repoRoot, LESSONS_PATH);\n const dbPath = join(repoRoot, DB_PATH);\n\n let dataSize = 0;\n let indexSize = 0;\n\n try { dataSize = statSync(jsonlPath).size; } catch { /* File doesn't exist */ }\n try { indexSize = statSync(dbPath).size; } catch { /* File doesn't exist */ }\n\n const totalSize = dataSize + indexSize;\n\n let recentCount = 0;\n let mediumCount = 0;\n let oldCount = 0;\n for (const item of items) {\n const ageDays = getLessonAgeDays(item);\n if (ageDays < 30) {\n recentCount++;\n } else if (ageDays <= AGE_FLAG_THRESHOLD_DAYS) {\n mediumCount++;\n } else {\n oldCount++;\n }\n }\n\n const typeCounts: Record<string, number> = {};\n for (const item of items) {\n typeCounts[item.type] = (typeCounts[item.type] ?? 0) + 1;\n }\n\n const deletedInfo = deletedCount > 0 ? ` (${deletedCount} deleted)` : '';\n console.log(`Lessons: ${totalLessons} total${deletedInfo}`);\n\n if (Object.keys(typeCounts).length > 1 || (Object.keys(typeCounts).length === 1 && !typeCounts['lesson'])) {\n const breakdown = Object.entries(typeCounts)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([type, count]) => `${count} ${type}`)\n .join(', ');\n console.log(`Types: ${breakdown}`);\n }\n\n if (totalLessons > LESSON_COUNT_WARNING_THRESHOLD) {\n out.warn(`High lesson count may degrade retrieval quality. Consider running \\`ca compact\\`.`);\n }\n\n if (totalLessons > 0) {\n console.log(`Age: ${recentCount} <30d, ${mediumCount} 30-90d, ${oldCount} >90d`);\n }\n\n console.log(`Retrievals: ${totalRetrievals} total, ${avgRetrievals} avg per lesson`);\n console.log(`Storage: ${formatBytes(totalSize)} (index: ${formatBytes(indexSize)}, data: ${formatBytes(dataSize)})`);\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register maintenance commands on the program.\n */\nexport function registerMaintenanceCommands(program: Command): void {\n program\n .command('compact')\n .description('Compact lessons: archive old lessons and remove tombstones')\n .option('-f, --force', 'Run compaction even if below threshold')\n .option('--dry-run', 'Show what would be done without making changes')\n .action(async (options: { force?: boolean; dryRun?: boolean }) => {\n await compactAction(options);\n });\n\n program\n .command('rebuild')\n .description('Rebuild SQLite index from JSONL')\n .option('-f, --force', 'Force rebuild even if unchanged')\n .action(async (options: { force?: boolean }) => {\n await rebuildAction(options);\n });\n\n program\n .command('stats')\n .description('Show database health and statistics')\n .action(async () => {\n await statsAction();\n });\n}\n","/**\n * Prime command - Context recovery for Claude Code with Beads-style trust language.\n *\n * Generates trust language guidelines combined with high-severity lessons\n * for context recovery after compaction or session restart.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { loadSessionLessons } from '../memory/retrieval/index.js';\nimport { syncIfNeeded } from '../memory/storage/index.js';\nimport type { MemoryItem, Source } from '../memory/index.js';\nimport { getPhaseState } from './phase-check.js';\n/**\n * Beads-style trust language template.\n *\n * Uses explicit prohibitions, workflow sequencing, and NEVER/MUST language\n * following Beads conventions for maximum adherence.\n *\n * CLI-first: all lesson operations use `npx ca` commands.\n */\nconst TRUST_LANGUAGE_TEMPLATE = `# Compound Agent Active\n\n> **Context Recovery**: Run \\`npx ca prime\\` after compaction, clear, or new session\n\n## CLI Commands (ALWAYS USE THESE)\n\n**You MUST use CLI commands for lesson management:**\n\n| Command | Purpose |\n|---------|---------|\n| \\`npx ca search \"query\"\\` | Search lessons - call BEFORE architectural decisions |\n| \\`npx ca learn \"insight\"\\` | Capture lessons - call AFTER corrections or discoveries |\n\n## Core Constraints\n\n**Default**: Use CLI commands for lesson management\n**Prohibited**: NEVER edit .claude/lessons/ files directly\n\n**Default**: Propose lessons freely after corrections\n**Prohibited**: NEVER propose without quality gate (novel + specific; prefer actionable)\n\n## Retrieval Protocol\n\nYou MUST call \\`npx ca search\\` BEFORE:\n- Architectural decisions or complex planning\n- Implementing patterns you've done before in this repo\n\n**NEVER skip search for complex decisions.** Past mistakes will repeat.\n\n## Capture Protocol\n\nRun \\`npx ca learn\\` AFTER:\n- User corrects you (\"no\", \"wrong\", \"actually...\")\n- You self-correct after iteration failures\n- Test fails then you fix it\n\n**Quality gate** (must pass before capturing):\n- Novel (not already stored)\n- Specific (clear guidance)\n- Actionable (preferred, not mandatory)\n\n**Workflow**: Search BEFORE deciding, capture AFTER learning.\n`;\n\n/**\n * Format lesson source for human-readable display.\n */\nfunction formatSource(source: Source): string {\n switch (source) {\n case 'user_correction':\n return 'user correction';\n case 'self_correction':\n return 'self correction';\n case 'test_failure':\n return 'test failure';\n case 'manual':\n return 'manual';\n default:\n return source;\n }\n}\n\n/**\n * Format a single lesson for the Emergency Recall section.\n *\n * Format: - **{insight}** ({tags})\n * Learned: {date} via {source}\n */\nfunction formatLessonForPrime(lesson: MemoryItem): string {\n const date = lesson.created.slice(0, 10); // YYYY-MM-DD\n const tags = lesson.tags.length > 0 ? ` (${lesson.tags.join(', ')})` : '';\n const source = formatSource(lesson.source);\n return `- **${lesson.insight}**${tags}\\n Learned: ${date} via ${source}`;\n}\n\nfunction formatActiveLfgSection(repoRoot: string): string | null {\n const state = getPhaseState(repoRoot);\n if (state === null || !state.lfg_active) return null;\n\n const skillsRead = state.skills_read.length === 0 ? '(none)' : state.skills_read.join(', ');\n const gatesPassed = state.gates_passed.length === 0 ? '(none)' : state.gates_passed.join(', ');\n\n return `\n---\n\n# ACTIVE LFG SESSION\n\nEpic: ${state.epic_id}\nPhase: ${state.current_phase} (${state.phase_index}/5)\nSkills read: ${skillsRead}\nGates passed: ${gatesPassed}\nStarted: ${state.started_at}\n\nResume from phase ${state.current_phase}. Run: \\`npx ca phase-check start ${state.current_phase}\\`\nRead the skill file first: \\`.claude/skills/compound/${state.current_phase}/SKILL.md\\`\n`;\n}\n\n/**\n * Generate prime context output for Claude Code.\n *\n * Combines Beads-style trust language guidelines with high-severity lessons\n * for context recovery after compaction or session restart.\n *\n * @param repoRoot - Repository root directory (defaults to getRepoRoot())\n * @returns Formatted markdown string (< 2K tokens)\n */\nexport async function getPrimeContext(repoRoot?: string): Promise<string> {\n const root = repoRoot ?? getRepoRoot();\n\n // Sync SQLite index before loading — ensures searches have fresh data\n // after git pull or external JSONL changes.\n try {\n await syncIfNeeded(root);\n } catch {\n // Non-fatal: prime still works from JSONL even if SQLite sync fails\n }\n\n // Load high-severity lessons (top 5, sorted by recency)\n const lessons = await loadSessionLessons(root, 5);\n\n // Build output: trust language first\n let output = TRUST_LANGUAGE_TEMPLATE;\n\n // Add Emergency Recall section if we have high-severity lessons\n if (lessons.length > 0) {\n const formattedLessons = lessons.map(formatLessonForPrime).join('\\n\\n');\n output += `\n---\n\n# [CRITICAL] Mandatory Recall\n\nCritical lessons from past corrections:\n\n${formattedLessons}\n`;\n }\n\n const lfgSection = formatActiveLfgSection(root);\n if (lfgSection !== null) {\n output += lfgSection;\n }\n\n return output;\n}\n\n/**\n * Register prime command on the program.\n */\nexport function registerPrimeCommand(program: Command): void {\n /**\n * Prime command - Output context recovery for Claude Code.\n *\n * Combines Beads-style trust language guidelines with high-severity lessons.\n * Used after compaction or context loss to remind Claude of the\n * compound-agent workflow, rules, and commands.\n *\n * @example npx ca prime\n */\n program\n .command('prime')\n .description('Output context for Claude Code (guidelines + top lessons)')\n .action(async () => {\n const output = await getPrimeContext();\n console.log(output);\n });\n}\n","/**\n * Audit command: ca audit\n *\n * Runs all audit checks and outputs findings.\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { formatError } from '../cli-error-format.js';\nimport { runAudit } from '../audit/index.js';\nimport type { AuditFinding } from '../audit/index.js';\n\nimport { getGlobalOpts } from './shared.js';\n\nconst JSON_INDENT = 2;\n\n/**\n * Format a single finding as a human-readable line.\n */\nfunction formatFinding(finding: AuditFinding): string {\n const label = finding.severity.toUpperCase();\n const filePart = finding.file ? ` ${finding.file}` : '';\n return `${label} [${finding.source}]${filePart} -- ${finding.issue}`;\n}\n\n/**\n * Register the audit command on the program.\n */\nexport function registerAuditCommands(program: Command): void {\n program\n .command('audit')\n .description('Run audit checks against the codebase')\n .option('--json', 'Output as JSON')\n .option('--no-rules', 'Skip rule checks')\n .option('--no-patterns', 'Skip pattern checks')\n .option('--no-lessons', 'Skip lesson checks')\n .action(async function (this: Command) {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(this);\n const opts = this.opts<{ json?: boolean; rules: boolean; patterns: boolean; lessons: boolean }>();\n\n let report;\n try {\n report = await runAudit(repoRoot, {\n includeRules: opts.rules,\n includePatterns: opts.patterns,\n includeLessons: opts.lessons,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Audit failed';\n console.error(formatError('audit', 'AUDIT_ERROR', msg, 'Check repo configuration'));\n process.exitCode = 1;\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(report, null, JSON_INDENT));\n } else {\n for (const finding of report.findings) {\n const line = formatFinding(finding);\n switch (finding.severity) {\n case 'error':\n console.log(chalk.red(line));\n break;\n case 'warning':\n console.log(chalk.yellow(line));\n break;\n default:\n console.log(chalk.blue(line));\n break;\n }\n }\n\n if (!quiet) {\n console.log('');\n console.log(\n `Audit: ${report.findings.length} finding(s), ` +\n `${report.summary.errors} error(s), ` +\n `${report.summary.warnings} warning(s), ` +\n `${report.summary.infos} info(s)`\n );\n }\n }\n\n if (report.summary.errors > 0) {\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Configuration for compound-agent.\n * Stored in .claude/compound-agent.json (user-editable, not overwritten by setup --update).\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\n/** Config filename within .claude/ */\nexport const CONFIG_FILENAME = 'compound-agent.json';\n\n/** Valid external reviewer tool names. */\nexport const VALID_REVIEWERS = ['gemini', 'codex'] as const;\nexport type ReviewerName = (typeof VALID_REVIEWERS)[number];\n\n/** Shape of .claude/compound-agent.json */\nexport interface CompoundAgentConfig {\n externalReviewers?: string[];\n}\n\nfunction configPath(repoRoot: string): string {\n return join(repoRoot, '.claude', CONFIG_FILENAME);\n}\n\n/**\n * Read config from .claude/compound-agent.json.\n * Returns empty object if file doesn't exist or is malformed.\n */\nexport async function readConfig(repoRoot: string): Promise<CompoundAgentConfig> {\n const path = configPath(repoRoot);\n if (!existsSync(path)) return {};\n try {\n const parsed = JSON.parse(await readFile(path, 'utf-8'));\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return {};\n return parsed;\n } catch {\n return {};\n }\n}\n\n/**\n * Write config to .claude/compound-agent.json.\n */\nexport async function writeConfig(repoRoot: string, config: CompoundAgentConfig): Promise<void> {\n await mkdir(join(repoRoot, '.claude'), { recursive: true });\n await writeFile(configPath(repoRoot), JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Get the list of enabled external reviewers, filtering out invalid names.\n */\n/**\n * Safely extract the externalReviewers array from config, handling malformed values.\n */\nfunction safeReviewerArray(config: CompoundAgentConfig): string[] {\n const raw = config.externalReviewers;\n if (!Array.isArray(raw)) return [];\n return raw;\n}\n\nexport async function getExternalReviewers(repoRoot: string): Promise<ReviewerName[]> {\n const config = await readConfig(repoRoot);\n return safeReviewerArray(config).filter((r): r is ReviewerName => (VALID_REVIEWERS as readonly string[]).includes(r));\n}\n\n/**\n * Enable an external reviewer. Returns true if it was added, false if already enabled.\n */\nexport async function enableReviewer(repoRoot: string, name: string): Promise<boolean> {\n if (!(VALID_REVIEWERS as readonly string[]).includes(name)) {\n throw new Error(`Invalid reviewer: ${name}. Valid options: ${VALID_REVIEWERS.join(', ')}`);\n }\n const config = await readConfig(repoRoot);\n const reviewers = safeReviewerArray(config);\n if (reviewers.includes(name)) return false;\n config.externalReviewers = [...reviewers, name];\n await writeConfig(repoRoot, config);\n return true;\n}\n\n/**\n * Disable an external reviewer. Returns true if it was removed, false if not enabled.\n */\nexport async function disableReviewer(repoRoot: string, name: string): Promise<boolean> {\n const config = await readConfig(repoRoot);\n const reviewers = safeReviewerArray(config);\n if (!reviewers.includes(name)) return false;\n config.externalReviewers = reviewers.filter(r => r !== name);\n await writeConfig(repoRoot, config);\n return true;\n}\n","/**\n * CLI command for managing external reviewers.\n *\n * Usage:\n * ca reviewer enable gemini\n * ca reviewer disable codex\n * ca reviewer list\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport {\n enableReviewer,\n disableReviewer,\n getExternalReviewers,\n VALID_REVIEWERS,\n} from '../config/index.js';\n\nexport function registerReviewerCommand(program: Command): void {\n const reviewer = program\n .command('reviewer')\n .description('Manage external code reviewers (gemini, codex)');\n\n reviewer\n .command('enable <name>')\n .description(`Enable an external reviewer (${VALID_REVIEWERS.join(', ')})`)\n .action(async (name: string) => {\n const repoRoot = getRepoRoot();\n try {\n const added = await enableReviewer(repoRoot, name);\n if (added) {\n console.log(`Enabled external reviewer: ${name}`);\n } else {\n console.log(`${name} is already enabled`);\n }\n } catch (err) {\n console.error((err as Error).message);\n process.exitCode = 1;\n }\n });\n\n reviewer\n .command('disable <name>')\n .description('Disable an external reviewer')\n .action(async (name: string) => {\n try {\n const repoRoot = getRepoRoot();\n const removed = await disableReviewer(repoRoot, name);\n if (removed) {\n console.log(`Disabled external reviewer: ${name}`);\n } else {\n console.log(`${name} is not enabled`);\n }\n } catch (err) {\n console.error((err as Error).message);\n process.exitCode = 1;\n }\n });\n\n reviewer\n .command('list')\n .description('List enabled external reviewers')\n .action(async () => {\n try {\n const repoRoot = getRepoRoot();\n const reviewers = await getExternalReviewers(repoRoot);\n if (reviewers.length === 0) {\n console.log('No external reviewers enabled');\n console.log(`Available: ${VALID_REVIEWERS.join(', ')}`);\n console.log('Enable with: ca reviewer enable <name>');\n } else {\n console.log('Enabled external reviewers:');\n for (const r of reviewers) {\n console.log(` - ${r}`);\n }\n }\n } catch (err) {\n console.error((err as Error).message);\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Rules command: rules check\n *\n * Runs repository-defined rules from .claude/rules.json and outputs\n * agent-legible violation messages.\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { formatError } from '../cli-error-format.js';\nimport { formatViolation, loadRuleConfig, runRules } from '../rules/index.js';\n\nimport { getGlobalOpts, out } from './shared.js';\n\n/**\n * Register the rules command group on the program.\n */\nexport function registerRulesCommands(program: Command): void {\n const rulesCmd = program\n .command('rules')\n .description('Run repository-defined rule checks');\n\n rulesCmd\n .command('check')\n .description('Check codebase against rules in .claude/rules.json')\n .action(function (this: Command) {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(this);\n\n let config;\n try {\n config = loadRuleConfig(repoRoot);\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Failed to load rules config';\n console.error(formatError('rules', 'CONFIG_ERROR', msg, 'Check .claude/rules.json syntax'));\n process.exitCode = 1;\n return;\n }\n\n if (config.rules.length === 0) {\n if (!quiet) {\n out.info('No rules defined. Create .claude/rules.json to add rules.');\n }\n return;\n }\n\n const results = runRules(repoRoot, config.rules);\n\n // Print violations\n for (const result of results) {\n for (const violation of result.violations) {\n const line = formatViolation(result.rule, violation);\n switch (result.rule.severity) {\n case 'error':\n console.log(chalk.red(line));\n break;\n case 'warning':\n console.log(chalk.yellow(line));\n break;\n default:\n console.log(chalk.blue(line));\n break;\n }\n }\n }\n\n // Summary\n const total = results.length;\n const errors = results.filter((r) => !r.passed && r.rule.severity === 'error').length;\n const warnings = results.filter((r) => !r.passed && r.rule.severity === 'warning').length;\n const passed = results.filter((r) => r.passed).length;\n\n console.log('');\n console.log(`Rules: ${total} checked, ${errors} error(s), ${warnings} warning(s), ${passed} passed`);\n\n if (errors > 0) {\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Test summary command: runs tests and outputs a compact summary.\n *\n * Parses Vitest output to extract pass/fail/skip counts, duration,\n * and failing test names + error messages.\n */\n\nimport { execSync } from 'node:child_process';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A single test failure with name and error message. */\nexport interface TestFailure {\n name: string;\n error: string;\n}\n\n/** Parsed summary of a Vitest run. */\nexport interface TestSummary {\n passed: number;\n failed: number;\n skipped: number;\n total: number;\n duration: string;\n failures: TestFailure[];\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Max lines to capture from a failure body. */\nconst MAX_ERROR_BODY_LINES = 10;\n\n/** Default log file path relative to repo root. */\nconst LOG_REL_PATH = '.claude/.cache/last-test-run.log';\n\n// ============================================================================\n// Parser\n// ============================================================================\n\n/**\n * Parse Vitest output into a structured summary.\n *\n * @param output - Raw Vitest stdout/stderr output\n * @returns Parsed test summary\n */\nexport function parseVitestOutput(output: string): TestSummary {\n const summary: TestSummary = {\n passed: 0,\n failed: 0,\n skipped: 0,\n total: 0,\n duration: 'unknown',\n failures: [],\n };\n\n if (!output.trim()) return summary;\n\n // Parse the summary line: \"Tests 3 failed | 17 passed (20)\" or \"Tests 65 passed (65)\"\n const testsLine = output.match(/Tests\\s+(.+)\\((\\d+)\\)/);\n if (testsLine) {\n summary.total = parseInt(testsLine[2]!, 10);\n const parts = testsLine[1]!;\n\n const failedMatch = parts.match(/(\\d+)\\s+failed/);\n if (failedMatch) summary.failed = parseInt(failedMatch[1]!, 10);\n\n const passedMatch = parts.match(/(\\d+)\\s+passed/);\n if (passedMatch) summary.passed = parseInt(passedMatch[1]!, 10);\n\n const skippedMatch = parts.match(/(\\d+)\\s+skipped/);\n if (skippedMatch) summary.skipped = parseInt(skippedMatch[1]!, 10);\n }\n\n // Parse duration: \"Duration 1.23s\" or \"Duration 142ms\"\n const durationMatch = output.match(/Duration\\s+([\\d.]+(?:ms|s))/);\n if (durationMatch) {\n summary.duration = durationMatch[1]!;\n }\n\n // Parse individual FAIL blocks with multiline body\n const lines = output.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const failMatch = lines[i]!.match(/^ FAIL\\s+(.+?)(?:\\s+\\[.*?\\])?$/);\n if (!failMatch) continue;\n\n const name = failMatch[1]!.trim();\n const bodyLines: string[] = [];\n\n // Collect up to MAX_ERROR_BODY_LINES of the failure body\n for (let j = i + 1; j < lines.length && bodyLines.length < MAX_ERROR_BODY_LINES; j++) {\n const line = lines[j]!;\n // Stop at location lines or section separators\n if (line.trimStart().startsWith('\\u276F') || line.match(/^⎯/)) break;\n // Stop at next FAIL block\n if (line.match(/^ FAIL\\s+/)) break;\n // Skip blank lines at the start\n if (bodyLines.length === 0 && line.trim() === '') continue;\n bodyLines.push(line);\n }\n\n // Trim trailing blank lines\n while (bodyLines.length > 0 && bodyLines[bodyLines.length - 1]!.trim() === '') {\n bodyLines.pop();\n }\n\n if (bodyLines.length === 0) continue;\n\n summary.failures.push({ name, error: bodyLines.join('\\n').trim() });\n }\n\n return summary;\n}\n\n/**\n * Format a TestSummary into a compact string for CLI output.\n *\n * @param summary - Parsed test summary\n * @param logPath - Path to the full log file\n * @returns Formatted summary string\n */\nexport function formatTestSummary(summary: TestSummary, logPath: string): string {\n const lines: string[] = [];\n\n lines.push(\n `TESTS: ${summary.passed} passed, ${summary.failed} failed, ${summary.skipped} skipped (${summary.duration})`\n );\n\n if (summary.failures.length > 0) {\n const first = summary.failures[0]!;\n lines.push(`FAIL ${first.name}`);\n lines.push(` ${first.error}`);\n if (summary.failures.length > 1) {\n lines.push(` ... and ${summary.failures.length - 1} more failure(s)`);\n }\n }\n\n lines.push(`LOG: Full output at ${logPath}`);\n\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register the test-summary command on the program.\n */\nexport function registerTestSummaryCommand(program: Command): void {\n program\n .command('test-summary')\n .description('Run tests and output a compact summary')\n .option('--fast', 'Run pnpm test:fast instead of pnpm test')\n .option('--cmd <command>', 'Custom test command to run')\n .action((options: { fast?: boolean; cmd?: string }) => {\n const repoRoot = getRepoRoot();\n\n // Determine test command\n let testCmd = 'pnpm test';\n if (options.cmd) {\n testCmd = options.cmd;\n } else if (options.fast) {\n testCmd = 'pnpm test:fast';\n }\n\n // Run test command, capture output\n let output: string;\n let exitCode: number;\n try {\n output = execSync(testCmd, {\n cwd: repoRoot,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n // Merge stderr into stdout for Vitest (it writes to both)\n env: { ...process.env, FORCE_COLOR: '0' },\n });\n exitCode = 0;\n } catch (err) {\n const execErr = err as { stdout?: string; stderr?: string; status?: number };\n output = (execErr.stdout ?? '') + '\\n' + (execErr.stderr ?? '');\n exitCode = execErr.status ?? 1;\n }\n\n // Write full output to log file\n const logPath = join(repoRoot, LOG_REL_PATH);\n mkdirSync(dirname(logPath), { recursive: true });\n writeFileSync(logPath, output, 'utf-8');\n\n // Parse and format summary\n const summary = parseVitestOutput(output);\n console.log(formatTestSummary(summary, logPath));\n\n process.exit(exitCode);\n });\n}\n","/**\n * Verify-gates command — check workflow gates before epic closure.\n *\n * Usage: ca verify-gates <epic-id>\n */\n\nimport { execFileSync } from 'node:child_process';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseBdShowDeps, validateEpicId } from '../cli-utils.js';\nimport { cleanPhaseState, getPhaseState } from './phase-check.js';\n\nexport interface GateCheck {\n name: string;\n status: 'pass' | 'fail';\n detail?: string;\n}\n\ninterface DepTask {\n closed: boolean;\n title: string;\n}\n\ninterface VerifyGatesOptions {\n repoRoot?: string;\n}\n\n/**\n * Parse dependencies from `bd show --json` output into DepTask format.\n */\nfunction parseDepsJson(raw: string): DepTask[] {\n return parseBdShowDeps(raw).map(d => ({ closed: d.status === 'closed', title: d.title }));\n}\n\n/**\n * Fallback: parse the DEPENDS ON section from `bd show` text output.\n */\nfunction parseDepsText(output: string): DepTask[] {\n const deps: DepTask[] = [];\n const lines = output.split('\\n');\n let inDeps = false;\n\n for (const line of lines) {\n if (line.trim() === 'DEPENDS ON') {\n inDeps = true;\n continue;\n }\n if (inDeps) {\n const match = line.match(\n /^\\s+→\\s+(✓|○)\\s+\\S+-\\S+:\\s+(.+?)\\s+●/,\n );\n if (match && match[1] && match[2]) {\n deps.push({ closed: match[1] === '✓', title: match[2] });\n } else if (line.trim() !== '' && !line.startsWith(' ')) {\n break;\n }\n }\n }\n\n return deps;\n}\n\n/**\n * Check a single gate: find a dep whose title starts with the given prefix.\n */\nfunction checkGate(\n deps: DepTask[],\n prefix: string,\n gateName: string,\n): GateCheck {\n const task = deps.find(d => d.title.startsWith(prefix));\n\n if (!task) {\n return { name: gateName, status: 'fail', detail: `No ${gateName.toLowerCase()} found (missing)` };\n }\n if (!task.closed) {\n return { name: gateName, status: 'fail', detail: `${gateName} exists but is not closed` };\n }\n return { name: gateName, status: 'pass' };\n}\n\nexport async function runVerifyGates(\n epicId: string,\n options: VerifyGatesOptions = {}\n): Promise<GateCheck[]> {\n validateEpicId(epicId);\n\n const repoRoot = options.repoRoot ?? getRepoRoot();\n const raw = execFileSync('bd', ['show', epicId, '--json'], { encoding: 'utf-8' });\n\n let deps: DepTask[];\n try {\n deps = parseDepsJson(raw);\n } catch {\n // Fallback to text parsing if --json output is not valid JSON\n const textRaw = execFileSync('bd', ['show', epicId], { encoding: 'utf-8' });\n deps = parseDepsText(textRaw);\n }\n\n const checks = [\n checkGate(deps, 'Review:', 'Review task'),\n checkGate(deps, 'Compound:', 'Compound task'),\n ];\n\n const mergeTask = deps.find(d => d.title.startsWith('Merge:'));\n if (mergeTask) {\n checks.push(checkGate(deps, 'Merge:', 'Merge task'));\n }\n\n const allPassed = checks.every((check) => check.status === 'pass');\n if (allPassed) {\n const state = getPhaseState(repoRoot);\n if (state !== null && state.lfg_active && state.gates_passed.includes('final')) {\n cleanPhaseState(repoRoot);\n }\n }\n\n return checks;\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n pass: 'PASS',\n fail: 'FAIL',\n};\n\nexport function registerVerifyGatesCommand(program: Command): void {\n program\n .command('verify-gates <epic-id>')\n .description('Verify workflow gates are satisfied before epic closure')\n .action(async (epicId: string) => {\n try {\n const checks = await runVerifyGates(epicId, { repoRoot: getRepoRoot() });\n\n console.log(`Gate checks for epic ${epicId}:\\n`);\n for (const check of checks) {\n const label = STATUS_LABEL[check.status];\n console.log(` [${label}] ${check.name}`);\n if (check.detail) {\n console.log(` ${check.detail}`);\n }\n }\n\n const failures = checks.filter(c => c.status === 'fail');\n console.log('');\n if (failures.length === 0) {\n console.log('All gates passed.');\n } else {\n console.log(`${failures.length} gate(s) failed.`);\n process.exitCode = 1;\n }\n } catch (err) {\n console.error(\n `Error: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Auto-generated changelog data — do not edit.\n * Generated by scripts/extract-changelog.ts\n */\n\nexport const CHANGELOG_RECENT: string = `## [1.3.2] - 2026-02-21\n\n### Added\n\n- **Banner audio**: Pure TypeScript WAV synthesis plays a rising pentatonic melody during the tendril animation. Cross-platform: \\`afplay\\` (macOS), \\`aplay\\` (Linux), PowerShell (Windows). Silently skips if player unavailable. Zero dependencies.\n- **Test coverage**: 19 new tests for \\`ca about\\` command, changelog extraction/escaping, and \\`--update\\` doc migration path\n\n### Fixed\n\n- **\\`setup --update\\` doc migration**: \\`--update\\` now installs the 5 split docs before removing legacy \\`HOW_TO_COMPOUND.md\\`, preventing empty \\`docs/compound/\\`\n- **Fresh checkout type-check**: \\`src/changelog-data.ts\\` tracked in git so \\`tsc --noEmit\\` passes without a prior build\n- **Trailing status text**: Banner animation no longer leaves \"al tendrils...\" remnant from previous phase\n\n### Changed\n\n- **\\`ca about\\` command**: Renamed from \\`ca version-show\\` for brevity\n- **Changelog extraction**: Core parsing/escaping logic extracted to \\`scripts/changelog-utils.ts\\` (shared between prebuild script and tests)\n- **Narrowed \\`.gitignore\\`**: Setup-generated patterns scoped to \\`compound/\\` subdirectories to avoid hiding tracked TDD agent definitions\n\n## [1.3.1] - 2026-02-21\n\n### Added\n\n- **\\`ca about\\` command**: Displays version with terminal animation (tendril growth) and recent changelog entries. Non-TTY environments get plain text output. Changelog is embedded at build time from CHANGELOG.md.\n- **3 new doctor checks**: Beads initialized (\\`.beads/\\` dir), beads healthy (\\`bd doctor\\`), codebase scope (user-scope detection)\n- **Beads + scope status in init/setup output**: Full beads health display (CLI available, initialized, healthy) and scope status shown after \\`ca init\\`, \\`ca setup\\`, and \\`ca setup --update\\`\n- **Banner on \\`--update\\`**: Terminal art animation now plays during \\`ca setup --update\\` and \\`ca init --update\\` (same TTY/quiet guards as fresh install)\n\n### Changed\n\n- **Split documentation**: \\`HOW_TO_COMPOUND.md\\` replaced by 5 focused documents in \\`docs/compound/\\`: \\`README.md\\`, \\`WORKFLOW.md\\`, \\`CLI_REFERENCE.md\\`, \\`SKILLS.md\\`, \\`INTEGRATION.md\\`\n- **Test-cleaner Phase 3 strengthened**: Adversarial review phase now mandates iteration loop until both reviewers give unconditional approval. Heading, emphasis, and quality criteria updated.\n- **Update hint on upgrade**: When \\`ca init\\` or \\`ca setup\\` detects an existing install, displays tip to run with \\`--update\\` to regenerate managed files\n- **HOW_TO_COMPOUND.md migration**: \\`ca setup --update\\` automatically removes old monolithic \\`HOW_TO_COMPOUND.md\\` if it has version frontmatter (generated by compound-agent)\n- **Doctor doc check**: Now checks for \\`docs/compound/README.md\\` instead of \\`HOW_TO_COMPOUND.md\\`\n\n## [1.3.0] - 2026-02-21\n\n### Added\n\n- **Setup hardening**: Four new pre-flight checks during \\`ca init\\` and \\`ca setup\\`:\n - **Beads CLI check** (\\`beads-check.ts\\`): Detects if \\`bd\\` is available, shows install URL if missing (informational, non-blocking)\n - **User-scope detection** (\\`scope-check.ts\\`): Warns when installing at home directory level where lessons are shared across projects\n - **.gitignore injection** (\\`gitignore.ts\\`): Ensures \\`node_modules/\\` and \\`.claude/.cache/\\` patterns exist in \\`.gitignore\\`\n - **Upgrade detection** (\\`upgrade.ts\\`): Detects existing installs and runs migration pipeline (deprecated command removal, header stripping, doc version update)\n- **Upgrade engine**: Automated migration from v1.2.x to v1.3.0:\n - Removes 5 deprecated CLI wrapper commands (\\`search.md\\`, \\`list.md\\`, \\`show.md\\`, \\`stats.md\\`, \\`wrong.md\\`)\n - Strips legacy \\`<!-- generated by compound-agent -->\\` headers from installed files\n - Updates \\`HOW_TO_COMPOUND.md\\` version during upgrade\n- **\\`/compound:research\\` skill**: PhD-depth research producing structured survey documents following \\`TEMPLATE_FOR_RESEARCH.md\\` format\n- **\\`/compound:test-clean\\` skill**: 5-phase test suite optimization with adversarial review (audit, design, implement, verify, report)\n- **Documentation template**: \\`HOW_TO_COMPOUND.md\\` deployed to \\`docs/compound/\\` during setup with version and date placeholders\n- **Test scripts**: \\`test:segment\\` (run tests for specific module), \\`test:random\\` (seeded random subset), \\`test:critical\\` (*.critical.test.ts convention)\n- **3 new doctor checks**: Beads CLI availability, \\`.gitignore\\` health, usage documentation presence\n\n### Fixed\n\n- **\\`setup --update --dry-run\\` no longer mutates files**: \\`runUpgrade()\\` now accepts a \\`dryRun\\` parameter propagated to all sub-functions (removeDeprecatedCommands, stripGeneratedHeaders, upgradeDocVersion)\n- **\\`setup --uninstall\\` respects plugin.json ownership**: Checks \\`name === \"compound-agent\"\\` before deleting; user-owned plugin manifests are preserved\n- **Upgrade ownership guard**: \\`removeDeprecatedCommands\\` checks file content for compound-agent markers before deleting, preventing silent removal of user-authored files with the same name\n- **Malformed settings.json no longer silently clobbered**: On parse error, \\`configureClaudeSettings\\` warns and skips instead of overwriting with empty config\n\n### Changed\n\n- **\\`setup --update\\` overhaul**: Now uses path-based file detection (compound/ = managed) instead of marker-based. Runs upgrade pipeline and \\`.gitignore\\` remediation during update\n- **JSON-first \\`bd\\` parsing in loop**: \\`jq\\` primary with \\`python3\\` fallback via \\`parse_json()\\` helper\n- **CLI test helpers hardened**: Replaced shell string interpolation with \\`execFileSync\\` for safety and reliability\n- **Beads check portable**: Uses POSIX \\`command -v\\` instead of non-portable \\`which\\`\n- **Template expansion**: Brainstorm and plan skills now cross-reference researcher skill; 9 total skills, 11 total commands\n- **Code organization**: Extracted display utilities to \\`display-utils.ts\\`, uninstall logic to \\`uninstall.ts\\`\n\n### Removed\n\n- **5 deprecated CLI wrapper commands**: \\`search.md\\`, \\`list.md\\`, \\`show.md\\`, \\`stats.md\\`, \\`wrong.md\\` (redundant wrappers around \\`npx ca <cmd>\\`)\n- **\\`GENERATED_MARKER\\` on new installs**: New installs use path-based detection; marker retained only for backward-compatible \\`--update\\` detection`;\n","/**\n * About command — display version with banner animation and recent changelog.\n *\n * Usage: ca about\n */\n\nimport type { Command } from 'commander';\n\nimport { VERSION } from '../version.js';\nimport { CHANGELOG_RECENT } from '../changelog-data.js';\nimport { playInstallBanner } from '../setup/index.js';\n\nexport function registerAboutCommand(program: Command): void {\n program\n .command('about')\n .description('Show version, animation, and recent changelog')\n .action(async () => {\n if (process.stdout.isTTY) {\n await playInstallBanner();\n } else {\n console.log(`compound-agent v${VERSION}`);\n }\n console.log('');\n console.log(CHANGELOG_RECENT);\n });\n}\n","/**\n * Worktree commands — manage git worktrees for parallel epic execution.\n *\n * Subcommands: create, wire-deps, merge, list, cleanup\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync, copyFileSync, mkdirSync } from 'node:fs';\nimport path from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseBdShowDeps, shortId, validateEpicId } from '../cli-utils.js';\n\n/** Parse worktree entries from `git worktree list --porcelain` output. */\nfunction parseWorktreeList(raw: string): Array<{ path: string; branch: string }> {\n const entries: Array<{ path: string; branch: string }> = [];\n let currentPath = '';\n for (const line of raw.split('\\n')) {\n if (line.startsWith('worktree ')) {\n currentPath = line.slice('worktree '.length);\n } else if (line.startsWith('branch ')) {\n const branch = line.slice('branch refs/heads/'.length);\n entries.push({ path: currentPath, branch });\n }\n }\n return entries;\n}\n\n// ============================================================================\n// worktree create\n// ============================================================================\n\nexport interface WorktreeCreateResult {\n worktreePath: string;\n branch: string;\n mergeTaskId: string;\n alreadyExists: boolean;\n}\n\nexport function runWorktreeCreate(epicId: string): WorktreeCreateResult {\n validateEpicId(epicId);\n\n const repoRoot = getRepoRoot();\n const basename = path.basename(repoRoot);\n const worktreePath = path.resolve(repoRoot, '..', `${basename}-wt-${epicId}`);\n const branch = `epic/${epicId}`;\n\n // Idempotency: check if worktree already exists\n const listRaw = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf-8' });\n const existing = parseWorktreeList(listRaw);\n if (existing.some(e => e.path === worktreePath || e.branch === branch)) {\n return { worktreePath, branch, mergeTaskId: '', alreadyExists: true };\n }\n\n // Create worktree\n execFileSync('git', ['worktree', 'add', worktreePath, '-b', branch], { encoding: 'utf-8' });\n\n // Install deps\n execFileSync('pnpm', ['install', '--frozen-lockfile'], { cwd: worktreePath, encoding: 'utf-8' });\n\n // Copy lessons JSONL\n const srcJsonl = path.join(repoRoot, '.claude', 'lessons', 'index.jsonl');\n const dstDir = path.join(worktreePath, '.claude', 'lessons');\n const dstJsonl = path.join(dstDir, 'index.jsonl');\n if (existsSync(srcJsonl)) {\n mkdirSync(dstDir, { recursive: true });\n copyFileSync(srcJsonl, dstJsonl);\n }\n\n // Run setup (pnpm exec guarantees the local installed binary)\n execFileSync('pnpm', ['exec', 'ca', 'setup', '--skip-model'], { cwd: worktreePath, encoding: 'utf-8' });\n\n // Create Merge task\n const mergeTitle = `Merge: merge ${branch} to main`;\n const mergeDesc = `INSTRUCTIONS: This task merges the worktree branch back to main. Worktree path: ${worktreePath}. Run \\`pnpm exec ca worktree merge ${epicId}\\` when all other blocking tasks are resolved.`;\n const bdOutput = execFileSync('bd', [\n 'create',\n `--title=${mergeTitle}`,\n '--type=task',\n '--priority=1',\n `--description=${mergeDesc}`,\n ], { encoding: 'utf-8' });\n\n // Parse merge task ID from bd output (e.g., \"Created learning_agent-m001\")\n const idMatch = bdOutput.match(/(\\S+)$/);\n const mergeFullId = idMatch?.[1] ?? '';\n if (!mergeFullId) {\n throw new Error('bd create returned no task ID');\n }\n const mergeTaskId = shortId(mergeFullId);\n\n // Wire dep: epic depends on merge\n execFileSync('bd', ['dep', 'add', epicId, mergeTaskId], { encoding: 'utf-8' });\n\n return { worktreePath, branch, mergeTaskId, alreadyExists: false };\n}\n\n// ============================================================================\n// worktree wire-deps\n// ============================================================================\n\nexport interface WireDepsResult {\n noMergeTask: boolean;\n wired: string[];\n warnings: string[];\n}\n\nexport function runWorktreeWireDeps(epicId: string): WireDepsResult {\n validateEpicId(epicId);\n\n const raw = execFileSync('bd', ['show', epicId, '--json'], { encoding: 'utf-8' });\n const deps = parseBdShowDeps(raw);\n\n const mergeDep = deps.find(d => d.title.startsWith('Merge:'));\n if (!mergeDep) {\n return { noMergeTask: true, wired: [], warnings: [] };\n }\n const mergeId = shortId(mergeDep.id);\n\n const wired: string[] = [];\n const warnings: string[] = [];\n\n const reviewDep = deps.find(d => d.title.startsWith('Review:'));\n const compoundDep = deps.find(d => d.title.startsWith('Compound:'));\n\n if (reviewDep) {\n const reviewId = shortId(reviewDep.id);\n execFileSync('bd', ['dep', 'add', mergeId, reviewId], { encoding: 'utf-8' });\n wired.push(reviewId);\n } else {\n warnings.push('No Review task found — it may not exist yet');\n }\n\n if (compoundDep) {\n const compoundId = shortId(compoundDep.id);\n execFileSync('bd', ['dep', 'add', mergeId, compoundId], { encoding: 'utf-8' });\n wired.push(compoundId);\n } else {\n warnings.push('No Compound task found — it may not exist yet');\n }\n\n return { noMergeTask: false, wired, warnings };\n}\n\n// ============================================================================\n// worktree merge\n// ============================================================================\n\nexport interface WorktreeMergeResult {\n mainRepo: string;\n newLessons: number;\n}\n\nexport function runWorktreeMerge(epicId: string): WorktreeMergeResult {\n validateEpicId(epicId);\n\n const branch = `epic/${epicId}`;\n\n // Discover main repo\n const gitCommonDir = execFileSync('git', ['rev-parse', '--git-common-dir'], { encoding: 'utf-8' }).trim();\n const mainRepo = path.resolve(gitCommonDir, '..');\n\n // Verify main repo is on the main branch\n const currentBranch = execFileSync(\n 'git', ['-C', mainRepo, 'rev-parse', '--abbrev-ref', 'HEAD'], { encoding: 'utf-8' },\n ).trim();\n if (currentBranch !== 'main') {\n throw new Error(`Main repo is on branch \"${currentBranch}\", expected \"main\". Checkout main before merging.`);\n }\n\n // Discover worktree path\n const listRaw = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf-8' });\n const entries = parseWorktreeList(listRaw);\n const wtEntry = entries.find(e => e.branch === branch);\n if (!wtEntry) {\n throw new Error(`Worktree not found for branch \"${branch}\". Run \\`ca worktree list\\` to see active worktrees.`);\n }\n const worktreePath = wtEntry.path;\n\n // Phase 1: Sync (merge main into worktree)\n try {\n execFileSync('git', ['merge', 'main'], { cwd: worktreePath, encoding: 'utf-8' });\n } catch (err) {\n throw new Error(\n `Merge conflict in worktree at ${worktreePath}. ` +\n `Resolve conflicts there and run \\`ca worktree merge ${epicId}\\` again. ` +\n `Detail: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n // Phase 2: Run tests in worktree\n try {\n execFileSync('pnpm', ['test'], { cwd: worktreePath, encoding: 'utf-8' });\n } catch (err) {\n throw new Error(\n `Tests failed in worktree at ${worktreePath}. ` +\n `Fix failures before merging. ` +\n `Detail: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n // Phase 3: Land (merge worktree branch into main)\n execFileSync('git', ['-C', mainRepo, 'merge', branch, '--no-edit'], { encoding: 'utf-8' });\n\n // Phase 4: Reconcile JSONL (handle uncommitted worktree changes not captured by git merge).\n // Uses line-based dedup: appends any worktree lines not already in main.\n // This preserves last-write-wins semantics for same-ID updates/deletes.\n const mainJsonlPath = path.join(mainRepo, '.claude', 'lessons', 'index.jsonl');\n const wtJsonlPath = path.join(worktreePath, '.claude', 'lessons', 'index.jsonl');\n let newLessons = 0;\n\n if (existsSync(wtJsonlPath)) {\n const mainContent = existsSync(mainJsonlPath)\n ? readFileSync(mainJsonlPath, 'utf-8')\n : '';\n const mainLineSet = new Set(mainContent.split('\\n').filter(Boolean));\n const wtLines = readFileSync(wtJsonlPath, 'utf-8').split('\\n').filter(Boolean);\n\n const newLines = wtLines.filter(line => !mainLineSet.has(line));\n if (newLines.length > 0) {\n const base = mainContent.trimEnd();\n const appended = base ? `${base}\\n${newLines.join('\\n')}\\n` : `${newLines.join('\\n')}\\n`;\n writeFileSync(mainJsonlPath, appended, 'utf-8');\n newLessons = newLines.length;\n }\n }\n\n // Phase 5: Clean up worktree and branch\n execFileSync('git', ['worktree', 'remove', worktreePath], { encoding: 'utf-8' });\n execFileSync('git', ['branch', '-d', branch], { encoding: 'utf-8' });\n\n return { mainRepo, newLessons };\n}\n\n// ============================================================================\n// worktree list\n// ============================================================================\n\nexport interface WorktreeEntry {\n epicId: string;\n path: string;\n branch: string;\n status: string;\n}\n\nexport function runWorktreeList(): WorktreeEntry[] {\n const listRaw = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf-8' });\n const entries = parseWorktreeList(listRaw);\n\n const results: WorktreeEntry[] = [];\n for (const entry of entries) {\n if (!entry.path.includes('-wt-')) continue;\n\n const epicIdMatch = entry.path.match(/-wt-(.+)$/);\n if (!epicIdMatch?.[1]) continue;\n const epicId: string = epicIdMatch[1];\n\n let status = 'unknown';\n try {\n const raw = execFileSync('bd', ['show', epicId, '--json'], { encoding: 'utf-8' });\n const data = JSON.parse(raw);\n const issue = Array.isArray(data) ? data[0] : data;\n status = issue?.status ?? 'unknown';\n } catch {\n // bd show failed — status stays unknown\n }\n\n results.push({ epicId, path: entry.path, branch: entry.branch, status });\n }\n\n return results;\n}\n\n// ============================================================================\n// worktree cleanup\n// ============================================================================\n\nexport interface WorktreeCleanupResult {\n removed: boolean;\n mergeTaskClosed: boolean;\n}\n\nexport function runWorktreeCleanup(\n epicId: string,\n options: { force?: boolean } = {},\n): WorktreeCleanupResult {\n validateEpicId(epicId);\n\n const listRaw = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf-8' });\n const entries = parseWorktreeList(listRaw);\n const branch = `epic/${epicId}`;\n const wtEntry = entries.find(e => e.branch === branch || e.path.endsWith(`-wt-${epicId}`));\n\n if (!wtEntry) {\n throw new Error(`Worktree not found for epic \"${epicId}\"`);\n }\n\n // Check for dirty state\n if (!options.force) {\n const status = execFileSync('git', ['status', '--porcelain'], {\n cwd: wtEntry.path,\n encoding: 'utf-8',\n });\n if (status.trim()) {\n throw new Error(`Worktree has uncommitted changes. Use --force to override.`);\n }\n }\n\n // Remove worktree\n const removeArgs = options.force\n ? ['worktree', 'remove', wtEntry.path, '--force']\n : ['worktree', 'remove', wtEntry.path];\n execFileSync('git', removeArgs, { encoding: 'utf-8' });\n\n // Delete branch: -d (safe) by default, -D (force) only with --force\n const branchFlag = options.force ? '-D' : '-d';\n execFileSync('git', ['branch', branchFlag, branch], { encoding: 'utf-8' });\n\n // Find and close Merge task\n let mergeTaskClosed = false;\n try {\n const raw = execFileSync('bd', ['show', epicId, '--json'], { encoding: 'utf-8' });\n const deps = parseBdShowDeps(raw);\n const mergeDep = deps.find(d => d.title.startsWith('Merge:'));\n if (mergeDep) {\n const mergeId = shortId(mergeDep.id);\n execFileSync('bd', ['close', mergeId], { encoding: 'utf-8' });\n mergeTaskClosed = true;\n }\n } catch {\n // bd operations may fail if epic not found — that's fine\n }\n\n return { removed: true, mergeTaskClosed };\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\nfunction handleError(err: unknown): void {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exitCode = 1;\n}\n\nfunction addCreateCommand(wt: Command): void {\n wt.command('create <epic-id>')\n .description('Create a new worktree for an epic')\n .action((epicId: string) => {\n try {\n const result = runWorktreeCreate(epicId);\n if (result.alreadyExists) {\n console.log(`Worktree already exists at ${result.worktreePath}`);\n return;\n }\n console.log(`Worktree created:`);\n console.log(` Path: ${result.worktreePath}`);\n console.log(` Branch: ${result.branch}`);\n console.log(` Merge task: ${result.mergeTaskId}`);\n } catch (err) { handleError(err); }\n });\n}\n\nfunction addWireDepsCommand(wt: Command): void {\n wt.command('wire-deps <epic-id>')\n .description('Wire Review/Compound tasks as merge dependencies')\n .action((epicId: string) => {\n try {\n const result = runWorktreeWireDeps(epicId);\n if (result.noMergeTask) {\n console.log('No worktree detected, working on main branch');\n return;\n }\n if (result.wired.length > 0) {\n console.log(`Wired dependencies: ${result.wired.join(', ')}`);\n }\n for (const w of result.warnings) {\n console.log(`Warning: ${w}`);\n }\n } catch (err) { handleError(err); }\n });\n}\n\nfunction addMergeCommand(wt: Command): void {\n wt.command('merge <epic-id>')\n .description('Merge worktree branch back to main')\n .action((epicId: string) => {\n try {\n const result = runWorktreeMerge(epicId);\n console.log(`Merged epic/${epicId} to main`);\n console.log(` New lessons: ${result.newLessons}`);\n } catch (err) { handleError(err); }\n });\n}\n\nfunction addListCommand(wt: Command): void {\n wt.command('list')\n .description('List active worktrees')\n .action(() => {\n try {\n const entries = runWorktreeList();\n if (entries.length === 0) {\n console.log('No active worktrees.');\n return;\n }\n console.log('Epic ID | Path | Branch | Status');\n console.log('------------|-------------------------------|-----------------|-------');\n for (const e of entries) {\n console.log(`${e.epicId.padEnd(12)}| ${e.path.padEnd(30)}| ${e.branch.padEnd(16)}| ${e.status}`);\n }\n } catch (err) { handleError(err); }\n });\n}\n\nfunction addCleanupCommand(wt: Command): void {\n wt.command('cleanup <epic-id>')\n .description('Remove a worktree and clean up associated resources')\n .option('--force', 'Force removal even with uncommitted changes')\n .action((epicId: string, opts: { force?: boolean }) => {\n try {\n const result = runWorktreeCleanup(epicId, { force: opts.force });\n console.log(`Worktree removed for epic/${epicId}`);\n if (result.mergeTaskClosed) {\n console.log('Merge task closed.');\n }\n } catch (err) { handleError(err); }\n });\n}\n\nexport function registerWorktreeCommands(program: Command): void {\n const wt = program\n .command('worktree')\n .description('Manage git worktrees for parallel epic execution');\n\n addCreateCommand(wt);\n addWireDepsCommand(wt);\n addMergeCommand(wt);\n addListCommand(wt);\n addCleanupCommand(wt);\n}\n","/**\n * Capture commands: learn, capture, detect\n *\n * Commands for capturing lessons from various sources.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { detectAndPropose, parseInputFile } from '../memory/capture/index.js';\nimport type { DetectionResult } from '../memory/capture/index.js';\nimport { appendLesson, appendMemoryItem, generateId, MemoryItemTypeSchema, SeveritySchema } from '../memory/index.js';\nimport type { Lesson, MemoryItem, MemoryItemType, Severity } from '../memory/index.js';\n\nimport { formatError } from '../cli-error-format.js';\n\nimport { getGlobalOpts, out } from './shared.js';\n\n// ============================================================================\n// Capture Command Helpers\n// ============================================================================\n\n/** Options for capture command */\ninterface CaptureOptions {\n trigger?: string;\n insight?: string;\n input?: string;\n json?: boolean;\n yes?: boolean;\n}\n\n/** Options for learn command */\ninterface LearnOptions {\n trigger?: string;\n tags: string;\n severity?: string;\n yes?: boolean;\n citation?: string;\n citationCommit?: string;\n type: string;\n patternBad?: string;\n patternGood?: string;\n}\n\n/**\n * Create a lesson from explicit trigger and insight.\n */\nfunction createLessonFromFlags(trigger: string, insight: string, confirmed: boolean): Lesson {\n return {\n id: generateId(insight),\n type: 'lesson',\n trigger,\n insight,\n tags: [],\n source: 'manual',\n context: { tool: 'capture', intent: 'manual capture' },\n created: new Date().toISOString(),\n confirmed,\n supersedes: [],\n related: [],\n };\n}\n\n/**\n * Output lesson in JSON format for capture command.\n */\nfunction outputCaptureJson(lesson: Lesson, saved: boolean): void {\n console.log(JSON.stringify({\n id: lesson.id,\n trigger: lesson.trigger,\n insight: lesson.insight,\n type: lesson.type,\n saved,\n }));\n}\n\n/**\n * Output lesson preview in human-readable format.\n */\nfunction outputCapturePreview(lesson: Lesson): void {\n console.log('Lesson captured:');\n console.log(` ID: ${lesson.id}`);\n console.log(` Trigger: ${lesson.trigger}`);\n console.log(` Insight: ${lesson.insight}`);\n console.log(` Type: ${lesson.type}`);\n console.log(` Tags: ${lesson.tags.length > 0 ? lesson.tags.join(', ') : '(none)'}`);\n console.log('\\nTo save: run with --yes flag');\n}\n\n/**\n * Create lesson from input file detection result.\n */\nfunction createLessonFromInputFile(result: DetectionResult, confirmed: boolean): Lesson {\n return {\n id: generateId(result.proposedInsight),\n type: 'lesson',\n trigger: result.trigger,\n insight: result.proposedInsight,\n tags: [],\n source: result.source,\n context: { tool: 'capture', intent: 'auto-capture' },\n created: new Date().toISOString(),\n confirmed,\n supersedes: [],\n related: [],\n };\n}\n\n// ============================================================================\n// Command Action Handlers\n// ============================================================================\n\n/**\n * Handle the learn command action.\n */\nasync function handleLearn(cmd: Command, insight: string, options: LearnOptions): Promise<void> {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(cmd);\n\n // Validate --type\n const typeResult = MemoryItemTypeSchema.safeParse(options.type);\n if (!typeResult.success) {\n console.error(formatError('learn', 'INVALID_TYPE', `Invalid type: \"${options.type}\"`, 'Use --type lesson|solution|pattern|preference'));\n process.exitCode = 1;\n return;\n }\n const itemType: MemoryItemType = typeResult.data;\n\n // Validate pattern flags when type=pattern\n if (itemType === 'pattern' && (!options.patternBad || !options.patternGood)) {\n console.error(formatError('learn', 'MISSING_PATTERN', 'type=pattern requires --pattern-bad and --pattern-good', 'Use: learn \"insight\" --type pattern --pattern-bad \"old\" --pattern-good \"new\"'));\n process.exitCode = 1;\n return;\n }\n\n // Validate severity if provided\n let severity: Severity | undefined;\n if (options.severity !== undefined) {\n const result = SeveritySchema.safeParse(options.severity);\n if (!result.success) {\n console.error(formatError('learn', 'INVALID_SEVERITY', `Invalid severity: \"${options.severity}\"`, 'Use --severity high|medium|low'));\n process.exitCode = 1;\n return;\n }\n severity = result.data;\n }\n\n // Parse citation if provided\n let citation: { file: string; line?: number; commit?: string } | undefined;\n if (options.citation) {\n const parts = options.citation.split(':');\n const file = parts[0] ?? '';\n const lineStr = parts[1];\n const line = lineStr ? parseInt(lineStr, 10) : undefined;\n citation = {\n file,\n ...(line && !isNaN(line) && { line }),\n ...(options.citationCommit && { commit: options.citationCommit }),\n };\n }\n\n // Build pattern if provided\n const pattern = options.patternBad && options.patternGood\n ? { bad: options.patternBad, good: options.patternGood }\n : undefined;\n\n const item: MemoryItem = {\n id: generateId(insight, itemType),\n type: itemType,\n trigger: options.trigger ?? 'Manual capture',\n insight,\n tags: options.tags ? options.tags.split(',').map((t) => t.trim()) : [],\n source: 'manual',\n context: { tool: 'cli', intent: 'manual learning' },\n created: new Date().toISOString(),\n confirmed: true,\n supersedes: [],\n related: [],\n ...(severity !== undefined && { severity }),\n ...(citation && { citation }),\n ...(pattern && { pattern }),\n } as MemoryItem;\n\n await appendMemoryItem(repoRoot, item);\n\n const verb = itemType === 'lesson' ? 'Learned' : 'Captured';\n const chalk = await import('chalk');\n out.success(`${verb}: ${insight}`);\n if (!quiet) {\n console.log(`ID: ${chalk.default.dim(item.id)}`);\n if (itemType !== 'lesson') {\n console.log(`Type: ${chalk.default.dim(itemType)}`);\n }\n if (citation) {\n console.log(`Citation: ${chalk.default.dim(citation.file)}${citation.line ? `:${citation.line}` : ''}`);\n }\n }\n}\n\n/**\n * Handle the detect command action.\n */\nasync function handleDetect(options: { input: string; save?: boolean; yes?: boolean; json?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n\n if (options.save && !options.yes) {\n if (options.json) {\n console.log(JSON.stringify({ error: '--save requires --yes flag for confirmation' }));\n } else {\n console.error(formatError('detect', 'MISSING_FLAG', '--save requires --yes', 'Use: detect --input <file> --save --yes'));\n }\n process.exitCode = 1;\n return;\n }\n\n let input;\n try {\n input = await parseInputFile(options.input);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to parse input file';\n if (options.json) {\n console.log(JSON.stringify({ error: message, detected: false }));\n } else {\n console.error(formatError('detect', 'INVALID_INPUT', message, 'Check the file is valid JSON matching the expected schema'));\n }\n process.exitCode = 1;\n return;\n }\n const result = await detectAndPropose(repoRoot, input);\n\n if (!result) {\n if (options.json) {\n console.log(JSON.stringify({ detected: false }));\n } else {\n console.log('No learning trigger detected.');\n }\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify({ detected: true, ...result }));\n return;\n }\n\n console.log('Learning trigger detected!');\n console.log(` Trigger: ${result.trigger}`);\n console.log(` Source: ${result.source}`);\n console.log(` Proposed: ${result.proposedInsight}`);\n\n if (options.save && options.yes) {\n const lesson: Lesson = {\n id: generateId(result.proposedInsight),\n type: 'lesson',\n trigger: result.trigger,\n insight: result.proposedInsight,\n tags: [],\n source: result.source,\n context: { tool: 'detect', intent: 'auto-capture' },\n created: new Date().toISOString(),\n confirmed: true,\n supersedes: [],\n related: [],\n };\n\n await appendLesson(repoRoot, lesson);\n console.log(`\\nSaved as lesson: ${lesson.id}`);\n }\n}\n\n/**\n * Handle the capture command action.\n */\nasync function handleCapture(cmd: Command, options: CaptureOptions): Promise<void> {\n const repoRoot = getRepoRoot();\n const { verbose } = getGlobalOpts(cmd);\n let lesson: Lesson | undefined;\n\n if (options.input) {\n let input;\n try {\n input = await parseInputFile(options.input);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to parse input file';\n if (options.json) {\n console.log(JSON.stringify({ error: message, saved: false }));\n } else {\n console.error(formatError('capture', 'INVALID_INPUT', message, 'Check the file is valid JSON matching the expected schema'));\n }\n process.exitCode = 1;\n return;\n }\n const result = await detectAndPropose(repoRoot, input);\n if (!result) {\n if (options.json) {\n console.log(JSON.stringify({ detected: false, saved: false }));\n } else {\n console.log('No learning trigger detected.');\n }\n return;\n }\n lesson = createLessonFromInputFile(result, options.yes ?? false);\n } else if (options.trigger && options.insight) {\n lesson = createLessonFromFlags(options.trigger, options.insight, options.yes ?? false);\n } else {\n const msg = 'Provide either --trigger and --insight, or --input file.';\n if (options.json) {\n console.log(JSON.stringify({ error: msg, saved: false }));\n } else {\n console.error(formatError('capture', 'MISSING_OPTIONS', msg, 'Provide --trigger and --insight, or --input'));\n }\n process.exitCode = 1;\n return;\n }\n\n if (!options.yes && !process.stdin.isTTY) {\n if (options.json) {\n console.log(JSON.stringify({ error: '--yes required in non-interactive mode', saved: false }));\n } else {\n console.error(formatError('capture', 'NON_INTERACTIVE', '--yes required in non-interactive mode', 'Use: capture --trigger \"...\" --insight \"...\" --yes'));\n }\n process.exitCode = 1;\n return;\n }\n\n if (options.json) {\n if (options.yes) await appendLesson(repoRoot, lesson);\n outputCaptureJson(lesson, options.yes ?? false);\n } else if (options.yes) {\n await appendLesson(repoRoot, lesson);\n out.success(`Lesson saved: ${lesson.id}`);\n if (verbose) console.log(` Type: ${lesson.type} | Trigger: ${lesson.trigger}`);\n } else {\n outputCapturePreview(lesson);\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register capture commands (learn, capture, detect) on the program.\n */\nexport function registerCaptureCommands(program: Command): void {\n program\n .command('learn <insight>')\n .description('Capture a new memory item (lesson, solution, pattern, or preference)')\n .option('-t, --trigger <text>', 'What triggered this lesson')\n .option('--tags <tags>', 'Comma-separated tags', '')\n .option('-s, --severity <level>', 'Lesson severity: high, medium, low')\n .option('-y, --yes', 'Skip confirmation')\n .option('--citation <file:line>', 'Source file (optionally with :line number)')\n .option('--citation-commit <hash>', 'Git commit hash for citation')\n .option('--type <type>', 'Memory item type: lesson, solution, pattern, preference', 'lesson')\n .option('--pattern-bad <code>', 'Bad pattern example (required when --type pattern)')\n .option('--pattern-good <code>', 'Good pattern example (required when --type pattern)')\n .action(async function (this: Command, insight: string, options: LearnOptions) {\n await handleLearn(this, insight, options);\n });\n\n program\n .command('detect')\n .description('Detect learning triggers from input')\n .requiredOption('--input <file>', 'Path to JSON input file')\n .option('--save', 'Save proposed lesson (requires --yes)')\n .option('-y, --yes', 'Confirm save (required with --save)')\n .option('--json', 'Output result as JSON')\n .action(async (options: { input: string; save?: boolean; yes?: boolean; json?: boolean }) => {\n await handleDetect(options);\n });\n\n program\n .command('capture')\n .description('Capture a lesson from trigger/insight or input file')\n .option('-t, --trigger <text>', 'What triggered this lesson')\n .option('-i, --insight <text>', 'The insight or lesson learned')\n .option('--input <file>', 'Path to JSON input file (alternative to trigger/insight)')\n .option('--json', 'Output result as JSON')\n .option('-y, --yes', 'Skip confirmation and save immediately')\n .action(async function (this: Command, options: CaptureOptions) {\n await handleCapture(this, options);\n });\n}\n","/**\n * Loop command: generate infinity loop script for autonomous epic processing.\n *\n * Generates a bash script that iterates over beads epics,\n * spawning Claude Code sessions to implement each one.\n */\n\nimport { existsSync } from 'node:fs';\nimport { chmod, mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\n\nimport type { Command } from 'commander';\n\nimport { out } from './shared.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Safe pattern for epic IDs: alphanumeric, hyphens, underscores, dots */\nconst EPIC_ID_PATTERN = /^[a-zA-Z0-9_.-]+$/;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LoopScriptOptions {\n epics?: string[];\n maxRetries: number;\n model: string;\n}\n\ninterface LoopOptions {\n epics?: string[];\n output?: string;\n maxRetries?: string;\n model?: string;\n force?: boolean;\n}\n\n// ============================================================================\n// Script Generation\n// ============================================================================\n\nfunction buildScriptHeader(timestamp: string, maxRetries: number, model: string, epicIds: string): string {\n return `#!/usr/bin/env bash\n# Infinity Loop - Generated by: ca loop\n# Date: ${timestamp}\n# Autonomously processes beads epics via Claude Code sessions.\n#\n# Usage:\n# ./infinity-loop.sh\n# LOOP_DRY_RUN=1 ./infinity-loop.sh # Preview without executing\n\nset -euo pipefail\n\n# Config\nMAX_RETRIES=${maxRetries}\nMODEL=\"${model}\"\nEPIC_IDS=\"${epicIds}\"\nLOG_DIR=\"agent_logs\"\n\n# Helpers\ntimestamp() { date '+%Y-%m-%d_%H-%M-%S'; }\nlog() { echo \"[$(timestamp)] $*\"; }\ndie() { log \"FATAL: $*\"; exit 1; }\n\ncommand -v claude >/dev/null || die \"claude CLI required\"\ncommand -v bd >/dev/null || die \"bd (beads) CLI required\"\n\n# Detect JSON parser: prefer jq, fall back to python3\nHAS_JQ=false\ncommand -v jq >/dev/null 2>&1 && HAS_JQ=true\nif [ \"$HAS_JQ\" = false ]; then\n command -v python3 >/dev/null 2>&1 || die \"jq or python3 required for JSON parsing\"\nfi\n\n# parse_json() - extract a value from JSON stdin\n# Uses jq (primary) with python3 fallback\n# Usage: echo '{\"status\":\"open\"}' | parse_json '.status'\nparse_json() {\n local filter=\"$1\"\n if [ \"$HAS_JQ\" = true ]; then\n jq -r \"$filter\"\n else\n python3 -c \"\nimport sys, json\ndata = json.load(sys.stdin)\nf = '$filter'.strip('.')\nparts = [p for p in f.split('.') if p]\nv = data\nfor p in parts:\n v = v[p]\nprint(v)\n\"\n fi\n}\n\nmkdir -p \"$LOG_DIR\"\n` + buildEpicSelector() + buildPromptFunction();\n}\n\nfunction buildEpicSelector(): string {\n return `\nget_next_epic() {\n if [ -n \"$EPIC_IDS\" ]; then\n # From explicit list, find first still-open epic not yet processed\n for epic_id in $EPIC_IDS; do\n case \" $PROCESSED \" in *\" $epic_id \"*) continue ;; esac\n local status\n status=$(bd show \"$epic_id\" --json 2>/dev/null | parse_json '.status' 2>/dev/null || echo \"\")\n if [ \"$status\" = \"open\" ]; then\n echo \"$epic_id\"\n return 0\n fi\n done\n return 1\n else\n # Dynamic: get next ready epic from dependency graph, filtering processed\n local epic_id\n if [ \"$HAS_JQ\" = true ]; then\n epic_id=$(bd list --type=epic --ready --json --limit=10 2>/dev/null | jq -r '.[].id' 2>/dev/null | while read -r id; do\n case \" $PROCESSED \" in *\" $id \"*) continue ;; esac\n echo \"$id\"\n break\n done)\n else\n epic_id=$(bd list --type=epic --ready --json --limit=10 2>/dev/null | python3 -c \"\nimport sys, json\nprocessed = set('$PROCESSED'.split())\nitems = json.load(sys.stdin)\nfor item in items:\n if item['id'] not in processed:\n print(item['id'])\n break\" 2>/dev/null || echo \"\")\n fi\n if [ -z \"$epic_id\" ]; then\n return 1\n fi\n echo \"$epic_id\"\n return 0\n fi\n}\n`;\n}\n\nfunction buildPromptFunction(): string {\n return `\nbuild_prompt() {\n local epic_id=\"$1\"\n cat <<'PROMPT_HEADER'\nYou are running in an autonomous infinity loop. Your task is to fully implement a beads epic.\n\n## Step 1: Load context\nRun these commands to prime your session:\nPROMPT_HEADER\n cat <<PROMPT_BODY\n\\\\\\`\\\\\\`\\\\\\`bash\nnpx ca load-session\nbd show $epic_id\n\\\\\\`\\\\\\`\\\\\\`\n\nRead the epic details carefully. Understand scope, acceptance criteria, and sub-tasks.\n\n## Step 2: Execute the workflow\nRun the full compound workflow for this epic, starting from the plan phase\n(brainstorm is already done -- the epic exists):\n\n/compound:lfg from plan -- Epic: $epic_id\n\nWork through all phases: plan, work, review, compound.\n\n## Step 3: On completion\nWhen all work is done and tests pass:\n1. Close the epic: \\`bd close $epic_id\\`\n2. Sync beads: \\`bd sync\\`\n3. Commit and push all changes\n4. Output this exact marker on its own line:\n\nEPIC_COMPLETE\n\n## Step 4: On failure\nIf you cannot complete the epic after reasonable effort:\n1. Add a note: \\`bd update $epic_id --notes \"Loop failed: <reason>\"\\`\n2. Output this exact marker on its own line:\n\nEPIC_FAILED\n\n## Step 5: On human required\nIf you hit a blocker that REQUIRES human action (account creation, API keys,\nexternal service setup, design decisions you cannot make, etc.):\n1. Add a note: \\`bd update $epic_id --notes \"Human required: <reason>\"\\`\n2. Output this exact marker followed by a short reason on the SAME line:\n\nHUMAN_REQUIRED: <reason>\n\nExample: HUMAN_REQUIRED: Need AWS credentials configured in .env\n\n## Rules\n- Do NOT ask questions -- there is no human. Make reasonable decisions.\n- Do NOT stop early -- complete the full workflow.\n- If tests fail, fix them. Retry up to 3 times before declaring failure.\n- Use HUMAN_REQUIRED only for true blockers that no amount of retrying can solve.\n- Commit incrementally as you make progress.\nPROMPT_BODY\n}`;\n}\n\nfunction buildMainLoop(): string {\n return `\n# Main loop\nCOMPLETED=0\nFAILED=0\nSKIPPED=0\nPROCESSED=\"\"\n\nlog \"Infinity loop starting\"\nlog \"Config: max_retries=$MAX_RETRIES model=$MODEL\"\n[ -n \"$EPIC_IDS\" ] && log \"Targeting epics: $EPIC_IDS\" || log \"Targeting: all ready epics\"\n\nwhile true; do\n EPIC_ID=$(get_next_epic) || break\n\n log \"Processing epic: $EPIC_ID\"\n\n ATTEMPT=0\n SUCCESS=false\n\n while [ $ATTEMPT -le $MAX_RETRIES ]; do\n ATTEMPT=$((ATTEMPT + 1))\n LOGFILE=\"$LOG_DIR/loop_$EPIC_ID-$(timestamp).log\"\n\n log \"Attempt $ATTEMPT/$((MAX_RETRIES + 1)) for $EPIC_ID (log: $LOGFILE)\"\n\n if [ -n \"\\${LOOP_DRY_RUN:-}\" ]; then\n log \"[DRY RUN] Would run claude session for $EPIC_ID\"\n SUCCESS=true\n break\n fi\n\n PROMPT=$(build_prompt \"$EPIC_ID\")\n\n claude --dangerously-skip-permissions \\\\\n --model \"$MODEL\" \\\\\n -p \"$PROMPT\" \\\\\n &> \"$LOGFILE\" || true\n\n if grep -q \"EPIC_COMPLETE\" \"$LOGFILE\"; then\n log \"Epic $EPIC_ID completed successfully\"\n SUCCESS=true\n break\n elif grep -q \"HUMAN_REQUIRED\" \"$LOGFILE\"; then\n REASON=$(grep \"HUMAN_REQUIRED:\" \"$LOGFILE\" | head -1 | sed 's/.*HUMAN_REQUIRED: *//')\n log \"Epic $EPIC_ID needs human action: $REASON\"\n bd update \"$EPIC_ID\" --notes \"Human required: $REASON\" 2>/dev/null || true\n SKIPPED=$((SKIPPED + 1))\n SUCCESS=skip\n break\n elif grep -q \"EPIC_FAILED\" \"$LOGFILE\"; then\n log \"Epic $EPIC_ID reported failure (attempt $ATTEMPT)\"\n else\n log \"Epic $EPIC_ID session ended without marker (attempt $ATTEMPT)\"\n fi\n\n if [ $ATTEMPT -le $MAX_RETRIES ]; then\n log \"Retrying $EPIC_ID...\"\n sleep 5\n fi\n done\n\n if [ \"$SUCCESS\" = true ]; then\n COMPLETED=$((COMPLETED + 1))\n log \"Epic $EPIC_ID done. Completed so far: $COMPLETED\"\n elif [ \"$SUCCESS\" = skip ]; then\n log \"Epic $EPIC_ID skipped (human required). Continuing.\"\n else\n FAILED=$((FAILED + 1))\n log \"Epic $EPIC_ID failed after $((MAX_RETRIES + 1)) attempts. Stopping loop.\"\n PROCESSED=\"$PROCESSED $EPIC_ID\"\n break\n fi\n\n PROCESSED=\"$PROCESSED $EPIC_ID\"\ndone\n\nlog \"Loop finished. Completed: $COMPLETED, Failed: $FAILED, Skipped: $SKIPPED\"\n[ $FAILED -eq 0 ] && exit 0 || exit 1`;\n}\n\n/**\n * Validate loop script options before generation.\n */\nfunction validateOptions(options: LoopScriptOptions): void {\n if (!Number.isInteger(options.maxRetries) || options.maxRetries < 0) {\n throw new Error(`Invalid maxRetries: must be a non-negative integer, got ${options.maxRetries}`);\n }\n if (options.epics) {\n for (const id of options.epics) {\n if (!EPIC_ID_PATTERN.test(id)) {\n throw new Error(`Invalid epic ID \"${id}\": must match ${EPIC_ID_PATTERN}`);\n }\n }\n }\n}\n\n/**\n * Generate a bash script that autonomously processes beads epics.\n */\nexport function generateLoopScript(options: LoopScriptOptions): string {\n validateOptions(options);\n\n const epicIds = options.epics?.join(' ') ?? '';\n const timestamp = new Date().toISOString();\n\n return buildScriptHeader(timestamp, options.maxRetries, options.model, epicIds)\n + buildMainLoop();\n}\n\n// ============================================================================\n// Command Handler\n// ============================================================================\n\nasync function handleLoop(cmd: Command, options: LoopOptions): Promise<void> {\n // Suppress unused parameter warning -- cmd reserved for future use\n void cmd;\n\n const outputPath = resolve(options.output ?? './infinity-loop.sh');\n\n if (existsSync(outputPath) && !options.force) {\n out.error(`File already exists: ${outputPath}`);\n out.info('Use --force to overwrite');\n process.exitCode = 1;\n return;\n }\n\n const maxRetries = Number(options.maxRetries ?? 1);\n if (!Number.isInteger(maxRetries) || maxRetries < 0) {\n out.error(`Invalid --max-retries: must be a non-negative integer, got \"${options.maxRetries}\"`);\n process.exitCode = 1;\n return;\n }\n\n let script: string;\n try {\n script = generateLoopScript({\n epics: options.epics,\n maxRetries,\n model: options.model ?? 'claude-opus-4-6',\n });\n } catch (err) {\n out.error((err as Error).message);\n process.exitCode = 1;\n return;\n }\n\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, script, 'utf-8');\n await chmod(outputPath, 0o755);\n\n out.success(`Generated infinity loop script: ${outputPath}`);\n out.info('Run it with: ' + outputPath);\n out.info('Preview with: LOOP_DRY_RUN=1 ' + outputPath);\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register loop commands on the program.\n */\nexport function registerLoopCommands(program: Command): void {\n program\n .command('loop')\n .description('Generate infinity loop script for epic tasks')\n .option('--epics <ids...>', 'Specific epic IDs to process')\n .option('-o, --output <path>', 'Output script path', './infinity-loop.sh')\n .option('--max-retries <n>', 'Max retries per epic on failure', '1')\n .option('--model <model>', 'Claude model to use', 'claude-opus-4-6')\n .option('--force', 'Overwrite existing script')\n .action(async function (this: Command, options: LoopOptions) {\n await handleLoop(this, options);\n });\n}\n","/**\n * Retrieval commands: search, list, check-plan, load-session\n *\n * Commands for searching and retrieving lessons.\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseLimit } from '../cli-utils.js';\nimport { isModelUsable, loadSessionLessons, retrieveForPlan } from '../index.js';\nimport { incrementRetrievalCount, readLessons, readMemoryItems, searchKeyword, syncIfNeeded } from '../memory/storage/index.js';\nimport type { MemoryItem } from '../memory/index.js';\n\nimport { formatError } from '../cli-error-format.js';\n\nimport {\n AGE_FLAG_THRESHOLD_DAYS,\n DEFAULT_CHECK_PLAN_LIMIT,\n DEFAULT_LIST_LIMIT,\n DEFAULT_SEARCH_LIMIT,\n getGlobalOpts,\n getLessonAgeDays,\n ISO_DATE_PREFIX_LENGTH,\n LESSON_COUNT_WARNING_THRESHOLD,\n out,\n} from './shared.js';\n\nimport type { RankedLesson } from '../memory/search/index.js';\n\n/**\n * Parse numeric limit with user-friendly error output on invalid input.\n * Returns null on failure so callers can set exitCode and return.\n */\nfunction parseLimitOrNull(rawLimit: string, optionName: string, commandName: string): number | null {\n try {\n return parseLimit(rawLimit, optionName);\n } catch (err) {\n const message = err instanceof Error ? err.message : `Invalid ${optionName}`;\n console.error(formatError(commandName, 'INVALID_LIMIT', message, `Use --${optionName} with a positive integer`));\n return null;\n }\n}\n\n// ============================================================================\n// Check-Plan Command Helpers\n// ============================================================================\n\n/**\n * Read plan text from stdin (non-TTY mode).\n */\nasync function readPlanFromStdin(): Promise<string | undefined> {\n const { stdin } = await import('node:process');\n if (!stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString('utf-8').trim();\n }\n return undefined;\n}\n\n/**\n * Output check-plan results in JSON format.\n *\n * Uses rankScore (final boosted score) instead of raw similarity.\n */\nfunction outputCheckPlanJson(lessons: RankedLesson[]): void {\n const jsonOutput = {\n lessons: lessons.map((l) => ({\n id: l.lesson.id,\n insight: l.lesson.insight,\n rankScore: l.finalScore ?? l.score, // Use finalScore if available, fallback to raw score\n source: l.lesson.source,\n })),\n count: lessons.length,\n };\n console.log(JSON.stringify(jsonOutput));\n}\n\n/**\n * Output check-plan results in human-readable format.\n *\n * Omits numeric scores - ordering is sufficient for human consumption.\n */\nfunction outputCheckPlanHuman(lessons: RankedLesson[], quiet: boolean): void {\n console.log('## Lessons Check\\n');\n console.log('Relevant to your plan:\\n');\n\n lessons.forEach((item, i) => {\n const num = i + 1;\n console.log(`${num}. ${chalk.bold(`[${item.lesson.id}]`)} ${item.lesson.insight}`);\n console.log(` - Source: ${item.lesson.source}`);\n console.log();\n });\n\n if (!quiet) {\n console.log('---');\n console.log('Consider these lessons while implementing.');\n }\n}\n\n// ============================================================================\n// Load-Session Command Helpers\n// ============================================================================\n\n/**\n * Format source string for human-readable display.\n * Converts snake_case to space-separated words.\n */\nfunction formatSource(source: string): string {\n return source.replace(/_/g, ' ');\n}\n\n/**\n * Output load-session results in human-readable format.\n * Optimized for Claude's context window - no IDs, clear structure.\n */\nfunction outputSessionLessonsHuman(lessons: MemoryItem[], quiet: boolean): void {\n console.log('## Lessons from Past Sessions\\n');\n console.log('These lessons were captured from previous corrections and should inform your work:\\n');\n\n lessons.forEach((lesson, i) => {\n const num = i + 1;\n const date = lesson.created.slice(0, ISO_DATE_PREFIX_LENGTH);\n const tagsDisplay = lesson.tags.length > 0 ? ` (${lesson.tags.join(', ')})` : '';\n\n console.log(`${num}. **${lesson.insight}**${tagsDisplay}`);\n console.log(` Learned: ${date} via ${formatSource(lesson.source)}`);\n console.log();\n });\n\n if (!quiet) {\n console.log('Consider these lessons when planning and implementing tasks.');\n }\n}\n\n// ============================================================================\n// Action Handlers\n// ============================================================================\n\nasync function searchAction(cmd: Command, query: string, options: { limit: string }): Promise<void> {\n const repoRoot = getRepoRoot();\n const limit = parseLimitOrNull(options.limit, 'limit', 'search');\n if (limit === null) {\n process.exitCode = 1;\n return;\n }\n const { verbose, quiet } = getGlobalOpts(cmd);\n\n await syncIfNeeded(repoRoot);\n\n let results;\n try {\n results = await searchKeyword(repoRoot, query, limit);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Search failed';\n console.error(formatError('search', 'SEARCH_FAILED', message, 'Check your query syntax'));\n process.exitCode = 1;\n return;\n }\n if (results.length > 0) {\n incrementRetrievalCount(repoRoot, results.map((lesson) => lesson.id));\n }\n\n if (results.length === 0) {\n console.log('No lessons match your search. Try a different query or use \"list\" to see all lessons.');\n return;\n }\n\n if (!quiet) {\n out.info(`Found ${results.length} lesson(s):\\n`);\n }\n for (const lesson of results) {\n console.log(`[${chalk.cyan(lesson.id)}] ${lesson.insight}`);\n console.log(` Trigger: ${lesson.trigger}`);\n if (verbose && lesson.context) {\n console.log(` Context: ${lesson.context.tool} - ${lesson.context.intent}`);\n console.log(` Created: ${lesson.created}`);\n }\n if (lesson.tags.length > 0) {\n console.log(` Tags: ${lesson.tags.join(', ')}`);\n }\n console.log();\n }\n}\n\nasync function listAction(cmd: Command, options: { limit: string; invalidated?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n const limit = parseLimitOrNull(options.limit, 'limit', 'list');\n if (limit === null) {\n process.exitCode = 1;\n return;\n }\n const { verbose, quiet } = getGlobalOpts(cmd);\n\n const { items, skippedCount } = await readMemoryItems(repoRoot);\n\n const filteredItems = options.invalidated\n ? items.filter((i) => i.invalidatedAt)\n : items;\n\n if (filteredItems.length === 0) {\n if (options.invalidated) {\n console.log('No invalidated lessons found.');\n } else {\n console.log('No lessons found. Get started with: learn \"Your first lesson\"');\n }\n if (skippedCount > 0) {\n out.warn(`${skippedCount} corrupted lesson(s) skipped.`);\n }\n return;\n }\n\n const toShow = filteredItems.slice(0, limit);\n\n if (!quiet) {\n const label = options.invalidated ? 'invalidated lesson(s)' : 'item(s)';\n out.info(`Showing ${toShow.length} of ${filteredItems.length} ${label}:\\n`);\n }\n\n for (const item of toShow) {\n const invalidMarker = item.invalidatedAt ? chalk.red('[INVALID] ') : '';\n console.log(`[${chalk.cyan(item.id)}] ${invalidMarker}${item.insight}`);\n if (verbose) {\n console.log(` Type: ${item.type} | Source: ${item.source}`);\n console.log(` Created: ${item.created}`);\n if (item.context) {\n console.log(` Context: ${item.context.tool} - ${item.context.intent}`);\n }\n if (item.invalidatedAt) {\n console.log(` Invalidated: ${item.invalidatedAt}`);\n if (item.invalidationReason) {\n console.log(` Reason: ${item.invalidationReason}`);\n }\n }\n } else {\n console.log(` Type: ${item.type} | Source: ${item.source}`);\n }\n if (item.tags.length > 0) {\n console.log(` Tags: ${item.tags.join(', ')}`);\n }\n console.log();\n }\n\n if (skippedCount > 0) {\n out.warn(`${skippedCount} corrupted lesson(s) skipped.`);\n }\n}\n\nasync function loadSessionAction(cmd: Command, options: { json?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(cmd);\n const lessons = await loadSessionLessons(repoRoot);\n\n const { lessons: allLessons } = await readLessons(repoRoot);\n const totalCount = allLessons.length;\n\n if (options.json) {\n console.log(JSON.stringify({ lessons, count: lessons.length, totalCount }));\n return;\n }\n\n if (lessons.length === 0) {\n console.log('No high-severity lessons found.');\n return;\n }\n\n outputSessionLessonsHuman(lessons, quiet);\n\n if (totalCount > LESSON_COUNT_WARNING_THRESHOLD) {\n console.log('');\n out.info(`${totalCount} lessons in index. Consider \\`ca compact\\` to reduce context pollution.`);\n }\n\n const oldLessons = lessons.filter((l) => getLessonAgeDays(l) > AGE_FLAG_THRESHOLD_DAYS);\n if (oldLessons.length > 0) {\n console.log('');\n out.warn(`${oldLessons.length} lesson(s) are over ${AGE_FLAG_THRESHOLD_DAYS} days old. Review for continued validity.`);\n }\n}\n\nasync function checkPlanAction(cmd: Command, options: { plan?: string; json?: boolean; limit: string }): Promise<void> {\n const repoRoot = getRepoRoot();\n const limit = parseLimitOrNull(options.limit, 'limit', 'check-plan');\n if (limit === null) {\n process.exitCode = 1;\n return;\n }\n const { quiet } = getGlobalOpts(cmd);\n\n const planText = options.plan ?? (await readPlanFromStdin());\n\n if (!planText) {\n console.error(formatError('check-plan', 'NO_PLAN', 'No plan provided', 'Use --plan <text> or pipe text to stdin'));\n process.exitCode = 1;\n return;\n }\n\n const usability = await isModelUsable();\n if (!usability.usable) {\n if (options.json) {\n console.log(JSON.stringify({\n lessons: [],\n count: 0,\n error: usability.reason,\n action: usability.action,\n }));\n } else {\n console.error(formatError('check-plan', 'MODEL_UNAVAILABLE', usability.reason, usability.action));\n }\n process.exitCode = 1;\n return;\n }\n\n try {\n const result = await retrieveForPlan(repoRoot, planText, limit);\n\n if (options.json) {\n outputCheckPlanJson(result.lessons);\n return;\n }\n\n if (result.lessons.length === 0) {\n console.log('No relevant lessons found for this plan.');\n return;\n }\n\n outputCheckPlanHuman(result.lessons, quiet);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n if (options.json) {\n console.log(JSON.stringify({\n lessons: [],\n count: 0,\n error: message,\n }));\n } else {\n console.error(formatError('check-plan', 'PLAN_CHECK_FAILED', message, 'Check model installation and try again'));\n }\n process.exitCode = 1;\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register retrieval commands (search, list, check-plan, load-session) on the program.\n */\nexport function registerRetrievalCommands(program: Command): void {\n program\n .command('search <query>')\n .description('Search lessons by keyword')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_SEARCH_LIMIT)\n .action(async function (this: Command, query: string, options: { limit: string }) {\n await searchAction(this, query, options);\n });\n\n program\n .command('list')\n .description('List all lessons')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_LIST_LIMIT)\n .option('--invalidated', 'Show only invalidated lessons')\n .action(async function (this: Command, options: { limit: string; invalidated?: boolean }) {\n await listAction(this, options);\n });\n\n program\n .command('load-session')\n .description('Load high-severity lessons for session context')\n .option('--json', 'Output as JSON')\n .action(async function (this: Command, options: { json?: boolean }) {\n await loadSessionAction(this, options);\n });\n\n program\n .command('check-plan')\n .description('Check plan against relevant lessons')\n .option('--plan <text>', 'Plan text to check')\n .option('--json', 'Output as JSON')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_CHECK_PLAN_LIMIT)\n .action(async function (this: Command, options: { plan?: string; json?: boolean; limit: string }) {\n await checkPlanAction(this, options);\n });\n}\n","/**\n * Command modules for CLI.\n *\n * Each module exports a registration function that adds commands to the program.\n */\n\nimport type { Command } from 'commander';\n\nimport {\n registerClaudeSubcommand,\n registerDownloadModelCommand,\n registerHooksCommand,\n registerInitCommand,\n registerSetupAllCommand,\n} from '../setup/index.js';\n\nimport { registerCrudCommands } from './management-crud.js';\nimport { registerDoctorCommand } from './doctor.js';\nimport { registerInvalidationCommands } from './management-invalidation.js';\nimport { registerIOCommands } from './management-io.js';\nimport { registerMaintenanceCommands } from './management-maintenance.js';\nimport { registerPrimeCommand } from './management-prime.js';\nimport { registerAuditCommands } from './audit.js';\nimport { registerReviewerCommand } from './reviewer.js';\nimport { registerRulesCommands } from './rules.js';\nimport { registerTestSummaryCommand } from './test-summary.js';\nimport { registerVerifyGatesCommand } from './verify-gates.js';\nimport { registerAboutCommand } from './about.js';\nimport { registerWorktreeCommands } from './worktree.js';\n\nexport { registerCaptureCommands } from './capture.js';\nexport { registerLoopCommands } from './loop.js';\nexport { expectedGateForPhase, getPhaseState, registerPhaseCheckCommand, updatePhaseState } from './phase-check.js';\nexport { registerRetrievalCommands } from './retrieval.js';\n\n// Re-export types and helpers from management modules\nexport { formatLessonHuman, wasLessonDeleted } from './management-helpers.js';\nexport { getPrimeContext } from './management-prime.js';\n\n// Re-export shared utilities for use by cli.ts\nexport { getGlobalOpts, out } from './shared.js';\nexport type { GlobalOpts } from './shared.js';\n\n/**\n * Register all setup commands on the program.\n */\nexport function registerSetupCommands(program: Command): void {\n registerInitCommand(program);\n registerHooksCommand(program);\n\n // Create the main setup command. The \"all\" action is registered as the\n // default subcommand so its options (--uninstall, --dry-run) don't\n // conflict with identically-named options on the \"claude\" subcommand.\n const setupCommand = program.command('setup');\n registerSetupAllCommand(setupCommand);\n\n // Add subcommands to setup\n registerClaudeSubcommand(setupCommand);\n\n registerDownloadModelCommand(program);\n}\n\n/**\n * Register all management commands on the program.\n */\nexport function registerManagementCommands(program: Command): void {\n registerInvalidationCommands(program);\n registerMaintenanceCommands(program);\n registerIOCommands(program);\n registerPrimeCommand(program);\n registerCrudCommands(program);\n registerAuditCommands(program);\n registerDoctorCommand(program);\n registerReviewerCommand(program);\n registerRulesCommands(program);\n registerTestSummaryCommand(program);\n registerVerifyGatesCommand(program);\n registerAboutCommand(program);\n registerWorktreeCommands(program);\n}\n","#!/usr/bin/env node\n/**\n * Compound Agent CLI\n *\n * Semantically-intelligent workflow plugin for Claude Code.\n *\n * Commands:\n * Capture: learn, capture, detect\n * Retrieval: search, list, check-plan, load-session\n * Management: wrong, validate, compact, stats, rebuild, export, import, show, update, delete\n * Setup: init, setup claude, hooks, download-model\n * Reviewer: reviewer enable, reviewer disable, reviewer list\n * Loop: loop\n * Health: doctor\n */\n\nimport { Command } from 'commander';\n\nimport { registerCompoundCommands } from './commands/compound.js';\nimport {\n registerCaptureCommands,\n registerLoopCommands,\n registerManagementCommands,\n registerPhaseCheckCommand,\n registerRetrievalCommands,\n registerSetupCommands,\n} from './commands/index.js';\nimport { VERSION } from './version.js';\nimport { closeDb } from './memory/storage/index.js';\n\n// ============================================================================\n// Resource Cleanup\n// ============================================================================\n\n/**\n * Cleanup function to release database resources.\n * Safe to call even if database was never opened.\n *\n * Note: We only close the SQLite database here. The embedding model\n * (node-llama-cpp) handles its own cleanup and calling unloadEmbedding()\n * during signal handlers can cause issues with the native addon.\n */\nfunction cleanup(): void {\n try {\n closeDb();\n } catch {\n // Ignore errors - database may never have been opened\n }\n}\n\n// Register cleanup for interrupt signals only (not 'exit')\n// The 'exit' handler can interfere with normal process shutdown\nprocess.on('SIGINT', () => {\n cleanup();\n process.exit(0);\n});\nprocess.on('SIGTERM', () => {\n cleanup();\n process.exit(0);\n});\n\n// ============================================================================\n// Program Setup\n// ============================================================================\n\nconst program = new Command();\n\n// Add global options\nprogram\n .option('-v, --verbose', 'Show detailed output')\n .option('-q, --quiet', 'Suppress non-essential output');\n\nprogram\n .name('ca')\n .description('Semantically-intelligent workflow plugin for Claude Code')\n .version(VERSION);\n\n// ============================================================================\n// Register Command Modules\n// ============================================================================\n\nregisterCaptureCommands(program);\nregisterRetrievalCommands(program);\nregisterManagementCommands(program);\nregisterSetupCommands(program);\nregisterCompoundCommands(program);\nregisterLoopCommands(program);\nregisterPhaseCheckCommand(program);\n\n// ============================================================================\n// Parse and Execute\n// ============================================================================\n\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../src/cli-utils.ts","../src/memory/embeddings/model.ts","../src/memory/embeddings/nomic.ts","../src/memory/types.ts","../src/memory/storage/jsonl.ts","../src/memory/storage/sqlite/availability.ts","../src/memory/storage/sqlite/schema.ts","../src/memory/storage/sqlite/connection.ts","../src/memory/storage/sqlite/cache.ts","../src/memory/storage/sqlite/sync.ts","../src/memory/storage/sqlite/search.ts","../src/utils.ts","../src/memory/storage/compact.ts","../src/memory/search/vector.ts","../src/memory/search/ranking.ts","../src/compound/clustering.ts","../src/compound/types.ts","../src/compound/io.ts","../src/compound/synthesis.ts","../src/commands/compound.ts","../src/version.ts","../src/setup/banner-audio.ts","../src/setup/banner.ts","../src/setup/beads-check.ts","../src/memory/capture/quality.ts","../src/memory/capture/triggers.ts","../src/memory/capture/integration.ts","../src/memory/retrieval/session.ts","../src/memory/retrieval/plan.ts","../src/audit/checks/lessons.ts","../src/rules/types.ts","../src/rules/checks/glob-utils.ts","../src/rules/checks/file-pattern.ts","../src/rules/checks/file-size.ts","../src/rules/checks/script.ts","../src/rules/engine.ts","../src/audit/checks/patterns.ts","../src/audit/checks/rules.ts","../src/audit/engine.ts","../src/audit/types.ts","../src/setup/templates.ts","../src/setup/claude-helpers.ts","../src/setup/scope-check.ts","../src/setup/display-utils.ts","../src/setup/gitignore.ts","../src/cli-error-format.ts","../src/commands/phase-check.ts","../src/setup/hooks-phase-guard.ts","../src/setup/hooks-read-tracker.ts","../src/setup/hooks-stop-audit.ts","../src/setup/hooks.ts","../src/setup/templates/agents-external.ts","../src/setup/templates/agents-phase11.ts","../src/setup/templates/agents-review.ts","../src/setup/templates/agents.ts","../src/setup/templates/agent-role-skills-workflow.ts","../src/setup/templates/agent-role-skills-review.ts","../src/setup/templates/agent-role-skills-phase11.ts","../src/setup/templates/agent-role-skills.ts","../src/setup/templates/commands.ts","../src/setup/templates/docs.ts","../src/setup/templates/skills.ts","../src/setup/primitives.ts","../src/setup/uninstall.ts","../src/setup/upgrade.ts","../src/setup/all.ts","../src/setup/claude.ts","../src/setup/download-model.ts","../src/setup/init.ts","../src/commands/shared.ts","../src/commands/management-helpers.ts","../src/commands/management-crud.ts","../src/commands/doctor.ts","../src/commands/management-invalidation.ts","../src/commands/management-io.ts","../src/commands/management-maintenance.ts","../src/commands/management-prime.ts","../src/commands/audit.ts","../src/config/config.ts","../src/commands/reviewer.ts","../src/commands/rules.ts","../src/commands/test-summary.ts","../src/commands/verify-gates.ts","../src/changelog-data.ts","../src/commands/about.ts","../src/commands/worktree.ts","../src/commands/capture.ts","../src/commands/loop.ts","../src/commands/retrieval.ts","../src/commands/index.ts","../src/cli.ts"],"names":["getLlama","join","require","dirname","createHash","mtime","readFile","mkdir","lines","appendFile","z","program","createRequire","out","unlinkSync","cleanup","existsSync","DEFAULT_LIMIT","SeveritySchema","statSync","readFileSync","execSync","configPath","homedir","writeFile","rename","EPIC_ID_PATTERN","mkdirSync","writeFileSync","path","content","pkg","rm","result","modelPath","size","printPnpmConfigStatus","chalk","execFileSync","resolve","formatSource"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * CLI utility functions.\n *\n * Pure functions extracted from cli.ts for testability.\n */\n\n/**\n * Format bytes to human-readable string.\n *\n * @param bytes - Number of bytes\n * @returns Formatted string (e.g., \"1.5 KB\", \"2.0 MB\")\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n if (bytes < 1024) return `${bytes} B`;\n const kb = bytes / 1024;\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\n const mb = kb / 1024;\n return `${mb.toFixed(1)} MB`;\n}\n\n/**\n * Parse limit option and validate it's a positive integer.\n *\n * @param value - String value from command option\n * @param name - Option name for error message\n * @returns Parsed integer\n * @throws Error if value is not a valid positive integer\n */\nexport function parseLimit(value: string, name: string): number {\n const parsed = parseInt(value, 10);\n if (Number.isNaN(parsed) || parsed <= 0) {\n throw new Error(`Invalid ${name}: must be a positive integer`);\n }\n return parsed;\n}\n\n/**\n * Get repository root from environment variable or current directory.\n *\n * @returns Repository root path for lesson storage\n */\nexport function getRepoRoot(): string {\n return process.env['COMPOUND_AGENT_ROOT'] ?? process.cwd();\n}\n\n// ============================================================================\n// Beads shared utilities\n// ============================================================================\n\n/** Strict pattern for valid beads epic/task IDs. */\nexport const EPIC_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\n/** Validate an epic ID, throwing if invalid. */\nexport function validateEpicId(epicId: string): void {\n if (!EPIC_ID_PATTERN.test(epicId)) {\n throw new Error(`Invalid epic ID: \"${epicId}\" (must be alphanumeric with hyphens/underscores)`);\n }\n}\n\nexport interface BeadsDep {\n id: string;\n title: string;\n status: string;\n}\n\n/** Parse dependencies from `bd show --json` output. */\nexport function parseBdShowDeps(raw: string): BeadsDep[] {\n const data = JSON.parse(raw);\n const issue = Array.isArray(data) ? data[0] : data;\n if (!issue) return [];\n const depsArray = issue.depends_on ?? issue.dependencies ?? [];\n return depsArray.map((dep: { id?: string; title?: string; status?: string }) => ({\n id: dep.id ?? '',\n title: dep.title ?? '',\n status: dep.status ?? 'open',\n }));\n}\n\n/**\n * Extract short ID from full beads ID (e.g., \"learning_agent-m001\" -> \"m001\").\n * Assumes beads short IDs are the last hyphen-delimited segment.\n */\nexport function shortId(fullId: string): string {\n const parts = fullId.split('-');\n return parts[parts.length - 1] ?? fullId;\n}\n","/**\n * Embedding model resolution using node-llama-cpp's built-in resolver.\n *\n * Uses resolveModelFile for automatic download and caching.\n * Model is stored in ~/.node-llama-cpp/models/ by default.\n */\n\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { getLlama, resolveModelFile } from 'node-llama-cpp';\n\n/**\n * HuggingFace URI for EmbeddingGemma-300M (Q4_0 quantization).\n *\n * - Size: ~278MB\n * - Dimensions: 768 (default), supports MRL truncation to 512/256/128\n * - Context: 2048 tokens\n */\nexport const MODEL_URI = 'hf:ggml-org/embeddinggemma-300M-qat-q4_0-GGUF/embeddinggemma-300M-qat-Q4_0.gguf';\n\n/**\n * Expected model filename after download.\n * node-llama-cpp uses format: hf_{org}_{filename}\n */\nexport const MODEL_FILENAME = 'hf_ggml-org_embeddinggemma-300M-qat-Q4_0.gguf';\n\n/** Default model directory used by node-llama-cpp */\nconst DEFAULT_MODEL_DIR = join(homedir(), '.node-llama-cpp', 'models');\n\n/** Cached usability result (per-process) */\nlet cachedUsability: UsabilityResult | null = null;\n\n/**\n * Check if the embedding model is available locally.\n *\n * @returns true if model file exists\n */\nexport function isModelAvailable(): boolean {\n return existsSync(join(DEFAULT_MODEL_DIR, MODEL_FILENAME));\n}\n\n/**\n * Result of checking if the model is usable at runtime.\n *\n * A discriminated union where `usable` determines which fields are present:\n * - usable=true: Model can initialize and create embedding context\n * - usable=false: Model cannot be used, with reason and actionable fix\n */\nexport type UsabilityResult =\n | { usable: true; reason?: undefined; action?: undefined }\n | { usable: false; reason: string; action: string };\n\n/**\n * Check if the embedding model is usable at runtime.\n *\n * Goes beyond file existence to verify the model can actually initialize:\n * 1. Checks if model file exists (fast fail)\n * 2. Attempts to load llama runtime\n * 3. Attempts to load model\n * 4. Attempts to create embedding context\n * 5. Cleans up all resources after check\n *\n * @returns UsabilityResult with usable status and actionable error if failed\n */\nexport async function isModelUsable(): Promise<UsabilityResult> {\n // Return cached result if available (avoids double initialization)\n if (cachedUsability !== null) {\n return cachedUsability;\n }\n\n // Fast fail if model file doesn't exist\n if (!isModelAvailable()) {\n cachedUsability = {\n usable: false,\n reason: 'Embedding model file not found',\n action: 'Run: npx ca download-model',\n };\n return cachedUsability;\n }\n\n // Attempt runtime initialization\n let llama = null;\n let model = null;\n let context = null;\n\n try {\n const modelPath = join(DEFAULT_MODEL_DIR, MODEL_FILENAME);\n\n // Step 1: Get llama runtime\n llama = await getLlama();\n\n // Step 2: Load model\n model = await llama.loadModel({ modelPath });\n\n // Step 3: Create embedding context\n context = await model.createEmbeddingContext();\n\n // Success - cache and return\n cachedUsability = { usable: true };\n return cachedUsability;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n cachedUsability = {\n usable: false,\n reason: `Embedding model runtime initialization failed: ${message}`,\n action: 'Check system compatibility or reinstall: npx ca download-model',\n };\n return cachedUsability;\n } finally {\n // Clean up resources in reverse order\n if (context) {\n try {\n context.dispose();\n } catch {\n // Ignore cleanup errors\n }\n }\n // Note: model and llama don't have explicit dispose methods in node-llama-cpp\n // The GC will handle them when references are released\n }\n}\n\n/**\n * Clear the cached usability result.\n *\n * Primarily for testing purposes. Clears the cached result so the next\n * call to isModelUsable() will perform a fresh check.\n */\nexport function clearUsabilityCache(): void {\n cachedUsability = null;\n}\n\n/**\n * Resolve the embedding model path, downloading if necessary.\n *\n * Uses node-llama-cpp's resolveModelFile for automatic download with progress.\n *\n * @param options - Optional configuration\n * @param options.cli - Show download progress in console (default: true)\n * @returns Path to the resolved model file\n *\n * @example\n * ```typescript\n * const modelPath = await resolveModel();\n * const llama = await getLlama();\n * const model = await llama.loadModel({ modelPath });\n * ```\n */\nexport async function resolveModel(options: { cli?: boolean } = {}): Promise<string> {\n const { cli = true } = options;\n return resolveModelFile(MODEL_URI, { cli });\n}\n","/**\n * Text embedding via node-llama-cpp with EmbeddingGemma model\n *\n * **Resource lifecycle:**\n * - Model is loaded lazily on first embedding call (~150MB in memory)\n * - Once loaded, the model remains in memory until `unloadEmbedding()` is called\n * - Loading is slow (~1-3s); keeping loaded improves subsequent call performance\n *\n * **Memory usage:**\n * - Embedding model: ~150MB RAM when loaded\n * - Embeddings themselves: ~3KB per embedding (768 dimensions x 4 bytes)\n *\n * @see {@link unloadEmbedding} for releasing memory\n * @see {@link getEmbedding} for the lazy-loading mechanism\n */\n\nimport type { Llama, LlamaModel } from 'node-llama-cpp';\nimport { getLlama, LlamaEmbeddingContext } from 'node-llama-cpp';\n\nimport { isModelAvailable, resolveModel } from './model.js';\n\n/** Singleton embedding context */\nlet embeddingContext: LlamaEmbeddingContext | null = null;\n/** Pending initialization promise (prevents concurrent duplicate loads) */\nlet pendingInit: Promise<LlamaEmbeddingContext> | null = null;\n/** Native resource refs for proper cleanup */\nlet llamaInstance: Llama | null = null;\nlet modelInstance: LlamaModel | null = null;\n\n/**\n * Get the LlamaEmbeddingContext instance for generating embeddings.\n *\n * **Lazy loading behavior:**\n * - First call loads the embedding model (~150MB) into memory\n * - Loading takes ~1-3 seconds depending on hardware\n * - Subsequent calls return the cached instance immediately\n * - Downloads model automatically if not present\n *\n * **Resource lifecycle:**\n * - Once loaded, model stays in memory until `unloadEmbedding()` is called\n * - For CLI commands: typically load once, use, then unload on exit\n * - For long-running processes: keep loaded for performance\n *\n * @returns The singleton embedding context\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * // Direct usage (prefer embedText for simple cases)\n * const ctx = await getEmbedding();\n * const result = await ctx.getEmbeddingFor('some text');\n *\n * // Ensure cleanup\n * process.on('exit', () => unloadEmbedding());\n * ```\n *\n * @see {@link embedText} for simpler text-to-vector conversion\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function getEmbedding(): Promise<LlamaEmbeddingContext> {\n if (embeddingContext) return embeddingContext;\n if (pendingInit) return pendingInit;\n\n pendingInit = (async () => {\n try {\n const modelPath = await resolveModel({ cli: true });\n llamaInstance = await getLlama();\n modelInstance = await llamaInstance.loadModel({ modelPath });\n embeddingContext = await modelInstance.createEmbeddingContext();\n return embeddingContext;\n } catch (err) {\n pendingInit = null; // Allow retry on failure\n throw err;\n }\n })();\n\n return pendingInit;\n}\n\n/**\n * Unload the embedding context to free memory (~150MB).\n *\n * **Resource lifecycle:**\n * - Disposes the underlying LlamaEmbeddingContext\n * - Releases ~150MB of RAM used by the model\n * - After unloading, subsequent embedding calls will reload the model\n *\n * **When to call:**\n * - At the end of CLI commands to ensure clean process exit\n * - In memory-constrained environments after batch processing\n * - Before process exit in graceful shutdown handlers\n * - When switching to a different model (if supported in future)\n *\n * **Best practices:**\n * - For single-operation scripts: call before exit\n * - For daemon/server processes: call in shutdown handler\n * - Not needed between embedding calls in the same process\n *\n * @example\n * ```typescript\n * // CLI command pattern\n * try {\n * const embedding = await embedText('some text');\n * // ... use embedding\n * } finally {\n * unloadEmbedding();\n * closeDb();\n * }\n *\n * // Graceful shutdown pattern\n * process.on('SIGTERM', () => {\n * unloadEmbedding();\n * closeDb();\n * process.exit(0);\n * });\n * ```\n *\n * @see {@link getEmbedding} for loading the model\n * @see {@link closeDb} for database cleanup (often used together)\n */\nexport function unloadEmbedding(): void {\n if (embeddingContext) {\n embeddingContext.dispose();\n embeddingContext = null;\n }\n if (modelInstance) {\n modelInstance.dispose().catch(() => {});\n modelInstance = null;\n }\n if (llamaInstance) {\n llamaInstance.dispose().catch(() => {});\n llamaInstance = null;\n }\n pendingInit = null;\n}\n\n/**\n * Embed a single text string into a vector.\n *\n * **Lazy loading:** First call loads the embedding model (~150MB, ~1-3s).\n * Subsequent calls use the cached model and complete in milliseconds.\n *\n * @param text - The text to embed\n * @returns A 768-dimensional vector (number[])\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * const vector = await embedText('TypeScript error handling');\n * console.log(vector.length); // 768\n *\n * // Remember to clean up when done\n * unloadEmbedding();\n * ```\n *\n * @see {@link embedTexts} for batch embedding\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function embedText(text: string): Promise<number[]> {\n const ctx = await getEmbedding();\n const result = await ctx.getEmbeddingFor(text);\n return Array.from(result.vector);\n}\n\n/**\n * Embed multiple texts into vectors.\n *\n * **Lazy loading:** First call loads the embedding model (~150MB, ~1-3s).\n * Subsequent calls use the cached model.\n *\n * **Note:** Texts are embedded sequentially (node-llama-cpp uses a mutex lock).\n * The only advantage over a manual loop is shared model initialization.\n *\n * @param texts - Array of texts to embed\n * @returns Array of 768-dimensional vectors, same order as input\n * @throws Error if model download fails\n *\n * @example\n * ```typescript\n * const texts = ['first text', 'second text'];\n * const vectors = await embedTexts(texts);\n * console.log(vectors.length); // 2\n * console.log(vectors[0].length); // 768\n *\n * // Remember to clean up when done\n * unloadEmbedding();\n * ```\n *\n * @see {@link embedText} for single text embedding\n * @see {@link unloadEmbedding} for releasing memory\n */\nexport async function embedTexts(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n\n const ctx = await getEmbedding();\n const results: number[][] = [];\n\n for (const text of texts) {\n const result = await ctx.getEmbeddingFor(text);\n results.push(Array.from(result.vector));\n }\n\n return results;\n}\n\n// Re-export isModelAvailable for test utilities\nexport { isModelAvailable };\n","/**\n * Memory item type definitions using Zod schemas.\n *\n * Supports 4 memory item types via discriminated union:\n * - lesson: Knowledge learned from mistakes\n * - solution: Problem-resolution pairs\n * - pattern: Code pattern transformations (bad -> good)\n * - preference: User workflow preferences\n *\n * Deletion model:\n * - Set `deleted: true` and `deletedAt` on an item to mark it deleted\n * - LegacyTombstoneSchema handles backward-compat reads of old\n * minimal tombstone records { id, deleted: true, deletedAt }\n * - LegacyLessonSchema handles old quick/full type records\n */\n\nimport { createHash } from 'node:crypto';\nimport { z } from 'zod';\n\n// Source of lesson capture\nexport const SourceSchema = z.enum([\n 'user_correction',\n 'self_correction',\n 'test_failure',\n 'manual',\n]);\n\n// Context about when lesson was learned\nexport const ContextSchema = z.object({\n tool: z.string(),\n intent: z.string(),\n});\n\n// Code pattern (bad -> good)\nexport const PatternSchema = z.object({\n bad: z.string(),\n good: z.string(),\n});\n\n// Citation for lesson provenance tracking\nexport const CitationSchema = z.object({\n file: z.string().min(1), // Source file path (required, non-empty)\n line: z.number().int().positive().optional(), // Line number (optional, must be positive)\n commit: z.string().optional(), // Git commit hash (optional)\n});\n\n// Severity levels for lessons\nexport const SeveritySchema = z.enum(['high', 'medium', 'low']);\n\n// Compaction levels for age-based validity\nexport const CompactionLevelSchema = z.union([\n z.literal(0), // Active\n z.literal(1), // Flagged (>90 days)\n z.literal(2), // Archived\n]);\n\n/** @deprecated Use MemoryItemTypeSchema instead. Kept for parsing old JSONL records. */\nexport const LessonTypeSchema = z.enum(['quick', 'full']);\n\n/** Memory item type enum: lesson, solution, pattern, preference. */\nexport const MemoryItemTypeSchema = z.enum(['lesson', 'solution', 'pattern', 'preference']);\n\n// ---------------------------------------------------------------------------\n// Base fields shared by all memory item types\n// ---------------------------------------------------------------------------\n\nconst baseFields = {\n // Core identity (required)\n id: z.string(),\n trigger: z.string(),\n insight: z.string(),\n\n // Metadata (required)\n tags: z.array(z.string()),\n source: SourceSchema,\n context: ContextSchema,\n created: z.string(), // ISO8601\n confirmed: z.boolean(),\n\n // Relationships (required, can be empty arrays)\n supersedes: z.array(z.string()),\n related: z.array(z.string()),\n\n // Extended fields (optional)\n evidence: z.string().optional(),\n severity: SeveritySchema.optional(),\n\n // Lifecycle fields (optional)\n deleted: z.boolean().optional(),\n deletedAt: z.string().optional(),\n retrievalCount: z.number().optional(),\n\n // Provenance tracking (optional)\n citation: CitationSchema.optional(),\n\n // Age-based validity fields (optional)\n compactionLevel: CompactionLevelSchema.optional(),\n compactedAt: z.string().optional(),\n lastRetrieved: z.string().optional(),\n\n // Invalidation fields (optional)\n invalidatedAt: z.string().optional(),\n invalidationReason: z.string().optional(),\n} as const;\n\n// ---------------------------------------------------------------------------\n// Type-specific schemas\n// ---------------------------------------------------------------------------\n\n/**\n * Lesson memory item schema.\n * Replaces the old quick/full distinction with a single 'lesson' type.\n * Pattern field is optional for lessons.\n */\nexport const LessonItemSchema = z.object({\n ...baseFields,\n type: z.literal('lesson'),\n pattern: PatternSchema.optional(),\n});\n\n/**\n * Solution memory item schema.\n * Uses trigger as \"problem\" and insight as \"resolution\".\n * Pattern field is optional.\n */\nexport const SolutionItemSchema = z.object({\n ...baseFields,\n type: z.literal('solution'),\n pattern: PatternSchema.optional(),\n});\n\n/**\n * Pattern memory item schema.\n * Pattern field is REQUIRED (bad -> good code transformation).\n */\nexport const PatternItemSchema = z.object({\n ...baseFields,\n type: z.literal('pattern'),\n pattern: PatternSchema,\n});\n\n/**\n * Preference memory item schema.\n * Captures user workflow preferences.\n * Pattern field is optional.\n */\nexport const PreferenceItemSchema = z.object({\n ...baseFields,\n type: z.literal('preference'),\n pattern: PatternSchema.optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Discriminated union of all memory item types\n// ---------------------------------------------------------------------------\n\n/**\n * Unified memory item schema (discriminated union on 'type' field).\n * Accepts: lesson, solution, pattern, preference.\n */\nexport const MemoryItemSchema = z.discriminatedUnion('type', [\n LessonItemSchema,\n SolutionItemSchema,\n PatternItemSchema,\n PreferenceItemSchema,\n]);\n\n// ---------------------------------------------------------------------------\n// Backward compatibility\n// ---------------------------------------------------------------------------\n\n/**\n * Legacy lesson schema for reading old JSONL records with type: 'quick' | 'full'.\n * Use this only for parsing existing data files; new records use MemoryItemSchema.\n */\nexport const LegacyLessonSchema = z.object({\n ...baseFields,\n type: LessonTypeSchema,\n pattern: PatternSchema.optional(),\n});\n\n/**\n * LessonSchema - now equivalent to LessonItemSchema.\n *\n * For backward compatibility, existing code that imports LessonSchema\n * continues to work. The type field is now z.literal('lesson').\n *\n * To parse old quick/full records, use LegacyLessonSchema.\n */\nexport const LessonSchema = LessonItemSchema;\n\n/**\n * Legacy tombstone format for backward-compatible reads.\n * Old JSONL files may contain minimal { id, deleted, deletedAt } records.\n */\nexport const LegacyTombstoneSchema = z.object({\n id: z.string(),\n deleted: z.literal(true),\n deletedAt: z.string(), // ISO8601\n});\n\n/**\n * LessonRecord schema - union for reading JSONL files.\n *\n * Accepts:\n * 1. Any new memory item type (lesson, solution, pattern, preference)\n * 2. A legacy lesson (type: 'quick' | 'full')\n * 3. A legacy tombstone (minimal: { id, deleted: true, deletedAt })\n */\nexport const LessonRecordSchema = z.union([\n MemoryItemSchema,\n LegacyLessonSchema,\n LegacyTombstoneSchema,\n]);\n\n/**\n * MemoryItemRecord schema - alias for LessonRecordSchema.\n * Parses all memory item types plus legacy formats.\n */\nexport const MemoryItemRecordSchema = LessonRecordSchema;\n\n// ---------------------------------------------------------------------------\n// Type exports\n// ---------------------------------------------------------------------------\n\nexport type Lesson = z.infer<typeof LessonSchema>;\n/** @deprecated Use MemoryItemType instead. */\nexport type LessonType = z.infer<typeof LessonTypeSchema>;\nexport type LessonRecord = z.infer<typeof LessonRecordSchema>;\nexport type Source = z.infer<typeof SourceSchema>;\nexport type Severity = z.infer<typeof SeveritySchema>;\nexport type Context = z.infer<typeof ContextSchema>;\nexport type Pattern = z.infer<typeof PatternSchema>;\nexport type Citation = z.infer<typeof CitationSchema>;\nexport type CompactionLevel = z.infer<typeof CompactionLevelSchema>;\n\n/** Unified memory item type (discriminated union). */\nexport type MemoryItem = z.infer<typeof MemoryItemSchema>;\n/** Memory item type enum: 'lesson' | 'solution' | 'pattern' | 'preference'. */\nexport type MemoryItemType = z.infer<typeof MemoryItemTypeSchema>;\n/** Solution memory item. */\nexport type Solution = z.infer<typeof SolutionItemSchema>;\n/** Pattern memory item (not to be confused with Pattern = {bad, good}). */\nexport type PatternItem = z.infer<typeof PatternItemSchema>;\n/** Preference memory item. */\nexport type Preference = z.infer<typeof PreferenceItemSchema>;\n/** Record type for reading JSONL files (all types + legacy). */\nexport type MemoryItemRecord = z.infer<typeof MemoryItemRecordSchema>;\n\n// ---------------------------------------------------------------------------\n// ID generation\n// ---------------------------------------------------------------------------\n\n/** Prefix mapping for memory item types. */\nconst TYPE_PREFIXES: Record<MemoryItemType, string> = {\n lesson: 'L',\n solution: 'S',\n pattern: 'P',\n preference: 'R',\n};\n\n/**\n * Generate deterministic memory item ID from insight text.\n * Format: {prefix} + 8 hex characters from SHA-256 hash.\n *\n * @param insight - The insight text to hash\n * @param type - Memory item type (default: 'lesson' for backward compat)\n * @returns ID string like L1a2b3c4d, S1a2b3c4d, P1a2b3c4d, or R1a2b3c4d\n */\nexport function generateId(insight: string, type?: MemoryItemType): string {\n const prefix = TYPE_PREFIXES[type ?? 'lesson'];\n const hash = createHash('sha256').update(insight).digest('hex');\n return `${prefix}${hash.slice(0, 8)}`;\n}\n","/**\n * JSONL storage layer for memory items\n *\n * Append-only storage with last-write-wins deduplication.\n * Source of truth - git trackable.\n *\n * Primary API:\n * appendMemoryItem() - Append any memory item type\n * readMemoryItems() - Read all non-deleted memory items\n *\n * Backward-compatible API:\n * appendLesson() - Append a lesson (delegates to appendMemoryItem)\n * readLessons() - Read lesson-type items only\n *\n * Deletion: append the item with `deleted: true` and `deletedAt`.\n * Read path also accepts old minimal tombstone records for backward compat.\n * Legacy type:'quick'/'full' records are converted to type:'lesson' on read.\n */\n\nimport { appendFile, mkdir, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport {\n MemoryItemRecordSchema,\n type Lesson,\n type LessonRecord,\n type MemoryItem,\n} from '../types.js';\n\n/** Relative path to lessons file from repo root */\nexport const LESSONS_PATH = '.claude/lessons/index.jsonl';\n\n/** Options for reading memory items */\nexport interface ReadLessonsOptions {\n /** If true, throw on first parse error. Default: false (skip errors) */\n strict?: boolean;\n /** Callback for each parse error in non-strict mode */\n onParseError?: (error: ParseError) => void;\n}\n\n/** Parse error details */\nexport interface ParseError {\n /** 1-based line number */\n line: number;\n /** Error message */\n message: string;\n /** Original error */\n cause: unknown;\n}\n\n/** Result of reading lessons (backward-compat) */\nexport interface ReadLessonsResult {\n /** Successfully parsed lessons */\n lessons: Lesson[];\n /** Number of lines skipped due to errors */\n skippedCount: number;\n}\n\n/** Result of reading memory items */\nexport interface ReadMemoryItemsResult {\n /** Successfully parsed memory items */\n items: MemoryItem[];\n /** Number of lines skipped due to errors */\n skippedCount: number;\n}\n\n\n/**\n * Append a memory item to the JSONL file.\n * Creates directory structure if missing.\n * Primary write function for all memory item types.\n *\n * @param repoRoot - Repository root directory\n * @param item - Memory item to append (any type: lesson, solution, pattern, preference)\n */\nexport async function appendMemoryItem(repoRoot: string, item: MemoryItem): Promise<void> {\n const filePath = join(repoRoot, LESSONS_PATH);\n await mkdir(dirname(filePath), { recursive: true });\n\n const line = JSON.stringify(item) + '\\n';\n await appendFile(filePath, line, 'utf-8');\n}\n\n/**\n * Append a lesson to the JSONL file.\n * Backward-compatible wrapper around appendMemoryItem.\n *\n * @param repoRoot - Repository root directory\n * @param lesson - Lesson to append\n */\nexport async function appendLesson(repoRoot: string, lesson: Lesson): Promise<void> {\n return appendMemoryItem(repoRoot, lesson);\n}\n\n/**\n * Parse and validate a single JSON line.\n *\n * Accepts:\n * - New memory item types (lesson, solution, pattern, preference)\n * - Legacy lessons (type: 'quick' | 'full')\n * - Canonical tombstones ({ id, deleted: true, deletedAt })\n * - Legacy tombstones (full record with deleted:true)\n *\n * @returns Parsed record or null if invalid\n */\nfunction parseJsonLine(\n line: string,\n lineNumber: number,\n strict: boolean,\n onParseError?: (error: ParseError) => void\n): LessonRecord | null {\n // Try to parse JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (err) {\n const parseError: ParseError = {\n line: lineNumber,\n message: `Invalid JSON: ${(err as Error).message}`,\n cause: err,\n };\n if (strict) {\n throw new Error(`Parse error on line ${lineNumber}: ${parseError.message}`);\n }\n onParseError?.(parseError);\n return null;\n }\n\n // Validate against MemoryItemRecordSchema (accepts all types + legacy)\n const result = MemoryItemRecordSchema.safeParse(parsed);\n if (!result.success) {\n const parseError: ParseError = {\n line: lineNumber,\n message: `Schema validation failed: ${result.error.message}`,\n cause: result.error,\n };\n if (strict) {\n throw new Error(`Parse error on line ${lineNumber}: ${parseError.message}`);\n }\n onParseError?.(parseError);\n return null;\n }\n\n return result.data;\n}\n\n/**\n * Convert a parsed record to a MemoryItem.\n * Legacy type:'quick'/'full' records are converted to type:'lesson'.\n * Returns null for tombstone-only records (no MemoryItem data).\n */\nfunction toMemoryItem(record: LessonRecord): MemoryItem | null {\n // Tombstone records that are minimal (no type field) cannot be converted\n if (record.deleted === true) {\n return null;\n }\n\n // Legacy type conversion: quick/full -> lesson\n if (record.type === 'quick' || record.type === 'full') {\n return { ...record, type: 'lesson' } as MemoryItem;\n }\n\n // Already a valid MemoryItem type\n return record as MemoryItem;\n}\n\n/**\n * Read all non-deleted memory items from the JSONL file.\n * Primary read function for the unified memory API.\n *\n * Applies last-write-wins deduplication by ID.\n * Converts legacy type:'quick'/'full' to type:'lesson'.\n *\n * Handles tombstone formats:\n * - Canonical: { id, deleted: true, deletedAt }\n * - Legacy: Full record with deleted:true field\n *\n * @param repoRoot - Repository root directory\n * @param options - Optional settings for error handling\n * @returns Result with items array and count of skipped lines\n */\nexport async function readMemoryItems(\n repoRoot: string,\n options: ReadLessonsOptions = {}\n): Promise<ReadMemoryItemsResult> {\n const { strict = false, onParseError } = options;\n const filePath = join(repoRoot, LESSONS_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return { items: [], skippedCount: 0 };\n }\n throw err;\n }\n\n const items = new Map<string, MemoryItem>();\n let skippedCount = 0;\n\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i]!.trim();\n if (!trimmed) continue;\n\n const record = parseJsonLine(trimmed, i + 1, strict, onParseError);\n if (!record) {\n skippedCount++;\n continue;\n }\n\n // Check if record is a tombstone (canonical or legacy)\n if (record.deleted === true) {\n items.delete(record.id);\n } else {\n const item = toMemoryItem(record);\n if (item) {\n items.set(record.id, item);\n }\n }\n }\n\n return { items: Array.from(items.values()), skippedCount };\n}\n\n/**\n * Read all non-deleted lessons from the JSONL file.\n * Backward-compatible wrapper that filters to lesson-type items only.\n *\n * @param repoRoot - Repository root directory\n * @param options - Optional settings for error handling\n * @returns Result with lessons array and count of skipped lines\n */\nexport async function readLessons(\n repoRoot: string,\n options: ReadLessonsOptions = {}\n): Promise<ReadLessonsResult> {\n const result = await readMemoryItems(repoRoot, options);\n\n // Filter to lesson-type items only\n const lessons = result.items.filter((item): item is Lesson => item.type === 'lesson');\n\n return { lessons, skippedCount: result.skippedCount };\n}\n","/**\n * SQLite availability check.\n *\n * Verifies that better-sqlite3 can be loaded. If it cannot, an error\n * is thrown -- there is no silent fallback to JSONL-only mode.\n */\n\nimport { createRequire } from 'node:module';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\n// Create require function for ESM compatibility\nconst require = createRequire(import.meta.url);\n\n/** Cached availability state */\nlet checked = false;\nlet DatabaseConstructor: (new (path: string) => DatabaseType) | null = null;\n\n/**\n * Ensure SQLite (better-sqlite3) is loadable.\n * Throws a clear error if the native module cannot be loaded.\n */\nexport function ensureSqliteAvailable(): void {\n if (checked) return;\n\n try {\n const module = require('better-sqlite3');\n const Constructor = module.default || module;\n const testDb = new Constructor(':memory:');\n testDb.close();\n DatabaseConstructor = Constructor;\n checked = true;\n } catch (cause) {\n throw new Error(\n 'better-sqlite3 failed to load.\\n' +\n 'Run: npx ca setup (auto-configures pnpm native builds)\\n' +\n 'Or manually add to your package.json:\\n' +\n ' \"pnpm\": { \"onlyBuiltDependencies\": [\"better-sqlite3\", \"node-llama-cpp\"] }\\n' +\n 'Then run: pnpm install && pnpm rebuild better-sqlite3\\n' +\n 'For npm/yarn, run: npm rebuild better-sqlite3',\n { cause }\n );\n }\n}\n\n/**\n * Get the SQLite Database constructor.\n * @returns Database constructor (never null -- throws if unavailable)\n */\nexport function getDatabaseConstructor(): new (path: string) => DatabaseType {\n ensureSqliteAvailable();\n return DatabaseConstructor!;\n}\n","/**\n * SQLite schema definition for lessons database.\n *\n * The SQLite database is a rebuildable cache (JSONL is source of truth).\n * When SCHEMA_VERSION changes, the DB file is deleted and recreated.\n */\n\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\n/**\n * Schema version for the SQLite cache.\n * Bump this when making incompatible schema changes.\n * The connection module auto-rebuilds when the DB version is older.\n */\nexport const SCHEMA_VERSION = 3;\n\n/** SQL schema for lessons database with FTS5 full-text search */\nconst SCHEMA_SQL = `\n CREATE TABLE IF NOT EXISTS lessons (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n trigger TEXT NOT NULL,\n insight TEXT NOT NULL,\n evidence TEXT,\n severity TEXT,\n tags TEXT NOT NULL DEFAULT '',\n source TEXT NOT NULL,\n context TEXT NOT NULL DEFAULT '{}',\n supersedes TEXT NOT NULL DEFAULT '[]',\n related TEXT NOT NULL DEFAULT '[]',\n created TEXT NOT NULL,\n confirmed INTEGER NOT NULL DEFAULT 0,\n deleted INTEGER NOT NULL DEFAULT 0,\n retrieval_count INTEGER NOT NULL DEFAULT 0,\n last_retrieved TEXT,\n embedding BLOB,\n content_hash TEXT,\n invalidated_at TEXT,\n invalidation_reason TEXT,\n citation_file TEXT,\n citation_line INTEGER,\n citation_commit TEXT,\n compaction_level INTEGER DEFAULT 0,\n compacted_at TEXT,\n pattern_bad TEXT,\n pattern_good TEXT\n );\n\n CREATE VIRTUAL TABLE IF NOT EXISTS lessons_fts USING fts5(\n id, trigger, insight, tags, pattern_bad, pattern_good,\n content='lessons', content_rowid='rowid'\n );\n\n CREATE TRIGGER IF NOT EXISTS lessons_ai AFTER INSERT ON lessons BEGIN\n INSERT INTO lessons_fts(rowid, id, trigger, insight, tags, pattern_bad, pattern_good)\n VALUES (new.rowid, new.id, new.trigger, new.insight, new.tags, new.pattern_bad, new.pattern_good);\n END;\n\n CREATE TRIGGER IF NOT EXISTS lessons_ad AFTER DELETE ON lessons BEGIN\n INSERT INTO lessons_fts(lessons_fts, rowid, id, trigger, insight, tags, pattern_bad, pattern_good)\n VALUES ('delete', old.rowid, old.id, old.trigger, old.insight, old.tags, old.pattern_bad, old.pattern_good);\n END;\n\n CREATE TRIGGER IF NOT EXISTS lessons_au AFTER UPDATE ON lessons BEGIN\n INSERT INTO lessons_fts(lessons_fts, rowid, id, trigger, insight, tags, pattern_bad, pattern_good)\n VALUES ('delete', old.rowid, old.id, old.trigger, old.insight, old.tags, old.pattern_bad, old.pattern_good);\n INSERT INTO lessons_fts(rowid, id, trigger, insight, tags, pattern_bad, pattern_good)\n VALUES (new.rowid, new.id, new.trigger, new.insight, new.tags, new.pattern_bad, new.pattern_good);\n END;\n\n CREATE INDEX IF NOT EXISTS idx_lessons_created ON lessons(created);\n CREATE INDEX IF NOT EXISTS idx_lessons_confirmed ON lessons(confirmed);\n CREATE INDEX IF NOT EXISTS idx_lessons_severity ON lessons(severity);\n CREATE INDEX IF NOT EXISTS idx_lessons_type ON lessons(type);\n\n CREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n`;\n\n/**\n * Create the database schema and set the version pragma.\n * @param database - SQLite database instance\n */\nexport function createSchema(database: DatabaseType): void {\n database.exec(SCHEMA_SQL);\n database.pragma(`user_version = ${SCHEMA_VERSION}`);\n}\n","/**\n * SQLite database connection management.\n */\n\nimport { mkdirSync, unlinkSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { DbOptions } from './types.js';\nimport { getDatabaseConstructor } from './availability.js';\nimport { createSchema, SCHEMA_VERSION } from './schema.js';\n\n/** Relative path to database file from repo root */\nexport const DB_PATH = '.claude/.cache/lessons.sqlite';\n\n/** Database connections keyed by resolved DB path */\nconst dbMap = new Map<string, DatabaseType>();\n\n/**\n * Check if the database has the expected schema version.\n * @param database - SQLite database instance\n * @returns true if the version matches SCHEMA_VERSION\n */\nfunction hasExpectedVersion(database: DatabaseType): boolean {\n const row = database.pragma('user_version', { simple: true }) as number;\n return row === SCHEMA_VERSION;\n}\n\n/**\n * Open the SQLite database connection.\n * If the database has an older schema version, it is deleted and recreated.\n * Throws if better-sqlite3 cannot be loaded.\n * @param repoRoot - Absolute path to repository root\n * @param options - Database options (e.g., inMemory for testing)\n * @returns Database instance\n */\nexport function openDb(repoRoot: string, options: DbOptions = {}): DatabaseType {\n const { inMemory = false } = options;\n\n // In-memory DBs are keyed by repoRoot so different repos stay isolated\n const key = inMemory ? `:memory:${repoRoot}` : join(repoRoot, DB_PATH);\n\n const cached = dbMap.get(key);\n if (cached) {\n return cached;\n }\n\n const Database = getDatabaseConstructor();\n let database: DatabaseType;\n\n if (inMemory) {\n database = new Database(':memory:');\n } else {\n const dir = dirname(key);\n mkdirSync(dir, { recursive: true });\n database = new Database(key);\n\n if (!hasExpectedVersion(database)) {\n database.close();\n unlinkSync(key);\n database = new Database(key);\n }\n\n database.pragma('journal_mode = WAL');\n }\n\n createSchema(database);\n dbMap.set(key, database);\n return database;\n}\n\n/**\n * Close the SQLite database connection.\n */\nexport function closeDb(): void {\n for (const database of dbMap.values()) {\n database.close();\n }\n dbMap.clear();\n}\n","/**\n * Embedding cache operations for SQLite storage.\n */\n\nimport { createHash } from 'node:crypto';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { CachedEmbeddingData } from './types.js';\nimport { openDb } from './connection.js';\n\n/**\n * Compute content hash for a lesson's trigger and insight.\n * Used to detect content changes for embedding cache invalidation.\n * @param trigger - The lesson trigger text\n * @param insight - The lesson insight text\n * @returns SHA-256 hash of the combined content\n */\nexport function contentHash(trigger: string, insight: string): string {\n return createHash('sha256').update(`${trigger} ${insight}`).digest('hex');\n}\n\n/**\n * Get cached embedding for a lesson.\n * @param repoRoot - Absolute path to repository root\n * @param lessonId - ID of the lesson\n * @param expectedHash - Optional content hash to validate cache freshness\n * @returns Embedding array or null if not cached\n */\nexport function getCachedEmbedding(\n repoRoot: string,\n lessonId: string,\n expectedHash?: string\n): number[] | null {\n const database = openDb(repoRoot);\n\n const row = database\n .prepare('SELECT embedding, content_hash FROM lessons WHERE id = ?')\n .get(lessonId) as { embedding: Buffer | null; content_hash: string | null } | undefined;\n\n if (!row || !row.embedding || !row.content_hash) {\n return null;\n }\n\n if (expectedHash && row.content_hash !== expectedHash) {\n return null;\n }\n\n const float32 = new Float32Array(\n row.embedding.buffer,\n row.embedding.byteOffset,\n row.embedding.byteLength / 4\n );\n return Array.from(float32);\n}\n\n/**\n * Cache embedding for a lesson in SQLite.\n *\n * Uses UPDATE-only (not INSERT) — the row must already exist in the\n * lessons table. If the row hasn't been synced from JSONL yet, the\n * write is a silent no-op and the embedding will be recomputed on\n * next access. This is by-design: the cache is an optional\n * optimization, not the source of truth.\n *\n * @param repoRoot - Absolute path to repository root\n * @param lessonId - ID of the lesson\n * @param embedding - Embedding vector (Float32Array or number array)\n * @param hash - Content hash for cache validation\n */\nexport function setCachedEmbedding(\n repoRoot: string,\n lessonId: string,\n embedding: Float32Array | number[],\n hash: string\n): void {\n const database = openDb(repoRoot);\n\n const float32 = embedding instanceof Float32Array ? embedding : new Float32Array(embedding);\n const buffer = Buffer.from(float32.buffer, float32.byteOffset, float32.byteLength);\n\n database\n .prepare('UPDATE lessons SET embedding = ?, content_hash = ? WHERE id = ?')\n .run(buffer, hash, lessonId);\n}\n\n/**\n * Collect all cached embeddings from the database.\n * Used during index rebuild to preserve valid caches.\n * @param database - SQLite database instance\n * @returns Map of lesson ID to cached embedding data\n */\nexport function collectCachedEmbeddings(database: DatabaseType): Map<string, CachedEmbeddingData> {\n const cache = new Map<string, CachedEmbeddingData>();\n const rows = database\n .prepare('SELECT id, embedding, content_hash FROM lessons WHERE embedding IS NOT NULL')\n .all() as Array<{ id: string; embedding: Buffer; content_hash: string | null }>;\n\n for (const row of rows) {\n if (row.embedding && row.content_hash) {\n cache.set(row.id, { embedding: row.embedding, contentHash: row.content_hash });\n }\n }\n return cache;\n}\n","/**\n * SQLite index synchronization with JSONL source of truth.\n */\n\nimport { statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { MemoryItem } from '../../types.js';\nimport { LESSONS_PATH, readMemoryItems } from '../jsonl.js';\n\nimport type { SyncOptions } from './types.js';\nimport { openDb } from './connection.js';\nimport { collectCachedEmbeddings, contentHash } from './cache.js';\n\n/** SQL for inserting a lesson record */\nconst INSERT_LESSON_SQL = `\n INSERT INTO lessons (id, type, trigger, insight, evidence, severity, tags, source, context, supersedes, related, created, confirmed, deleted, retrieval_count, last_retrieved, embedding, content_hash, invalidated_at, invalidation_reason, citation_file, citation_line, citation_commit, compaction_level, compacted_at, pattern_bad, pattern_good)\n VALUES (@id, @type, @trigger, @insight, @evidence, @severity, @tags, @source, @context, @supersedes, @related, @created, @confirmed, @deleted, @retrieval_count, @last_retrieved, @embedding, @content_hash, @invalidated_at, @invalidation_reason, @citation_file, @citation_line, @citation_commit, @compaction_level, @compacted_at, @pattern_bad, @pattern_good)\n`;\n\n/**\n * Get the modification time of the JSONL file.\n * @param repoRoot - Absolute path to repository root\n * @returns Modification time in milliseconds or null if file doesn't exist\n */\nfunction getJsonlMtime(repoRoot: string): number | null {\n const jsonlPath = join(repoRoot, LESSONS_PATH);\n try {\n const stat = statSync(jsonlPath);\n return stat.mtimeMs;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the last sync modification time from metadata.\n * @param database - SQLite database instance\n * @returns Last sync mtime or null if not set\n */\nfunction getLastSyncMtime(database: DatabaseType): number | null {\n const row = database\n .prepare('SELECT value FROM metadata WHERE key = ?')\n .get('last_sync_mtime') as { value: string } | undefined;\n return row ? parseFloat(row.value) : null;\n}\n\n/**\n * Set the last sync modification time in metadata.\n * @param database - SQLite database instance\n * @param mtime - Modification time to store\n */\nfunction setLastSyncMtime(database: DatabaseType, mtime: number): void {\n database\n .prepare('INSERT OR REPLACE INTO metadata (key, value) VALUES (?, ?)')\n .run('last_sync_mtime', mtime.toString());\n}\n\n/**\n * Rebuild the SQLite index from JSONL source of truth.\n * Preserves cached embeddings when item content hasn't changed.\n * @param repoRoot - Absolute path to repository root\n */\nexport async function rebuildIndex(repoRoot: string): Promise<void> {\n const database = openDb(repoRoot);\n\n const { items } = await readMemoryItems(repoRoot);\n const cachedEmbeddings = collectCachedEmbeddings(database);\n database.exec('DELETE FROM lessons');\n\n if (items.length === 0) {\n const mtime = getJsonlMtime(repoRoot);\n if (mtime !== null) {\n setLastSyncMtime(database, mtime);\n }\n return;\n }\n\n const insert = database.prepare(INSERT_LESSON_SQL);\n const insertMany = database.transaction((memoryItems: MemoryItem[]) => {\n for (const item of memoryItems) {\n const newHash = contentHash(item.trigger, item.insight);\n const cached = cachedEmbeddings.get(item.id);\n const hasValidCache = cached && cached.contentHash === newHash;\n\n insert.run({\n id: item.id,\n type: item.type,\n trigger: item.trigger,\n insight: item.insight,\n evidence: item.evidence ?? null,\n severity: item.severity ?? null,\n tags: item.tags.join(','),\n source: item.source,\n context: JSON.stringify(item.context),\n supersedes: JSON.stringify(item.supersedes),\n related: JSON.stringify(item.related),\n created: item.created,\n confirmed: item.confirmed ? 1 : 0,\n deleted: item.deleted ? 1 : 0,\n retrieval_count: item.retrievalCount ?? 0,\n last_retrieved: item.lastRetrieved ?? null,\n embedding: hasValidCache ? cached.embedding : null,\n content_hash: hasValidCache ? cached.contentHash : null,\n invalidated_at: item.invalidatedAt ?? null,\n invalidation_reason: item.invalidationReason ?? null,\n citation_file: item.citation?.file ?? null,\n citation_line: item.citation?.line ?? null,\n citation_commit: item.citation?.commit ?? null,\n compaction_level: item.compactionLevel ?? 0,\n compacted_at: item.compactedAt ?? null,\n pattern_bad: item.pattern?.bad ?? null,\n pattern_good: item.pattern?.good ?? null,\n });\n }\n });\n\n insertMany(items);\n\n const mtime = getJsonlMtime(repoRoot);\n if (mtime !== null) {\n setLastSyncMtime(database, mtime);\n }\n}\n\n/**\n * Sync SQLite index if JSONL has changed.\n * @param repoRoot - Absolute path to repository root\n * @param options - Sync options\n * @returns true if sync was performed, false otherwise\n */\nexport async function syncIfNeeded(\n repoRoot: string,\n options: SyncOptions = {}\n): Promise<boolean> {\n const { force = false } = options;\n const jsonlMtime = getJsonlMtime(repoRoot);\n if (jsonlMtime === null && !force) {\n return false;\n }\n\n const database = openDb(repoRoot);\n\n const lastSyncMtime = getLastSyncMtime(database);\n const needsRebuild = force || lastSyncMtime === null || (jsonlMtime !== null && jsonlMtime > lastSyncMtime);\n\n if (needsRebuild) {\n await rebuildIndex(repoRoot);\n return true;\n }\n\n return false;\n}\n","/**\n * SQLite search operations using FTS5 full-text search.\n */\n\nimport { MemoryItemSchema } from '../../types.js';\nimport type { MemoryItem, MemoryItemType } from '../../types.js';\n\nimport type { MemoryItemRow, RetrievalStat } from './types.js';\nimport { openDb } from './connection.js';\n\n/**\n * Convert a database row to a MemoryItem object.\n * @param row - Database row\n * @returns MemoryItem object\n */\nfunction rowToMemoryItem(row: MemoryItemRow): MemoryItem | null {\n const item = {\n id: row.id,\n type: row.type,\n trigger: row.trigger,\n insight: row.insight,\n tags: row.tags ? row.tags.split(',').filter(Boolean) : [],\n source: row.source,\n context: JSON.parse(row.context),\n supersedes: JSON.parse(row.supersedes),\n related: JSON.parse(row.related),\n created: row.created,\n confirmed: row.confirmed === 1,\n } as Record<string, unknown>;\n\n if (row.evidence !== null) item.evidence = row.evidence;\n if (row.severity !== null) item.severity = row.severity;\n if (row.deleted === 1) item.deleted = true;\n if (row.retrieval_count > 0) item.retrievalCount = row.retrieval_count;\n if (row.invalidated_at !== null) item.invalidatedAt = row.invalidated_at;\n if (row.invalidation_reason !== null) item.invalidationReason = row.invalidation_reason;\n if (row.citation_file !== null) {\n item.citation = {\n file: row.citation_file,\n ...(row.citation_line !== null && { line: row.citation_line }),\n ...(row.citation_commit !== null && { commit: row.citation_commit }),\n };\n }\n if (row.compaction_level !== null && row.compaction_level !== 0) {\n item.compactionLevel = row.compaction_level;\n }\n if (row.compacted_at !== null) item.compactedAt = row.compacted_at;\n if (row.last_retrieved !== null) item.lastRetrieved = row.last_retrieved;\n if (row.pattern_bad !== null && row.pattern_good !== null) {\n item.pattern = { bad: row.pattern_bad, good: row.pattern_good };\n }\n\n const result = MemoryItemSchema.safeParse(item);\n if (!result.success) return null;\n return result.data;\n}\n\n\n/** FTS5 operator tokens to remove */\nconst FTS_OPERATORS = new Set(['AND', 'OR', 'NOT', 'NEAR']);\n\n/**\n * Sanitize a query string for safe use with FTS5 MATCH.\n * Strips special FTS5 syntax characters and operators.\n * @param query - Raw user query\n * @returns Sanitized query safe for FTS5\n */\nexport function sanitizeFtsQuery(query: string): string {\n // Strip FTS5 special chars: \" * ^ - +\n const stripped = query.replace(/[\"*^+-]/g, '');\n // Tokenize by whitespace, remove FTS operators, filter empty\n const tokens = stripped\n .split(/\\s+/)\n .filter((t) => t.length > 0 && !FTS_OPERATORS.has(t));\n return tokens.join(' ');\n}\n\n/**\n * Increment retrieval count for lessons.\n * @param repoRoot - Absolute path to repository root\n * @param lessonIds - IDs of retrieved lessons\n */\nexport function incrementRetrievalCount(repoRoot: string, lessonIds: string[]): void {\n if (lessonIds.length === 0) return;\n\n const database = openDb(repoRoot);\n\n const now = new Date().toISOString();\n\n const update = database.prepare(`\n UPDATE lessons\n SET retrieval_count = retrieval_count + 1,\n last_retrieved = ?\n WHERE id = ?\n `);\n\n const updateMany = database.transaction((ids: string[]) => {\n for (const id of ids) {\n update.run(now, id);\n }\n });\n\n updateMany(lessonIds);\n}\n\n/**\n * Search lessons using FTS5 full-text search.\n * @param repoRoot - Absolute path to repository root\n * @param query - FTS5 query string\n * @param limit - Maximum number of results\n * @param typeFilter - Optional memory item type to filter by\n * @returns Matching lessons\n */\nexport async function searchKeyword(\n repoRoot: string,\n query: string,\n limit: number,\n typeFilter?: MemoryItemType\n): Promise<MemoryItem[]> {\n const database = openDb(repoRoot);\n\n const countResult = database.prepare('SELECT COUNT(*) as cnt FROM lessons').get() as {\n cnt: number;\n };\n if (countResult.cnt === 0) return [];\n\n const sanitized = sanitizeFtsQuery(query);\n if (sanitized === '') return [];\n\n try {\n if (typeFilter) {\n const rows = database\n .prepare(\n `\n SELECT l.*\n FROM lessons l\n JOIN lessons_fts fts ON l.rowid = fts.rowid\n WHERE lessons_fts MATCH ?\n AND l.invalidated_at IS NULL\n AND l.type = ?\n LIMIT ?\n `\n )\n .all(sanitized, typeFilter, limit) as MemoryItemRow[];\n return rows.map(rowToMemoryItem).filter((x): x is MemoryItem => x !== null);\n }\n\n const rows = database\n .prepare(\n `\n SELECT l.*\n FROM lessons l\n JOIN lessons_fts fts ON l.rowid = fts.rowid\n WHERE lessons_fts MATCH ?\n AND l.invalidated_at IS NULL\n LIMIT ?\n `\n )\n .all(sanitized, limit) as MemoryItemRow[];\n\n return rows.map(rowToMemoryItem).filter((x): x is MemoryItem => x !== null);\n } catch (err) {\n // Log for debugging — sanitization should prevent most FTS5 errors,\n // but real issues (e.g. DB corruption) should not be fully silent\n const message = err instanceof Error ? err.message : 'Unknown FTS5 error';\n console.error(`[compound-agent] search error: ${message}`);\n return [];\n }\n}\n\n/**\n * Get retrieval statistics for all lessons.\n * @param repoRoot - Absolute path to repository root\n * @returns Array of retrieval statistics\n */\nexport function getRetrievalStats(repoRoot: string): RetrievalStat[] {\n const database = openDb(repoRoot);\n\n const rows = database\n .prepare('SELECT id, retrieval_count, last_retrieved FROM lessons')\n .all() as Array<{ id: string; retrieval_count: number; last_retrieved: string | null }>;\n\n return rows.map((row) => ({\n id: row.id,\n count: row.retrieval_count,\n lastRetrieved: row.last_retrieved,\n }));\n}\n","/**\n * Shared utility functions for the Learning Agent.\n */\n\n/** Milliseconds per day for time calculations */\nexport const MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n/**\n * Calculate the age of a lesson in days from its created date.\n *\n * @param lesson - Object with a created field (ISO8601 string)\n * @returns Age in days (integer, rounded down)\n */\nexport function getLessonAgeDays(lesson: { created: string }): number {\n const created = new Date(lesson.created).getTime();\n const now = Date.now();\n return Math.floor((now - created) / MS_PER_DAY);\n}\n","/**\n * Compaction and auto-archive for lessons\n *\n * Handles:\n * - Archiving old lessons (>90 days with 0 retrievals)\n * - Removing tombstones through JSONL rewrite\n * - Tracking compaction thresholds\n */\n\nimport { appendFile, mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport { MemoryItemSchema } from '../types.js';\nimport type { MemoryItem } from '../types.js';\nimport { getLessonAgeDays } from '../../utils.js';\n\nimport { LESSONS_PATH } from './jsonl.js';\n\n/** Relative path to archive directory from repo root */\nexport const ARCHIVE_DIR = '.claude/lessons/archive';\n\n/** Number of tombstones that triggers automatic compaction */\nexport const TOMBSTONE_THRESHOLD = 100;\n\n/** Age threshold for archiving (in days) */\nexport const ARCHIVE_AGE_DAYS = 90;\n\n/** Month offset for JavaScript's 0-indexed months */\nconst MONTH_INDEX_OFFSET = 1;\n\n/** Padding length for month in archive filename (e.g., \"01\" not \"1\") */\nconst MONTH_PAD_LENGTH = 2;\n\n/**\n * Result of a compaction operation\n */\nexport interface CompactResult {\n /** Number of lessons moved to archive */\n archived: number;\n /** Number of tombstones removed */\n tombstonesRemoved: number;\n /** Number of lessons remaining in index.jsonl */\n lessonsRemaining: number;\n /** Number of records dropped due to invalid schema */\n droppedInvalid: number;\n}\n\n/**\n * Generate archive file path for a given date.\n * Format: .claude/lessons/archive/YYYY-MM.jsonl\n */\nexport function getArchivePath(repoRoot: string, date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + MONTH_INDEX_OFFSET).padStart(MONTH_PAD_LENGTH, '0');\n return join(repoRoot, ARCHIVE_DIR, `${year}-${month}.jsonl`);\n}\n\n/**\n * Parse raw JSONL lines from the lessons file.\n * Returns all lines (including invalid ones) as parsed objects or null.\n */\nasync function parseRawJsonlLines(\n repoRoot: string\n): Promise<Array<{ line: string; parsed: Record<string, unknown> | null }>> {\n const filePath = join(repoRoot, LESSONS_PATH);\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n return [];\n }\n\n const results: Array<{ line: string; parsed: Record<string, unknown> | null }> = [];\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const parsed = JSON.parse(trimmed) as Record<string, unknown>;\n results.push({ line: trimmed, parsed });\n } catch {\n results.push({ line: trimmed, parsed: null });\n }\n }\n return results;\n}\n\n/**\n * Count the number of tombstones (deleted: true records) in the JSONL file.\n */\nexport async function countTombstones(repoRoot: string): Promise<number> {\n const lines = await parseRawJsonlLines(repoRoot);\n let count = 0;\n for (const { parsed } of lines) {\n if (parsed && parsed['deleted'] === true) {\n count++;\n }\n }\n return count;\n}\n\n/**\n * Check if compaction is needed based on tombstone count.\n */\nexport async function needsCompaction(repoRoot: string): Promise<boolean> {\n const count = await countTombstones(repoRoot);\n return count >= TOMBSTONE_THRESHOLD;\n}\n\n/**\n * Determine if a lesson should be archived based on age and retrieval count.\n * Lessons are archived if older than ARCHIVE_AGE_DAYS and never retrieved.\n *\n * @param lesson - The lesson to evaluate\n * @returns true if lesson should be archived\n */\nfunction shouldArchive(lesson: MemoryItem): boolean {\n const ageDays = getLessonAgeDays(lesson);\n\n // Archive if: older than threshold AND never retrieved\n return ageDays > ARCHIVE_AGE_DAYS && (lesson.retrievalCount === undefined || lesson.retrievalCount === 0);\n}\n\n/**\n * Run full compaction: archive old lessons and remove tombstones.\n *\n * Reads the JSONL file exactly once, computes all operations in-memory,\n * then writes archive files and atomically replaces the main file.\n */\nexport async function compact(repoRoot: string): Promise<CompactResult> {\n const filePath = join(repoRoot, LESSONS_PATH);\n\n // 1. Read file ONCE\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch {\n return { archived: 0, tombstonesRemoved: 0, lessonsRemaining: 0, droppedInvalid: 0 };\n }\n\n // 2. Parse all records in-memory with last-write-wins dedup\n const lessonMap = new Map<string, MemoryItem>();\n let tombstoneCount = 0;\n let droppedCount = 0;\n\n for (const rawLine of content.split('\\n')) {\n const trimmed = rawLine.trim();\n if (!trimmed) continue;\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(trimmed) as Record<string, unknown>;\n } catch {\n continue;\n }\n\n if (parsed['deleted'] === true) {\n lessonMap.delete(parsed['id'] as string);\n tombstoneCount++;\n } else {\n const result = MemoryItemSchema.safeParse(parsed);\n if (result.success) {\n lessonMap.set(result.data.id, result.data);\n } else {\n droppedCount++;\n }\n }\n }\n\n // 3. Split into archivable and kept\n const toArchive: MemoryItem[] = [];\n const toKeep: MemoryItem[] = [];\n\n for (const lesson of lessonMap.values()) {\n if (shouldArchive(lesson)) {\n toArchive.push(lesson);\n } else {\n toKeep.push(lesson);\n }\n }\n\n // 4. Write archive files\n if (toArchive.length > 0) {\n const archiveGroups = new Map<string, MemoryItem[]>();\n for (const lesson of toArchive) {\n const created = new Date(lesson.created);\n const archivePath = getArchivePath(repoRoot, created);\n const group = archiveGroups.get(archivePath) ?? [];\n group.push(lesson);\n archiveGroups.set(archivePath, group);\n }\n\n const archiveDir = join(repoRoot, ARCHIVE_DIR);\n await mkdir(archiveDir, { recursive: true });\n\n for (const [archivePath, archiveLessons] of archiveGroups) {\n const lines = archiveLessons.map((l) => JSON.stringify(l) + '\\n').join('');\n await appendFile(archivePath, lines, 'utf-8');\n }\n }\n\n // 5. Atomic write of main JSONL with only kept lessons\n await mkdir(dirname(filePath), { recursive: true });\n const tempPath = filePath + '.tmp';\n const lines = toKeep.map((lesson) => JSON.stringify(lesson) + '\\n');\n await writeFile(tempPath, lines.join(''), 'utf-8');\n await rename(tempPath, filePath);\n\n return {\n archived: toArchive.length,\n tombstonesRemoved: tombstoneCount,\n lessonsRemaining: toKeep.length,\n droppedInvalid: droppedCount,\n };\n}\n","/**\n * Vector search with cosine similarity\n *\n * Embeds query text and ranks lessons by semantic similarity.\n * Uses SQLite cache to avoid recomputing embeddings.\n */\n\nimport { readCctPatterns, type CctPattern } from '../../compound/index.js';\nimport { embedText } from '../embeddings/index.js';\nimport { contentHash, getCachedEmbedding, readMemoryItems, setCachedEmbedding } from '../storage/index.js';\nimport type { MemoryItem } from '../types.js';\n\n/**\n * In-memory embedding cache for CCT patterns.\n * CCT patterns don't have rows in the SQLite lessons table,\n * so setCachedEmbedding (UPDATE-only) is a no-op for them.\n * This Map caches embeddings keyed by \"id:contentHash\".\n */\nconst cctEmbeddingCache = new Map<string, number[]>();\n\n/** Clear the CCT embedding cache. Exported for testing. */\nexport function clearCctEmbeddingCache(): void {\n cctEmbeddingCache.clear();\n}\n\n/**\n * Calculate cosine similarity between two vectors.\n * Returns value between -1 (opposite) and 1 (identical).\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Vectors must have same length');\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i]! * b[i]!;\n normA += a[i]! * a[i]!;\n normB += b[i]! * b[i]!;\n }\n\n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n if (magnitude === 0) return 0;\n\n return dotProduct / magnitude;\n}\n\n/**\n * Memory item with similarity score.\n * The `lesson` field holds any MemoryItem type (not just Lesson).\n * Field name kept for backward compatibility.\n */\nexport interface ScoredLesson {\n lesson: MemoryItem;\n score: number;\n}\n\n/** Options for vector search */\nexport interface SearchVectorOptions {\n /** Maximum number of results to return (default: 10) */\n limit?: number;\n}\n\n/** Default number of results to return */\nconst DEFAULT_LIMIT = 10;\n\n/**\n * Search lessons by vector similarity to query text.\n * Returns top N lessons sorted by similarity score (descending).\n * Uses embedding cache to avoid recomputing embeddings.\n */\n/**\n * Convert a CctPattern to a MemoryItem-like shape for search results.\n */\nfunction cctToMemoryItem(pattern: CctPattern): MemoryItem {\n return {\n id: pattern.id,\n type: 'lesson',\n trigger: pattern.name,\n insight: pattern.description,\n tags: [],\n source: 'manual',\n context: { tool: 'compound', intent: 'synthesis' },\n created: pattern.created,\n confirmed: true,\n supersedes: [],\n related: pattern.sourceIds,\n };\n}\n\nexport async function searchVector(\n repoRoot: string,\n query: string,\n options?: SearchVectorOptions\n): Promise<ScoredLesson[]> {\n const limit = options?.limit ?? DEFAULT_LIMIT;\n // Read all memory items (all types)\n const { items } = await readMemoryItems(repoRoot);\n\n // Read CCT patterns if available\n let cctPatterns: CctPattern[] = [];\n try {\n cctPatterns = await readCctPatterns(repoRoot);\n } catch {\n // File doesn't exist or is unreadable — proceed without CCT patterns\n }\n\n if (items.length === 0 && cctPatterns.length === 0) return [];\n\n // Embed the query\n const queryVector = await embedText(query);\n\n // Score each item, skipping invalidated ones\n const scored: ScoredLesson[] = [];\n for (const item of items) {\n // Skip invalidated items\n if (item.invalidatedAt) continue;\n\n try {\n const itemText = `${item.trigger} ${item.insight}`;\n const hash = contentHash(item.trigger, item.insight);\n\n // Try cache first\n let itemVector = getCachedEmbedding(repoRoot, item.id, hash);\n\n if (!itemVector) {\n // Cache miss - compute and store\n itemVector = await embedText(itemText);\n setCachedEmbedding(repoRoot, item.id, itemVector, hash);\n }\n\n const score = cosineSimilarity(queryVector, itemVector);\n scored.push({ lesson: item, score });\n } catch {\n // Skip items that fail embedding — return partial results\n continue;\n }\n }\n\n // Score CCT patterns (use in-memory cache since they lack SQLite rows)\n for (const pattern of cctPatterns) {\n try {\n const text = `${pattern.name} ${pattern.description}`;\n const hash = contentHash(pattern.name, pattern.description);\n const cacheKey = `${pattern.id}:${hash}`;\n\n let vec = cctEmbeddingCache.get(cacheKey);\n if (!vec) {\n vec = await embedText(text);\n cctEmbeddingCache.set(cacheKey, vec);\n }\n\n const score = cosineSimilarity(queryVector, vec);\n scored.push({ lesson: cctToMemoryItem(pattern), score });\n } catch {\n continue;\n }\n }\n\n // Sort by score descending and take top N\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, limit);\n}\n","/**\n * Multi-factor memory item ranking system\n *\n * Combines vector similarity with semantic boosts:\n * - Severity: high=1.5, medium=1.0, low=0.8\n * - Recency: 1.2 for items ≤30 days old\n * - Confirmation: 1.3 for confirmed items\n */\n\nimport type { MemoryItem } from '../types.js';\nimport { getLessonAgeDays } from '../../utils.js';\n\nimport type { ScoredLesson } from './vector.js';\n\n/** Lesson/memory item with final ranked score */\nexport interface RankedLesson extends ScoredLesson {\n finalScore?: number;\n}\n\nconst RECENCY_THRESHOLD_DAYS = 30;\nconst HIGH_SEVERITY_BOOST = 1.5;\nconst MEDIUM_SEVERITY_BOOST = 1.0;\nconst LOW_SEVERITY_BOOST = 0.8;\nconst RECENCY_BOOST = 1.2;\nconst CONFIRMATION_BOOST = 1.3;\n\n/**\n * Maximum combined boost multiplier.\n *\n * Without clamping, the max boost is 1.5 * 1.2 * 1.3 = 2.34x, which lets\n * a 0.4 similarity item outrank a 0.9 similarity item. With a 1.8 cap,\n * an item needs at least ~0.53 similarity with all boosts to beat a 0.95\n * unboosted match, keeping semantic relevance as the primary ranking signal.\n */\nconst MAX_COMBINED_BOOST = 1.8;\n\n/**\n * Calculate severity boost based on item severity.\n * Items without severity get 1.0 (medium boost).\n */\nexport function severityBoost(item: MemoryItem): number {\n switch (item.severity) {\n case 'high':\n return HIGH_SEVERITY_BOOST;\n case 'medium':\n return MEDIUM_SEVERITY_BOOST;\n case 'low':\n return LOW_SEVERITY_BOOST;\n default:\n return MEDIUM_SEVERITY_BOOST;\n }\n}\n\n/**\n * Calculate recency boost based on item age.\n * Items ≤30 days old get 1.2, older get 1.0.\n */\nexport function recencyBoost(item: MemoryItem): number {\n const ageDays = getLessonAgeDays(item);\n return ageDays <= RECENCY_THRESHOLD_DAYS ? RECENCY_BOOST : 1.0;\n}\n\n/**\n * Calculate confirmation boost.\n * Confirmed items get 1.3, unconfirmed get 1.0.\n */\nexport function confirmationBoost(item: MemoryItem): number {\n return item.confirmed ? CONFIRMATION_BOOST : 1.0;\n}\n\n/**\n * Calculate combined score for a memory item.\n * score = vectorSimilarity * min(severity * recency * confirmation, MAX_COMBINED_BOOST)\n */\nexport function calculateScore(item: MemoryItem, vectorSimilarity: number): number {\n const boost = Math.min(\n severityBoost(item) * recencyBoost(item) * confirmationBoost(item),\n MAX_COMBINED_BOOST,\n );\n return vectorSimilarity * boost;\n}\n\n/**\n * Rank lessons by combined score.\n * Returns new array sorted by finalScore descending.\n *\n * Works with ScoredLesson[] (uses .lesson field).\n */\nexport function rankLessons(lessons: ScoredLesson[]): RankedLesson[] {\n return lessons\n .map((scored) => ({\n ...scored,\n finalScore: calculateScore(scored.lesson, scored.score),\n }))\n .sort((a, b) => (b.finalScore ?? 0) - (a.finalScore ?? 0));\n}\n\n","/**\n * Clustering module for grouping similar memory items.\n *\n * Uses single-linkage agglomerative clustering with cosine similarity.\n */\n\nimport { cosineSimilarity } from '../memory/search/index.js';\nimport type { MemoryItem } from '../memory/index.js';\nimport type { ClusterResult } from './types.js';\n\n/** Default similarity threshold for clustering */\nconst DEFAULT_THRESHOLD = 0.75;\n\n/**\n * Build a pairwise cosine similarity matrix from embedding vectors.\n *\n * @param embeddings - Array of embedding vectors\n * @returns NxN similarity matrix\n */\nexport function buildSimilarityMatrix(embeddings: number[][]): number[][] {\n const n = embeddings.length;\n const matrix: number[][] = Array.from({ length: n }, () => new Array<number>(n).fill(0));\n\n for (let i = 0; i < n; i++) {\n matrix[i]![i] = 1.0;\n for (let j = i + 1; j < n; j++) {\n const sim = cosineSimilarity(embeddings[i]!, embeddings[j]!);\n matrix[i]![j] = sim;\n matrix[j]![i] = sim;\n }\n }\n\n return matrix;\n}\n\n/**\n * Cluster memory items by embedding similarity using single-linkage\n * agglomerative clustering.\n *\n * @param items - Memory items to cluster\n * @param embeddings - Embedding vectors (same order as items)\n * @param threshold - Minimum similarity to merge clusters (default: 0.75)\n * @returns Clusters of similar items and noise (unclustered items)\n */\nexport function clusterBySimilarity(\n items: MemoryItem[],\n embeddings: number[][],\n threshold: number = DEFAULT_THRESHOLD\n): ClusterResult {\n const n = items.length;\n if (n === 0) return { clusters: [], noise: [] };\n\n const matrix = buildSimilarityMatrix(embeddings);\n\n // Union-Find for single-linkage clustering\n const parent = Array.from({ length: n }, (_, i) => i);\n\n function find(x: number): number {\n while (parent[x] !== x) {\n parent[x] = parent[parent[x]!]!; // path compression\n x = parent[x]!;\n }\n return x;\n }\n\n function union(a: number, b: number): void {\n const rootA = find(a);\n const rootB = find(b);\n if (rootA !== rootB) parent[rootA] = rootB;\n }\n\n // Merge pairs above threshold\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n if (matrix[i]![j]! >= threshold) {\n union(i, j);\n }\n }\n }\n\n // Group items by their root\n const groups = new Map<number, MemoryItem[]>();\n for (let i = 0; i < n; i++) {\n const root = find(i);\n let group = groups.get(root);\n if (!group) {\n group = [];\n groups.set(root, group);\n }\n group.push(items[i]!);\n }\n\n const clusters = Array.from(groups.values());\n return { clusters, noise: [] };\n}\n","/**\n * Types for the compounding module.\n *\n * CctPattern represents a cross-cutting pattern synthesized\n * from multiple similar lessons.\n */\n\nimport { createHash } from 'node:crypto';\nimport { z } from 'zod';\n\nimport type { MemoryItem } from '../memory/index.js';\n\n/** Relative path to CCT patterns file from repo root */\nexport const CCT_PATTERNS_PATH = '.claude/lessons/cct-patterns.jsonl';\n\n/** Schema for a cross-cutting pattern */\nexport const CctPatternSchema = z.object({\n id: z.string().regex(/^CCT-[a-f0-9]{8}$/),\n name: z.string().min(1),\n description: z.string().min(1),\n frequency: z.number().int().positive(),\n testable: z.boolean(),\n testApproach: z.string().optional(),\n sourceIds: z.array(z.string()).min(1),\n created: z.string(), // ISO8601\n});\n\n/** Inferred type from CctPatternSchema */\nexport type CctPattern = z.infer<typeof CctPatternSchema>;\n\n/** Result from clustering operation */\nexport interface ClusterResult {\n /** Groups of similar items */\n clusters: MemoryItem[][];\n /** Items that didn't fit any cluster */\n noise: MemoryItem[];\n}\n\n/**\n * Generate a CCT pattern ID from a cluster ID string.\n * Format: \"CCT-\" + first 8 hex chars of SHA-256 hash.\n */\nexport function generateCctId(input: string): string {\n const hash = createHash('sha256').update(input).digest('hex');\n return `CCT-${hash.slice(0, 8)}`;\n}\n","/**\n * I/O module for CctPattern persistence.\n *\n * Append-only JSONL storage, following the same pattern as\n * src/memory/storage/jsonl.ts.\n */\n\nimport { appendFile, mkdir, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport { CCT_PATTERNS_PATH, CctPatternSchema, type CctPattern } from './types.js';\n\n/**\n * Read all CCT patterns from the JSONL file.\n *\n * @param repoRoot - Repository root directory\n * @returns Array of CctPattern objects\n */\nexport async function readCctPatterns(repoRoot: string): Promise<CctPattern[]> {\n const filePath = join(repoRoot, CCT_PATTERNS_PATH);\n\n let content: string;\n try {\n content = await readFile(filePath, 'utf-8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw err;\n }\n\n const patterns: CctPattern[] = [];\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n const parsed = JSON.parse(trimmed) as unknown;\n const result = CctPatternSchema.safeParse(parsed);\n if (result.success) {\n patterns.push(result.data);\n }\n }\n\n return patterns;\n}\n\n/**\n * Append CCT patterns to the JSONL file (append-only).\n *\n * @param repoRoot - Repository root directory\n * @param patterns - Patterns to append\n */\nexport async function writeCctPatterns(repoRoot: string, patterns: CctPattern[]): Promise<void> {\n const filePath = join(repoRoot, CCT_PATTERNS_PATH);\n await mkdir(dirname(filePath), { recursive: true });\n\n const lines = patterns.map((p) => JSON.stringify(p) + '\\n').join('');\n await appendFile(filePath, lines, 'utf-8');\n}\n","/**\n * Synthesis module for extracting cross-cutting patterns from clusters.\n *\n * Takes a cluster of similar memory items and produces a CctPattern\n * summarizing the common theme.\n */\n\nimport type { MemoryItem } from '../memory/index.js';\nimport { generateCctId, type CctPattern } from './types.js';\n\n/**\n * Synthesize a CctPattern from a cluster of similar memory items.\n *\n * @param cluster - Group of similar memory items\n * @param clusterId - Identifier for this cluster (used for ID generation)\n * @returns A CctPattern summarizing the cluster\n */\nexport function synthesizePattern(cluster: MemoryItem[], clusterId: string): CctPattern {\n const id = generateCctId(clusterId);\n const frequency = cluster.length;\n const sourceIds = cluster.map((item) => item.id);\n\n // Collect all tags with frequency counts\n const tagCounts = new Map<string, number>();\n for (const item of cluster) {\n for (const tag of item.tags) {\n tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);\n }\n }\n\n // Sort tags by frequency (descending)\n const sortedTags = [...tagCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([tag]) => tag);\n\n // Build name from top tags or first insight\n const name = sortedTags.length > 0\n ? sortedTags.slice(0, 3).join(', ')\n : cluster[0]!.insight.slice(0, 50);\n\n // Build description from all insights\n const description = cluster.map((item) => item.insight).join('; ');\n\n // Determine testability: true if any item has high severity or evidence\n const hasHighSeverity = cluster.some(\n (item) => 'severity' in item && item.severity === 'high'\n );\n const hasEvidence = cluster.some(\n (item) => 'evidence' in item && item.evidence\n );\n const testable = hasHighSeverity || hasEvidence;\n\n // Generate test approach when testable\n const testApproach = testable\n ? `Verify pattern: ${name}. Check ${frequency} related lesson(s).`\n : undefined;\n\n return {\n id,\n name,\n description,\n frequency,\n testable,\n ...(testApproach !== undefined && { testApproach }),\n sourceIds,\n created: new Date().toISOString(),\n };\n}\n","/**\n * Compound command: synthesize CCT patterns from lessons.\n *\n * Reads all memory items, clusters them by embedding similarity,\n * and writes synthesized cross-cutting patterns to cct-patterns.jsonl.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { clusterBySimilarity, synthesizePattern, writeCctPatterns } from '../compound/index.js';\nimport { embedText, isModelUsable } from '../memory/embeddings/index.js';\nimport {\n closeDb,\n contentHash,\n getCachedEmbedding,\n openDb,\n readMemoryItems,\n setCachedEmbedding,\n} from '../memory/storage/index.js';\n\n/**\n * Register compound commands on the program.\n */\nexport function registerCompoundCommands(program: Command): void {\n program\n .command('compound')\n .description('Synthesize cross-cutting patterns from lessons')\n .action(async () => {\n const repoRoot = getRepoRoot();\n\n // Read all memory items\n const { items } = await readMemoryItems(repoRoot);\n if (items.length === 0) {\n console.log('Synthesized 0 patterns from 0 lessons.');\n return;\n }\n\n // Check if embedding model is available\n const modelCheck = await isModelUsable();\n if (!modelCheck.usable) {\n console.error(`Error: Embedding model unavailable — ${modelCheck.reason}`);\n console.error('Run: npx ca download-model');\n process.exitCode = 1;\n return;\n }\n\n // Open DB to enable embedding cache\n openDb(repoRoot);\n\n // Compute embeddings for all items (with cache)\n const embeddings: number[][] = [];\n try {\n for (const item of items) {\n const text = `${item.trigger} ${item.insight}`;\n const hash = contentHash(item.trigger, item.insight);\n\n let vec = getCachedEmbedding(repoRoot, item.id, hash);\n if (!vec) {\n vec = await embedText(text);\n setCachedEmbedding(repoRoot, item.id, vec, hash);\n }\n\n embeddings.push(Array.isArray(vec) ? vec : Array.from(vec));\n }\n } catch (err) {\n console.error(`Error computing embeddings: ${err instanceof Error ? err.message : String(err)}`);\n console.error('Run: npx ca download-model');\n process.exitCode = 1;\n return;\n } finally {\n closeDb();\n }\n\n // Cluster by similarity\n const { clusters } = clusterBySimilarity(items, embeddings);\n\n // Filter clusters with 2+ items (single-item clusters are noise)\n const multiClusters = clusters.filter((c) => c.length >= 2);\n\n // Synthesize patterns from clusters\n const patterns = multiClusters.map((cluster) => {\n const clusterId = cluster.map((item) => item.id).join('-');\n return synthesizePattern(cluster, clusterId);\n });\n\n // Write patterns to file\n if (patterns.length > 0) {\n await writeCctPatterns(repoRoot, patterns);\n }\n\n const lessonCount = items.length;\n console.log(`Synthesized ${patterns.length} pattern(s) from ${lessonCount} lessons.`);\n });\n}\n","/**\n * Package version - lightweight module to avoid circular dependency chains.\n */\n\nimport { createRequire } from 'node:module';\n\nconst _require = createRequire(import.meta.url);\nconst _pkg = _require('../package.json') as { version: string };\n\nexport const VERSION: string = _pkg.version;\n","/**\n * Banner audio — \"Entering the Cloud\"\n *\n * Vaporwave-aesthetic startup sound. Two attacks, four pitch classes,\n * one transformation: suspension to illumination.\n *\n * Audio climax at T=2.9s leads visual shimmer wave at T=3.2s by 300ms.\n *\n * Zero external dependencies. PolyBLEP anti-aliased synthesis.\n */\n\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { writeFileSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\n\n// ── Constants ──\nconst SR = 44100;\nconst MAX_AMP = 0x7000;\n\n// ── Pitch classes (Hz) ──\nconst E2 = 82.41;\nconst B2 = 123.47;\nconst E3 = 164.81;\nconst B3 = 246.94;\nconst E4 = 329.63;\nconst Fs4 = 369.99;\nconst Gs4 = 415.30;\nconst B4 = 493.88;\n\n// ── PolyBLEP anti-aliased sawtooth ──\n\nfunction polyBlep(phase: number, dt: number): number {\n if (phase < dt) { const t = phase / dt; return t + t - t * t - 1; }\n if (phase > 1 - dt) { const t = (phase - 1) / dt; return t * t + t + t + 1; }\n return 0;\n}\n\nfunction sawBL(freq: number, t: number, offset = 0): number {\n const dt = freq / SR;\n const phase = ((freq * t + offset) % 1 + 1) % 1;\n return (2 * phase - 1) - polyBlep(phase, dt);\n}\n\nfunction wideSaw(freq: number, t: number, cents = 10): number {\n const r = Math.pow(2, cents / 1200);\n return (sawBL(freq, t, 0) + sawBL(freq * r, t, 0.33) + sawBL(freq / r, t, 0.66)) / 3;\n}\n\n// ── Biquad low-pass filter ──\n\nclass BiquadLPF {\n private x1 = 0; private x2 = 0;\n private y1 = 0; private y2 = 0;\n private b0 = 0; private b1 = 0; private b2 = 0;\n private a1 = 0; private a2 = 0;\n private lastCut = -1;\n constructor(private Q = 0.707) {}\n process(x: number, cutoff: number): number {\n if (cutoff !== this.lastCut) {\n this.lastCut = cutoff;\n const w0 = 2 * Math.PI * Math.min(cutoff, SR * 0.45) / SR;\n const sin0 = Math.sin(w0), cos0 = Math.cos(w0);\n const alpha = sin0 / (2 * this.Q);\n const a0 = 1 + alpha;\n this.b0 = ((1 - cos0) / 2) / a0;\n this.b1 = (1 - cos0) / a0;\n this.b2 = this.b0;\n this.a1 = (-2 * cos0) / a0;\n this.a2 = (1 - alpha) / a0;\n }\n const y = this.b0 * x + this.b1 * this.x1 + this.b2 * this.x2\n - this.a1 * this.y1 - this.a2 * this.y2;\n this.x2 = this.x1; this.x1 = x;\n this.y2 = this.y1; this.y1 = y;\n return y;\n }\n}\n\n// ── Effects ──\n\nfunction applyDelay(samples: number[], ms: number, fb: number, wet: number, lpHz = 3000): number[] {\n const len = Math.floor(SR * ms / 1000);\n const buf = new Float64Array(len);\n const lpf = new BiquadLPF();\n const out: number[] = [];\n let i = 0;\n for (const s of samples) {\n const d = buf[i]!;\n buf[i] = s + lpf.process(d, lpHz) * fb;\n i = (i + 1) % len;\n out.push(s + d * wet);\n }\n return out;\n}\n\nfunction applyReverb(samples: number[], decayMs: number, wet: number): number[] {\n const combDs = [1116, 1188, 1277, 1356, 1422, 1491];\n const apDs = [225, 341, 556];\n\n function comb(input: number[], delay: number, decay: number): number[] {\n const fb = Math.pow(0.001, delay / (decay * SR / 1000));\n const buf = new Float64Array(delay);\n const damp = new BiquadLPF(0.5);\n const out: number[] = [];\n let i = 0;\n for (const s of input) {\n const d = buf[i]!;\n buf[i] = s + damp.process(d, 4500) * fb;\n i = (i + 1) % delay;\n out.push(d);\n }\n return out;\n }\n\n function allpass(input: number[], delay: number, c = 0.5): number[] {\n const buf = new Float64Array(delay);\n const out: number[] = [];\n let i = 0;\n for (const s of input) {\n const d = buf[i]!;\n const v = s + d * c;\n buf[i] = v;\n i = (i + 1) % delay;\n out.push(d - v * c);\n }\n return out;\n }\n\n const pre = Math.floor(SR * 0.04);\n const delayed: number[] = new Array(pre).fill(0);\n for (const s of samples) delayed.push(s);\n\n const combs = combDs.map(d => comb(delayed, d, decayMs));\n const sum: number[] = new Array(delayed.length).fill(0);\n for (const c of combs)\n for (let i = 0; i < sum.length; i++) sum[i]! += (c[i] ?? 0) / combDs.length;\n\n let ap = sum;\n for (const d of apDs) ap = allpass(ap, d);\n\n let hpY = 0;\n const hpAlpha = (1 / SR) / (1 / (2 * Math.PI * 120) + 1 / SR);\n const clean: number[] = [];\n for (const s of ap) { hpY += hpAlpha * (s - hpY); clean.push(s - hpY); }\n\n const outLen = Math.max(samples.length, clean.length);\n const out: number[] = [];\n for (let i = 0; i < outLen; i++) {\n const dry = i < samples.length ? samples[i]! : 0;\n const w = i < clean.length ? clean[i]! : 0;\n out.push(dry * (1 - wet * 0.3) + w * wet);\n }\n return out;\n}\n\n// ── Helpers ──\n\nfunction expCurve(x: number, pow = 2): number {\n return Math.pow(Math.max(0, Math.min(1, x)), pow);\n}\n\nfunction saturate(x: number): number {\n return Math.tanh(x * 1.15) / Math.tanh(1.15);\n}\n\n// ── Composition ──\n//\n// T=0.0 ROOT E2 strike. The seed.\n// T=1.0 CLOUD E-B pad fades in. Open 5th. Ambiguous.\n// T=2.3 F#4 whispers in. Foreshadowing.\n// T=2.7 BUILD Crescendo + filter sweep accelerates.\n// T=2.9 BLOOM E major arrives. G#4 resolves everything.\n// T=3.2 [Visual: shimmer wave — brain fully lit]\n// T=3.5-6.0 Long sustain, slow decay.\n// T=6.0-7.5 Reverb dissolution.\n\n// ── Voice: root strike (T=0) — E2 + hint of B2 ──\nfunction voiceRoot(i: number, t: number, f: BiquadLPF): number {\n const atk = i < SR * 0.008 ? i / (SR * 0.008) : 1;\n const dec = Math.exp(-t * 2.5);\n const amp = atk * dec * 0.35;\n if (amp < 0.001) return 0;\n const s = wideSaw(E2, t, 6) * 0.7 + Math.sin(2 * Math.PI * B2 * t) * 0.3;\n return f.process(s, 800 + dec * 1200) * amp;\n}\n\n// ── Voice: suspended pad (T=1.0) — E3-B3 open 5th ──\nfunction voicePad(t: number, fE: BiquadLPF, fB: BiquadLPF): number {\n if (t < 1.0) return 0;\n const padT = t - 1.0;\n const fadeIn = expCurve(Math.min(1, padT / 1.8));\n const fadeOut = t < 4.0 ? 1 : expCurve(1 - (t - 4.0) / 3.5, 1.5);\n const amp = fadeIn * fadeOut * 0.20;\n if (amp < 0.001) return 0;\n\n let cutoff: number;\n if (t < 2.7) cutoff = 350 + (padT / 1.7) * 850;\n else if (t < 3.1) cutoff = 1200 + expCurve((t - 2.7) / 0.4) * 2800;\n else cutoff = 4000 - expCurve((t - 3.1) / 4.0, 1.3) * 3200;\n cutoff *= 1 + 0.04 * Math.sin(2 * Math.PI * 0.11 * t);\n\n const dE = 1 + 0.0008 * Math.sin(2 * Math.PI * 0.09 * t);\n const dB = 1 + 0.0007 * Math.sin(2 * Math.PI * 0.12 * t + 0.5);\n const e3 = fE.process(wideSaw(E3 * dE, t, 12), cutoff);\n const b3 = fB.process(wideSaw(B3 * dB, t, 12), cutoff);\n return (e3 * 0.55 + b3 * 0.45) * amp;\n}\n\n// ── Voice: F#4 whisper (T=2.3) — foreshadowing 9th ──\nfunction voiceForeshadow(t: number, f: BiquadLPF): number {\n if (t < 2.3 || t >= 3.5) return 0;\n const fT = t - 2.3;\n const fadeIn = expCurve(Math.min(1, fT / 0.7));\n const fadeOut = fT > 0.7 ? expCurve((1.2 - fT) / 0.5) : 1;\n const amp = fadeIn * fadeOut * 0.07;\n if (amp < 0.001) return 0;\n return f.process(Math.sin(2 * Math.PI * Fs4 * t), 3000) * amp;\n}\n\n// ── Voice: bloom chord (T=2.9) — E major, G#4 resolves ──\nfunction voiceBloom(t: number, fE: BiquadLPF, fG: BiquadLPF, fB: BiquadLPF): number {\n if (t < 2.9) return 0;\n const bT = t - 2.9;\n const atk = Math.min(1, bT / 0.08);\n const sus = bT < 1.5 ? 1 : Math.exp(-(bT - 1.5) * 0.8);\n const amp = atk * sus;\n if (amp < 0.002) return 0;\n\n const bloomF = bT < 0.3\n ? 1500 + expCurve(bT / 0.3) * 3500\n : 5000 - expCurve(Math.min(1, (bT - 0.3) / 4.0), 1.2) * 3500;\n\n const dE4 = 1 + 0.0005 * Math.sin(2 * Math.PI * 0.08 * t);\n const e4 = fE.process(wideSaw(E4 * dE4, t, 8), bloomF);\n\n let gs4 = 0;\n if (bT > 0.03) {\n const gsA = Math.min(1, (bT - 0.03) / 0.1);\n const gsD = 1 + 0.0006 * Math.sin(2 * Math.PI * 0.1 * t + 1.0);\n gs4 = fG.process(wideSaw(Gs4 * gsD, t, 9), bloomF) * gsA;\n }\n\n let b4 = 0;\n if (bT > 0.05 && bT < 3.0) {\n const bA = Math.min(1, (bT - 0.05) / 0.15)\n * (bT > 2.0 ? expCurve(1 - (bT - 2.0)) : 1);\n b4 = fB.process(\n Math.sin(2 * Math.PI * B4 * t) * 0.5 + wideSaw(B4, t, 6) * 0.5,\n bloomF,\n ) * bA;\n }\n\n return (e4 * 0.35 + gs4 * 0.35 + b4 * 0.15) * amp * 0.28;\n}\n\n// ── Voice: sub drone (E2 sine, felt not heard) ──\nfunction voiceSub(t: number): number {\n const subIn = expCurve(Math.min(1, t / 2.0));\n const subOut = t < 4.5 ? 1 : expCurve(1 - (t - 4.5) / 2.5, 1.5);\n return Math.sin(2 * Math.PI * E2 * t) * subIn * subOut * 0.08;\n}\n\n// ── Compose: mix all voices + master effects ──\nfunction compose(): number[] {\n const TOTAL = Math.floor(SR * 7.5);\n const out = new Float64Array(TOTAL);\n const f: BiquadLPF[] = [];\n for (let i = 0; i < 7; i++) f.push(new BiquadLPF(0.6));\n\n for (let i = 0; i < TOTAL; i++) {\n const t = i / SR;\n out[i] = saturate(\n voiceRoot(i, t, f[0]!) + voicePad(t, f[1]!, f[2]!)\n + voiceForeshadow(t, f[3]!) + voiceBloom(t, f[4]!, f[5]!, f[6]!)\n + voiceSub(t),\n );\n }\n\n let result = Array.from(out);\n result = applyDelay(result, 520, 0.22, 0.18, 2800);\n result = applyReverb(result, 4800, 0.40);\n return result;\n}\n\n// ── WAV encoding ──\n\nfunction encodeWav(raw: number[]): Buffer {\n let peak = 0;\n for (const s of raw) { const a = Math.abs(s); if (a > peak) peak = a; }\n const scale = peak > 0 ? 0.92 / peak : 1;\n\n const dataSize = raw.length * 2;\n const buf = Buffer.alloc(44 + dataSize);\n buf.write('RIFF', 0); buf.writeUInt32LE(36 + dataSize, 4);\n buf.write('WAVE', 8); buf.write('fmt ', 12);\n buf.writeUInt32LE(16, 16); buf.writeUInt16LE(1, 20); buf.writeUInt16LE(1, 22);\n buf.writeUInt32LE(SR, 24); buf.writeUInt32LE(SR * 2, 28);\n buf.writeUInt16LE(2, 32); buf.writeUInt16LE(16, 34);\n buf.write('data', 36); buf.writeUInt32LE(dataSize, 40);\n let off = 44;\n for (const s of raw) {\n buf.writeInt16LE(Math.round(Math.max(-1, Math.min(1, s * scale)) * MAX_AMP), off);\n off += 2;\n }\n return buf;\n}\n\n// ── Cross-platform playback ──\n\nfunction spawnPlayer(filePath: string): ChildProcess | null {\n try {\n switch (process.platform) {\n case 'darwin':\n return spawn('afplay', [filePath], { stdio: 'ignore', detached: true });\n case 'linux':\n return spawn('aplay', ['-q', filePath], { stdio: 'ignore', detached: true });\n case 'win32':\n return spawn('powershell', ['-c',\n `(New-Object Media.SoundPlayer '${filePath}').PlaySync()`\n ], { stdio: 'ignore', detached: true });\n default:\n return null;\n }\n } catch {\n return null;\n }\n}\n\n/** Start playing the banner audio. Returns a stop handle, or null if unavailable. */\nexport function playBannerAudio(): { stop: () => void } | null {\n try {\n const wav = encodeWav(compose());\n const tmpPath = join(tmpdir(), `ca-banner-${process.pid}.wav`);\n writeFileSync(tmpPath, wav);\n\n const proc = spawnPlayer(tmpPath);\n if (!proc) {\n try { unlinkSync(tmpPath); } catch { /* ignore */ }\n return null;\n }\n\n proc.unref();\n\n const cleanup = () => {\n try { proc.kill(); } catch { /* already dead */ }\n try { unlinkSync(tmpPath); } catch { /* already cleaned */ }\n };\n\n proc.on('exit', () => {\n try { unlinkSync(tmpPath); } catch { /* ignore */ }\n });\n\n return { stop: cleanup };\n } catch {\n return null;\n }\n}\n","/**\n * Install banner - Organic Tendril Growth animation.\n * Neural knowledge brain builds itself from a single seed.\n */\n\nimport { VERSION } from '../version.js';\nimport { playBannerAudio } from './banner-audio.js';\n\n// -- Dimensions --\nconst W = 62;\nconst H = 22;\n\n// -- ANSI escapes --\nconst CO = {\n VOID: '\\x1B[0;90m',\n DUST: '\\x1B[2;90m',\n OLD: '\\x1B[0;34m',\n SETTLED: '\\x1B[0;36m',\n WARM: '\\x1B[0;35m',\n ACTIVE: '\\x1B[1;36m',\n TIP: '\\x1B[1;35m',\n SPARK: '\\x1B[1;33m',\n FLASH: '\\x1B[1;37m',\n TITLE: '\\x1B[1;36m',\n DIM: '\\x1B[0;90m',\n RESET: '\\x1B[0m',\n} as const;\n\n// -- Brain topology (26 nodes, 44 edges) --\n// Stored as flat arrays; accessor functions provide type-safe index access.\nconst _NX = [30, 22, 38, 15, 25, 35, 45, 11, 19, 28, 36, 43, 49, 13, 21, 30, 39, 47, 17, 25, 34, 43, 23, 30, 37, 30];\nconst _NY = [2, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, 14, 16];\nconst _EA = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 19, 19, 20, 20, 21, 22, 23, 24];\nconst _EB = [1, 2, 4, 5, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 25];\n\nconst nx = (i: number): number => _NX[i]!;\nconst ny = (i: number): number => _NY[i]!;\nconst ea = (i: number): number => _EA[i]!;\nconst eb = (i: number): number => _EB[i]!;\n\nconst CENTER = 15;\nconst nc = _NX.length;\nconst ec = _EA.length;\n\n// -- Tendril characters --\nconst H_CH = ['-', '~', '-', '.', '-'];\nconst V_CH = ['|', ':', '|', '.', '|'];\nconst D_CH = ['.', ':', '.', \"'\", '.'];\n\ntype Canvas = { ch: string[]; co: string[] };\ninterface Particle { x: number; y: number; born: number; life: number; dx: number; dy: number }\n\nconst sleep = (ms: number): Promise<void> => new Promise(r => setTimeout(r, ms));\n\nfunction tendrilChar(adx: number, ady: number, s: number): string {\n if (ady < 2) return H_CH[s % 5]!;\n if (adx < 2) return V_CH[s % 5]!;\n return D_CH[s % 5]!;\n}\n\n// -- Canvas --\n\nfunction mkCanvas(): Canvas {\n return { ch: new Array<string>(W * H).fill(' '), co: new Array<string>(W * H).fill(CO.VOID) };\n}\n\nfunction put(cvs: Canvas, x: number, y: number, ch: string, co: string): void {\n if (x >= 0 && x < W && y >= 0 && y < H) { const i = y * W + x; cvs.ch[i] = ch; cvs.co[i] = co; }\n}\n\nfunction canvasAt(cvs: Canvas, x: number, y: number): string {\n return (x >= 0 && x < W && y >= 0 && y < H) ? cvs.ch[y * W + x]! : ' ';\n}\n\nfunction flush(cvs: Canvas): string {\n let buf = '\\x1B[H\\n\\n';\n let prev = '';\n for (let y = 0; y < H; y++) {\n buf += ' ';\n for (let x = 0; x < W; x++) {\n const i = y * W + x;\n const co = cvs.co[i]!;\n if (co !== prev) { buf += co; prev = co; }\n buf += cvs.ch[i]!;\n }\n buf += `${CO.RESET}\\n`;\n prev = '';\n }\n return buf;\n}\n\n// -- Growth BFS from center --\n\nfunction computeGrowth(): { order: number[]; parent: number[] } {\n const order = [CENTER];\n const parent = [-1];\n const vis = new Uint8Array(nc);\n vis[CENTER] = 1;\n const q = [CENTER];\n\n while (q.length > 0 && order.length < nc) {\n const qi = Math.floor(Math.random() * q.length);\n const cur = q[qi]!;\n const nb: number[] = [];\n for (let e = 0; e < ec; e++) {\n if (ea(e) === cur && !vis[eb(e)]) nb.push(eb(e));\n if (eb(e) === cur && !vis[ea(e)]) nb.push(ea(e));\n }\n if (nb.length > 0) {\n const nxt = nb[Math.floor(Math.random() * nb.length)]!;\n vis[nxt] = 1;\n order.push(nxt);\n parent.push(cur);\n q.push(nxt);\n } else {\n q.splice(qi, 1);\n }\n }\n return { order, parent };\n}\n\n// -- Drawing --\n\nfunction drawTendril(cvs: Canvas, x1: number, y1: number, x2: number, y2: number, color: string): void {\n const dx = x2 - x1, dy = y2 - y1;\n const adx = Math.abs(dx), ady = Math.abs(dy);\n const steps = Math.max(adx, ady, 1);\n for (let s = 1; s < steps; s++) {\n const px = x1 + Math.trunc(dx * s / steps), py = y1 + Math.trunc(dy * s / steps);\n const ex = canvasAt(cvs, px, py);\n if (ex !== ' ' && ex !== '.') continue;\n put(cvs, px, py, tendrilChar(adx, ady, s), color);\n }\n}\n\nfunction drawTendrilPartial(\n cvs: Canvas, x1: number, y1: number, x2: number, y2: number,\n color: string, progress: number,\n): [number, number] {\n const dx = x2 - x1, dy = y2 - y1;\n const adx = Math.abs(dx), ady = Math.abs(dy);\n const steps = Math.max(adx, ady, 1);\n const drawTo = Math.trunc(steps * progress / 100);\n for (let s = 1; s <= drawTo && s < steps; s++) {\n const px = x1 + Math.trunc(dx * s / steps), py = y1 + Math.trunc(dy * s / steps);\n const ex = canvasAt(cvs, px, py);\n if (ex !== ' ' && ex !== '.') continue;\n put(cvs, px, py, tendrilChar(adx, ady, s), color);\n }\n if (drawTo > 0 && drawTo <= steps) {\n return [x1 + Math.trunc(dx * drawTo / steps), y1 + Math.trunc(dy * drawTo / steps)];\n }\n return [x1, y1];\n}\n\n// -- Particles --\n\nfunction spawnParticles(ps: Particle[], x: number, y: number, n: number, frame: number): void {\n for (let i = 0; i < n; i++) {\n ps.push({\n x, y, born: frame, life: Math.floor(Math.random() * 5) + 3,\n dx: Math.floor(Math.random() * 3) - 1, dy: Math.floor(Math.random() * 3) - 1,\n });\n }\n}\n\nfunction renderParticles(cvs: Canvas, ps: Particle[], frame: number): void {\n for (const p of ps) {\n const age = frame - p.born;\n if (age < 0 || age >= p.life) continue;\n p.x += p.dx; p.y += p.dy;\n let ch: string, co: string;\n if (age === 0) { ch = '*'; co = CO.SPARK; }\n else if (age === 1) { ch = '+'; co = CO.TIP; }\n else if (age < 4) { ch = '.'; co = CO.WARM; }\n else { ch = '.'; co = CO.VOID; }\n put(cvs, p.x, p.y, ch, co);\n }\n}\n\n// -- Background dust --\n\nfunction renderBg(cvs: Canvas, frame: number): void {\n for (let y = 1; y < H - 1; y += 2) {\n for (let x = 2; x < W - 2; x += 4) {\n if ((x * 7 + y * 13 + frame) % 11 < 2) put(cvs, x, y, '.', CO.DUST);\n }\n }\n}\n\n// -- Node style during growth phase --\n\nfunction growthNodeStyle(frame: number, i: number, born: number): [string, string] {\n const age = frame - born;\n if (age < 2) return ['*', CO.SPARK];\n if (age < 4) return ['@', CO.FLASH];\n if (age < 8) return ['@', CO.ACTIVE];\n const breath = (frame + i * 3) % 10;\n if (breath < 3 || breath >= 7) return ['o', CO.SETTLED];\n return ['O', CO.ACTIVE];\n}\n\n// -- Main animation --\n\n// eslint-disable-next-line max-lines-per-function -- sequential 5-phase animation loop\nexport async function playInstallBanner(): Promise<void> {\n const { order, parent } = computeGrowth();\n const gc = order.length;\n const ps: Particle[] = [];\n const write = (s: string) => process.stdout.write(s);\n\n write('\\x1B[?25l\\x1B[2J\\x1B[H');\n\n // Start background audio (silently skips if unavailable)\n const audio = playBannerAudio();\n\n // Use 'exit' event (not SIGINT) so cursor restore runs reliably even when\n // cli.ts's own SIGINT handler calls process.exit() before us.\n const restoreCursor = () => process.stdout.write('\\x1B[?25h\\x1B[0m');\n process.on('exit', restoreCursor);\n\n try {\n // Phase 1: Seed pulse (8 frames)\n const seedCh = ['.', 'o', 'O', '@'] as const;\n const seedCo = [CO.VOID, CO.WARM, CO.TIP, CO.FLASH] as const;\n for (let f = 0; f < 8; f++) {\n const cvs = mkCanvas();\n renderBg(cvs, f);\n put(cvs, nx(CENTER), ny(CENTER), seedCh[f % 4 as 0 | 1 | 2 | 3], seedCo[f % 4 as 0 | 1 | 2 | 3]);\n write(flush(cvs));\n write(`\\n ${CO.DIM}Seed detected...\\x1B[K${CO.VOID}\\n`);\n await sleep(60);\n }\n spawnParticles(ps, nx(CENTER), ny(CENTER), 5, 8);\n\n // Phase 2: Tendril growth\n const GSPEED = 4;\n const isGrown = new Uint8Array(nc);\n const grownAt = new Int32Array(nc).fill(999);\n isGrown[CENTER] = 1;\n grownAt[CENTER] = 0;\n const sched = order.map((_: number, g: number) => 8 + g * 2);\n const total = 8 + gc * 2 + GSPEED + 5;\n\n for (let f = 8; f < total; f++) {\n const cvs = mkCanvas();\n renderBg(cvs, f);\n\n for (let g = 0; g < gc; g++) {\n const node = order[g]!;\n if (f < sched[g]!) continue;\n isGrown[node] = 1;\n if (grownAt[node] === 999) { grownAt[node] = f; spawnParticles(ps, nx(node), ny(node), 4, f); }\n }\n\n for (let e = 0; e < ec; e++) {\n const a = ea(e), b = eb(e);\n if (!isGrown[a] || !isGrown[b]) continue;\n const minAge = Math.min(f - grownAt[a]!, f - grownAt[b]!);\n drawTendril(cvs, nx(a), ny(a), nx(b), ny(b), minAge > 12 ? CO.OLD : minAge > 6 ? CO.SETTLED : CO.WARM);\n }\n\n for (let g = 1; g < gc; g++) {\n const node = order[g]!, par = parent[g]!;\n if (f < sched[g]! || f >= sched[g]! + GSPEED) continue;\n const progress = Math.trunc((f - sched[g]!) * 100 / GSPEED);\n const [tipX, tipY] = drawTendrilPartial(cvs, nx(par), ny(par), nx(node), ny(node), CO.TIP, progress);\n if (tipX > 0 && tipY > 0) put(cvs, tipX, tipY, '*', CO.SPARK);\n }\n\n for (let i = 0; i < nc; i++) {\n if (!isGrown[i]) continue;\n const [ch, co] = growthNodeStyle(f, i, grownAt[i]!);\n put(cvs, nx(i), ny(i), ch, co);\n }\n\n renderParticles(cvs, ps, f);\n write(flush(cvs));\n let active = 0;\n for (let i = 0; i < nc; i++) if (isGrown[i]) active++;\n write(`\\n \\x1B[0;35mNodes \\x1B[1;36m${active}\\x1B[0;35m/${nc}\\x1B[0m \\x1B[0;90mGrowing neural tendrils...\\x1B[K\\x1B[0m\\n`);\n await sleep(40);\n }\n\n // Phase 3: Shimmer wave (10 frames)\n for (let f = total; f < total + 10; f++) {\n const cvs = mkCanvas();\n renderBg(cvs, f);\n const wave = (f - total) * 3;\n\n for (let e = 0; e < ec; e++) {\n const a = ea(e), b = eb(e);\n const avgY = Math.trunc((ny(a) + ny(b)) / 2);\n const d = Math.abs(avgY - wave);\n drawTendril(cvs, nx(a), ny(a), nx(b), ny(b), d < 2 ? CO.FLASH : d < 4 ? CO.ACTIVE : d < 6 ? CO.SETTLED : CO.OLD);\n }\n\n for (let i = 0; i < nc; i++) {\n const d = Math.abs(ny(i) - wave);\n if (d < 2) put(cvs, nx(i), ny(i), '@', CO.FLASH);\n else if (d < 4) put(cvs, nx(i), ny(i), '@', CO.ACTIVE);\n else put(cvs, nx(i), ny(i), 'O', CO.SETTLED);\n }\n\n renderParticles(cvs, ps, f);\n write(flush(cvs));\n write(`\\n ${CO.SETTLED}Crystallizing pathways...\\x1B[K${CO.VOID}\\n`);\n await sleep(60);\n }\n\n // Phase 4: Title reveal (15 frames)\n const TITLE = 'COMPOUND';\n const SUBTITLE = 'AGENT';\n const TX = Math.trunc((W - TITLE.length) / 2);\n const TY = 9;\n const SX = Math.trunc((W - SUBTITLE.length) / 2);\n const SY = 11;\n const TAGLINE = 'Break once. Learn forever.';\n const LX = Math.trunc((W - TAGLINE.length) / 2);\n const LY = 19;\n\n for (let f = 0; f < 15; f++) {\n const cvs = mkCanvas();\n renderBg(cvs, f);\n\n for (let e = 0; e < ec; e++) {\n drawTendril(cvs, nx(ea(e)), ny(ea(e)), nx(eb(e)), ny(eb(e)), CO.OLD);\n }\n for (let i = 0; i < nc; i++) {\n const breath = (f + i * 3) % 8;\n if (breath < 2) put(cvs, nx(i), ny(i), 'o', CO.SETTLED);\n else if (breath < 6) put(cvs, nx(i), ny(i), 'O', CO.ACTIVE);\n else put(cvs, nx(i), ny(i), 'o', CO.SETTLED);\n }\n\n let shown = Math.trunc((f + 1) * TITLE.length / 8);\n if (shown > TITLE.length) shown = TITLE.length;\n for (let c = 0; c < shown; c++) {\n put(cvs, TX + c, TY, TITLE.charAt(c), c === shown - 1 && f < 8 ? CO.FLASH : CO.TITLE);\n }\n\n if (f > 5) {\n let sub = Math.trunc((f - 5) * SUBTITLE.length / 6);\n if (sub > SUBTITLE.length) sub = SUBTITLE.length;\n for (let c = 0; c < sub; c++) {\n put(cvs, SX + c, SY, SUBTITLE.charAt(c), c === sub - 1 && f < 12 ? CO.FLASH : CO.TITLE);\n }\n }\n\n if (f > 10) {\n let tag = Math.trunc((f - 10) * TAGLINE.length / 4);\n if (tag > TAGLINE.length) tag = TAGLINE.length;\n for (let c = 0; c < tag; c++) put(cvs, LX + c, LY, TAGLINE.charAt(c), CO.DIM);\n }\n\n write(flush(cvs));\n write('\\n');\n await sleep(70);\n }\n\n // Phase 5: Breathing hold (12 frames)\n const ver = `v${VERSION}`;\n const vx = SX + SUBTITLE.length + 2;\n\n for (let f = 0; f < 12; f++) {\n const cvs = mkCanvas();\n for (let y = 1; y < H - 1; y += 3) {\n for (let x = 2; x < W - 2; x += 5) {\n if ((x + y + f) % 9 < 2) put(cvs, x, y, '.', CO.DUST);\n }\n }\n\n const bp = f % 6;\n const cco = bp < 4 && bp >= 2 ? CO.SETTLED : CO.OLD;\n for (let e = 0; e < ec; e++) {\n drawTendril(cvs, nx(ea(e)), ny(ea(e)), nx(eb(e)), ny(eb(e)), cco);\n }\n\n for (let i = 0; i < nc; i++) {\n const b = (f + i * 2) % 8;\n if (b < 2) put(cvs, nx(i), ny(i), 'o', CO.SETTLED);\n else if (b < 4) put(cvs, nx(i), ny(i), 'O', CO.ACTIVE);\n else if (b < 6) put(cvs, nx(i), ny(i), '@', CO.ACTIVE);\n else put(cvs, nx(i), ny(i), 'O', CO.SETTLED);\n }\n\n for (let c = 0; c < TITLE.length; c++) put(cvs, TX + c, TY, TITLE.charAt(c), CO.TITLE);\n for (let c = 0; c < SUBTITLE.length; c++) put(cvs, SX + c, SY, SUBTITLE.charAt(c), CO.TITLE);\n for (let c = 0; c < TAGLINE.length; c++) put(cvs, LX + c, LY, TAGLINE.charAt(c), CO.DIM);\n for (let c = 0; c < ver.length; c++) put(cvs, vx + c, SY, ver.charAt(c), CO.DIM);\n\n write(flush(cvs));\n write('\\n');\n await sleep(120);\n }\n } finally {\n process.removeListener('exit', restoreCursor);\n restoreCursor();\n write('\\n');\n\n // Let the audio reverb tail dissolve (~1.5s after animation ends).\n // The player is detached+unref'd so it won't block if Node exits early.\n if (audio) {\n await sleep(1800);\n audio.stop();\n }\n }\n}\n","/**\n * Beads CLI availability checker.\n *\n * Informational only -- never blocks setup.\n * Synchronous: uses execSync internally.\n */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/** Result of Beads CLI availability check. */\nexport interface BeadsCheckResult {\n /** Whether the `bd` CLI is available on PATH. */\n available: boolean;\n /** Informational message when not available. */\n message?: string;\n}\n\n/**\n * Check whether the Beads CLI (`bd`) is available.\n *\n * Non-blocking: never throws.\n */\nexport function checkBeadsAvailable(): BeadsCheckResult {\n try {\n execSync('command -v bd', { shell: '/bin/sh', stdio: 'pipe', encoding: 'utf-8' });\n return { available: true };\n } catch {\n return {\n available: false,\n message:\n 'Beads CLI not found. Recommended for full workflow (issue tracking, deps, TDD pipeline). Install: https://github.com/Nathandela/beads',\n };\n }\n}\n\n/** Check whether the beads repository is initialized (.beads/ directory exists). */\nexport function checkBeadsInitialized(repoRoot: string): boolean {\n return existsSync(join(repoRoot, '.beads'));\n}\n\n/** Run `bd doctor` and check if beads is healthy. Non-blocking: never throws. */\nexport function checkBeadsHealthy(repoRoot: string): { healthy: boolean; message?: string } {\n try {\n execSync('bd doctor', { cwd: repoRoot, shell: '/bin/sh', stdio: 'pipe', encoding: 'utf-8' });\n return { healthy: true };\n } catch (e: unknown) {\n const msg = e instanceof Error && 'stderr' in e ? String((e as { stderr: unknown }).stderr).trim() : 'bd doctor failed';\n return { healthy: false, message: msg };\n }\n}\n\n/** Full beads health check combining CLI, init, and doctor. */\nexport interface BeadsFullCheck {\n cliAvailable: boolean;\n initialized: boolean;\n healthy: boolean;\n healthMessage?: string;\n}\n\nexport function runFullBeadsCheck(repoRoot: string): BeadsFullCheck {\n const cli = checkBeadsAvailable();\n if (!cli.available) {\n return { cliAvailable: false, initialized: false, healthy: false, healthMessage: cli.message };\n }\n const initialized = checkBeadsInitialized(repoRoot);\n if (!initialized) {\n return { cliAvailable: true, initialized: false, healthy: false };\n }\n const health = checkBeadsHealthy(repoRoot);\n return { cliAvailable: true, initialized: true, healthy: health.healthy, healthMessage: health.message };\n}\n","/**\n * Quality filters for lesson capture\n *\n * Filters to ensure lessons are:\n * - Novel (not duplicate)\n * - Specific (not vague)\n *\n * Actionability check is available but not part of the capture gate.\n * Strategy: capture aggressively, prune later.\n */\n\nimport { searchKeyword, syncIfNeeded } from '../storage/index.js';\nimport type { MemoryItem } from '../types.js';\n\n/** Default similarity threshold for duplicate detection */\nconst DEFAULT_SIMILARITY_THRESHOLD = 0.8;\n\n/** Result of novelty check */\nexport interface NoveltyResult {\n novel: boolean;\n reason?: string;\n existingId?: string;\n}\n\n/** Options for novelty check */\nexport interface NoveltyOptions {\n threshold?: number;\n}\n\n/**\n * Check if an insight is novel (not a duplicate of existing lessons).\n * Uses keyword search to find potentially similar lessons.\n */\nexport async function isNovel(\n repoRoot: string,\n insight: string,\n options: NoveltyOptions = {}\n): Promise<NoveltyResult> {\n const threshold = options.threshold ?? DEFAULT_SIMILARITY_THRESHOLD;\n\n // Sync index if JSONL has changed\n await syncIfNeeded(repoRoot);\n\n // Extract key words for search (take first 3 significant words)\n const words = insight\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n .slice(0, 3);\n\n if (words.length === 0) {\n return { novel: true };\n }\n\n // Search for each word and collect results\n const searchQuery = words.join(' OR ');\n const results = await searchKeyword(repoRoot, searchQuery, 10);\n\n if (results.length === 0) {\n return { novel: true };\n }\n\n return checkSimilarity(insight, results, threshold);\n}\n\n/**\n * Check similarity between insight and existing lessons using Jaccard similarity.\n */\nfunction checkSimilarity(\n insight: string,\n lessons: MemoryItem[],\n threshold: number\n): NoveltyResult {\n const insightWords = new Set(insight.toLowerCase().split(/\\s+/));\n\n for (const lesson of lessons) {\n const lessonWords = new Set(lesson.insight.toLowerCase().split(/\\s+/));\n\n // Calculate Jaccard similarity\n const intersection = [...insightWords].filter((w) => lessonWords.has(w)).length;\n const union = new Set([...insightWords, ...lessonWords]).size;\n const similarity = union > 0 ? intersection / union : 0;\n\n if (similarity >= threshold) {\n return {\n novel: false,\n reason: `Found similar existing lesson: \"${lesson.insight.slice(0, 50)}...\"`,\n existingId: lesson.id,\n };\n }\n }\n\n return { novel: true };\n}\n\n/** Minimum word count for a specific insight */\nconst MIN_WORD_COUNT = 4;\n\n/** Vague patterns that indicate non-specific advice */\nconst VAGUE_PATTERNS = [\n /\\bwrite better\\b/i,\n /\\bbe careful\\b/i,\n /\\bremember to\\b/i,\n /\\bmake sure\\b/i,\n /\\btry to\\b/i,\n /\\bdouble check\\b/i,\n];\n\n/** Generic \"always/never\" phrases (short, lacking specificity) */\nconst GENERIC_IMPERATIVE_PATTERN = /^(always|never)\\s+\\w+(\\s+\\w+){0,2}$/i;\n\n/** Result of specificity check */\nexport interface SpecificityResult {\n specific: boolean;\n reason?: string;\n}\n\n/**\n * Check if an insight is specific enough to be useful.\n * Rejects vague, generic advice that doesn't provide actionable guidance.\n */\nexport function isSpecific(insight: string): SpecificityResult {\n // Check minimum length first\n const words = insight.trim().split(/\\s+/).filter((w) => w.length > 0);\n if (words.length < MIN_WORD_COUNT) {\n return { specific: false, reason: 'Insight is too short to be actionable' };\n }\n\n // Check for vague patterns\n for (const pattern of VAGUE_PATTERNS) {\n if (pattern.test(insight)) {\n return { specific: false, reason: 'Insight matches a vague pattern' };\n }\n }\n\n // Check for generic \"Always X\" or \"Never X\" phrases\n if (GENERIC_IMPERATIVE_PATTERN.test(insight)) {\n return { specific: false, reason: 'Insight matches a vague pattern' };\n }\n\n return { specific: true };\n}\n\n/** Action word patterns that indicate actionable guidance */\nconst ACTION_PATTERNS = [\n /\\buse\\s+.+\\s+instead\\s+of\\b/i, // \"use X instead of Y\"\n /\\bprefer\\s+.+\\s+(over|to)\\b/i, // \"prefer X over Y\" or \"prefer X to Y\"\n /\\balways\\s+.+\\s+when\\b/i, // \"always X when Y\"\n /\\bnever\\s+.+\\s+without\\b/i, // \"never X without Y\"\n /\\bavoid\\s+(using\\s+)?\\w+/i, // \"avoid X\" or \"avoid using X\"\n /\\bcheck\\s+.+\\s+before\\b/i, // \"check X before Y\"\n /^(run|use|add|remove|install|update|configure|set|enable|disable)\\s+/i, // Imperative commands at start\n];\n\n/** Result of actionability check */\nexport interface ActionabilityResult {\n actionable: boolean;\n reason?: string;\n}\n\n/**\n * Check if an insight contains actionable guidance.\n * Returns false for pure observations or questions.\n */\nexport function isActionable(insight: string): ActionabilityResult {\n // Check for action patterns\n for (const pattern of ACTION_PATTERNS) {\n if (pattern.test(insight)) {\n return { actionable: true };\n }\n }\n\n return { actionable: false, reason: 'Insight lacks clear action guidance' };\n}\n\n/** Result of combined quality check */\nexport interface ProposeResult {\n shouldPropose: boolean;\n reason?: string;\n}\n\n/**\n * Combined quality check for lesson proposals.\n * Returns true only if insight is novel AND specific.\n * Actionability gate removed: capture aggressively, prune later.\n */\nexport async function shouldPropose(\n repoRoot: string,\n insight: string\n): Promise<ProposeResult> {\n // Check specificity first (fast, no DB)\n const specificResult = isSpecific(insight);\n if (!specificResult.specific) {\n return { shouldPropose: false, reason: specificResult.reason };\n }\n\n // Check novelty (requires DB lookup)\n const noveltyResult = await isNovel(repoRoot, insight);\n if (!noveltyResult.novel) {\n return { shouldPropose: false, reason: noveltyResult.reason };\n }\n\n return { shouldPropose: true };\n}\n","/**\n * Trigger detection for automatic memory capture\n *\n * Detects patterns that indicate potential learning opportunities:\n * - User corrections\n * - Self-corrections\n * - Test failures\n *\n * Also infers memory item type from insight text:\n * - pattern: \"use X instead of Y\", \"prefer X over Y\"\n * - solution: \"when X, do Y\", \"if X then Y\", \"to fix X\"\n * - preference: \"always X\", \"never X\"\n * - lesson: default for unclassified insights\n */\n\nimport type { Context, MemoryItemType } from '../types.js';\n\n/** Signal data for correction detection */\nexport interface CorrectionSignal {\n messages: string[];\n context: Context;\n}\n\n/** Detected correction result */\nexport interface DetectedCorrection {\n trigger: string;\n correctionMessage: string;\n context: Context;\n}\n\n/** User correction patterns */\nconst USER_CORRECTION_PATTERNS = [\n /\\bno\\b[,.]?\\s/i, // \"no, ...\" or \"no ...\"\n /\\bwrong\\b/i, // \"wrong\"\n /\\bactually\\b/i, // \"actually...\"\n /\\bnot that\\b/i, // \"not that\"\n /\\bi meant\\b/i, // \"I meant\"\n];\n\n/**\n * Detect user correction signals in conversation.\n *\n * Looks for patterns that indicate the user is correcting Claude's\n * understanding or actions.\n *\n * @param signals - Messages and context to analyze\n * @returns Detected correction or null if none found\n */\nexport function detectUserCorrection(signals: CorrectionSignal): DetectedCorrection | null {\n const { messages, context } = signals;\n\n if (messages.length < 2) {\n return null;\n }\n\n // Check later messages for correction patterns\n for (let i = 1; i < messages.length; i++) {\n const message = messages[i];\n if (!message) continue;\n\n for (const pattern of USER_CORRECTION_PATTERNS) {\n if (pattern.test(message)) {\n return {\n trigger: `User correction during ${context.intent}`,\n correctionMessage: message,\n context,\n };\n }\n }\n }\n\n return null;\n}\n\n/** Edit history entry */\nexport interface EditEntry {\n file: string;\n success: boolean;\n timestamp: number;\n}\n\n/** Edit history for self-correction detection */\nexport interface EditHistory {\n edits: EditEntry[];\n}\n\n/** Detected self-correction */\nexport interface DetectedSelfCorrection {\n file: string;\n trigger: string;\n}\n\n/**\n * Detect self-correction patterns in edit history.\n *\n * Looks for edit→fail→re-edit patterns on the same file,\n * which indicate Claude had to correct its own work.\n *\n * @param history - Edit history to analyze\n * @returns Detected self-correction or null if none found\n */\nexport function detectSelfCorrection(history: EditHistory): DetectedSelfCorrection | null {\n const { edits } = history;\n\n if (edits.length < 3) {\n return null;\n }\n\n // Look for edit→fail→re-edit pattern on same file\n for (let i = 0; i <= edits.length - 3; i++) {\n const first = edits[i];\n const second = edits[i + 1];\n const third = edits[i + 2];\n\n if (!first || !second || !third) continue;\n\n // Pattern: success → fail → success on same file\n if (\n first.file === second.file &&\n second.file === third.file &&\n first.success &&\n !second.success &&\n third.success\n ) {\n return {\n file: first.file,\n trigger: `Self-correction on ${first.file}`,\n };\n }\n }\n\n return null;\n}\n\n/** Test result for failure detection */\nexport interface TestResult {\n passed: boolean;\n output: string;\n testFile: string;\n}\n\n/** Detected test failure */\nexport interface DetectedTestFailure {\n testFile: string;\n errorOutput: string;\n trigger: string;\n}\n\n/**\n * Detect test failure patterns.\n *\n * When tests fail, this creates a potential learning opportunity\n * if the failure is later fixed.\n *\n * @param testResult - Test result to analyze\n * @returns Detected test failure or null if tests passed\n */\nexport function detectTestFailure(testResult: TestResult): DetectedTestFailure | null {\n if (testResult.passed) {\n return null;\n }\n\n // Extract first meaningful error line for trigger\n const lines = testResult.output.split('\\n').filter((line) => line.trim().length > 0);\n const errorLine = lines.find((line) => /error|fail|assert/i.test(line)) ?? lines[0] ?? '';\n\n return {\n testFile: testResult.testFile,\n errorOutput: testResult.output,\n trigger: `Test failure in ${testResult.testFile}: ${errorLine.slice(0, 100)}`,\n };\n}\n\n/** Patterns indicating a code pattern (bad -> good transformation) */\nconst PATTERN_INDICATORS = [\n /\\buse\\s+.+\\s+instead\\s+of\\b/i,\n /\\bprefer\\s+.+\\s+(over|to)\\b/i,\n];\n\n/** Patterns indicating a solution (problem -> resolution) */\nconst SOLUTION_INDICATORS = [\n /\\bwhen\\s+.+,\\s/i,\n /\\bif\\s+.+\\bthen\\b/i,\n /\\bif\\s+.+,\\s/i,\n /\\bto\\s+fix\\b/i,\n];\n\n/** Patterns indicating a preference (user workflow choice) */\nconst PREFERENCE_INDICATORS = [\n /\\balways\\s+/i,\n /\\bnever\\s+/i,\n];\n\n/**\n * Infer the memory item type from insight text.\n *\n * Rules (checked in priority order):\n * - \"use X instead of Y\" / \"prefer X over Y\" → pattern\n * - \"when X, do Y\" / \"if X then Y\" / \"to fix X\" → solution\n * - \"always X\" / \"never X\" → preference\n * - Default → lesson\n *\n * @param insight - The insight text to classify\n * @returns The inferred memory item type\n */\nexport function inferMemoryItemType(insight: string): MemoryItemType {\n for (const pattern of PATTERN_INDICATORS) {\n if (pattern.test(insight)) return 'pattern';\n }\n\n for (const pattern of SOLUTION_INDICATORS) {\n if (pattern.test(insight)) return 'solution';\n }\n\n for (const pattern of PREFERENCE_INDICATORS) {\n if (pattern.test(insight)) return 'preference';\n }\n\n return 'lesson';\n}\n","/**\n * Trigger detection integration\n *\n * Orchestrates detection -> quality filter -> memory item proposal flow.\n * Infers memory item type from insight content.\n * Provides a high-level API for CLI and hooks.\n */\n\nimport * as fs from 'node:fs/promises';\n\nimport { z } from 'zod';\n\nimport { ContextSchema } from '../types.js';\nimport type { MemoryItemType, Source } from '../types.js';\nimport { shouldPropose } from './quality.js';\nimport {\n detectUserCorrection,\n detectSelfCorrection,\n detectTestFailure,\n inferMemoryItemType,\n} from './triggers.js';\nimport type {\n CorrectionSignal,\n EditHistory,\n TestResult,\n} from './triggers.js';\n\n/** Detection input types */\nexport type DetectionType = 'user' | 'self' | 'test';\n\n/** Input for user correction detection */\nexport interface UserDetectionInput {\n type: 'user';\n data: CorrectionSignal;\n}\n\n/** Input for self correction detection */\nexport interface SelfDetectionInput {\n type: 'self';\n data: EditHistory;\n}\n\n/** Input for test failure detection */\nexport interface TestDetectionInput {\n type: 'test';\n data: TestResult;\n}\n\n/** Union type for all detection inputs */\nexport type DetectionInput = UserDetectionInput | SelfDetectionInput | TestDetectionInput;\n\n/** Result of successful detection */\nexport interface DetectionResult {\n trigger: string;\n source: Source;\n proposedInsight: string;\n memoryItemType: MemoryItemType;\n}\n\n/**\n * Detect triggers and propose lessons.\n *\n * Runs the appropriate detector based on input type, then filters\n * through quality checks. Returns a proposal if detection passes\n * all quality filters.\n *\n * @param repoRoot - Repository root path\n * @param input - Detection input with type and data\n * @returns Detection result with proposed insight, or null\n */\nexport async function detectAndPropose(\n repoRoot: string,\n input: DetectionInput\n): Promise<DetectionResult | null> {\n const detected = runDetector(input);\n if (!detected) {\n return null;\n }\n\n const { trigger, source, proposedInsight } = detected;\n\n // Run quality filters on proposed insight\n const quality = await shouldPropose(repoRoot, proposedInsight);\n if (!quality.shouldPropose) {\n return null;\n }\n\n // Infer memory item type from insight content\n const memoryItemType = inferMemoryItemType(proposedInsight);\n\n return { trigger, source, proposedInsight, memoryItemType };\n}\n\n/** Internal detection result before quality filtering */\ninterface RawDetection {\n trigger: string;\n source: Source;\n proposedInsight: string;\n}\n\n/**\n * Run the appropriate detector based on input type.\n */\nfunction runDetector(input: DetectionInput): RawDetection | null {\n switch (input.type) {\n case 'user':\n return detectUserCorrectionFlow(input.data);\n case 'self':\n return detectSelfCorrectionFlow(input.data);\n case 'test':\n return detectTestFailureFlow(input.data);\n }\n}\n\n/**\n * Detect user correction and extract insight.\n */\nfunction detectUserCorrectionFlow(data: CorrectionSignal): RawDetection | null {\n const result = detectUserCorrection(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'user_correction',\n proposedInsight: result.correctionMessage,\n };\n}\n\n/**\n * Detect self correction and extract insight.\n */\nfunction detectSelfCorrectionFlow(data: EditHistory): RawDetection | null {\n const result = detectSelfCorrection(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'self_correction',\n // Self-corrections need context to form useful insights\n proposedInsight: `Check ${result.file} for common errors before editing`,\n };\n}\n\n/**\n * Detect test failure and extract insight.\n */\nfunction detectTestFailureFlow(data: TestResult): RawDetection | null {\n const result = detectTestFailure(data);\n if (!result) {\n return null;\n }\n\n return {\n trigger: result.trigger,\n source: 'test_failure',\n proposedInsight: result.errorOutput,\n };\n}\n\n/** Zod schema for CorrectionSignal */\nconst CorrectionSignalSchema = z.object({\n messages: z.array(z.string()),\n context: ContextSchema,\n});\n\n/** Zod schema for EditEntry */\nconst EditEntrySchema = z.object({\n file: z.string(),\n success: z.boolean(),\n timestamp: z.number(),\n});\n\n/** Zod schema for EditHistory */\nconst EditHistorySchema = z.object({\n edits: z.array(EditEntrySchema),\n});\n\n/** Zod schema for TestResult */\nconst TestResultSchema = z.object({\n passed: z.boolean(),\n output: z.string(),\n testFile: z.string(),\n});\n\n/** Zod discriminated union for DetectionInput */\nconst DetectionInputSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('user'), data: CorrectionSignalSchema }),\n z.object({ type: z.literal('self'), data: EditHistorySchema }),\n z.object({ type: z.literal('test'), data: TestResultSchema }),\n]);\n\n/**\n * Parse detection input from a JSON file.\n *\n * @param filePath - Path to JSON input file\n * @returns Parsed detection input\n * @throws ZodError if file content doesn't match expected schema\n */\nexport async function parseInputFile(filePath: string): Promise<DetectionInput> {\n const content = await fs.readFile(filePath, 'utf-8');\n const data: unknown = JSON.parse(content);\n return DetectionInputSchema.parse(data);\n}\n","/**\n * Session-start lesson retrieval\n *\n * Loads high-severity lessons at the start of a session.\n * No vector search - just filter by severity and recency.\n */\n\nimport { incrementRetrievalCount, readMemoryItems } from '../storage/index.js';\nimport type { MemoryItem, Severity } from '../types.js';\n\n/** Default number of lessons to load at session start */\nconst DEFAULT_LIMIT = 5;\n\n/** A memory item with severity field present */\ntype LessonWithSeverity = MemoryItem & { severity: Severity };\n\n/**\n * Type guard to check if a memory item has severity set\n */\nfunction hasSeverity(item: MemoryItem): item is MemoryItem & { severity: Severity } {\n return item.severity !== undefined;\n}\n\n/**\n * Load high-severity lessons for session start.\n *\n * Returns confirmed, high-severity lessons sorted by recency.\n * These are the most important lessons to surface at the start\n * of a coding session.\n *\n * @param repoRoot - Repository root directory\n * @param limit - Maximum number of lessons to return (default: 5)\n * @returns Array of high-severity lessons, most recent first\n */\nexport async function loadSessionLessons(\n repoRoot: string,\n limit: number = DEFAULT_LIMIT\n): Promise<LessonWithSeverity[]> {\n const { items } = await readMemoryItems(repoRoot);\n\n // Filter for high-severity, confirmed items of any type (excluding invalidated)\n const highSeverityLessons = items.filter(\n (item): item is MemoryItem & { severity: Severity } =>\n hasSeverity(item) &&\n item.severity === 'high' &&\n item.confirmed &&\n !item.invalidatedAt\n );\n\n // Sort by recency (most recent first)\n highSeverityLessons.sort((a, b) => {\n const dateA = new Date(a.created).getTime();\n const dateB = new Date(b.created).getTime();\n return dateB - dateA;\n });\n\n // Return top N and track surfaced lessons as retrieved.\n const topLessons = highSeverityLessons.slice(0, limit);\n if (topLessons.length > 0) {\n incrementRetrievalCount(repoRoot, topLessons.map((lesson) => lesson.id));\n }\n\n return topLessons;\n}\n","/**\n * Plan-time lesson retrieval\n *\n * Retrieves relevant lessons when planning an implementation.\n * Uses vector search to find semantically similar lessons.\n */\n\nimport { rankLessons, searchVector, type RankedLesson, type ScoredLesson } from '../search/index.js';\nimport { incrementRetrievalCount } from '../storage/index.js';\n\n/** Default number of lessons to retrieve */\nconst DEFAULT_LIMIT = 5;\n\n/** Result of plan-time retrieval */\nexport interface PlanRetrievalResult {\n lessons: RankedLesson[];\n message: string;\n}\n\n/**\n * Retrieve relevant lessons for a plan.\n *\n * Uses vector search to find semantically similar lessons,\n * then applies ranking boosts for severity, recency, and confirmation.\n *\n * Hard-fails if embeddings are unavailable (propagates error from embedText).\n *\n * @param repoRoot - Repository root directory\n * @param planText - The plan text to search against\n * @param limit - Maximum number of lessons to return (default: 5)\n * @returns Ranked lessons and formatted message\n */\nexport async function retrieveForPlan(\n repoRoot: string,\n planText: string,\n limit: number = DEFAULT_LIMIT\n): Promise<PlanRetrievalResult> {\n // Get lessons by vector similarity (will throw if embeddings unavailable)\n const scored = await searchVector(repoRoot, planText, { limit: limit * 2 });\n\n // Apply ranking boosts\n const ranked = rankLessons(scored);\n\n // Take top N after ranking\n const topLessons = ranked.slice(0, limit);\n\n // Track actual plan-time retrieval usage only for surfaced lessons.\n if (topLessons.length > 0) {\n incrementRetrievalCount(repoRoot, topLessons.map((item) => item.lesson.id));\n }\n\n // Format the Lessons Check message\n const message = formatLessonsCheck(topLessons);\n\n return { lessons: topLessons, message };\n}\n\n/**\n * Format a \"Lessons Check\" message for display.\n *\n * This message is intended to be shown at plan-time to remind\n * the developer of relevant lessons before implementation.\n *\n * @param lessons - Ranked lessons to include in the message\n * @returns Formatted message string\n */\nexport function formatLessonsCheck(lessons: ScoredLesson[]): string {\n const header = 'Lessons Check\\n' + '─'.repeat(40);\n\n if (lessons.length === 0) {\n return `${header}\\nNo relevant lessons found for this plan.`;\n }\n\n const lessonLines = lessons.map((l, i) => {\n const bullet = `${i + 1}.`;\n const insight = l.lesson.insight;\n return `${bullet} ${insight}`;\n });\n\n return `${header}\\n${lessonLines.join('\\n')}`;\n}\n","/**\n * Lessons audit check.\n *\n * Surfaces high-severity lessons as info-level findings.\n */\n\nimport { LESSONS_PATH, readMemoryItems } from '../../memory/storage/index.js';\nimport type { AuditCheckResult } from '../types.js';\n\n/**\n * Check for high-severity lessons and return as info findings.\n *\n * @param repoRoot - Repository root directory\n * @returns Audit check result with findings and filesChecked\n */\nexport async function checkLessons(repoRoot: string): Promise<AuditCheckResult> {\n const { items } = await readMemoryItems(repoRoot);\n const findings: AuditCheckResult['findings'] = [];\n\n for (const item of items) {\n if (item.severity === 'high') {\n findings.push({\n file: '',\n issue: `High-severity lesson: ${item.insight}`,\n severity: 'info',\n relatedLessonId: item.id,\n source: 'lesson',\n });\n }\n }\n\n const filesChecked = items.length > 0 ? [LESSONS_PATH] : [];\n return { findings, filesChecked };\n}\n","/**\n * Zod schemas for rule configuration.\n *\n * Rules are defined in .claude/rules.json and describe mechanical checks\n * that can be run against a codebase.\n */\n\nimport { z } from 'zod';\n\n/** Rule severity levels. */\nexport const SeveritySchema = z.enum(['error', 'warning', 'info']);\n\n/** File-pattern check: regex match on files matching a glob. */\nexport const FilePatternCheckSchema = z.object({\n type: z.literal('file-pattern'),\n glob: z.string(),\n pattern: z.string(),\n mustMatch: z.boolean().optional(),\n});\n\n/** File-size check: line count limit on files matching a glob. */\nexport const FileSizeCheckSchema = z.object({\n type: z.literal('file-size'),\n glob: z.string(),\n maxLines: z.number().int().positive(),\n});\n\n/** Script check: run a shell command and check exit code. */\nexport const ScriptCheckSchema = z.object({\n type: z.literal('script'),\n command: z.string(),\n expectExitCode: z.number().int().optional(),\n});\n\n/** Discriminated union of all check types. */\nexport const RuleCheckSchema = z.discriminatedUnion('type', [\n FilePatternCheckSchema,\n FileSizeCheckSchema,\n ScriptCheckSchema,\n]);\n\n/** A single rule definition. */\nexport const RuleSchema = z.object({\n id: z.string().min(1),\n description: z.string(),\n severity: SeveritySchema,\n check: RuleCheckSchema,\n remediation: z.string(),\n});\n\n/** Top-level rule configuration file schema. */\nexport const RuleConfigSchema = z.object({\n rules: z.array(RuleSchema),\n});\n\n// Type exports\nexport type Severity = z.infer<typeof SeveritySchema>;\nexport type FilePatternCheck = z.infer<typeof FilePatternCheckSchema>;\nexport type FileSizeCheck = z.infer<typeof FileSizeCheckSchema>;\nexport type ScriptCheck = z.infer<typeof ScriptCheckSchema>;\nexport type RuleCheck = z.infer<typeof RuleCheckSchema>;\nexport type Rule = z.infer<typeof RuleSchema>;\nexport type RuleConfig = z.infer<typeof RuleConfigSchema>;\n","/**\n * Simple glob-like file finder using Node.js built-in fs.\n *\n * Supports basic glob patterns: **, *, and extension matching.\n * No external dependencies required.\n */\n\nimport { readdirSync, statSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\n/**\n * Convert a simple glob pattern to a regex.\n * Supports: ** (any path), * (any segment), .ext matching.\n *\n * @param glob - Glob pattern (e.g., \"**\\/*.ts\", \"src/*.js\")\n * @returns RegExp that matches the pattern\n */\nexport function globToRegex(glob: string): RegExp {\n const pattern = glob\n .replace(/\\./g, '\\\\.') // escape dots\n .replace(/\\*\\*\\//g, '(.+/)?') // ** matches any directory depth\n .replace(/\\*/g, '[^/]*'); // * matches within a single segment\n return new RegExp(`^${pattern}$`);\n}\n\n/**\n * Find files in baseDir matching a glob pattern.\n *\n * @param baseDir - Root directory to search from\n * @param glob - Glob pattern to match\n * @returns Array of relative file paths matching the pattern\n */\nexport function findFiles(baseDir: string, glob: string): string[] {\n const regex = globToRegex(glob);\n const results: string[] = [];\n\n function walk(dir: string): void {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n // Skip hidden directories and node_modules\n if (entry.startsWith('.') || entry === 'node_modules') continue;\n\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n walk(fullPath);\n } else {\n const relPath = relative(baseDir, fullPath);\n if (regex.test(relPath)) {\n results.push(relPath);\n }\n }\n }\n }\n\n walk(baseDir);\n return results.sort();\n}\n","/**\n * File-pattern rule check implementation.\n *\n * Scans files matching a glob for a regex pattern.\n * By default, matches are violations. With mustMatch=true,\n * files missing the pattern are violations.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { FilePatternCheck } from '../types.js';\nimport type { Violation } from '../engine.js';\n\nimport { findFiles } from './glob-utils.js';\n\n/**\n * Run a file-pattern check against files in baseDir.\n *\n * @param baseDir - Root directory to search from\n * @param check - The file-pattern check configuration\n * @returns Array of violations found\n */\nexport function runFilePatternCheck(\n baseDir: string,\n check: FilePatternCheck,\n): Violation[] {\n const files = findFiles(baseDir, check.glob);\n const regex = new RegExp(check.pattern);\n const violations: Violation[] = [];\n\n for (const file of files) {\n const fullPath = join(baseDir, file);\n const content = readFileSync(fullPath, 'utf-8');\n const lines = content.split('\\n');\n\n if (check.mustMatch) {\n const found = lines.some((line) => regex.test(line));\n if (!found) {\n violations.push({\n file,\n message: `Pattern ${check.pattern} missing from file`,\n });\n }\n } else {\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i]!)) {\n violations.push({\n file,\n line: i + 1,\n message: `Pattern ${check.pattern} matched`,\n });\n }\n }\n }\n }\n\n return violations;\n}\n","/**\n * File-size rule check implementation.\n *\n * Checks that files matching a glob do not exceed a line count limit.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { FileSizeCheck } from '../types.js';\nimport type { Violation } from '../engine.js';\n\nimport { findFiles } from './glob-utils.js';\n\n/**\n * Run a file-size check against files in baseDir.\n *\n * @param baseDir - Root directory to search from\n * @param check - The file-size check configuration\n * @returns Array of violations found\n */\nexport function runFileSizeCheck(\n baseDir: string,\n check: FileSizeCheck,\n): Violation[] {\n const files = findFiles(baseDir, check.glob);\n const violations: Violation[] = [];\n\n for (const file of files) {\n const content = readFileSync(join(baseDir, file), 'utf-8');\n // Count non-empty trailing: split and filter trailing empty from final newline\n const lineCount = content === '' ? 0 : content.split('\\n').filter((_, i, arr) => i < arr.length - 1 || arr[i] !== '').length;\n\n if (lineCount > check.maxLines) {\n violations.push({\n file,\n message: `File has ${lineCount} lines, exceeds limit of ${check.maxLines}`,\n });\n }\n }\n\n return violations;\n}\n","/**\n * Script rule check implementation.\n *\n * Runs a shell command and checks the exit code.\n */\n\nimport { execSync } from 'node:child_process';\n\nimport type { ScriptCheck } from '../types.js';\nimport type { Violation } from '../engine.js';\n\n/**\n * Run a script check by executing a shell command.\n *\n * @param check - The script check configuration\n * @returns Array of violations (empty if command exits with expected code)\n */\nexport function runScriptCheck(check: ScriptCheck, baseDir?: string): Violation[] {\n const expectedCode = check.expectExitCode ?? 0;\n\n try {\n execSync(check.command, { stdio: ['pipe', 'pipe', 'pipe'], cwd: baseDir });\n // Exit code 0\n if (expectedCode !== 0) {\n return [{ message: `Script exited with exit code 0, expected ${expectedCode}` }];\n }\n return [];\n } catch (err: unknown) {\n const exitCode = (err as { status?: number }).status ?? 1;\n if (exitCode === expectedCode) {\n return [];\n }\n const stderr = ((err as { stderr?: Buffer }).stderr ?? Buffer.alloc(0))\n .toString('utf-8')\n .trim();\n const msg = stderr\n ? `Script exited with exit code ${exitCode} (expected ${expectedCode}): ${stderr}`\n : `Script exited with exit code ${exitCode} (expected ${expectedCode})`;\n return [{ message: msg }];\n }\n}\n","/**\n * Rule engine: loads config, runs checks, formats output.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { RuleConfigSchema } from './types.js';\nimport type { Rule, RuleConfig } from './types.js';\n\nimport { runFilePatternCheck } from './checks/file-pattern.js';\nimport { runFileSizeCheck } from './checks/file-size.js';\nimport { runScriptCheck } from './checks/script.js';\n\n/** A single violation found by a rule check. */\nexport interface Violation {\n file?: string;\n line?: number;\n message: string;\n}\n\n/** Result of running a single rule. */\nexport interface RuleResult {\n rule: Rule;\n violations: Violation[];\n passed: boolean;\n}\n\n/** Severity label mapping for output formatting. */\nconst SEVERITY_LABELS: Record<string, string> = {\n error: 'ERROR',\n warning: 'WARN',\n info: 'INFO',\n};\n\n/**\n * Load rule configuration from .claude/rules.json.\n *\n * @param baseDir - Repository root directory\n * @returns Parsed rule configuration (empty rules if no config file)\n * @throws On invalid JSON or schema validation failure\n */\nexport function loadRuleConfig(baseDir: string): RuleConfig {\n const configPath = join(baseDir, '.claude', 'rules.json');\n if (!existsSync(configPath)) {\n return { rules: [] };\n }\n\n const raw = readFileSync(configPath, 'utf-8');\n const json: unknown = JSON.parse(raw);\n return RuleConfigSchema.parse(json);\n}\n\n/**\n * Run all rules against the codebase.\n *\n * @param baseDir - Repository root directory\n * @param rules - Array of rules to check\n * @returns Array of results, one per rule\n */\nexport function runRules(baseDir: string, rules: Rule[]): RuleResult[] {\n return rules.map((rule) => {\n try {\n const violations = runCheck(baseDir, rule);\n return { rule, violations, passed: violations.length === 0 };\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Rule check failed';\n return { rule, violations: [{ message: `Rule check error: ${message}` }], passed: false };\n }\n });\n}\n\n/**\n * Format a single violation as an agent-legible line.\n *\n * Format: SEVERITY [rules] rule-id: file:line -- remediation\n *\n * @param rule - The rule that was violated\n * @param violation - The specific violation\n * @returns Formatted single-line string\n */\nexport function formatViolation(rule: Rule, violation: Violation): string {\n const label = SEVERITY_LABELS[rule.severity] ?? 'INFO';\n const location = violation.file\n ? violation.line\n ? `${violation.file}:${violation.line}`\n : violation.file\n : '';\n const locationPart = location ? ` ${location} --` : '';\n const messagePart = violation.message ? ` ${violation.message} --` : '';\n return `${label} [rules] ${rule.id}:${locationPart}${messagePart} ${rule.remediation}`;\n}\n\n/** Dispatch a rule check to the appropriate handler. */\nfunction runCheck(baseDir: string, rule: Rule): Violation[] {\n switch (rule.check.type) {\n case 'file-pattern':\n return runFilePatternCheck(baseDir, rule.check);\n case 'file-size':\n return runFileSizeCheck(baseDir, rule.check);\n case 'script':\n return runScriptCheck(rule.check, baseDir);\n }\n}\n","/**\n * Patterns audit check.\n *\n * Searches source files for known bad patterns from memory items.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { readMemoryItems } from '../../memory/storage/index.js';\nimport { findFiles } from '../../rules/index.js';\nimport type { AuditCheckResult } from '../types.js';\n\n/**\n * Check for bad patterns in source files.\n *\n * @param repoRoot - Repository root directory\n * @returns Audit check result with findings and filesChecked\n */\nexport async function checkPatterns(repoRoot: string): Promise<AuditCheckResult> {\n const { items } = await readMemoryItems(repoRoot);\n\n // Filter items that have pattern.bad defined\n const patterned = items.filter((item) => item.pattern?.bad);\n if (patterned.length === 0) {\n return { findings: [], filesChecked: [] };\n }\n\n // Find source files to scan\n const sourceFiles = findFiles(repoRoot, '**/*.ts');\n const findings: AuditCheckResult['findings'] = [];\n\n for (const item of patterned) {\n const bad = item.pattern!.bad;\n for (const relPath of sourceFiles) {\n const content = readFileSync(join(repoRoot, relPath), 'utf-8');\n if (content.includes(bad)) {\n findings.push({\n file: relPath,\n issue: `Bad pattern found: \"${bad}\" (${item.insight})`,\n severity: 'warning',\n relatedLessonId: item.id,\n suggestedFix: item.pattern!.good ? `Use: ${item.pattern!.good}` : undefined,\n source: 'pattern',\n });\n }\n }\n }\n\n return { findings, filesChecked: sourceFiles };\n}\n","/**\n * Rules audit check.\n *\n * Wraps loadRuleConfig + runRules and converts violations to AuditFinding format.\n */\n\nimport { loadRuleConfig, runRules } from '../../rules/index.js';\nimport type { AuditCheckResult } from '../types.js';\n\n/**\n * Check rules and return findings with files checked.\n *\n * @param repoRoot - Repository root directory\n * @returns Audit check result with findings and filesChecked\n */\nexport function checkRules(repoRoot: string): AuditCheckResult {\n let config;\n try {\n config = loadRuleConfig(repoRoot);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to load rules config';\n return {\n findings: [{\n file: '.claude/rules.json',\n issue: `Invalid rules configuration: ${message}`,\n severity: 'error',\n source: 'rule',\n }],\n filesChecked: [],\n };\n }\n\n if (config.rules.length === 0) {\n return { findings: [], filesChecked: [] };\n }\n\n const results = runRules(repoRoot, config.rules);\n const findings: AuditCheckResult['findings'] = [];\n const filesCheckedSet = new Set<string>();\n\n for (const result of results) {\n for (const violation of result.violations) {\n if (violation.file) {\n filesCheckedSet.add(violation.file);\n }\n findings.push({\n file: violation.file ?? '',\n issue: violation.message,\n severity: result.rule.severity,\n suggestedFix: result.rule.remediation,\n source: 'rule',\n });\n }\n }\n\n return { findings, filesChecked: [...filesCheckedSet] };\n}\n","/**\n * Audit engine: orchestrates checks and builds report.\n */\n\nimport { checkLessons } from './checks/lessons.js';\nimport { checkPatterns } from './checks/patterns.js';\nimport { checkRules } from './checks/rules.js';\nimport type { AuditCheckResult, AuditFinding, AuditOptions, AuditReport } from './types.js';\n\n/**\n * Run audit checks and build a report.\n *\n * @param repoRoot - Repository root directory\n * @param options - Toggle individual checks (all enabled by default)\n * @returns Complete audit report with findings and summary\n */\nexport async function runAudit(\n repoRoot: string,\n options: AuditOptions = {}\n): Promise<AuditReport> {\n const { includeRules = true, includePatterns = true, includeLessons = true } = options;\n\n const findings: AuditFinding[] = [];\n const allCheckedFiles = new Set<string>();\n\n function collect(result: AuditCheckResult): void {\n findings.push(...result.findings);\n for (const f of result.filesChecked) {\n allCheckedFiles.add(f);\n }\n }\n\n if (includeRules) {\n collect(checkRules(repoRoot));\n }\n\n if (includePatterns) {\n collect(await checkPatterns(repoRoot));\n }\n\n if (includeLessons) {\n collect(await checkLessons(repoRoot));\n }\n\n const errors = findings.filter((f) => f.severity === 'error').length;\n const warnings = findings.filter((f) => f.severity === 'warning').length;\n const infos = findings.filter((f) => f.severity === 'info').length;\n\n return {\n findings,\n summary: { errors, warnings, infos, filesChecked: allCheckedFiles.size },\n timestamp: new Date().toISOString(),\n };\n}\n","/**\n * Audit module types and Zod schemas.\n */\n\nimport { z } from 'zod';\n\n/** Schema for a single audit finding. */\nexport const AuditFindingSchema = z.object({\n file: z.string(),\n issue: z.string(),\n severity: z.enum(['error', 'warning', 'info']),\n relatedLessonId: z.string().optional(),\n suggestedFix: z.string().optional(),\n source: z.enum(['rule', 'pattern', 'lesson']),\n});\n\n/** Schema for the audit summary. */\nexport const AuditSummarySchema = z.object({\n errors: z.number(),\n warnings: z.number(),\n infos: z.number(),\n filesChecked: z.number(),\n});\n\n/** Schema for a complete audit report. */\nexport const AuditReportSchema = z.object({\n findings: z.array(AuditFindingSchema),\n summary: AuditSummarySchema,\n timestamp: z.string(),\n});\n\nexport type AuditFinding = z.infer<typeof AuditFindingSchema>;\nexport type AuditSummary = z.infer<typeof AuditSummarySchema>;\nexport type AuditReport = z.infer<typeof AuditReportSchema>;\n\n/** Return type for individual audit check functions. */\nexport interface AuditCheckResult {\n findings: AuditFinding[];\n filesChecked: string[];\n}\n\n/** Options to toggle individual audit checks. */\nexport interface AuditOptions {\n includeRules?: boolean;\n includePatterns?: boolean;\n includeLessons?: boolean;\n}\n","/**\n * Templates and constants for setup commands.\n */\n\nimport { VERSION } from '../index.js';\n\n// ============================================================================\n// Hooks Constants\n// ============================================================================\n\n/** Pre-commit hook reminder message */\nexport const PRE_COMMIT_MESSAGE = `\n╔══════════════════════════════════════════════════════════════╗\n║ LESSON CAPTURE CHECKPOINT ║\n╠══════════════════════════════════════════════════════════════╣\n║ STOP. Before this commit, take a moment to reflect: ║\n║ ║\n║ [ ] Did I learn something relevant during this session? ║\n║ [ ] Is there anything worth remembering for next time? ║\n║ ║\n║ If so, consider capturing a lesson: ║\n║ npx ca learn \"<insight>\" --trigger \"<what happened>\" ║\n╚══════════════════════════════════════════════════════════════╝`;\n\n/** Pre-commit hook shell script template */\nexport const PRE_COMMIT_HOOK_TEMPLATE = `#!/bin/sh\n# Compound Agent pre-commit hook\n# Reminds Claude to consider capturing lessons before commits\n\nnpx ca hooks run pre-commit\n`;\n\n/** Marker comment to identify our hook */\nexport const HOOK_MARKER = '# Compound Agent pre-commit hook';\n\n/** Block to insert into existing hooks */\nexport const COMPOUND_AGENT_HOOK_BLOCK = `\n# Compound Agent pre-commit hook (appended)\nnpx ca hooks run pre-commit\n`;\n\n// ============================================================================\n// Claude Code Hooks Configuration\n// ============================================================================\n\n/** Markers to identify our hook in Claude Code settings (current and legacy) */\nexport const CLAUDE_HOOK_MARKERS = [\n 'ca prime',\n 'ca load-session',\n 'compound-agent load-session',\n 'ca hooks run user-prompt',\n 'ca hooks run post-tool-failure',\n 'ca hooks run post-tool-success',\n 'ca hooks run phase-guard',\n 'ca hooks run read-tracker',\n 'ca hooks run stop-audit',\n // v1.2.9 canonical names\n 'ca hooks run post-read',\n 'ca hooks run phase-audit',\n];\n\n/** Claude Code SessionStart hook configuration (v0.2.4: uses prime for trust language) */\nexport const CLAUDE_HOOK_CONFIG = {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: 'npx ca prime 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code PreCompact hook configuration */\nexport const CLAUDE_PRECOMPACT_HOOK_CONFIG = {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: 'npx ca prime 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code UserPromptSubmit hook configuration */\nexport const CLAUDE_USER_PROMPT_HOOK_CONFIG = {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run user-prompt 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code PostToolUseFailure hook configuration */\nexport const CLAUDE_POST_TOOL_FAILURE_HOOK_CONFIG = {\n matcher: 'Bash|Edit|Write',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run post-tool-failure 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code PostToolUse hook configuration (for success reset) */\nexport const CLAUDE_POST_TOOL_SUCCESS_HOOK_CONFIG = {\n matcher: 'Bash|Edit|Write',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run post-tool-success 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code PreToolUse hook config for phase guard */\nexport const CLAUDE_PHASE_GUARD_HOOK_CONFIG = {\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run phase-guard 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code PostToolUse hook config for skill-read tracking. */\nexport const CLAUDE_POST_READ_HOOK_CONFIG = {\n matcher: 'Read',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run post-read 2>/dev/null || true',\n },\n ],\n};\n\n/** Claude Code Stop hook config for phase gate verification. */\nexport const CLAUDE_PHASE_AUDIT_HOOK_CONFIG = {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: 'npx ca hooks run phase-audit 2>/dev/null || true',\n },\n ],\n};\n\n// Back-compat aliases for test imports and older references.\nexport const CLAUDE_READ_TRACKER_HOOK_CONFIG = CLAUDE_POST_READ_HOOK_CONFIG;\nexport const CLAUDE_STOP_AUDIT_HOOK_CONFIG = CLAUDE_PHASE_AUDIT_HOOK_CONFIG;\n\n// Note: PreCommit is NOT a valid Claude Code hook type.\n// The remind-capture functionality is handled by git pre-commit hooks instead.\n// See installPreCommitHook() in hooks.ts for git hook installation.\n\n// ============================================================================\n// Init Command Constants\n// ============================================================================\n\n/** Section header to check for idempotency */\nexport const COMPOUND_AGENT_SECTION_HEADER = '## Compound Agent Integration';\n\n// ============================================================================\n// CLAUDE.md Reference Constants (lfy)\n// ============================================================================\n\n/** Start marker for CLAUDE.md reference section */\nexport const CLAUDE_REF_START_MARKER = '<!-- compound-agent:claude-ref:start -->';\n\n/** End marker for CLAUDE.md reference section */\nexport const CLAUDE_REF_END_MARKER = '<!-- compound-agent:claude-ref:end -->';\n\n/** Reference content to add to CLAUDE.md */\nexport const CLAUDE_MD_REFERENCE = `\n${CLAUDE_REF_START_MARKER}\n## Compound Agent\nSee AGENTS.md for lesson capture workflow.\n${CLAUDE_REF_END_MARKER}\n`;\n\n// ============================================================================\n// AGENTS.md Section Markers (e2r)\n// ============================================================================\n\n/** Start marker for AGENTS.md Learning Agent section */\nexport const AGENTS_SECTION_START_MARKER = '<!-- compound-agent:start -->';\n\n/** End marker for AGENTS.md Learning Agent section */\nexport const AGENTS_SECTION_END_MARKER = '<!-- compound-agent:end -->';\n\n/** Template content for AGENTS.md */\nexport const AGENTS_MD_TEMPLATE = `\n${AGENTS_SECTION_START_MARKER}\n## Compound Agent Integration\n\nThis project uses compound-agent for session memory via **CLI commands**.\n\n### CLI Commands (ALWAYS USE THESE)\n\n**You MUST use CLI commands for lesson management:**\n\n| Command | Purpose |\n|---------|---------|\n| \\`npx ca search \"query\"\\` | Search lessons - use BEFORE architectural decisions |\n| \\`npx ca learn \"insight\"\\` | Capture lessons - use AFTER corrections or discoveries |\n| \\`npx ca list\\` | List all stored lessons |\n| \\`npx ca show <id>\\` | Show details of a specific lesson |\n| \\`npx ca wrong <id>\\` | Mark a lesson as incorrect |\n\n### Mandatory Recall\n\nYou MUST call \\`npx ca search\\` BEFORE:\n- Architectural decisions or complex planning\n- Patterns you've implemented before in this repo\n- After user corrections (\"actually...\", \"wrong\", \"use X instead\")\n\n**NEVER skip search for complex decisions.** Past mistakes will repeat.\n\n### Capture Protocol\n\nRun \\`npx ca learn\\` AFTER:\n- User corrects you\n- Test fail → fix → pass cycles\n- You discover project-specific knowledge\n\n**Workflow**: Search BEFORE deciding, capture AFTER learning.\n\n### Quality Gate\n\nBefore capturing, verify the lesson is:\n- **Novel** - Not already stored\n- **Specific** - Clear guidance\n- **Actionable** (preferred) - Obvious what to do\n\n### Never Edit JSONL Directly\n\n**WARNING: NEVER edit .claude/lessons/index.jsonl directly.**\n\nThe JSONL file requires proper ID generation, schema validation, and SQLite sync.\nUse CLI (\\`npx ca learn\\`) — never manual edits.\n\nSee [documentation](https://github.com/Nathandela/compound_agent) for more details.\n${AGENTS_SECTION_END_MARKER}\n`;\n\n// ============================================================================\n// Legacy Slash Commands (removed in v1.1 — now in WORKFLOW_COMMANDS)\n// ============================================================================\n\n/** File names of slash commands that used to live at .claude/commands/ root level.\n * Used by --update to clean up stale files from v1.0 deployments. */\nexport const LEGACY_ROOT_SLASH_COMMANDS = [\n 'learn.md', 'search.md', 'list.md', 'prime.md', 'show.md', 'wrong.md', 'stats.md',\n];\n\n// ============================================================================\n// Plugin Configuration (ctv)\n// ============================================================================\n\n/** Plugin manifest for .claude/plugin.json */\nexport const PLUGIN_MANIFEST = {\n name: 'compound-agent',\n description: 'Session memory for Claude Code - capture and retrieve lessons',\n version: VERSION,\n author: {\n name: 'Nathan Delacrétaz',\n url: 'https://github.com/Nathandela',\n },\n repository: 'https://github.com/Nathandela/compound_agent',\n license: 'MIT',\n hooks: {\n SessionStart: [\n {\n matcher: '',\n hooks: [\n { type: 'command', command: 'npx ca prime 2>/dev/null || true' },\n ],\n },\n ],\n PreCompact: [\n {\n matcher: '',\n hooks: [{ type: 'command', command: 'npx ca prime 2>/dev/null || true' }],\n },\n ],\n UserPromptSubmit: [\n {\n matcher: '',\n hooks: [{ type: 'command', command: 'npx ca hooks run user-prompt 2>/dev/null || true' }],\n },\n ],\n PostToolUseFailure: [\n {\n matcher: 'Bash|Edit|Write',\n hooks: [{ type: 'command', command: 'npx ca hooks run post-tool-failure 2>/dev/null || true' }],\n },\n ],\n PostToolUse: [\n {\n matcher: 'Bash|Edit|Write',\n hooks: [{ type: 'command', command: 'npx ca hooks run post-tool-success 2>/dev/null || true' }],\n },\n {\n matcher: 'Read',\n hooks: [{ type: 'command', command: 'npx ca hooks run post-read 2>/dev/null || true' }],\n },\n ],\n PreToolUse: [\n {\n matcher: 'Edit|Write',\n hooks: [{ type: 'command', command: 'npx ca hooks run phase-guard 2>/dev/null || true' }],\n },\n ],\n Stop: [\n {\n matcher: '',\n hooks: [{ type: 'command', command: 'npx ca hooks run phase-audit 2>/dev/null || true' }],\n },\n ],\n // Note: PreCommit is handled by git hooks, not Claude Code hooks\n },\n};\n","/**\n * Claude Code settings helpers.\n *\n * Functions for reading, writing, and manipulating Claude Code settings.json.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport {\n AGENTS_SECTION_END_MARKER,\n AGENTS_SECTION_START_MARKER,\n CLAUDE_HOOK_CONFIG,\n CLAUDE_HOOK_MARKERS,\n CLAUDE_PHASE_AUDIT_HOOK_CONFIG,\n CLAUDE_PHASE_GUARD_HOOK_CONFIG,\n CLAUDE_POST_READ_HOOK_CONFIG,\n CLAUDE_POST_TOOL_FAILURE_HOOK_CONFIG,\n CLAUDE_POST_TOOL_SUCCESS_HOOK_CONFIG,\n CLAUDE_PRECOMPACT_HOOK_CONFIG,\n CLAUDE_REF_END_MARKER,\n CLAUDE_REF_START_MARKER,\n CLAUDE_USER_PROMPT_HOOK_CONFIG,\n} from './templates.js';\nimport type { ClaudeHooksResult } from './types.js';\n\n/**\n * Get the path to Claude Code settings file.\n *\n * @param global - If true, return global path (~/.claude/settings.json).\n * If false (default), return project-local path (.claude/settings.json).\n */\nexport function getClaudeSettingsPath(global: boolean): string {\n if (global) {\n return join(homedir(), '.claude', 'settings.json');\n }\n const repoRoot = getRepoRoot();\n return join(repoRoot, '.claude', 'settings.json');\n}\n\n/**\n * Read and parse Claude Code settings.\n */\nexport async function readClaudeSettings(settingsPath: string): Promise<Record<string, unknown>> {\n if (!existsSync(settingsPath)) {\n return {};\n }\n const content = await readFile(settingsPath, 'utf-8');\n return JSON.parse(content) as Record<string, unknown>;\n}\n\n/**\n * Check if our hook is already installed.\n * Checks for both current (ca) and legacy (compound-agent) markers in any hook type.\n */\nexport function hasClaudeHook(settings: Record<string, unknown>): boolean {\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks) return false;\n\n // Check all hook types we manage\n const hookTypes = ['SessionStart', 'PreCompact', 'UserPromptSubmit', 'PostToolUseFailure', 'PostToolUse', 'PreToolUse', 'Stop'];\n\n return hookTypes.some((hookType) => {\n const hookArray = hooks[hookType];\n if (!hookArray) return false;\n\n return hookArray.some((entry) => {\n const hookEntry = entry as { hooks?: Array<{ command?: string }> };\n return hookEntry.hooks?.some((h) =>\n CLAUDE_HOOK_MARKERS.some((marker) => h.command?.includes(marker))\n );\n });\n });\n}\n\n/**\n * Check whether every required hook type/config is installed.\n * This is stricter than hasClaudeHook(), which only checks for any marker.\n */\nexport function hasAllCompoundAgentHooks(settings: Record<string, unknown>): boolean {\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks) return false;\n\n return (\n hasHookTypeAny(hooks.SessionStart ?? [], ['ca prime']) &&\n hasHookTypeAny(hooks.PreCompact ?? [], ['ca prime']) &&\n hasHookTypeAny(hooks.UserPromptSubmit ?? [], ['ca hooks run user-prompt']) &&\n hasHookTypeAny(hooks.PostToolUseFailure ?? [], ['ca hooks run post-tool-failure']) &&\n hasHookTypeAny(hooks.PostToolUse ?? [], ['ca hooks run post-tool-success']) &&\n hasHookTypeAny(hooks.PostToolUse ?? [], ['ca hooks run post-read', 'ca hooks run read-tracker']) &&\n hasHookTypeAny(hooks.PreToolUse ?? [], ['ca hooks run phase-guard']) &&\n hasHookTypeAny(hooks.Stop ?? [], ['ca hooks run phase-audit', 'ca hooks run stop-audit'])\n );\n}\n\n/**\n * Add our hook to SessionStart array.\n */\nexport function addCompoundAgentHook(settings: Record<string, unknown>): void {\n if (!settings.hooks) {\n settings.hooks = {};\n }\n const hooks = settings.hooks as Record<string, unknown[]>;\n if (!hooks.SessionStart) {\n hooks.SessionStart = [];\n }\n hooks.SessionStart.push(CLAUDE_HOOK_CONFIG);\n}\n\n/**\n * Add all hooks managed by compound-agent.\n * Note: PreCommit is handled by git hooks, not Claude Code hooks.\n */\nexport function addAllCompoundAgentHooks(settings: Record<string, unknown>): void {\n if (!settings.hooks) {\n settings.hooks = {};\n }\n const hooks = settings.hooks as Record<string, unknown[]>;\n\n // SessionStart - prime context\n if (!hooks.SessionStart) {\n hooks.SessionStart = [];\n }\n if (!hasHookTypeAny(hooks.SessionStart, ['ca prime'])) {\n hooks.SessionStart.push(CLAUDE_HOOK_CONFIG);\n }\n\n // PreCompact - re-inject prime before compaction\n if (!hooks.PreCompact) {\n hooks.PreCompact = [];\n }\n if (!hasHookTypeAny(hooks.PreCompact, ['ca prime'])) {\n hooks.PreCompact.push(CLAUDE_PRECOMPACT_HOOK_CONFIG);\n }\n\n // UserPromptSubmit - gentle lesson tool reminders\n if (!hooks.UserPromptSubmit) {\n hooks.UserPromptSubmit = [];\n }\n if (!hasHookTypeAny(hooks.UserPromptSubmit, ['ca hooks run user-prompt'])) {\n hooks.UserPromptSubmit.push(CLAUDE_USER_PROMPT_HOOK_CONFIG);\n }\n\n // PostToolUseFailure - smart failure detection\n if (!hooks.PostToolUseFailure) {\n hooks.PostToolUseFailure = [];\n }\n if (!hasHookTypeAny(hooks.PostToolUseFailure, ['ca hooks run post-tool-failure'])) {\n hooks.PostToolUseFailure.push(CLAUDE_POST_TOOL_FAILURE_HOOK_CONFIG);\n }\n\n // PostToolUse - reset failure state on success\n if (!hooks.PostToolUse) {\n hooks.PostToolUse = [];\n }\n if (!hasHookTypeAny(hooks.PostToolUse, ['ca hooks run post-tool-success'])) {\n hooks.PostToolUse.push(CLAUDE_POST_TOOL_SUCCESS_HOOK_CONFIG);\n }\n\n // PostToolUse - read tracker (tracks skill file reads)\n if (!hasHookTypeAny(hooks.PostToolUse, ['ca hooks run post-read', 'ca hooks run read-tracker'])) {\n hooks.PostToolUse.push(CLAUDE_POST_READ_HOOK_CONFIG);\n }\n\n // PreToolUse - phase guard (warns before Edit/Write without skill read)\n if (!hooks.PreToolUse) {\n hooks.PreToolUse = [];\n }\n if (!hasHookTypeAny(hooks.PreToolUse, ['ca hooks run phase-guard'])) {\n hooks.PreToolUse.push(CLAUDE_PHASE_GUARD_HOOK_CONFIG);\n }\n\n // Stop - audit hook (blocks stop when phase gate not passed)\n if (!hooks.Stop) {\n hooks.Stop = [];\n }\n if (!hasHookTypeAny(hooks.Stop, ['ca hooks run phase-audit', 'ca hooks run stop-audit'])) {\n hooks.Stop.push(CLAUDE_PHASE_AUDIT_HOOK_CONFIG);\n }\n\n // Note: remind-capture functionality is handled by git pre-commit hooks\n // (see installPreCommitHook in hooks.ts), not Claude Code hooks\n}\n\n/**\n * Check if a hook type already has a command containing any marker.\n */\nfunction hasHookTypeAny(hookArray: unknown[], markers: string[]): boolean {\n return hookArray.some((entry) => {\n const hookEntry = entry as { hooks?: Array<{ command?: string }> };\n return hookEntry.hooks?.some((h) => markers.some((marker) => h.command?.includes(marker)));\n });\n}\n\n/**\n * Remove our hooks from all hook arrays.\n * Removes both current (ca) and legacy (compound-agent) hooks from all hook types.\n */\nexport function removeCompoundAgentHook(settings: Record<string, unknown>): boolean {\n const hooks = settings.hooks as Record<string, unknown[]> | undefined;\n if (!hooks) return false;\n\n let anyRemoved = false;\n\n // Hook types we manage\n const hookTypes = ['SessionStart', 'PreCompact', 'UserPromptSubmit', 'PostToolUseFailure', 'PostToolUse', 'PreToolUse', 'Stop'];\n\n for (const hookType of hookTypes) {\n if (!hooks[hookType]) continue;\n\n const originalLength = hooks[hookType].length;\n hooks[hookType] = hooks[hookType].filter((entry) => {\n const hookEntry = entry as { hooks?: Array<{ command?: string }> };\n return !hookEntry.hooks?.some((h) =>\n CLAUDE_HOOK_MARKERS.some((marker) => h.command?.includes(marker))\n );\n });\n\n if (hooks[hookType].length < originalLength) {\n anyRemoved = true;\n }\n }\n\n return anyRemoved;\n}\n\n/**\n * Write Claude Code settings atomically.\n */\nexport async function writeClaudeSettings(settingsPath: string, settings: Record<string, unknown>): Promise<void> {\n const dir = dirname(settingsPath);\n await mkdir(dir, { recursive: true });\n\n // Write to temp file, then rename (atomic)\n const tempPath = settingsPath + '.tmp';\n await writeFile(tempPath, JSON.stringify(settings, null, 2) + '\\n', 'utf-8');\n await rename(tempPath, settingsPath);\n}\n\n/**\n * Install Claude hooks for init command.\n * Handles errors gracefully - returns error info instead of throwing.\n * @param repoRoot - Repository root path\n * @returns Result indicating success/failure\n */\nexport async function installClaudeHooksForInit(repoRoot: string): Promise<ClaudeHooksResult> {\n const settingsPath = join(repoRoot, '.claude', 'settings.json');\n\n let settings: Record<string, unknown>;\n try {\n settings = await readClaudeSettings(settingsPath);\n } catch {\n return { installed: false, action: 'error', error: 'Failed to parse settings.json' };\n }\n\n if (hasAllCompoundAgentHooks(settings)) {\n return { installed: true, action: 'already_installed' };\n }\n\n try {\n addAllCompoundAgentHooks(settings);\n await writeClaudeSettings(settingsPath, settings);\n return { installed: true, action: 'installed' };\n } catch (err) {\n return { installed: false, action: 'error', error: String(err) };\n }\n}\n\n// ============================================================================\n// AGENTS.md and CLAUDE.md Cleanup (e2r)\n// ============================================================================\n\n/**\n * Remove Learning Agent section from AGENTS.md.\n * Uses markers to find and remove the section.\n *\n * @param repoRoot - Repository root path\n * @returns true if section was removed, false if not found\n */\nexport async function removeAgentsSection(repoRoot: string): Promise<boolean> {\n const agentsPath = join(repoRoot, 'AGENTS.md');\n\n if (!existsSync(agentsPath)) {\n return false;\n }\n\n const content = await readFile(agentsPath, 'utf-8');\n const startIdx = content.indexOf(AGENTS_SECTION_START_MARKER);\n const endIdx = content.indexOf(AGENTS_SECTION_END_MARKER);\n\n if (startIdx === -1 || endIdx === -1) {\n return false;\n }\n\n // Remove from start marker to end marker (inclusive)\n const before = content.slice(0, startIdx);\n const after = content.slice(endIdx + AGENTS_SECTION_END_MARKER.length);\n\n // Clean up: remove trailing newlines from before, keep single newline separation\n const newContent = (before.trimEnd() + after).trim();\n\n // Only write if file would not be empty\n if (newContent.length > 0) {\n await writeFile(agentsPath, newContent + '\\n', 'utf-8');\n } else {\n // File would be empty - could optionally delete it\n await writeFile(agentsPath, '', 'utf-8');\n }\n\n return true;\n}\n\n/**\n * Remove Learning Agent reference from CLAUDE.md.\n * Uses markers to find and remove the reference section.\n *\n * @param repoRoot - Repository root path\n * @returns true if reference was removed, false if not found\n */\nexport async function removeClaudeMdReference(repoRoot: string): Promise<boolean> {\n const claudeMdPath = join(repoRoot, '.claude', 'CLAUDE.md');\n\n if (!existsSync(claudeMdPath)) {\n return false;\n }\n\n const content = await readFile(claudeMdPath, 'utf-8');\n const startIdx = content.indexOf(CLAUDE_REF_START_MARKER);\n const endIdx = content.indexOf(CLAUDE_REF_END_MARKER);\n\n if (startIdx === -1 || endIdx === -1) {\n return false;\n }\n\n // Remove from start marker to end marker (inclusive)\n const before = content.slice(0, startIdx);\n const after = content.slice(endIdx + CLAUDE_REF_END_MARKER.length);\n\n // Clean up: remove trailing newlines from before, keep single newline separation\n const newContent = (before.trimEnd() + after).trim();\n\n // Only write if file would not be empty\n if (newContent.length > 0) {\n await writeFile(claudeMdPath, newContent + '\\n', 'utf-8');\n } else {\n await writeFile(claudeMdPath, '', 'utf-8');\n }\n\n return true;\n}\n","/**\n * User-scope detection - warns when installing at home directory level.\n */\n\nimport { homedir } from 'node:os';\nimport { dirname, resolve } from 'node:path';\n\n/** Result of scope detection. */\nexport interface ScopeCheckResult {\n /** Whether the repo root is at user scope (homedir or direct child). */\n isUserScope: boolean;\n /** Warning message when user-scope is detected. */\n message?: string;\n}\n\n/**\n * Detect whether repoRoot is at user scope (homedir or direct child of homedir).\n *\n * User-scope reduces compounding value because lessons are shared across projects.\n */\nexport function checkUserScope(repoRoot: string): ScopeCheckResult {\n const home = homedir();\n const resolved = resolve(repoRoot);\n\n const isHome = resolved === home;\n const isDirectChild = dirname(resolved) === home;\n\n if (isHome || isDirectChild) {\n return {\n isUserScope: true,\n message:\n 'Warning: Installing at user scope. compound-agent works best at repository scope where lessons are codebase-specific. User-scope means lessons shared across all projects, reducing compounding value. Consider running inside a specific repository.',\n };\n }\n\n return { isUserScope: false };\n}\n","/**\n * Shared display/print utilities for setup commands.\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { runFullBeadsCheck, type BeadsFullCheck } from './beads-check.js';\nimport {\n getClaudeSettingsPath,\n hasAllCompoundAgentHooks,\n readClaudeSettings,\n} from './claude-helpers.js';\nimport type { GitignoreResult } from './gitignore.js';\nimport type { HookInstallResult } from './hooks.js';\nimport type { PnpmConfigResult } from './primitives.js';\nimport { checkUserScope, type ScopeCheckResult } from './scope-check.js';\n\nexport function printGitignoreStatus(result: GitignoreResult): void {\n if (result.added.length > 0) {\n console.log(` .gitignore: Added [${result.added.join(', ')}]`);\n } else {\n console.log(' .gitignore: Already configured');\n }\n}\n\nexport function printSetupGitHooksStatus(gitHooks: HookInstallResult['status'] | 'skipped'): void {\n if (gitHooks === 'skipped') {\n console.log(' Git hooks: Skipped (--skip-hooks)');\n return;\n }\n if (gitHooks === 'not_git_repo') {\n console.log(' Git hooks: Skipped (not a git repository)');\n return;\n }\n if (gitHooks === 'installed') {\n console.log(' Git hooks: Installed');\n return;\n }\n if (gitHooks === 'appended') {\n console.log(' Git hooks: Appended to existing pre-commit hook');\n return;\n }\n console.log(' Git hooks: Already configured');\n}\n\nexport function printPnpmConfigStatus(result: PnpmConfigResult): void {\n if (!result.isPnpm) return;\n if (result.alreadyConfigured) {\n console.log(' pnpm config: onlyBuiltDependencies already configured');\n } else if (result.added.length > 0) {\n console.log(` pnpm config: Added onlyBuiltDependencies [${result.added.join(', ')}]`);\n }\n}\n\nexport function printBeadsFullStatus(check: BeadsFullCheck): void {\n console.log(` Beads CLI: ${check.cliAvailable ? 'OK' : 'not found'}`);\n if (check.cliAvailable) {\n console.log(` Beads repo: ${check.initialized ? 'OK' : 'not initialized (run: bd init)'}`);\n if (check.initialized) {\n console.log(` Beads health: ${check.healthy ? 'OK' : `issues found${check.healthMessage ? ` — ${check.healthMessage}` : ''}`}`);\n }\n }\n}\n\nexport function printScopeStatus(scope: ScopeCheckResult): void {\n if (scope.isUserScope) {\n console.log(' Scope: user-scope (reduced compounding value)');\n } else {\n console.log(' Scope: OK (repository scope)');\n }\n}\n\n/**\n * Show installation status (used by `ca setup --status`).\n */\nexport async function runStatus(repoRoot: string): Promise<void> {\n const agentsDir = join(repoRoot, '.claude', 'agents', 'compound');\n const commandsDir = join(repoRoot, '.claude', 'commands', 'compound');\n const skillsDir = join(repoRoot, '.claude', 'skills', 'compound');\n const pluginPath = join(repoRoot, '.claude', 'plugin.json');\n\n console.log('Compound Agent Status:');\n console.log(` Agent templates: ${existsSync(agentsDir) ? 'installed' : 'not installed'}`);\n console.log(` Workflow commands: ${existsSync(commandsDir) ? 'installed' : 'not installed'}`);\n console.log(` Phase skills: ${existsSync(skillsDir) ? 'installed' : 'not installed'}`);\n console.log(` Plugin manifest: ${existsSync(pluginPath) ? 'installed' : 'not installed'}`);\n\n const settingsPath = getClaudeSettingsPath(false);\n let hooksInstalled = false;\n try {\n const settings = await readClaudeSettings(settingsPath);\n hooksInstalled = hasAllCompoundAgentHooks(settings);\n } catch {\n // No settings\n }\n console.log(` Hooks: ${hooksInstalled ? 'installed' : 'not installed'}`);\n\n const fullBeads = runFullBeadsCheck(repoRoot);\n printBeadsFullStatus(fullBeads);\n const scope = checkUserScope(repoRoot);\n printScopeStatus(scope);\n}\n","/**\n * .gitignore injection - ensures required patterns exist.\n */\n\nimport { existsSync } from 'node:fs';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\n/** Patterns compound-agent needs in .gitignore. */\nconst REQUIRED_PATTERNS = ['node_modules/', '.claude/.cache/'];\n\n/** Section comment marker. */\nconst SECTION_COMMENT = '# compound-agent';\n\n/** Result of ensureGitignore operation. */\nexport interface GitignoreResult {\n /** Patterns that were added. */\n added: string[];\n}\n\n/**\n * Ensure .gitignore has required patterns.\n *\n * - Creates .gitignore if missing\n * - Appends missing patterns under a section comment\n * - Never duplicates existing patterns\n */\nexport async function ensureGitignore(repoRoot: string): Promise<GitignoreResult> {\n const gitignorePath = join(repoRoot, '.gitignore');\n let content = '';\n\n if (existsSync(gitignorePath)) {\n content = await readFile(gitignorePath, 'utf-8');\n }\n\n const lines = content.split('\\n');\n const existingPatterns = new Set(lines.map(l => l.trim()));\n\n const missing = REQUIRED_PATTERNS.filter(p => !existingPatterns.has(p));\n\n if (missing.length === 0) {\n return { added: [] };\n }\n\n const section = [SECTION_COMMENT, ...missing].join('\\n');\n const separator = content.length > 0 && !content.endsWith('\\n') ? '\\n\\n' : content.length > 0 ? '\\n' : '';\n const newContent = content + separator + section + '\\n';\n\n await writeFile(gitignorePath, newContent, 'utf-8');\n\n return { added: missing };\n}\n","/**\n * Standardized CLI error/warning/info format helpers.\n *\n * Format:\n * ERROR [command] CODE: message — remediation\n * WARN [command] CODE: message — suggestion\n * INFO [command]: message\n */\n\n/**\n * Format an error message with command, code, message, and remediation.\n *\n * @param command - CLI command name (e.g., \"search\", \"learn\")\n * @param code - Error code (e.g., \"INVALID_LIMIT\", \"FILE_NOT_FOUND\")\n * @param message - Human-readable error description\n * @param remediation - How to fix the error\n * @returns Formatted error string\n */\nexport function formatError(command: string, code: string, message: string, remediation: string): string {\n return `ERROR [${command}] ${code}: ${message} \\u2014 ${remediation}`;\n}\n\n/**\n * Format a warning message with command, code, message, and optional suggestion.\n *\n * @param command - CLI command name\n * @param code - Warning code\n * @param message - Human-readable warning description\n * @param suggestion - Optional suggestion for resolution\n * @returns Formatted warning string\n */\nexport function formatWarn(command: string, code: string, message: string, suggestion?: string): string {\n const base = `WARN [${command}] ${code}: ${message}`;\n return suggestion ? `${base} \\u2014 ${suggestion}` : base;\n}\n\n/**\n * Format an informational message with command and message.\n *\n * @param command - CLI command name\n * @param message - Human-readable info message\n * @returns Formatted info string\n */\nexport function formatInfo(command: string, message: string): string {\n return `INFO [${command}]: ${message}`;\n}\n","/**\n * Phase check state machine.\n *\n * Manages LFG phase state in .claude/.ca-phase-state.json.\n */\n\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nconst STATE_DIR = '.claude';\nconst STATE_FILE = '.ca-phase-state.json';\nconst EPIC_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\nexport const PHASES = ['brainstorm', 'plan', 'work', 'review', 'compound'] as const;\nexport type PhaseName = (typeof PHASES)[number];\n\nexport const GATES = ['post-plan', 'gate-3', 'gate-4', 'final'] as const;\nexport type GateName = (typeof GATES)[number];\n\nconst PHASE_INDEX: Record<PhaseName, number> = {\n brainstorm: 1,\n plan: 2,\n work: 3,\n review: 4,\n compound: 5,\n};\n\nexport interface PhaseState {\n lfg_active: boolean;\n epic_id: string;\n current_phase: PhaseName;\n phase_index: number;\n skills_read: string[];\n gates_passed: GateName[];\n started_at: string;\n}\n\nfunction getStatePath(repoRoot: string): string {\n return join(repoRoot, STATE_DIR, STATE_FILE);\n}\n\nfunction isPhaseName(value: unknown): value is PhaseName {\n return typeof value === 'string' && (PHASES as readonly string[]).includes(value);\n}\n\nfunction isGateName(value: unknown): value is GateName {\n return typeof value === 'string' && (GATES as readonly string[]).includes(value);\n}\n\nfunction isIsoDate(value: unknown): value is string {\n if (typeof value !== 'string') return false;\n return !Number.isNaN(Date.parse(value));\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\n\nfunction validatePhaseState(raw: unknown): raw is PhaseState {\n if (typeof raw !== 'object' || raw === null) return false;\n const state = raw as Record<string, unknown>;\n\n return (\n typeof state.lfg_active === 'boolean' &&\n typeof state.epic_id === 'string' &&\n isPhaseName(state.current_phase) &&\n typeof state.phase_index === 'number' &&\n state.phase_index >= 1 &&\n state.phase_index <= 5 &&\n isStringArray(state.skills_read) &&\n Array.isArray(state.gates_passed) &&\n state.gates_passed.every((gate) => isGateName(gate)) &&\n isIsoDate(state.started_at)\n );\n}\n\nexport function expectedGateForPhase(phaseIndex: number): GateName | null {\n if (phaseIndex === 2) return 'post-plan';\n if (phaseIndex === 3) return 'gate-3';\n if (phaseIndex === 4) return 'gate-4';\n if (phaseIndex === 5) return 'final';\n return null;\n}\n\nexport function initPhaseState(repoRoot: string, epicId: string): PhaseState {\n const dir = join(repoRoot, STATE_DIR);\n mkdirSync(dir, { recursive: true });\n\n const state: PhaseState = {\n lfg_active: true,\n epic_id: epicId,\n current_phase: 'brainstorm',\n phase_index: PHASE_INDEX.brainstorm,\n skills_read: [],\n gates_passed: [],\n started_at: new Date().toISOString(),\n };\n writeFileSync(getStatePath(repoRoot), JSON.stringify(state, null, 2), 'utf-8');\n return state;\n}\n\nexport function getPhaseState(repoRoot: string): PhaseState | null {\n try {\n const path = getStatePath(repoRoot);\n if (!existsSync(path)) return null;\n const raw = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(raw) as unknown;\n return validatePhaseState(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function updatePhaseState(repoRoot: string, partial: Partial<PhaseState>): PhaseState | null {\n const current = getPhaseState(repoRoot);\n if (current === null) return null;\n\n const updated: PhaseState = {\n ...current,\n ...partial,\n };\n\n if (!validatePhaseState(updated)) return null;\n\n writeFileSync(getStatePath(repoRoot), JSON.stringify(updated, null, 2), 'utf-8');\n return updated;\n}\n\nexport function startPhase(repoRoot: string, phase: PhaseName): PhaseState | null {\n return updatePhaseState(repoRoot, {\n current_phase: phase,\n phase_index: PHASE_INDEX[phase],\n });\n}\n\nexport function cleanPhaseState(repoRoot: string): void {\n try {\n const path = getStatePath(repoRoot);\n if (existsSync(path)) unlinkSync(path);\n } catch {\n // Silent cleanup\n }\n}\n\nexport function recordGatePassed(repoRoot: string, gate: GateName): PhaseState | null {\n const current = getPhaseState(repoRoot);\n if (current === null) return null;\n\n const gatesPassed = current.gates_passed.includes(gate)\n ? current.gates_passed\n : [...current.gates_passed, gate];\n const updated: PhaseState = { ...current, gates_passed: gatesPassed };\n\n // Final gate closes the active loop state.\n if (gate === 'final') {\n cleanPhaseState(repoRoot);\n return updated;\n }\n\n writeFileSync(getStatePath(repoRoot), JSON.stringify(updated, null, 2), 'utf-8');\n return updated;\n}\n\nfunction printStatusHuman(state: PhaseState | null): void {\n if (state === null) {\n console.log('No active LFG session.');\n return;\n }\n console.log('Active LFG Session');\n console.log(` Epic: ${state.epic_id}`);\n console.log(` Phase: ${state.current_phase} (${state.phase_index}/5)`);\n console.log(` Skills read: ${state.skills_read.length === 0 ? '(none)' : state.skills_read.join(', ')}`);\n console.log(` Gates passed: ${state.gates_passed.length === 0 ? '(none)' : state.gates_passed.join(', ')}`);\n console.log(` Started: ${state.started_at}`);\n}\n\n// eslint-disable-next-line max-lines-per-function -- command router registers multiple subcommands\nfunction registerPhaseSubcommands(\n phaseCheck: Command,\n getDryRun: () => boolean,\n repoRoot: () => string\n): void {\n phaseCheck\n .command('init <epic-id>')\n .description('Initialize phase state for an epic')\n .action((epicId: string) => {\n if (!EPIC_ID_PATTERN.test(epicId)) {\n console.error(`Invalid epic ID: \"${epicId}\"`);\n process.exitCode = 1;\n return;\n }\n if (getDryRun()) { console.log(`[dry-run] Would initialize phase state for epic ${epicId} in ${repoRoot()}`); return; }\n initPhaseState(repoRoot(), epicId);\n console.log(`Phase state initialized for ${epicId}. Current phase: brainstorm (1/5).`);\n });\n\n phaseCheck\n .command('start <phase>')\n .description('Start or resume a phase')\n .action((phase: string) => {\n if (!isPhaseName(phase)) {\n console.error(`Invalid phase: \"${phase}\". Valid phases: ${PHASES.join(', ')}`);\n process.exitCode = 1;\n return;\n }\n if (getDryRun()) { console.log(`[dry-run] Would start phase ${phase}`); return; }\n const state = startPhase(repoRoot(), phase);\n if (state === null) {\n console.error('No active phase state. Run: ca phase-check init <epic-id>');\n process.exitCode = 1;\n return;\n }\n console.log(`Phase updated: ${state.current_phase} (${state.phase_index}/5).`);\n });\n\n phaseCheck\n .command('gate <gate-name>')\n .description('Record a phase gate as passed')\n .action((gateName: string) => {\n if (!isGateName(gateName)) {\n console.error(`Invalid gate: \"${gateName}\". Valid gates: ${GATES.join(', ')}`);\n process.exitCode = 1;\n return;\n }\n if (getDryRun()) { console.log(`[dry-run] Would record gate ${gateName}`); return; }\n const state = recordGatePassed(repoRoot(), gateName);\n if (state === null) {\n console.error('No active phase state. Run: ca phase-check init <epic-id>');\n process.exitCode = 1;\n return;\n }\n if (gateName === 'final') {\n console.log('Final gate recorded. Phase state cleaned.');\n return;\n }\n console.log(`Gate recorded: ${gateName}.`);\n });\n\n phaseCheck\n .command('status')\n .description('Show current phase state')\n .option('--json', 'Output raw JSON')\n .action((options: { json?: boolean }) => {\n const state = getPhaseState(repoRoot());\n if (options.json) { console.log(JSON.stringify(state ?? { lfg_active: false })); return; }\n printStatusHuman(state);\n });\n\n phaseCheck\n .command('clean')\n .description('Remove phase state file')\n .action(() => {\n if (getDryRun()) { console.log('[dry-run] Would delete phase state file'); return; }\n cleanPhaseState(repoRoot());\n console.log('Phase state cleaned.');\n });\n}\n\nexport function registerPhaseCheckCommand(program: Command): void {\n const phaseCheck = program\n .command('phase-check')\n .description('Manage LFG phase state')\n .option('--dry-run', 'Show what would be done without making changes');\n\n const getDryRun = (): boolean => phaseCheck.opts<{ dryRun?: boolean }>().dryRun ?? false;\n const repoRoot = (): string => process.cwd();\n\n registerPhaseSubcommands(phaseCheck, getDryRun, repoRoot);\n\n program\n .command('phase-clean')\n .description('Remove phase state file (alias for `phase-check clean`)')\n .action(() => { cleanPhaseState(repoRoot()); console.log('Phase state cleaned.'); });\n}\n","/**\n * Phase guard hook for PreToolUse.\n *\n * Warns when Edit or Write tools are used without having read\n * the current phase skill file.\n */\n\n// eslint-disable-next-line compound-agent/enforce-barrel-exports -- avoids setup<->commands barrel cycle during hook startup\nimport { getPhaseState } from '../commands/phase-check.js';\n\nexport interface PhaseGuardOutput {\n hookSpecificOutput?: {\n hookEventName: 'PreToolUse';\n additionalContext?: string;\n };\n}\n\n/**\n * Process a PreToolUse event and check phase compliance.\n *\n * Returns a warning if Edit/Write is attempted without reading\n * the current phase skill. Returns {} in all other cases.\n */\nexport function processPhaseGuard(\n repoRoot: string,\n toolName: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _toolInput: Record<string, unknown>\n): PhaseGuardOutput {\n try {\n if (toolName !== 'Edit' && toolName !== 'Write') return {};\n\n const state = getPhaseState(repoRoot);\n if (state === null || !state.lfg_active) return {};\n\n const expectedSkillPath = `.claude/skills/compound/${state.current_phase}/SKILL.md`;\n const skillRead = state.skills_read.includes(expectedSkillPath);\n\n if (!skillRead) {\n return {\n hookSpecificOutput: {\n hookEventName: 'PreToolUse',\n additionalContext:\n `PHASE GUARD WARNING: You are in LFG phase ${state.phase_index}/5 (${state.current_phase}) ` +\n `but have NOT read the skill file yet. Read ${expectedSkillPath} before continuing.`,\n },\n };\n }\n\n return {};\n } catch {\n return {};\n }\n}\n","/**\n * Read tracker hook for PostToolUse.\n *\n * Tracks when skill files are Read and appends them to the\n * phase state's skills_read array.\n */\n\n// eslint-disable-next-line compound-agent/enforce-barrel-exports -- avoids setup<->commands barrel cycle during hook startup\nimport { getPhaseState, updatePhaseState } from '../commands/phase-check.js';\n\nconst SKILL_PATH_PATTERN = /(?:^|\\/)\\.claude\\/skills\\/compound\\/([^/]+)\\/SKILL\\.md$/;\n\nfunction normalizePath(path: string): string {\n return path.replaceAll('\\\\', '/');\n}\n\nfunction toCanonicalSkillPath(filePath: string): string | null {\n const normalized = normalizePath(filePath);\n const match = SKILL_PATH_PATTERN.exec(normalized);\n if (!match?.[1]) return null;\n return `.claude/skills/compound/${match[1]}/SKILL.md`;\n}\n\n/**\n * Process a PostToolUse Read event and track skill file reads.\n *\n * Appends the file path to skills_read when a skill file is read.\n * Returns {} in all other cases.\n */\nexport function processReadTracker(\n repoRoot: string,\n toolName: string,\n toolInput: Record<string, unknown>\n): Record<string, never> {\n try {\n if (toolName !== 'Read') return {};\n\n const state = getPhaseState(repoRoot);\n if (state === null || !state.lfg_active) return {};\n\n const filePath = typeof toolInput.file_path === 'string' ? toolInput.file_path : null;\n if (filePath === null) return {};\n\n const canonicalPath = toCanonicalSkillPath(filePath);\n if (canonicalPath === null) return {};\n\n if (!state.skills_read.includes(canonicalPath)) {\n updatePhaseState(repoRoot, {\n skills_read: [...state.skills_read, canonicalPath],\n });\n }\n\n return {};\n } catch {\n return {};\n }\n}\n","/**\n * Stop audit hook.\n *\n * Verifies required phase gates before allowing Claude to stop.\n */\n\n// eslint-disable-next-line compound-agent/enforce-barrel-exports -- avoids setup<->commands barrel cycle during hook startup\nimport { expectedGateForPhase, getPhaseState, PHASES } from '../commands/phase-check.js';\n\nexport interface StopAuditOutput {\n continue?: false;\n stopReason?: string;\n}\n\nfunction hasTransitionEvidence(state: {\n phase_index: number;\n skills_read: string[];\n}): boolean {\n // Final phase requires explicit final-gate verification.\n if (state.phase_index === 5) return true;\n\n // For phases 2-4, only block when there is evidence Claude moved on:\n // reading the next phase skill file.\n const nextPhase = PHASES[state.phase_index];\n if (nextPhase === undefined) return false;\n const nextSkillPath = `.claude/skills/compound/${nextPhase}/SKILL.md`;\n return state.skills_read.includes(nextSkillPath);\n}\n\n/**\n * Process a Stop event and check if the expected gate is passed.\n *\n * Returns { continue: false, stopReason } when stop is blocked.\n * Returns {} in all other cases (no state, lfg inactive, gate passed, etc.).\n */\nexport function processStopAudit(repoRoot: string, stopHookActive = false): StopAuditOutput {\n try {\n // Prevent recursive blocking loops from Stop hook retries.\n if (stopHookActive) return {};\n\n const state = getPhaseState(repoRoot);\n if (state === null || !state.lfg_active) return {};\n\n const expectedGate = expectedGateForPhase(state.phase_index);\n if (expectedGate === null) return {};\n\n if (state.gates_passed.includes(expectedGate)) return {};\n if (!hasTransitionEvidence(state)) return {};\n\n return {\n continue: false,\n stopReason: `PHASE GATE NOT VERIFIED: ${state.current_phase} requires gate '${expectedGate}'. Run: npx ca phase-check gate ${expectedGate}`,\n };\n } catch {\n return {};\n }\n}\n","/**\n * Hooks command - Git hooks management.\n */\n\nimport { chmodSync, existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatError } from '../cli-error-format.js';\nimport { processPhaseGuard } from './hooks-phase-guard.js';\nimport { processReadTracker } from './hooks-read-tracker.js';\nimport { processStopAudit } from './hooks-stop-audit.js';\nimport {\n HOOK_MARKER,\n COMPOUND_AGENT_HOOK_BLOCK,\n PRE_COMMIT_HOOK_TEMPLATE,\n PRE_COMMIT_MESSAGE,\n} from './templates.js';\n\n/** Make hook file executable (mode 0o755) */\nconst HOOK_FILE_MODE = 0o755;\n\n/**\n * Result of pre-commit hook installation.\n * Discriminated union for clear status messages.\n */\nexport type HookInstallResult =\n | { status: 'installed' }\n | { status: 'already_installed' }\n | { status: 'not_git_repo' }\n | { status: 'appended' };\n\n// ============================================================================\n// UserPromptSubmit Hook: Gentle memory tool reminders\n// ============================================================================\n\n/** Patterns that suggest user is correcting Claude */\nconst CORRECTION_PATTERNS = [\n /\\bactually\\b/i,\n /\\bno[,.]?\\s/i,\n /\\bwrong\\b/i,\n /\\bthat'?s not right\\b/i,\n /\\bthat'?s incorrect\\b/i,\n /\\buse .+ instead\\b/i,\n /\\bi told you\\b/i,\n /\\bi already said\\b/i,\n /\\bnot like that\\b/i,\n /\\byou forgot\\b/i,\n /\\byou missed\\b/i,\n /\\bstop\\s*(,\\s*)?(doing|using|that)\\b/i,\n /\\bwait\\s*(,\\s*)?(that|no|wrong)\\b/i,\n];\n\n/** High-confidence planning patterns (single match sufficient) */\nconst HIGH_CONFIDENCE_PLANNING = [\n /\\bdecide\\b/i,\n /\\bchoose\\b/i,\n /\\bpick\\b/i,\n /\\bwhich approach\\b/i,\n /\\bwhat do you think\\b/i,\n /\\bshould we\\b/i,\n /\\bwould you\\b/i,\n /\\bhow should\\b/i,\n /\\bwhat'?s the best\\b/i,\n /\\badd feature\\b/i,\n /\\bset up\\b/i,\n];\n\n/** Low-confidence planning patterns (need 2+ matches) */\nconst LOW_CONFIDENCE_PLANNING = [\n /\\bimplement\\b/i,\n /\\bbuild\\b/i,\n /\\bcreate\\b/i,\n /\\brefactor\\b/i,\n /\\bfix\\b/i,\n /\\bwrite\\b/i,\n /\\bdevelop\\b/i,\n];\n\n/** Reminder messages */\nconst CORRECTION_REMINDER =\n 'Remember: You have memory tools available - `npx ca learn` to save insights, `npx ca search` to find past solutions.';\n\nconst PLANNING_REMINDER =\n 'If you\\'re uncertain or hesitant, remember your memory tools: `npx ca search` may have relevant context from past sessions.';\n\n/** Check if prompt matches correction patterns */\nexport function detectCorrection(prompt: string): boolean {\n return CORRECTION_PATTERNS.some((pattern) => pattern.test(prompt));\n}\n\n/** Check if prompt matches planning patterns */\nexport function detectPlanning(prompt: string): boolean {\n if (HIGH_CONFIDENCE_PLANNING.some((pattern) => pattern.test(prompt))) {\n return true;\n }\n const lowMatches = LOW_CONFIDENCE_PLANNING.filter((pattern) => pattern.test(prompt));\n return lowMatches.length >= 2;\n}\n\n/**\n * UserPromptSubmit hook output format.\n * Claude Code expects this structure for additionalContext injection.\n */\nexport interface UserPromptHookOutput {\n hookSpecificOutput?: {\n hookEventName: 'UserPromptSubmit';\n additionalContext?: string;\n };\n}\n\n/**\n * Process a user prompt and determine if a reminder should be injected.\n *\n * @param prompt - The user's message text\n * @returns Hook output with optional additionalContext\n */\nexport function processUserPrompt(prompt: string): UserPromptHookOutput {\n // Priority: corrections first, then planning\n if (detectCorrection(prompt)) {\n return {\n hookSpecificOutput: {\n hookEventName: 'UserPromptSubmit',\n additionalContext: CORRECTION_REMINDER,\n },\n };\n }\n\n if (detectPlanning(prompt)) {\n return {\n hookSpecificOutput: {\n hookEventName: 'UserPromptSubmit',\n additionalContext: PLANNING_REMINDER,\n },\n };\n }\n\n // No reminder needed\n return {};\n}\n\n// ============================================================================\n// PostToolUseFailure Hook: In-memory failure tracking with memory tip\n// ============================================================================\n\n/** Threshold constants */\nconst SAME_TARGET_THRESHOLD = 2;\nconst TOTAL_FAILURE_THRESHOLD = 3;\n\n/** State file name for cross-process persistence */\nexport const STATE_FILE_NAME = '.ca-failure-state.json';\n\n/** Max age for state file before it's considered stale (1 hour) */\nconst STATE_MAX_AGE_MS = 60 * 60 * 1000;\n\n/** Persisted failure state shape */\nexport interface FailureState {\n count: number;\n lastTarget: string | null;\n sameTargetCount: number;\n timestamp: number;\n}\n\n/** In-memory failure counters (fallback when no stateDir provided) */\nlet failureCount = 0;\nlet lastFailedTarget: string | null = null;\nlet sameTargetCount = 0;\n\n/** Default (empty) failure state */\nfunction defaultState(): FailureState {\n return { count: 0, lastTarget: null, sameTargetCount: 0, timestamp: Date.now() };\n}\n\n/** Read failure state from file. Returns defaults on any error or if stale. */\nexport function readFailureState(stateDir: string): FailureState {\n try {\n const filePath = join(stateDir, STATE_FILE_NAME);\n if (!existsSync(filePath)) return defaultState();\n const raw = readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw) as FailureState;\n // Check staleness\n if (Date.now() - parsed.timestamp > STATE_MAX_AGE_MS) return defaultState();\n return parsed;\n } catch {\n return defaultState();\n }\n}\n\n/** Write failure state to file. Silently ignores errors. */\nexport function writeFailureState(stateDir: string, state: FailureState): void {\n try {\n const filePath = join(stateDir, STATE_FILE_NAME);\n writeFileSync(filePath, JSON.stringify(state), 'utf-8');\n } catch {\n // Fall back silently - never crash the hook process\n }\n}\n\n/** Delete state file. Silently ignores errors. */\nfunction deleteStateFile(stateDir: string): void {\n try {\n const filePath = join(stateDir, STATE_FILE_NAME);\n if (existsSync(filePath)) unlinkSync(filePath);\n } catch {\n // Fall back silently\n }\n}\n\n/** Tip message for failures */\nconst FAILURE_TIP = 'Tip: Multiple failures detected. `npx ca search` may have solutions for similar issues.';\n\n/**\n * PostToolUseFailure hook output format.\n */\nexport interface PostToolFailureHookOutput {\n hookSpecificOutput?: {\n hookEventName: 'PostToolUseFailure';\n additionalContext?: string;\n };\n}\n\n/** Reset failure state (exported for testing). Deletes state file when stateDir provided. */\nexport function resetFailureState(stateDir?: string): void {\n failureCount = 0;\n lastFailedTarget = null;\n sameTargetCount = 0;\n if (stateDir) deleteStateFile(stateDir);\n}\n\n/** Extract a failure target from tool name and input */\nfunction getFailureTarget(toolName: string, toolInput: Record<string, unknown>): string | null {\n if (toolName === 'Bash' && typeof toolInput.command === 'string') {\n const trimmed = toolInput.command.trim();\n const firstSpace = trimmed.indexOf(' ');\n return firstSpace === -1 ? trimmed : trimmed.slice(0, firstSpace);\n }\n if ((toolName === 'Edit' || toolName === 'Write') && typeof toolInput.file_path === 'string') {\n return toolInput.file_path;\n }\n return null;\n}\n\n/**\n * Process a tool failure and determine if a tip should be shown.\n * When stateDir is provided, persists state to file for cross-process tracking.\n */\nexport function processToolFailure(\n toolName: string,\n toolInput: Record<string, unknown>,\n stateDir?: string\n): PostToolFailureHookOutput {\n // Load persisted state if stateDir provided, otherwise use in-memory\n if (stateDir) {\n const persisted = readFailureState(stateDir);\n failureCount = persisted.count;\n lastFailedTarget = persisted.lastTarget;\n sameTargetCount = persisted.sameTargetCount;\n }\n\n failureCount++;\n const target = getFailureTarget(toolName, toolInput);\n if (target !== null && target === lastFailedTarget) {\n sameTargetCount++;\n } else {\n sameTargetCount = 1;\n lastFailedTarget = target;\n }\n const shouldShowTip =\n sameTargetCount >= SAME_TARGET_THRESHOLD ||\n failureCount >= TOTAL_FAILURE_THRESHOLD;\n if (shouldShowTip) {\n resetFailureState(stateDir);\n return {\n hookSpecificOutput: {\n hookEventName: 'PostToolUseFailure',\n additionalContext: FAILURE_TIP,\n },\n };\n }\n\n // Persist updated state if stateDir provided\n if (stateDir) {\n writeFailureState(stateDir, {\n count: failureCount,\n lastTarget: lastFailedTarget,\n sameTargetCount,\n timestamp: Date.now(),\n });\n }\n\n return {};\n}\n\n/**\n * Process a tool success - clear failure state.\n * When stateDir is provided, deletes the state file.\n */\nexport function processToolSuccess(stateDir?: string): void {\n resetFailureState(stateDir);\n}\n\n/**\n * Check if a pre-commit hook already exists with our marker.\n */\nfunction hasCompoundAgentHook(content: string): boolean {\n return content.includes(HOOK_MARKER);\n}\n\n/**\n * Get the git hooks directory, respecting core.hooksPath if set.\n */\nasync function getGitHooksDir(repoRoot: string): Promise<string | null> {\n const gitDir = join(repoRoot, '.git');\n\n // Check if .git directory exists\n if (!existsSync(gitDir)) {\n return null;\n }\n\n // Check for core.hooksPath in .git/config\n const configPath = join(gitDir, 'config');\n if (existsSync(configPath)) {\n const config = await readFile(configPath, 'utf-8');\n const match = /hooksPath\\s*=\\s*(.+)$/m.exec(config);\n if (match?.[1]) {\n const hooksPath = match[1].trim();\n // Resolve relative paths from repo root\n return hooksPath.startsWith('/') ? hooksPath : join(repoRoot, hooksPath);\n }\n }\n\n // Default to .git/hooks\n const defaultHooksDir = join(gitDir, 'hooks');\n return existsSync(defaultHooksDir) ? defaultHooksDir : null;\n}\n\n/**\n * Find the line index of the first top-level exit statement in a shell script.\n *\n * Top-level means not inside:\n * - Function definitions (between { and })\n * - Heredocs (between <<EOF and EOF)\n *\n * Returns -1 if no top-level exit found.\n */\nexport function findFirstTopLevelExitLine(lines: string[]): number {\n let insideFunction = 0; // Brace nesting depth\n let heredocDelimiter: string | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n const trimmed = line.trim();\n\n // Check for heredoc end\n if (heredocDelimiter !== null) {\n if (trimmed === heredocDelimiter) {\n heredocDelimiter = null;\n }\n continue;\n }\n\n // Check for heredoc start: <<EOF, <<'EOF', <<\"EOF\", <<-EOF\n const heredocMatch = /<<-?\\s*['\"]?(\\w+)['\"]?/.exec(line);\n if (heredocMatch?.[1]) {\n heredocDelimiter = heredocMatch[1];\n continue;\n }\n\n // Track function braces (simple heuristic)\n // Count opening and closing braces\n for (const char of line) {\n if (char === '{') insideFunction++;\n if (char === '}') insideFunction = Math.max(0, insideFunction - 1);\n }\n\n // Skip if inside function\n if (insideFunction > 0) {\n continue;\n }\n\n // Check for top-level exit: exit followed by number, $var, or $?\n // Pattern: start of line, optional whitespace, exit, space, code, end\n if (/^\\s*exit\\s+(\\d+|\\$\\w+|\\$\\?)\\s*$/.test(trimmed)) {\n return i;\n }\n }\n\n return -1;\n}\n\n/**\n * Install pre-commit hook, respecting core.hooksPath and existing hooks.\n *\n * - Respects core.hooksPath when configured\n * - Appends to existing hooks instead of overwriting\n * - Uses marker to ensure idempotency\n *\n * @returns Discriminated union indicating the installation result\n */\nexport async function installPreCommitHook(repoRoot: string): Promise<HookInstallResult> {\n const gitHooksDir = await getGitHooksDir(repoRoot);\n\n // Not a git repo or no hooks directory\n if (!gitHooksDir) {\n return { status: 'not_git_repo' };\n }\n\n // Ensure hooks directory exists\n await mkdir(gitHooksDir, { recursive: true });\n\n const hookPath = join(gitHooksDir, 'pre-commit');\n\n // Check if hook already exists\n if (existsSync(hookPath)) {\n const content = await readFile(hookPath, 'utf-8');\n if (hasCompoundAgentHook(content)) {\n return { status: 'already_installed' };\n }\n\n // Find insertion point: before first top-level exit, or at end\n const lines = content.split('\\n');\n const exitLineIndex = findFirstTopLevelExitLine(lines);\n\n let newContent: string;\n if (exitLineIndex === -1) {\n // No top-level exit found - append to end\n newContent = content.trimEnd() + '\\n' + COMPOUND_AGENT_HOOK_BLOCK;\n } else {\n // Insert before the exit line\n const before = lines.slice(0, exitLineIndex);\n const after = lines.slice(exitLineIndex);\n newContent = before.join('\\n') + COMPOUND_AGENT_HOOK_BLOCK + after.join('\\n');\n }\n\n await writeFile(hookPath, newContent, 'utf-8');\n chmodSync(hookPath, HOOK_FILE_MODE);\n return { status: 'appended' };\n }\n\n // Create new hook file with full template\n await writeFile(hookPath, PRE_COMMIT_HOOK_TEMPLATE, 'utf-8');\n chmodSync(hookPath, HOOK_FILE_MODE);\n\n return { status: 'installed' };\n}\n\n/**\n * Read stdin as a string.\n */\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString('utf-8');\n}\n\n/**\n * Run the UserPromptSubmit hook.\n * Reads JSON from stdin, processes the prompt, outputs hook result.\n */\nasync function runUserPromptHook(): Promise<void> {\n try {\n const input = await readStdin();\n const data = JSON.parse(input) as { prompt?: string };\n\n if (!data.prompt) {\n // No prompt provided, exit silently\n console.log(JSON.stringify({}));\n return;\n }\n\n const result = processUserPrompt(data.prompt);\n console.log(JSON.stringify(result));\n } catch {\n // On any error, exit silently with empty output\n console.log(JSON.stringify({}));\n }\n}\n\n/**\n * Run the PostToolUseFailure hook.\n * Reads JSON from stdin, tracks failure, outputs tip if threshold reached.\n * Uses file-based persistence for cross-process failure tracking.\n */\nasync function runPostToolFailureHook(): Promise<void> {\n try {\n const input = await readStdin();\n const data = JSON.parse(input) as {\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n };\n\n if (!data.tool_name) {\n console.log(JSON.stringify({}));\n return;\n }\n\n const stateDir = join(process.cwd(), '.claude');\n const result = processToolFailure(data.tool_name, data.tool_input ?? {}, stateDir);\n console.log(JSON.stringify(result));\n } catch {\n console.log(JSON.stringify({}));\n }\n}\n\n/**\n * Run the PostToolUse hook for success.\n * Reads JSON from stdin, clears failure state and state file.\n */\nasync function runPostToolSuccessHook(): Promise<void> {\n try {\n await readStdin();\n const stateDir = join(process.cwd(), '.claude');\n processToolSuccess(stateDir);\n console.log(JSON.stringify({}));\n } catch {\n console.log(JSON.stringify({}));\n }\n}\n\n/** Run a tool-based hook: read stdin JSON, extract tool_name/tool_input, call processor. */\nasync function runToolHook(\n processor: (repoRoot: string, toolName: string, toolInput: Record<string, unknown>) => unknown\n): Promise<void> {\n try {\n const input = await readStdin();\n const data = JSON.parse(input) as { tool_name?: string; tool_input?: Record<string, unknown> };\n if (!data.tool_name) { console.log(JSON.stringify({})); return; }\n console.log(JSON.stringify(processor(process.cwd(), data.tool_name, data.tool_input ?? {})));\n } catch { console.log(JSON.stringify({})); }\n}\n\n/** Run the Stop audit hook. */\nasync function runStopAuditHook(): Promise<void> {\n try {\n const input = await readStdin();\n const data = JSON.parse(input) as { stop_hook_active?: boolean };\n console.log(JSON.stringify(processStopAudit(process.cwd(), data.stop_hook_active ?? false)));\n } catch { console.log(JSON.stringify({})); }\n}\n\n/**\n * Register the hooks command on the program.\n */\nexport function registerHooksCommand(program: Command): void {\n const hooksCommand = program.command('hooks').description('Git hooks management');\n\n hooksCommand\n .command('run <hook>')\n .description('Run a hook script (called by git/Claude hooks)')\n .option('--json', 'Output as JSON')\n .action(async (hook: string, options: { json?: boolean }) => {\n if (hook === 'pre-commit') {\n if (options.json) {\n console.log(JSON.stringify({ hook: 'pre-commit', message: PRE_COMMIT_MESSAGE }));\n } else {\n console.log(PRE_COMMIT_MESSAGE);\n }\n } else if (hook === 'user-prompt') {\n // UserPromptSubmit hook - reads from stdin, outputs JSON\n await runUserPromptHook();\n } else if (hook === 'post-tool-failure') {\n // PostToolUseFailure hook - tracks failures, outputs tip if threshold\n await runPostToolFailureHook();\n } else if (hook === 'post-tool-success') {\n // PostToolUse hook - clears failure state on success\n await runPostToolSuccessHook();\n } else if (hook === 'phase-guard') {\n await runToolHook(processPhaseGuard);\n } else if (hook === 'post-read' || hook === 'read-tracker') {\n await runToolHook(processReadTracker);\n } else if (hook === 'phase-audit' || hook === 'stop-audit') {\n // Stop hook - stop audit\n await runStopAuditHook();\n } else {\n if (options.json) {\n console.log(JSON.stringify({ error: `Unknown hook: ${hook}` }));\n } else {\n console.error(\n formatError(\n 'hooks',\n 'UNKNOWN_HOOK',\n `Unknown hook: ${hook}`,\n 'Valid hooks: pre-commit, user-prompt, post-tool-failure, post-tool-success, post-read (or read-tracker), phase-guard, phase-audit (or stop-audit)'\n )\n );\n }\n process.exitCode = 1;\n }\n });\n}\n","/**\n * External reviewer agent templates.\n * Optional cross-model reviewers (Gemini CLI, Codex CLI) that run\n * after /implementation-reviewer in the review pipeline.\n */\n\nexport const EXTERNAL_AGENT_TEMPLATES: Record<string, string> = {\n 'external-reviewer-gemini.md': `---\nname: External Reviewer (Gemini)\ndescription: Cross-model review using Gemini CLI in headless mode\nmodel: sonnet\n---\n\n# External Reviewer — Gemini\n\n## Role\nRun a cross-model code review by invoking the Gemini CLI in headless mode. Provides an independent perspective from a different LLM to catch issues Claude may miss.\n\n## Prerequisites\n- Gemini CLI installed (\\`npm i -g @google/gemini-cli\\`)\n- Authenticated (\\`gemini auth login\\`)\n\n## Instructions\n1. **Check availability** — run \\`command -v gemini\\` via Bash. If not found, report \"Gemini CLI not installed — skipping external review\" and stop.\n2. **Gather context**:\n - Get the beads issue being worked on: \\`bd list --status=in_progress\\` then \\`bd show <id>\\` to get the issue title and description.\n - Get the diff: \\`git diff HEAD~1\\` (or the appropriate range for this session's changes).\n3. **Build the review prompt** combining beads context + diff:\n \\`\\`\\`\n ISSUE: <title>\n DESCRIPTION: <description>\n DIFF:\n <git diff output>\n\n Review these changes for:\n 1. Correctness bugs and logic errors\n 2. Security vulnerabilities\n 3. Missed edge cases\n 4. Code quality issues\n Output a numbered list of findings. Be concise and actionable. Skip praise.\n \\`\\`\\`\n4. **Call Gemini headless**:\n \\`\\`\\`bash\n echo \"<prompt>\" | gemini -p \"Review the following code changes\" --output-format json\n \\`\\`\\`\n5. **Parse the response** — extract the \\`.response\\` field from the JSON output.\n6. **Present findings** to the user as a numbered list with severity tags (P1/P2/P3).\n7. **If Gemini returns an error** (auth failure, rate limit, timeout), report the error and skip gracefully. Never block the pipeline on external reviewer failure.\n\n## Output Format\n\\`\\`\\`\n## Gemini External Review\n\n**Status**: Completed | Skipped (reason)\n**Findings**: N items\n\n1. [P2] <finding description> — <file:line>\n2. [P3] <finding description> — <file:line>\n...\n\\`\\`\\`\n\n## Important\n- This is **advisory, not blocking**. Findings inform but do not gate the pipeline.\n- Do NOT retry more than once on failure.\n- Do NOT feed the entire codebase — only the diff and issue context.\n`,\n\n 'external-reviewer-codex.md': `---\nname: External Reviewer (Codex)\ndescription: Cross-model review using OpenAI Codex CLI in headless mode\nmodel: sonnet\n---\n\n# External Reviewer — Codex\n\n## Role\nRun a cross-model code review by invoking the OpenAI Codex CLI in headless exec mode. Provides an independent perspective from OpenAI's reasoning models to catch issues Claude may miss.\n\n## Prerequisites\n- Codex CLI installed (\\`npm i -g @openai/codex\\`)\n- Authenticated (\\`codex login --api-key\\`)\n\n## Instructions\n1. **Check availability** — run \\`command -v codex\\` via Bash. If not found, report \"Codex CLI not installed — skipping external review\" and stop.\n2. **Gather context**:\n - Get the beads issue being worked on: \\`bd list --status=in_progress\\` then \\`bd show <id>\\` to get the issue title and description.\n - Get the diff: \\`git diff HEAD~1\\` (or the appropriate range for this session's changes).\n3. **Build the review prompt** combining beads context + diff:\n \\`\\`\\`\n ISSUE: <title>\n DESCRIPTION: <description>\n DIFF:\n <git diff output>\n\n Review these changes for:\n 1. Correctness bugs and logic errors\n 2. Security vulnerabilities\n 3. Missed edge cases\n 4. Code quality issues\n Output a numbered list of findings. Be concise and actionable. Skip praise.\n \\`\\`\\`\n4. **Call Codex headless**:\n \\`\\`\\`bash\n echo \"<prompt>\" | codex exec --quiet \"Review the following code changes for bugs, security issues, and missed edge cases\"\n \\`\\`\\`\n5. **Parse the response** — Codex exec prints the final answer to stdout.\n6. **Present findings** to the user as a numbered list with severity tags (P1/P2/P3).\n7. **If Codex returns an error** (auth failure, rate limit, timeout), report the error and skip gracefully. Never block the pipeline on external reviewer failure.\n\n## Output Format\n\\`\\`\\`\n## Codex External Review\n\n**Status**: Completed | Skipped (reason)\n**Findings**: N items\n\n1. [P2] <finding description> — <file:line>\n2. [P3] <finding description> — <file:line>\n...\n\\`\\`\\`\n\n## Important\n- This is **advisory, not blocking**. Findings inform but do not gate the pipeline.\n- Do NOT retry more than once on failure.\n- Do NOT feed the entire codebase — only the diff and issue context.\n`,\n};\n","/**\n * Phase 11 agent templates: thin subagent wrappers.\n *\n * 4 subagents (audit, doc-gardener, cct-subagent, drift-detector).\n * The compounding agent is now an AgentTeam role skill.\n */\n\nexport const PHASE11_AGENT_TEMPLATES: Record<string, string> = {\n 'audit.md': `---\nname: Audit Agent\ndescription: Deep semantic analysis of codebase against rules, patterns, and lessons\nmodel: sonnet\n---\n\n# Audit Agent\n\nSpawned as a **subagent**. Follow the **audit** role skill for full instructions. Return findings to the caller.\n`,\n\n 'doc-gardener.md': `---\nname: Doc Gardener\ndescription: Audits project documentation for freshness, accuracy, and completeness\nmodel: sonnet\n---\n\n# Doc Gardener\n\nSpawned as a **subagent**. Follow the **doc-gardener** role skill for full instructions. Return findings to the caller.\n`,\n\n 'cct-subagent.md': `---\nname: CCT Subagent\ndescription: Injects mistake-derived test requirements into the TDD pipeline\nmodel: sonnet\n---\n\n# CCT Subagent\n\nSpawned as a **subagent**. Follow the **cct-subagent** role skill for full instructions. Return findings to the caller.\n`,\n\n 'drift-detector.md': `---\nname: Drift Detector\ndescription: Checks implementation for drift from established constraints\nmodel: sonnet\n---\n\n# Drift Detector\n\nSpawned as a **subagent**. Follow the **drift-detector** role skill for full instructions. Return findings to the caller.\n`,\n};\n","/**\n * Review agent templates: thin subagent wrappers for plan/brainstorm phases.\n *\n * 2 research subagents (repo-analyst, memory-analyst).\n * The 5 reviewer agents are now AgentTeam role skills.\n */\n\nexport const REVIEW_AGENT_TEMPLATES: Record<string, string> = {\n 'repo-analyst.md': `---\nname: Repo Analyst\ndescription: Analyzes repository structure, conventions, and patterns\nmodel: sonnet\n---\n\n# Repo Analyst\n\nSpawned as a **subagent**. Follow the **repo-analyst** role skill for full instructions. Return findings to the caller.\n`,\n\n 'memory-analyst.md': `---\nname: Memory Analyst\ndescription: Searches and retrieves relevant memory items for context\nmodel: sonnet\n---\n\n# Memory Analyst\n\nSpawned as a **subagent**. Follow the **memory-analyst** role skill for full instructions. Return findings to the caller.\n`,\n};\n","/**\n * Agent definition templates for .claude/agents/compound/.\n * Each entry is a markdown file that Claude Code discovers as a spawnable agent.\n *\n * Templates are split across multiple files to stay within the 400-line limit:\n * - agents-review.ts: Research + review agents (7 templates)\n * - agents-phase11.ts: Phase 11 intelligent compounding agents (5 templates)\n */\n\nimport { EXTERNAL_AGENT_TEMPLATES } from './agents-external.js';\nimport { PHASE11_AGENT_TEMPLATES } from './agents-phase11.js';\nimport { REVIEW_AGENT_TEMPLATES } from './agents-review.js';\n\nexport const AGENT_TEMPLATES: Record<string, string> = {\n ...REVIEW_AGENT_TEMPLATES,\n ...PHASE11_AGENT_TEMPLATES,\n ...EXTERNAL_AGENT_TEMPLATES,\n};\n","/**\n * Workflow agent role skills for the compound and work phases.\n *\n * 4 compound-phase analysts + 2 TDD work agents = 6 entries.\n * These are installed as .claude/skills/compound/agents/<name>/SKILL.md.\n */\n\nexport const WORKFLOW_ROLE_SKILLS: Record<string, string> = {\n 'context-analyzer': `---\nname: Context Analyzer\ndescription: Analyzes completed work to identify what was done and learned\n---\n\n# Context Analyzer\n\n## Role\nAnalyze the current session's work context: what was accomplished, what problems arose, what corrections were made, and what knowledge was gained. Examine git diff output, git log history, and test output to build a complete picture.\n\n## Instructions\n1. Run git diff and git log to review recent changes\n2. Check test results and test output for failures or regressions\n3. Review plan context to understand what was intended\n4. Use \\`npx ca search\\` to check existing knowledge for relevant context\n5. Identify problems encountered and how they were solved\n6. Note any user corrections or redirections\n7. Summarize the work context for lesson extraction\n8. For large diffs spanning multiple modules, spawn opus subagents to analyze each module in parallel. Merge findings before sharing.\n\n## Collaboration\nShare findings with lesson-extractor via direct message so it can extract actionable lessons from the context. Pass results to other compound agents as needed.\n\n## Deployment\nAgentTeam member in the **compound** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **Completed**: What was accomplished\n- **Problems**: Issues encountered and resolutions\n- **Corrections**: User feedback that changed approach\n- **Patterns**: Recurring themes or techniques\n`,\n\n 'lesson-extractor': `---\nname: Lesson Extractor\ndescription: Extracts actionable lessons from work context\n---\n\n# Lesson Extractor\n\n## Role\nExtract actionable, specific lessons from analyzed work context. Identify corrections, mistakes, and discoveries. Transform observations into structured knowledge that prevents future mistakes.\n\n## Instructions\n1. Review the context analysis output\n2. Look for mistake patterns, correction moments, and surprises\n3. Discover insights from how problems were solved\n4. Use \\`npx ca search\\` to check for duplicate lessons\n5. For each problem/correction, ask: \"What should be done differently next time?\"\n6. Filter out lessons that are too generic or obvious\n7. Each lesson must be specific; prefer actionable guidance when possible\n8. For many corrections/discoveries, spawn opus subagents to extract lessons from different domain areas in parallel.\n\n## Collaboration\nShare findings with pattern-matcher and solution-writer via direct message so they can classify and store the lessons. Collaborate with context-analyzer to clarify ambiguous findings.\n\n## Deployment\nAgentTeam member in the **compound** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\nPer lesson:\n- **Insight**: The actionable directive\n- **Trigger**: When this lesson applies\n- **Context**: Why this matters\n`,\n\n 'pattern-matcher': `---\nname: Pattern Matcher\ndescription: Matches lessons against existing memory to avoid duplicates\n---\n\n# Pattern Matcher\n\n## Role\nCompare extracted lessons against existing memory items to prevent duplicates, find connections, and identify lessons that strengthen existing knowledge.\n\n## Instructions\n1. Take the list of extracted lessons\n2. For each lesson, search existing memory with \\`npx ca search\\`\n3. Classify each lesson:\n - **New**: No similar existing item\n - **Duplicate**: Already captured\n - **Reinforcement**: Strengthens existing item\n - **Contradiction**: Conflicts with existing item\n4. Only recommend storing New lessons\n5. Flag Contradictions for user review\n\n## Collaboration\nShare classifications with solution-writer via direct message so it knows which lessons to store. Pass results to the team for review.\n\n## Deployment\nAgentTeam member in the **compound** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\nPer lesson:\n- **Classification**: New / Duplicate / Reinforcement / Contradiction\n- **Match**: ID of matching item if applicable\n- **Recommendation**: Store / Skip / Review\n`,\n\n 'solution-writer': `---\nname: Solution Writer\ndescription: Writes final memory items in correct schema format\n---\n\n# Solution Writer\n\n## Role\nTransform approved lessons into properly formatted memory items that follow the compound-agent schema. Apply quality filters before storage.\n\n## Instructions\n1. Take approved lessons from pattern-matcher\n2. For each lesson, format as a memory item:\n - Clear, imperative insight statement\n - Specific trigger condition\n - Appropriate type classification\n3. Apply quality filters:\n - Is it novel? (not already stored)\n - Is it specific? (not vague advice)\n4. Assign severity: high (data loss/security/contradictions), medium (workflow/patterns), low (style/optimizations)\n5. Set supersedes or related links when the lesson updates existing knowledge\n6. Store via \\`npx ca learn\\`\n\n## Collaboration\nShare findings with other agents via direct message to communicate storage outcomes. Collaborate with pattern-matcher on borderline classifications.\n\n## Deployment\nAgentTeam member in the **compound** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **Stored**: List of captured items with IDs\n- **Rejected**: Items that failed quality filters, with reasons\n`,\n\n 'test-writer': `---\nname: Test Writer\ndescription: Writes failing tests before implementation exists\n---\n\n# Test Writer\n\n## Role\nWrite comprehensive failing tests that define expected behavior before any implementation exists. Follow strict TDD -- tests must fail for the right reason.\n\n## Instructions\n1. Understand the requirements (read spec, issue, or task description)\n2. Identify the public API surface to test\n3. Write tests that call the real (not-yet-existing) functions\n4. Include:\n - Happy path tests\n - Edge cases (empty input, boundaries, nulls)\n - Error cases (invalid input, failure modes)\n5. Use clear test names describing expected behavior\n6. Run tests to verify they fail for the RIGHT reason (missing implementation, not syntax errors)\n7. Do NOT mock the thing being tested\n8. For multiple test files, spawn opus subagents to write tests in parallel (1 subagent per test file or module). Coordinate to avoid duplicate test setup.\n\n## Memory Integration\nRun \\`npx ca search\\` with the task description before writing tests. Look for known patterns, edge cases, and past mistakes relevant to the feature area.\n\n## Collaboration\nCommunicate with the implementer via direct message when tests are ready for implementation.\n\n## Deployment\nAgentTeam member in the **work** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- Test file path\n- Number of tests written\n- Confirmation that tests fail correctly\n`,\n\n 'implementer': `---\nname: Implementer\ndescription: Implements minimal code to pass failing tests\n---\n\n# Implementer\n\n## Role\nWrite the minimum code necessary to make failing tests pass. Follow the TDD green phase -- NEVER modify test files, only write implementation code.\n\n## Instructions\n1. Run the failing tests to understand what is expected\n2. Read the test file to understand the API contract\n3. Write the simplest implementation that passes each test\n4. Work one test at a time (run after each change)\n5. NEVER modify the test files to make them pass\n6. If a test seems wrong, stop and report it -- do not change it\n7. After all tests pass, look for obvious refactoring opportunities\n8. For multiple implementation files, spawn opus subagents to implement in parallel (1 subagent per module). Coordinate on shared interfaces via SendMessage.\n\n## Memory Integration\nRun \\`npx ca search\\` with the task description for known patterns, solutions, and implementation approaches relevant to the feature area.\n\n## Collaboration\nCommunicate with the test-writer via direct message when implementation questions arise.\n\n## Deployment\nAgentTeam member in the **work** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- Implementation file path\n- Tests passing: X/Y\n- Any concerns about test correctness\n`,\n};\n","/**\n * Review agent role skills for the plan, brainstorm, and review phases.\n *\n * 2 research subagents + 5 specialized reviewers = 7 entries.\n * These are installed as .claude/skills/compound/agents/<name>/SKILL.md.\n */\n\nexport const REVIEW_ROLE_SKILLS: Record<string, string> = {\n 'repo-analyst': `---\nname: Repo Analyst\ndescription: Analyzes repository structure, conventions, and patterns\n---\n\n# Repo Analyst\n\n## Role\nAnalyze the repository to understand its structure, coding conventions, tech stack, and established patterns. Provides context for planning and decision-making.\n\n## Instructions\n1. Read the project root for config files (package.json, tsconfig, etc.)\n2. Map the directory structure (src/, tests/, docs/)\n3. Identify the tech stack and dependencies\n4. Note coding conventions (naming, file organization, patterns)\n5. Check for existing documentation (README, CONTRIBUTING, CLAUDE.md)\n6. Summarize findings concisely\n7. For large repositories, spawn opus subagents to analyze different directory trees in parallel. Merge findings.\n\n## Collaboration\nReturn findings directly to the caller for synthesis into the plan.\n\n## Deployment\nSubagent spawned via the Task tool during the **plan** and **brainstorm** phases. Return findings directly to the caller.\n\n## Output Format\nReturn a structured summary:\n- **Stack**: Language, framework, key dependencies\n- **Structure**: Directory layout and module organization\n- **Conventions**: Naming, patterns, style\n- **Entry points**: Main files, CLI, API surface\n`,\n\n 'memory-analyst': `---\nname: Memory Analyst\ndescription: Searches and retrieves relevant memory items for context\n---\n\n# Memory Analyst\n\n## Role\nSearch compound-agent memory to find relevant lessons, patterns, and decisions from past sessions. Injects historical knowledge into the current workflow.\n\n## Instructions\n1. Identify the key topics from the current task\n2. Use \\`npx ca search\\` with relevant queries\n3. Search with multiple query variations for coverage\n4. Filter results by relevance and recency\n5. Summarize applicable lessons concisely\n6. For broad topics, spawn opus subagents with different query variations in parallel. Merge and deduplicate results.\n\n## Collaboration\nReturn findings directly to the caller for synthesis into the plan.\n\n## Deployment\nSubagent spawned via the Task tool during the **plan** and **brainstorm** phases. Return findings directly to the caller.\n\n## Output Format\nReturn a list of relevant memory items:\n- **Item ID**: For reference\n- **Summary**: What was learned\n- **Applicability**: How it relates to the current task\n`,\n\n 'security-reviewer': `---\nname: Security Reviewer\ndescription: Reviews code for security vulnerabilities\n---\n\n# Security Reviewer\n\n## Role\nReview code changes for security vulnerabilities including OWASP top 10, injection attacks, authentication issues, and data exposure risks.\n\n## Instructions\n1. Read the changed files completely\n2. Check for injection vulnerabilities (SQL, command, XSS)\n3. Verify input validation and sanitization\n4. Review authentication and authorization logic\n5. Check for hardcoded secrets or credentials\n6. Verify error messages do not leak sensitive info\n7. Check dependency versions for known CVEs\n8. For large diffs, spawn opus subagents to review different file groups in parallel (e.g., 1 per module). Merge findings and deduplicate.\n\n## Collaboration\nShare cross-cutting findings via SendMessage: security issues impacting architecture go to architecture-reviewer; secrets in test fixtures go to test-coverage-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\nReturn findings as:\n- **CRITICAL**: Must fix before merge\n- **WARNING**: Should fix, potential risk\n- **INFO**: Best practice suggestion\n`,\n\n 'architecture-reviewer': `---\nname: Architecture Reviewer\ndescription: Reviews code for architectural compliance and design integrity\n---\n\n# Architecture Reviewer\n\n## Role\nReview code for architectural consistency, pattern compliance, module boundary integrity, and adherence to established project conventions.\n\n## Instructions\n1. Read CLAUDE.md and project docs for established patterns\n2. Review the changed code against those patterns\n3. Check module boundaries are respected (no circular deps)\n4. Verify public API surface is minimal\n5. Ensure new code follows existing conventions\n6. Check that dependencies flow in the correct direction\n7. For changes spanning multiple modules, spawn opus subagents to review each module boundary in parallel.\n\n## Collaboration\nShare cross-cutting findings via SendMessage: architecture issues with performance implications go to performance-reviewer; structural violations creating security risks go to security-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **VIOLATION**: Breaks established architecture\n- **DRIFT**: Inconsistent with conventions but functional\n- **SUGGESTION**: Improvement opportunity\n`,\n\n 'performance-reviewer': `---\nname: Performance Reviewer\ndescription: Reviews code for performance issues and resource usage\n---\n\n# Performance Reviewer\n\n## Role\nReview code for performance bottlenecks, algorithmic complexity issues, unnecessary resource consumption, and scalability concerns.\n\n## Instructions\n1. Read the changed code and identify hot paths\n2. Check algorithmic complexity (avoid O(n^2) where O(n) works)\n3. Look for unnecessary allocations or copies\n4. Verify I/O operations are batched where possible\n5. Check for missing indexes on database queries\n6. Verify resources are properly closed/released\n7. For multiple hot paths, spawn opus subagents to profile different modules in parallel.\n\n## Collaboration\nShare cross-cutting findings via SendMessage: performance issues needing test coverage go to test-coverage-reviewer; performance fixes requiring architectural changes go to architecture-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **BOTTLENECK**: Measurable performance issue\n- **CONCERN**: Potential issue at scale\n- **OK**: No issues found\n`,\n\n 'test-coverage-reviewer': `---\nname: Test Coverage Reviewer\ndescription: Reviews test quality, assertions, and edge case coverage\n---\n\n# Test Coverage Reviewer\n\n## Role\nReview tests for meaningful assertions, edge case coverage, and absence of cargo-cult patterns. Ensures tests actually verify behavior, not just run without errors.\n\n## Instructions\n1. Read each test file completely\n2. Verify every test has meaningful assertions (not just expect(true))\n3. Check that tests would fail if the implementation is wrong\n4. Look for missing edge cases (empty input, nulls, boundaries)\n5. Verify no mocked business logic (vi.mock on the thing being tested)\n6. Check test names describe expected behavior\n7. Ensure property-based tests exist for pure functions\n8. For many test files, spawn opus subagents to review test files in parallel (1 per test file).\n\n## Collaboration\nShare cross-cutting findings via SendMessage: cargo-cult tests hiding security issues go to security-reviewer; unnecessary test complexity goes to simplicity-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **CARGO-CULT**: Test passes regardless of implementation\n- **GAP**: Missing edge case or scenario\n- **WEAK**: Assertion exists but is insufficient\n- **GOOD**: Test is meaningful and complete\n`,\n\n 'simplicity-reviewer': `---\nname: Simplicity Reviewer\ndescription: Reviews code for unnecessary complexity and over-engineering\n---\n\n# Simplicity Reviewer\n\n## Role\nReview code for unnecessary complexity, over-engineering, premature abstraction, and YAGNI violations. Champion the simplest solution that works.\n\n## Instructions\n1. Read the changed code and its context\n2. Ask: \"Could this be simpler while still correct?\"\n3. Flag premature abstractions (used in only one place)\n4. Flag unnecessary indirection or wrapper layers\n5. Flag feature flags or config for single-use cases\n6. Verify no \"just in case\" code exists\n\n## Collaboration\nShare cross-cutting findings via SendMessage: over-engineering obscuring security concerns goes to security-reviewer; premature abstractions creating wrong module boundaries goes to architecture-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **OVER-ENGINEERED**: Simpler solution exists\n- **YAGNI**: Feature not needed yet\n- **OK**: Appropriate complexity for the task\n`,\n};\n","/**\n * Phase 11 agent role skills: compounding, audit, doc-gardener, CCT, drift detection.\n *\n * 1 AgentTeam member (compounding) + 4 subagents = 5 entries.\n * These are installed as .claude/skills/compound/agents/<name>/SKILL.md.\n */\n\nexport const PHASE11_ROLE_SKILLS: Record<string, string> = {\n 'compounding': `---\nname: Compounding Agent\ndescription: Clusters similar lessons and synthesizes testable patterns\n---\n\n# Compounding Agent\n\n## Role\nCluster similar lessons from memory and synthesize them into testable CCT (Compound Corrective Test) patterns. Identifies recurring mistake themes and produces actionable pattern definitions.\n\n## Instructions\n1. Read existing lessons from \\`.claude/lessons/index.jsonl\\`\n2. Use \\`npx ca search\\` with broad queries to find related items\n3. Cluster lessons by similarity (same root cause, same domain, same mistake type)\n4. For each cluster with 2+ items, synthesize a CCT pattern:\n - Pattern name and trigger condition\n - What tests should exist to prevent recurrence\n - Confidence level based on cluster size\n5. Write patterns to \\`.claude/lessons/cct-patterns.jsonl\\`\n6. Skip singleton lessons (not enough signal to form a pattern)\n7. For many clusters, spawn opus subagents to synthesize patterns from different clusters in parallel.\n\n## Collaboration\nShare synthesized patterns with the team lead via direct message for review.\n\n## Deployment\nAgentTeam member in the **compound** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\n- **Patterns written**: Count and file path\n- **Clusters found**: Summary of each cluster\n- **Singletons skipped**: Count of unclustered lessons\n`,\n\n 'audit': `---\nname: Audit Agent\ndescription: Deep semantic analysis of codebase against rules, patterns, and lessons\n---\n\n# Audit Agent\n\n## Role\nPerform deep semantic analysis of the codebase against project rules, established patterns, and stored lessons. Identifies violations, drift, and improvement opportunities.\n\n## Instructions\n1. Run \\`npx ca audit --json\\` to get structured audit findings\n2. Interpret each finding's severity and context\n3. Cross-reference findings with \\`npx ca search\\` for known exceptions or decisions\n4. For each finding, suggest a specific fix or explain why it can be ignored\n5. Group findings by category (security, architecture, testing, conventions)\n6. Prioritize by impact: data loss risks first, then correctness, then style\n\n## Deployment\nSubagent spawned via the Task tool. Return findings directly to the caller.\n\n## Output Format\n- **CRITICAL**: Must fix immediately (security, data loss)\n- **WARNING**: Should fix soon (correctness, architecture drift)\n- **INFO**: Improvement suggestion (conventions, style)\n`,\n\n 'doc-gardener': `---\nname: Doc Gardener\ndescription: Audits project documentation for freshness, accuracy, and completeness\n---\n\n# Doc Gardener\n\n## Role\nAudit project documentation for freshness, accuracy, and completeness. Identify stale docs, missing references, and broken links. Ensure docs/INDEX.md accurately reflects the documentation tree.\n\n## Instructions\n1. Read \\`docs/INDEX.md\\` to get the documentation map\n2. Use Glob to find all .md files under docs/\n3. Cross-reference: every doc in INDEX should exist on disk, every doc on disk should be in INDEX\n4. For each doc, check:\n - Does it reference files/functions that still exist? (use Grep)\n - Does it describe the current behavior? (compare with source)\n - Is the last-modified date reasonable?\n5. Flag issues and create beads issues for stale docs\n\n## Deployment\nSubagent spawned via the Task tool. Return findings directly to the caller.\n\n## Output Format\nPer document:\n- **STALE**: References outdated code or behavior\n- **MISSING**: Referenced in INDEX but file not found\n- **SUPERSEDED**: Content duplicated or replaced elsewhere\n- **OK**: Current and accurate\n`,\n\n 'cct-subagent': `---\nname: CCT Subagent\ndescription: Injects mistake-derived test requirements into the TDD pipeline\n---\n\n# CCT Subagent\n\n## Role\nInject mistake-derived test requirements into the TDD pipeline. Runs between invariant-designer and test-first-enforcer to ensure past mistakes generate preventive tests.\n\n## Pipeline Position\ninvariant-designer -> **CCT Subagent** -> test-first-enforcer\n\n## Instructions\n1. Read CCT patterns from \\`.claude/lessons/cct-patterns.jsonl\\`\n2. Read the current task description and changed files\n3. Match patterns against the current task:\n - Compare task domain, file paths, and error categories\n - Check if the pattern's trigger condition applies\n4. For each matching pattern, output a test requirement:\n - What the test should verify\n - Why it matters (link to historical mistakes)\n - Priority (REQUIRED vs SUGGESTED)\n5. Pass requirements to test-first-enforcer for inclusion\n\n## Deployment\nSubagent in the TDD pipeline. Return findings directly to the caller.\n\n## Output Format\nPer match:\n- **REQUIRED TEST**: Must be written (high-confidence pattern match)\n- **SUGGESTED TEST**: Should consider (partial match)\n- **NO MATCH**: Pattern does not apply to current task\n`,\n\n 'drift-detector': `---\nname: Drift Detector\ndescription: Checks implementation for drift from established constraints\n---\n\n# Drift Detector\n\n## Role\nDetect drift between implementation and established constraints (invariants, ADRs, architectural decisions). Runs between module-boundary-reviewer and implementation-reviewer as a final consistency check.\n\n## Pipeline Position\nmodule-boundary-reviewer -> **Drift Detector** -> implementation-reviewer\n\n## Instructions\n1. Run \\`npx ca audit --json\\` for automated constraint checking\n2. Read invariants from \\`docs/invariants/\\` if present\n3. Read relevant ADRs from \\`docs/adr/\\` if present\n4. Compare the current implementation against each constraint:\n - Are module boundaries respected?\n - Do data flows match documented architecture?\n - Are naming conventions consistent?\n5. Use \\`npx ca search\\` for past architectural decisions that may apply\n6. Report any deviation, even if the implementation \"works\"\n\n## Deployment\nSubagent in the TDD pipeline. Return findings directly to the caller.\n\n## Output Format\n- **DRIFT**: Implementation violates a documented constraint\n- **RISK**: Implementation is borderline; may drift further\n- **CLEAR**: Implementation aligns with all constraints\n`,\n};\n","import { WORKFLOW_ROLE_SKILLS } from './agent-role-skills-workflow.js';\nimport { REVIEW_ROLE_SKILLS } from './agent-role-skills-review.js';\nimport { PHASE11_ROLE_SKILLS } from './agent-role-skills-phase11.js';\n\nexport const AGENT_ROLE_SKILLS: Record<string, string> = {\n ...WORKFLOW_ROLE_SKILLS,\n ...REVIEW_ROLE_SKILLS,\n ...PHASE11_ROLE_SKILLS,\n};\n","/**\n * Workflow slash command templates for .claude/commands/compound/.\n */\n\nexport const WORKFLOW_COMMANDS: Record<string, string> = {\n 'brainstorm.md': `---\nname: compound:brainstorm\ndescription: Explore requirements through collaborative dialogue before committing to a plan\nargument-hint: \"<goal or topic to brainstorm>\"\n---\n$ARGUMENTS\n\n# Brainstorm\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/brainstorm/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'plan.md': `---\nname: compound:plan\ndescription: Create a structured implementation plan with concrete tasks and dependencies\nargument-hint: \"<goal or epic to plan>\"\n---\n$ARGUMENTS\n\n# Plan\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/plan/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'work.md': `---\nname: compound:work\ndescription: Execute implementation by delegating to an agent team\nargument-hint: \"<task ID or description>\"\n---\n$ARGUMENTS\n\n# Work\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/work/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'review.md': `---\nname: compound:review\ndescription: Multi-agent code review with severity classification and mandatory gate\nargument-hint: \"<scope or git diff range>\"\n---\n$ARGUMENTS\n\n# Review\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/review/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'compound.md': `---\nname: compound:compound\ndescription: Capture high-quality lessons from completed work into the memory system\nargument-hint: \"<topic or epic context>\"\n---\n$ARGUMENTS\n\n# Compound\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/compound/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'lfg.md': `---\nname: compound:lfg\ndescription: Full workflow cycle chaining all five phases\nargument-hint: \"<goal>\"\ndisable-model-invocation: true\n---\n$ARGUMENTS\n\n# LFG\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/lfg/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full orchestration workflow you must follow.\n`,\n\n 'set-worktree.md': `---\nname: compound:set-worktree\ndescription: Set up a git worktree for isolated epic execution\nargument-hint: \"<epic-id>\"\n---\n$ARGUMENTS\n\n# Set Worktree\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/set-worktree/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'research.md': `---\nname: compound:research\ndescription: Deep research on a topic producing a structured survey document\nargument-hint: \"<topic to research>\"\n---\n$ARGUMENTS\n\n# Research\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/researcher/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n 'test-clean.md': `---\nname: compound:test-clean\ndescription: Multi-phase test suite optimization with adversarial review\nargument-hint: \"<scope or module to analyze>\"\n---\n$ARGUMENTS\n\n# Test Clean\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/test-cleaner/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file. It contains the full workflow you must follow.\n`,\n\n // =========================================================================\n // Utility commands (kept: learn, prime)\n // Removed in v1.3: search, list, show, wrong, stats (CLI wrappers)\n // =========================================================================\n\n 'learn.md': `---\nname: compound:learn\ndescription: Capture a lesson from this session into the memory system\nargument-hint: \"<insight to remember>\"\n---\nCapture a lesson from this session.\n\nUsage: /compound learn <insight>\n\nExamples:\n- /compound learn \"Always use Polars for large CSV files\"\n- /compound learn \"API requires X-Request-ID header\"\n\n\\`\\`\\`bash\nnpx ca learn \"$ARGUMENTS\"\n\\`\\`\\`\n`,\n 'prime.md': `---\nname: compound:prime\ndescription: Load compound-agent workflow context after compaction or context loss\n---\nLoad compound-agent workflow context after compaction or context loss.\n\n\\`\\`\\`bash\nnpx ca prime\n\\`\\`\\`\n`,\n};\n","/* eslint-disable max-lines -- template data file; multiline string constant */\n/**\n * Documentation templates deployed to consumer repos.\n * Written to docs/compound/ during setup.\n *\n * Split into 5 files for maintainability:\n * README.md, WORKFLOW.md, CLI_REFERENCE.md, SKILLS.md, INTEGRATION.md\n */\n\nexport const DOC_TEMPLATES: Record<string, string> = {\n 'README.md': `---\nversion: \"{{VERSION}}\"\nlast-updated: \"{{DATE}}\"\nsummary: \"Overview and getting started guide for compound-agent\"\n---\n\n# Compound Agent\n\nA learning system for Claude Code that captures, indexes, and retrieves lessons learned during development sessions -- so the same mistakes are not repeated.\n\n---\n\n## What is compound-agent?\n\nCompound-agent is a TypeScript CLI plugin for Claude Code. When Claude makes a mistake and gets corrected, or discovers a useful pattern, that knowledge is stored as a **memory item** in \\`.claude/lessons/index.jsonl\\`. Future sessions search this memory before planning and implementing.\n\nThe system uses:\n\n- **JSONL storage** (\\`.claude/lessons/index.jsonl\\`) as the git-tracked source of truth\n- **SQLite + FTS5** (\\`.claude/.cache/lessons.sqlite\\`) as a rebuildable search index\n- **Semantic embeddings** (EmbeddingGemma-300M via node-llama-cpp) for vector similarity search\n- **Claude Code hooks** to inject memory at session start, before compaction, and on tool failures\n\nMemory items have four types: \\`lesson\\`, \\`solution\\`, \\`pattern\\`, and \\`preference\\`. Each has a trigger, an insight, tags, severity, and optional citations.\n\n---\n\n## Quick start\n\n\\`\\`\\`bash\n# Initialize in your project:\nnpx ca init\n\n# Full setup (includes embedding model download):\nnpx ca setup\n\n# Verify installation:\nnpx ca doctor\n\\`\\`\\`\n\n### What \\`init\\` does\n\n1. Creates \\`.claude/lessons/\\` directory and empty \\`index.jsonl\\`\n2. Updates \\`AGENTS.md\\` with a compound-agent section\n3. Adds a reference to \\`.claude/CLAUDE.md\\`\n4. Creates \\`.claude/plugin.json\\` manifest\n5. Installs agent templates, workflow commands, phase skills, and agent role skills\n6. Installs a git pre-commit hook (lesson capture reminder)\n7. Installs Claude Code hooks (SessionStart, PreCompact, UserPromptSubmit, PostToolUseFailure, PostToolUse)\n8. For pnpm projects: auto-configures \\`onlyBuiltDependencies\\` for native addons\n\n\\`setup\\` does everything \\`init\\` does, plus downloads the EmbeddingGemma-300M model (~278MB). Use \\`--skip-model\\` to skip the download.\n\n---\n\n## Directory structure\n\n\\`\\`\\`\n.claude/\n CLAUDE.md # Project instructions (always loaded)\n compound-agent.json # Config (created by \\`npx ca reviewer enable\\`)\n settings.json # Claude Code hooks\n plugin.json # Plugin manifest\n agents/compound/ # Subagent definitions\n commands/compound/ # Slash commands (brainstorm, plan, work, review, compound, lfg)\n skills/compound/ # Phase skills + agent role skills\n lessons/\n index.jsonl # Memory items (git-tracked source of truth)\n .cache/\n lessons.sqlite # Rebuildable search index (.gitignore)\n\\`\\`\\`\n\n---\n\n## Quick reference\n\n| Task | Command |\n|------|---------|\n| Capture a lesson | \\`npx ca learn \"insight\" --trigger \"what happened\"\\` |\n| Search memory | \\`npx ca search \"keywords\"\\` |\n| Check plan against memory | \\`npx ca check-plan --plan \"description\"\\` |\n| View stats | \\`npx ca stats\\` |\n| Run full workflow | \\`/compound:lfg <epic-id>\\` |\n| Health check | \\`npx ca doctor\\` |\n\n---\n\n## Further reading\n\n- [WORKFLOW.md](WORKFLOW.md) -- The 5-phase development workflow and LFG orchestrator\n- [CLI_REFERENCE.md](CLI_REFERENCE.md) -- Complete CLI command reference\n- [SKILLS.md](SKILLS.md) -- Phase skills and agent role skills\n- [INTEGRATION.md](INTEGRATION.md) -- Memory system, hooks, beads, and agent guidance\n`,\n\n 'WORKFLOW.md': `---\nversion: \"{{VERSION}}\"\nlast-updated: \"{{DATE}}\"\nsummary: \"The 5-phase compound-agent workflow and LFG orchestrator\"\n---\n\n# Workflow\n\nEvery feature or epic follows five phases. The \\`/compound:lfg\\` skill chains them with enforcement gates.\n\n---\n\n## Phase 1: Brainstorm\n\nExplore the problem space before committing to a solution.\n\n- Ask \"why\" before \"how\"\n- Search memory for similar past features\n- Generate multiple approaches, then converge\n- Create a beads epic: \\`bd create --title=\"...\" --type=epic\\`\n\n## Phase 2: Plan\n\nDecompose work into small, testable tasks with dependencies.\n\n- Review brainstorm output\n- Create beads tasks: \\`bd create --title=\"...\" --type=task\\`\n- Create Review and Compound blocking tasks (these survive compaction)\n- Run \\`npx ca worktree wire-deps <epic-id>\\` if using worktrees\n\n## Phase 3: Work\n\nExecute implementation through agent teams using TDD.\n\n- Pick tasks from \\`bd ready\\`\n- Delegate to test-writer and implementer agents\n- Commit incrementally as tests pass\n- Run \\`/implementation-reviewer\\` before closing tasks\n\n## Phase 4: Review\n\nMulti-agent code review with severity classification.\n\n- Run quality gates: \\`pnpm test && pnpm lint\\`\n- Spawn specialized reviewers (security, architecture, performance, etc.)\n- Classify findings as P1/P2/P3\n- Fix all P1 findings before proceeding\n\n## Phase 5: Compound\n\nExtract and store lessons learned. This is what makes the system compound.\n\n- Analyze what happened during the cycle\n- Capture lessons via \\`npx ca learn\\`\n- Cluster patterns via \\`npx ca compound\\`\n- Update outdated docs and ADRs\n\n---\n\n## LFG orchestrator\n\n\\`/compound:lfg\\` chains all 5 phases with enforcement gates.\n\n### Invocation\n\n\\`\\`\\`\n/compound:lfg <epic-id>\n/compound:lfg <epic-id> from plan\n\\`\\`\\`\n\n### Phase execution protocol\n\nFor each phase, LFG:\n\n1. Announces progress: \\`[Phase N/5] PHASE_NAME\\`\n2. Initializes state: \\`npx ca phase-check start <phase>\\`\n3. Reads the phase skill file (non-negotiable -- never from memory)\n4. Runs \\`npx ca search\\` with the current goal\n5. Executes the phase following skill instructions\n6. Updates epic notes: \\`bd update <epic-id> --notes=\"Phase: NAME COMPLETE | Next: NEXT\"\\`\n7. Verifies the phase gate before proceeding\n\n### Phase gates\n\n| Gate | When | Verification |\n|------|------|-------------|\n| Post-plan | After Plan | \\`bd list --status=open\\` shows Review + Compound tasks |\n| Gate 3 | After Work | \\`bd list --status=in_progress\\` returns empty |\n| Gate 4 | After Review | \\`/implementation-reviewer\\` returned APPROVED |\n| Final | After Compound | \\`npx ca verify-gates <epic-id>\\` passes, \\`pnpm test\\` and \\`pnpm lint\\` pass |\n\nIf any gate fails, LFG stops. You must fix the issue before proceeding.\n\n### Resumption\n\nIf interrupted, LFG can resume:\n\n1. Run \\`bd show <epic-id>\\` and read the notes for phase state\n2. Re-invoke with \\`from <phase>\\` to skip completed phases\n\n### Phase state tracking\n\nLFG persists state in \\`.claude/.ca-phase-state.json\\`. Useful commands:\n\n\\`\\`\\`bash\nnpx ca phase-check status # See current phase state\nnpx ca phase-check clean # Reset phase state (escape hatch)\n\\`\\`\\`\n\n### Session close\n\nBefore saying \"done\", LFG runs this inviolable checklist:\n\n\\`\\`\\`bash\ngit status\ngit add <files>\nbd sync\ngit commit -m \"...\"\nbd sync\ngit push\n\\`\\`\\`\n`,\n\n 'CLI_REFERENCE.md': `---\nversion: \"{{VERSION}}\"\nlast-updated: \"{{DATE}}\"\nsummary: \"Complete CLI command reference for compound-agent\"\n---\n\n# CLI Reference\n\nAll commands use \\`npx ca\\` (or \\`npx compound-agent\\`). Global flags: \\`-v, --verbose\\` and \\`-q, --quiet\\`.\n\n---\n\n## Capture commands\n\n\\`\\`\\`bash\n# Capture a lesson (primary command)\nnpx ca learn \"Always validate epic IDs before shell execution\" \\\\\n --trigger \"Shell injection via bd show\" \\\\\n --tags \"security,validation\" \\\\\n --severity high \\\\\n --type lesson\n\n# Capture a pattern (requires --pattern-bad and --pattern-good)\nnpx ca learn \"Use execFileSync instead of execSync\" \\\\\n --type pattern \\\\\n --pattern-bad \"execSync(\\\\\\`bd show \\\\\\${id}\\\\\\`)\" \\\\\n --pattern-good \"execFileSync('bd', ['show', id])\"\n\n# Capture from trigger/insight flags\nnpx ca capture --trigger \"Tests failed after refactor\" --insight \"Run full suite after moving files\" --yes\n\n# Detect learning triggers from input file\nnpx ca detect --input corrections.json\nnpx ca detect --input corrections.json --save --yes\n\\`\\`\\`\n\n**Types**: \\`lesson\\` (default), \\`solution\\`, \\`pattern\\`, \\`preference\\`\n**Severity**: \\`high\\`, \\`medium\\`, \\`low\\`\n\n## Retrieval commands\n\n\\`\\`\\`bash\nnpx ca search \"sqlite validation\" # Keyword search\nnpx ca search \"security\" --limit 5\nnpx ca list # List all memory items\nnpx ca list --limit 20\nnpx ca list --invalidated # Show only invalidated items\nnpx ca check-plan --plan \"Implement git worktree integration\"\necho \"Add caching layer\" | npx ca check-plan # Semantic search against a plan\nnpx ca load-session # Load high-severity lessons\nnpx ca load-session --json\n\\`\\`\\`\n\n## Management commands\n\n\\`\\`\\`bash\nnpx ca show <id> # View a specific item\nnpx ca show <id> --json\nnpx ca update <id> --insight \"Updated text\" # Update item fields\nnpx ca update <id> --severity high --tags \"security,input-validation\"\nnpx ca delete <id> # Soft delete (creates tombstone)\nnpx ca delete <id1> <id2> <id3>\nnpx ca wrong <id> --reason \"Incorrect\" # Mark as invalid\nnpx ca validate <id> # Re-enable an invalidated item\nnpx ca export # Export as JSON\nnpx ca export --since 2026-01-01 --tags \"security\"\nnpx ca import lessons-backup.jsonl # Import from JSONL file\nnpx ca compact # Remove tombstones and archive old items\nnpx ca compact --dry-run\nnpx ca compact --force\nnpx ca rebuild # Rebuild SQLite index from JSONL\nnpx ca rebuild --force\nnpx ca stats # Show database health and statistics\nnpx ca prime # Reload workflow context after compaction\n\\`\\`\\`\n\n## Setup commands\n\n\\`\\`\\`bash\nnpx ca init # Initialize in current repo\nnpx ca init --skip-agents # Skip AGENTS.md and template installation\nnpx ca init --skip-hooks # Skip git hook installation\nnpx ca init --skip-claude # Skip Claude Code hooks\nnpx ca init --json # Output result as JSON\nnpx ca setup # Full setup (init + model download)\nnpx ca setup --update # Regenerate templates (preserves user files)\nnpx ca setup --uninstall # Remove compound-agent integration\nnpx ca setup --status # Show installation status\nnpx ca setup --skip-model # Skip embedding model download\nnpx ca setup claude # Install Claude Code hooks only\nnpx ca setup claude --status # Check hook status\nnpx ca hooks # Install git hooks\nnpx ca download-model # Download embedding model (~278MB)\n\\`\\`\\`\n\n## Reviewer commands\n\n\\`\\`\\`bash\nnpx ca reviewer enable gemini # Enable Gemini as external reviewer\nnpx ca reviewer enable codex # Enable Codex as external reviewer\nnpx ca reviewer disable gemini # Disable a reviewer\nnpx ca reviewer list # List enabled reviewers\n\\`\\`\\`\n\n## Loop command\n\n\\`\\`\\`bash\nnpx ca loop # Generate infinity loop script for autonomous processing\nnpx ca loop --epics epic-1 epic-2\nnpx ca loop --output my-loop.sh\nnpx ca loop --max-retries 5\nnpx ca loop --model claude-opus-4-6\nnpx ca loop --force # Overwrite existing script\n\\`\\`\\`\n\n## Health, audit, and verification commands\n\n\\`\\`\\`bash\nnpx ca about # Show version, animation, and recent changelog\nnpx ca doctor # Check external dependencies and project health\nnpx ca audit # Run pattern, rule, and lesson quality checks\nnpx ca rules check # Check codebase against .claude/rules.json\nnpx ca test-summary # Run tests and output compact pass/fail summary\nnpx ca verify-gates <epic-id> # Verify workflow gates before epic closure\nnpx ca phase-check init <epic-id>\nnpx ca phase-check status\nnpx ca phase-check start <phase>\nnpx ca phase-check gate <gate-name> # post-plan, gate-3, gate-4, final\nnpx ca phase-check clean\n\\`\\`\\`\n\n## Worktree commands\n\n\\`\\`\\`bash\nnpx ca worktree create <epic-id> # Create isolated worktree\nnpx ca worktree wire-deps <epic-id> # Connect merge dependencies\nnpx ca worktree merge <epic-id> # Merge worktree back to main\nnpx ca worktree list # List active worktrees\nnpx ca worktree cleanup <epic-id> # Remove worktree and clean up\nnpx ca worktree cleanup <epic-id> --force # Force cleanup of dirty worktrees\n\\`\\`\\`\n\n## Compound command\n\n\\`\\`\\`bash\nnpx ca compound # Synthesize cross-cutting patterns from accumulated lessons\n\\`\\`\\`\n`,\n\n 'SKILLS.md': `---\nversion: \"{{VERSION}}\"\nlast-updated: \"{{DATE}}\"\nsummary: \"Phase skills and agent role skills reference\"\n---\n\n# Skills Reference\n\nSkills are instructions that Claude reads before executing each phase. They live in \\`.claude/skills/compound/\\` and are auto-installed by \\`npx ca setup\\`.\n\n---\n\n## Phase skills\n\n### \\`/compound:brainstorm\\`\n\n**Purpose**: Divergent-then-convergent thinking to explore the solution space.\n\n**When invoked**: At the start of a new feature or epic, before any planning.\n\n**What it does**: Spawns research subagents, searches memory for similar past features, generates multiple approaches, converges on a decision with documented rationale, and creates a beads epic.\n\n### \\`/compound:plan\\`\n\n**Purpose**: Decompose work into small testable tasks with dependencies.\n\n**When invoked**: After brainstorm, before any implementation.\n\n**What it does**: Reviews brainstorm output, spawns analysts, decomposes into tasks with acceptance criteria, creates beads issues, and creates Review + Compound blocking tasks. Runs \\`npx ca worktree wire-deps\\` if a worktree is active.\n\n### \\`/compound:work\\`\n\n**Purpose**: Team-based TDD execution with adaptive complexity.\n\n**When invoked**: After plan, when tasks are ready in beads.\n\n**What it does**: Picks tasks from \\`bd ready\\`, deploys an AgentTeam with test-writers and implementers, coordinates agent work, commits incrementally, runs \\`/implementation-reviewer\\` as mandatory gate.\n\n### \\`/compound:review\\`\n\n**Purpose**: Multi-agent review with parallel specialized reviewers.\n\n**When invoked**: After all work tasks are closed.\n\n**What it does**: Runs quality gates, selects reviewer tier based on diff size (4-11 reviewers), spawns reviewers in an AgentTeam, classifies findings by severity, fixes all P1s, runs \\`/implementation-reviewer\\`.\n\n### \\`/compound:compound\\`\n\n**Purpose**: Reflect on the cycle and capture lessons for future sessions.\n\n**When invoked**: After review is approved.\n\n**What it does**: Spawns an analysis pipeline (context-analyzer, lesson-extractor, pattern-matcher, solution-writer, compounding), applies quality filters, classifies items by type and severity, stores via \\`npx ca learn\\`, runs \\`npx ca verify-gates\\`.\n\n### \\`/compound:lfg\\`\n\n**Purpose**: Full-cycle orchestrator chaining all five phases.\n\n**When invoked**: When you want to run an entire epic end-to-end.\n\n**What it does**: Sequences all 5 phases with mandatory gates between them, tracks progress in beads notes, handles resumption after interruption. See [WORKFLOW.md](WORKFLOW.md) for full details.\n\n### \\`/compound:set-worktree\\`\n\n**Purpose**: Set up an isolated git worktree before running LFG.\n\n**When invoked**: Before \\`/compound:lfg\\` when you want parallel epic execution.\n\n**What it does**: Validates the epic, runs \\`npx ca worktree create <epic-id>\\`, verifies output, and informs the user they can proceed with \\`/compound:lfg\\`.\n\n---\n\n## Skill invocation\n\nSkills are invoked as Claude Code slash commands:\n\n\\`\\`\\`\n/compound:brainstorm # Start brainstorm phase\n/compound:plan # Start plan phase\n/compound:work # Start work phase\n/compound:review # Start review phase\n/compound:compound # Start compound phase\n/compound:lfg <epic-id> # Run all phases end-to-end\n/compound:set-worktree <epic-id> # Set up worktree before LFG\n\\`\\`\\`\n\nEach skill reads its SKILL.md file from \\`.claude/skills/compound/<phase>/SKILL.md\\` at invocation time. Skills are never executed from memory.\n`,\n\n 'INTEGRATION.md': `---\nversion: \"{{VERSION}}\"\nlast-updated: \"{{DATE}}\"\nsummary: \"Memory system, hooks, beads integration, and agent guidance\"\n---\n\n# Integration\n\nDeep integration topics for compound-agent: memory system internals, Claude Code hooks, beads workflow, worktree integration, and agent guidance.\n\n---\n\n## Memory system\n\n### Storage format\n\nMemory items are stored as newline-delimited JSON in \\`.claude/lessons/index.jsonl\\`. Each line is a complete JSON object:\n\n\\`\\`\\`json\n{\"id\":\"L-abc123\",\"type\":\"lesson\",\"trigger\":\"Shell injection via execSync\",\"insight\":\"Use execFileSync with array args\",\"tags\":[\"security\"],\"source\":\"manual\",\"context\":{\"tool\":\"cli\",\"intent\":\"manual learning\"},\"created\":\"2026-02-15T10:00:00Z\",\"confirmed\":true,\"severity\":\"high\",\"supersedes\":[],\"related\":[]}\n\\`\\`\\`\n\n### Indexing\n\nThe SQLite index at \\`.claude/.cache/lessons.sqlite\\` provides:\n\n- **FTS5 full-text search** for keyword queries (\\`npx ca search\\`)\n- **Embedding cache** for vector similarity (avoids re-computing embeddings)\n- **Retrieval count tracking** for usage statistics\n\nThe index is rebuilt automatically when the JSONL changes. Force rebuild with \\`npx ca rebuild --force\\`.\n\n### Search mechanisms\n\n**Keyword search** (\\`npx ca search\\`): Uses SQLite FTS5 to match words in trigger, insight, and tags.\n\n**Semantic search** (\\`npx ca check-plan\\`): Embeds the query text and compares cosine similarity against stored lesson embeddings. Results are ranked with configurable boosts for severity, recency, and confirmation status.\n\n**Session loading** (\\`npx ca load-session\\`): Returns high-severity confirmed lessons for injection at session start.\n\n### Data lifecycle\n\n| Operation | Effect |\n|-----------|--------|\n| \\`npx ca learn\\` | Appends a new item to JSONL |\n| \\`npx ca update\\` | Appends an updated version (last-write-wins) |\n| \\`npx ca delete\\` | Appends with \\`deleted: true\\` flag |\n| \\`npx ca wrong\\` | Sets \\`invalidatedAt\\` (excluded from retrieval, preserved in storage) |\n| \\`npx ca compact\\` | Removes tombstones and archives old items, then rebuilds index |\n\n---\n\n## Claude Code hooks\n\nCompound-agent installs five hooks into \\`.claude/settings.json\\`:\n\n| Hook | Trigger | Action |\n|------|---------|--------|\n| **SessionStart** | New session or resume | Runs \\`npx ca prime\\` to load workflow context and high-severity lessons |\n| **PreCompact** | Before context compaction | Runs \\`npx ca prime\\` to preserve context across compaction |\n| **UserPromptSubmit** | Every user message | Detects correction/planning language, injects memory reminders |\n| **PostToolUseFailure** | Bash/Edit/Write failures | After 2 failures on same file or 3 total, suggests \\`npx ca search\\` |\n| **PostToolUse** | After successful tool use | Resets failure tracking; tracks skill file reads for phase guard |\n\n### Memory usage during sessions\n\n**At session start**: High-severity lessons are automatically loaded via the SessionStart hook.\n\n**Before planning**: Search memory for relevant context:\n\n\\`\\`\\`bash\nnpx ca search \"feature area keywords\"\nnpx ca check-plan --plan \"description of what you are about to implement\"\n\\`\\`\\`\n\n**After corrections**: Capture what you learned:\n\n\\`\\`\\`bash\nnpx ca learn \"The insight\" --trigger \"What happened\" --severity medium\n\\`\\`\\`\n\n**At session end**: Run the compound phase to extract patterns:\n\n\\`\\`\\`bash\nnpx ca compound\n\\`\\`\\`\n\n---\n\n## Beads integration\n\nCompound-agent works with beads (\\`bd\\`) for issue tracking:\n\n\\`\\`\\`bash\nbd ready # Find available tasks\nbd show <id> # View task details\nbd create --title=\"...\" --type=task --priority=2\nbd update <id> --status=in_progress\nbd close <id>\nbd sync # Sync with git remote\n\\`\\`\\`\n\nThe plan phase creates Review and Compound blocking tasks that depend on work tasks. This ensures these phases surface via \\`bd ready\\` after work completes, surviving context compaction.\n\n### Verification gates\n\nBefore closing an epic, verify all gates pass:\n\n\\`\\`\\`bash\nnpx ca verify-gates <epic-id>\n\\`\\`\\`\n\nThis checks that a Review task, Compound task, and (if applicable) Merge task all exist and are closed.\n\n---\n\n## Worktree integration\n\nWorktrees let you run epics in isolation, enabling parallel execution across multiple Claude Code sessions.\n\n\\`\\`\\`bash\nnpx ca worktree create <epic-id> # Creates worktree + installs deps + copies lessons\nnpx ca worktree merge <epic-id> # Two-phase merge back to main\nnpx ca worktree cleanup <epic-id> # Remove worktree, delete branch, close Merge task\nnpx ca worktree list # Show active worktrees\n\\`\\`\\`\n\nSee [CLI_REFERENCE.md](CLI_REFERENCE.md) for full worktree command details.\n\n---\n\n## For AI agents\n\n### Integrating into CLAUDE.md\n\nAdd a reference to compound-agent in your project's \\`.claude/CLAUDE.md\\`:\n\n\\`\\`\\`markdown\n## References\n\n- docs/compound/README.md -- Compound-agent overview and getting started\n\\`\\`\\`\n\nThe \\`npx ca init\\` command does this automatically.\n\n### Session completion checklist\n\n\\`\\`\\`bash\nnpx ca verify-gates <epic-id> # Verify review + compound tasks closed\ngit status # Check what changed\ngit add <files> # Stage code changes\nbd sync # Commit beads changes\ngit commit -m \"...\" # Commit code\nbd sync # Commit any new beads changes\ngit push # Push to remote\n\\`\\`\\`\n\nWork is not complete until \\`git push\\` succeeds.\n`,\n};\n","/* eslint-disable max-lines -- template data file; each skill is a multiline string constant */\n/**\n * Phase skill SKILL.md templates for compound workflow phases.\n * Written to .claude/skills/compound/<phase>/SKILL.md during setup.\n */\n\nexport const PHASE_SKILLS: Record<string, string> = {\n brainstorm: `---\nname: Brainstorm\ndescription: Divergent-then-convergent thinking to explore solution space\n---\n\n# Brainstorm Skill\n\n## Overview\nExplore the problem space before committing to a solution. This phase produces a structured brainstorm document with decisions, open questions, and a beads epic for handoff to planning.\n\n## Methodology\n1. Ask \"why\" before \"how\" -- understand the real problem\n2. Search memory with \\`npx ca search\\` for similar past features and known constraints\n3. Spawn **subagents** via Task tool in parallel for research (lightweight, no inter-agent coordination):\n - Available agents: \\`.claude/agents/compound/repo-analyst.md\\`, \\`memory-analyst.md\\`\n - Or use \\`subagent_type: Explore\\` for ad-hoc research\n - Deploy MULTIPLE when topic spans several domains; synthesize all findings before proceeding\n4. When facing deep unknowns or complex technical domains, invoke the **researcher skill** (read \\`.claude/skills/compound/researcher/SKILL.md\\`) to produce a structured survey document before narrowing approaches\n5. Use \\`AskUserQuestion\\` to clarify scope, constraints, and preferences\n6. Divergent phase: generate multiple approaches without filtering\n7. Identify constraints and non-functional requirements (performance, security, etc.)\n8. Convergent phase: evaluate approaches against constraints\n9. Document decisions with rationale, list open questions, and create a beads epic\n10. Auto-create ADR files in \\`docs/decisions/\\` for significant decisions (lightweight: Status, Context, Decision, Consequences)\n\n## Memory Integration\n- Run \\`npx ca search\\` with relevant keywords before generating approaches\n- Look for past architectural decisions, pitfalls, and preferences\n- If the problem domain matches past work, review those lessons first\n\n## Docs Integration\n- Spawn docs-explorer to scan \\`docs/\\` for relevant architecture docs, research, and standards\n- Review existing ADRs in \\`docs/decisions/\\` -- prior decisions may constrain the brainstorm\n- Auto-create ADR for each significant decision made during convergence\n\n## Common Pitfalls\n- Jumping to the first solution without exploring alternatives\n- Ignoring non-functional requirements (scalability, maintainability)\n- Not searching memory for similar past features\n- Not checking existing docs and ADRs for prior decisions\n- Over-scoping: trying to solve everything at once\n- Skipping the \"why\" and diving into \"how\"\n- Not invoking the researcher skill when the domain requires deep investigation\n- Not creating a beads epic from conclusions (losing brainstorm output)\n\n## Quality Criteria\n- Multiple approaches were considered (at least 2-3)\n- Constraints and requirements are explicitly listed\n- Memory was searched for relevant context\n- Existing docs and ADRs were reviewed for prior decisions\n- User was engaged via \\`AskUserQuestion\\` for clarification\n- A clear decision was made with documented rationale\n- ADRs created for significant architectural decisions\n- Open questions are captured for the plan phase\n- A beads epic was created from conclusions via \\`bd create\\`\n`,\n\n plan: `---\nname: Plan\ndescription: Decompose work into small testable tasks with clear dependencies\n---\n\n# Plan Skill\n\n## Overview\nCreate a concrete implementation plan by decomposing work into small, testable tasks with dependencies and acceptance criteria.\n\n## Methodology\n1. Review brainstorm output for decisions and open questions\n2. Search memory with \\`npx ca search\\` for architectural patterns and past mistakes\n3. Spawn **subagents** via Task tool in parallel for research (lightweight, no inter-agent coordination):\n - Available agents: \\`.claude/agents/compound/repo-analyst.md\\`, \\`memory-analyst.md\\`\n - For complex features, deploy MULTIPLE analysts per domain area\n - Synthesize all findings before decomposing into tasks\n4. For decisions requiring deep technical grounding, invoke the **researcher skill** to produce a survey document. Review findings before decomposing into tasks.\n5. Synthesize research findings into a coherent approach. Flag conflicts between ADRs and proposed plan.\n6. Use \\`AskUserQuestion\\` to resolve ambiguities, conflicting constraints, or priority trade-offs before decomposing\n7. Decompose into tasks small enough to verify individually\n8. Define acceptance criteria for each task\n9. Map dependencies between tasks\n10. Create beads issues: \\`bd create --title=\"...\" --type=task\\`\n11. Create review and compound blocking tasks (\\`bd create\\` + \\`bd dep add\\`) that depend on work tasks — these survive compaction and surface via \\`bd ready\\` after work completes\n12. Run \\`npx ca worktree wire-deps <epic-id>\\` to connect merge dependencies (graceful no-op if no worktree is active)\n\n## Memory Integration\n- Run \\`npx ca search\\` for patterns related to the feature area\n- Look for past planning mistakes (missing dependencies, unclear criteria)\n- Check for preferred architectural patterns in this codebase\n\n## Docs Integration\n- Spawn docs-analyst to scan \\`docs/\\` for relevant specs, standards, and research\n- Check \\`docs/decisions/\\` for existing ADRs that constrain or inform the plan\n- If the plan contradicts an ADR, flag it for the user before proceeding\n\n## Common Pitfalls\n- Creating too many fine-grained tasks (aim for 3-7 per feature)\n- Unclear acceptance criteria (\"make it work\" is not a criterion)\n- Missing dependencies between tasks\n- Not checking memory for past architectural decisions\n- Not reviewing existing ADRs and docs for constraints\n- Making architectural decisions without research backing (use the researcher skill for complex domains)\n- Planning implementation details too early (stay at task level)\n\n## Quality Criteria\n- Each task has clear acceptance criteria\n- Dependencies are mapped and no circular dependencies exist\n- Tasks are ordered so each can be verified independently\n- Memory was searched for relevant patterns and past mistakes\n- Existing docs and ADRs were checked for constraints\n- Ambiguities resolved via \\`AskUserQuestion\\` before decomposing\n- Complexity estimates are realistic (no \"should be quick\")\n\n## POST-PLAN VERIFICATION -- MANDATORY\nAfter creating all tasks, verify review and compound tasks exist:\n- Run \\`bd list --status=open\\` and check for a \"Review:\" task and a \"Compound:\" task\n- If either is missing, CREATE THEM NOW. The plan is NOT complete without these gates.\n- If a Merge: task exists in the dependency graph, verify it has Review and Compound as blockers (run \\`bd show <merge-id>\\` to confirm)\n`,\n\n work: `---\nname: Work\ndescription: Team-based TDD execution with adaptive complexity and agent delegation\n---\n\n# Work Skill\n\n## Overview\nExecute implementation through an AgentTeam using adaptive TDD. The lead coordinates and delegates -- agents write code.\n\n## Methodology\n1. Pick tasks from \\`bd ready\\` or \\`$ARGUMENTS\\`\n2. Mark tasks in progress: \\`bd update <id> --status=in_progress\\`\n3. Run \\`npx ca search\\` per agent/subtask for targeted context. Display results.\n4. Assess parallelization: identify independent tasks that can be worked simultaneously\n5. Deploy an **AgentTeam** (TeamCreate + Task with \\`team_name\\`) with MULTIPLE test-writers and implementers:\n - Role skills: \\`.claude/skills/compound/agents/{test-writer,implementer}/SKILL.md\\`\n - Scale teammate count to independent tasks; pairs coordinate via SendMessage on shared interfaces\n6. Agents communicate via SendMessage when working on overlapping areas.\n7. Lead coordinates: review agent outputs, resolve conflicts, verify tests pass. Do not write code directly.\n8. If blocked, use AskUserQuestion to get user direction.\n9. Shut down the team when done: send shutdown_request to all teammates.\n10. Commit incrementally as tests pass.\n11. Run full test suite for regressions.\n12. Close tasks: \\`bd close <id>\\`\n\n## Memory Integration\n- Run \\`npx ca search\\` per delegated subtask with the subtask's specific description\n- Each agent receives memory items tailored to their assigned task, not a shared blob\n- Run \\`npx ca learn\\` after corrections or novel discoveries\n\n## MANDATORY VERIFICATION -- DO NOT CLOSE TASK WITHOUT THIS\nBefore \\`bd close\\`, you MUST:\n1. Run \\`pnpm test\\` then \\`pnpm lint\\` (quality gates)\n2. Run \\`/implementation-reviewer\\` on changed code -- wait for APPROVED\nIf REJECTED: fix ALL issues, re-run tests, resubmit. INVIOLABLE per CLAUDE.md.\n\nThe full 8-step pipeline (invariant-designer through implementation-reviewer) is recommended\nfor complex changes. For all changes, \\`/implementation-reviewer\\` is the minimum required gate.\n\n## Beads Lifecycle\n- \\`bd ready\\` to find available tasks\n- \\`bd update <id> --status=in_progress\\` when starting\n- \\`bd close <id>\\` when all tests pass\n\n## Parallelization Strategy\n- **Always prefer parallel work**: independent tasks should be assigned to different teammate pairs simultaneously\n- **Scale the team adaptively**: deploy multiple test-writer + implementer pairs proportional to independent task count\n- **Subagent spawning within teammates**: each teammate should spawn opus subagents for independent subtasks (e.g., a test-writer spawning subagents to write tests for multiple modules in parallel)\n- **Coordinate on shared interfaces**: teammates working on overlapping APIs must communicate via SendMessage before implementing\n\n## Common Pitfalls\n- Lead writing code instead of delegating to agents\n- Not injecting memory context into agent prompts\n- Modifying tests to make them pass instead of fixing implementation\n- Not running the full test suite after agent work completes\n\n## Quality Criteria\n- Tests existed before implementation code\n- Agents received relevant memory context\n- Lead coordinated without writing implementation code\n- Incremental commits made as tests pass\n- All tests pass after refactoring\n- Task lifecycle tracked via beads (\\`bd\\`)\n\n## PHASE GATE 3 -- MANDATORY\nBefore starting Review, verify ALL work tasks are closed:\n- \\`bd list --status=in_progress\\` must return empty\n- \\`bd list --status=open\\` should only have Review and Compound tasks remaining\nIf any work tasks remain open, DO NOT proceed. Complete them first.\n`,\n\n review: `---\nname: Review\ndescription: Multi-agent review with parallel specialized reviewers and severity classification\n---\n\n# Review Skill\n\n## Overview\nPerform thorough code review by spawning specialized reviewers in parallel, consolidating findings with severity classification (P1/P2/P3), and gating completion on implementation-reviewer approval.\n\n## Methodology\n1. Run quality gates first: \\`pnpm test && pnpm lint\\`\n2. Search memory with \\`npx ca search\\` for known patterns and recurring issues\n3. Select reviewer tier based on diff size:\n - **Small** (<100 lines): 4 core -- security, test-coverage, simplicity, cct-reviewer\n - **Medium** (100-500): add architecture, performance, edge-case (7 total)\n - **Large** (500+): all 11 reviewers including docs, consistency, error-handling, pattern-matcher\n4. Spawn reviewers in an **AgentTeam** (TeamCreate + Task with \\`team_name\\`):\n - Role skills: \\`.claude/skills/compound/agents/{security-reviewer,architecture-reviewer,performance-reviewer,test-coverage-reviewer,simplicity-reviewer}/SKILL.md\\`\n - For large diffs (500+), deploy MULTIPLE instances; split files across instances, coordinate via SendMessage\n5. Reviewers communicate findings to each other via \\`SendMessage\\`\n6. Collect, consolidate, and deduplicate all findings\n7. Classify by severity: P1 (critical/blocking), P2 (important), P3 (minor)\n8. Use \\`AskUserQuestion\\` when severity is ambiguous or fix has multiple valid options\n9. Create beads issues for P1 findings: \\`bd create --title=\"P1: ...\"\\`\n10. Fix all P1 findings before proceeding\n11. Run \\`/implementation-reviewer\\` as mandatory gate\n12. Capture novel findings with \\`npx ca learn\\`; pattern-matcher auto-reinforces recurring issues\n\n## Memory Integration\n- Run \\`npx ca search\\` before review for known recurring issues\n- **pattern-matcher** auto-reinforces: recurring findings get severity increased via \\`npx ca learn\\`\n- **cct-reviewer** reads CCT patterns for known Claude failure patterns\n- Capture the review report via \\`npx ca learn\\` with \\`type=solution\\`\n\n## Docs Integration\n- **docs-reviewer** checks code/docs alignment and ADR compliance\n- Flags undocumented public APIs and ADR violations\n\n## Common Pitfalls\n- Ignoring reviewer feedback because \"it works\"\n- Not running all 11 reviewer perspectives (skipping dimensions)\n- Treating all findings as equal priority (classify P1/P2/P3 first)\n- Not creating beads issues for deferred fixes\n- Skipping quality gates before review\n- Bypassing the implementation-reviewer gate\n- Not checking CCT patterns for known Claude mistakes\n\n## Quality Criteria\n- All quality gates pass (\\`pnpm test\\`, lint)\n- All 11 reviewer perspectives were applied in parallel\n- Findings are classified P1/P2/P3 and deduplicated\n- pattern-matcher checked memory and reinforced recurring issues\n- cct-reviewer checked against known Claude failure patterns\n- docs-reviewer confirmed docs/ADR alignment\n- All P1 findings fixed before \\`/implementation-reviewer\\` approval\n- \\`/implementation-reviewer\\` approved as mandatory gate\n\n## PHASE GATE 4 -- MANDATORY\nBefore starting Compound, verify review is complete:\n- \\`/implementation-reviewer\\` must have returned APPROVED\n- All P1 findings must be resolved\n\n**CRITICAL**: Use \\`npx ca learn\\` for ALL lesson storage -- NOT MEMORY.md.\n`,\n\n compound: `---\nname: Compound\ndescription: Reflect on the cycle and capture high-quality lessons for future sessions\n---\n\n# Compound Skill\n\n## Overview\nExtract and store lessons learned during the cycle, and update project documentation. This is what makes the system compound -- each session leaves the next one better equipped.\n\n**CRITICAL**: Store all lessons via \\`npx ca learn\\` -- NOT via MEMORY.md, NOT via markdown files.\nLessons go to \\`.claude/lessons/index.jsonl\\` through the CLI. MEMORY.md is a different system and MUST NOT be used for compounding.\n\n## Methodology\n1. Review what happened during this cycle (git diff, test results, plan context)\n2. Spawn the analysis pipeline in an **AgentTeam** (TeamCreate + Task with \\`team_name\\`):\n - Role skills: \\`.claude/skills/compound/agents/{context-analyzer,lesson-extractor,pattern-matcher,solution-writer,compounding}/SKILL.md\\`\n - For large diffs, deploy MULTIPLE context-analyzers and lesson-extractors\n - Pipeline: context-analyzers -> lesson-extractors -> pattern-matcher + solution-writer -> compounding\n - Agents coordinate via SendMessage throughout the pipeline\n3. Agents pass results through the pipeline via \\`SendMessage\\`. The lead coordinates: context-analyzer and lesson-extractor feed pattern-matcher and solution-writer, which feed compounding.\n4. Apply quality filters: novelty check (>0.85 similarity = skip), specificity check\n5. Classify each item by type: lesson, solution, pattern, or preference\n6. Classify severity: high (data loss/security/contradictions), medium (workflow/patterns), low (style/optimizations)\n7. Store via \\`npx ca learn\\` with supersedes/related links where applicable.\n At minimum, capture 1 lesson per significant decision made during this cycle\n8. Delegate to the \\`compounding\\` subagent to run synthesis: cluster accumulated lessons by similarity and write CCT patterns to \\`.claude/lessons/cct-patterns.jsonl\\`\n9. Update outdated docs and deprecate superseded ADRs (set status to \\`deprecated\\`)\n10. Use \\`AskUserQuestion\\` to confirm high-severity items with the user before storing; medium/low items are auto-stored\n\n## Docs Integration\n- docs-reviewer checks if \\`docs/\\` content is outdated after the cycle\n- Check \\`docs/decisions/\\` for ADRs contradicted by the work done\n- Set ADR status to \\`deprecated\\` if a decision was reversed, referencing the new ADR\n\n## Common Pitfalls\n- Not spawning the analysis team (analyzing solo misses cross-cutting patterns)\n- Capturing without checking for duplicates via \\`npx ca search\\`\n- Skipping supersedes/related linking when an item updates prior knowledge\n- Not checking if docs or ADRs need updating after the cycle\n- Requiring user confirmation for every item (only high-severity needs it)\n- Not classifying items by type (lesson/solution/pattern/preference)\n- Capturing vague lessons (\"be careful with X\") -- be specific and concrete\n\n## Quality Criteria\n- Analysis team was spawned and agents coordinated via pipeline\n- Quality filters applied (novelty + specificity)\n- Duplicates checked via \\`npx ca search\\` before capture\n- Items classified by type (lesson/solution/pattern/preference)\n- Supersedes/related links set where applicable\n- Outdated docs and ADRs were updated or deprecated\n- User confirmed high-severity items\n- Beads checked for related issues (\\`bd\\`)\n- Each item gives clear, concrete guidance for future sessions\n\n## FINAL GATE -- EPIC CLOSURE\nBefore closing the epic:\n- Run \\`npx ca verify-gates <epic-id>\\` -- must return PASS for both gates\n- Run \\`pnpm test\\` and \\`pnpm lint\\` -- must pass\nIf verify-gates fails, the missing phase was SKIPPED. Go back and complete it.\nCRITICAL: 3/5 phases is NOT success. All 5 phases are required.\n`,\n\n 'set-worktree': `---\nname: Set Worktree\ndescription: Configure an isolated git worktree for parallel epic execution\n---\n\n# Set Worktree Skill\n\n## Overview\nSet up a git worktree to isolate epic work from the main branch. This creates a separate working directory, installs dependencies, and creates a Merge beads task that orchestrates the merge lifecycle.\n\n## Methodology\n1. Validate the epic exists: run \\`bd show <epic-id>\\` to confirm the epic is open\n2. Search memory with \\`npx ca search \"worktree\"\\` for past worktree lessons\n3. Run the worktree creation command: \\`npx ca worktree create <epic-id>\\`\n4. Verify output: confirm worktree path, branch name, and Merge task ID are reported\n5. Note the Merge task ID -- it will surface via \\`bd ready\\` after all work tasks complete\n6. Confirm the worktree is ready: check that \\`.claude/\\` directory exists in the worktree\n7. Inform the user: the worktree is set up, they can now run \\`/compound:lfg\\` to start work\n\n## What Happens Under the Hood\n- A git worktree is created at \\`../<repo>-wt-<epic-id>\\` on branch \\`epic/<epic-id>\\`\n- Dependencies are installed via \\`pnpm install --frozen-lockfile\\`\n- Lessons JSONL is copied (not symlinked) to the worktree\n- A Merge beads task is created with the epic as its dependent\n- When all work completes, the Merge task surfaces via \\`bd ready\\`\n\n## Memory Integration\n- Run \\`npx ca search \"worktree\"\\` before creating to check for known issues\n- Run \\`npx ca learn\\` if you discover worktree-specific knowledge\n\n## Common Pitfalls\n- Creating a worktree for an epic that already has one (the command checks for this)\n- Forgetting to run \\`/compound:lfg\\` after setup (the worktree alone does nothing)\n- Not noting the Merge task ID (needed for later reference)\n- Running from inside an existing worktree (must run from main repo)\n\n## Quality Criteria\n- Worktree was created successfully (path exists)\n- \\`pnpm install\\` completed without errors\n- Merge beads task exists and is linked to the epic\n- User was informed of next steps (\\`/compound:lfg\\`)\n`,\n\n researcher: `---\nname: Researcher\ndescription: Deep research producing structured survey documents for informed decision-making\n---\n\n# Researcher Skill\n\n## Overview\nConduct deep research on a topic and produce a structured survey document following the project's research template. This skill spawns parallel research subagents to gather comprehensive information, then synthesizes findings into a PhD-depth document stored in \\`docs/research/\\`.\n\n## Methodology\n1. Identify the research question, scope, and exclusions\n2. Search memory with \\`npx ca search\\` for existing knowledge on the topic\n3. Spawn parallel research subagents via Task tool:\n - **Web search specialist**: Uses WebSearch/WebFetch for academic papers, blog posts, benchmarks, and tools\n - **Codebase explorer**: Uses \\`subagent_type: Explore\\` to find relevant existing code patterns\n - **Docs scanner**: Reads \\`docs/\\` for prior research, ADRs, and standards that inform the topic\n4. Collect and deduplicate findings from all subagents\n5. Synthesize into TEMPLATE_FOR_RESEARCH.md format:\n - Abstract (2-3 paragraphs)\n - Introduction (problem statement, scope, definitions)\n - Foundations (theoretical background)\n - Taxonomy of Approaches (classification framework, visual table/tree)\n - Analysis (one subsection per approach with theory, evidence, implementations, strengths/limitations)\n - Comparative Synthesis (cross-cutting trade-off table)\n - Open Problems & Gaps\n - Conclusion\n - References (full citations)\n - Practitioner Resources (annotated tools/repos)\n6. Store output at \\`docs/research/<topic-slug>.md\\` (kebab-case filename)\n7. Report key findings back for upstream skill (brainstorm/plan) to act on\n\n## Memory Integration\n- Run \\`npx ca search\\` with topic keywords before starting research\n- Check for existing research docs in \\`docs/research/\\` that overlap\n- After completion, key findings can be captured via \\`npx ca learn\\`\n\n## Docs Integration\n- Scan \\`docs/research/\\` for prior survey documents on related topics\n- Check \\`docs/decisions/\\` for ADRs that inform or constrain the research scope\n- Reference existing project docs as primary sources where relevant\n\n## Output Format\n\nEvery research document MUST follow this exact structure:\n\n# [Topic Title]\n\n*[Date]*\n\n## Abstract\n2-3 paragraph summary: what this survey covers, main approaches, key trade-offs.\n\n## 1. Introduction\n- Problem statement\n- Scope: covered and excluded\n- Key definitions\n\n## 2. Foundations\nTheoretical background. Assume technical reader, not domain specialist.\n\n## 3. Taxonomy of Approaches\nClassification framework. Present visually (table or tree) before details.\n\n## 4. Analysis\nOne subsection per approach:\n### 4.x [Approach Name]\n- **Theory & mechanism**\n- **Literature evidence**\n- **Implementations & benchmarks**\n- **Strengths & limitations**\n\n## 5. Comparative Synthesis\nCross-cutting trade-off table. No recommendations.\n\n## 6. Open Problems & Gaps\nUnsolved, under-researched, or risky areas.\n\n## 7. Conclusion\nSynthesis. No verdict.\n\n## References\nFull citations with URLs.\n\n## Practitioner Resources\nAnnotated tools, repos, articles grouped by category.\n\n## Common Pitfalls\n- Shallow treatment: each approach needs theory, evidence, AND implementation examples\n- Missing taxonomy: always classify approaches before diving into analysis\n- Recommendation bias: present trade-offs, never recommend (ADR process decides)\n- Ignoring gaps: explicitly state where evidence is thin or conflicting\n- Not deduplicating subagent findings (leads to repetitive content)\n- Skipping the comparative synthesis table\n\n## Quality Criteria\n- PhD academic depth (reads like a technical survey paper)\n- Multiple research subagents were deployed in parallel\n- Memory was searched for existing knowledge\n- Existing docs/research were checked for overlap\n- Every approach has: theory, evidence, implementations, strengths/limitations\n- Comparative synthesis table present with clear trade-offs\n- Open problems honestly identified\n- Full references with URLs\n- Practitioner resources annotated\n- No recommendations -- landscape presentation only\n`,\n\n lfg: `---\nname: LFG\ndescription: Full-cycle orchestrator chaining all five phases with gates and controls\n---\n\n# LFG Skill\n\n## Overview\nChain all 5 phases end-to-end: Brainstorm, Plan, Work, Review, Compound. This skill governs the orchestration -- phase sequencing, gates, progress tracking, and error recovery.\n\n## CRITICAL RULE -- READ BEFORE EXECUTE\nBefore starting EACH phase, you MUST use the Read tool to open its skill file:\n- .claude/skills/compound/brainstorm/SKILL.md\n- .claude/skills/compound/plan/SKILL.md\n- .claude/skills/compound/work/SKILL.md\n- .claude/skills/compound/review/SKILL.md\n- .claude/skills/compound/compound/SKILL.md\n\nDo NOT proceed from memory. Read the skill, then follow it exactly.\n\n## Phase Execution Protocol\n0. Initialize state: \\`npx ca phase-check init <epic-id>\\`\nFor each phase:\n1. Announce: \"[Phase N/5] PHASE_NAME\"\n2. Start state: \\`npx ca phase-check start <phase>\\`\n3. Read the phase skill file (see above)\n4. Run \\`npx ca search\\` with the current goal -- display results before proceeding\n5. Execute the phase following the skill instructions\n6. Update epic state: \\`bd update <epic-id> --notes=\"Phase: NAME COMPLETE | Next: NEXT\"\\`\n7. Verify phase gate before proceeding to the next phase\n\n## Phase Gates (MANDATORY)\n- **After Plan**: Run \\`bd list --status=open\\` and verify Review + Compound tasks exist, then run \\`npx ca phase-check gate post-plan\\`\n- **After Work (GATE 3)**: \\`bd list --status=in_progress\\` must be empty. Then run \\`npx ca phase-check gate gate-3\\`\n- **After Review (GATE 4)**: /implementation-reviewer must have returned APPROVED. Then run \\`npx ca phase-check gate gate-4\\`\n- **After Compound (FINAL GATE)**: Run \\`npx ca verify-gates <epic-id>\\` (must PASS), \\`pnpm test\\`, and \\`pnpm lint\\`, then run \\`npx ca phase-check gate final\\` (auto-cleans phase state)\n\nIf a gate fails, DO NOT proceed. Fix the issue first.\n\n## Phase Control\n- **Skip phases**: Parse arguments for \"from PHASE\" (e.g., \"from plan\"). Skip earlier phases.\n- **Resume**: After interruption, run \\`bd show <epic-id>\\` and read notes for phase state. Resume from that phase.\n- **Retry**: If a phase fails, report and ask user to retry, skip, or abort via AskUserQuestion.\n- **Progress**: Always announce current phase number before starting.\n\n## Stop Conditions\n- Brainstorm reveals goal is unclear -- stop, ask user\n- Tests produce unresolvable failures -- stop, report\n- Review finds critical security issues -- stop, report\n\n## Common Pitfalls\n- Skipping the Read step for a phase skill (NON-NEGOTIABLE)\n- Not running phase gates between phases\n- Not announcing progress (\"[Phase N/5]\")\n- Proceeding after a failed gate\n- Not updating epic notes with phase state (loses resume ability)\n- Batching all commits to the end instead of committing incrementally\n\n## Quality Criteria\n- All 5 phases were executed (3/5 is NOT success)\n- Each phase skill was Read before execution\n- Phase gates verified between each transition\n- Epic notes updated after each phase\n- Memory searched at the start of each phase\n- \\`npx ca verify-gates\\` passed at the end\n\n## SESSION CLOSE -- INVIOLABLE\nBefore saying \"done\": git status, git add, bd sync, git commit, bd sync, git push.\nIf phase state gets stuck, use the escape hatch: \\`npx ca phase-check clean\\` (or \\`npx ca phase-clean\\`).\n`,\n\n 'test-cleaner': `---\nname: Test Cleaner\ndescription: Multi-phase test suite optimization with adversarial review\n---\n\n# Test Cleaner Skill\n\n## Overview\nAnalyze, optimize, and clean a project's test suite through a multi-phase workflow with adversarial review. Produces machine-readable output and feeds findings into compound-agent memory.\n\n## Methodology\n\n### Phase 1: Analysis\nSpawn multiple analysis subagents in parallel:\n- **Cargo-cult detector**: Find fake tests, mocked business logic, trivial assertions\n- **Redundancy analyzer**: Identify overlapping/duplicate test coverage\n- **Independence checker**: Verify tests don't depend on execution order or shared state\n- **Invariant tracer**: Map which invariants each test verifies (Lamport framework)\n- **Coverage analyzer**: Identify untested code paths and modules\n\n### Phase 2: Planning\nSynthesize analysis results into a refined optimization plan:\n- Categorize findings by severity (P1/P2/P3)\n- Propose specific changes for each finding\n- Estimate impact on test suite speed and coverage\n- Iterate with subagents until the plan is comprehensive\n\n### Phase 3: Adversarial Review (CRITICAL QUALITY GATE)\n**This is THE KEY PHASE -- the most important phase in the entire workflow. NEVER skip, NEVER rush, NEVER settle for \"good enough.\"**\n\nExpose the plan to two neutral reviewer subagents:\n- **Reviewer A** (Opus): Independent critique of the optimization plan\n- **Reviewer B** (Sonnet): Independent critique from a different perspective\n\nBoth reviewers challenge assumptions, identify risks, and suggest improvements.\n\n**Mandatory iteration loop**: After each reviewer pass, if ANY issues, concerns, or suggestions remain from EITHER reviewer, revise the plan and re-submit to BOTH reviewers. Repeat until BOTH reviewers explicitly approve with ZERO reservations. Do not proceed to Phase 4 until unanimous, unconditional approval is reached.\n\nThis is the critical quality gate. Loop as many times as needed. The test suite must be bulletproof before execution begins.\n\n### Phase 4: Execution\nApply the agreed changes:\n- Machine-readable output format: \\`ERROR [file:line] type: description\\`\n- Include \\`REMEDIATION\\` suggestions and \\`SEE\\` references\n- Use \\`pnpm test:segment\\`, \\`pnpm test:random\\`, \\`pnpm test:critical\\` for targeted validation\n\n### Phase 5: Verification\n- Run full test suite after changes\n- Compare before/after metrics (count, duration, coverage)\n- Feed findings into compound-agent memory via \\`npx ca learn\\`\n\n## Test Scripts Integration\n- \\`pnpm test:segment <module>\\` -- Test specific module in isolation\n- \\`pnpm test:random <pct>\\` -- Deterministic random subset (seeded per-agent)\n- \\`pnpm test:critical\\` -- P1/critical tests only (fast CI feedback)\n\n## Memory Integration\n- Run \\`npx ca search \"test optimization\"\\` before starting\n- After completion, capture findings via \\`npx ca learn\\`\n- Feed patterns into CCT system for future sessions\n\n## Common Pitfalls\n- Deleting tests without verifying coverage is maintained elsewhere\n- Optimizing for speed at the cost of correctness\n- Settling for partial approval or cutting the Phase 3 review loop short before BOTH reviewers approve with zero reservations\n- Making changes without machine-readable output\n- Not feeding results back into compound-agent memory\n\n## Quality Criteria\n- All 5 phases completed (analysis, planning, review, execution, verification)\n- Both adversarial reviewers approved with zero reservations after iterative refinement\n- Machine-readable output format used throughout\n- Full test suite passes after changes\n- Coverage not degraded\n- Findings captured in compound-agent memory\n`,\n};\n","/**\n * Shared primitives for setup commands.\n * Used by both init.ts and setup-all.ts to avoid duplication.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { VERSION } from '../version.js';\nimport {\n AGENTS_MD_TEMPLATE,\n CLAUDE_MD_REFERENCE,\n CLAUDE_REF_START_MARKER,\n COMPOUND_AGENT_SECTION_HEADER,\n PLUGIN_MANIFEST,\n} from './templates.js';\nimport { AGENT_TEMPLATES, AGENT_ROLE_SKILLS, DOC_TEMPLATES, WORKFLOW_COMMANDS, PHASE_SKILLS } from './templates/index.js';\n\n/**\n * @deprecated Kept for backward compatibility with all.ts --update detection.\n * New installs use path-based detection (file inside compound/ = managed).\n */\nexport const GENERATED_MARKER = '<!-- generated by compound-agent -->\\n';\n\n/**\n * Check if AGENTS.md already has the Compound Agent section.\n */\nexport function hasCompoundAgentSection(content: string): boolean {\n return content.includes(COMPOUND_AGENT_SECTION_HEADER);\n}\n\n/**\n * Check if CLAUDE.md already has the Compound Agent reference.\n */\nexport function hasClaudeMdReference(content: string): boolean {\n return content.includes('Compound Agent') || content.includes(CLAUDE_REF_START_MARKER);\n}\n\n/**\n * Create or update AGENTS.md with Compound Agent section.\n */\nexport async function updateAgentsMd(repoRoot: string): Promise<boolean> {\n const agentsPath = join(repoRoot, 'AGENTS.md');\n let content = '';\n let existed = false;\n\n if (existsSync(agentsPath)) {\n content = await readFile(agentsPath, 'utf-8');\n existed = true;\n if (hasCompoundAgentSection(content)) {\n return false; // Already has section, no update needed\n }\n }\n\n // Append the template\n const newContent = existed ? content.trimEnd() + '\\n' + AGENTS_MD_TEMPLATE : AGENTS_MD_TEMPLATE.trim() + '\\n';\n await writeFile(agentsPath, newContent, 'utf-8');\n return true;\n}\n\n/**\n * Ensure CLAUDE.md has a reference to AGENTS.md for Compound Agent workflow.\n * Creates CLAUDE.md if it doesn't exist, appends reference if not present.\n * Uses markers for clean uninstall support.\n */\nexport async function ensureClaudeMdReference(repoRoot: string): Promise<boolean> {\n const claudeMdPath = join(repoRoot, '.claude', 'CLAUDE.md');\n\n // Ensure .claude directory exists\n await mkdir(join(repoRoot, '.claude'), { recursive: true });\n\n if (!existsSync(claudeMdPath)) {\n // Create new CLAUDE.md with reference\n const content = `# Project Instructions\n${CLAUDE_MD_REFERENCE}`;\n await writeFile(claudeMdPath, content, 'utf-8');\n return true;\n }\n\n // File exists - check if reference is already present\n const content = await readFile(claudeMdPath, 'utf-8');\n if (hasClaudeMdReference(content)) {\n return false; // Already has reference\n }\n\n // Append reference\n const newContent = content.trimEnd() + '\\n' + CLAUDE_MD_REFERENCE;\n await writeFile(claudeMdPath, newContent, 'utf-8');\n return true;\n}\n\n/**\n * Create plugin.json in .claude/ directory.\n * Idempotent: does not overwrite existing file.\n *\n * @returns true if plugin.json was created\n */\nexport async function createPluginManifest(repoRoot: string): Promise<boolean> {\n const pluginPath = join(repoRoot, '.claude', 'plugin.json');\n\n // Ensure .claude directory exists\n await mkdir(join(repoRoot, '.claude'), { recursive: true });\n\n if (existsSync(pluginPath)) {\n return false; // Already exists\n }\n\n await writeFile(pluginPath, JSON.stringify(PLUGIN_MANIFEST, null, 2) + '\\n', 'utf-8');\n return true;\n}\n\n\n/**\n * Install agent templates to .claude/agents/compound/.\n * Idempotent: does not overwrite existing files.\n *\n * @returns true if any agent templates were created\n */\nexport async function installAgentTemplates(repoRoot: string): Promise<boolean> {\n const agentsDir = join(repoRoot, '.claude', 'agents', 'compound');\n await mkdir(agentsDir, { recursive: true });\n\n let created = false;\n for (const [filename, content] of Object.entries(AGENT_TEMPLATES)) {\n const filePath = join(agentsDir, filename);\n if (!existsSync(filePath)) {\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n return created;\n}\n\n/**\n * Install workflow commands to .claude/commands/compound/.\n * Idempotent: does not overwrite existing files.\n *\n * @returns true if any workflow commands were created\n */\nexport async function installWorkflowCommands(repoRoot: string): Promise<boolean> {\n const commandsDir = join(repoRoot, '.claude', 'commands', 'compound');\n await mkdir(commandsDir, { recursive: true });\n\n let created = false;\n for (const [filename, content] of Object.entries(WORKFLOW_COMMANDS)) {\n const filePath = join(commandsDir, filename);\n if (!existsSync(filePath)) {\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n return created;\n}\n\n/**\n * Install phase skill templates to .claude/skills/compound/<phase>/SKILL.md.\n * Idempotent: does not overwrite existing files.\n *\n * @returns true if any skill templates were created\n */\nexport async function installPhaseSkills(repoRoot: string): Promise<boolean> {\n let created = false;\n for (const [phase, content] of Object.entries(PHASE_SKILLS)) {\n const skillDir = join(repoRoot, '.claude', 'skills', 'compound', phase);\n await mkdir(skillDir, { recursive: true });\n const filePath = join(skillDir, 'SKILL.md');\n if (!existsSync(filePath)) {\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n return created;\n}\n\n/**\n * Install agent role skill templates to .claude/skills/compound/agents/<name>/SKILL.md.\n * Idempotent: does not overwrite existing files.\n *\n * @returns true if any agent role skills were created\n */\nexport async function installAgentRoleSkills(repoRoot: string): Promise<boolean> {\n let created = false;\n for (const [name, content] of Object.entries(AGENT_ROLE_SKILLS)) {\n const skillDir = join(repoRoot, '.claude', 'skills', 'compound', 'agents', name);\n await mkdir(skillDir, { recursive: true });\n const filePath = join(skillDir, 'SKILL.md');\n if (!existsSync(filePath)) {\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n return created;\n}\n\n/**\n * Install documentation templates to docs/compound/.\n * Idempotent: does not overwrite existing files.\n * Replaces {{VERSION}} placeholder with the actual package version.\n *\n * @returns true if any doc templates were created\n */\nexport async function installDocTemplates(repoRoot: string): Promise<boolean> {\n const docsDir = join(repoRoot, 'docs', 'compound');\n await mkdir(docsDir, { recursive: true });\n\n let created = false;\n for (const [filename, template] of Object.entries(DOC_TEMPLATES)) {\n const filePath = join(docsDir, filename);\n if (!existsSync(filePath)) {\n const content = template.replace('{{VERSION}}', VERSION).replace('{{DATE}}', new Date().toISOString().slice(0, 10));\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\n }\n return created;\n}\n\n// ============================================================================\n// pnpm native build configuration\n// ============================================================================\n\n/** Native addon packages that require pnpm onlyBuiltDependencies opt-in. */\nconst REQUIRED_BUILD_DEPS = ['better-sqlite3', 'node-llama-cpp'];\n\n/** Result of pnpm build config check/update. */\nexport interface PnpmConfigResult {\n /** Whether this is a pnpm project (pnpm-lock.yaml or packageManager field). */\n isPnpm: boolean;\n /** Whether the config was already correct (no changes needed). */\n alreadyConfigured: boolean;\n /** Package names that were added to onlyBuiltDependencies. */\n added: string[];\n}\n\n/**\n * Ensure pnpm projects have onlyBuiltDependencies configured for native addons.\n *\n * pnpm v9+ blocks native addon compilation by default. This function detects\n * pnpm projects (via pnpm-lock.yaml or packageManager field) and adds the\n * required packages to pnpm.onlyBuiltDependencies in the consumer's package.json.\n *\n * Idempotent: does not duplicate entries or overwrite existing config.\n */\nexport async function ensurePnpmBuildConfig(repoRoot: string): Promise<PnpmConfigResult> {\n const lockPath = join(repoRoot, 'pnpm-lock.yaml');\n const hasLockfile = existsSync(lockPath);\n const pkgPath = join(repoRoot, 'package.json');\n const hasPkgJson = existsSync(pkgPath);\n\n // Detect pnpm: lockfile OR packageManager field starting with \"pnpm\"\n if (!hasLockfile) {\n if (!hasPkgJson) {\n return { isPnpm: false, alreadyConfigured: false, added: [] };\n }\n const pkg = readPkgJsonSafe(pkgPath, await readFile(pkgPath, 'utf-8'));\n if (pkg === null) return { isPnpm: false, alreadyConfigured: false, added: [] };\n const pm = typeof pkg.packageManager === 'string' ? pkg.packageManager : '';\n if (!pm.startsWith('pnpm')) {\n return { isPnpm: false, alreadyConfigured: false, added: [] };\n }\n // pnpm detected via packageManager field — fall through to config merge\n return mergePnpmConfig(pkgPath, pkg);\n }\n\n if (!hasPkgJson) {\n return { isPnpm: true, alreadyConfigured: false, added: [] };\n }\n\n const pkg = readPkgJsonSafe(pkgPath, await readFile(pkgPath, 'utf-8'));\n if (pkg === null) return { isPnpm: true, alreadyConfigured: false, added: [] };\n return mergePnpmConfig(pkgPath, pkg);\n}\n\nfunction readPkgJsonSafe(pkgPath: string, raw: string): Record<string, unknown> | null {\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n console.error(`Warning: Could not parse ${pkgPath} — skipping pnpm build config.\\nFix the JSON syntax and re-run setup.`);\n return null;\n }\n}\n\nasync function mergePnpmConfig(pkgPath: string, pkg: Record<string, unknown>): Promise<PnpmConfigResult> {\n // Get or create pnpm.onlyBuiltDependencies\n if (!pkg.pnpm || typeof pkg.pnpm !== 'object') {\n pkg.pnpm = {};\n }\n const pnpmConfig = pkg.pnpm as Record<string, unknown>;\n\n if (!Array.isArray(pnpmConfig.onlyBuiltDependencies)) {\n pnpmConfig.onlyBuiltDependencies = [];\n }\n const existing = pnpmConfig.onlyBuiltDependencies as string[];\n\n const added: string[] = [];\n for (const dep of REQUIRED_BUILD_DEPS) {\n if (!existing.includes(dep)) {\n existing.push(dep);\n added.push(dep);\n }\n }\n\n if (added.length === 0) {\n return { isPnpm: true, alreadyConfigured: true, added: [] };\n }\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\\n', 'utf-8');\n return { isPnpm: true, alreadyConfigured: false, added };\n}\n","/**\n * Uninstall command - Remove all generated compound-agent files.\n * NEVER removes .claude/lessons/ (user data).\n */\n\nimport { existsSync } from 'node:fs';\nimport { readFile, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport {\n getClaudeSettingsPath,\n hasClaudeHook,\n readClaudeSettings,\n removeAgentsSection,\n removeClaudeMdReference,\n removeCompoundAgentHook,\n writeClaudeSettings,\n} from './claude-helpers.js';\nimport { GENERATED_MARKER } from './primitives.js';\nimport { LEGACY_ROOT_SLASH_COMMANDS } from './templates.js';\n\nexport async function runUninstall(repoRoot: string, dryRun: boolean): Promise<string[]> {\n const actions: string[] = [];\n\n // Remove generated directories\n const dirsToRemove = [\n join(repoRoot, '.claude', 'agents', 'compound'),\n join(repoRoot, '.claude', 'commands', 'compound'),\n join(repoRoot, '.claude', 'skills', 'compound'),\n ];\n for (const dir of dirsToRemove) {\n if (existsSync(dir)) {\n if (!dryRun) await rm(dir, { recursive: true, force: true });\n actions.push(`Removed ${dir}`);\n }\n }\n\n // Remove legacy root-level slash commands (v1.0 migration)\n for (const filename of LEGACY_ROOT_SLASH_COMMANDS) {\n const filePath = join(repoRoot, '.claude', 'commands', filename);\n if (existsSync(filePath)) {\n const content = await readFile(filePath, 'utf-8');\n if (content.startsWith(GENERATED_MARKER)) {\n if (!dryRun) await rm(filePath);\n actions.push(`Removed ${filePath}`);\n }\n }\n }\n\n // Remove plugin.json (only if it belongs to compound-agent)\n const pluginPath = join(repoRoot, '.claude', 'plugin.json');\n if (existsSync(pluginPath)) {\n try {\n const content = JSON.parse(await readFile(pluginPath, 'utf-8'));\n if (content?.name === 'compound-agent') {\n if (!dryRun) await rm(pluginPath);\n actions.push(`Removed ${pluginPath}`);\n }\n } catch {\n // Malformed JSON — not ours, skip\n }\n }\n\n // Remove hooks from settings.json\n const settingsPath = getClaudeSettingsPath(false);\n try {\n const settings = await readClaudeSettings(settingsPath);\n if (hasClaudeHook(settings)) {\n if (!dryRun) {\n removeCompoundAgentHook(settings);\n await writeClaudeSettings(settingsPath, settings);\n }\n actions.push('Removed compound-agent hooks from settings.json');\n }\n } catch {\n // settings.json may not exist\n }\n\n // Remove AGENTS.md section\n if (!dryRun) {\n const removed = await removeAgentsSection(repoRoot);\n if (removed) actions.push('Removed compound-agent section from AGENTS.md');\n } else {\n const agentsPath = join(repoRoot, 'AGENTS.md');\n if (existsSync(agentsPath)) {\n const content = await readFile(agentsPath, 'utf-8');\n if (content.includes('compound-agent:start')) {\n actions.push('Removed compound-agent section from AGENTS.md');\n }\n }\n }\n\n // Remove CLAUDE.md reference\n if (!dryRun) {\n const removed = await removeClaudeMdReference(repoRoot);\n if (removed) actions.push('Removed compound-agent reference from CLAUDE.md');\n } else {\n const claudeMdPath = join(repoRoot, '.claude', 'CLAUDE.md');\n if (existsSync(claudeMdPath)) {\n const content = await readFile(claudeMdPath, 'utf-8');\n if (content.includes('compound-agent:claude-ref:start')) {\n actions.push('Removed compound-agent reference from CLAUDE.md');\n }\n }\n }\n\n return actions;\n}\n","/**\n * Upgrade module for cleaning up existing compound-agent installs.\n * Handles: deprecated command removal, generated header stripping.\n */\n\nimport { existsSync } from 'node:fs';\nimport { readdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { VERSION } from '../version.js';\n\nexport interface UpgradeResult {\n isUpgrade: boolean;\n removedCommands: string[];\n strippedHeaders: number;\n docVersionUpdated: boolean;\n message: string;\n}\n\nconst GENERATED_HEADER = '<!-- generated by compound-agent -->\\n';\n\n/** CLI wrapper commands deprecated in v1.3. */\nconst DEPRECATED_COMMANDS = ['search.md', 'list.md', 'show.md', 'stats.md', 'wrong.md'];\n\n/** Detect if this is an existing install (upgrade scenario). */\nexport function detectExistingInstall(repoRoot: string): boolean {\n return existsSync(join(repoRoot, '.claude', 'lessons', 'index.jsonl'));\n}\n\n/** Remove deprecated CLI wrapper command files from .claude/commands/compound/. */\nexport async function removeDeprecatedCommands(repoRoot: string, dryRun = false): Promise<string[]> {\n const commandsDir = join(repoRoot, '.claude', 'commands', 'compound');\n if (!existsSync(commandsDir)) return [];\n\n const removed: string[] = [];\n for (const filename of DEPRECATED_COMMANDS) {\n const filePath = join(commandsDir, filename);\n if (existsSync(filePath)) {\n const content = await readFile(filePath, 'utf-8');\n if (content.includes('npx ca') || content.includes('compound-agent')) {\n if (!dryRun) await rm(filePath);\n removed.push(filename);\n }\n }\n }\n return removed;\n}\n\n/** Strip generated headers from installed files in compound/ dirs. */\nexport async function stripGeneratedHeaders(repoRoot: string, dryRun = false): Promise<number> {\n const dirs = [\n join(repoRoot, '.claude', 'commands', 'compound'),\n join(repoRoot, '.claude', 'skills', 'compound'),\n join(repoRoot, '.claude', 'agents', 'compound'),\n ];\n\n let count = 0;\n for (const dir of dirs) {\n if (!existsSync(dir)) continue;\n count += await stripHeadersRecursive(dir, dryRun);\n }\n return count;\n}\n\n/** Recursively walk a directory and strip headers from .md files. */\nasync function stripHeadersRecursive(dir: string, dryRun = false): Promise<number> {\n let count = 0;\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n count += await stripHeadersRecursive(fullPath, dryRun);\n } else if (entry.isFile() && entry.name.endsWith('.md')) {\n const content = await readFile(fullPath, 'utf-8');\n if (content.startsWith(GENERATED_HEADER)) {\n if (!dryRun) await writeFile(fullPath, content.slice(GENERATED_HEADER.length), 'utf-8');\n count++;\n }\n }\n }\n return count;\n}\n\n/**\n * Update the version line in docs/compound/README.md during upgrade.\n * Returns true if the file was updated, false if missing or already current.\n */\nexport async function upgradeDocVersion(repoRoot: string, newVersion: string, dryRun = false): Promise<boolean> {\n const docPath = join(repoRoot, 'docs', 'compound', 'README.md');\n if (!existsSync(docPath)) return false;\n\n const content = await readFile(docPath, 'utf-8');\n const updated = content.replace(/^(version: \")([^\"]+)(\")/m, `$1${newVersion}$3`);\n if (updated === content) return false;\n\n if (!dryRun) await writeFile(docPath, updated, 'utf-8');\n return true;\n}\n\n/** Run full upgrade flow. */\nexport async function runUpgrade(repoRoot: string, dryRun = false): Promise<UpgradeResult> {\n const isUpgrade = detectExistingInstall(repoRoot);\n\n if (!isUpgrade) {\n return {\n isUpgrade: false,\n removedCommands: [],\n strippedHeaders: 0,\n docVersionUpdated: false,\n message: 'No existing install detected. Nothing to upgrade.',\n };\n }\n\n const removedCommands = await removeDeprecatedCommands(repoRoot, dryRun);\n const strippedHeaders = await stripGeneratedHeaders(repoRoot, dryRun);\n const docVersionUpdated = await upgradeDocVersion(repoRoot, VERSION, dryRun);\n\n const parts: string[] = [];\n if (removedCommands.length > 0) {\n parts.push(`Removed ${removedCommands.length} deprecated command(s)`);\n }\n if (strippedHeaders > 0) {\n parts.push(`Stripped headers from ${strippedHeaders} file(s)`);\n }\n if (docVersionUpdated) {\n parts.push('Updated doc version');\n }\n const message = parts.length > 0\n ? `Upgrade complete: ${parts.join(', ')}.`\n : 'Upgrade complete: no changes needed.';\n\n return { isUpgrade, removedCommands, strippedHeaders, docVersionUpdated, message };\n}\n","/**\n * One-shot setup command - Configure everything for compound-agent.\n *\n * Combines: init + Claude hooks + optionally model download.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { isModelAvailable, resolveModel } from '../memory/embeddings/index.js';\nimport { LESSONS_PATH } from '../memory/storage/index.js';\nimport { getGlobalOpts, out } from '../commands/index.js';\nimport { playInstallBanner } from './banner.js';\nimport { checkBeadsAvailable, runFullBeadsCheck, type BeadsCheckResult } from './beads-check.js';\nimport { printBeadsFullStatus, printGitignoreStatus, printPnpmConfigStatus, printScopeStatus, printSetupGitHooksStatus, runStatus } from './display-utils.js';\nimport {\n addAllCompoundAgentHooks,\n getClaudeSettingsPath,\n hasAllCompoundAgentHooks,\n readClaudeSettings,\n writeClaudeSettings,\n} from './claude-helpers.js';\nimport { ensureGitignore, type GitignoreResult } from './gitignore.js';\nimport { installPreCommitHook, type HookInstallResult } from './hooks.js';\nimport {\n createPluginManifest,\n ensureClaudeMdReference,\n ensurePnpmBuildConfig,\n GENERATED_MARKER,\n installAgentRoleSkills,\n installAgentTemplates,\n installDocTemplates,\n installPhaseSkills,\n installWorkflowCommands,\n updateAgentsMd,\n type PnpmConfigResult,\n} from './primitives.js';\nimport { checkUserScope, type ScopeCheckResult } from './scope-check.js';\nimport { LEGACY_ROOT_SLASH_COMMANDS } from './templates.js';\nimport { AGENT_TEMPLATES, AGENT_ROLE_SKILLS, DOC_TEMPLATES, WORKFLOW_COMMANDS, PHASE_SKILLS } from './templates/index.js';\nimport { VERSION } from '../version.js';\nimport { runUninstall } from './uninstall.js';\nimport { runUpgrade, detectExistingInstall, type UpgradeResult } from './upgrade.js';\n\n/** Result of one-shot setup */\ninterface SetupResult {\n lessonsDir: string;\n agentsMd: boolean;\n hooks: boolean;\n gitHooks: HookInstallResult['status'] | 'skipped';\n model: 'downloaded' | 'already_exists' | 'failed' | 'skipped';\n pnpmConfig: PnpmConfigResult;\n beads: BeadsCheckResult;\n scope: ScopeCheckResult;\n upgrade: UpgradeResult | null;\n gitignore: GitignoreResult;\n}\n\n/**\n * Ensure lessons directory and index file exist.\n */\nasync function ensureLessonsDirectory(repoRoot: string): Promise<string> {\n const lessonsDir = dirname(join(repoRoot, LESSONS_PATH));\n await mkdir(lessonsDir, { recursive: true });\n\n const indexPath = join(repoRoot, LESSONS_PATH);\n if (!existsSync(indexPath)) {\n await writeFile(indexPath, '', 'utf-8');\n }\n\n return lessonsDir;\n}\n\n/**\n * Configure Claude Code settings: hooks in settings.json.\n */\nasync function configureClaudeSettings(): Promise<{ hooks: boolean }> {\n const settingsPath = getClaudeSettingsPath(false);\n let settings: Record<string, unknown>;\n try {\n settings = await readClaudeSettings(settingsPath);\n } catch {\n // File exists but has malformed JSON — warn and skip to avoid data loss\n console.error(`Warning: Could not parse ${settingsPath} — skipping hook installation.\\nFix the JSON syntax and re-run setup.`);\n return { hooks: false };\n }\n\n const hadHooks = hasAllCompoundAgentHooks(settings);\n addAllCompoundAgentHooks(settings);\n await writeClaudeSettings(settingsPath, settings);\n\n return {\n hooks: !hadHooks,\n };\n}\n\n/**\n * Run one-shot setup.\n */\nexport async function runSetup(options: { skipModel?: boolean; skipHooks?: boolean }): Promise<SetupResult> {\n const repoRoot = getRepoRoot();\n\n // Pre-flight checks\n const scope = checkUserScope(repoRoot);\n const beads = checkBeadsAvailable();\n\n // Upgrade detection\n let upgrade: UpgradeResult | null = null;\n if (detectExistingInstall(repoRoot)) {\n upgrade = await runUpgrade(repoRoot);\n }\n\n // 0. Ensure pnpm native build config (before anything that needs native addons)\n const pnpmConfig = await ensurePnpmBuildConfig(repoRoot);\n\n // 1. Initialize lessons directory\n const lessonsDir = await ensureLessonsDirectory(repoRoot);\n\n // 2. Update AGENTS.md\n const agentsMdUpdated = await updateAgentsMd(repoRoot);\n\n // 3. Ensure CLAUDE.md reference\n await ensureClaudeMdReference(repoRoot);\n\n // 4. Create plugin manifest\n await createPluginManifest(repoRoot);\n\n // 5. Install agent templates\n await installAgentTemplates(repoRoot);\n\n // 6. Install workflow commands (includes utility commands)\n await installWorkflowCommands(repoRoot);\n\n // 7. Install phase skills\n await installPhaseSkills(repoRoot);\n\n // 8. Install agent role skills\n await installAgentRoleSkills(repoRoot);\n\n // 9. Install documentation templates\n await installDocTemplates(repoRoot);\n\n // 10. Install pre-commit git hook\n let gitHooks: HookInstallResult['status'] | 'skipped' = 'skipped';\n if (!options.skipHooks) {\n gitHooks = (await installPreCommitHook(repoRoot)).status;\n }\n\n // 11. Configure Claude settings (hooks in settings.json)\n const { hooks } = await configureClaudeSettings();\n\n // 12. Ensure .gitignore has required patterns\n const gitignore = await ensureGitignore(repoRoot);\n\n // 13. Download model (unless skipped)\n let modelStatus: 'downloaded' | 'already_exists' | 'failed' | 'skipped' = 'skipped';\n if (!options.skipModel) {\n try {\n const alreadyExisted = isModelAvailable();\n if (!alreadyExisted) {\n await resolveModel({ cli: false });\n modelStatus = 'downloaded';\n } else {\n modelStatus = 'already_exists';\n }\n } catch {\n modelStatus = 'failed';\n }\n }\n\n return {\n lessonsDir,\n agentsMd: agentsMdUpdated,\n hooks,\n gitHooks,\n model: modelStatus,\n pnpmConfig,\n beads,\n scope,\n upgrade,\n gitignore,\n };\n}\n\n\n/**\n * Update generated files with latest templates.\n * Files inside compound/ subdirectories are always managed and overwritten.\n */\nexport async function runUpdate(repoRoot: string, dryRun: boolean): Promise<{\n updated: number;\n added: number;\n configUpdated: boolean;\n upgrade: UpgradeResult;\n gitignore: GitignoreResult;\n}> {\n // Run upgrade pipeline (deprecated commands, headers, doc version)\n const upgrade = await runUpgrade(repoRoot, dryRun);\n\n let updated = 0;\n let added = 0;\n\n async function processFile(filePath: string, content: string): Promise<void> {\n if (!existsSync(filePath)) {\n if (!dryRun) {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content, 'utf-8');\n }\n added++;\n } else {\n const existing = await readFile(filePath, 'utf-8');\n // Strip any legacy marker for comparison\n const cleanExisting = existing.startsWith(GENERATED_MARKER)\n ? existing.slice(GENERATED_MARKER.length)\n : existing;\n if (cleanExisting !== content) {\n if (!dryRun) await writeFile(filePath, content, 'utf-8');\n updated++;\n }\n }\n }\n\n for (const [filename, content] of Object.entries(AGENT_TEMPLATES)) {\n await processFile(join(repoRoot, '.claude', 'agents', 'compound', filename), content);\n }\n for (const [filename, content] of Object.entries(WORKFLOW_COMMANDS)) {\n await processFile(join(repoRoot, '.claude', 'commands', 'compound', filename), content);\n }\n for (const [phase, content] of Object.entries(PHASE_SKILLS)) {\n await processFile(join(repoRoot, '.claude', 'skills', 'compound', phase, 'SKILL.md'), content);\n }\n for (const [name, content] of Object.entries(AGENT_ROLE_SKILLS)) {\n await processFile(join(repoRoot, '.claude', 'skills', 'compound', 'agents', name, 'SKILL.md'), content);\n }\n for (const [filename, template] of Object.entries(DOC_TEMPLATES)) {\n const content = template\n .replace('{{VERSION}}', VERSION)\n .replace('{{DATE}}', new Date().toISOString().slice(0, 10));\n await processFile(join(repoRoot, 'docs', 'compound', filename), content);\n }\n\n // Migration: clean up legacy root-level slash commands from v1.0\n // Only remove files that were generated by compound-agent (have the marker).\n // User-authored files with the same name are preserved.\n for (const filename of LEGACY_ROOT_SLASH_COMMANDS) {\n const filePath = join(repoRoot, '.claude', 'commands', filename);\n if (existsSync(filePath)) {\n const content = await readFile(filePath, 'utf-8');\n if (content.startsWith(GENERATED_MARKER)) {\n if (!dryRun) await rm(filePath);\n }\n }\n }\n\n // Migration: remove old monolithic HOW_TO_COMPOUND.md (replaced by split docs)\n const oldDocPath = join(repoRoot, 'docs', 'compound', 'HOW_TO_COMPOUND.md');\n if (existsSync(oldDocPath)) {\n const oldContent = await readFile(oldDocPath, 'utf-8');\n // Only remove if it has the version frontmatter (was generated by us)\n if (oldContent.startsWith('---\\nversion:')) {\n if (!dryRun) await rm(oldDocPath);\n updated++;\n }\n }\n\n // Ensure hooks config is current\n let configUpdated = false;\n if (!dryRun) {\n const { hooks } = await configureClaudeSettings();\n configUpdated = hooks;\n }\n\n // Ensure .gitignore has required patterns\n const gitignore = dryRun ? { added: [] } : await ensureGitignore(repoRoot);\n\n return { updated, added, configUpdated, upgrade, gitignore };\n}\n\n\nconst MODEL_STATUS_MSG: Record<string, string> = {\n skipped: 'Skipped (--skip-model)',\n downloaded: 'Downloaded',\n already_exists: 'Already exists',\n failed: 'Download failed (run `ca download-model` manually)',\n};\n\nasync function printSetupResult(result: SetupResult, quiet: boolean, repoRoot: string): Promise<void> {\n if (!quiet) {\n if (result.upgrade?.isUpgrade) {\n console.log(` ${result.upgrade.message}`);\n console.log(' Tip: Run with --update to regenerate managed files with latest templates.');\n }\n if (process.stdout.isTTY) await playInstallBanner();\n }\n out.success('Compound agent setup complete');\n console.log(` Lessons directory: ${result.lessonsDir}`);\n console.log(` AGENTS.md: ${result.agentsMd ? 'Updated' : 'Already configured'}`);\n console.log(` Claude hooks: ${result.hooks ? 'Installed' : 'Already configured'}`);\n printSetupGitHooksStatus(result.gitHooks);\n printPnpmConfigStatus(result.pnpmConfig);\n printGitignoreStatus(result.gitignore);\n console.log(` Model: ${MODEL_STATUS_MSG[result.model]}`);\n const fullBeads = runFullBeadsCheck(repoRoot);\n printBeadsFullStatus(fullBeads);\n printScopeStatus(result.scope);\n console.log('\\nNext steps:\\n 1. Restart Claude Code to load hooks\\n 2. Use `npx ca search` and `npx ca learn` commands');\n}\n\n/**\n * Register the one-shot setup action as the default subcommand of setup.\n * Using a default subcommand prevents its options (--uninstall, --dry-run)\n * from being consumed by the parent when other subcommands like \"claude\"\n * define the same flags.\n */\nexport function registerSetupAllCommand(setupCommand: Command): void {\n setupCommand.description('One-shot setup: init + hooks + model');\n\n setupCommand\n .command('all', { isDefault: true })\n .description('Run full setup (default)')\n .option('--skip-model', 'Skip embedding model download')\n .option('--skip-hooks', 'Skip git hooks installation')\n .option('--uninstall', 'Remove all generated files and configuration')\n .option('--update', 'Regenerate managed files in compound/ directories')\n .option('--status', 'Show installation status')\n .option('--dry-run', 'Show what would change without changing')\n .action(async function (this: Command, options: {\n skipModel?: boolean;\n skipHooks?: boolean;\n uninstall?: boolean;\n update?: boolean;\n status?: boolean;\n dryRun?: boolean;\n }) {\n const repoRoot = getRepoRoot();\n const dryRun = options.dryRun ?? false;\n\n if (options.uninstall) {\n const prefix = dryRun ? '[dry-run] Would have: ' : '';\n const actions = await runUninstall(repoRoot, dryRun);\n if (actions.length === 0) {\n console.log('Nothing to uninstall.');\n } else {\n for (const action of actions) {\n console.log(` ${prefix}${action}`);\n }\n out.success(dryRun ? 'Dry run complete (no changes made)' : 'Uninstall complete');\n }\n return;\n }\n\n if (options.update) {\n if (!dryRun && process.stdout.isTTY) await playInstallBanner();\n const result = await runUpdate(repoRoot, dryRun);\n const prefix = dryRun ? '[dry-run] ' : '';\n if (result.upgrade.isUpgrade) {\n console.log(` ${prefix}${result.upgrade.message}`);\n }\n if (result.updated === 0 && result.added === 0) {\n console.log(`${prefix}All generated files are up to date.`);\n } else {\n if (result.updated > 0) console.log(` ${prefix}Updated: ${result.updated} file(s)`);\n if (result.added > 0) console.log(` ${prefix}Added: ${result.added} file(s)`);\n }\n if (result.gitignore.added.length > 0) {\n console.log(` ${prefix}.gitignore: Added [${result.gitignore.added.join(', ')}]`);\n }\n if (result.configUpdated) console.log(` ${prefix}Config: hooks updated`);\n const fullBeads = runFullBeadsCheck(repoRoot);\n printBeadsFullStatus(fullBeads);\n const scope = checkUserScope(repoRoot);\n printScopeStatus(scope);\n return;\n }\n\n if (options.status) {\n await runStatus(repoRoot);\n return;\n }\n\n // Default: full setup\n const result = await runSetup({ skipModel: options.skipModel, skipHooks: options.skipHooks });\n const { quiet } = getGlobalOpts(this);\n await printSetupResult(result, quiet, repoRoot);\n });\n}\n","/**\n * Setup Claude command - Configure Claude Code SessionStart hooks.\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatError } from '../cli-error-format.js';\nimport { out } from '../commands/index.js';\nimport { getRepoRoot } from '../cli-utils.js';\nimport {\n addAllCompoundAgentHooks,\n getClaudeSettingsPath,\n hasAllCompoundAgentHooks,\n readClaudeSettings,\n removeAgentsSection,\n removeClaudeMdReference,\n removeCompoundAgentHook,\n writeClaudeSettings,\n} from './claude-helpers.js';\n\n/** Status check result */\ninterface StatusResult {\n settingsFile: string;\n exists: boolean;\n validJson: boolean;\n hookInstalled: boolean;\n slashCommands: {\n learn: boolean;\n search: boolean;\n };\n status: 'connected' | 'partial' | 'disconnected';\n}\n\n// ============================================================================\n// Action helpers\n// ============================================================================\n\nasync function handleStatus(\n alreadyInstalled: boolean,\n displayPath: string,\n settingsPath: string,\n options: { json?: boolean }\n): Promise<void> {\n const repoRoot = getRepoRoot();\n const learnMdPath = join(repoRoot, '.claude', 'commands', 'learn.md');\n const searchMdPath = join(repoRoot, '.claude', 'commands', 'search.md');\n\n const learnExists = existsSync(learnMdPath);\n const searchExists = existsSync(searchMdPath);\n\n let status: 'connected' | 'partial' | 'disconnected';\n if (alreadyInstalled && learnExists && searchExists) {\n status = 'connected';\n } else if (alreadyInstalled || learnExists || searchExists) {\n status = 'partial';\n } else {\n status = 'disconnected';\n }\n\n const result: StatusResult = {\n settingsFile: displayPath,\n exists: existsSync(settingsPath),\n validJson: true,\n hookInstalled: alreadyInstalled,\n slashCommands: { learn: learnExists, search: searchExists },\n status,\n };\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log('Claude Code Integration Status');\n console.log('\\u2500'.repeat(40));\n console.log('');\n console.log(`Hooks file: ${displayPath}`);\n console.log(` ${result.exists ? '[ok]' : '[missing]'} File exists`);\n console.log(` ${result.validJson ? '[ok]' : '[error]'} Valid JSON`);\n console.log(` ${result.hookInstalled ? '[ok]' : '[warn]'} Compound Agent hooks installed`);\n console.log('');\n console.log('Slash commands:');\n console.log(` ${learnExists ? '[ok]' : '[warn]'} /learn command`);\n console.log(` ${searchExists ? '[ok]' : '[warn]'} /search command`);\n console.log('');\n\n if (status === 'connected') {\n out.success('All checks passed. Integration is connected.');\n } else if (status === 'partial') {\n out.warn('Partial setup detected.');\n console.log('');\n console.log(\"Run 'npx ca setup' to complete setup.\");\n } else {\n out.error('Not connected.');\n console.log('');\n console.log(\"Run 'npx ca setup' to set up Compound Agent.\");\n }\n}\n\nasync function handleUninstall(\n settings: Record<string, unknown>,\n settingsPath: string,\n alreadyInstalled: boolean,\n displayPath: string,\n options: { global?: boolean; dryRun?: boolean; json?: boolean }\n): Promise<void> {\n const repoRoot = getRepoRoot();\n\n if (options.dryRun) {\n if (options.json) {\n console.log(JSON.stringify({ dryRun: true, wouldRemove: alreadyInstalled, location: displayPath }));\n } else {\n if (alreadyInstalled) {\n console.log(`Would remove compound-agent hooks from ${displayPath}`);\n } else {\n console.log('No compound-agent hooks to remove');\n }\n }\n return;\n }\n\n const removedHook = removeCompoundAgentHook(settings);\n if (removedHook) {\n await writeClaudeSettings(settingsPath, settings);\n }\n\n const removedAgents = await removeAgentsSection(repoRoot);\n const removedClaudeMd = await removeClaudeMdReference(repoRoot);\n\n const anyRemoved = removedHook || removedAgents || removedClaudeMd;\n\n if (anyRemoved) {\n if (options.json) {\n console.log(JSON.stringify({\n installed: false,\n location: displayPath,\n action: 'removed',\n agentsMdRemoved: removedAgents,\n claudeMdRemoved: removedClaudeMd,\n }));\n } else {\n out.success('Compound agent removed');\n if (removedHook) console.log(` Hooks: ${displayPath}`);\n if (removedAgents) console.log(' AGENTS.md: Compound Agent section removed');\n if (removedClaudeMd) console.log(' CLAUDE.md: Compound Agent reference removed');\n }\n } else {\n if (options.json) {\n console.log(JSON.stringify({ installed: false, location: displayPath, action: 'unchanged' }));\n } else {\n out.info('No compound agent hooks to remove');\n if (options.global) {\n console.log(' Hint: Try without --global to check project settings.');\n } else {\n console.log(' Hint: Try with --global flag to check global settings.');\n }\n }\n }\n}\n\nasync function handleInstall(\n settings: Record<string, unknown>,\n settingsPath: string,\n alreadyInstalled: boolean,\n displayPath: string,\n options: { global?: boolean; dryRun?: boolean; json?: boolean }\n): Promise<void> {\n if (options.dryRun) {\n if (options.json) {\n console.log(JSON.stringify({ dryRun: true, wouldInstall: !alreadyInstalled, location: displayPath }));\n } else {\n if (alreadyInstalled) {\n console.log('Compound agent hooks already installed');\n } else {\n console.log(`Would install compound-agent hooks to ${displayPath}`);\n }\n }\n return;\n }\n\n if (alreadyInstalled) {\n if (options.json) {\n console.log(JSON.stringify({\n installed: true,\n location: displayPath,\n hooks: ['SessionStart', 'PreCompact', 'UserPromptSubmit', 'PostToolUseFailure', 'PostToolUse', 'PreToolUse', 'Stop'],\n action: 'unchanged',\n }));\n } else {\n out.info('Compound agent hooks already installed');\n console.log(` Location: ${displayPath}`);\n }\n return;\n }\n\n const fileExists = existsSync(settingsPath);\n addAllCompoundAgentHooks(settings);\n await writeClaudeSettings(settingsPath, settings);\n\n if (options.json) {\n console.log(JSON.stringify({\n installed: true,\n location: displayPath,\n hooks: ['SessionStart', 'PreCompact', 'UserPromptSubmit', 'PostToolUseFailure', 'PostToolUse', 'PreToolUse', 'Stop'],\n action: fileExists ? 'updated' : 'created',\n }));\n } else {\n out.success(options.global ? 'Claude Code hooks installed (global)' : 'Claude Code hooks installed (project-level)');\n console.log(` Location: ${displayPath}`);\n console.log(' Hooks: SessionStart, PreCompact, UserPromptSubmit, PostToolUseFailure, PostToolUse, PreToolUse, Stop');\n console.log('');\n console.log('Lessons will be loaded automatically at session start.');\n if (!options.global) {\n console.log('');\n console.log('Note: Project hooks override global hooks.');\n }\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register the claude subcommand on an existing setup command.\n */\nexport function registerClaudeSubcommand(setupCommand: Command): void {\n setupCommand\n .command('claude')\n .description('Install Claude Code hooks')\n .option('--global', 'Install to global ~/.claude/ instead of project')\n .option('--uninstall', 'Remove compound-agent hooks')\n .option('--status', 'Check status of Claude Code integration')\n .option('--dry-run', 'Show what would change without writing')\n .option('--json', 'Output as JSON')\n .action(async (options: { global?: boolean; uninstall?: boolean; status?: boolean; dryRun?: boolean; json?: boolean }) => {\n const settingsPath = getClaudeSettingsPath(options.global ?? false);\n const displayPath = options.global ? '~/.claude/settings.json' : '.claude/settings.json';\n\n let settings: Record<string, unknown>;\n try {\n settings = await readClaudeSettings(settingsPath);\n } catch {\n if (options.json) {\n console.log(JSON.stringify({ error: 'Failed to parse settings file' }));\n } else {\n console.error(formatError('setup', 'PARSE_ERROR', 'Failed to parse settings file', 'Check if JSON is valid'));\n }\n process.exitCode = 1;\n return;\n }\n\n const alreadyInstalled = hasAllCompoundAgentHooks(settings);\n\n if (options.status) {\n await handleStatus(alreadyInstalled, displayPath, settingsPath, options);\n } else if (options.uninstall) {\n await handleUninstall(settings, settingsPath, alreadyInstalled, displayPath, options);\n } else {\n await handleInstall(settings, settingsPath, alreadyInstalled, displayPath, options);\n }\n });\n}\n","/**\n * Download-model command - Download the embedding model for semantic search.\n */\n\nimport { statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatBytes } from '../cli-utils.js';\nimport { isModelAvailable, MODEL_FILENAME, resolveModel } from '../memory/embeddings/index.js';\n\n/**\n * Register the download-model command on the program.\n */\nexport function registerDownloadModelCommand(program: Command): void {\n program\n .command('download-model')\n .description('Download the embedding model for semantic search')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n const alreadyExisted = isModelAvailable();\n\n if (alreadyExisted) {\n // Model already exists - get path and size\n const modelPath = join(homedir(), '.node-llama-cpp', 'models', MODEL_FILENAME);\n const size = statSync(modelPath).size;\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, path: modelPath, size, alreadyExisted: true }));\n } else {\n console.log('Model already exists.');\n console.log(`Path: ${modelPath}`);\n console.log(`Size: ${formatBytes(size)}`);\n }\n return;\n }\n\n // Download the model\n if (!options.json) {\n console.log('Downloading embedding model...');\n }\n\n const modelPath = await resolveModel({ cli: !options.json });\n const size = statSync(modelPath).size;\n\n if (options.json) {\n console.log(JSON.stringify({ success: true, path: modelPath, size, alreadyExisted: false }));\n } else {\n console.log(`\\nModel downloaded successfully!`);\n console.log(`Path: ${modelPath}`);\n console.log(`Size: ${formatBytes(size)}`);\n }\n });\n}\n","/**\n * Init command - Initialize compound-agent in a repository.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { LESSONS_PATH } from '../memory/storage/index.js';\nimport { getGlobalOpts, out } from '../commands/index.js';\nimport { playInstallBanner } from './banner.js';\nimport { runFullBeadsCheck, type BeadsFullCheck } from './beads-check.js';\nimport { printBeadsFullStatus, printGitignoreStatus, printScopeStatus } from './display-utils.js';\nimport { installClaudeHooksForInit } from './claude-helpers.js';\nimport { ensureGitignore, type GitignoreResult } from './gitignore.js';\nimport { installPreCommitHook, type HookInstallResult } from './hooks.js';\nimport {\n createPluginManifest,\n ensureClaudeMdReference,\n ensurePnpmBuildConfig,\n installAgentRoleSkills,\n installAgentTemplates,\n installDocTemplates,\n installPhaseSkills,\n installWorkflowCommands,\n updateAgentsMd,\n type PnpmConfigResult,\n} from './primitives.js';\nimport { checkUserScope } from './scope-check.js';\nimport type { ClaudeHooksResult } from './types.js';\nimport { runUpgrade, detectExistingInstall, type UpgradeResult } from './upgrade.js';\n\n/**\n * Create the lessons directory structure.\n */\nasync function createLessonsDirectory(repoRoot: string): Promise<void> {\n const lessonsDir = dirname(join(repoRoot, LESSONS_PATH));\n await mkdir(lessonsDir, { recursive: true });\n}\n\n/**\n * Create empty index.jsonl if it doesn't exist.\n */\nasync function createIndexFile(repoRoot: string): Promise<void> {\n const indexPath = join(repoRoot, LESSONS_PATH);\n if (!existsSync(indexPath)) {\n await writeFile(indexPath, '', 'utf-8');\n }\n}\n\n// ============================================================================\n// Action Handler\n// ============================================================================\n\nasync function initAction(\n cmd: Command,\n options: { skipAgents?: boolean; skipHooks?: boolean; skipClaude?: boolean; json?: boolean; update?: boolean }\n): Promise<void> {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(cmd);\n\n // Pre-flight checks\n const scopeResult = checkUserScope(repoRoot);\n\n // Upgrade detection\n let upgradeResult: UpgradeResult | null = null;\n if (options.update || detectExistingInstall(repoRoot)) {\n upgradeResult = await runUpgrade(repoRoot);\n if (!quiet && !options.json && upgradeResult.isUpgrade) {\n console.log(` ${upgradeResult.message}`);\n if (!options.update) {\n console.log(' Tip: Run with --update to regenerate managed files with latest templates.');\n }\n }\n }\n\n if (!quiet && !options.json && process.stdout.isTTY) {\n await playInstallBanner();\n }\n\n // Ensure pnpm native build config before anything else\n const pnpmConfig = await ensurePnpmBuildConfig(repoRoot);\n\n await createLessonsDirectory(repoRoot);\n await createIndexFile(repoRoot);\n const lessonsDir = dirname(join(repoRoot, LESSONS_PATH));\n\n let agentsMdUpdated = false;\n if (!options.skipAgents) {\n agentsMdUpdated = await updateAgentsMd(repoRoot);\n }\n\n if (!options.skipAgents) {\n await ensureClaudeMdReference(repoRoot);\n }\n\n if (!options.skipAgents) {\n await createPluginManifest(repoRoot);\n await installAgentTemplates(repoRoot);\n await installWorkflowCommands(repoRoot);\n await installPhaseSkills(repoRoot);\n await installAgentRoleSkills(repoRoot);\n await installDocTemplates(repoRoot);\n }\n\n let hookResult: HookInstallResult | null = null;\n if (!options.skipHooks) {\n hookResult = await installPreCommitHook(repoRoot);\n }\n\n let claudeHooksResult: ClaudeHooksResult = { installed: false, action: 'error', error: 'skipped' };\n if (!options.skipClaude) {\n claudeHooksResult = await installClaudeHooksForInit(repoRoot);\n }\n\n // Ensure .gitignore has required patterns\n const gitignoreResult = await ensureGitignore(repoRoot);\n\n const fullBeads = runFullBeadsCheck(repoRoot);\n\n if (options.json) {\n printInitJson({ lessonsDir, agentsMdUpdated, hookResult, claudeHooksResult, pnpmConfig, fullBeads, scopeResult, upgradeResult, gitignoreResult });\n return;\n }\n\n if (quiet) return;\n\n out.success('Compound agent initialized');\n console.log(` Lessons directory: ${lessonsDir}`);\n printAgentsMdStatus(agentsMdUpdated, options.skipAgents);\n printHookStatus(hookResult, options.skipHooks);\n printClaudeHooksStatus(claudeHooksResult, options.skipClaude);\n printPnpmConfigStatus(pnpmConfig);\n printGitignoreStatus(gitignoreResult);\n printBeadsFullStatus(fullBeads);\n printScopeStatus(scopeResult);\n}\n\nfunction printInitJson(ctx: {\n lessonsDir: string; agentsMdUpdated: boolean; hookResult: HookInstallResult | null;\n claudeHooksResult: ClaudeHooksResult; pnpmConfig: PnpmConfigResult;\n fullBeads: BeadsFullCheck; scopeResult: { isUserScope: boolean };\n upgradeResult: UpgradeResult | null; gitignoreResult: GitignoreResult;\n}): void {\n const claudeHooksInstalled = ctx.claudeHooksResult.action === 'installed';\n const hooksChanged = ctx.hookResult?.status === 'installed' || ctx.hookResult?.status === 'appended';\n console.log(JSON.stringify({\n initialized: true, lessonsDir: ctx.lessonsDir, agentsMd: ctx.agentsMdUpdated,\n hooks: hooksChanged, hookStatus: ctx.hookResult?.status ?? 'skipped',\n claudeHooks: claudeHooksInstalled,\n pnpmConfig: ctx.pnpmConfig.isPnpm ? { added: ctx.pnpmConfig.added, alreadyConfigured: ctx.pnpmConfig.alreadyConfigured } : null,\n beadsAvailable: ctx.fullBeads.cliAvailable, beadsInitialized: ctx.fullBeads.initialized, beadsHealthy: ctx.fullBeads.healthy,\n userScope: ctx.scopeResult.isUserScope,\n upgrade: ctx.upgradeResult ? { isUpgrade: ctx.upgradeResult.isUpgrade, removedCommands: ctx.upgradeResult.removedCommands, strippedHeaders: ctx.upgradeResult.strippedHeaders } : null,\n gitignore: ctx.gitignoreResult.added,\n }));\n}\n\nfunction printAgentsMdStatus(updated: boolean, skipped?: boolean): void {\n if (updated) {\n console.log(' AGENTS.md: Updated with Compound Agent section');\n } else if (skipped) {\n console.log(' AGENTS.md: Skipped (--skip-agents)');\n } else {\n console.log(' AGENTS.md: Already has Compound Agent section');\n }\n}\n\nfunction printHookStatus(hookResult: HookInstallResult | null, skipped?: boolean): void {\n if (skipped) {\n console.log(' Git hooks: Skipped (--skip-hooks)');\n } else if (hookResult?.status === 'installed') {\n console.log(' Git hooks: Installed');\n } else if (hookResult?.status === 'appended') {\n console.log(' Git hooks: Appended to existing pre-commit hook');\n } else if (hookResult?.status === 'already_installed') {\n console.log(' Git hooks: Already installed');\n } else if (hookResult?.status === 'not_git_repo') {\n console.log(' Git hooks: Skipped (not a git repository)');\n }\n}\n\nfunction printClaudeHooksStatus(result: ClaudeHooksResult, skipped?: boolean): void {\n if (skipped) {\n console.log(' Claude hooks: Skipped (--skip-claude)');\n } else if (result.action === 'installed') {\n console.log(' Claude hooks: Installed to .claude/settings.json');\n } else if (result.action === 'already_installed') {\n console.log(' Claude hooks: Already installed');\n } else if (result.error) {\n console.log(` Claude hooks: Error - ${result.error}`);\n }\n}\n\nfunction printPnpmConfigStatus(result: PnpmConfigResult): void {\n if (!result.isPnpm) return;\n if (result.alreadyConfigured) {\n console.log(' pnpm config: onlyBuiltDependencies already configured');\n } else if (result.added.length > 0) {\n console.log(` pnpm config: Added onlyBuiltDependencies [${result.added.join(', ')}]`);\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register the init command on the program.\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Initialize compound-agent in this repository')\n .option('--skip-agents', 'Skip AGENTS.md modification')\n .option('--skip-hooks', 'Skip git hooks installation')\n .option('--skip-claude', 'Skip Claude Code hooks installation')\n .option('--json', 'Output result as JSON')\n .option('--update', 'Run upgrade logic on existing install')\n .action(async function (this: Command, options: { skipAgents?: boolean; skipHooks?: boolean; skipClaude?: boolean; json?: boolean; update?: boolean }) {\n await initAction(this, options);\n });\n}\n","/**\n * Shared types, constants, and utilities for CLI commands.\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\n// Re-export centralized utilities (utils.ts remains in src/ root)\nexport { getLessonAgeDays, MS_PER_DAY } from '../utils.js';\n\n// ============================================================================\n// Output Formatting Helpers\n// ============================================================================\n\n/** Output helper functions for consistent formatting */\nexport const out = {\n success: (msg: string): void => console.log(chalk.green('[ok]'), msg),\n error: (msg: string): void => console.error(chalk.red('[error]'), msg),\n info: (msg: string): void => console.log(chalk.blue('[info]'), msg),\n warn: (msg: string): void => console.log(chalk.yellow('[warn]'), msg),\n};\n\n/** Global options interface */\nexport interface GlobalOpts {\n verbose: boolean;\n quiet: boolean;\n}\n\n/**\n * Get global options from command.\n */\nexport function getGlobalOpts(cmd: Command): GlobalOpts {\n const opts = cmd.optsWithGlobals() as { verbose?: boolean; quiet?: boolean };\n return {\n verbose: opts.verbose ?? false,\n quiet: opts.quiet ?? false,\n };\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default limit for search results */\nexport const DEFAULT_SEARCH_LIMIT = '10';\n\n/** Default limit for list results */\nexport const DEFAULT_LIST_LIMIT = '20';\n\n/** Default limit for search results */\nexport const DEFAULT_CHECK_PLAN_LIMIT = '5';\n\n/** Threshold for lesson count warning (context pollution prevention) */\nexport const LESSON_COUNT_WARNING_THRESHOLD = 20;\n\n/** Age threshold in days for flagging old lessons */\nexport const AGE_FLAG_THRESHOLD_DAYS = 90;\n\n/** Length of ISO date prefix (YYYY-MM-DD) */\nexport const ISO_DATE_PREFIX_LENGTH = 10;\n\n/** Decimal places for average calculations */\nexport const AVG_DECIMAL_PLACES = 1;\n\n/** Decimal places for relevance scores */\nexport const RELEVANCE_DECIMAL_PLACES = 2;\n\n/** Indentation for JSON pretty-printing */\nexport const JSON_INDENT_SPACES = 2;\n","/**\n * Helper functions for management commands.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { LESSONS_PATH } from '../memory/storage/index.js';\nimport type { MemoryItem } from '../memory/index.js';\n\n/**\n * Format a memory item for human-readable display.\n */\nexport function formatLessonHuman(lesson: MemoryItem): string {\n const lines: string[] = [];\n\n lines.push(`ID: ${lesson.id}`);\n lines.push(`Type: ${lesson.type}`);\n lines.push(`Trigger: ${lesson.trigger}`);\n lines.push(`Insight: ${lesson.insight}`);\n\n if (lesson.evidence) {\n lines.push(`Evidence: ${lesson.evidence}`);\n }\n\n if (lesson.severity) {\n lines.push(`Severity: ${lesson.severity}`);\n }\n\n lines.push(`Tags: ${lesson.tags.length > 0 ? lesson.tags.join(', ') : '(none)'}`);\n lines.push(`Source: ${lesson.source}`);\n\n if (lesson.context) {\n lines.push(`Context: ${lesson.context.tool} - ${lesson.context.intent}`);\n }\n\n lines.push(`Created: ${lesson.created}`);\n lines.push(`Confirmed: ${lesson.confirmed ? 'yes' : 'no'}`);\n\n if (lesson.supersedes && lesson.supersedes.length > 0) {\n lines.push(`Supersedes: ${lesson.supersedes.join(', ')}`);\n }\n\n if (lesson.related && lesson.related.length > 0) {\n lines.push(`Related: ${lesson.related.join(', ')}`);\n }\n\n if (lesson.pattern) {\n lines.push('Pattern:');\n lines.push(` Bad: ${lesson.pattern.bad}`);\n lines.push(` Good: ${lesson.pattern.good}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Check if a lesson ID has been deleted (has a tombstone).\n */\nexport async function wasLessonDeleted(repoRoot: string, id: string): Promise<boolean> {\n const filePath = join(repoRoot, LESSONS_PATH);\n try {\n const content = await readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const record = JSON.parse(trimmed) as { id: string; deleted?: boolean };\n if (record.id === id && record.deleted === true) {\n return true;\n }\n } catch {\n // Skip invalid lines\n }\n }\n } catch {\n // File doesn't exist\n }\n return false;\n}\n","/**\n * CRUD commands: show, update, delete\n *\n * Commands for reading, updating, and deleting lessons.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { appendMemoryItem, readMemoryItems, syncIfNeeded } from '../memory/storage/index.js';\nimport { MemoryItemSchema, SeveritySchema } from '../memory/index.js';\nimport type { MemoryItem, Severity } from '../memory/index.js';\n\nimport { formatError } from '../cli-error-format.js';\n\nimport { out } from './shared.js';\nimport { formatLessonHuman, wasLessonDeleted } from './management-helpers.js';\n\n/** JSON indentation for show output */\nconst SHOW_JSON_INDENT = 2;\n\n// ============================================================================\n// Action Handlers\n// ============================================================================\n\nasync function showAction(id: string, options: { json?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n\n const { items } = await readMemoryItems(repoRoot);\n const item = items.find((i) => i.id === id);\n\n if (!item) {\n const wasDeleted = await wasLessonDeleted(repoRoot, id);\n\n if (options.json) {\n console.log(JSON.stringify({ error: wasDeleted ? `Lesson ${id} not found (deleted)` : `Lesson ${id} not found` }));\n } else {\n const msg = wasDeleted ? `Lesson ${id} not found (deleted)` : `Lesson ${id} not found`;\n console.error(formatError('show', 'NOT_FOUND', msg, 'Use \"ca list\" to see available lessons'));\n }\n process.exitCode = 1;\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify(item, null, SHOW_JSON_INDENT));\n } else {\n console.log(formatLessonHuman(item));\n }\n}\n\ninterface UpdateOptions {\n insight?: string;\n trigger?: string;\n evidence?: string;\n severity?: string;\n tags?: string;\n confirmed?: string;\n json?: boolean;\n}\n\nfunction buildUpdatedItem(item: MemoryItem, options: UpdateOptions): MemoryItem {\n return {\n ...item,\n ...(options.insight !== undefined && { insight: options.insight }),\n ...(options.trigger !== undefined && { trigger: options.trigger }),\n ...(options.evidence !== undefined && { evidence: options.evidence }),\n ...(options.severity !== undefined && { severity: options.severity as Severity }),\n ...(options.tags !== undefined && {\n tags: [...new Set(\n options.tags\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n )],\n }),\n ...(options.confirmed !== undefined && { confirmed: options.confirmed === 'true' }),\n };\n}\n\nasync function updateAction(id: string, options: UpdateOptions): Promise<void> {\n const repoRoot = getRepoRoot();\n\n const hasUpdates = options.insight !== undefined\n || options.trigger !== undefined\n || options.evidence !== undefined\n || options.severity !== undefined\n || options.tags !== undefined\n || options.confirmed !== undefined;\n\n if (!hasUpdates) {\n if (options.json) {\n console.log(JSON.stringify({ error: 'No fields to update (specify at least one: --insight, --tags, --severity, ...)' }));\n } else {\n console.error(formatError('update', 'NO_FIELDS', 'No fields to update', 'Specify at least one: --insight, --tags, --severity, ...'));\n }\n process.exitCode = 1;\n return;\n }\n\n const { items } = await readMemoryItems(repoRoot);\n const item = items.find((i) => i.id === id);\n\n if (!item) {\n const wasDeleted = await wasLessonDeleted(repoRoot, id);\n if (options.json) {\n console.log(JSON.stringify({ error: wasDeleted ? `Lesson ${id} is deleted` : `Lesson ${id} not found` }));\n } else {\n const msg = wasDeleted ? `Lesson ${id} is deleted` : `Lesson ${id} not found`;\n console.error(formatError('update', 'NOT_FOUND', msg, 'Use \"ca list\" to see available lessons'));\n }\n process.exitCode = 1;\n return;\n }\n\n if (options.severity !== undefined) {\n const result = SeveritySchema.safeParse(options.severity);\n if (!result.success) {\n if (options.json) {\n console.log(JSON.stringify({ error: `Invalid severity '${options.severity}' (must be: high, medium, low)` }));\n } else {\n console.error(formatError('update', 'INVALID_SEVERITY', `Invalid severity: \"${options.severity}\"`, 'Use --severity high|medium|low'));\n }\n process.exitCode = 1;\n return;\n }\n }\n\n const updatedItem = buildUpdatedItem(item, options);\n\n const validationResult = MemoryItemSchema.safeParse(updatedItem);\n if (!validationResult.success) {\n if (options.json) {\n console.log(JSON.stringify({ error: `Schema validation failed: ${validationResult.error.message}` }));\n } else {\n console.error(formatError('update', 'VALIDATION_FAILED', `Schema validation failed: ${validationResult.error.message}`, 'Check field values and try again'));\n }\n process.exitCode = 1;\n return;\n }\n\n await appendMemoryItem(repoRoot, updatedItem);\n await syncIfNeeded(repoRoot);\n\n if (options.json) {\n console.log(JSON.stringify(updatedItem, null, SHOW_JSON_INDENT));\n } else {\n out.success(`Updated lesson ${id}`);\n }\n}\n\nasync function deleteAction(ids: string[], options: { json?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n\n const { items } = await readMemoryItems(repoRoot);\n const itemMap = new Map(items.map((i) => [i.id, i]));\n\n const deleted: string[] = [];\n const warnings: Array<{ id: string; message: string }> = [];\n\n for (const id of ids) {\n const item = itemMap.get(id);\n\n if (!item) {\n const wasDeleted = await wasLessonDeleted(repoRoot, id);\n warnings.push({ id, message: wasDeleted ? 'already deleted' : 'not found' });\n continue;\n }\n\n const deletedItem: MemoryItem = {\n ...item,\n deleted: true,\n deletedAt: new Date().toISOString(),\n };\n\n await appendMemoryItem(repoRoot, deletedItem);\n deleted.push(id);\n }\n\n if (deleted.length > 0) {\n await syncIfNeeded(repoRoot);\n }\n\n if (options.json) {\n console.log(JSON.stringify({ deleted, warnings }));\n } else {\n if (deleted.length > 0) {\n out.success(`Deleted ${deleted.length} lesson(s): ${deleted.join(', ')}`);\n }\n for (const warning of warnings) {\n out.warn(`${warning.id}: ${warning.message}`);\n }\n if (deleted.length === 0 && warnings.length > 0) {\n process.exitCode = 1;\n return;\n }\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register CRUD commands on the program.\n */\nexport function registerCrudCommands(program: Command): void {\n program\n .command('show <id>')\n .description('Show details of a specific lesson')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options: { json?: boolean }) => {\n await showAction(id, options);\n });\n\n program\n .command('update <id>')\n .description('Update a lesson')\n .option('--insight <text>', 'Update insight')\n .option('--trigger <text>', 'Update trigger')\n .option('--evidence <text>', 'Update evidence')\n .option('--severity <level>', 'Update severity (low/medium/high)')\n .option('--tags <tags>', 'Update tags (comma-separated)')\n .option('--confirmed <bool>', 'Update confirmed status (true/false)')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options: {\n insight?: string;\n trigger?: string;\n evidence?: string;\n severity?: string;\n tags?: string;\n confirmed?: string;\n json?: boolean;\n }) => {\n await updateAction(id, options);\n });\n\n program\n .command('delete <ids...>')\n .description('Soft delete lessons (creates tombstone)')\n .option('--json', 'Output as JSON')\n .action(async (ids: string[], options: { json?: boolean }) => {\n await deleteAction(ids, options);\n });\n}\n","/**\n * Doctor command — verify external dependencies and project health.\n *\n * Usage: ca doctor\n */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { isModelAvailable } from '../memory/embeddings/index.js';\nimport { LESSONS_PATH } from '../memory/storage/index.js';\nimport {\n checkBeadsAvailable,\n checkUserScope,\n getClaudeSettingsPath,\n hasAllCompoundAgentHooks,\n readClaudeSettings,\n} from '../setup/index.js';\n\nexport interface DoctorCheck {\n name: string;\n status: 'pass' | 'fail' | 'warn';\n fix?: string;\n}\n\nfunction checkGitignoreHealth(repoRoot: string): boolean {\n const gitignorePath = join(repoRoot, '.gitignore');\n if (!existsSync(gitignorePath)) return false;\n try {\n const content = readFileSync(gitignorePath, 'utf-8');\n const lines = new Set(content.split('\\n').map(l => l.trim()));\n return ['node_modules/', '.claude/.cache/'].every(p => lines.has(p));\n } catch {\n return false;\n }\n}\n\n/**\n * Run all health checks and return results.\n */\nexport async function runDoctor(repoRoot: string): Promise<DoctorCheck[]> {\n const checks: DoctorCheck[] = [];\n\n // 1. .claude/ directory\n const claudeDir = join(repoRoot, '.claude');\n checks.push(existsSync(claudeDir)\n ? { name: '.claude directory', status: 'pass' }\n : { name: '.claude directory', status: 'fail', fix: 'Run: npx ca setup' });\n\n // 2. Lessons index\n const lessonsPath = join(repoRoot, LESSONS_PATH);\n checks.push(existsSync(lessonsPath)\n ? { name: 'Lessons index', status: 'pass' }\n : { name: 'Lessons index', status: 'warn', fix: 'Run: npx ca setup' });\n\n // 3. Agent templates\n const agentsDir = join(repoRoot, '.claude', 'agents', 'compound');\n checks.push(existsSync(agentsDir)\n ? { name: 'Agent templates', status: 'pass' }\n : { name: 'Agent templates', status: 'fail', fix: 'Run: npx ca setup' });\n\n // 4. Workflow commands\n const commandsDir = join(repoRoot, '.claude', 'commands', 'compound');\n checks.push(existsSync(commandsDir)\n ? { name: 'Workflow commands', status: 'pass' }\n : { name: 'Workflow commands', status: 'fail', fix: 'Run: npx ca setup' });\n\n // 5. Hooks\n const settingsPath = getClaudeSettingsPath(false);\n let hooksOk = false;\n try {\n const settings = await readClaudeSettings(settingsPath);\n hooksOk = hasAllCompoundAgentHooks(settings);\n } catch {\n // settings.json may not exist\n }\n checks.push(hooksOk\n ? { name: 'Claude hooks', status: 'pass' }\n : { name: 'Claude hooks', status: 'fail', fix: 'Run: npx ca setup' });\n\n // 6. Embedding model\n let modelOk = false;\n try {\n modelOk = isModelAvailable();\n } catch {\n // model check may fail\n }\n checks.push(modelOk\n ? { name: 'Embedding model', status: 'pass' }\n : { name: 'Embedding model', status: 'warn', fix: 'Run: npx ca download-model' });\n\n // 7. Beads CLI available\n const beadsResult = checkBeadsAvailable();\n checks.push(beadsResult.available\n ? { name: 'Beads CLI', status: 'pass' }\n : { name: 'Beads CLI', status: 'warn', fix: 'Install beads: https://github.com/Nathandela/beads' });\n\n // 8. .gitignore health\n checks.push(checkGitignoreHealth(repoRoot)\n ? { name: '.gitignore health', status: 'pass' }\n : { name: '.gitignore health', status: 'warn', fix: 'Run: npx ca setup --update' });\n\n // 9. Usage documentation\n const docPath = join(repoRoot, 'docs', 'compound', 'README.md');\n checks.push(existsSync(docPath)\n ? { name: 'Usage documentation', status: 'pass' }\n : { name: 'Usage documentation', status: 'warn', fix: 'Run: npx ca setup' });\n\n // 10. Beads initialized\n const beadsDir = join(repoRoot, '.beads');\n checks.push(existsSync(beadsDir)\n ? { name: 'Beads initialized', status: 'pass' }\n : { name: 'Beads initialized', status: 'warn', fix: 'Run: bd init' });\n\n // 11. Beads healthy\n if (beadsResult.available && existsSync(beadsDir)) {\n try {\n execSync('bd doctor', { cwd: repoRoot, shell: '/bin/sh', stdio: 'pipe' });\n checks.push({ name: 'Beads healthy', status: 'pass' });\n } catch {\n checks.push({ name: 'Beads healthy', status: 'warn', fix: 'Run: bd doctor' });\n }\n }\n\n // 12. Codebase scope\n const scope = checkUserScope(repoRoot);\n checks.push(!scope.isUserScope\n ? { name: 'Codebase scope', status: 'pass' }\n : { name: 'Codebase scope', status: 'warn', fix: 'Install in a specific repository, not home directory' });\n\n return checks;\n}\n\nconst STATUS_ICONS: Record<string, string> = {\n pass: 'OK',\n fail: 'FAIL',\n warn: 'WARN',\n};\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command('doctor')\n .description('Verify external dependencies and project health')\n .action(async () => {\n const repoRoot = getRepoRoot();\n const checks = await runDoctor(repoRoot);\n\n console.log('Compound Agent Health Check:\\n');\n for (const check of checks) {\n const icon = STATUS_ICONS[check.status];\n const line = ` [${icon}] ${check.name}`;\n console.log(line);\n if (check.fix) {\n console.log(` Fix: ${check.fix}`);\n }\n }\n\n const failures = checks.filter(c => c.status === 'fail');\n const warnings = checks.filter(c => c.status === 'warn');\n console.log('');\n if (failures.length === 0 && warnings.length === 0) {\n console.log('All checks passed.');\n } else {\n if (failures.length > 0) console.log(`${failures.length} check(s) failed.`);\n if (warnings.length > 0) console.log(`${warnings.length} warning(s).`);\n }\n });\n}\n","/**\n * Invalidation commands: wrong, validate\n *\n * Commands for managing lesson validity state.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { appendMemoryItem, readMemoryItems } from '../memory/storage/index.js';\nimport type { MemoryItem } from '../memory/index.js';\n\nimport { formatError } from '../cli-error-format.js';\n\nimport { out } from './shared.js';\n\n/**\n * Register invalidation commands on the program.\n */\nexport function registerInvalidationCommands(program: Command): void {\n /**\n * Wrong command - Mark a lesson as invalid/wrong.\n *\n * Appends an invalidatedAt timestamp and optional reason to the lesson.\n * Invalidated lessons are excluded from retrieval but remain in storage.\n *\n * @example npx ca wrong L12345678\n * @example npx ca wrong L12345678 --reason \"This advice was incorrect\"\n */\n program\n .command('wrong <id>')\n .description('Mark a lesson as invalid/wrong')\n .option('-r, --reason <text>', 'Reason for invalidation')\n .action(async function (this: Command, id: string, options: { reason?: string }) {\n const repoRoot = getRepoRoot();\n\n // Read all lessons\n const { items } = await readMemoryItems(repoRoot);\n\n // Find the lesson\n const lesson = items.find((l) => l.id === id);\n if (!lesson) {\n console.error(formatError('wrong', 'NOT_FOUND', `Lesson not found: ${id}`, 'Use \"ca list\" to see available lessons'));\n process.exitCode = 1;\n return;\n }\n\n // Check if already invalidated\n if (lesson.invalidatedAt) {\n out.warn(`Lesson ${id} is already marked as invalid.`);\n return;\n }\n\n // Create updated lesson with invalidation\n const updatedItem: MemoryItem = {\n ...lesson,\n invalidatedAt: new Date().toISOString(),\n ...(options.reason !== undefined && { invalidationReason: options.reason }),\n };\n\n // Append the updated lesson (JSONL append-only pattern)\n await appendMemoryItem(repoRoot, updatedItem);\n out.success(`Lesson ${id} marked as invalid.`);\n if (options.reason) {\n console.log(` Reason: ${options.reason}`);\n }\n });\n\n /**\n * Validate command - Remove invalidation from a lesson.\n *\n * Re-enables a previously invalidated lesson for retrieval.\n *\n * @example npx ca validate L12345678\n */\n program\n .command('validate <id>')\n .description('Re-enable a previously invalidated lesson')\n .action(async function (this: Command, id: string) {\n const repoRoot = getRepoRoot();\n\n // Read all lessons\n const { items } = await readMemoryItems(repoRoot);\n\n // Find the lesson\n const lesson = items.find((l) => l.id === id);\n if (!lesson) {\n console.error(formatError('validate', 'NOT_FOUND', `Lesson not found: ${id}`, 'Use \"ca list\" to see available lessons'));\n process.exitCode = 1;\n return;\n }\n\n // Check if not invalidated\n if (!lesson.invalidatedAt) {\n out.info(`Lesson ${id} is not invalidated.`);\n return;\n }\n\n // Remove invalidation fields (keep everything else)\n const updatedItem: MemoryItem = {\n ...lesson,\n invalidatedAt: undefined,\n invalidationReason: undefined,\n };\n\n // Append the updated lesson (JSONL append-only pattern)\n await appendMemoryItem(repoRoot, updatedItem);\n out.success(`Lesson ${id} re-enabled (validated).`);\n });\n}\n","/**\n * I/O commands: export, import\n *\n * Commands for importing and exporting lessons.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { appendMemoryItem, readMemoryItems } from '../memory/storage/index.js';\nimport { MemoryItemSchema } from '../memory/index.js';\nimport type { MemoryItem } from '../memory/index.js';\n\nimport { formatError } from '../cli-error-format.js';\n\nimport { JSON_INDENT_SPACES } from './shared.js';\n\n// ============================================================================\n// Action Handlers\n// ============================================================================\n\nasync function exportAction(options: { since?: string; tags?: string }): Promise<void> {\n const repoRoot = getRepoRoot();\n\n const { items } = await readMemoryItems(repoRoot);\n\n let filtered = items;\n\n if (options.since) {\n const sinceDate = new Date(options.since);\n if (Number.isNaN(sinceDate.getTime())) {\n console.error(formatError('export', 'INVALID_DATE', `Invalid date format: ${options.since}`, 'Use ISO8601 format (e.g., 2024-01-15)'));\n process.exitCode = 1;\n return;\n }\n filtered = filtered.filter((item) => new Date(item.created) >= sinceDate);\n }\n\n if (options.tags) {\n const filterTags = options.tags.split(',').map((t) => t.trim());\n filtered = filtered.filter((item) => item.tags.some((tag) => filterTags.includes(tag)));\n }\n\n console.log(JSON.stringify(filtered, null, JSON_INDENT_SPACES));\n}\n\nasync function importAction(file: string): Promise<void> {\n const repoRoot = getRepoRoot();\n\n let content: string;\n try {\n content = await readFile(file, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n console.error(formatError('import', 'FILE_NOT_FOUND', `File not found: ${file}`, 'Check the path and try again'));\n } else {\n console.error(formatError('import', 'READ_ERROR', `Error reading file: ${(err as Error).message}`, 'Check file permissions'));\n }\n process.exitCode = 1;\n return;\n }\n\n const { items: existingItems } = await readMemoryItems(repoRoot);\n const existingIds = new Set(existingItems.map((item) => item.id));\n\n const lines = content.split('\\n');\n let imported = 0;\n let skipped = 0;\n let invalid = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n invalid++;\n continue;\n }\n\n const result = MemoryItemSchema.safeParse(parsed);\n if (!result.success) {\n invalid++;\n continue;\n }\n\n const item: MemoryItem = result.data;\n\n if (existingIds.has(item.id)) {\n skipped++;\n continue;\n }\n\n await appendMemoryItem(repoRoot, item);\n existingIds.add(item.id);\n imported++;\n }\n\n const lessonWord = imported === 1 ? 'lesson' : 'lessons';\n const parts: string[] = [];\n if (skipped > 0) parts.push(`${skipped} skipped`);\n if (invalid > 0) parts.push(`${invalid} invalid`);\n\n if (parts.length > 0) {\n console.log(`Imported ${imported} ${lessonWord} (${parts.join(', ')})`);\n } else {\n console.log(`Imported ${imported} ${lessonWord}`);\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register I/O commands on the program.\n */\nexport function registerIOCommands(program: Command): void {\n program\n .command('export')\n .description('Export lessons as JSON to stdout')\n .option('--since <date>', 'Only include lessons created after this date (ISO8601)')\n .option('--tags <tags>', 'Filter by tags (comma-separated, OR logic)')\n .action(async (options: { since?: string; tags?: string }) => {\n await exportAction(options);\n });\n\n program\n .command('import <file>')\n .description('Import lessons from a JSONL file')\n .action(async (file: string) => {\n await importAction(file);\n });\n}\n","/**\n * Maintenance commands: compact, rebuild, stats\n *\n * Commands for database health and maintenance.\n */\n\nimport { statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatBytes, getRepoRoot } from '../cli-utils.js';\nimport {\n compact,\n countTombstones,\n DB_PATH,\n getRetrievalStats,\n LESSONS_PATH,\n needsCompaction,\n readMemoryItems,\n rebuildIndex,\n syncIfNeeded,\n TOMBSTONE_THRESHOLD,\n} from '../memory/storage/index.js';\n\nimport {\n AGE_FLAG_THRESHOLD_DAYS,\n AVG_DECIMAL_PLACES,\n getLessonAgeDays,\n LESSON_COUNT_WARNING_THRESHOLD,\n out,\n} from './shared.js';\n\n// ============================================================================\n// Action Handlers\n// ============================================================================\n\nasync function compactAction(options: { force?: boolean; dryRun?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n\n const tombstones = await countTombstones(repoRoot);\n const needs = await needsCompaction(repoRoot);\n\n if (options.dryRun) {\n console.log('Dry run - no changes will be made.\\n');\n console.log(`Tombstones found: ${tombstones}`);\n console.log(`Compaction needed: ${needs ? 'yes' : 'no'}`);\n return;\n }\n\n if (!needs && !options.force) {\n console.log(`Compaction not needed (${tombstones} tombstones, threshold is ${TOMBSTONE_THRESHOLD}).`);\n console.log('Use --force to compact anyway.');\n return;\n }\n\n console.log('Running compaction...');\n const result = await compact(repoRoot);\n\n console.log('\\nCompaction complete:');\n console.log(` Archived: ${result.archived} lesson(s)`);\n console.log(` Tombstones removed: ${result.tombstonesRemoved}`);\n console.log(` Lessons remaining: ${result.lessonsRemaining}`);\n if (result.droppedInvalid > 0) {\n console.log(` Invalid records dropped: ${result.droppedInvalid}`);\n }\n\n await rebuildIndex(repoRoot);\n console.log(' Index rebuilt.');\n}\n\nasync function rebuildAction(options: { force?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n if (options.force) {\n console.log('Forcing index rebuild...');\n await rebuildIndex(repoRoot);\n console.log('Index rebuilt.');\n } else {\n const rebuilt = await syncIfNeeded(repoRoot);\n if (rebuilt) {\n console.log('Index rebuilt (JSONL changed).');\n } else {\n console.log('Index is up to date.');\n }\n }\n}\n\nasync function statsAction(): Promise<void> {\n const repoRoot = getRepoRoot();\n\n await syncIfNeeded(repoRoot);\n\n const { items } = await readMemoryItems(repoRoot);\n const deletedCount = await countTombstones(repoRoot);\n const totalLessons = items.length;\n\n const retrievalStats = getRetrievalStats(repoRoot);\n const totalRetrievals = retrievalStats.reduce((sum, s) => sum + s.count, 0);\n const avgRetrievals = totalLessons > 0 ? (totalRetrievals / totalLessons).toFixed(AVG_DECIMAL_PLACES) : '0.0';\n\n const jsonlPath = join(repoRoot, LESSONS_PATH);\n const dbPath = join(repoRoot, DB_PATH);\n\n let dataSize = 0;\n let indexSize = 0;\n\n try { dataSize = statSync(jsonlPath).size; } catch { /* File doesn't exist */ }\n try { indexSize = statSync(dbPath).size; } catch { /* File doesn't exist */ }\n\n const totalSize = dataSize + indexSize;\n\n let recentCount = 0;\n let mediumCount = 0;\n let oldCount = 0;\n for (const item of items) {\n const ageDays = getLessonAgeDays(item);\n if (ageDays < 30) {\n recentCount++;\n } else if (ageDays <= AGE_FLAG_THRESHOLD_DAYS) {\n mediumCount++;\n } else {\n oldCount++;\n }\n }\n\n const typeCounts: Record<string, number> = {};\n for (const item of items) {\n typeCounts[item.type] = (typeCounts[item.type] ?? 0) + 1;\n }\n\n const deletedInfo = deletedCount > 0 ? ` (${deletedCount} deleted)` : '';\n console.log(`Lessons: ${totalLessons} total${deletedInfo}`);\n\n if (Object.keys(typeCounts).length > 1 || (Object.keys(typeCounts).length === 1 && !typeCounts['lesson'])) {\n const breakdown = Object.entries(typeCounts)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([type, count]) => `${count} ${type}`)\n .join(', ');\n console.log(`Types: ${breakdown}`);\n }\n\n if (totalLessons > LESSON_COUNT_WARNING_THRESHOLD) {\n out.warn(`High lesson count may degrade retrieval quality. Consider running \\`ca compact\\`.`);\n }\n\n if (totalLessons > 0) {\n console.log(`Age: ${recentCount} <30d, ${mediumCount} 30-90d, ${oldCount} >90d`);\n }\n\n console.log(`Retrievals: ${totalRetrievals} total, ${avgRetrievals} avg per lesson`);\n console.log(`Storage: ${formatBytes(totalSize)} (index: ${formatBytes(indexSize)}, data: ${formatBytes(dataSize)})`);\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register maintenance commands on the program.\n */\nexport function registerMaintenanceCommands(program: Command): void {\n program\n .command('compact')\n .description('Compact lessons: archive old lessons and remove tombstones')\n .option('-f, --force', 'Run compaction even if below threshold')\n .option('--dry-run', 'Show what would be done without making changes')\n .action(async (options: { force?: boolean; dryRun?: boolean }) => {\n await compactAction(options);\n });\n\n program\n .command('rebuild')\n .description('Rebuild SQLite index from JSONL')\n .option('-f, --force', 'Force rebuild even if unchanged')\n .action(async (options: { force?: boolean }) => {\n await rebuildAction(options);\n });\n\n program\n .command('stats')\n .description('Show database health and statistics')\n .action(async () => {\n await statsAction();\n });\n}\n","/**\n * Prime command - Context recovery for Claude Code with Beads-style trust language.\n *\n * Generates trust language guidelines combined with high-severity lessons\n * for context recovery after compaction or session restart.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { loadSessionLessons } from '../memory/retrieval/index.js';\nimport { syncIfNeeded } from '../memory/storage/index.js';\nimport type { MemoryItem, Source } from '../memory/index.js';\nimport { getPhaseState } from './phase-check.js';\n/**\n * Beads-style trust language template.\n *\n * Uses explicit prohibitions, workflow sequencing, and NEVER/MUST language\n * following Beads conventions for maximum adherence.\n *\n * CLI-first: all lesson operations use `npx ca` commands.\n */\nconst TRUST_LANGUAGE_TEMPLATE = `# Compound Agent Active\n\n> **Context Recovery**: Run \\`npx ca prime\\` after compaction, clear, or new session\n\n## CLI Commands (ALWAYS USE THESE)\n\n**You MUST use CLI commands for lesson management:**\n\n| Command | Purpose |\n|---------|---------|\n| \\`npx ca search \"query\"\\` | Search lessons - call BEFORE architectural decisions |\n| \\`npx ca learn \"insight\"\\` | Capture lessons - call AFTER corrections or discoveries |\n\n## Core Constraints\n\n**Default**: Use CLI commands for lesson management\n**Prohibited**: NEVER edit .claude/lessons/ files directly\n\n**Default**: Propose lessons freely after corrections\n**Prohibited**: NEVER propose without quality gate (novel + specific; prefer actionable)\n\n## Retrieval Protocol\n\nYou MUST call \\`npx ca search\\` BEFORE:\n- Architectural decisions or complex planning\n- Implementing patterns you've done before in this repo\n\n**NEVER skip search for complex decisions.** Past mistakes will repeat.\n\n## Capture Protocol\n\nRun \\`npx ca learn\\` AFTER:\n- User corrects you (\"no\", \"wrong\", \"actually...\")\n- You self-correct after iteration failures\n- Test fails then you fix it\n\n**Quality gate** (must pass before capturing):\n- Novel (not already stored)\n- Specific (clear guidance)\n- Actionable (preferred, not mandatory)\n\n**Workflow**: Search BEFORE deciding, capture AFTER learning.\n`;\n\n/**\n * Format lesson source for human-readable display.\n */\nfunction formatSource(source: Source): string {\n switch (source) {\n case 'user_correction':\n return 'user correction';\n case 'self_correction':\n return 'self correction';\n case 'test_failure':\n return 'test failure';\n case 'manual':\n return 'manual';\n default:\n return source;\n }\n}\n\n/**\n * Format a single lesson for the Emergency Recall section.\n *\n * Format: - **{insight}** ({tags})\n * Learned: {date} via {source}\n */\nfunction formatLessonForPrime(lesson: MemoryItem): string {\n const date = lesson.created.slice(0, 10); // YYYY-MM-DD\n const tags = lesson.tags.length > 0 ? ` (${lesson.tags.join(', ')})` : '';\n const source = formatSource(lesson.source);\n return `- **${lesson.insight}**${tags}\\n Learned: ${date} via ${source}`;\n}\n\nfunction formatActiveLfgSection(repoRoot: string): string | null {\n const state = getPhaseState(repoRoot);\n if (state === null || !state.lfg_active) return null;\n\n const skillsRead = state.skills_read.length === 0 ? '(none)' : state.skills_read.join(', ');\n const gatesPassed = state.gates_passed.length === 0 ? '(none)' : state.gates_passed.join(', ');\n\n return `\n---\n\n# ACTIVE LFG SESSION\n\nEpic: ${state.epic_id}\nPhase: ${state.current_phase} (${state.phase_index}/5)\nSkills read: ${skillsRead}\nGates passed: ${gatesPassed}\nStarted: ${state.started_at}\n\nResume from phase ${state.current_phase}. Run: \\`npx ca phase-check start ${state.current_phase}\\`\nRead the skill file first: \\`.claude/skills/compound/${state.current_phase}/SKILL.md\\`\n`;\n}\n\n/**\n * Generate prime context output for Claude Code.\n *\n * Combines Beads-style trust language guidelines with high-severity lessons\n * for context recovery after compaction or session restart.\n *\n * @param repoRoot - Repository root directory (defaults to getRepoRoot())\n * @returns Formatted markdown string (< 2K tokens)\n */\nexport async function getPrimeContext(repoRoot?: string): Promise<string> {\n const root = repoRoot ?? getRepoRoot();\n\n // Sync SQLite index before loading — ensures searches have fresh data\n // after git pull or external JSONL changes.\n try {\n await syncIfNeeded(root);\n } catch {\n // Non-fatal: prime still works from JSONL even if SQLite sync fails\n }\n\n // Load high-severity lessons (top 5, sorted by recency)\n const lessons = await loadSessionLessons(root, 5);\n\n // Build output: trust language first\n let output = TRUST_LANGUAGE_TEMPLATE;\n\n // Add Emergency Recall section if we have high-severity lessons\n if (lessons.length > 0) {\n const formattedLessons = lessons.map(formatLessonForPrime).join('\\n\\n');\n output += `\n---\n\n# [CRITICAL] Mandatory Recall\n\nCritical lessons from past corrections:\n\n${formattedLessons}\n`;\n }\n\n const lfgSection = formatActiveLfgSection(root);\n if (lfgSection !== null) {\n output += lfgSection;\n }\n\n return output;\n}\n\n/**\n * Register prime command on the program.\n */\nexport function registerPrimeCommand(program: Command): void {\n /**\n * Prime command - Output context recovery for Claude Code.\n *\n * Combines Beads-style trust language guidelines with high-severity lessons.\n * Used after compaction or context loss to remind Claude of the\n * compound-agent workflow, rules, and commands.\n *\n * @example npx ca prime\n */\n program\n .command('prime')\n .description('Output context for Claude Code (guidelines + top lessons)')\n .action(async () => {\n const output = await getPrimeContext();\n console.log(output);\n });\n}\n","/**\n * Audit command: ca audit\n *\n * Runs all audit checks and outputs findings.\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { formatError } from '../cli-error-format.js';\nimport { runAudit } from '../audit/index.js';\nimport type { AuditFinding } from '../audit/index.js';\n\nimport { getGlobalOpts } from './shared.js';\n\nconst JSON_INDENT = 2;\n\n/**\n * Format a single finding as a human-readable line.\n */\nfunction formatFinding(finding: AuditFinding): string {\n const label = finding.severity.toUpperCase();\n const filePart = finding.file ? ` ${finding.file}` : '';\n return `${label} [${finding.source}]${filePart} -- ${finding.issue}`;\n}\n\n/**\n * Register the audit command on the program.\n */\nexport function registerAuditCommands(program: Command): void {\n program\n .command('audit')\n .description('Run audit checks against the codebase')\n .option('--json', 'Output as JSON')\n .option('--no-rules', 'Skip rule checks')\n .option('--no-patterns', 'Skip pattern checks')\n .option('--no-lessons', 'Skip lesson checks')\n .action(async function (this: Command) {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(this);\n const opts = this.opts<{ json?: boolean; rules: boolean; patterns: boolean; lessons: boolean }>();\n\n let report;\n try {\n report = await runAudit(repoRoot, {\n includeRules: opts.rules,\n includePatterns: opts.patterns,\n includeLessons: opts.lessons,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Audit failed';\n console.error(formatError('audit', 'AUDIT_ERROR', msg, 'Check repo configuration'));\n process.exitCode = 1;\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(report, null, JSON_INDENT));\n } else {\n for (const finding of report.findings) {\n const line = formatFinding(finding);\n switch (finding.severity) {\n case 'error':\n console.log(chalk.red(line));\n break;\n case 'warning':\n console.log(chalk.yellow(line));\n break;\n default:\n console.log(chalk.blue(line));\n break;\n }\n }\n\n if (!quiet) {\n console.log('');\n console.log(\n `Audit: ${report.findings.length} finding(s), ` +\n `${report.summary.errors} error(s), ` +\n `${report.summary.warnings} warning(s), ` +\n `${report.summary.infos} info(s)`\n );\n }\n }\n\n if (report.summary.errors > 0) {\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Configuration for compound-agent.\n * Stored in .claude/compound-agent.json (user-editable, not overwritten by setup --update).\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\n/** Config filename within .claude/ */\nexport const CONFIG_FILENAME = 'compound-agent.json';\n\n/** Valid external reviewer tool names. */\nexport const VALID_REVIEWERS = ['gemini', 'codex'] as const;\nexport type ReviewerName = (typeof VALID_REVIEWERS)[number];\n\n/** Shape of .claude/compound-agent.json */\nexport interface CompoundAgentConfig {\n externalReviewers?: string[];\n}\n\nfunction configPath(repoRoot: string): string {\n return join(repoRoot, '.claude', CONFIG_FILENAME);\n}\n\n/**\n * Read config from .claude/compound-agent.json.\n * Returns empty object if file doesn't exist or is malformed.\n */\nexport async function readConfig(repoRoot: string): Promise<CompoundAgentConfig> {\n const path = configPath(repoRoot);\n if (!existsSync(path)) return {};\n try {\n const parsed = JSON.parse(await readFile(path, 'utf-8'));\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return {};\n return parsed;\n } catch {\n return {};\n }\n}\n\n/**\n * Write config to .claude/compound-agent.json.\n */\nexport async function writeConfig(repoRoot: string, config: CompoundAgentConfig): Promise<void> {\n await mkdir(join(repoRoot, '.claude'), { recursive: true });\n await writeFile(configPath(repoRoot), JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Get the list of enabled external reviewers, filtering out invalid names.\n */\n/**\n * Safely extract the externalReviewers array from config, handling malformed values.\n */\nfunction safeReviewerArray(config: CompoundAgentConfig): string[] {\n const raw = config.externalReviewers;\n if (!Array.isArray(raw)) return [];\n return raw;\n}\n\nexport async function getExternalReviewers(repoRoot: string): Promise<ReviewerName[]> {\n const config = await readConfig(repoRoot);\n return safeReviewerArray(config).filter((r): r is ReviewerName => (VALID_REVIEWERS as readonly string[]).includes(r));\n}\n\n/**\n * Enable an external reviewer. Returns true if it was added, false if already enabled.\n */\nexport async function enableReviewer(repoRoot: string, name: string): Promise<boolean> {\n if (!(VALID_REVIEWERS as readonly string[]).includes(name)) {\n throw new Error(`Invalid reviewer: ${name}. Valid options: ${VALID_REVIEWERS.join(', ')}`);\n }\n const config = await readConfig(repoRoot);\n const reviewers = safeReviewerArray(config);\n if (reviewers.includes(name)) return false;\n config.externalReviewers = [...reviewers, name];\n await writeConfig(repoRoot, config);\n return true;\n}\n\n/**\n * Disable an external reviewer. Returns true if it was removed, false if not enabled.\n */\nexport async function disableReviewer(repoRoot: string, name: string): Promise<boolean> {\n const config = await readConfig(repoRoot);\n const reviewers = safeReviewerArray(config);\n if (!reviewers.includes(name)) return false;\n config.externalReviewers = reviewers.filter(r => r !== name);\n await writeConfig(repoRoot, config);\n return true;\n}\n","/**\n * CLI command for managing external reviewers.\n *\n * Usage:\n * ca reviewer enable gemini\n * ca reviewer disable codex\n * ca reviewer list\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport {\n enableReviewer,\n disableReviewer,\n getExternalReviewers,\n VALID_REVIEWERS,\n} from '../config/index.js';\n\nexport function registerReviewerCommand(program: Command): void {\n const reviewer = program\n .command('reviewer')\n .description('Manage external code reviewers (gemini, codex)');\n\n reviewer\n .command('enable <name>')\n .description(`Enable an external reviewer (${VALID_REVIEWERS.join(', ')})`)\n .action(async (name: string) => {\n const repoRoot = getRepoRoot();\n try {\n const added = await enableReviewer(repoRoot, name);\n if (added) {\n console.log(`Enabled external reviewer: ${name}`);\n } else {\n console.log(`${name} is already enabled`);\n }\n } catch (err) {\n console.error((err as Error).message);\n process.exitCode = 1;\n }\n });\n\n reviewer\n .command('disable <name>')\n .description('Disable an external reviewer')\n .action(async (name: string) => {\n try {\n const repoRoot = getRepoRoot();\n const removed = await disableReviewer(repoRoot, name);\n if (removed) {\n console.log(`Disabled external reviewer: ${name}`);\n } else {\n console.log(`${name} is not enabled`);\n }\n } catch (err) {\n console.error((err as Error).message);\n process.exitCode = 1;\n }\n });\n\n reviewer\n .command('list')\n .description('List enabled external reviewers')\n .action(async () => {\n try {\n const repoRoot = getRepoRoot();\n const reviewers = await getExternalReviewers(repoRoot);\n if (reviewers.length === 0) {\n console.log('No external reviewers enabled');\n console.log(`Available: ${VALID_REVIEWERS.join(', ')}`);\n console.log('Enable with: ca reviewer enable <name>');\n } else {\n console.log('Enabled external reviewers:');\n for (const r of reviewers) {\n console.log(` - ${r}`);\n }\n }\n } catch (err) {\n console.error((err as Error).message);\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Rules command: rules check\n *\n * Runs repository-defined rules from .claude/rules.json and outputs\n * agent-legible violation messages.\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { formatError } from '../cli-error-format.js';\nimport { formatViolation, loadRuleConfig, runRules } from '../rules/index.js';\n\nimport { getGlobalOpts, out } from './shared.js';\n\n/**\n * Register the rules command group on the program.\n */\nexport function registerRulesCommands(program: Command): void {\n const rulesCmd = program\n .command('rules')\n .description('Run repository-defined rule checks');\n\n rulesCmd\n .command('check')\n .description('Check codebase against rules in .claude/rules.json')\n .action(function (this: Command) {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(this);\n\n let config;\n try {\n config = loadRuleConfig(repoRoot);\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Failed to load rules config';\n console.error(formatError('rules', 'CONFIG_ERROR', msg, 'Check .claude/rules.json syntax'));\n process.exitCode = 1;\n return;\n }\n\n if (config.rules.length === 0) {\n if (!quiet) {\n out.info('No rules defined. Create .claude/rules.json to add rules.');\n }\n return;\n }\n\n const results = runRules(repoRoot, config.rules);\n\n // Print violations\n for (const result of results) {\n for (const violation of result.violations) {\n const line = formatViolation(result.rule, violation);\n switch (result.rule.severity) {\n case 'error':\n console.log(chalk.red(line));\n break;\n case 'warning':\n console.log(chalk.yellow(line));\n break;\n default:\n console.log(chalk.blue(line));\n break;\n }\n }\n }\n\n // Summary\n const total = results.length;\n const errors = results.filter((r) => !r.passed && r.rule.severity === 'error').length;\n const warnings = results.filter((r) => !r.passed && r.rule.severity === 'warning').length;\n const passed = results.filter((r) => r.passed).length;\n\n console.log('');\n console.log(`Rules: ${total} checked, ${errors} error(s), ${warnings} warning(s), ${passed} passed`);\n\n if (errors > 0) {\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Test summary command: runs tests and outputs a compact summary.\n *\n * Parses Vitest output to extract pass/fail/skip counts, duration,\n * and failing test names + error messages.\n */\n\nimport { execSync } from 'node:child_process';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A single test failure with name and error message. */\nexport interface TestFailure {\n name: string;\n error: string;\n}\n\n/** Parsed summary of a Vitest run. */\nexport interface TestSummary {\n passed: number;\n failed: number;\n skipped: number;\n total: number;\n duration: string;\n failures: TestFailure[];\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Max lines to capture from a failure body. */\nconst MAX_ERROR_BODY_LINES = 10;\n\n/** Default log file path relative to repo root. */\nconst LOG_REL_PATH = '.claude/.cache/last-test-run.log';\n\n// ============================================================================\n// Parser\n// ============================================================================\n\n/**\n * Parse Vitest output into a structured summary.\n *\n * @param output - Raw Vitest stdout/stderr output\n * @returns Parsed test summary\n */\nexport function parseVitestOutput(output: string): TestSummary {\n const summary: TestSummary = {\n passed: 0,\n failed: 0,\n skipped: 0,\n total: 0,\n duration: 'unknown',\n failures: [],\n };\n\n if (!output.trim()) return summary;\n\n // Parse the summary line: \"Tests 3 failed | 17 passed (20)\" or \"Tests 65 passed (65)\"\n const testsLine = output.match(/Tests\\s+(.+)\\((\\d+)\\)/);\n if (testsLine) {\n summary.total = parseInt(testsLine[2]!, 10);\n const parts = testsLine[1]!;\n\n const failedMatch = parts.match(/(\\d+)\\s+failed/);\n if (failedMatch) summary.failed = parseInt(failedMatch[1]!, 10);\n\n const passedMatch = parts.match(/(\\d+)\\s+passed/);\n if (passedMatch) summary.passed = parseInt(passedMatch[1]!, 10);\n\n const skippedMatch = parts.match(/(\\d+)\\s+skipped/);\n if (skippedMatch) summary.skipped = parseInt(skippedMatch[1]!, 10);\n }\n\n // Parse duration: \"Duration 1.23s\" or \"Duration 142ms\"\n const durationMatch = output.match(/Duration\\s+([\\d.]+(?:ms|s))/);\n if (durationMatch) {\n summary.duration = durationMatch[1]!;\n }\n\n // Parse individual FAIL blocks with multiline body\n const lines = output.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const failMatch = lines[i]!.match(/^ FAIL\\s+(.+?)(?:\\s+\\[.*?\\])?$/);\n if (!failMatch) continue;\n\n const name = failMatch[1]!.trim();\n const bodyLines: string[] = [];\n\n // Collect up to MAX_ERROR_BODY_LINES of the failure body\n for (let j = i + 1; j < lines.length && bodyLines.length < MAX_ERROR_BODY_LINES; j++) {\n const line = lines[j]!;\n // Stop at location lines or section separators\n if (line.trimStart().startsWith('\\u276F') || line.match(/^⎯/)) break;\n // Stop at next FAIL block\n if (line.match(/^ FAIL\\s+/)) break;\n // Skip blank lines at the start\n if (bodyLines.length === 0 && line.trim() === '') continue;\n bodyLines.push(line);\n }\n\n // Trim trailing blank lines\n while (bodyLines.length > 0 && bodyLines[bodyLines.length - 1]!.trim() === '') {\n bodyLines.pop();\n }\n\n if (bodyLines.length === 0) continue;\n\n summary.failures.push({ name, error: bodyLines.join('\\n').trim() });\n }\n\n return summary;\n}\n\n/**\n * Format a TestSummary into a compact string for CLI output.\n *\n * @param summary - Parsed test summary\n * @param logPath - Path to the full log file\n * @returns Formatted summary string\n */\nexport function formatTestSummary(summary: TestSummary, logPath: string): string {\n const lines: string[] = [];\n\n lines.push(\n `TESTS: ${summary.passed} passed, ${summary.failed} failed, ${summary.skipped} skipped (${summary.duration})`\n );\n\n if (summary.failures.length > 0) {\n const first = summary.failures[0]!;\n lines.push(`FAIL ${first.name}`);\n lines.push(` ${first.error}`);\n if (summary.failures.length > 1) {\n lines.push(` ... and ${summary.failures.length - 1} more failure(s)`);\n }\n }\n\n lines.push(`LOG: Full output at ${logPath}`);\n\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register the test-summary command on the program.\n */\nexport function registerTestSummaryCommand(program: Command): void {\n program\n .command('test-summary')\n .description('Run tests and output a compact summary')\n .option('--fast', 'Run pnpm test:fast instead of pnpm test')\n .option('--cmd <command>', 'Custom test command to run')\n .action((options: { fast?: boolean; cmd?: string }) => {\n const repoRoot = getRepoRoot();\n\n // Determine test command\n let testCmd = 'pnpm test';\n if (options.cmd) {\n testCmd = options.cmd;\n } else if (options.fast) {\n testCmd = 'pnpm test:fast';\n }\n\n // Run test command, capture output\n let output: string;\n let exitCode: number;\n try {\n output = execSync(testCmd, {\n cwd: repoRoot,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n // Merge stderr into stdout for Vitest (it writes to both)\n env: { ...process.env, FORCE_COLOR: '0' },\n });\n exitCode = 0;\n } catch (err) {\n const execErr = err as { stdout?: string; stderr?: string; status?: number };\n output = (execErr.stdout ?? '') + '\\n' + (execErr.stderr ?? '');\n exitCode = execErr.status ?? 1;\n }\n\n // Write full output to log file\n const logPath = join(repoRoot, LOG_REL_PATH);\n mkdirSync(dirname(logPath), { recursive: true });\n writeFileSync(logPath, output, 'utf-8');\n\n // Parse and format summary\n const summary = parseVitestOutput(output);\n console.log(formatTestSummary(summary, logPath));\n\n process.exit(exitCode);\n });\n}\n","/**\n * Verify-gates command — check workflow gates before epic closure.\n *\n * Usage: ca verify-gates <epic-id>\n */\n\nimport { execFileSync } from 'node:child_process';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseBdShowDeps, validateEpicId } from '../cli-utils.js';\nimport { cleanPhaseState, getPhaseState } from './phase-check.js';\n\nexport interface GateCheck {\n name: string;\n status: 'pass' | 'fail';\n detail?: string;\n}\n\ninterface DepTask {\n closed: boolean;\n title: string;\n}\n\ninterface VerifyGatesOptions {\n repoRoot?: string;\n}\n\n/**\n * Parse dependencies from `bd show --json` output into DepTask format.\n */\nfunction parseDepsJson(raw: string): DepTask[] {\n return parseBdShowDeps(raw).map(d => ({ closed: d.status === 'closed', title: d.title }));\n}\n\n/**\n * Fallback: parse the DEPENDS ON section from `bd show` text output.\n */\nfunction parseDepsText(output: string): DepTask[] {\n const deps: DepTask[] = [];\n const lines = output.split('\\n');\n let inDeps = false;\n\n for (const line of lines) {\n if (line.trim() === 'DEPENDS ON') {\n inDeps = true;\n continue;\n }\n if (inDeps) {\n const match = line.match(\n /^\\s+→\\s+(✓|○)\\s+\\S+-\\S+:\\s+(.+?)\\s+●/,\n );\n if (match && match[1] && match[2]) {\n deps.push({ closed: match[1] === '✓', title: match[2] });\n } else if (line.trim() !== '' && !line.startsWith(' ')) {\n break;\n }\n }\n }\n\n return deps;\n}\n\n/**\n * Check a single gate: find a dep whose title starts with the given prefix.\n */\nfunction checkGate(\n deps: DepTask[],\n prefix: string,\n gateName: string,\n): GateCheck {\n const task = deps.find(d => d.title.startsWith(prefix));\n\n if (!task) {\n return { name: gateName, status: 'fail', detail: `No ${gateName.toLowerCase()} found (missing)` };\n }\n if (!task.closed) {\n return { name: gateName, status: 'fail', detail: `${gateName} exists but is not closed` };\n }\n return { name: gateName, status: 'pass' };\n}\n\nexport async function runVerifyGates(\n epicId: string,\n options: VerifyGatesOptions = {}\n): Promise<GateCheck[]> {\n validateEpicId(epicId);\n\n const repoRoot = options.repoRoot ?? getRepoRoot();\n const raw = execFileSync('bd', ['show', epicId, '--json'], { encoding: 'utf-8' });\n\n let deps: DepTask[];\n try {\n deps = parseDepsJson(raw);\n } catch {\n // Fallback to text parsing if --json output is not valid JSON\n const textRaw = execFileSync('bd', ['show', epicId], { encoding: 'utf-8' });\n deps = parseDepsText(textRaw);\n }\n\n const checks = [\n checkGate(deps, 'Review:', 'Review task'),\n checkGate(deps, 'Compound:', 'Compound task'),\n ];\n\n const mergeTask = deps.find(d => d.title.startsWith('Merge:'));\n if (mergeTask) {\n checks.push(checkGate(deps, 'Merge:', 'Merge task'));\n }\n\n const allPassed = checks.every((check) => check.status === 'pass');\n if (allPassed) {\n const state = getPhaseState(repoRoot);\n if (state !== null && state.lfg_active && state.gates_passed.includes('final')) {\n cleanPhaseState(repoRoot);\n }\n }\n\n return checks;\n}\n\nconst STATUS_LABEL: Record<string, string> = {\n pass: 'PASS',\n fail: 'FAIL',\n};\n\nexport function registerVerifyGatesCommand(program: Command): void {\n program\n .command('verify-gates <epic-id>')\n .description('Verify workflow gates are satisfied before epic closure')\n .action(async (epicId: string) => {\n try {\n const checks = await runVerifyGates(epicId, { repoRoot: getRepoRoot() });\n\n console.log(`Gate checks for epic ${epicId}:\\n`);\n for (const check of checks) {\n const label = STATUS_LABEL[check.status];\n console.log(` [${label}] ${check.name}`);\n if (check.detail) {\n console.log(` ${check.detail}`);\n }\n }\n\n const failures = checks.filter(c => c.status === 'fail');\n console.log('');\n if (failures.length === 0) {\n console.log('All gates passed.');\n } else {\n console.log(`${failures.length} gate(s) failed.`);\n process.exitCode = 1;\n }\n } catch (err) {\n console.error(\n `Error: ${err instanceof Error ? err.message : String(err)}`,\n );\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Auto-generated changelog data — do not edit.\n * Generated by scripts/extract-changelog.ts\n */\n\nexport const CHANGELOG_RECENT: string = `## [1.3.3] - 2026-02-21\n\n### Changed\n\n- **Banner audio**: Rewritten as vaporwave composition with PolyBLEP anti-aliased sawtooth synthesis, biquad filters, Schroeder reverb, and delay. E minor ambiguity resolves to E major at bloom, synced 300ms ahead of the visual climax (neural brain lighting up). Post-animation reverb tail holds 1.8s for natural dissolution.\n\n## [1.3.2] - 2026-02-21\n\n### Added\n\n- **Banner audio**: Pure TypeScript WAV synthesis during the tendril animation. Cross-platform: \\`afplay\\` (macOS), \\`aplay\\` (Linux), PowerShell (Windows). Silently skips if player unavailable. Zero dependencies.\n- **Test coverage**: 19 new tests for \\`ca about\\` command, changelog extraction/escaping, and \\`--update\\` doc migration path\n\n### Fixed\n\n- **\\`setup --update\\` doc migration**: \\`--update\\` now installs the 5 split docs before removing legacy \\`HOW_TO_COMPOUND.md\\`, preventing empty \\`docs/compound/\\`\n- **Fresh checkout type-check**: \\`src/changelog-data.ts\\` tracked in git so \\`tsc --noEmit\\` passes without a prior build\n- **Trailing status text**: Banner animation no longer leaves \"al tendrils...\" remnant from previous phase\n\n### Changed\n\n- **\\`ca about\\` command**: Renamed from \\`ca version-show\\` for brevity\n- **Changelog extraction**: Core parsing/escaping logic extracted to \\`scripts/changelog-utils.ts\\` (shared between prebuild script and tests)\n- **Narrowed \\`.gitignore\\`**: Setup-generated patterns scoped to \\`compound/\\` subdirectories to avoid hiding tracked TDD agent definitions\n\n## [1.3.1] - 2026-02-21\n\n### Added\n\n- **\\`ca about\\` command**: Displays version with terminal animation (tendril growth) and recent changelog entries. Non-TTY environments get plain text output. Changelog is embedded at build time from CHANGELOG.md.\n- **3 new doctor checks**: Beads initialized (\\`.beads/\\` dir), beads healthy (\\`bd doctor\\`), codebase scope (user-scope detection)\n- **Beads + scope status in init/setup output**: Full beads health display (CLI available, initialized, healthy) and scope status shown after \\`ca init\\`, \\`ca setup\\`, and \\`ca setup --update\\`\n- **Banner on \\`--update\\`**: Terminal art animation now plays during \\`ca setup --update\\` and \\`ca init --update\\` (same TTY/quiet guards as fresh install)\n\n### Changed\n\n- **Split documentation**: \\`HOW_TO_COMPOUND.md\\` replaced by 5 focused documents in \\`docs/compound/\\`: \\`README.md\\`, \\`WORKFLOW.md\\`, \\`CLI_REFERENCE.md\\`, \\`SKILLS.md\\`, \\`INTEGRATION.md\\`\n- **Test-cleaner Phase 3 strengthened**: Adversarial review phase now mandates iteration loop until both reviewers give unconditional approval. Heading, emphasis, and quality criteria updated.\n- **Update hint on upgrade**: When \\`ca init\\` or \\`ca setup\\` detects an existing install, displays tip to run with \\`--update\\` to regenerate managed files\n- **HOW_TO_COMPOUND.md migration**: \\`ca setup --update\\` automatically removes old monolithic \\`HOW_TO_COMPOUND.md\\` if it has version frontmatter (generated by compound-agent)\n- **Doctor doc check**: Now checks for \\`docs/compound/README.md\\` instead of \\`HOW_TO_COMPOUND.md\\``;\n","/**\n * About command — display version with banner animation and recent changelog.\n *\n * Usage: ca about\n */\n\nimport type { Command } from 'commander';\n\nimport { VERSION } from '../version.js';\nimport { CHANGELOG_RECENT } from '../changelog-data.js';\nimport { playInstallBanner } from '../setup/index.js';\n\nexport function registerAboutCommand(program: Command): void {\n program\n .command('about')\n .description('Show version, animation, and recent changelog')\n .action(async () => {\n if (process.stdout.isTTY) {\n await playInstallBanner();\n } else {\n console.log(`compound-agent v${VERSION}`);\n }\n console.log('');\n console.log(CHANGELOG_RECENT);\n });\n}\n","/**\n * Worktree commands — manage git worktrees for parallel epic execution.\n *\n * Subcommands: create, wire-deps, merge, list, cleanup\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync, copyFileSync, mkdirSync } from 'node:fs';\nimport path from 'node:path';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseBdShowDeps, shortId, validateEpicId } from '../cli-utils.js';\n\n/** Parse worktree entries from `git worktree list --porcelain` output. */\nfunction parseWorktreeList(raw: string): Array<{ path: string; branch: string }> {\n const entries: Array<{ path: string; branch: string }> = [];\n let currentPath = '';\n for (const line of raw.split('\\n')) {\n if (line.startsWith('worktree ')) {\n currentPath = line.slice('worktree '.length);\n } else if (line.startsWith('branch ')) {\n const branch = line.slice('branch refs/heads/'.length);\n entries.push({ path: currentPath, branch });\n }\n }\n return entries;\n}\n\n// ============================================================================\n// worktree create\n// ============================================================================\n\nexport interface WorktreeCreateResult {\n worktreePath: string;\n branch: string;\n mergeTaskId: string;\n alreadyExists: boolean;\n}\n\nexport function runWorktreeCreate(epicId: string): WorktreeCreateResult {\n validateEpicId(epicId);\n\n const repoRoot = getRepoRoot();\n const basename = path.basename(repoRoot);\n const worktreePath = path.resolve(repoRoot, '..', `${basename}-wt-${epicId}`);\n const branch = `epic/${epicId}`;\n\n // Idempotency: check if worktree already exists\n const listRaw = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf-8' });\n const existing = parseWorktreeList(listRaw);\n if (existing.some(e => e.path === worktreePath || e.branch === branch)) {\n return { worktreePath, branch, mergeTaskId: '', alreadyExists: true };\n }\n\n // Create worktree\n execFileSync('git', ['worktree', 'add', worktreePath, '-b', branch], { encoding: 'utf-8' });\n\n // Install deps\n execFileSync('pnpm', ['install', '--frozen-lockfile'], { cwd: worktreePath, encoding: 'utf-8' });\n\n // Copy lessons JSONL\n const srcJsonl = path.join(repoRoot, '.claude', 'lessons', 'index.jsonl');\n const dstDir = path.join(worktreePath, '.claude', 'lessons');\n const dstJsonl = path.join(dstDir, 'index.jsonl');\n if (existsSync(srcJsonl)) {\n mkdirSync(dstDir, { recursive: true });\n copyFileSync(srcJsonl, dstJsonl);\n }\n\n // Run setup (pnpm exec guarantees the local installed binary)\n execFileSync('pnpm', ['exec', 'ca', 'setup', '--skip-model'], { cwd: worktreePath, encoding: 'utf-8' });\n\n // Create Merge task\n const mergeTitle = `Merge: merge ${branch} to main`;\n const mergeDesc = `INSTRUCTIONS: This task merges the worktree branch back to main. Worktree path: ${worktreePath}. Run \\`pnpm exec ca worktree merge ${epicId}\\` when all other blocking tasks are resolved.`;\n const bdOutput = execFileSync('bd', [\n 'create',\n `--title=${mergeTitle}`,\n '--type=task',\n '--priority=1',\n `--description=${mergeDesc}`,\n ], { encoding: 'utf-8' });\n\n // Parse merge task ID from bd output (e.g., \"Created learning_agent-m001\")\n const idMatch = bdOutput.match(/(\\S+)$/);\n const mergeFullId = idMatch?.[1] ?? '';\n if (!mergeFullId) {\n throw new Error('bd create returned no task ID');\n }\n const mergeTaskId = shortId(mergeFullId);\n\n // Wire dep: epic depends on merge\n execFileSync('bd', ['dep', 'add', epicId, mergeTaskId], { encoding: 'utf-8' });\n\n return { worktreePath, branch, mergeTaskId, alreadyExists: false };\n}\n\n// ============================================================================\n// worktree wire-deps\n// ============================================================================\n\nexport interface WireDepsResult {\n noMergeTask: boolean;\n wired: string[];\n warnings: string[];\n}\n\nexport function runWorktreeWireDeps(epicId: string): WireDepsResult {\n validateEpicId(epicId);\n\n const raw = execFileSync('bd', ['show', epicId, '--json'], { encoding: 'utf-8' });\n const deps = parseBdShowDeps(raw);\n\n const mergeDep = deps.find(d => d.title.startsWith('Merge:'));\n if (!mergeDep) {\n return { noMergeTask: true, wired: [], warnings: [] };\n }\n const mergeId = shortId(mergeDep.id);\n\n const wired: string[] = [];\n const warnings: string[] = [];\n\n const reviewDep = deps.find(d => d.title.startsWith('Review:'));\n const compoundDep = deps.find(d => d.title.startsWith('Compound:'));\n\n if (reviewDep) {\n const reviewId = shortId(reviewDep.id);\n execFileSync('bd', ['dep', 'add', mergeId, reviewId], { encoding: 'utf-8' });\n wired.push(reviewId);\n } else {\n warnings.push('No Review task found — it may not exist yet');\n }\n\n if (compoundDep) {\n const compoundId = shortId(compoundDep.id);\n execFileSync('bd', ['dep', 'add', mergeId, compoundId], { encoding: 'utf-8' });\n wired.push(compoundId);\n } else {\n warnings.push('No Compound task found — it may not exist yet');\n }\n\n return { noMergeTask: false, wired, warnings };\n}\n\n// ============================================================================\n// worktree merge\n// ============================================================================\n\nexport interface WorktreeMergeResult {\n mainRepo: string;\n newLessons: number;\n}\n\nexport function runWorktreeMerge(epicId: string): WorktreeMergeResult {\n validateEpicId(epicId);\n\n const branch = `epic/${epicId}`;\n\n // Discover main repo\n const gitCommonDir = execFileSync('git', ['rev-parse', '--git-common-dir'], { encoding: 'utf-8' }).trim();\n const mainRepo = path.resolve(gitCommonDir, '..');\n\n // Verify main repo is on the main branch\n const currentBranch = execFileSync(\n 'git', ['-C', mainRepo, 'rev-parse', '--abbrev-ref', 'HEAD'], { encoding: 'utf-8' },\n ).trim();\n if (currentBranch !== 'main') {\n throw new Error(`Main repo is on branch \"${currentBranch}\", expected \"main\". Checkout main before merging.`);\n }\n\n // Discover worktree path\n const listRaw = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf-8' });\n const entries = parseWorktreeList(listRaw);\n const wtEntry = entries.find(e => e.branch === branch);\n if (!wtEntry) {\n throw new Error(`Worktree not found for branch \"${branch}\". Run \\`ca worktree list\\` to see active worktrees.`);\n }\n const worktreePath = wtEntry.path;\n\n // Phase 1: Sync (merge main into worktree)\n try {\n execFileSync('git', ['merge', 'main'], { cwd: worktreePath, encoding: 'utf-8' });\n } catch (err) {\n throw new Error(\n `Merge conflict in worktree at ${worktreePath}. ` +\n `Resolve conflicts there and run \\`ca worktree merge ${epicId}\\` again. ` +\n `Detail: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n // Phase 2: Run tests in worktree\n try {\n execFileSync('pnpm', ['test'], { cwd: worktreePath, encoding: 'utf-8' });\n } catch (err) {\n throw new Error(\n `Tests failed in worktree at ${worktreePath}. ` +\n `Fix failures before merging. ` +\n `Detail: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n // Phase 3: Land (merge worktree branch into main)\n execFileSync('git', ['-C', mainRepo, 'merge', branch, '--no-edit'], { encoding: 'utf-8' });\n\n // Phase 4: Reconcile JSONL (handle uncommitted worktree changes not captured by git merge).\n // Uses line-based dedup: appends any worktree lines not already in main.\n // This preserves last-write-wins semantics for same-ID updates/deletes.\n const mainJsonlPath = path.join(mainRepo, '.claude', 'lessons', 'index.jsonl');\n const wtJsonlPath = path.join(worktreePath, '.claude', 'lessons', 'index.jsonl');\n let newLessons = 0;\n\n if (existsSync(wtJsonlPath)) {\n const mainContent = existsSync(mainJsonlPath)\n ? readFileSync(mainJsonlPath, 'utf-8')\n : '';\n const mainLineSet = new Set(mainContent.split('\\n').filter(Boolean));\n const wtLines = readFileSync(wtJsonlPath, 'utf-8').split('\\n').filter(Boolean);\n\n const newLines = wtLines.filter(line => !mainLineSet.has(line));\n if (newLines.length > 0) {\n const base = mainContent.trimEnd();\n const appended = base ? `${base}\\n${newLines.join('\\n')}\\n` : `${newLines.join('\\n')}\\n`;\n writeFileSync(mainJsonlPath, appended, 'utf-8');\n newLessons = newLines.length;\n }\n }\n\n // Phase 5: Clean up worktree and branch\n execFileSync('git', ['worktree', 'remove', worktreePath], { encoding: 'utf-8' });\n execFileSync('git', ['branch', '-d', branch], { encoding: 'utf-8' });\n\n return { mainRepo, newLessons };\n}\n\n// ============================================================================\n// worktree list\n// ============================================================================\n\nexport interface WorktreeEntry {\n epicId: string;\n path: string;\n branch: string;\n status: string;\n}\n\nexport function runWorktreeList(): WorktreeEntry[] {\n const listRaw = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf-8' });\n const entries = parseWorktreeList(listRaw);\n\n const results: WorktreeEntry[] = [];\n for (const entry of entries) {\n if (!entry.path.includes('-wt-')) continue;\n\n const epicIdMatch = entry.path.match(/-wt-(.+)$/);\n if (!epicIdMatch?.[1]) continue;\n const epicId: string = epicIdMatch[1];\n\n let status = 'unknown';\n try {\n const raw = execFileSync('bd', ['show', epicId, '--json'], { encoding: 'utf-8' });\n const data = JSON.parse(raw);\n const issue = Array.isArray(data) ? data[0] : data;\n status = issue?.status ?? 'unknown';\n } catch {\n // bd show failed — status stays unknown\n }\n\n results.push({ epicId, path: entry.path, branch: entry.branch, status });\n }\n\n return results;\n}\n\n// ============================================================================\n// worktree cleanup\n// ============================================================================\n\nexport interface WorktreeCleanupResult {\n removed: boolean;\n mergeTaskClosed: boolean;\n}\n\nexport function runWorktreeCleanup(\n epicId: string,\n options: { force?: boolean } = {},\n): WorktreeCleanupResult {\n validateEpicId(epicId);\n\n const listRaw = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf-8' });\n const entries = parseWorktreeList(listRaw);\n const branch = `epic/${epicId}`;\n const wtEntry = entries.find(e => e.branch === branch || e.path.endsWith(`-wt-${epicId}`));\n\n if (!wtEntry) {\n throw new Error(`Worktree not found for epic \"${epicId}\"`);\n }\n\n // Check for dirty state\n if (!options.force) {\n const status = execFileSync('git', ['status', '--porcelain'], {\n cwd: wtEntry.path,\n encoding: 'utf-8',\n });\n if (status.trim()) {\n throw new Error(`Worktree has uncommitted changes. Use --force to override.`);\n }\n }\n\n // Remove worktree\n const removeArgs = options.force\n ? ['worktree', 'remove', wtEntry.path, '--force']\n : ['worktree', 'remove', wtEntry.path];\n execFileSync('git', removeArgs, { encoding: 'utf-8' });\n\n // Delete branch: -d (safe) by default, -D (force) only with --force\n const branchFlag = options.force ? '-D' : '-d';\n execFileSync('git', ['branch', branchFlag, branch], { encoding: 'utf-8' });\n\n // Find and close Merge task\n let mergeTaskClosed = false;\n try {\n const raw = execFileSync('bd', ['show', epicId, '--json'], { encoding: 'utf-8' });\n const deps = parseBdShowDeps(raw);\n const mergeDep = deps.find(d => d.title.startsWith('Merge:'));\n if (mergeDep) {\n const mergeId = shortId(mergeDep.id);\n execFileSync('bd', ['close', mergeId], { encoding: 'utf-8' });\n mergeTaskClosed = true;\n }\n } catch {\n // bd operations may fail if epic not found — that's fine\n }\n\n return { removed: true, mergeTaskClosed };\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\nfunction handleError(err: unknown): void {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exitCode = 1;\n}\n\nfunction addCreateCommand(wt: Command): void {\n wt.command('create <epic-id>')\n .description('Create a new worktree for an epic')\n .action((epicId: string) => {\n try {\n const result = runWorktreeCreate(epicId);\n if (result.alreadyExists) {\n console.log(`Worktree already exists at ${result.worktreePath}`);\n return;\n }\n console.log(`Worktree created:`);\n console.log(` Path: ${result.worktreePath}`);\n console.log(` Branch: ${result.branch}`);\n console.log(` Merge task: ${result.mergeTaskId}`);\n } catch (err) { handleError(err); }\n });\n}\n\nfunction addWireDepsCommand(wt: Command): void {\n wt.command('wire-deps <epic-id>')\n .description('Wire Review/Compound tasks as merge dependencies')\n .action((epicId: string) => {\n try {\n const result = runWorktreeWireDeps(epicId);\n if (result.noMergeTask) {\n console.log('No worktree detected, working on main branch');\n return;\n }\n if (result.wired.length > 0) {\n console.log(`Wired dependencies: ${result.wired.join(', ')}`);\n }\n for (const w of result.warnings) {\n console.log(`Warning: ${w}`);\n }\n } catch (err) { handleError(err); }\n });\n}\n\nfunction addMergeCommand(wt: Command): void {\n wt.command('merge <epic-id>')\n .description('Merge worktree branch back to main')\n .action((epicId: string) => {\n try {\n const result = runWorktreeMerge(epicId);\n console.log(`Merged epic/${epicId} to main`);\n console.log(` New lessons: ${result.newLessons}`);\n } catch (err) { handleError(err); }\n });\n}\n\nfunction addListCommand(wt: Command): void {\n wt.command('list')\n .description('List active worktrees')\n .action(() => {\n try {\n const entries = runWorktreeList();\n if (entries.length === 0) {\n console.log('No active worktrees.');\n return;\n }\n console.log('Epic ID | Path | Branch | Status');\n console.log('------------|-------------------------------|-----------------|-------');\n for (const e of entries) {\n console.log(`${e.epicId.padEnd(12)}| ${e.path.padEnd(30)}| ${e.branch.padEnd(16)}| ${e.status}`);\n }\n } catch (err) { handleError(err); }\n });\n}\n\nfunction addCleanupCommand(wt: Command): void {\n wt.command('cleanup <epic-id>')\n .description('Remove a worktree and clean up associated resources')\n .option('--force', 'Force removal even with uncommitted changes')\n .action((epicId: string, opts: { force?: boolean }) => {\n try {\n const result = runWorktreeCleanup(epicId, { force: opts.force });\n console.log(`Worktree removed for epic/${epicId}`);\n if (result.mergeTaskClosed) {\n console.log('Merge task closed.');\n }\n } catch (err) { handleError(err); }\n });\n}\n\nexport function registerWorktreeCommands(program: Command): void {\n const wt = program\n .command('worktree')\n .description('Manage git worktrees for parallel epic execution');\n\n addCreateCommand(wt);\n addWireDepsCommand(wt);\n addMergeCommand(wt);\n addListCommand(wt);\n addCleanupCommand(wt);\n}\n","/**\n * Capture commands: learn, capture, detect\n *\n * Commands for capturing lessons from various sources.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { detectAndPropose, parseInputFile } from '../memory/capture/index.js';\nimport type { DetectionResult } from '../memory/capture/index.js';\nimport { appendLesson, appendMemoryItem, generateId, MemoryItemTypeSchema, SeveritySchema } from '../memory/index.js';\nimport type { Lesson, MemoryItem, MemoryItemType, Severity } from '../memory/index.js';\n\nimport { formatError } from '../cli-error-format.js';\n\nimport { getGlobalOpts, out } from './shared.js';\n\n// ============================================================================\n// Capture Command Helpers\n// ============================================================================\n\n/** Options for capture command */\ninterface CaptureOptions {\n trigger?: string;\n insight?: string;\n input?: string;\n json?: boolean;\n yes?: boolean;\n}\n\n/** Options for learn command */\ninterface LearnOptions {\n trigger?: string;\n tags: string;\n severity?: string;\n yes?: boolean;\n citation?: string;\n citationCommit?: string;\n type: string;\n patternBad?: string;\n patternGood?: string;\n}\n\n/**\n * Create a lesson from explicit trigger and insight.\n */\nfunction createLessonFromFlags(trigger: string, insight: string, confirmed: boolean): Lesson {\n return {\n id: generateId(insight),\n type: 'lesson',\n trigger,\n insight,\n tags: [],\n source: 'manual',\n context: { tool: 'capture', intent: 'manual capture' },\n created: new Date().toISOString(),\n confirmed,\n supersedes: [],\n related: [],\n };\n}\n\n/**\n * Output lesson in JSON format for capture command.\n */\nfunction outputCaptureJson(lesson: Lesson, saved: boolean): void {\n console.log(JSON.stringify({\n id: lesson.id,\n trigger: lesson.trigger,\n insight: lesson.insight,\n type: lesson.type,\n saved,\n }));\n}\n\n/**\n * Output lesson preview in human-readable format.\n */\nfunction outputCapturePreview(lesson: Lesson): void {\n console.log('Lesson captured:');\n console.log(` ID: ${lesson.id}`);\n console.log(` Trigger: ${lesson.trigger}`);\n console.log(` Insight: ${lesson.insight}`);\n console.log(` Type: ${lesson.type}`);\n console.log(` Tags: ${lesson.tags.length > 0 ? lesson.tags.join(', ') : '(none)'}`);\n console.log('\\nTo save: run with --yes flag');\n}\n\n/**\n * Create lesson from input file detection result.\n */\nfunction createLessonFromInputFile(result: DetectionResult, confirmed: boolean): Lesson {\n return {\n id: generateId(result.proposedInsight),\n type: 'lesson',\n trigger: result.trigger,\n insight: result.proposedInsight,\n tags: [],\n source: result.source,\n context: { tool: 'capture', intent: 'auto-capture' },\n created: new Date().toISOString(),\n confirmed,\n supersedes: [],\n related: [],\n };\n}\n\n// ============================================================================\n// Command Action Handlers\n// ============================================================================\n\n/**\n * Handle the learn command action.\n */\nasync function handleLearn(cmd: Command, insight: string, options: LearnOptions): Promise<void> {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(cmd);\n\n // Validate --type\n const typeResult = MemoryItemTypeSchema.safeParse(options.type);\n if (!typeResult.success) {\n console.error(formatError('learn', 'INVALID_TYPE', `Invalid type: \"${options.type}\"`, 'Use --type lesson|solution|pattern|preference'));\n process.exitCode = 1;\n return;\n }\n const itemType: MemoryItemType = typeResult.data;\n\n // Validate pattern flags when type=pattern\n if (itemType === 'pattern' && (!options.patternBad || !options.patternGood)) {\n console.error(formatError('learn', 'MISSING_PATTERN', 'type=pattern requires --pattern-bad and --pattern-good', 'Use: learn \"insight\" --type pattern --pattern-bad \"old\" --pattern-good \"new\"'));\n process.exitCode = 1;\n return;\n }\n\n // Validate severity if provided\n let severity: Severity | undefined;\n if (options.severity !== undefined) {\n const result = SeveritySchema.safeParse(options.severity);\n if (!result.success) {\n console.error(formatError('learn', 'INVALID_SEVERITY', `Invalid severity: \"${options.severity}\"`, 'Use --severity high|medium|low'));\n process.exitCode = 1;\n return;\n }\n severity = result.data;\n }\n\n // Parse citation if provided\n let citation: { file: string; line?: number; commit?: string } | undefined;\n if (options.citation) {\n const parts = options.citation.split(':');\n const file = parts[0] ?? '';\n const lineStr = parts[1];\n const line = lineStr ? parseInt(lineStr, 10) : undefined;\n citation = {\n file,\n ...(line && !isNaN(line) && { line }),\n ...(options.citationCommit && { commit: options.citationCommit }),\n };\n }\n\n // Build pattern if provided\n const pattern = options.patternBad && options.patternGood\n ? { bad: options.patternBad, good: options.patternGood }\n : undefined;\n\n const item: MemoryItem = {\n id: generateId(insight, itemType),\n type: itemType,\n trigger: options.trigger ?? 'Manual capture',\n insight,\n tags: options.tags ? options.tags.split(',').map((t) => t.trim()) : [],\n source: 'manual',\n context: { tool: 'cli', intent: 'manual learning' },\n created: new Date().toISOString(),\n confirmed: true,\n supersedes: [],\n related: [],\n ...(severity !== undefined && { severity }),\n ...(citation && { citation }),\n ...(pattern && { pattern }),\n } as MemoryItem;\n\n await appendMemoryItem(repoRoot, item);\n\n const verb = itemType === 'lesson' ? 'Learned' : 'Captured';\n const chalk = await import('chalk');\n out.success(`${verb}: ${insight}`);\n if (!quiet) {\n console.log(`ID: ${chalk.default.dim(item.id)}`);\n if (itemType !== 'lesson') {\n console.log(`Type: ${chalk.default.dim(itemType)}`);\n }\n if (citation) {\n console.log(`Citation: ${chalk.default.dim(citation.file)}${citation.line ? `:${citation.line}` : ''}`);\n }\n }\n}\n\n/**\n * Handle the detect command action.\n */\nasync function handleDetect(options: { input: string; save?: boolean; yes?: boolean; json?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n\n if (options.save && !options.yes) {\n if (options.json) {\n console.log(JSON.stringify({ error: '--save requires --yes flag for confirmation' }));\n } else {\n console.error(formatError('detect', 'MISSING_FLAG', '--save requires --yes', 'Use: detect --input <file> --save --yes'));\n }\n process.exitCode = 1;\n return;\n }\n\n let input;\n try {\n input = await parseInputFile(options.input);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to parse input file';\n if (options.json) {\n console.log(JSON.stringify({ error: message, detected: false }));\n } else {\n console.error(formatError('detect', 'INVALID_INPUT', message, 'Check the file is valid JSON matching the expected schema'));\n }\n process.exitCode = 1;\n return;\n }\n const result = await detectAndPropose(repoRoot, input);\n\n if (!result) {\n if (options.json) {\n console.log(JSON.stringify({ detected: false }));\n } else {\n console.log('No learning trigger detected.');\n }\n return;\n }\n\n if (options.json) {\n console.log(JSON.stringify({ detected: true, ...result }));\n return;\n }\n\n console.log('Learning trigger detected!');\n console.log(` Trigger: ${result.trigger}`);\n console.log(` Source: ${result.source}`);\n console.log(` Proposed: ${result.proposedInsight}`);\n\n if (options.save && options.yes) {\n const lesson: Lesson = {\n id: generateId(result.proposedInsight),\n type: 'lesson',\n trigger: result.trigger,\n insight: result.proposedInsight,\n tags: [],\n source: result.source,\n context: { tool: 'detect', intent: 'auto-capture' },\n created: new Date().toISOString(),\n confirmed: true,\n supersedes: [],\n related: [],\n };\n\n await appendLesson(repoRoot, lesson);\n console.log(`\\nSaved as lesson: ${lesson.id}`);\n }\n}\n\n/**\n * Handle the capture command action.\n */\nasync function handleCapture(cmd: Command, options: CaptureOptions): Promise<void> {\n const repoRoot = getRepoRoot();\n const { verbose } = getGlobalOpts(cmd);\n let lesson: Lesson | undefined;\n\n if (options.input) {\n let input;\n try {\n input = await parseInputFile(options.input);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to parse input file';\n if (options.json) {\n console.log(JSON.stringify({ error: message, saved: false }));\n } else {\n console.error(formatError('capture', 'INVALID_INPUT', message, 'Check the file is valid JSON matching the expected schema'));\n }\n process.exitCode = 1;\n return;\n }\n const result = await detectAndPropose(repoRoot, input);\n if (!result) {\n if (options.json) {\n console.log(JSON.stringify({ detected: false, saved: false }));\n } else {\n console.log('No learning trigger detected.');\n }\n return;\n }\n lesson = createLessonFromInputFile(result, options.yes ?? false);\n } else if (options.trigger && options.insight) {\n lesson = createLessonFromFlags(options.trigger, options.insight, options.yes ?? false);\n } else {\n const msg = 'Provide either --trigger and --insight, or --input file.';\n if (options.json) {\n console.log(JSON.stringify({ error: msg, saved: false }));\n } else {\n console.error(formatError('capture', 'MISSING_OPTIONS', msg, 'Provide --trigger and --insight, or --input'));\n }\n process.exitCode = 1;\n return;\n }\n\n if (!options.yes && !process.stdin.isTTY) {\n if (options.json) {\n console.log(JSON.stringify({ error: '--yes required in non-interactive mode', saved: false }));\n } else {\n console.error(formatError('capture', 'NON_INTERACTIVE', '--yes required in non-interactive mode', 'Use: capture --trigger \"...\" --insight \"...\" --yes'));\n }\n process.exitCode = 1;\n return;\n }\n\n if (options.json) {\n if (options.yes) await appendLesson(repoRoot, lesson);\n outputCaptureJson(lesson, options.yes ?? false);\n } else if (options.yes) {\n await appendLesson(repoRoot, lesson);\n out.success(`Lesson saved: ${lesson.id}`);\n if (verbose) console.log(` Type: ${lesson.type} | Trigger: ${lesson.trigger}`);\n } else {\n outputCapturePreview(lesson);\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register capture commands (learn, capture, detect) on the program.\n */\nexport function registerCaptureCommands(program: Command): void {\n program\n .command('learn <insight>')\n .description('Capture a new memory item (lesson, solution, pattern, or preference)')\n .option('-t, --trigger <text>', 'What triggered this lesson')\n .option('--tags <tags>', 'Comma-separated tags', '')\n .option('-s, --severity <level>', 'Lesson severity: high, medium, low')\n .option('-y, --yes', 'Skip confirmation')\n .option('--citation <file:line>', 'Source file (optionally with :line number)')\n .option('--citation-commit <hash>', 'Git commit hash for citation')\n .option('--type <type>', 'Memory item type: lesson, solution, pattern, preference', 'lesson')\n .option('--pattern-bad <code>', 'Bad pattern example (required when --type pattern)')\n .option('--pattern-good <code>', 'Good pattern example (required when --type pattern)')\n .action(async function (this: Command, insight: string, options: LearnOptions) {\n await handleLearn(this, insight, options);\n });\n\n program\n .command('detect')\n .description('Detect learning triggers from input')\n .requiredOption('--input <file>', 'Path to JSON input file')\n .option('--save', 'Save proposed lesson (requires --yes)')\n .option('-y, --yes', 'Confirm save (required with --save)')\n .option('--json', 'Output result as JSON')\n .action(async (options: { input: string; save?: boolean; yes?: boolean; json?: boolean }) => {\n await handleDetect(options);\n });\n\n program\n .command('capture')\n .description('Capture a lesson from trigger/insight or input file')\n .option('-t, --trigger <text>', 'What triggered this lesson')\n .option('-i, --insight <text>', 'The insight or lesson learned')\n .option('--input <file>', 'Path to JSON input file (alternative to trigger/insight)')\n .option('--json', 'Output result as JSON')\n .option('-y, --yes', 'Skip confirmation and save immediately')\n .action(async function (this: Command, options: CaptureOptions) {\n await handleCapture(this, options);\n });\n}\n","/**\n * Loop command: generate infinity loop script for autonomous epic processing.\n *\n * Generates a bash script that iterates over beads epics,\n * spawning Claude Code sessions to implement each one.\n */\n\nimport { existsSync } from 'node:fs';\nimport { chmod, mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\n\nimport type { Command } from 'commander';\n\nimport { out } from './shared.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Safe pattern for epic IDs: alphanumeric, hyphens, underscores, dots */\nconst EPIC_ID_PATTERN = /^[a-zA-Z0-9_.-]+$/;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LoopScriptOptions {\n epics?: string[];\n maxRetries: number;\n model: string;\n}\n\ninterface LoopOptions {\n epics?: string[];\n output?: string;\n maxRetries?: string;\n model?: string;\n force?: boolean;\n}\n\n// ============================================================================\n// Script Generation\n// ============================================================================\n\nfunction buildScriptHeader(timestamp: string, maxRetries: number, model: string, epicIds: string): string {\n return `#!/usr/bin/env bash\n# Infinity Loop - Generated by: ca loop\n# Date: ${timestamp}\n# Autonomously processes beads epics via Claude Code sessions.\n#\n# Usage:\n# ./infinity-loop.sh\n# LOOP_DRY_RUN=1 ./infinity-loop.sh # Preview without executing\n\nset -euo pipefail\n\n# Config\nMAX_RETRIES=${maxRetries}\nMODEL=\"${model}\"\nEPIC_IDS=\"${epicIds}\"\nLOG_DIR=\"agent_logs\"\n\n# Helpers\ntimestamp() { date '+%Y-%m-%d_%H-%M-%S'; }\nlog() { echo \"[$(timestamp)] $*\"; }\ndie() { log \"FATAL: $*\"; exit 1; }\n\ncommand -v claude >/dev/null || die \"claude CLI required\"\ncommand -v bd >/dev/null || die \"bd (beads) CLI required\"\n\n# Detect JSON parser: prefer jq, fall back to python3\nHAS_JQ=false\ncommand -v jq >/dev/null 2>&1 && HAS_JQ=true\nif [ \"$HAS_JQ\" = false ]; then\n command -v python3 >/dev/null 2>&1 || die \"jq or python3 required for JSON parsing\"\nfi\n\n# parse_json() - extract a value from JSON stdin\n# Uses jq (primary) with python3 fallback\n# Usage: echo '{\"status\":\"open\"}' | parse_json '.status'\nparse_json() {\n local filter=\"$1\"\n if [ \"$HAS_JQ\" = true ]; then\n jq -r \"$filter\"\n else\n python3 -c \"\nimport sys, json\ndata = json.load(sys.stdin)\nf = '$filter'.strip('.')\nparts = [p for p in f.split('.') if p]\nv = data\nfor p in parts:\n v = v[p]\nprint(v)\n\"\n fi\n}\n\nmkdir -p \"$LOG_DIR\"\n` + buildEpicSelector() + buildPromptFunction();\n}\n\nfunction buildEpicSelector(): string {\n return `\nget_next_epic() {\n if [ -n \"$EPIC_IDS\" ]; then\n # From explicit list, find first still-open epic not yet processed\n for epic_id in $EPIC_IDS; do\n case \" $PROCESSED \" in *\" $epic_id \"*) continue ;; esac\n local status\n status=$(bd show \"$epic_id\" --json 2>/dev/null | parse_json '.status' 2>/dev/null || echo \"\")\n if [ \"$status\" = \"open\" ]; then\n echo \"$epic_id\"\n return 0\n fi\n done\n return 1\n else\n # Dynamic: get next ready epic from dependency graph, filtering processed\n local epic_id\n if [ \"$HAS_JQ\" = true ]; then\n epic_id=$(bd list --type=epic --ready --json --limit=10 2>/dev/null | jq -r '.[].id' 2>/dev/null | while read -r id; do\n case \" $PROCESSED \" in *\" $id \"*) continue ;; esac\n echo \"$id\"\n break\n done)\n else\n epic_id=$(bd list --type=epic --ready --json --limit=10 2>/dev/null | python3 -c \"\nimport sys, json\nprocessed = set('$PROCESSED'.split())\nitems = json.load(sys.stdin)\nfor item in items:\n if item['id'] not in processed:\n print(item['id'])\n break\" 2>/dev/null || echo \"\")\n fi\n if [ -z \"$epic_id\" ]; then\n return 1\n fi\n echo \"$epic_id\"\n return 0\n fi\n}\n`;\n}\n\nfunction buildPromptFunction(): string {\n return `\nbuild_prompt() {\n local epic_id=\"$1\"\n cat <<'PROMPT_HEADER'\nYou are running in an autonomous infinity loop. Your task is to fully implement a beads epic.\n\n## Step 1: Load context\nRun these commands to prime your session:\nPROMPT_HEADER\n cat <<PROMPT_BODY\n\\\\\\`\\\\\\`\\\\\\`bash\nnpx ca load-session\nbd show $epic_id\n\\\\\\`\\\\\\`\\\\\\`\n\nRead the epic details carefully. Understand scope, acceptance criteria, and sub-tasks.\n\n## Step 2: Execute the workflow\nRun the full compound workflow for this epic, starting from the plan phase\n(brainstorm is already done -- the epic exists):\n\n/compound:lfg from plan -- Epic: $epic_id\n\nWork through all phases: plan, work, review, compound.\n\n## Step 3: On completion\nWhen all work is done and tests pass:\n1. Close the epic: \\`bd close $epic_id\\`\n2. Sync beads: \\`bd sync\\`\n3. Commit and push all changes\n4. Output this exact marker on its own line:\n\nEPIC_COMPLETE\n\n## Step 4: On failure\nIf you cannot complete the epic after reasonable effort:\n1. Add a note: \\`bd update $epic_id --notes \"Loop failed: <reason>\"\\`\n2. Output this exact marker on its own line:\n\nEPIC_FAILED\n\n## Step 5: On human required\nIf you hit a blocker that REQUIRES human action (account creation, API keys,\nexternal service setup, design decisions you cannot make, etc.):\n1. Add a note: \\`bd update $epic_id --notes \"Human required: <reason>\"\\`\n2. Output this exact marker followed by a short reason on the SAME line:\n\nHUMAN_REQUIRED: <reason>\n\nExample: HUMAN_REQUIRED: Need AWS credentials configured in .env\n\n## Rules\n- Do NOT ask questions -- there is no human. Make reasonable decisions.\n- Do NOT stop early -- complete the full workflow.\n- If tests fail, fix them. Retry up to 3 times before declaring failure.\n- Use HUMAN_REQUIRED only for true blockers that no amount of retrying can solve.\n- Commit incrementally as you make progress.\nPROMPT_BODY\n}`;\n}\n\nfunction buildMainLoop(): string {\n return `\n# Main loop\nCOMPLETED=0\nFAILED=0\nSKIPPED=0\nPROCESSED=\"\"\n\nlog \"Infinity loop starting\"\nlog \"Config: max_retries=$MAX_RETRIES model=$MODEL\"\n[ -n \"$EPIC_IDS\" ] && log \"Targeting epics: $EPIC_IDS\" || log \"Targeting: all ready epics\"\n\nwhile true; do\n EPIC_ID=$(get_next_epic) || break\n\n log \"Processing epic: $EPIC_ID\"\n\n ATTEMPT=0\n SUCCESS=false\n\n while [ $ATTEMPT -le $MAX_RETRIES ]; do\n ATTEMPT=$((ATTEMPT + 1))\n LOGFILE=\"$LOG_DIR/loop_$EPIC_ID-$(timestamp).log\"\n\n log \"Attempt $ATTEMPT/$((MAX_RETRIES + 1)) for $EPIC_ID (log: $LOGFILE)\"\n\n if [ -n \"\\${LOOP_DRY_RUN:-}\" ]; then\n log \"[DRY RUN] Would run claude session for $EPIC_ID\"\n SUCCESS=true\n break\n fi\n\n PROMPT=$(build_prompt \"$EPIC_ID\")\n\n claude --dangerously-skip-permissions \\\\\n --model \"$MODEL\" \\\\\n -p \"$PROMPT\" \\\\\n &> \"$LOGFILE\" || true\n\n if grep -q \"EPIC_COMPLETE\" \"$LOGFILE\"; then\n log \"Epic $EPIC_ID completed successfully\"\n SUCCESS=true\n break\n elif grep -q \"HUMAN_REQUIRED\" \"$LOGFILE\"; then\n REASON=$(grep \"HUMAN_REQUIRED:\" \"$LOGFILE\" | head -1 | sed 's/.*HUMAN_REQUIRED: *//')\n log \"Epic $EPIC_ID needs human action: $REASON\"\n bd update \"$EPIC_ID\" --notes \"Human required: $REASON\" 2>/dev/null || true\n SKIPPED=$((SKIPPED + 1))\n SUCCESS=skip\n break\n elif grep -q \"EPIC_FAILED\" \"$LOGFILE\"; then\n log \"Epic $EPIC_ID reported failure (attempt $ATTEMPT)\"\n else\n log \"Epic $EPIC_ID session ended without marker (attempt $ATTEMPT)\"\n fi\n\n if [ $ATTEMPT -le $MAX_RETRIES ]; then\n log \"Retrying $EPIC_ID...\"\n sleep 5\n fi\n done\n\n if [ \"$SUCCESS\" = true ]; then\n COMPLETED=$((COMPLETED + 1))\n log \"Epic $EPIC_ID done. Completed so far: $COMPLETED\"\n elif [ \"$SUCCESS\" = skip ]; then\n log \"Epic $EPIC_ID skipped (human required). Continuing.\"\n else\n FAILED=$((FAILED + 1))\n log \"Epic $EPIC_ID failed after $((MAX_RETRIES + 1)) attempts. Stopping loop.\"\n PROCESSED=\"$PROCESSED $EPIC_ID\"\n break\n fi\n\n PROCESSED=\"$PROCESSED $EPIC_ID\"\ndone\n\nlog \"Loop finished. Completed: $COMPLETED, Failed: $FAILED, Skipped: $SKIPPED\"\n[ $FAILED -eq 0 ] && exit 0 || exit 1`;\n}\n\n/**\n * Validate loop script options before generation.\n */\nfunction validateOptions(options: LoopScriptOptions): void {\n if (!Number.isInteger(options.maxRetries) || options.maxRetries < 0) {\n throw new Error(`Invalid maxRetries: must be a non-negative integer, got ${options.maxRetries}`);\n }\n if (options.epics) {\n for (const id of options.epics) {\n if (!EPIC_ID_PATTERN.test(id)) {\n throw new Error(`Invalid epic ID \"${id}\": must match ${EPIC_ID_PATTERN}`);\n }\n }\n }\n}\n\n/**\n * Generate a bash script that autonomously processes beads epics.\n */\nexport function generateLoopScript(options: LoopScriptOptions): string {\n validateOptions(options);\n\n const epicIds = options.epics?.join(' ') ?? '';\n const timestamp = new Date().toISOString();\n\n return buildScriptHeader(timestamp, options.maxRetries, options.model, epicIds)\n + buildMainLoop();\n}\n\n// ============================================================================\n// Command Handler\n// ============================================================================\n\nasync function handleLoop(cmd: Command, options: LoopOptions): Promise<void> {\n // Suppress unused parameter warning -- cmd reserved for future use\n void cmd;\n\n const outputPath = resolve(options.output ?? './infinity-loop.sh');\n\n if (existsSync(outputPath) && !options.force) {\n out.error(`File already exists: ${outputPath}`);\n out.info('Use --force to overwrite');\n process.exitCode = 1;\n return;\n }\n\n const maxRetries = Number(options.maxRetries ?? 1);\n if (!Number.isInteger(maxRetries) || maxRetries < 0) {\n out.error(`Invalid --max-retries: must be a non-negative integer, got \"${options.maxRetries}\"`);\n process.exitCode = 1;\n return;\n }\n\n let script: string;\n try {\n script = generateLoopScript({\n epics: options.epics,\n maxRetries,\n model: options.model ?? 'claude-opus-4-6',\n });\n } catch (err) {\n out.error((err as Error).message);\n process.exitCode = 1;\n return;\n }\n\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, script, 'utf-8');\n await chmod(outputPath, 0o755);\n\n out.success(`Generated infinity loop script: ${outputPath}`);\n out.info('Run it with: ' + outputPath);\n out.info('Preview with: LOOP_DRY_RUN=1 ' + outputPath);\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register loop commands on the program.\n */\nexport function registerLoopCommands(program: Command): void {\n program\n .command('loop')\n .description('Generate infinity loop script for epic tasks')\n .option('--epics <ids...>', 'Specific epic IDs to process')\n .option('-o, --output <path>', 'Output script path', './infinity-loop.sh')\n .option('--max-retries <n>', 'Max retries per epic on failure', '1')\n .option('--model <model>', 'Claude model to use', 'claude-opus-4-6')\n .option('--force', 'Overwrite existing script')\n .action(async function (this: Command, options: LoopOptions) {\n await handleLoop(this, options);\n });\n}\n","/**\n * Retrieval commands: search, list, check-plan, load-session\n *\n * Commands for searching and retrieving lessons.\n */\n\nimport chalk from 'chalk';\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseLimit } from '../cli-utils.js';\nimport { isModelUsable, loadSessionLessons, retrieveForPlan } from '../index.js';\nimport { incrementRetrievalCount, readLessons, readMemoryItems, searchKeyword, syncIfNeeded } from '../memory/storage/index.js';\nimport type { MemoryItem } from '../memory/index.js';\n\nimport { formatError } from '../cli-error-format.js';\n\nimport {\n AGE_FLAG_THRESHOLD_DAYS,\n DEFAULT_CHECK_PLAN_LIMIT,\n DEFAULT_LIST_LIMIT,\n DEFAULT_SEARCH_LIMIT,\n getGlobalOpts,\n getLessonAgeDays,\n ISO_DATE_PREFIX_LENGTH,\n LESSON_COUNT_WARNING_THRESHOLD,\n out,\n} from './shared.js';\n\nimport type { RankedLesson } from '../memory/search/index.js';\n\n/**\n * Parse numeric limit with user-friendly error output on invalid input.\n * Returns null on failure so callers can set exitCode and return.\n */\nfunction parseLimitOrNull(rawLimit: string, optionName: string, commandName: string): number | null {\n try {\n return parseLimit(rawLimit, optionName);\n } catch (err) {\n const message = err instanceof Error ? err.message : `Invalid ${optionName}`;\n console.error(formatError(commandName, 'INVALID_LIMIT', message, `Use --${optionName} with a positive integer`));\n return null;\n }\n}\n\n// ============================================================================\n// Check-Plan Command Helpers\n// ============================================================================\n\n/**\n * Read plan text from stdin (non-TTY mode).\n */\nasync function readPlanFromStdin(): Promise<string | undefined> {\n const { stdin } = await import('node:process');\n if (!stdin.isTTY) {\n const chunks: Buffer[] = [];\n for await (const chunk of stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString('utf-8').trim();\n }\n return undefined;\n}\n\n/**\n * Output check-plan results in JSON format.\n *\n * Uses rankScore (final boosted score) instead of raw similarity.\n */\nfunction outputCheckPlanJson(lessons: RankedLesson[]): void {\n const jsonOutput = {\n lessons: lessons.map((l) => ({\n id: l.lesson.id,\n insight: l.lesson.insight,\n rankScore: l.finalScore ?? l.score, // Use finalScore if available, fallback to raw score\n source: l.lesson.source,\n })),\n count: lessons.length,\n };\n console.log(JSON.stringify(jsonOutput));\n}\n\n/**\n * Output check-plan results in human-readable format.\n *\n * Omits numeric scores - ordering is sufficient for human consumption.\n */\nfunction outputCheckPlanHuman(lessons: RankedLesson[], quiet: boolean): void {\n console.log('## Lessons Check\\n');\n console.log('Relevant to your plan:\\n');\n\n lessons.forEach((item, i) => {\n const num = i + 1;\n console.log(`${num}. ${chalk.bold(`[${item.lesson.id}]`)} ${item.lesson.insight}`);\n console.log(` - Source: ${item.lesson.source}`);\n console.log();\n });\n\n if (!quiet) {\n console.log('---');\n console.log('Consider these lessons while implementing.');\n }\n}\n\n// ============================================================================\n// Load-Session Command Helpers\n// ============================================================================\n\n/**\n * Format source string for human-readable display.\n * Converts snake_case to space-separated words.\n */\nfunction formatSource(source: string): string {\n return source.replace(/_/g, ' ');\n}\n\n/**\n * Output load-session results in human-readable format.\n * Optimized for Claude's context window - no IDs, clear structure.\n */\nfunction outputSessionLessonsHuman(lessons: MemoryItem[], quiet: boolean): void {\n console.log('## Lessons from Past Sessions\\n');\n console.log('These lessons were captured from previous corrections and should inform your work:\\n');\n\n lessons.forEach((lesson, i) => {\n const num = i + 1;\n const date = lesson.created.slice(0, ISO_DATE_PREFIX_LENGTH);\n const tagsDisplay = lesson.tags.length > 0 ? ` (${lesson.tags.join(', ')})` : '';\n\n console.log(`${num}. **${lesson.insight}**${tagsDisplay}`);\n console.log(` Learned: ${date} via ${formatSource(lesson.source)}`);\n console.log();\n });\n\n if (!quiet) {\n console.log('Consider these lessons when planning and implementing tasks.');\n }\n}\n\n// ============================================================================\n// Action Handlers\n// ============================================================================\n\nasync function searchAction(cmd: Command, query: string, options: { limit: string }): Promise<void> {\n const repoRoot = getRepoRoot();\n const limit = parseLimitOrNull(options.limit, 'limit', 'search');\n if (limit === null) {\n process.exitCode = 1;\n return;\n }\n const { verbose, quiet } = getGlobalOpts(cmd);\n\n await syncIfNeeded(repoRoot);\n\n let results;\n try {\n results = await searchKeyword(repoRoot, query, limit);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Search failed';\n console.error(formatError('search', 'SEARCH_FAILED', message, 'Check your query syntax'));\n process.exitCode = 1;\n return;\n }\n if (results.length > 0) {\n incrementRetrievalCount(repoRoot, results.map((lesson) => lesson.id));\n }\n\n if (results.length === 0) {\n console.log('No lessons match your search. Try a different query or use \"list\" to see all lessons.');\n return;\n }\n\n if (!quiet) {\n out.info(`Found ${results.length} lesson(s):\\n`);\n }\n for (const lesson of results) {\n console.log(`[${chalk.cyan(lesson.id)}] ${lesson.insight}`);\n console.log(` Trigger: ${lesson.trigger}`);\n if (verbose && lesson.context) {\n console.log(` Context: ${lesson.context.tool} - ${lesson.context.intent}`);\n console.log(` Created: ${lesson.created}`);\n }\n if (lesson.tags.length > 0) {\n console.log(` Tags: ${lesson.tags.join(', ')}`);\n }\n console.log();\n }\n}\n\nasync function listAction(cmd: Command, options: { limit: string; invalidated?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n const limit = parseLimitOrNull(options.limit, 'limit', 'list');\n if (limit === null) {\n process.exitCode = 1;\n return;\n }\n const { verbose, quiet } = getGlobalOpts(cmd);\n\n const { items, skippedCount } = await readMemoryItems(repoRoot);\n\n const filteredItems = options.invalidated\n ? items.filter((i) => i.invalidatedAt)\n : items;\n\n if (filteredItems.length === 0) {\n if (options.invalidated) {\n console.log('No invalidated lessons found.');\n } else {\n console.log('No lessons found. Get started with: learn \"Your first lesson\"');\n }\n if (skippedCount > 0) {\n out.warn(`${skippedCount} corrupted lesson(s) skipped.`);\n }\n return;\n }\n\n const toShow = filteredItems.slice(0, limit);\n\n if (!quiet) {\n const label = options.invalidated ? 'invalidated lesson(s)' : 'item(s)';\n out.info(`Showing ${toShow.length} of ${filteredItems.length} ${label}:\\n`);\n }\n\n for (const item of toShow) {\n const invalidMarker = item.invalidatedAt ? chalk.red('[INVALID] ') : '';\n console.log(`[${chalk.cyan(item.id)}] ${invalidMarker}${item.insight}`);\n if (verbose) {\n console.log(` Type: ${item.type} | Source: ${item.source}`);\n console.log(` Created: ${item.created}`);\n if (item.context) {\n console.log(` Context: ${item.context.tool} - ${item.context.intent}`);\n }\n if (item.invalidatedAt) {\n console.log(` Invalidated: ${item.invalidatedAt}`);\n if (item.invalidationReason) {\n console.log(` Reason: ${item.invalidationReason}`);\n }\n }\n } else {\n console.log(` Type: ${item.type} | Source: ${item.source}`);\n }\n if (item.tags.length > 0) {\n console.log(` Tags: ${item.tags.join(', ')}`);\n }\n console.log();\n }\n\n if (skippedCount > 0) {\n out.warn(`${skippedCount} corrupted lesson(s) skipped.`);\n }\n}\n\nasync function loadSessionAction(cmd: Command, options: { json?: boolean }): Promise<void> {\n const repoRoot = getRepoRoot();\n const { quiet } = getGlobalOpts(cmd);\n const lessons = await loadSessionLessons(repoRoot);\n\n const { lessons: allLessons } = await readLessons(repoRoot);\n const totalCount = allLessons.length;\n\n if (options.json) {\n console.log(JSON.stringify({ lessons, count: lessons.length, totalCount }));\n return;\n }\n\n if (lessons.length === 0) {\n console.log('No high-severity lessons found.');\n return;\n }\n\n outputSessionLessonsHuman(lessons, quiet);\n\n if (totalCount > LESSON_COUNT_WARNING_THRESHOLD) {\n console.log('');\n out.info(`${totalCount} lessons in index. Consider \\`ca compact\\` to reduce context pollution.`);\n }\n\n const oldLessons = lessons.filter((l) => getLessonAgeDays(l) > AGE_FLAG_THRESHOLD_DAYS);\n if (oldLessons.length > 0) {\n console.log('');\n out.warn(`${oldLessons.length} lesson(s) are over ${AGE_FLAG_THRESHOLD_DAYS} days old. Review for continued validity.`);\n }\n}\n\nasync function checkPlanAction(cmd: Command, options: { plan?: string; json?: boolean; limit: string }): Promise<void> {\n const repoRoot = getRepoRoot();\n const limit = parseLimitOrNull(options.limit, 'limit', 'check-plan');\n if (limit === null) {\n process.exitCode = 1;\n return;\n }\n const { quiet } = getGlobalOpts(cmd);\n\n const planText = options.plan ?? (await readPlanFromStdin());\n\n if (!planText) {\n console.error(formatError('check-plan', 'NO_PLAN', 'No plan provided', 'Use --plan <text> or pipe text to stdin'));\n process.exitCode = 1;\n return;\n }\n\n const usability = await isModelUsable();\n if (!usability.usable) {\n if (options.json) {\n console.log(JSON.stringify({\n lessons: [],\n count: 0,\n error: usability.reason,\n action: usability.action,\n }));\n } else {\n console.error(formatError('check-plan', 'MODEL_UNAVAILABLE', usability.reason, usability.action));\n }\n process.exitCode = 1;\n return;\n }\n\n try {\n const result = await retrieveForPlan(repoRoot, planText, limit);\n\n if (options.json) {\n outputCheckPlanJson(result.lessons);\n return;\n }\n\n if (result.lessons.length === 0) {\n console.log('No relevant lessons found for this plan.');\n return;\n }\n\n outputCheckPlanHuman(result.lessons, quiet);\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n if (options.json) {\n console.log(JSON.stringify({\n lessons: [],\n count: 0,\n error: message,\n }));\n } else {\n console.error(formatError('check-plan', 'PLAN_CHECK_FAILED', message, 'Check model installation and try again'));\n }\n process.exitCode = 1;\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register retrieval commands (search, list, check-plan, load-session) on the program.\n */\nexport function registerRetrievalCommands(program: Command): void {\n program\n .command('search <query>')\n .description('Search lessons by keyword')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_SEARCH_LIMIT)\n .action(async function (this: Command, query: string, options: { limit: string }) {\n await searchAction(this, query, options);\n });\n\n program\n .command('list')\n .description('List all lessons')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_LIST_LIMIT)\n .option('--invalidated', 'Show only invalidated lessons')\n .action(async function (this: Command, options: { limit: string; invalidated?: boolean }) {\n await listAction(this, options);\n });\n\n program\n .command('load-session')\n .description('Load high-severity lessons for session context')\n .option('--json', 'Output as JSON')\n .action(async function (this: Command, options: { json?: boolean }) {\n await loadSessionAction(this, options);\n });\n\n program\n .command('check-plan')\n .description('Check plan against relevant lessons')\n .option('--plan <text>', 'Plan text to check')\n .option('--json', 'Output as JSON')\n .option('-n, --limit <number>', 'Maximum results', DEFAULT_CHECK_PLAN_LIMIT)\n .action(async function (this: Command, options: { plan?: string; json?: boolean; limit: string }) {\n await checkPlanAction(this, options);\n });\n}\n","/**\n * Command modules for CLI.\n *\n * Each module exports a registration function that adds commands to the program.\n */\n\nimport type { Command } from 'commander';\n\nimport {\n registerClaudeSubcommand,\n registerDownloadModelCommand,\n registerHooksCommand,\n registerInitCommand,\n registerSetupAllCommand,\n} from '../setup/index.js';\n\nimport { registerCrudCommands } from './management-crud.js';\nimport { registerDoctorCommand } from './doctor.js';\nimport { registerInvalidationCommands } from './management-invalidation.js';\nimport { registerIOCommands } from './management-io.js';\nimport { registerMaintenanceCommands } from './management-maintenance.js';\nimport { registerPrimeCommand } from './management-prime.js';\nimport { registerAuditCommands } from './audit.js';\nimport { registerReviewerCommand } from './reviewer.js';\nimport { registerRulesCommands } from './rules.js';\nimport { registerTestSummaryCommand } from './test-summary.js';\nimport { registerVerifyGatesCommand } from './verify-gates.js';\nimport { registerAboutCommand } from './about.js';\nimport { registerWorktreeCommands } from './worktree.js';\n\nexport { registerCaptureCommands } from './capture.js';\nexport { registerLoopCommands } from './loop.js';\nexport { expectedGateForPhase, getPhaseState, registerPhaseCheckCommand, updatePhaseState } from './phase-check.js';\nexport { registerRetrievalCommands } from './retrieval.js';\n\n// Re-export types and helpers from management modules\nexport { formatLessonHuman, wasLessonDeleted } from './management-helpers.js';\nexport { getPrimeContext } from './management-prime.js';\n\n// Re-export shared utilities for use by cli.ts\nexport { getGlobalOpts, out } from './shared.js';\nexport type { GlobalOpts } from './shared.js';\n\n/**\n * Register all setup commands on the program.\n */\nexport function registerSetupCommands(program: Command): void {\n registerInitCommand(program);\n registerHooksCommand(program);\n\n // Create the main setup command. The \"all\" action is registered as the\n // default subcommand so its options (--uninstall, --dry-run) don't\n // conflict with identically-named options on the \"claude\" subcommand.\n const setupCommand = program.command('setup');\n registerSetupAllCommand(setupCommand);\n\n // Add subcommands to setup\n registerClaudeSubcommand(setupCommand);\n\n registerDownloadModelCommand(program);\n}\n\n/**\n * Register all management commands on the program.\n */\nexport function registerManagementCommands(program: Command): void {\n registerInvalidationCommands(program);\n registerMaintenanceCommands(program);\n registerIOCommands(program);\n registerPrimeCommand(program);\n registerCrudCommands(program);\n registerAuditCommands(program);\n registerDoctorCommand(program);\n registerReviewerCommand(program);\n registerRulesCommands(program);\n registerTestSummaryCommand(program);\n registerVerifyGatesCommand(program);\n registerAboutCommand(program);\n registerWorktreeCommands(program);\n}\n","#!/usr/bin/env node\n/**\n * Compound Agent CLI\n *\n * Semantically-intelligent workflow plugin for Claude Code.\n *\n * Commands:\n * Capture: learn, capture, detect\n * Retrieval: search, list, check-plan, load-session\n * Management: wrong, validate, compact, stats, rebuild, export, import, show, update, delete\n * Setup: init, setup claude, hooks, download-model\n * Reviewer: reviewer enable, reviewer disable, reviewer list\n * Loop: loop\n * Health: doctor\n */\n\nimport { Command } from 'commander';\n\nimport { registerCompoundCommands } from './commands/compound.js';\nimport {\n registerCaptureCommands,\n registerLoopCommands,\n registerManagementCommands,\n registerPhaseCheckCommand,\n registerRetrievalCommands,\n registerSetupCommands,\n} from './commands/index.js';\nimport { VERSION } from './version.js';\nimport { closeDb } from './memory/storage/index.js';\n\n// ============================================================================\n// Resource Cleanup\n// ============================================================================\n\n/**\n * Cleanup function to release database resources.\n * Safe to call even if database was never opened.\n *\n * Note: We only close the SQLite database here. The embedding model\n * (node-llama-cpp) handles its own cleanup and calling unloadEmbedding()\n * during signal handlers can cause issues with the native addon.\n */\nfunction cleanup(): void {\n try {\n closeDb();\n } catch {\n // Ignore errors - database may never have been opened\n }\n}\n\n// Register cleanup for interrupt signals only (not 'exit')\n// The 'exit' handler can interfere with normal process shutdown\nprocess.on('SIGINT', () => {\n cleanup();\n process.exit(0);\n});\nprocess.on('SIGTERM', () => {\n cleanup();\n process.exit(0);\n});\n\n// ============================================================================\n// Program Setup\n// ============================================================================\n\nconst program = new Command();\n\n// Add global options\nprogram\n .option('-v, --verbose', 'Show detailed output')\n .option('-q, --quiet', 'Suppress non-essential output');\n\nprogram\n .name('ca')\n .description('Semantically-intelligent workflow plugin for Claude Code')\n .version(VERSION);\n\n// ============================================================================\n// Register Command Modules\n// ============================================================================\n\nregisterCaptureCommands(program);\nregisterRetrievalCommands(program);\nregisterManagementCommands(program);\nregisterSetupCommands(program);\nregisterCompoundCommands(program);\nregisterLoopCommands(program);\nregisterPhaseCheckCommand(program);\n\n// ============================================================================\n// Parse and Execute\n// ============================================================================\n\nprogram.parse();\n"]}