compound-agent 1.7.6 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -1
- package/README.md +70 -47
- package/bin/ca +32 -0
- package/package.json +19 -78
- package/scripts/postinstall.cjs +221 -0
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -13158
- package/dist/cli.js.map +0 -1
- package/dist/index.d.ts +0 -3730
- package/dist/index.js +0 -3240
- package/dist/index.js.map +0 -1
- package/docs/research/AgenticAiCodebaseGuide.md +0 -1206
- package/docs/research/BuildingACCompilerAnthropic.md +0 -116
- package/docs/research/HarnessEngineeringOpenAi.md +0 -220
- package/docs/research/code-review/systematic-review-methodology.md +0 -409
- package/docs/research/index.md +0 -76
- package/docs/research/learning-systems/knowledge-compounding-for-agents.md +0 -695
- package/docs/research/property-testing/property-based-testing-and-invariants.md +0 -742
- package/docs/research/scenario-testing/advanced-and-emerging.md +0 -470
- package/docs/research/scenario-testing/core-foundations.md +0 -507
- package/docs/research/scenario-testing/domain-specific-and-human-factors.md +0 -474
- package/docs/research/security/auth-patterns.md +0 -138
- package/docs/research/security/data-exposure.md +0 -185
- package/docs/research/security/dependency-security.md +0 -91
- package/docs/research/security/injection-patterns.md +0 -249
- package/docs/research/security/overview.md +0 -81
- package/docs/research/security/secrets-checklist.md +0 -92
- package/docs/research/security/secure-coding-failure.md +0 -297
- package/docs/research/software_architecture/01-science-of-decomposition.md +0 -615
- package/docs/research/software_architecture/02-architecture-under-uncertainty.md +0 -649
- package/docs/research/software_architecture/03-emergent-behavior-in-composed-systems.md +0 -644
- package/docs/research/spec_design/decision_theory_specifications_and_multi_criteria_tradeoffs.md +0 -0
- package/docs/research/spec_design/design_by_contract.md +0 -251
- package/docs/research/spec_design/domain_driven_design_strategic_modeling.md +0 -183
- package/docs/research/spec_design/formal_specification_methods.md +0 -161
- package/docs/research/spec_design/logic_and_proof_theory_under_the_curry_howard_correspondence.md +0 -250
- package/docs/research/spec_design/natural_language_formal_semantics_abuguity_in_specifications.md +0 -259
- package/docs/research/spec_design/requirements_engineering.md +0 -234
- package/docs/research/spec_design/systems_engineering_specifications_emergent_behavior_interface_contracts.md +0 -149
- package/docs/research/spec_design/what_is_this_about.md +0 -305
- package/docs/research/tdd/test-driven-development-methodology.md +0 -547
- package/docs/research/test-optimization-strategies.md +0 -401
- package/scripts/postinstall.mjs +0 -102
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/memory/embeddings/model.ts","../src/memory/embeddings/nomic.ts","../src/memory/embeddings/index.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/search/hybrid.ts","../src/memory/storage/sqlite/search.ts","../src/memory/storage/sqlite/index.ts","../src/memory/storage/compact.ts","../src/memory/storage/index.ts","../src/memory/search/vector.ts","../src/utils.ts","../src/memory/search/ranking.ts","../src/memory/search/prewarm.ts","../src/memory/search/index.ts","../src/compound/clustering.ts","../src/compound/types.ts","../src/compound/io.ts","../src/compound/synthesis.ts","../src/compound/index.ts","../src/memory/storage/sqlite-knowledge/schema.ts","../src/memory/storage/sqlite-knowledge/connection.ts","../src/memory/knowledge/types.ts","../src/memory/storage/sqlite-knowledge/cache.ts","../src/memory/storage/sqlite-knowledge/search.ts","../src/memory/storage/sqlite-knowledge/sync.ts","../src/memory/storage/sqlite-knowledge/index.ts","../src/memory/knowledge/embed-lock.ts","../src/memory/knowledge/embed-status.ts","../src/memory/knowledge/embed-chunks.ts","../src/memory/knowledge/chunking.ts","../src/memory/knowledge/indexing.ts","../src/memory/knowledge/embed-background.ts","../src/cli-utils.ts","../src/commands/compound.ts","../src/setup/all.ts","../src/version.ts","../src/setup/banner-audio.ts","../src/setup/banner.ts","../src/setup/beads-check.ts","../src/setup/templates.ts","../src/setup/claude-helpers.ts","../src/setup/display-utils.ts","../src/setup/scope-check.ts","../src/setup/gitignore.ts","../src/cli-error-format.ts","../src/setup/templates/agents-external.ts","../src/setup/templates/agents-lessons.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/gemini.ts","../src/setup/hooks-user-prompt.ts","../src/setup/hooks-failure-tracker.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/primitives.ts","../src/setup/uninstall.ts","../src/setup/upgrade.ts","../src/setup/claude.ts","../src/setup/download-model.ts","../src/setup/init.ts","../src/commands/management-crud.ts","../src/memory/index.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/commands/shared.ts","../src/commands/management-helpers.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/update-check.ts","../src/audit/checks/lessons.ts","../src/audit/checks/patterns.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/rules.ts","../src/audit/engine.ts","../src/audit/types.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/feedback.ts","../src/commands/knowledge.ts","../src/memory/knowledge/index.ts","../src/memory/knowledge/search.ts","../src/commands/knowledge-index.ts","../src/commands/clean-lessons.ts","../src/commands/install-beads.ts","../src/commands/capture.ts","../src/index.ts","../src/lint/detect.ts","../src/commands/retrieval.ts","../src/commands/index.ts","../src/commands/loop-templates.ts","../src/commands/loop-review-templates.ts","../src/commands/loop.ts","../src/commands/watch.ts","../src/cli-preflight.ts","../src/cli-app.ts","../src/native-diagnostic.ts","../src/cli.ts"],"names":["getLlama","LlamaLogLevel","join","require","dirname","createHash","mtime","readFile","mkdir","init_search","DEFAULT_THRESHOLD","init_types","z","appendFile","SCHEMA_SQL","init_schema","mkdirSync","unlinkSync","init_connection","init_cache","init_sync","readFileSync","writeFileSync","existsSync","overlapLines","readdir","extname","isModelUsable","embedChunks","fileURLToPath","spawn","openKnowledgeDb","indexDocs","createRequire","out","homedir","writeFile","rename","resolve","configPath","content","lockPath","pkg","rm","indexAndSpawnEmbed","result","modelPath","size","statSync","isModelAvailable","resolveModel","withEmbedding","preWarmLessonEmbeddings","printPnpmConfigStatus","DEFAULT_LIMIT","chalk","execFileSync","SeveritySchema","relative","execSync","REPO_URL","DISCUSSIONS_URL","keywordResults","runBackgroundEmbed","syncIfNeeded","findSimilarLessons","embedText","formatSource","readdirSync","rl"],"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;AAAA;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,EA0Hf,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,CAAA;AAAA,EA0IpB,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;;AAAA;;AAAA;;AAAA;;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,EAgHb,gBAAA,EAAkB,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;AAiJpB,CAAA;;;AC1mBA,IAAM,EAAA,GAAK,UAAA;AACX,IAAM,EAAA,GAAK,SAAA;AAEJ,IAAM,YAAA,GAAuC;AAAA,EAClD,UAAA,EAAY,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,CAAA;AAAA,EA2GZ,IAAA,EAAM,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,CAAA;AAAA,EAqEN,IAAA,EAAM,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,CAAA;AAAA,EA6FN,MAAA,EAAQ,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,CAAA;AAAA,EAgFR,QAAA,EAAU,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,CAAA;AAAA,EA8EV,UAAA,EAAY,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,CAAA;AAAA,EA4GZ,SAAA,EAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA,EAwBX,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAQQ,EAAE;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;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,EAuDZ,cAAA,EAAgB,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,CAAA;AAAA,EA6EhB,SAAA,EAAW,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;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","file":"cli.js","sourcesContent":["/**\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, LlamaLogLevel, 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 (fs existence only).\n *\n * Use this for cheap pre-flight checks (e.g. spawnBackgroundEmbed) where\n * failure is handled gracefully. Use {@link isModelUsable} when you need\n * runtime verification that the model can actually initialize.\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 * WARNING: This function allocates ~150MB of native C++ memory for the probe.\n * NEVER call at module top-level in test files. When dispose() SIGABRTs in\n * vitest workers, that memory is permanently leaked. For test skip-gating,\n * use isModelAvailable() instead (zero native allocation). Reserve this\n * function for production code paths where runtime verification is needed.\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 build: 'never', // Never compile from source in a deployed tool\n progressLogs: false, // Suppress prebuilt binary fallback warnings\n logLevel: LlamaLogLevel.error, // Only surface real errors from C++ backend\n // Set NODE_LLAMA_CPP_DEBUG=true to re-enable all output for troubleshooting\n });\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 { await context.dispose(); } catch { /* ignore cleanup errors */ }\n }\n if (model) {\n try { await model.dispose(); } catch { /* ignore cleanup errors */ }\n }\n if (llama) {\n try { await llama.dispose(); } catch { /* ignore cleanup errors */ }\n }\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({ build: 'never', logLevel: LlamaLogLevel.error });\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, LlamaLogLevel } 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 build: 'never', // Never compile from source in a deployed tool\n progressLogs: false, // Suppress prebuilt binary fallback warnings\n logLevel: LlamaLogLevel.error, // Only surface real errors from C++ backend\n // Set NODE_LLAMA_CPP_DEBUG=true to re-enable all output for troubleshooting\n });\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 * Await disposal of all loaded embedding resources.\n *\n * This is intended for CLI shutdown paths that must wait for the native addon\n * to release worker threads before allowing the process to exit.\n */\nexport async function unloadEmbeddingResources(): Promise<void> {\n const pending = pendingInit;\n if (pending) {\n try {\n await pending;\n } catch {\n // Ignore initialization failures; dispose any partially created refs below.\n }\n }\n\n const context = embeddingContext;\n const model = modelInstance;\n const llama = llamaInstance;\n\n embeddingContext = null;\n modelInstance = null;\n llamaInstance = null;\n pendingInit = null;\n\n const disposals: Promise<unknown>[] = [];\n\n if (context) {\n disposals.push(context.dispose());\n }\n if (model) {\n disposals.push(model.dispose());\n }\n if (llama) {\n disposals.push(llama.dispose());\n }\n\n if (disposals.length > 0) {\n await Promise.allSettled(disposals);\n }\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 void unloadEmbeddingResources();\n}\n\n/**\n * Run a callback with embedding resources, guaranteeing cleanup.\n *\n * The model loads lazily on the first embedText/embedTexts call inside\n * the callback (via the existing singleton). After the callback completes\n * or throws, all native resources (~150MB) are disposed.\n *\n * Use this instead of manually pairing embedText with unloadEmbeddingResources.\n */\nexport async function withEmbedding<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } finally {\n await unloadEmbeddingResources();\n }\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 Float32Array vector\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<Float32Array> {\n const ctx = await getEmbedding();\n const result = await ctx.getEmbeddingFor(text);\n return new Float32Array(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<Float32Array[]> {\n if (texts.length === 0) return [];\n\n const ctx = await getEmbedding();\n const results: Float32Array[] = [];\n\n for (const text of texts) {\n const result = await ctx.getEmbeddingFor(text);\n results.push(new Float32Array(result.vector));\n }\n\n return results;\n}\n\n// Re-export isModelAvailable for test utilities\nexport { isModelAvailable };\n","/**\n * Embeddings module - Text embedding via EmbeddingGemma\n *\n * Provides text embedding for semantic search.\n * Model is downloaded automatically on first use (~150MB).\n */\n\n// Embedding functions\nexport { embedText, embedTexts, getEmbedding, isModelAvailable, unloadEmbedding, unloadEmbeddingResources, withEmbedding } from './nomic.js';\n\n// Model resolution\nexport { clearUsabilityCache, isModelUsable, MODEL_FILENAME, MODEL_URI, resolveModel } from './model.js';\nexport type { UsabilityResult } from './model.js';\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} + 16 hex characters from SHA-256 hash (64 bits of entropy).\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 L1a2b3c4d5e6f7g8h\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, 16)}`;\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 /** IDs that were tombstoned (deleted) */\n deletedIds: Set<string>;\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 // Type guard: exclude tombstone variant (no `type` field)\n if (record.deleted === true) return null;\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: [], deletedIds: new Set<string>(), skippedCount: 0 };\n }\n throw err;\n }\n\n const items = new Map<string, MemoryItem>();\n const deletedIds = new Set<string>();\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 deletedIds.add(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()), deletedIds, 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 'For pnpm projects:\\n' +\n ' 1. Ensure package.json has: \"pnpm\": { \"onlyBuiltDependencies\": [\"better-sqlite3\"] }\\n' +\n ' 2. Run: pnpm install && pnpm rebuild better-sqlite3\\n' +\n 'For npm/yarn projects:\\n' +\n ' Run: npm rebuild better-sqlite3\\n' +\n 'If the error persists, check that build tools (python3, make, g++) are installed.',\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/**\n * Reset the cached SQLite availability state.\n * Used after rebuilding native modules to force a fresh check.\n */\nexport function resetSqliteAvailability(): void {\n checked = false;\n DatabaseConstructor = null;\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 = 5;\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 embedding_insight BLOB,\n content_hash_insight 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 OF id, trigger, insight, tags, pattern_bad, pattern_good 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 const current = database.pragma('user_version', { simple: true }) as number;\n if (current !== SCHEMA_VERSION) {\n database.pragma(`user_version = ${SCHEMA_VERSION}`);\n }\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 try { unlinkSync(key); } catch { /* ENOENT is fine */ }\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): Float32Array | 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 return new Float32Array(\n row.embedding.buffer,\n row.embedding.byteOffset,\n row.embedding.byteLength / 4\n );\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/** Entry returned by getCachedEmbeddingsBulk */\nexport interface CachedEmbeddingEntry {\n vector: Float32Array;\n hash: string;\n}\n\n/**\n * Bulk-read all cached embeddings in a single query.\n * Returns a Map of lessonId to {vector, hash} for every lesson\n * that has a cached embedding and content_hash.\n * Callers validate the hash themselves.\n */\nexport function getCachedEmbeddingsBulk(repoRoot: string): Map<string, CachedEmbeddingEntry> {\n const database = openDb(repoRoot);\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 const result = new Map<string, CachedEmbeddingEntry>();\n for (const row of rows) {\n if (!row.content_hash) continue;\n const float32 = new Float32Array(\n row.embedding.buffer,\n row.embedding.byteOffset,\n row.embedding.byteLength / 4\n );\n result.set(row.id, { vector: float32, hash: row.content_hash });\n }\n return result;\n}\n\n/**\n * Get cached insight-only embedding for a lesson.\n * Used by findSimilarLessons (insight-only hash, separate from searchVector's trigger+insight hash).\n */\nexport function getCachedInsightEmbedding(\n repoRoot: string,\n lessonId: string,\n expectedHash?: string\n): Float32Array | null {\n const database = openDb(repoRoot);\n\n const row = database\n .prepare('SELECT embedding_insight, content_hash_insight FROM lessons WHERE id = ?')\n .get(lessonId) as { embedding_insight: Buffer | null; content_hash_insight: string | null } | undefined;\n\n if (!row || !row.embedding_insight || !row.content_hash_insight) {\n return null;\n }\n\n if (expectedHash && row.content_hash_insight !== expectedHash) {\n return null;\n }\n\n return new Float32Array(\n row.embedding_insight.buffer,\n row.embedding_insight.byteOffset,\n row.embedding_insight.byteLength / 4\n );\n}\n\n/**\n * Cache insight-only embedding for a lesson in SQLite.\n * Uses UPDATE-only — the row must already exist.\n */\nexport function setCachedInsightEmbedding(\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_insight = ?, content_hash_insight = ? 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, embedding_insight, content_hash_insight FROM lessons WHERE embedding IS NOT NULL OR embedding_insight IS NOT NULL')\n .all() as Array<{ id: string; embedding: Buffer | null; content_hash: string | null; embedding_insight: Buffer | null; content_hash_insight: string | null }>;\n\n for (const row of rows) {\n if (row.embedding && row.content_hash) {\n cache.set(row.id, {\n embedding: row.embedding,\n contentHash: row.content_hash,\n embeddingInsight: row.embedding_insight,\n contentHashInsight: row.content_hash_insight,\n });\n } else if (row.embedding_insight && row.content_hash_insight) {\n // Only insight cache exists — still worth preserving\n cache.set(row.id, {\n embedding: row.embedding_insight, // placeholder, won't match hash\n contentHash: '',\n embeddingInsight: row.embedding_insight,\n contentHashInsight: row.content_hash_insight,\n });\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, embedding_insight, content_hash_insight, 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, @embedding_insight, @content_hash_insight, @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 insightHash = contentHash(item.insight, '');\n const cached = cachedEmbeddings.get(item.id);\n const hasValidCache = cached && cached.contentHash === newHash;\n const hasValidInsightCache = cached && cached.contentHashInsight === insightHash;\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 embedding_insight: hasValidInsightCache ? cached.embeddingInsight : null,\n content_hash_insight: hasValidInsightCache ? cached.contentHashInsight : 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 * Hybrid search: BM25 normalization and result merging.\n *\n * Combines vector similarity (cosine) with FTS5 keyword matching (BM25)\n * into a single blended score for improved retrieval quality.\n */\n\nimport type { MemoryItem } from '../types.js';\nimport type { ScoredLesson } from './vector.js';\n\n/** Generic scored item for hybrid merge */\nexport interface GenericScoredItem<T> {\n item: T;\n score: number;\n}\n\n/** Keyword search result with normalized BM25 score */\nexport interface ScoredKeywordResult {\n lesson: MemoryItem;\n /** BM25 rank normalized to 0-1 */\n score: number;\n}\n\n/** Options for hybrid merge */\nexport interface HybridMergeOptions {\n vectorWeight?: number;\n textWeight?: number;\n limit?: number;\n /** Filter results below this blended score */\n minScore?: number;\n}\n\nexport const DEFAULT_VECTOR_WEIGHT = 0.7;\nexport const DEFAULT_TEXT_WEIGHT = 0.3;\nexport const CANDIDATE_MULTIPLIER = 4;\nexport const MIN_HYBRID_SCORE = 0.35;\n\n/**\n * Normalize FTS5 BM25 rank to a 0-1 score.\n *\n * FTS5 ranks are negative (lower = more relevant).\n * Uses: |rank| / (1 + |rank|) so that more negative ranks\n * (more relevant) produce higher scores, making keyword\n * matches meaningful in the hybrid blend.\n *\n * Examples: -10 -> ~0.909, -1 -> 0.5, 0 -> 0, NaN -> 0\n */\nexport function normalizeBm25Rank(rank: number): number {\n if (!Number.isFinite(rank)) return 0;\n const abs = Math.abs(rank);\n return abs / (1 + abs);\n}\n\n/**\n * Generic hybrid merge that works with any item type.\n * Requires an getId function to identify unique items for union.\n *\n * Algorithm:\n * 1. Normalize weights to sum to 1.0\n * 2. Union both result sets by item ID\n * 3. Blend: score = vecW * vectorScore + txtW * textScore (missing source = 0)\n * 4. Sort descending by blended score\n */\nexport function mergeHybridScores<T>(\n vectorResults: GenericScoredItem<T>[],\n keywordResults: GenericScoredItem<T>[],\n getId: (item: T) => string,\n options?: HybridMergeOptions\n): GenericScoredItem<T>[] {\n if (vectorResults.length === 0 && keywordResults.length === 0) return [];\n\n const rawVecW = options?.vectorWeight ?? DEFAULT_VECTOR_WEIGHT;\n const rawTxtW = options?.textWeight ?? DEFAULT_TEXT_WEIGHT;\n const total = rawVecW + rawTxtW;\n if (total <= 0) return [];\n const vecW = rawVecW / total;\n const txtW = rawTxtW / total;\n const limit = options?.limit;\n const minScore = options?.minScore;\n\n // Union by item ID\n const merged = new Map<string, { item: T; vecScore: number; txtScore: number }>();\n\n for (const v of vectorResults) {\n merged.set(getId(v.item), { item: v.item, vecScore: v.score, txtScore: 0 });\n }\n\n for (const k of keywordResults) {\n const id = getId(k.item);\n const existing = merged.get(id);\n if (existing) {\n existing.txtScore = k.score;\n } else {\n merged.set(id, { item: k.item, vecScore: 0, txtScore: k.score });\n }\n }\n\n // Blend and sort\n const results: GenericScoredItem<T>[] = [];\n for (const entry of merged.values()) {\n results.push({\n item: entry.item,\n score: vecW * entry.vecScore + txtW * entry.txtScore,\n });\n }\n\n results.sort((a, b) => b.score - a.score);\n\n const filtered = minScore !== undefined ? results.filter((r) => r.score >= minScore) : results;\n return limit !== undefined ? filtered.slice(0, limit) : filtered;\n}\n\n/**\n * Merge vector and keyword search results into a single ranked list.\n * Delegates to the generic mergeHybridScores.\n */\nexport function mergeHybridResults(\n vectorResults: ScoredLesson[],\n keywordResults: ScoredKeywordResult[],\n options?: HybridMergeOptions\n): ScoredLesson[] {\n const genericVec = vectorResults.map((v) => ({ item: v.lesson, score: v.score }));\n const genericKw = keywordResults.map((k) => ({ item: k.lesson, score: k.score }));\n const merged = mergeHybridScores(genericVec, genericKw, (item) => item.id, options);\n return merged.map((m) => ({ lesson: m.item, score: m.score }));\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';\nimport { normalizeBm25Rank, type ScoredKeywordResult } from '../../search/hybrid.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 safeJsonParse<T>(value: string, fallback: T): T {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\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: safeJsonParse(row.context, {}),\n supersedes: safeJsonParse(row.supersedes, []),\n related: safeJsonParse(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/**\n * Read all non-invalidated memory items from the SQLite cache.\n * Use this instead of readMemoryItems() when the SQLite index is\n * already synced, to avoid a redundant JSONL parse + Zod validation.\n *\n * @param repoRoot - Absolute path to repository root\n * @returns Array of MemoryItem objects\n */\nexport function readAllFromSqlite(repoRoot: string): MemoryItem[] {\n const database = openDb(repoRoot);\n\n const rows = database\n .prepare('SELECT * FROM lessons WHERE invalidated_at IS NULL')\n .all() as MemoryItemRow[];\n\n return rows.map(rowToMemoryItem).filter((x): x is MemoryItem => x !== null);\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 * Row type for scored keyword query (includes FTS5 rank).\n */\ninterface ScoredRow extends MemoryItemRow {\n rank: number;\n}\n\n/**\n * Shared FTS5 query execution. Builds the SQL with optional rank column\n * and ORDER BY, then runs the query with sanitization and error handling.\n */\nfunction executeFtsQuery(\n repoRoot: string,\n query: string,\n limit: number,\n options: { includeRank: boolean; typeFilter?: MemoryItemType }\n): ScoredRow[] {\n const database = openDb(repoRoot);\n\n const sanitized = sanitizeFtsQuery(query);\n if (sanitized === '') return [];\n\n const selectCols = options.includeRank ? 'l.*, fts.rank' : 'l.*';\n const orderClause = options.includeRank ? 'ORDER BY fts.rank' : '';\n const typeClause = options.typeFilter ? 'AND l.type = ?' : '';\n\n const sql = `\n SELECT ${selectCols}\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 ${typeClause}\n ${orderClause}\n LIMIT ?\n `;\n\n const params = options.typeFilter\n ? [sanitized, options.typeFilter, limit]\n : [sanitized, limit];\n\n try {\n return database.prepare(sql).all(...params) as ScoredRow[];\n } catch (err) {\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 * 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 rows = executeFtsQuery(repoRoot, query, limit, { includeRank: false, typeFilter });\n return rows.map(rowToMemoryItem).filter((x): x is MemoryItem => x !== null);\n}\n\n/**\n * Search lessons using FTS5 with normalized BM25 scores.\n *\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 Scored keyword results with BM25 scores normalized to 0-1\n */\nexport async function searchKeywordScored(\n repoRoot: string,\n query: string,\n limit: number,\n typeFilter?: MemoryItemType\n): Promise<ScoredKeywordResult[]> {\n const rows = executeFtsQuery(repoRoot, query, limit, { includeRank: true, typeFilter });\n const results: ScoredKeywordResult[] = [];\n for (const row of rows) {\n const lesson = rowToMemoryItem(row);\n if (lesson) {\n results.push({ lesson, score: normalizeBm25Rank(row.rank) });\n }\n }\n return results;\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 * SQLite storage module - rebuildable index with FTS5 full-text search.\n *\n * SQLite is required. If better-sqlite3 fails to load, a clear error\n * is thrown.\n */\n\n// Types\nexport type { DbOptions, RetrievalStat, SyncOptions } from './types.js';\n\n// Connection\nexport { closeDb, DB_PATH, openDb } from './connection.js';\n\n// Cache\nexport {\n contentHash,\n getCachedEmbedding,\n getCachedEmbeddingsBulk,\n getCachedInsightEmbedding,\n setCachedEmbedding,\n setCachedInsightEmbedding,\n} from './cache.js';\nexport type { CachedEmbeddingEntry } from './cache.js';\n\n// Sync\nexport { rebuildIndex, syncIfNeeded } from './sync.js';\n\n// Availability\nexport { ensureSqliteAvailable, resetSqliteAvailability } from './availability.js';\n\n// Search\nexport {\n getRetrievalStats,\n incrementRetrievalCount,\n readAllFromSqlite,\n searchKeyword,\n searchKeywordScored,\n} from './search.js';\n","/**\n * Tombstone removal and JSONL rewrite\n *\n * Handles:\n * - Removing tombstones through JSONL rewrite\n * - Tracking compaction thresholds\n */\n\nimport { 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';\n\nimport { LESSONS_PATH } from './jsonl.js';\n\n/** Number of tombstones that triggers automatic compaction */\nexport const TOMBSTONE_THRESHOLD = 100;\n\n/**\n * Result of a compaction operation\n */\nexport interface CompactResult {\n /** Number of lessons moved to archive (always 0, kept for API compat) */\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 * 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 * Run compaction: remove tombstones and invalid records, rewrite JSONL.\n *\n * Reads the JSONL file exactly once, deduplicates in-memory,\n * then 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. Collect all remaining lessons\n const toKeep = [...lessonMap.values()];\n\n // 4. 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: 0,\n tombstonesRemoved: tombstoneCount,\n lessonsRemaining: toKeep.length,\n droppedInvalid: droppedCount,\n };\n}\n","/**\n * Storage module - JSONL + SQLite storage layer\n *\n * JSONL is the source of truth (git-tracked).\n * SQLite is a rebuildable index with FTS5 and embedding cache.\n */\n\n// JSONL storage (source of truth)\nexport { appendLesson, appendMemoryItem, LESSONS_PATH, readLessons, readMemoryItems } from './jsonl.js';\nexport type { ParseError, ReadLessonsOptions, ReadLessonsResult, ReadMemoryItemsResult } from './jsonl.js';\n\n// SQLite storage (rebuildable index)\nexport {\n closeDb,\n contentHash,\n DB_PATH,\n ensureSqliteAvailable,\n getCachedEmbedding,\n getCachedEmbeddingsBulk,\n getCachedInsightEmbedding,\n getRetrievalStats,\n incrementRetrievalCount,\n openDb,\n readAllFromSqlite,\n rebuildIndex,\n resetSqliteAvailability,\n searchKeyword,\n searchKeywordScored,\n setCachedEmbedding,\n setCachedInsightEmbedding,\n syncIfNeeded,\n} from './sqlite/index.js';\nexport type { CachedEmbeddingEntry, DbOptions, RetrievalStat, SyncOptions } from './sqlite/index.js';\n\n// Compaction (tombstone removal)\nexport {\n compact,\n countTombstones,\n needsCompaction,\n TOMBSTONE_THRESHOLD,\n} from './compact.js';\nexport type { CompactResult } from './compact.js';\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 { isModelAvailable } from '../embeddings/model.js';\nimport { contentHash, getCachedEmbeddingsBulk, getCachedInsightEmbedding, readAllFromSqlite, setCachedEmbedding, setCachedInsightEmbedding, syncIfNeeded } 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, Float32Array>();\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: ArrayLike<number>, b: ArrayLike<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 // Ensure SQLite cache is fresh, then read from it (avoids redundant JSONL parse)\n await syncIfNeeded(repoRoot);\n const items = readAllFromSqlite(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 // Bulk-read all cached embeddings in one query (instead of N individual reads)\n const cachedEmbeddings = getCachedEmbeddingsBulk(repoRoot);\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 bulk cache first\n const cached = cachedEmbeddings.get(item.id);\n let itemVector: Float32Array;\n\n if (cached && cached.hash === hash) {\n itemVector = cached.vector;\n } else {\n // Cache miss or stale - 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\nexport interface SimilarLesson {\n item: MemoryItem;\n score: number;\n}\n\nexport interface FindSimilarOptions {\n threshold?: number;\n excludeId?: string;\n /** Pre-loaded items to search. When provided, skips readMemoryItems(). */\n items?: MemoryItem[];\n}\n\nconst DEFAULT_THRESHOLD = 0.80;\n\n/**\n * Find lessons semantically similar to the given text.\n * Embeds using insight text only (not trigger) to avoid noise from generic triggers.\n * Does NOT include CCT patterns.\n */\nexport async function findSimilarLessons(\n repoRoot: string,\n text: string,\n options?: FindSimilarOptions\n): Promise<SimilarLesson[]> {\n const threshold = options?.threshold ?? DEFAULT_THRESHOLD;\n const excludeId = options?.excludeId;\n\n if (!isModelAvailable()) return [];\n\n let items: MemoryItem[];\n if (options?.items) {\n items = options.items;\n } else {\n await syncIfNeeded(repoRoot);\n items = readAllFromSqlite(repoRoot);\n }\n if (items.length === 0) return [];\n\n const queryVector = await embedText(text);\n\n const scored: SimilarLesson[] = [];\n for (const item of items) {\n if (item.invalidatedAt) continue;\n if (excludeId && item.id === excludeId) continue;\n\n try {\n // Use insight ONLY for embedding (NOT trigger + insight).\n // Stored in separate columns to avoid cache conflicts with searchVector.\n const hash = contentHash(item.insight, '');\n let itemVector = getCachedInsightEmbedding(repoRoot, item.id, hash);\n\n if (!itemVector) {\n itemVector = await embedText(item.insight);\n setCachedInsightEmbedding(repoRoot, item.id, itemVector, hash);\n }\n\n const score = cosineSimilarity(queryVector, itemVector);\n if (score >= threshold) {\n scored.push({ item, score });\n }\n } catch {\n continue;\n }\n }\n\n scored.sort((a, b) => b.score - a.score);\n return scored;\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 * 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 * Pre-warm lesson embedding cache.\n *\n * Embeds all lessons that are missing or have stale cached embeddings.\n * Called after `ca init` or index rebuild so the first `ca search` is fast.\n */\n\nimport { isModelAvailable } from '../embeddings/model.js';\nimport { embedText } from '../embeddings/index.js';\nimport {\n contentHash,\n getCachedEmbeddingsBulk,\n readAllFromSqlite,\n setCachedEmbedding,\n syncIfNeeded,\n} from '../storage/index.js';\n\nexport interface PreWarmResult {\n embedded: number;\n skipped: number;\n}\n\n/**\n * Pre-warm lesson embeddings so the first search is fast.\n *\n * 1. Checks model availability (returns early if unavailable)\n * 2. Syncs SQLite from JSONL\n * 3. Reads all non-invalidated items\n * 4. Finds items with missing or stale cached embeddings\n * 5. Embeds and caches them\n *\n * @param repoRoot - Absolute path to repository root\n * @returns Counts of embedded and skipped items\n */\nexport async function preWarmLessonEmbeddings(repoRoot: string): Promise<PreWarmResult> {\n if (!isModelAvailable()) {\n return { embedded: 0, skipped: 0 };\n }\n\n await syncIfNeeded(repoRoot);\n const items = readAllFromSqlite(repoRoot);\n\n if (items.length === 0) {\n return { embedded: 0, skipped: 0 };\n }\n\n const cached = getCachedEmbeddingsBulk(repoRoot);\n\n const toEmbed: Array<{ id: string; text: string; hash: string }> = [];\n for (const item of items) {\n const hash = contentHash(item.trigger, item.insight);\n const entry = cached.get(item.id);\n if (!entry || entry.hash !== hash) {\n toEmbed.push({ id: item.id, text: `${item.trigger} ${item.insight}`, hash });\n }\n }\n\n if (toEmbed.length === 0) {\n return { embedded: 0, skipped: items.length };\n }\n\n let embedded = 0;\n for (const { id, text, hash } of toEmbed) {\n const vector = await embedText(text);\n setCachedEmbedding(repoRoot, id, vector, hash);\n embedded++;\n }\n\n return { embedded, skipped: items.length - embedded };\n}\n","/**\n * Search module - Vector similarity and ranking\n *\n * Provides semantic search with multi-factor ranking:\n * - Vector similarity (cosine)\n * - Severity boost\n * - Recency boost\n * - Confirmation boost\n */\n\n// Vector search\nexport { cosineSimilarity, findSimilarLessons, searchVector } from './vector.js';\nexport type { FindSimilarOptions, ScoredLesson, SearchVectorOptions, SimilarLesson } from './vector.js';\n\n// Ranking\nexport {\n calculateScore,\n confirmationBoost,\n rankLessons,\n recencyBoost,\n severityBoost,\n} from './ranking.js';\nexport type { RankedLesson } from './ranking.js';\n\n// Pre-warm\nexport { preWarmLessonEmbeddings } from './prewarm.js';\nexport type { PreWarmResult } from './prewarm.js';\n\n// Hybrid search\nexport {\n CANDIDATE_MULTIPLIER,\n DEFAULT_TEXT_WEIGHT,\n DEFAULT_VECTOR_WEIGHT,\n MIN_HYBRID_SCORE,\n mergeHybridResults,\n mergeHybridScores,\n normalizeBm25Rank,\n} from './hybrid.js';\nexport type { GenericScoredItem, HybridMergeOptions, ScoredKeywordResult } from './hybrid.js';\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: ArrayLike<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: ArrayLike<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: MemoryItem[][] = [];\n const noise: MemoryItem[] = [];\n for (const group of groups.values()) {\n if (group.length === 1) {\n noise.push(group[0]!);\n } else {\n clusters.push(group);\n }\n }\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 let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n continue; // Skip malformed JSONL lines\n }\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 * Compounding module barrel export.\n *\n * Provides clustering, synthesis, and I/O for cross-cutting patterns.\n */\n\nexport { buildSimilarityMatrix, clusterBySimilarity } from './clustering.js';\nexport { readCctPatterns, writeCctPatterns } from './io.js';\nexport { synthesizePattern } from './synthesis.js';\nexport { CCT_PATTERNS_PATH, CctPatternSchema, generateCctId } from './types.js';\nexport type { CctPattern, ClusterResult } from './types.js';\n","/**\n * SQLite schema definition for knowledge database.\n *\n * The knowledge database stores documentation chunks with FTS5 search.\n * When KNOWLEDGE_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 knowledge SQLite cache.\n * Bump this when making incompatible schema changes.\n */\nexport const KNOWLEDGE_SCHEMA_VERSION = 2;\n\n/** SQL schema for knowledge database with FTS5 full-text search */\nconst SCHEMA_SQL = `\n CREATE TABLE IF NOT EXISTS chunks (\n id TEXT PRIMARY KEY,\n file_path TEXT NOT NULL,\n start_line INTEGER NOT NULL,\n end_line INTEGER NOT NULL,\n content_hash TEXT NOT NULL,\n text TEXT NOT NULL,\n embedding BLOB,\n model TEXT,\n updated_at TEXT NOT NULL\n );\n\n CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts5(\n text,\n content='chunks', content_rowid='rowid'\n );\n\n CREATE TRIGGER IF NOT EXISTS chunks_ai AFTER INSERT ON chunks BEGIN\n INSERT INTO chunks_fts(rowid, text)\n VALUES (new.rowid, new.text);\n END;\n\n CREATE TRIGGER IF NOT EXISTS chunks_ad AFTER DELETE ON chunks BEGIN\n INSERT INTO chunks_fts(chunks_fts, rowid, text)\n VALUES ('delete', old.rowid, old.text);\n END;\n\n CREATE TRIGGER IF NOT EXISTS chunks_au AFTER UPDATE ON chunks BEGIN\n INSERT INTO chunks_fts(chunks_fts, rowid, text)\n VALUES ('delete', old.rowid, old.text);\n INSERT INTO chunks_fts(rowid, text)\n VALUES (new.rowid, new.text);\n END;\n\n CREATE INDEX IF NOT EXISTS idx_chunks_file_path ON chunks(file_path);\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 knowledge database schema and set the version pragma.\n * @param database - SQLite database instance\n */\nexport function createKnowledgeSchema(database: DatabaseType): void {\n database.exec(SCHEMA_SQL);\n database.pragma(`user_version = ${KNOWLEDGE_SCHEMA_VERSION}`);\n}\n","/**\n * Knowledge SQLite database connection management.\n *\n * Separate singleton map from the lessons DB -- completely independent.\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 { KnowledgeDbOptions } from './types.js';\nimport { getDatabaseConstructor } from '../sqlite/availability.js';\nimport { createKnowledgeSchema, KNOWLEDGE_SCHEMA_VERSION } from './schema.js';\n\n/** Relative path to knowledge database file from repo root */\nexport const KNOWLEDGE_DB_PATH = '.claude/.cache/knowledge.sqlite';\n\n/** Knowledge database connections keyed by resolved DB path */\nconst knowledgeDbMap = new Map<string, DatabaseType>();\n\n/**\n * Open the knowledge SQLite database connection.\n * If the database has an older schema version, it is deleted and recreated.\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 openKnowledgeDb(\n repoRoot: string,\n options: KnowledgeDbOptions = {}\n): DatabaseType {\n const { inMemory = false } = options;\n\n const key = inMemory ? `:memory:${repoRoot}` : join(repoRoot, KNOWLEDGE_DB_PATH);\n\n const cached = knowledgeDbMap.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 const version = database.pragma('user_version', { simple: true }) as number;\n if (version !== 0 && version !== KNOWLEDGE_SCHEMA_VERSION) {\n database.close();\n try { unlinkSync(key); } catch { /* ENOENT is fine */ }\n database = new Database(key);\n }\n\n database.pragma('journal_mode = WAL');\n }\n\n createKnowledgeSchema(database);\n knowledgeDbMap.set(key, database);\n return database;\n}\n\n/**\n * Close all knowledge SQLite database connections.\n */\nexport function closeKnowledgeDb(): void {\n for (const database of knowledgeDbMap.values()) {\n database.close();\n }\n knowledgeDbMap.clear();\n}\n","import { createHash } from 'node:crypto';\n\nexport interface Chunk {\n /** Unique ID: SHA-256 of filePath + startLine + endLine */\n id: string;\n /** Relative path from repo root */\n filePath: string;\n /** 1-indexed start line */\n startLine: number;\n /** 1-indexed end line (inclusive) */\n endLine: number;\n /** The chunk text content */\n text: string;\n /** SHA-256 of text content for cache invalidation */\n contentHash: string;\n}\n\nexport interface ChunkOptions {\n /** Target chunk size in characters (default: 1600 ~= 400 tokens) */\n targetSize?: number;\n /** Overlap size in characters (default: 320 ~= 80 tokens) */\n overlapSize?: number;\n}\n\n/** Supported file extensions for chunking */\nexport const SUPPORTED_EXTENSIONS: ReadonlySet<string> = new Set([\n '.md', '.txt', '.rst', '.ts', '.py', '.js', '.tsx', '.jsx',\n]);\n\n/** Code file extensions (subset of SUPPORTED_EXTENSIONS) */\nexport const CODE_EXTENSIONS: ReadonlySet<string> = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.py',\n]);\n\n/** Generate chunk ID from file path and line range */\nexport function generateChunkId(filePath: string, startLine: number, endLine: number): string {\n return createHash('sha256').update(`${filePath}:${startLine}:${endLine}`).digest('hex').slice(0, 16);\n}\n\n/** Generate content hash */\nexport function chunkContentHash(text: string): string {\n return createHash('sha256').update(text).digest('hex');\n}\n","/**\n * Embedding cache operations for knowledge chunks.\n */\n\nimport type { Database as DatabaseType } from 'better-sqlite3';\n\nimport type { CachedEmbeddingData } from '../sqlite/types.js';\nimport { openKnowledgeDb } from './connection.js';\nimport { chunkContentHash } from '../../knowledge/types.js';\n\nexport { chunkContentHash };\n\n/**\n * Get cached embedding for a knowledge chunk.\n * @param repoRoot - Absolute path to repository root\n * @param chunkId - ID of the chunk\n * @param expectedHash - Optional content hash to validate cache freshness\n * @returns Float32Array embedding or null if not cached\n */\nexport function getCachedChunkEmbedding(\n repoRoot: string,\n chunkId: string,\n expectedHash?: string\n): Float32Array | null {\n const database = openKnowledgeDb(repoRoot);\n\n const row = database\n .prepare('SELECT embedding, content_hash FROM chunks WHERE id = ?')\n .get(chunkId) 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 return new Float32Array(\n row.embedding.buffer,\n row.embedding.byteOffset,\n row.embedding.byteLength / 4\n );\n}\n\n/**\n * Cache embedding for a knowledge chunk (UPDATE-only).\n * The chunk row must already exist. If it doesn't, this is a silent no-op.\n * @param repoRoot - Absolute path to repository root\n * @param chunkId - ID of the chunk\n * @param embedding - Embedding vector\n * @param hash - Content hash for cache validation\n */\nexport function setCachedChunkEmbedding(\n repoRoot: string,\n chunkId: string,\n embedding: Float32Array | number[],\n hash: string\n): void {\n const database = openKnowledgeDb(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 chunks SET embedding = ?, content_hash = ? WHERE id = ?')\n .run(buffer, hash, chunkId);\n}\n\n/**\n * Collect all cached chunk embeddings from the database.\n * @param database - SQLite database instance\n * @returns Map of chunk ID to cached embedding data\n */\nexport function collectCachedChunkEmbeddings(\n database: DatabaseType\n): Map<string, CachedEmbeddingData> {\n const cache = new Map<string, CachedEmbeddingData>();\n const rows = database\n .prepare('SELECT id, embedding, content_hash FROM chunks 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 * Knowledge chunk search operations using FTS5 full-text search.\n */\n\nimport type { KnowledgeChunk, ScoredChunk } from './types.js';\nimport { openKnowledgeDb } from './connection.js';\nimport { sanitizeFtsQuery } from '../sqlite/search.js';\nimport { normalizeBm25Rank } from '../../search/hybrid.js';\n\n/** Internal row type from SQLite query */\ninterface ChunkRow {\n id: string;\n file_path: string;\n start_line: number;\n end_line: number;\n content_hash: string;\n text: string;\n model: string | null;\n updated_at: string;\n}\n\n/** Row type with FTS5 rank score */\ninterface ScoredChunkRow extends ChunkRow {\n rank: number;\n}\n\nfunction rowToChunk(row: ChunkRow): KnowledgeChunk {\n const chunk: KnowledgeChunk = {\n id: row.id,\n filePath: row.file_path,\n startLine: row.start_line,\n endLine: row.end_line,\n contentHash: row.content_hash,\n text: row.text,\n updatedAt: row.updated_at,\n };\n if (row.model !== null) {\n chunk.model = row.model;\n }\n return chunk;\n}\n\n/**\n * Search knowledge chunks with normalized BM25 scores.\n * @param repoRoot - Absolute path to repository root\n * @param query - Search query string\n * @param limit - Maximum number of results\n * @returns Scored chunks with BM25 scores normalized to 0-1\n */\nexport function searchChunksKeywordScored(\n repoRoot: string,\n query: string,\n limit: number\n): ScoredChunk[] {\n const database = openKnowledgeDb(repoRoot);\n\n const sanitized = sanitizeFtsQuery(query);\n if (sanitized === '') return [];\n\n try {\n // ORDER BY fts.rank: BM25 ranks are negative (lower = more relevant)\n const rows = database\n .prepare(\n `SELECT c.*, fts.rank\n FROM chunks c\n JOIN chunks_fts fts ON c.rowid = fts.rowid\n WHERE chunks_fts MATCH ?\n ORDER BY fts.rank\n LIMIT ?`\n )\n .all(sanitized, limit) as ScoredChunkRow[];\n\n return rows.map((row) => ({\n chunk: rowToChunk(row),\n score: normalizeBm25Rank(row.rank),\n }));\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown FTS5 error';\n console.error(`[compound-agent] knowledge scored search error: ${message}`);\n return [];\n }\n}\n","/**\n * Knowledge chunk sync operations: upsert, delete, metadata tracking.\n */\n\nimport type { KnowledgeChunk } from './types.js';\nimport { openKnowledgeDb } from './connection.js';\n\n/**\n * Upsert chunks into the knowledge database.\n * Uses INSERT OR REPLACE for conflict resolution on id.\n * @param repoRoot - Absolute path to repository root\n * @param chunks - Chunks to upsert\n * @param embeddings - Optional map of chunk ID to embedding vector\n */\nexport function upsertChunks(\n repoRoot: string,\n chunks: KnowledgeChunk[],\n embeddings?: Map<string, Float32Array>\n): void {\n if (chunks.length === 0) return;\n\n const database = openKnowledgeDb(repoRoot);\n\n const insert = database.prepare(`\n INSERT OR REPLACE INTO chunks (id, file_path, start_line, end_line, content_hash, text, embedding, model, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n const upsertMany = database.transaction((items: KnowledgeChunk[]) => {\n for (const chunk of items) {\n const emb = embeddings?.get(chunk.id);\n const embBuffer = emb\n ? Buffer.from(emb.buffer, emb.byteOffset, emb.byteLength)\n : null;\n\n insert.run(\n chunk.id,\n chunk.filePath,\n chunk.startLine,\n chunk.endLine,\n chunk.contentHash,\n chunk.text,\n embBuffer,\n chunk.model ?? null,\n chunk.updatedAt\n );\n }\n });\n\n upsertMany(chunks);\n}\n\n/**\n * Delete all chunks for the given file paths.\n * @param repoRoot - Absolute path to repository root\n * @param filePaths - File paths whose chunks should be removed\n */\nexport function deleteChunksByFilePath(repoRoot: string, filePaths: string[]): void {\n if (filePaths.length === 0) return;\n\n const database = openKnowledgeDb(repoRoot);\n\n const del = database.prepare('DELETE FROM chunks WHERE file_path = ?');\n\n const deleteMany = database.transaction((paths: string[]) => {\n for (const path of paths) {\n del.run(path);\n }\n });\n\n deleteMany(filePaths);\n}\n\n/**\n * Get all distinct file paths currently indexed in the knowledge database.\n * @param repoRoot - Absolute path to repository root\n * @returns Array of file paths\n */\nexport function getIndexedFilePaths(repoRoot: string): string[] {\n const database = openKnowledgeDb(repoRoot);\n\n const rows = database\n .prepare('SELECT DISTINCT file_path FROM chunks')\n .all() as Array<{ file_path: string }>;\n\n return rows.map((r) => r.file_path);\n}\n\n/**\n * Get the last index time from metadata.\n * @param repoRoot - Absolute path to repository root\n * @returns ISO timestamp or null if never indexed\n */\nexport function getLastIndexTime(repoRoot: string): string | null {\n const database = openKnowledgeDb(repoRoot);\n\n const row = database\n .prepare(\"SELECT value FROM metadata WHERE key = 'last_index_time'\")\n .get() as { value: string } | undefined;\n\n return row?.value ?? null;\n}\n\n/**\n * Get total chunk count across all files.\n * @param repoRoot - Absolute path to repository root\n */\nexport function getChunkCount(repoRoot: string): number {\n const database = openKnowledgeDb(repoRoot);\n const row = database.prepare('SELECT COUNT(*) as cnt FROM chunks').get() as { cnt: number };\n return row.cnt;\n}\n\n/**\n * Get chunk count for a specific file path.\n * @param repoRoot - Absolute path to repository root\n * @param filePath - Relative file path\n */\nexport function getChunkCountByFilePath(repoRoot: string, filePath: string): number {\n const database = openKnowledgeDb(repoRoot);\n const row = database\n .prepare('SELECT COUNT(*) as cnt FROM chunks WHERE file_path = ?')\n .get(filePath) as { cnt: number };\n return row.cnt;\n}\n\n/**\n * Set the last index time in metadata.\n * @param repoRoot - Absolute path to repository root\n * @param time - ISO timestamp\n */\nexport function setLastIndexTime(repoRoot: string, time: string): void {\n const database = openKnowledgeDb(repoRoot);\n\n database\n .prepare(\"INSERT OR REPLACE INTO metadata (key, value) VALUES ('last_index_time', ?)\")\n .run(time);\n}\n","/**\n * Knowledge SQLite storage module - documentation chunks with FTS5 search.\n */\n\n// Types\nexport type { KnowledgeChunk, KnowledgeDbOptions, ScoredChunk } from './types.js';\n\n// Connection\nexport { openKnowledgeDb, closeKnowledgeDb, KNOWLEDGE_DB_PATH } from './connection.js';\n\n// Schema\nexport { KNOWLEDGE_SCHEMA_VERSION } from './schema.js';\n\n// Cache\nexport {\n chunkContentHash,\n collectCachedChunkEmbeddings,\n getCachedChunkEmbedding,\n setCachedChunkEmbedding,\n} from './cache.js';\n\n// Search\nexport { searchChunksKeywordScored } from './search.js';\n\n// Sync\nexport {\n upsertChunks,\n deleteChunksByFilePath,\n getIndexedFilePaths,\n getChunkCount,\n getChunkCountByFilePath,\n getLastIndexTime,\n setLastIndexTime,\n} from './sync.js';\n","/**\n * PID-based lock file for embedding processes.\n *\n * Prevents concurrent embedding when background embed (ca init/setup)\n * and post-commit hook run simultaneously.\n *\n * Lock file: {repoRoot}/.claude/.cache/embed.lock\n * Content: { pid: number, startedAt: string } (ISO timestamp)\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\n\ninterface LockAcquired {\n acquired: true;\n release: () => void;\n}\n\ninterface LockBusy {\n acquired: false;\n holder: number;\n}\n\nexport type LockResult = LockAcquired | LockBusy;\n\n/** Max lock age before considered expired (1 hour). */\nconst LOCK_MAX_AGE_MS = 60 * 60 * 1000;\n\ninterface LockContent {\n pid: number;\n startedAt: string;\n}\n\nfunction lockPath(repoRoot: string): string {\n return join(repoRoot, '.claude', '.cache', 'embed.lock');\n}\n\nfunction lockDir(repoRoot: string): string {\n return join(repoRoot, '.claude', '.cache');\n}\n\n/** Check if a process is alive via kill(pid, 0). */\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Read and parse lock file. Returns null on any error or invalid shape. */\nfunction readLock(filePath: string): LockContent | null {\n try {\n const raw = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n if (\n typeof parsed === 'object' && parsed !== null &&\n typeof (parsed as Record<string, unknown>).pid === 'number' &&\n typeof (parsed as Record<string, unknown>).startedAt === 'string'\n ) {\n return parsed as LockContent;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Acquire the embed lock for this process.\n *\n * Uses writeFileSync with 'wx' flag for atomic exclusive creation.\n * On EEXIST: reads holder PID and checks staleness via process.kill(pid, 0).\n * If stale (holder dead): overwrites lock. If alive: returns acquired: false.\n */\nexport function acquireEmbedLock(repoRoot: string): LockResult {\n const dir = lockDir(repoRoot);\n const file = lockPath(repoRoot);\n const content: LockContent = { pid: process.pid, startedAt: new Date().toISOString() };\n\n mkdirSync(dir, { recursive: true });\n\n try {\n writeFileSync(file, JSON.stringify(content), { flag: 'wx' });\n return { acquired: true, release: () => releaseLock(file) };\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;\n\n // Lock file exists -- check if holder is alive and lock is not expired\n const existing = readLock(file);\n if (existing && isProcessAlive(existing.pid)) {\n const lockAge = Date.now() - new Date(existing.startedAt).getTime();\n if (lockAge < LOCK_MAX_AGE_MS) {\n return { acquired: false, holder: existing.pid };\n }\n // Lock expired -- fall through to overwrite\n }\n\n // Stale lock -- delete then re-create atomically with 'wx'\n try { unlinkSync(file); } catch { /* already gone */ }\n try {\n writeFileSync(file, JSON.stringify(content), { flag: 'wx' });\n return { acquired: true, release: () => releaseLock(file) };\n } catch {\n // Another process won the race\n const winner = readLock(file);\n return { acquired: false, holder: winner?.pid ?? -1 };\n }\n }\n}\n\n/** Check if an embed lock is currently held by a live process. */\nexport function isEmbedLocked(repoRoot: string): boolean {\n const file = lockPath(repoRoot);\n if (!existsSync(file)) return false;\n\n const content = readLock(file);\n if (!content) return false;\n\n return isProcessAlive(content.pid);\n}\n\nfunction releaseLock(file: string): void {\n try {\n unlinkSync(file);\n } catch {\n // Silently ignore -- lock may already be removed\n }\n}\n","/**\n * Embedding status file: tracks state of background embedding process.\n *\n * Status file lives at {repoRoot}/.claude/.cache/embed-status.json\n */\n\nimport { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nexport type EmbedStatus =\n | { state: 'idle' }\n | { state: 'running'; startedAt: string }\n | { state: 'completed'; chunksEmbedded: number; completedAt: string; durationMs: number }\n | { state: 'failed'; error: string; durationMs: number };\n\nconst STATUS_FILE = '.claude/.cache/embed-status.json';\n\nfunction statusPath(repoRoot: string): string {\n return join(repoRoot, STATUS_FILE);\n}\n\n/** Write embedding status to disk. Creates parent directories if needed. */\nexport function writeEmbedStatus(repoRoot: string, status: EmbedStatus): void {\n const filePath = statusPath(repoRoot);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, JSON.stringify(status, null, 2), 'utf-8');\n}\n\nconst VALID_STATES = new Set(['idle', 'running', 'completed', 'failed']);\n\n/** Read embedding status from disk. Returns null on missing file, parse error, or invalid shape. */\nexport function readEmbedStatus(repoRoot: string): EmbedStatus | null {\n try {\n const raw = readFileSync(statusPath(repoRoot), 'utf-8');\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (!parsed || typeof parsed !== 'object' || !VALID_STATES.has(parsed.state as string)) {\n return null;\n }\n return parsed as EmbedStatus;\n } catch {\n return null;\n }\n}\n","/**\n * Core embedding function for knowledge chunks.\n *\n * Embeds unembedded (or all) knowledge chunks using the local embedding model.\n * Uses batch embedding and transactional writes for performance.\n */\n\nimport { embedTexts } from '../embeddings/nomic.js';\nimport { openKnowledgeDb } from '../storage/sqlite-knowledge/connection.js';\n\nconst BATCH_SIZE = 16;\n\nexport interface EmbedChunksOptions {\n /** Only embed chunks with no embedding (default: true) */\n onlyMissing?: boolean;\n}\n\nexport interface EmbedChunksResult {\n chunksEmbedded: number;\n chunksSkipped: number;\n durationMs: number;\n}\n\n/**\n * Count chunks that have no embedding stored.\n * @param repoRoot - Absolute path to repository root\n */\nexport function getUnembeddedChunkCount(repoRoot: string): number {\n const db = openKnowledgeDb(repoRoot);\n const row = db\n .prepare('SELECT COUNT(*) as count FROM chunks WHERE embedding IS NULL')\n .get() as { count: number };\n return row.count;\n}\n\n/**\n * Embed knowledge chunks using the local embedding model.\n *\n * Processes chunks in batches of BATCH_SIZE for efficient embedding and\n * wraps each batch's DB writes in a transaction (1 fsync per batch).\n *\n * @param repoRoot - Absolute path to repository root\n * @param options - Embedding options\n * @returns Stats about the embedding run\n */\nexport async function embedChunks(\n repoRoot: string,\n options?: EmbedChunksOptions\n): Promise<EmbedChunksResult> {\n const start = Date.now();\n const onlyMissing = options?.onlyMissing ?? true;\n const db = openKnowledgeDb(repoRoot);\n\n const query = onlyMissing\n ? 'SELECT id, text, content_hash FROM chunks WHERE embedding IS NULL'\n : 'SELECT id, text, content_hash FROM chunks';\n const rows = db\n .prepare(query)\n .all() as Array<{ id: string; text: string; content_hash: string }>;\n\n // Count already-embedded chunks for reporting\n const totalRow = db.prepare('SELECT COUNT(*) as count FROM chunks').get() as { count: number };\n const chunksSkipped = totalRow.count - rows.length;\n\n let chunksEmbedded = 0;\n\n const updateStmt = db.prepare(\n 'UPDATE chunks SET embedding = ?, content_hash = ? WHERE id = ?'\n );\n const writeBatch = db.transaction((batch: Array<{ id: string; content_hash: string; vector: Float32Array }>) => {\n for (const item of batch) {\n const buffer = Buffer.from(item.vector.buffer, item.vector.byteOffset, item.vector.byteLength);\n updateStmt.run(buffer, item.content_hash, item.id);\n }\n });\n\n for (let i = 0; i < rows.length; i += BATCH_SIZE) {\n const batch = rows.slice(i, i + BATCH_SIZE);\n const texts = batch.map(r => r.text);\n const vectors = await embedTexts(texts);\n if (vectors.length !== texts.length) {\n throw new Error(`embedTexts returned ${vectors.length} vectors for ${texts.length} inputs`);\n }\n const enriched = batch.map((r, j) => ({ ...r, vector: vectors[j]! }));\n writeBatch(enriched);\n chunksEmbedded += batch.length;\n }\n\n return {\n chunksEmbedded,\n chunksSkipped,\n durationMs: Date.now() - start,\n };\n}\n","import { extname } from 'node:path';\n\nimport {\n chunkContentHash,\n generateChunkId,\n CODE_EXTENSIONS,\n type Chunk,\n type ChunkOptions,\n} from './types.js';\n\nconst DEFAULT_TARGET_SIZE = 1600;\nconst DEFAULT_OVERLAP_SIZE = 320;\n\n/** Check if content looks binary (contains null bytes). */\nfunction isBinary(content: string): boolean {\n return content.includes('\\0');\n}\n\n/**\n * Split content into logical sections based on file type.\n * Returns arrays of line groups, where each group is an array of\n * { lineNumber (1-indexed), text } objects.\n */\nfunction splitIntoSections(\n fileLines: string[],\n ext: string,\n): { lineNumber: number; text: string }[][] {\n if (ext === '.md') {\n return splitMarkdown(fileLines);\n }\n if (ext === '.rst') {\n return splitParagraphs(fileLines);\n }\n if (CODE_EXTENSIONS.has(ext)) {\n return splitCode(fileLines);\n }\n // Plain text: split on double newlines (paragraph boundaries)\n return splitParagraphs(fileLines);\n}\n\n/**\n * Split markdown into sections at H2+ headers and paragraph boundaries.\n * Keeps fenced code blocks intact.\n */\nfunction splitMarkdown(\n fileLines: string[],\n): { lineNumber: number; text: string }[][] {\n const sections: { lineNumber: number; text: string }[][] = [];\n let current: { lineNumber: number; text: string }[] = [];\n let inCodeBlock = false;\n\n for (let i = 0; i < fileLines.length; i++) {\n const line = fileLines[i]!;\n const lineObj = { lineNumber: i + 1, text: line };\n\n // Track fenced code blocks\n if (line.trimStart().startsWith('```')) {\n inCodeBlock = !inCodeBlock;\n current.push(lineObj);\n continue;\n }\n\n // Split on H2+ headers when not inside code block\n if (!inCodeBlock && /^#{2,}\\s/.test(line) && current.length > 0) {\n sections.push(current);\n current = [lineObj];\n continue;\n }\n\n // Split on blank lines (paragraph boundary) when not in code block\n // A blank line after non-blank content marks a paragraph break\n if (\n !inCodeBlock &&\n line.trim() === '' &&\n current.length > 0 &&\n current.some((l) => l.text.trim() !== '')\n ) {\n // Include this blank line in current section, then start fresh\n current.push(lineObj);\n sections.push(current);\n current = [];\n continue;\n }\n\n current.push(lineObj);\n }\n\n if (current.length > 0) {\n sections.push(current);\n }\n\n return sections;\n}\n\n/** Split code at blank lines between top-level definitions. */\nfunction splitCode(\n fileLines: string[],\n): { lineNumber: number; text: string }[][] {\n const sections: { lineNumber: number; text: string }[][] = [];\n let current: { lineNumber: number; text: string }[] = [];\n\n for (let i = 0; i < fileLines.length; i++) {\n const line = fileLines[i]!;\n const lineObj = { lineNumber: i + 1, text: line };\n\n if (line.trim() === '' && current.length > 0) {\n // Check if there's a next non-blank line (forward scan, no slice copy)\n let hasNextNonBlank = false;\n for (let j = i + 1; j < fileLines.length; j++) {\n if (fileLines[j]!.trim() !== '') {\n hasNextNonBlank = true;\n break;\n }\n }\n if (hasNextNonBlank) {\n sections.push(current);\n current = [lineObj];\n continue;\n }\n }\n\n current.push(lineObj);\n }\n\n if (current.length > 0) {\n sections.push(current);\n }\n\n return sections;\n}\n\n/** Split plain text on paragraph boundaries (blank lines). */\nfunction splitParagraphs(\n fileLines: string[],\n): { lineNumber: number; text: string }[][] {\n const sections: { lineNumber: number; text: string }[][] = [];\n let current: { lineNumber: number; text: string }[] = [];\n\n for (let i = 0; i < fileLines.length; i++) {\n const line = fileLines[i]!;\n const lineObj = { lineNumber: i + 1, text: line };\n\n if (line.trim() === '' && current.length > 0) {\n sections.push(current);\n current = [lineObj];\n continue;\n }\n\n current.push(lineObj);\n }\n\n if (current.length > 0) {\n sections.push(current);\n }\n\n return sections;\n}\n\n/** Get text from a section (array of line objects). */\nfunction sectionText(section: { text: string }[]): string {\n return section.map((l) => l.text).join('\\n');\n}\n\n/**\n * Chunk a file into semantic pieces with overlap.\n *\n * @param filePath - Relative path from repo root\n * @param content - File text content\n * @param options - Chunking options (targetSize, overlapSize)\n * @returns Array of Chunk objects\n */\nexport function chunkFile(\n filePath: string,\n content: string,\n options?: ChunkOptions,\n): Chunk[] {\n // Empty or whitespace-only\n if (content.trim() === '') return [];\n\n // Binary detection\n if (isBinary(content)) return [];\n\n const targetSize = options?.targetSize ?? DEFAULT_TARGET_SIZE;\n const overlapSize = options?.overlapSize ?? DEFAULT_OVERLAP_SIZE;\n\n const fileLines = content.split('\\n');\n const ext = extname(filePath).toLowerCase();\n\n const sections = splitIntoSections(fileLines, ext);\n\n // Merge small sections until reaching targetSize, then emit a chunk\n const chunks: Chunk[] = [];\n let accumulated: { lineNumber: number; text: string }[] = [];\n let accumulatedLength = 0;\n\n function emitChunk(\n lines: { lineNumber: number; text: string }[],\n overlapLines: { lineNumber: number; text: string }[],\n ): { lineNumber: number; text: string }[] {\n if (lines.length === 0) return [];\n\n const allLines = [...overlapLines, ...lines];\n const text = allLines.map((l) => l.text).join('\\n');\n const startLine = allLines[0]!.lineNumber;\n const endLine = allLines[allLines.length - 1]!.lineNumber;\n\n chunks.push({\n id: generateChunkId(filePath, startLine, endLine),\n filePath,\n startLine,\n endLine,\n text,\n contentHash: chunkContentHash(text),\n });\n\n // Compute overlap: take lines from the end of `lines` that fit overlapSize\n if (overlapSize <= 0) return [];\n const overlapResult: { lineNumber: number; text: string }[] = [];\n let overlapLen = 0;\n for (let i = lines.length - 1; i >= 0; i--) {\n const lineLen = lines[i]!.text.length + 1; // +1 for newline\n if (overlapLen + lineLen > overlapSize && overlapResult.length > 0) break;\n overlapResult.unshift(lines[i]!);\n overlapLen += lineLen;\n }\n return overlapResult;\n }\n\n let overlapLines: { lineNumber: number; text: string }[] = [];\n\n for (const section of sections) {\n const sectionLen = sectionText(section).length;\n\n // If adding this section exceeds targetSize and we have accumulated content, emit\n if (accumulatedLength > 0 && accumulatedLength + sectionLen > targetSize) {\n overlapLines = emitChunk(accumulated, overlapLines);\n accumulated = [];\n accumulatedLength = 0;\n }\n\n accumulated.push(...section);\n accumulatedLength += sectionLen;\n\n // If this single section alone exceeds targetSize, emit it immediately\n if (accumulatedLength > targetSize) {\n overlapLines = emitChunk(accumulated, overlapLines);\n accumulated = [];\n accumulatedLength = 0;\n }\n }\n\n // Emit remaining accumulated content\n if (accumulated.length > 0) {\n emitChunk(accumulated, overlapLines);\n }\n\n return chunks;\n}\n","/**\n * Knowledge indexing pipeline.\n *\n * Walks a docs directory, chunks files, embeds chunks (if model available),\n * and stores in the knowledge SQLite database.\n */\n\nimport { createHash } from 'node:crypto';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { extname, join, relative } from 'node:path';\n\nimport {\n openKnowledgeDb,\n} from '../storage/sqlite-knowledge/connection.js';\nimport {\n upsertChunks,\n deleteChunksByFilePath,\n getChunkCountByFilePath,\n getIndexedFilePaths,\n setLastIndexTime,\n} from '../storage/sqlite-knowledge/sync.js';\nimport type { KnowledgeChunk } from '../storage/sqlite-knowledge/types.js';\n\nimport { chunkFile } from './chunking.js';\nimport { SUPPORTED_EXTENSIONS } from './types.js';\n\nexport interface IndexOptions {\n /** Force re-index all files (ignore cache) */\n force?: boolean;\n /** Directory to index (default: 'docs') */\n docsDir?: string;\n /** Embed chunks after indexing (default: false) */\n embed?: boolean;\n}\n\nexport interface IndexResult {\n filesIndexed: number;\n filesSkipped: number;\n filesErrored: number;\n chunksCreated: number;\n chunksDeleted: number;\n chunksEmbedded: number;\n durationMs: number;\n}\n\n/** Compute SHA-256 hash of file content for change detection */\nfunction fileHash(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n/** Build metadata key for file hash */\nfunction fileHashKey(relativePath: string): string {\n return 'file_hash:' + relativePath;\n}\n\n/** Get stored file hash from metadata table */\nfunction getStoredFileHash(repoRoot: string, relativePath: string): string | null {\n const db = openKnowledgeDb(repoRoot);\n const row = db\n .prepare('SELECT value FROM metadata WHERE key = ?')\n .get(fileHashKey(relativePath)) as { value: string } | undefined;\n return row?.value ?? null;\n}\n\n/** Store file hash in metadata table */\nfunction setFileHash(repoRoot: string, relativePath: string, hash: string): void {\n const db = openKnowledgeDb(repoRoot);\n db.prepare('INSERT OR REPLACE INTO metadata (key, value) VALUES (?, ?)')\n .run(fileHashKey(relativePath), hash);\n}\n\n/** Remove file hash from metadata table */\nfunction removeFileHash(repoRoot: string, relativePath: string): void {\n const db = openKnowledgeDb(repoRoot);\n db.prepare('DELETE FROM metadata WHERE key = ?').run(fileHashKey(relativePath));\n}\n\n/** Recursively walk directory and return relative paths of supported files */\nasync function walkSupportedFiles(baseDir: string, repoRoot: string): Promise<string[]> {\n const results: string[] = [];\n\n let entries;\n try {\n entries = await readdir(baseDir, { recursive: true, withFileTypes: true });\n } catch {\n // Directory doesn't exist or can't be read\n return results;\n }\n\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n const ext = extname(entry.name).toLowerCase();\n if (!SUPPORTED_EXTENSIONS.has(ext)) continue;\n\n // Build the full path. With recursive readdir, parentPath gives\n // the directory containing the entry.\n const fullPath = join(entry.parentPath ?? entry.path, entry.name);\n const relPath = relative(repoRoot, fullPath);\n results.push(relPath);\n }\n\n return results;\n}\n\n/**\n * Embed indexed chunks using the local model.\n * Uses dynamic imports to avoid loading llama-cpp when not needed.\n *\n * @throws Error if model is not usable (caller explicitly requested --embed)\n * @returns Number of chunks embedded\n */\nasync function tryEmbedChunks(repoRoot: string): Promise<number> {\n const { isModelUsable } = await import('../embeddings/model.js');\n const usability = await isModelUsable();\n if (!usability.usable) {\n throw new Error(`Embedding failed: ${usability.reason}. ${usability.action}`);\n }\n const { embedChunks } = await import('./embed-chunks.js');\n const embedResult = await embedChunks(repoRoot);\n return embedResult.chunksEmbedded;\n}\n\n/**\n * Index documentation files into the knowledge database.\n *\n * @param repoRoot - Absolute path to repository root\n * @param options - Indexing options\n * @returns Statistics about the indexing operation\n */\nexport async function indexDocs(\n repoRoot: string,\n options: IndexOptions = {},\n): Promise<IndexResult> {\n const start = Date.now();\n const docsDir = options.docsDir ?? 'docs';\n const force = options.force ?? false;\n\n const stats: IndexResult = {\n filesIndexed: 0,\n filesSkipped: 0,\n filesErrored: 0,\n chunksCreated: 0,\n chunksDeleted: 0,\n chunksEmbedded: 0,\n durationMs: 0,\n };\n\n const docsPath = join(repoRoot, docsDir);\n const filePaths = await walkSupportedFiles(docsPath, repoRoot);\n\n // Process each file\n for (const relPath of filePaths) {\n const fullPath = join(repoRoot, relPath);\n let content: string;\n try {\n content = await readFile(fullPath, 'utf-8');\n } catch {\n stats.filesErrored++;\n continue;\n }\n\n const hash = fileHash(content);\n const storedHash = getStoredFileHash(repoRoot, relPath);\n\n // Skip if unchanged and not forced\n if (!force && storedHash === hash) {\n stats.filesSkipped++;\n continue;\n }\n\n // Chunk the file\n const chunks = chunkFile(relPath, content);\n\n // Convert to KnowledgeChunk format\n const now = new Date().toISOString();\n const knowledgeChunks: KnowledgeChunk[] = chunks.map((chunk) => ({\n id: chunk.id,\n filePath: chunk.filePath,\n startLine: chunk.startLine,\n endLine: chunk.endLine,\n contentHash: chunk.contentHash,\n text: chunk.text,\n updatedAt: now,\n }));\n\n // Atomically replace chunks for this file\n const db = openKnowledgeDb(repoRoot);\n db.transaction(() => {\n deleteChunksByFilePath(repoRoot, [relPath]);\n if (knowledgeChunks.length > 0) {\n upsertChunks(repoRoot, knowledgeChunks);\n }\n setFileHash(repoRoot, relPath, hash);\n })();\n\n stats.filesIndexed++;\n stats.chunksCreated += knowledgeChunks.length;\n }\n\n // Clean up stale files: find DB paths not in current file set\n const indexedPaths = getIndexedFilePaths(repoRoot);\n const currentPathSet = new Set(filePaths);\n const stalePaths = indexedPaths.filter((p) => !currentPathSet.has(p));\n\n if (stalePaths.length > 0) {\n // Count chunks that will be deleted\n for (const path of stalePaths) {\n stats.chunksDeleted += getChunkCountByFilePath(repoRoot, path);\n }\n\n deleteChunksByFilePath(repoRoot, stalePaths);\n\n // Clean up file hashes for stale files\n for (const path of stalePaths) {\n removeFileHash(repoRoot, path);\n }\n }\n\n // Update last index time\n setLastIndexTime(repoRoot, new Date().toISOString());\n\n // Embed chunks if requested\n if (options.embed) {\n stats.chunksEmbedded = await tryEmbedChunks(repoRoot);\n }\n\n stats.durationMs = Date.now() - start;\n return stats;\n}\n","/**\n * Background embedding: spawn a detached worker or run embedding in-process.\n *\n * spawnBackgroundEmbed(repoRoot) - spawns detached child process (sync, non-blocking)\n * runBackgroundEmbed(repoRoot) - worker entry point that does the actual embedding\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isModelAvailable, withEmbedding } from '../embeddings/index.js';\nimport { closeKnowledgeDb } from '../storage/sqlite-knowledge/index.js';\nimport { acquireEmbedLock, isEmbedLocked } from './embed-lock.js';\nimport { writeEmbedStatus } from './embed-status.js';\nimport { embedChunks, getUnembeddedChunkCount } from './embed-chunks.js';\n\nexport interface SpawnEmbedResult {\n spawned: boolean;\n reason?: string;\n pid?: number;\n}\n\n/**\n * Resolve the CLI entry point for spawning the embed-worker subprocess.\n *\n * Strategy: walk up from this module to find dist/cli.js (works in both\n * bundled output and dev). Falls back to npx ca if not found.\n */\nfunction resolveCliInvocation(): { command: string; args: string[] } {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 10; i++) {\n const candidate = join(dir, 'dist', 'cli.js');\n if (existsSync(candidate)) {\n return { command: process.execPath, args: [candidate] };\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return { command: 'npx', args: ['ca'] };\n}\n\n/**\n * Spawn a detached background process to embed chunks.\n * Synchronous -- fires and forgets.\n *\n * Pre-flight checks (lock, model, count) are advisory only. The worker\n * acquires its own lock, so TOCTOU here cannot cause double-embedding --\n * at worst we spawn a worker that exits immediately.\n */\nexport function spawnBackgroundEmbed(repoRoot: string): SpawnEmbedResult {\n if (isEmbedLocked(repoRoot)) {\n return { spawned: false, reason: 'Embedding already in progress' };\n }\n if (!isModelAvailable()) {\n return { spawned: false, reason: 'Model not available' };\n }\n if (getUnembeddedChunkCount(repoRoot) === 0) {\n return { spawned: false, reason: 'All chunks already embedded' };\n }\n\n const cli = resolveCliInvocation();\n const child = spawn(cli.command, [...cli.args, 'embed-worker', repoRoot], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n\n return { spawned: true, pid: child.pid };\n}\n\n/**\n * Worker entry point: acquire lock, embed chunks, write status, clean up.\n */\nexport async function runBackgroundEmbed(repoRoot: string): Promise<void> {\n const lock = acquireEmbedLock(repoRoot);\n if (!lock.acquired) return;\n\n // Open DB after lock to avoid leaking connection on contention\n const { openKnowledgeDb } = await import('../storage/sqlite-knowledge/index.js');\n openKnowledgeDb(repoRoot);\n\n const start = Date.now();\n writeEmbedStatus(repoRoot, { state: 'running', startedAt: new Date().toISOString() });\n\n try {\n const result = await withEmbedding(async () => embedChunks(repoRoot, { onlyMissing: true }));\n writeEmbedStatus(repoRoot, {\n state: 'completed',\n chunksEmbedded: result.chunksEmbedded,\n completedAt: new Date().toISOString(),\n durationMs: result.durationMs,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n writeEmbedStatus(repoRoot, {\n state: 'failed',\n error: msg,\n durationMs: Date.now() - start,\n });\n } finally {\n closeKnowledgeDb();\n lock.release();\n }\n}\n\n/**\n * Index docs/ and spawn background embedding if docs/ exists.\n * Shared helper for init and setup commands.\n *\n * @returns SpawnEmbedResult or null if docs/ doesn't exist\n */\nexport async function indexAndSpawnEmbed(repoRoot: string): Promise<SpawnEmbedResult | null> {\n const docsPath = join(repoRoot, 'docs');\n if (!existsSync(docsPath)) return null;\n const { indexDocs } = await import('./indexing.js');\n await indexDocs(repoRoot);\n return spawnBackgroundEmbed(repoRoot);\n}\n","/**\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/** Extract the short suffix from a full beads ID (e.g., 'learning_agent-b8c' → 'b8c'). */\nexport function shortId(fullId: string): string {\n return fullId.replace(/^[^-]+-/, '');\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 * 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, isModelAvailable, withEmbedding } 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 // Pre-flight check: model file exists (lightweight, no native allocation)\n if (!isModelAvailable()) {\n console.error('Error: Embedding model not found');\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 let embeddings: Float32Array[];\n try {\n embeddings = await withEmbedding(async () => {\n const vecs: Float32Array[] = [];\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 vecs.push(vec);\n }\n return vecs;\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 * 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, printSqliteStatus, 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 { installGeminiAdapter } from './gemini.js';\nimport { installPreCommitHook, installPostCommitHook, type HookInstallResult } from './hooks.js';\nimport {\n createPluginManifest,\n ensureClaudeMdReference,\n ensurePnpmBuildConfig,\n GENERATED_MARKER,\n installAgentRoleSkills,\n installAgentTemplates,\n installDocTemplates,\n installPhaseSkills,\n installResearchDocs,\n installWorkflowCommands,\n updateAgentsMd,\n verifySqlite,\n type PnpmConfigResult,\n type SqliteVerifyResult,\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 postCommitHook: HookInstallResult['status'] | 'skipped';\n model: 'downloaded' | 'already_exists' | 'failed' | 'skipped';\n pnpmConfig: PnpmConfigResult;\n sqlite: SqliteVerifyResult;\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 // 0b. Verify SQLite loads (auto-rebuild if needed for pnpm)\n const sqlite = verifySqlite(repoRoot, pnpmConfig);\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 // 9b. Install research docs\n await installResearchDocs(repoRoot);\n\n // 9c. Clean deprecated paths from prior versions\n await cleanDeprecatedPaths(repoRoot, false);\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 // 10b. Install post-commit git hook (auto-indexes docs/)\n let postCommitHook: HookInstallResult['status'] | 'skipped' = 'skipped';\n if (!options.skipHooks) {\n postCommitHook = (await installPostCommitHook(repoRoot)).status;\n }\n\n // 11. Configure Claude settings (hooks in settings.json)\n const { hooks } = await configureClaudeSettings();\n\n // 11b. Install Gemini CLI compatibility hooks\n await installGeminiAdapter({ dryRun: false, json: true });\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 // 14. Trigger background embedding if docs/ exists and model available\n if (modelStatus === 'downloaded' || modelStatus === 'already_exists') {\n try {\n const { indexAndSpawnEmbed } = await import('../memory/knowledge/embed-background.js');\n const spawnResult = await indexAndSpawnEmbed(repoRoot);\n if (spawnResult?.spawned) {\n out.info('Embedding in progress (background). You can start working.');\n }\n } catch {\n // Non-fatal: don't break setup if background embedding fails to spawn\n }\n }\n\n return {\n lessonsDir,\n agentsMd: agentsMdUpdated,\n hooks,\n gitHooks,\n postCommitHook,\n model: modelStatus,\n pnpmConfig,\n sqlite,\n beads,\n scope,\n upgrade,\n gitignore,\n };\n}\n\n\n/** Paths deprecated since v1.5 (worktree feature removed — superseded by Claude Code native worktrees). */\nconst DEPRECATED_PATHS = [\n ['.claude', 'skills', 'compound', 'set-worktree'],\n ['.claude', 'commands', 'compound', 'set-worktree.md'],\n ['.gemini', 'skills', 'compound-set-worktree'],\n ['.gemini', 'commands', 'compound', 'set-worktree.toml'],\n];\n\nasync function cleanDeprecatedPaths(repoRoot: string, dryRun: boolean): Promise<number> {\n let count = 0;\n for (const segments of DEPRECATED_PATHS) {\n const fullPath = join(repoRoot, ...segments);\n if (existsSync(fullPath)) {\n const rel = segments.join('/');\n if (!dryRun) {\n await rm(fullPath, { recursive: true, force: true });\n console.log(` Removed deprecated: ${rel}`);\n } else {\n console.log(` [dry-run] Would remove deprecated: ${rel}`);\n }\n count++;\n }\n }\n return count;\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 if (!dryRun) await installResearchDocs(repoRoot, { force: true });\n\n // Migration: clean up legacy root-level slash commands (v1.0; only marker-tagged files)\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 deprecated worktree files (superseded by Claude Code native worktrees)\n updated += await cleanDeprecatedPaths(repoRoot, dryRun);\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 await installGeminiAdapter({ dryRun: false, json: true });\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 POST_COMMIT_STATUS_MSG: Record<string, string> = {\n skipped: 'Skipped (--skip-hooks)',\n not_git_repo: 'Skipped (not a git repository)',\n installed: 'Installed (auto-indexes docs/ on commit)',\n appended: 'Appended to existing post-commit hook',\n already_installed: 'Already configured',\n};\n\nfunction printPostCommitHookStatus(status: HookInstallResult['status'] | 'skipped'): void {\n console.log(` Post-commit hook: ${POST_COMMIT_STATUS_MSG[status]}`);\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 printPostCommitHookStatus(result.postCommitHook);\n printPnpmConfigStatus(result.pnpmConfig);\n printSqliteStatus(result.sqlite);\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 * 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.replace(/\"/g, '`\"')}\").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('error', () => {\n // Audio player not found (e.g. aplay missing on headless Linux).\n // Silently clean up — audio is non-essential.\n try { unlinkSync(tmpPath); } catch { /* ignore */ }\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).\\nInstall: curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash\\nOr run: ca install-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 * Templates and constants for setup commands.\n */\n\nimport { VERSION } from '../version.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// Post-Commit Hook Constants\n// ============================================================================\n\n/**\n * Post-commit hook shell script template.\n *\n * Design: indexes only (no --embed). Embedding happens lazily via\n * background embed during init/setup. This keeps commits fast.\n */\nexport const POST_COMMIT_HOOK_TEMPLATE = `#!/bin/sh\n# Compound Agent post-commit hook\n# Auto-indexes docs/ when documentation files change\n# Note: indexes only (no --embed) -- embedding runs lazily via init/setup\n\n# Check if any docs/ files were modified in this commit\nif git diff-tree --no-commit-id --name-only -r HEAD | grep -q '^docs/'; then\n npx ca -q index-docs 2>/dev/null &\nfi\n`;\n\n/** Marker comment for post-commit hook idempotency */\nexport const POST_COMMIT_HOOK_MARKER = '# Compound Agent post-commit hook';\n\n/** Block to insert into existing post-commit hooks */\nexport const COMPOUND_AGENT_POST_COMMIT_BLOCK = `\n# Compound Agent post-commit hook (appended)\nif git diff-tree --no-commit-id --name-only -r HEAD | grep -q '^docs/'; then\n npx ca -q index-docs 2>/dev/null &\nfi\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 'ca index-docs',\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\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 - MUST call before architectural decisions; use anytime you need context |\n| \\`npx ca knowledge \"query\"\\` | Semantic search over project docs - MUST call before architectural decisions; use keyword phrases, not questions |\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\\` and \\`npx ca knowledge\\` 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\nBeyond mandatory triggers, use these commands freely — they are lightweight queries, not heavyweight operations. Uncertain about a pattern? \\`ca search\\`. Need a detail from the docs? \\`ca knowledge\\`. The cost of an unnecessary search is near-zero; the cost of a missed one can be hours.\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 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 * 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 { ensureSqliteAvailable } from '../memory/storage/index.js';\nimport type { GitignoreResult } from './gitignore.js';\nimport type { HookInstallResult } from './hooks.js';\nimport type { PnpmConfigResult, SqliteVerifyResult } 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\nconst SQLITE_STATUS_MSG: Record<SqliteVerifyResult['action'], string> = {\n already_ok: 'OK',\n rebuilt: 'OK (rebuilt native module)',\n installed_and_rebuilt: 'OK (installed + rebuilt native module)',\n failed: 'FAILED',\n};\n\nexport function printSqliteStatus(result: SqliteVerifyResult): void {\n const msg = SQLITE_STATUS_MSG[result.action];\n console.log(` SQLite: ${msg}`);\n if (result.error) {\n console.log(` ${result.error}`);\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 } else if (check.healthMessage) {\n console.log(` ${check.healthMessage}`);\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 let sqliteOk = false;\n try {\n ensureSqliteAvailable();\n sqliteOk = true;\n } catch { /* not loadable */ }\n console.log(` SQLite: ${sqliteOk ? 'OK' : 'not available (run: pnpm rebuild better-sqlite3)'}`);\n\n const fullBeads = runFullBeadsCheck(repoRoot);\n printBeadsFullStatus(fullBeads);\n const scope = checkUserScope(repoRoot);\n printScopeStatus(scope);\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 * .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/', '.claude/.ca-*.json'];\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 let newContent: string;\n const sectionIdx = lines.findIndex(l => l.trim() === SECTION_COMMENT);\n\n if (sectionIdx >= 0) {\n // Append to existing section: find last contiguous non-empty pattern line after the comment\n let insertAfter = sectionIdx;\n for (let i = sectionIdx + 1; i < lines.length; i++) {\n const line = lines[i];\n if (line === undefined) break;\n const trimmed = line.trim();\n if (trimmed === '' || trimmed.startsWith('#')) break;\n insertAfter = i;\n }\n lines.splice(insertAfter + 1, 0, ...missing);\n newContent = lines.join('\\n');\n } else {\n const section = [SECTION_COMMENT, ...missing].join('\\n');\n const separator = content.length > 0 && !content.endsWith('\\n') ? '\\n\\n' : content.length > 0 ? '\\n' : '';\n newContent = content + separator + section + '\\n';\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 * 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 * Lessons-related agent templates.\n *\n * Agents for lesson management tasks (review, cleanup, lint graduation).\n */\n\nexport const LESSONS_AGENT_TEMPLATES: Record<string, string> = {\n 'lessons-reviewer.md': `---\nname: Lessons Reviewer\ndescription: Reviews flagged lesson pairs for duplicates, refinements, and contradictions. Proposes cleanup actions.\nmodel: sonnet\n---\n\n# Lessons Reviewer\n\nAnalyze flagged lesson pairs from \\`npx ca clean-lessons\\` output.\n\nFor each pair, classify as one of:\n- **Duplicate**: Nearly identical — propose merging into one lesson\n- **Refinement**: One supersedes the other — propose supersedes link\n- **Contradiction**: Conflicting advice — flag for human review\n- **Complementary**: Related but distinct — propose related links, keep both\n\nOutput a structured action plan with specific \\`npx ca\\` commands to execute.\n`,\n\n 'lint-classifier.md': `---\nname: Lint Classifier\ndescription: Classifies compound phase insights as lintable or semantic-only, creating beads tasks for mechanically-enforceable patterns\nmodel: sonnet\n---\n\n# Lint Classifier\n\nClassify each insight from the compound phase as LINTABLE, PARTIAL, or NOT_LINTABLE. For LINTABLE insights with HIGH confidence, create beads tasks describing lint rules to implement.\n\n## Input\n\nYou receive insights via SendMessage from the compound lead. Each message contains:\n- \\`id\\`: The lesson ID (e.g., \\`Laa504c6880ba5d41\\`)\n- \\`insight\\`: The verbatim insight text\n- \\`severity\\`: high, medium, or low\n\nIf no insights are provided via message, read the last 10 entries from \\`.claude/lessons/index.jsonl\\` (each line is a JSON object; parse and reverse to get newest-first, take up to 10).\n\n## Classification Definition\n\nAn insight is **LINTABLE** if and only if:\n- It describes a property determinable from source code alone (text, tokens, AST nodes, import paths, file names)\n- The check would return a deterministic yes/no without running the program\n- The bad pattern can be expressed as a regex, AST selector, or import constraint\n- It does NOT require: runtime state, human intent, cross-session history, deployment processes, or semantic meaning\n\n## Classes\n\n| Class | Meaning |\n|-------|---------|\n| LINTABLE | Check can be written as regex / AST / import rule |\n| PARTIAL | A subset is lintable; the rest is process/semantic |\n| NOT_LINTABLE | Requires runtime state, process knowledge, or human judgment |\n\n## Confidence Levels\n\n| Level | Definition |\n|-------|-----------|\n| HIGH | Named code construct + prohibitive imperative. Check is unambiguous. |\n| MEDIUM | Pattern is conditional on context, or needs AST analysis. |\n| LOW | Genuinely ambiguous. Flag for human review. |\n\n## Few-Shot Examples\n\n**Example 1** -- LINTABLE, HIGH\n> \"Use isModelAvailable() instead of isModelUsable() in hot paths\"\n- Reasoning: Named function substitution. Can detect \\`isModelUsable(\\` via regex in \\`src/**/*.ts\\`.\n- VERDICT: LINTABLE | CONFIDENCE: HIGH | CHECK_TYPE: file-pattern\n\n**Example 2** -- LINTABLE, HIGH\n> \"Never use if(condition){expect()} in tests\"\n- Reasoning: Structural pattern. Detect IfStatement containing expect() call via AST visitor.\n- VERDICT: LINTABLE | CONFIDENCE: HIGH | CHECK_TYPE: ast\n\n**Example 3** -- PARTIAL, HIGH\n> \"When adding new hook types, update ALL user-facing output to include the complete set\"\n- Reasoning: Can detect hardcoded hook-type arrays in known files (lintable subset). Cannot verify \"all\" surfaces were updated (process). The detectable part is unambiguous.\n- VERDICT: PARTIAL | CONFIDENCE: HIGH | CHECK_TYPE: file-pattern\n\n**Example 4** -- PARTIAL, MEDIUM\n> \"Update ALL output surfaces when adding hook types\"\n- Reasoning: Can check for hardcoded hook-type lists in known files (partial). Cannot verify \"all\" surfaces were updated (process). Context-dependent which files to check.\n- VERDICT: PARTIAL | CONFIDENCE: MEDIUM | CHECK_TYPE: file-pattern\n\n**Example 5** -- NOT_LINTABLE, HIGH\n> \"Inlining phase instructions causes context drift under compaction\"\n- Reasoning: Describes a runtime/architectural effect. No code pattern to match.\n- VERDICT: NOT_LINTABLE | CONFIDENCE: HIGH | CHECK_TYPE: N/A\n\n**Example 6** -- NOT_LINTABLE, HIGH\n> \"Always verify git diff after subagent completes\"\n- Reasoning: Human process step. Cannot be detected from source code.\n- VERDICT: NOT_LINTABLE | CONFIDENCE: HIGH | CHECK_TYPE: N/A\n\n**Example 7** -- LINTABLE, LOW\n> \"Avoid complex nested callbacks in async code\"\n- Reasoning: \"Complex\" and \"nested\" are subjective. Could write a nesting-depth check but threshold is arbitrary. Genuinely ambiguous.\n- VERDICT: LINTABLE | CONFIDENCE: LOW | CHECK_TYPE: ast\n\n## Classification Procedure\n\nFor each insight, reason step by step then output:\n\n\\`\\`\\`\nVERDICT: [LINTABLE|PARTIAL|NOT_LINTABLE]\nCONFIDENCE: [HIGH|MEDIUM|LOW]\nCHECK_TYPE: [file-pattern|file-size|script|ast|N/A]\nRULE_CLASS: [A|B|N/A]\nRATIONALE: One sentence summary\n\\`\\`\\`\n\n### Rule Classes\n\n- **Class A** (native \\`rules.json\\`): The check can be expressed as a regex/glob (\\`file-pattern\\`), line count (\\`file-size\\`), or shell command (\\`script\\`). These map directly to the compound-agent rule engine. No external linter needed.\n- **Class B** (external linter): The check requires AST analysis or linter-specific features. Targets the user's detected linter (ESLint, Ruff, ast-grep, etc.).\n\nCHECK_TYPE must be one of: \\`file-pattern\\`, \\`file-size\\`, \\`script\\` (Class A -- maps to compound-agent rule engine), \\`ast\\` (Class B -- requires external linter), or \\`N/A\\` (not lintable).\n\n## Routing Rules\n\n| Classification | Action |\n|---------------|--------|\n| LINTABLE + HIGH | Create beads task under \"Linting Improvement\" epic |\n| LINTABLE + MEDIUM or PARTIAL + HIGH | Create a follow-up beads task noting the partial lintability for manual triage |\n| NOT_LINTABLE or LOW confidence | No additional action (lesson already stored by compound flow) |\n\nFor LINTABLE + MEDIUM or PARTIAL + HIGH, create a triage task:\n\\`\\`\\`bash\nbd create --title=\"Triage: potentially-lintable lesson <lesson-id>\" --type=task --priority=3 --description=\"Lesson <lesson-id>: <insight>\\\\n\\\\nVerdict: <LINTABLE/PARTIAL> | Confidence: <MEDIUM/HIGH>\\\\nReason lintability is uncertain: <rationale>\"\n\\`\\`\\`\n\n**Critical**: ALL insights are already stored as lessons by the compound pipeline (step 8). Lint task creation is purely additive. Do not re-store or modify existing lessons.\n\n## Linter Detection\n\nBefore creating Class B tasks, detect the project's linter by checking the repo root for config files (first match wins):\n\n1. \\`eslint.config.*\\` / \\`.eslintrc.*\\` -> eslint\n2. \\`ruff.toml\\` / \\`.ruff.toml\\` / \\`pyproject.toml\\` with \\`[tool.ruff]\\` -> ruff\n3. \\`clippy.toml\\` / \\`.clippy.toml\\` -> clippy\n4. \\`.golangci.yml\\` / \\`.golangci.yaml\\` -> golangci-lint\n5. \\`sgconfig.yml\\` -> ast-grep\n6. \\`.semgrep.yml\\` / \\`.semgrep.yaml\\` -> semgrep\n\n**When no linter is detected**: For Class A rules, proceed normally (they use the native rule engine). For Class B rules, set target to \\`ast-grep\\` or \\`semgrep\\` as universal YAML-based fallbacks and note that no project linter was detected.\n\n## Task Creation\n\nFor each LINTABLE + HIGH insight, run:\n\n\\`\\`\\`bash\nbd create --title=\"Lint Rule: <rule-id> (from <lesson-id>)\" --type=task --priority=<N> --description=\"<structured markdown>\"\n\\`\\`\\`\n\n### Description structure (Class A -- native rule engine):\n\n\\`\\`\\`markdown\n## Source Lesson\nID: <lesson-id>\nInsight: <verbatim insight text>\n\n## Rule Identity\n- ID: <kebab-case-rule-id>\n- Class: A (native rule engine)\n- Severity: <error|warning|info>\n- Scope: <glob pattern for affected files>\n\n## Detection Spec\nCheck type: <file-pattern|file-size|script>\nGlob: <glob pattern>\nPattern: <regex> (for file-pattern)\nmustMatch: <true|false>\n\n## Violation Message\n<What the developer sees. Under 3 lines. Imperative mood.>\n<Must answer: what violated, how to fix.>\n\n## Remediation\n<Concrete fix instruction.>\n\n## Code Examples\nBad:\n <code that violates>\n\nGood:\n <code that follows the rule>\n\\`\\`\\`\n\n### Description structure (Class B -- external linter):\n\n\\`\\`\\`markdown\n## Source Lesson\nID: <lesson-id>\nInsight: <verbatim insight text>\n\n## Rule Identity\n- ID: <kebab-case-rule-id>\n- Class: B (external linter)\n- Target: <detected linter>\n- Severity: <error|warning|info>\n- Scope: <glob pattern for affected files>\n\n## Detection Spec\n<Natural language description of AST pattern>\n<Suggested selector or rule YAML -- mark \"suggested, verify before use\">\n\n## Violation Message\n<What the developer sees. Under 3 lines. Imperative mood.>\n<Must answer: what violated, how to fix.>\n\n## Remediation\n<Concrete fix instruction.>\n\n## Code Examples\nBad:\n <code that violates>\n\nGood:\n <code that follows the rule>\n\\`\\`\\`\n\n### Priority mapping: lesson severity high->1, medium->2, low->3 (default: 2)\n\n## Epic Management\n\n1. Check if a \"Linting Improvement\" epic exists: \\`bd search \"Linting Improvement\"\\`\n2. If not found, create: \\`bd create --title=\"Linting Improvement\" --type=epic --priority=2 --description=\"Epic for lint rules graduated from compound phase lessons.\"\\`\n3. Link tasks to the epic: \\`bd dep add <epic-id> <task-id>\\` (epic blocks the task)\n\n**Important**: Use \\`bd dep add <epic-id> <task-id>\\` (epic first), NOT \\`<task-id> <epic-id>\\`. The epic blocks the tasks, not the other way around.\n\n## Constraints\n\n- AST selectors are suggestions only -- mark as \"suggested, verify before use\"\n- Never skip classification for any insight\n- Do not modify the existing lesson capture flow\n- CHECK_TYPE must map to an actual engine type (\\`file-pattern\\`, \\`file-size\\`, \\`script\\`) for Class A, or \\`ast\\` for Class B\n- Report a summary at the end: N insights classified, X lintable (Y Class A, Z Class B), T tasks created\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/spec-dev 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 (2 templates)\n * - agents-phase11.ts: Phase 11 intelligent compounding agents (4 templates)\n */\n\nimport { EXTERNAL_AGENT_TEMPLATES } from './agents-external.js';\nimport { LESSONS_AGENT_TEMPLATES } from './agents-lessons.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 ...LESSONS_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## Literature\n- Consult \\`docs/compound/research/learning-systems/\\` for knowledge compounding theory and context analysis methodology\n- Run \\`npx ca knowledge \"context analysis work review\"\\` for indexed knowledge\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## Literature\n- Consult \\`docs/compound/research/learning-systems/\\` for lesson extraction methodology and knowledge representation\n- Run \\`npx ca knowledge \"lesson extraction knowledge management\"\\` for indexed knowledge\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## Literature\n- Consult \\`docs/compound/research/learning-systems/\\` for deduplication strategies and knowledge graph methodology\n- Run \\`npx ca knowledge \"pattern matching deduplication\"\\` for indexed knowledge\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## Literature\n- Consult \\`docs/compound/research/learning-systems/\\` for knowledge representation and lesson schema design\n- Run \\`npx ca knowledge \"knowledge storage representation\"\\` for indexed knowledge\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## Literature\n- Consult \\`docs/compound/research/tdd/\\` for test-first development evidence and methodology\n- Run \\`npx ca knowledge \"TDD test design\"\\` for indexed knowledge on testing patterns\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## Literature\n- Consult \\`docs/compound/research/tdd/\\` for TDD green-phase methodology and minimal implementation strategies\n- Run \\`npx ca knowledge \"TDD implementation\"\\` for indexed knowledge on implementation patterns\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","/* eslint-disable max-lines -- template data file; each skill is a multiline string constant */\n/**\n * Review agent role skills for the plan, spec-dev, and review phases.\n *\n * 2 research subagents + 6 specialized reviewers + 5 security specialists = 13 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 **spec-dev** 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 **spec-dev** 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: Mandatory core-4 reviewer with P0-P3 severity classification and specialist escalation\n---\n\n# Security Reviewer\n\n## Role\nMandatory core-4 reviewer responsible for identifying security vulnerabilities using P0-P3 severity classification. Has authority to escalate findings to specialist security skills for deep analysis.\n\n## Instructions\n1. Read \\`docs/compound/research/security/overview.md\\` for severity classification and escalation triggers\n2. Read all changed files completely, focusing on:\n - Input handling and data flow to interpreters (SQL, shell, HTML, templates)\n - Secrets and credential management\n - Authentication and authorization enforcement\n - Logging and error handling for data exposure\n - Dependency changes in lockfiles or manifests\n3. Classify each finding using P0-P3 severity:\n - **P0**: Unauthenticated RCE, credential compromise, unauth data access (blocks merge)\n - **P1**: Authenticated exploit, limited data breach, missing auth on sensitive routes (requires ack)\n - **P2**: Medium impact, harder to exploit, missing hardening (should fix)\n - **P3**: Best practice, defense in depth, code hygiene (nice to have)\n4. Escalate to specialist skills when deep analysis needed:\n - SQL/command concat or template interpolation -> \\`/security-injection\\`\n - Hardcoded strings matching key patterns, committed .env files -> \\`/security-secrets\\`\n - Route handlers missing auth middleware, IDOR patterns -> \\`/security-auth\\`\n - Logging calls with request objects, verbose error responses -> \\`/security-data\\`\n - Lockfile changes, new dependencies, postinstall scripts -> \\`/security-deps\\`\n5. For large diffs, spawn opus subagents to review different file groups in parallel. Merge findings and deduplicate.\n\n## Literature\n- Consult \\`docs/compound/research/security/overview.md\\` for severity classification and OWASP mapping\n- Consult \\`docs/compound/research/security/injection-patterns.md\\` for injection detection heuristics\n- Consult \\`docs/compound/research/security/secrets-checklist.md\\` for secret format patterns\n- Consult \\`docs/compound/research/security/auth-patterns.md\\` for auth/authz audit methodology\n- Consult \\`docs/compound/research/security/data-exposure.md\\` for data leak detection\n- Consult \\`docs/compound/research/security/dependency-security.md\\` for dependency risk assessment\n- Consult \\`docs/compound/research/security/secure-coding-failure.md\\` for full theoretical foundation\n- Run \\`npx ca knowledge \"security review OWASP\"\\` for indexed security knowledge\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. Escalate to specialist skills via SendMessage when deep analysis needed.\n\n## Deployment\nAgentTeam member in the **review** phase. Spawned via TeamCreate. Communicate with teammates via SendMessage.\n\n## Output Format\nReturn findings classified by severity:\n- **P0** (BLOCKS MERGE): Must fix before merge, no exceptions\n- **P1** (REQUIRES ACK): Must acknowledge or fix before merge\n- **P2** (SHOULD FIX): Should fix, create beads issue if deferred\n- **P3** (NICE TO HAVE): Best practice suggestion, non-blocking\n\nIf no findings at any severity: return \"SECURITY REVIEW: CLEAR -- No findings at any severity level.\"\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## Literature\n- Consult \\`docs/compound/research/code-review/\\` for systematic review methodology and architectural assessment frameworks\n- Run \\`npx ca knowledge \"architecture module design\"\\` for indexed knowledge on design patterns\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## Literature\n- Consult \\`docs/compound/research/code-review/\\` for systematic performance analysis frameworks\n- Run \\`npx ca knowledge \"performance review\"\\` for indexed knowledge on performance patterns\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## Literature\n- Consult \\`docs/compound/research/tdd/\\` for test quality assessment and coverage methodology\n- Consult \\`docs/compound/research/property-testing/\\` for property-based testing theory\n- Run \\`npx ca knowledge \"test coverage quality\"\\` for indexed knowledge\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## Literature\n- Consult \\`docs/compound/research/code-review/\\` for over-engineering detection and YAGNI assessment methodology\n- Run \\`npx ca knowledge \"simplicity over-engineering\"\\` for indexed knowledge\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 'scenario-coverage-reviewer': `---\nname: Scenario Coverage Reviewer\ndescription: Heuristic review of test coverage against spec-derived scenario tables\n---\n\n# Scenario Coverage Reviewer\n\n## Role\nVerify that test files cover the scenarios defined in the beads epic's scenario table. Uses heuristic AI-driven matching -- not mechanical traceability.\n\n## Instructions\n1. Read the epic description (\\`bd show <epic>\\`) and extract the scenario table\n2. Read all test files in the diff\n3. For each scenario row (S1, S2...), heuristically match against test cases:\n - Match by precondition + trigger + expected outcome similarity\n - A test covers a scenario if it exercises the same logical path, even with different naming\n - Accept property-based tests as covering multiple boundary/combinatorial scenarios\n4. Flag uncovered scenarios as **P1** findings: \\`SCENARIO_GAP: S<id> (<category>) -- <description>\\`\n5. For partially covered scenarios (trigger tested but outcome not asserted), flag as **P2**\n6. Report a coverage summary: \\`X/Y scenarios covered (Z%)\\`\n\n## Matching Heuristics\n- **happy**: tests exercising the main success path\n- **error**: tests with error triggers, rejection assertions, or exception expectations\n- **boundary**: tests with min/max/edge values or property tests with constrained generators\n- **combinatorial**: parameterized tests, table-driven tests, or pairwise property tests\n- **adversarial**: tests with invalid input, malformed data, or security-focused assertions\n\n## Collaboration\nShare findings via SendMessage: uncovered security scenarios go to security-reviewer; uncovered boundary scenarios go to test-coverage-reviewer.\n\n## Deployment\nAgentTeam member in the **review** phase. Medium tier -- spawned for diffs >100 lines. Communicate with teammates via SendMessage.\n\n## Output Format\n- **SCENARIO_GAP**: Scenario has no corresponding test (P1)\n- **PARTIAL**: Scenario partially covered (P2)\n- **COVERED**: Scenario adequately covered\n- **SUMMARY**: \\`X/Y scenarios covered (Z%)\\`\n`,\n\n 'security-injection': `---\nname: Security Injection Specialist\ndescription: Deep trace analysis for SQL, command, XSS, SSRF, and SSTI injection vulnerabilities\n---\n\n# Security Injection Specialist\n\n## Role\nOn-demand specialist for deep injection vulnerability analysis. Traces data flow from untrusted input sources to interpreter sinks (SQL engines, shells, browsers, template engines, HTTP clients).\n\n## Instructions\n1. Read \\`docs/compound/research/security/injection-patterns.md\\` for detection heuristics and safe/unsafe patterns\n2. For each changed file, identify:\n - **Input sources**: request params, body fields, headers, query strings, URL params, environment variables\n - **Interpreter sinks**: SQL queries, shell commands, HTML output, template rendering, outbound HTTP requests\n3. Trace data flow from each source to each sink:\n - Direct concatenation or template interpolation into sink -> P0/P1\n - Flow through sanitization/validation before sink -> check if sanitization is adequate\n - Parameterized/prepared statement usage -> safe, note as OK\n4. Classify by injection type:\n - **SQL** (survey 4.1): \\`db.query\\` with template literals, f-strings in queries, raw SQL with string concat\n - **Command** (survey 4.2): \\`exec\\`, \\`system\\`, \\`popen\\` with user input, \\`shell=True\\` with untrusted args\n - **XSS** (survey 4.3): \\`innerHTML\\`, \\`dangerouslySetInnerHTML\\`, \\`v-html\\`, \\`| safe\\` filter on user input\n - **SSRF** (survey 4.4): \\`axios.get(userUrl)\\`, \\`requests.get(userUrl)\\`, fetch with user-controlled URL\n - **SSTI** (survey 4.5): \\`Template(userString)\\`, \\`render_template_string(userInput)\\`\n5. For large diffs, spawn opus subagents to trace different file groups in parallel. Merge findings.\n\n## Literature\n- Consult \\`docs/compound/research/security/injection-patterns.md\\` for unsafe/safe pattern pairs and detection heuristics\n- Consult \\`docs/compound/research/security/secure-coding-failure.md\\` sections 4.1-4.5 for theoretical foundation\n- Run \\`npx ca knowledge \"injection SQL command XSS SSRF SSTI\"\\` for indexed knowledge\n\n## Collaboration\nReport findings to security-reviewer via SendMessage with severity classification. Flag architecture-level injection risks (e.g., missing parameterization layer) to architecture-reviewer.\n\n## Deployment\nOn-demand AgentTeam member in the **review** phase. Spawned by security-reviewer when injection patterns detected. Communicate with teammates via SendMessage.\n\n## Output Format\nPer finding:\n- **Type**: SQL / Command / XSS / SSRF / SSTI\n- **Severity**: P0-P3\n- **File:Line**: Location\n- **Source**: Where untrusted data enters\n- **Sink**: Where it reaches an interpreter\n- **Flow**: Brief trace description\n- **Fix**: Recommended safe pattern\n\nIf no findings: return \"INJECTION REVIEW: CLEAR -- No injection patterns found.\"\nFor large diffs (500+ lines): prioritize files with interpreter sinks over pure data/config files.\n`,\n\n 'security-secrets': `---\nname: Security Secrets Specialist\ndescription: Credential and secrets scanning using pattern matching, entropy analysis, and git history checks\n---\n\n# Security Secrets Specialist\n\n## Role\nOn-demand specialist for detecting hardcoded credentials, leaked secrets, and improper secret management in code and configuration.\n\n## Instructions\n1. Read \\`docs/compound/research/security/secrets-checklist.md\\` for key format patterns and detection heuristics\n2. Scan changed files for:\n - **Variable name patterns**: password, secret, token, apiKey, api_key, auth, credential, private_key, connection_string\n - **Known key formats**: AWS \\`AKIA[0-9A-Z]{16}\\`, GitHub \\`ghp_[a-zA-Z0-9]{36}\\`, Slack \\`xoxb-\\`/\\`xoxp-\\`, JWT signatures\n - **High-entropy strings**: 20+ character strings with mixed case, digits, and special chars in assignment context\n3. Check for common hiding spots:\n - Committed \\`.env\\` files or \\`.env.local\\` without gitignore\n - Docker files with \\`ENV SECRET=\\` or \\`ARG PASSWORD=\\`\n - CI config files (\\`.github/workflows/\\`, \\`.gitlab-ci.yml\\`) with inline secrets\n - Test fixtures that use real-looking credentials instead of obvious fakes\n4. Check git history for previously committed secrets:\n - \\`git log --diff-filter=D -- '*.env'\\` for deleted env files\n - \\`git log -p -- <file>\\` for files that changed secret-like values\n5. Distinguish real secrets from safe patterns:\n - Test fixtures prefixed with \\`test_\\`, \\`fake_\\`, \\`mock_\\` -> OK\n - Placeholder values like \\`YOUR_API_KEY_HERE\\`, \\`changeme\\`, \\`xxx\\` -> OK\n - Public keys (not private) -> OK\n - Everything else -> flag for review\n\n## Literature\n- Consult \\`docs/compound/research/security/secrets-checklist.md\\` for format patterns and hiding spots\n- Consult \\`docs/compound/research/security/secure-coding-failure.md\\` section 4.6 for theoretical foundation\n- Run \\`npx ca knowledge \"secrets credentials hardcoded\"\\` for indexed knowledge\n\n## Collaboration\nReport findings to security-reviewer via SendMessage with severity classification. Flag secrets in test files to test-coverage-reviewer.\n\n## Deployment\nOn-demand AgentTeam member in the **review** phase. Spawned by security-reviewer when secret patterns detected. Communicate with teammates via SendMessage.\n\n## Output Format\nPer finding:\n- **Severity**: P0 (real credential) / P1 (likely credential) / P2 (suspicious pattern) / P3 (missing .gitignore for secret files)\n- **File:Line**: Location\n- **Pattern**: What matched (variable name, key format, entropy)\n- **Value preview**: First/last 4 chars only (never full secret)\n- **Fix**: Use environment variable, secret manager, or .gitignore\n\nIf no findings: return \"SECRETS REVIEW: CLEAR -- No hardcoded secrets or credential patterns found.\"\n`,\n\n 'security-auth': `---\nname: Security Auth Specialist\ndescription: Route and endpoint audit for authentication, authorization, IDOR, JWT, and CORS vulnerabilities\n---\n\n# Security Auth Specialist\n\n## Role\nOn-demand specialist for auditing authentication and authorization enforcement across routes, endpoints, and API handlers.\n\n## Instructions\n1. Read \\`docs/compound/research/security/auth-patterns.md\\` for common broken patterns and framework-specific checks\n2. Perform route audit:\n - List all route/endpoint definitions in changed files\n - For each route, verify auth middleware or guard is applied\n - Flag routes that modify data (POST/PUT/DELETE) without auth\n - Flag admin/privileged routes accessible without role checks\n3. Check for IDOR (Insecure Direct Object Reference):\n - Find DB queries using user-supplied IDs from params/body\n - Verify ownership checks exist (e.g., \\`WHERE id = ? AND user_id = ?\\`)\n - Flag queries that fetch by ID alone without ownership verification\n4. Check JWT handling:\n - Verify signature validation is not skipped\n - Check for algorithm confusion vulnerabilities (\\`alg: none\\`)\n - Verify expiry (\\`exp\\`) is checked\n - Flag tokens stored in localStorage (prefer httpOnly cookies)\n5. Check CORS configuration:\n - Flag \\`Access-Control-Allow-Origin: *\\` with credentials\n - Flag overly permissive origin patterns\n - Verify CORS is intentional and scoped appropriately\n6. Framework-specific checks:\n - **Express/NestJS**: missing \\`authMiddleware\\`, missing \\`@UseGuards()\\`, routes outside auth scope\n - **Django/FastAPI**: missing \\`@login_required\\`, missing \\`Depends(get_current_user)\\`, missing permission classes\n7. For non-web projects (CLI tools, libraries): limit scope to file permissions, API key handling, and privilege escalation\n\n## Literature\n- Consult \\`docs/compound/research/security/auth-patterns.md\\` for broken auth patterns and detection methodology\n- Consult \\`docs/compound/research/security/secure-coding-failure.md\\` section 4.7 for theoretical foundation\n- Run \\`npx ca knowledge \"authentication authorization IDOR\"\\` for indexed knowledge\n\n## Collaboration\nReport findings to security-reviewer via SendMessage with severity classification. Flag missing middleware patterns to architecture-reviewer.\n\n## Deployment\nOn-demand AgentTeam member in the **review** phase. Spawned by security-reviewer when auth patterns need deep analysis. Communicate with teammates via SendMessage.\n\n## Output Format\nPer finding:\n- **Type**: Missing Auth / IDOR / Role Escalation / JWT / CORS\n- **Severity**: P0-P3\n- **File:Line**: Location\n- **Route/Endpoint**: The affected route\n- **Issue**: What is missing or broken\n- **Fix**: Specific middleware, guard, or check to add\n\nIf no findings: return \"AUTH REVIEW: CLEAR -- No authentication or authorization issues found.\"\n`,\n\n 'security-data': `---\nname: Security Data Specialist\ndescription: Audit for PII in logs, verbose error responses, sensitive data in URLs, and overly broad API responses\n---\n\n# Security Data Specialist\n\n## Role\nOn-demand specialist for detecting sensitive data exposure through logging, error handling, URLs, and API responses.\n\n## Instructions\n1. Read \\`docs/compound/research/security/data-exposure.md\\` for exposure patterns and detection heuristics\n2. Audit logging calls:\n - Flag \\`console.log(req.body)\\`, \\`console.log(req.headers)\\`, \\`logger.info(user)\\` -- unfiltered objects may contain passwords/tokens\n - Flag logging of \\`Authorization\\` header values\n - Flag logging of full error objects that may contain connection strings\n - Check structured loggers for field-level filtering\n3. Audit error handlers:\n - Flag \\`res.status(500).json({ error: err.message })\\` or \\`err.stack\\` sent to clients\n - Flag DB connection strings, internal paths, or query details in error responses\n - Verify production error handlers return generic messages\n4. Audit URLs and query parameters:\n - Flag tokens, keys, or auth values in query strings (leaks via referrer, logs, browser history)\n - Flag PII (email, name, SSN) in URL paths or query params\n - Check redirect URLs for open redirect patterns\n5. Audit API responses:\n - Flag endpoints returning full DB records instead of selected fields\n - Flag responses containing \\`password_hash\\`, \\`internal_id\\`, \\`secret\\`, or similar internal fields\n - Verify response serialization uses explicit field selection or DTOs\n\n## Literature\n- Consult \\`docs/compound/research/security/data-exposure.md\\` for exposure patterns and detection heuristics\n- Consult \\`docs/compound/research/security/secure-coding-failure.md\\` section 4.8 for theoretical foundation\n- Run \\`npx ca knowledge \"data exposure PII logging\"\\` for indexed knowledge\n\n## Collaboration\nReport findings to security-reviewer via SendMessage with severity classification. Flag logging architecture issues to architecture-reviewer.\n\n## Deployment\nOn-demand AgentTeam member in the **review** phase. Spawned by security-reviewer when data exposure patterns detected. Communicate with teammates via SendMessage.\n\n## Output Format\nPer finding:\n- **Type**: PII in Logs / Verbose Error / URL Exposure / Broad API Response\n- **Severity**: P0 (credentials in logs/responses) / P1 (PII exposure) / P2 (internal details) / P3 (hardening)\n- **File:Line**: Location\n- **Data at risk**: What sensitive data is exposed\n- **Channel**: Log / Error response / URL / API response\n- **Fix**: Specific filtering, redaction, or restructuring needed\n\nIf no findings: return \"DATA EXPOSURE REVIEW: CLEAR -- No sensitive data exposure patterns found.\"\n`,\n\n 'security-deps': `---\nname: Security Deps Specialist\ndescription: Dependency audit for vulnerable packages, lockfile changes, postinstall scripts, and supply chain risks\n---\n\n# Security Deps Specialist\n\n## Role\nOn-demand specialist for auditing dependency security, lockfile changes, and supply chain risks.\n\n## Instructions\n1. Read \\`docs/compound/research/security/dependency-security.md\\` for risk model and audit methodology\n2. Run audit tools on changed dependency files:\n - **JS/TS**: \\`pnpm audit\\` or \\`npm audit\\` -- report critical and high vulnerabilities\n - **Python**: \\`pip-audit\\` or \\`safety check\\` -- report known CVEs\n - If audit tool is unavailable, note it and proceed with manual lockfile analysis\n3. Check lockfile changes (pnpm-lock.yaml, package-lock.json, poetry.lock, requirements.txt):\n - **New direct deps**: Were they intentionally added? Check PR context\n - **Version downgrades**: Suspicious -- may reintroduce vulnerabilities\n - **New postinstall scripts**: Can execute arbitrary code during install\n - **Removed integrity hashes**: May indicate tampering\n4. Evaluate new dependencies:\n - Check maintenance status (last commit, open issues, bus factor)\n - Flag packages with fewer than 100 weekly downloads (typosquat risk)\n - Flag packages pinned 3+ major versions behind latest\n - Check for known alternatives with better security track record\n5. For large dependency changes, spawn opus subagents to audit different package groups in parallel.\n\n## Literature\n- Consult \\`docs/compound/research/security/dependency-security.md\\` for risk assessment methodology\n- Consult \\`docs/compound/research/security/secure-coding-failure.md\\` section 4.9 for theoretical foundation\n- Run \\`npx ca knowledge \"dependency vulnerability supply chain\"\\` for indexed knowledge\n\n## Collaboration\nReport findings to security-reviewer via SendMessage with severity classification. Flag architecture-level dependency concerns (e.g., replacing a core library) to architecture-reviewer.\n\n## Deployment\nOn-demand AgentTeam member in the **review** phase. Spawned by security-reviewer when dependency changes detected. Communicate with teammates via SendMessage.\n\n## Output Format\nPer finding:\n- **Package**: name@version\n- **Severity**: P0 (actively exploited CVE) / P1 (critical CVE) / P2 (high CVE, outdated) / P3 (maintenance concern)\n- **CVE**: ID if applicable\n- **Issue**: What the vulnerability enables\n- **Fix**: Update to version X, replace with Y, or accept risk with justification\n\nIf no findings: return \"DEPENDENCY REVIEW: CLEAR -- No vulnerable or suspicious dependencies found.\"\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## Literature\n- Consult \\`docs/compound/research/learning-systems/\\` for knowledge compounding theory and pattern synthesis\n- Run \\`npx ca knowledge \"lesson clustering compounding\"\\` for indexed knowledge on learning systems\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## Literature\n- Consult \\`docs/compound/research/tdd/\\` for corrective testing theory and mistake-driven test design\n- Consult \\`docs/compound/research/learning-systems/\\` for pattern clustering and knowledge synthesis methodology\n- Run \\`npx ca knowledge \"corrective testing patterns\"\\` for indexed knowledge\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## Literature\n- Consult \\`docs/compound/research/property-testing/\\` for invariant-driven development and constraint verification\n- Run \\`npx ca knowledge \"invariant drift detection\"\\` for indexed knowledge on drift patterns\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 'spec-dev.md': `---\nname: compound:spec-dev\ndescription: Develop precise specifications through Socratic dialogue, EARS notation, and Mermaid diagrams\nargument-hint: \"<goal or feature to specify>\"\n---\n$ARGUMENTS\n\n# Spec Dev\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/spec-dev/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 'cook-it.md': `---\nname: compound:cook-it\ndescription: Full workflow cycle chaining all five phases\nargument-hint: \"<goal>\"\ndisable-model-invocation: true\n---\n$ARGUMENTS\n\n# Cook It\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/cook-it/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 '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 'get-a-phd.md': `---\nname: compound:get-a-phd\ndescription: Deep PhD-level research for working subagents\nargument-hint: \"<focus area or epic ID>\"\n---\n$ARGUMENTS\n\n# Get a PhD\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.\n\nThen: scan docs/research/ and docs/compound/research/ for gaps, propose topics via AskUserQuestion, spawn parallel researcher subagents.\n`,\n\n 'agentic-audit.md': `---\nname: compound:agentic-audit\ndescription: Audit codebase against the 15-principle agentic manifesto\nargument-hint: \"<scope or focus area>\"\n---\n$ARGUMENTS\n\n# Agentic Audit\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/agentic/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file.\n\nRun in **audit** mode. Score all 15 principles, produce the report, offer beads epic.\n`,\n\n 'agentic-setup.md': `---\nname: compound:agentic-setup\ndescription: Set up codebase for agentic AI development (audit-first)\nargument-hint: \"<scope or focus area>\"\n---\n$ARGUMENTS\n\n# Agentic Setup\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/agentic/SKILL.md\\` NOW. Do NOT proceed until you have read the complete skill file.\n\nRun in **setup** mode. Audit first, then propose and create files to fill gaps.\n`,\n\n 'architect.md': `---\nname: compound:architect\ndescription: Decompose a large system specification into cook-it-ready epic beads\nargument-hint: \"<system spec epic ID, file path, or description>\"\n---\n$ARGUMENTS\n\n# Architect\n\n**MANDATORY FIRST STEP -- NON-NEGOTIABLE**: Use the Read tool to open and read \\`.claude/skills/compound/architect/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-that, check-that, prime)\n // Removed in v1.3: search, list, show, wrong, stats (CLI wrappers)\n // Removed in v1.4: learn (replaced by learn-that)\n // =========================================================================\n\n 'learn-that.md': `---\nname: compound:learn-that\ndescription: Conversation-aware lesson capture with user confirmation\nargument-hint: \"<insight to remember>\"\n---\n# Learn That\n\nIf $ARGUMENTS is provided, use it as the insight. Otherwise, analyze the conversation for corrections, discoveries, or fixes worth capturing.\n\nFormulate:\n- **Trigger**: What situation should recall this lesson?\n- **Insight**: What should be done differently?\n- **Tags**: 2-4 lowercase keywords\n\nConfirm with the user via AskUserQuestion before saving.\n\nThen run:\n\n\\`\\`\\`bash\nnpx ca learn \"$ARGUMENTS\" --tags \"<tag1>,<tag2>\"\n\\`\\`\\`\n`,\n\n 'check-that.md': `---\nname: compound:check-that\ndescription: Search lessons and proactively apply them to current work\nargument-hint: \"<query to search for>\"\n---\n# Check That\n\nIf $ARGUMENTS is provided, use it as the search query. Otherwise, infer from current context.\n\n\\`\\`\\`bash\nnpx ca search \"$ARGUMENTS\"\n\\`\\`\\`\n\nAnalyze the results and proactively suggest or apply relevant lessons to the current work.\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 (spec-dev, plan, work, review, compound, cook-it, agentic-audit, agentic-setup)\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)\ndocs/compound/\n research/ # PhD-level research docs for agent knowledge\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| Search docs knowledge | \\`npx ca knowledge \"query\"\\` |\n| Check plan against memory | \\`npx ca check-plan --plan \"description\"\\` |\n| View stats | \\`npx ca stats\\` |\n| Run full workflow | \\`/compound:cook-it <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 cook-it 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 cook-it orchestrator\"\n---\n\n# Workflow\n\nEvery feature or epic follows five phases. The \\`/compound:cook-it\\` skill chains them with enforcement gates.\n\n---\n\n## Phase 1: Spec Dev\n\nDevelop precise specifications through Socratic dialogue, EARS notation, and Mermaid diagrams.\n\n- Ask \"why\" before \"how\" -- understand the real need\n- Search memory for past features, constraints, decisions\n- Use EARS notation for clear, testable requirements\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 spec-dev output\n- Create beads tasks: \\`bd create --title=\"...\" --type=task\\`\n- Create Review and Compound blocking tasks (these survive compaction)\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 P0 (blocks merge) / P1/P2/P3\n- Fix all P0/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## Cook-it orchestrator\n\n\\`/compound:cook-it\\` chains all 5 phases with enforcement gates.\n\n### Invocation\n\n\\`\\`\\`\n/compound:cook-it <epic-id>\n/compound:cook-it <epic-id> from plan\n\\`\\`\\`\n\n### Phase execution protocol\n\nFor each phase, cook-it:\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, cook-it stops. You must fix the issue before proceeding.\n\n### Resumption\n\nIf interrupted, cook-it 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\nCook-it 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\", cook-it 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 caching layer for API responses\"\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 rebuild index\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## 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:spec-dev\\`\n\n**Purpose**: Develop precise specifications through Socratic dialogue, EARS notation, and Mermaid diagrams.\n\n**When invoked**: At the start of a new feature or epic, before any planning.\n\n**What it does**: Guides the user through 4 phases (Explore, Understand, Specify, Hand off) to produce a rigorous spec. Spawns research subagents, uses Mermaid diagrams as thinking tools, detects NL ambiguity, writes EARS-notation requirements, and stores the consolidated spec in the beads epic description.\n\n### \\`/compound:plan\\`\n\n**Purpose**: Decompose work into small testable tasks with dependencies.\n\n**When invoked**: After spec-dev, before any implementation.\n\n**What it does**: Reviews spec-dev output, spawns analysts, decomposes into tasks with acceptance criteria, creates beads issues, and creates Review + Compound blocking tasks.\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:cook-it\\`\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:get-a-phd\\`\n\n**Purpose**: Conduct deep, PhD-level research to build knowledge for working subagents.\n\n**When invoked**: When agents need domain knowledge not yet covered in \\`docs/research/\\`.\n\n**What it does**: Analyzes beads epics for knowledge gaps, checks existing docs coverage, proposes research topics for user confirmation, spawns parallel researcher subagents, and stores output at \\`docs/research/<topic>/<slug>.md\\`.\n\n### \\`/compound:agentic-audit\\`\n\n**Purpose**: Audit a codebase against the 15-principle Agentic Codebase Manifesto.\n\n**When invoked**: When evaluating a codebase's readiness for AI agent collaboration.\n\n**What it does**: Detects the project stack, scores all 15 principles (0-2) with specific evidence across 3 pillars (Codebase Memory, Implementation Feedbacks, Mapping the Context) plus cross-cutting concerns. Produces a scored report (out of 30) with prioritized actions and offers to create a beads epic for improvements.\n\n### \\`/compound:agentic-setup\\`\n\n**Purpose**: Set up a codebase for agentic AI development (runs audit first).\n\n**When invoked**: When you want to improve a codebase's agentic readiness by filling gaps.\n\n**What it does**: Runs the full audit first, then proposes concrete remediation actions for each gap found. Creates real content (AGENTS.md, docs/, ADRs, lint configs) generated from actual codebase analysis. Asks for user approval before each file creation.\n\n---\n\n## Skill invocation\n\nSkills are invoked as Claude Code slash commands:\n\n\\`\\`\\`\n/compound:spec-dev # Start spec-dev 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:cook-it <epic-id> # Run all phases end-to-end\n/compound:research # Spawn research subagent\n/compound:test-clean # Clean test artifacts\n/compound:get-a-phd <focus> # Deep research for agent knowledge\n/compound:agentic-audit # Audit codebase against agentic manifesto\n/compound:agentic-setup # Audit then set up agentic infrastructure\n/compound:learn-that # Conversation-aware lesson capture with confirmation\n/compound:check-that # Search lessons and apply to current work\n/compound:prime # Prime session with workflow context\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, 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, 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 knowledge \"architecture topic\"\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 and Compound task both exist and are closed.\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\n// ANSI color codes for cook-it banner\nconst cn = '\\x1b[36m'; // cyan — network nodes/edges\nconst rs = '\\x1b[0m'; // reset\n\nexport const PHASE_SKILLS: Record<string, string> = {\n 'spec-dev': `---\nname: Spec Dev\ndescription: Develop precise specifications through Socratic dialogue, EARS notation, and Mermaid diagrams\n---\n\n# Spec Dev Skill\n\n## Overview\nDevelop unambiguous, testable specifications before implementation. Structured 4-phase process producing EARS-notation requirements, architecture diagrams, and a beads epic.\n\nScale formality to risk: skip for trivial (<1h), lightweight (EARS + epic) for small, full 4-phase for medium+. Use \\`AskUserQuestion\\` early to gauge scope.\n\n## Methodology: 4-Phase Spec Development\n\n### Phase 1: Explore\n**Goal**: Map the problem domain before narrowing.\n1. Ask \"why\" before \"how\" -- understand the real need\n2. Search memory: \\`npx ca search\\` for past features, constraints, decisions\n3. Search knowledge: \\`npx ca knowledge \"relevant terms\"\\`\n4. Spawn subagents for research (\\`.claude/agents/compound/repo-analyst.md\\`, \\`memory-analyst.md\\`, or \\`subagent_type: Explore\\`)\n5. For deep domain knowledge, consider \\`/get-a-phd\\`\n6. Build a discovery mindmap (Mermaid \\`mindmap\\`) -- makes implicit assumptions visible\n7. Use \\`AskUserQuestion\\` to clarify scope and preferences\n\n**Iteration trigger**: If research reveals the problem is fundamentally different, restart Explore.\n\n### Phase 2: Understand\n**Goal**: Crystallize requirements through Socratic dialogue.\n1. For each capability, ask: triggers? edge cases? constraints? acceptance criteria?\n2. Use Mermaid diagrams (\\`sequenceDiagram\\`, \\`stateDiagram-v2\\`) to expose hidden structure\n3. Detect ambiguities: vague adjectives, unclear pronouns, passive voice, compound requirements. See \\`references/spec-guide.md\\` for full checklist\n4. Build a domain glossary for ambiguous terms\n5. **Change volatility**: rate each capability stable/moderate/high. Flag high-volatility areas for modularity investment in architect phase.\n6. **Cynefin classify** each requirement: Clear (apply known solution), Complicated (analyze tradeoffs), Complex (needs safe-to-fail experiments). Complex requirements need experimental validation, not just analysis.\n7. For composed systems, add **composition EARS**: \\`When <A> times out, <B> shall...\\`, \\`If <A> retries, <B> shall...\\`\n8. Use \\`AskUserQuestion\\` to resolve each ambiguity\n\n**Iteration trigger**: If specifying reveals missing knowledge, loop back to Explore.\n\n### Phase 3: Specify\n**Goal**: Produce formal, testable requirements.\n1. Write each requirement using **EARS notation**:\n - Ubiquitous: \\`The system shall <action>.\\`\n - Event-driven: \\`When <trigger>, the system shall <action>.\\`\n - State-driven: \\`While <state>, the system shall <action>.\\`\n - Unwanted behavior: \\`If <condition>, then the system shall <action>.\\`\n - Optional: \\`Where <feature>, the system shall <action>.\\`\n - Combined ordering: \\`Where > While > When > If/then > shall\\`\n2. Verify each requirement: no vague adjectives, edge cases covered, quantities specified, testable\n3. Document trade-offs when requirements conflict (see \\`references/spec-guide.md\\`)\n4. Produce architecture diagrams (\\`erDiagram\\`, \\`C4Context\\`, \\`flowchart\\`)\n5. Create ADRs in \\`docs/decisions/\\` for significant decisions\n6. **Generate scenario table** from EARS requirements and Mermaid diagrams:\n - For each EARS requirement: at least one **happy** scenario + one **error** scenario\n - For quantified parameters: **boundary** scenarios (min, max, just-beyond)\n - From sequence diagrams: one scenario per message path including alt/opt fragments\n - From state diagrams: each transition + at least one invalid transition (**adversarial**)\n - For multi-parameter requirements: **combinatorial** scenarios using pairwise (2-way) coverage\n - For external interfaces: **adversarial** scenarios per applicable STRIDE category\n - Use sequential IDs (S1, S2...) and this table format:\n\n | ID | Source | Category | Precondition | Trigger | Expected Outcome |\n |----|--------|----------|--------------|---------|------------------|\n\n Categories: \\`happy\\`, \\`error\\`, \\`boundary\\`, \\`combinatorial\\`, \\`adversarial\\`\n\n**Iteration trigger**: If contradictions or gaps emerge, loop back to Understand.\n\n### Phase 4: Hand off\n1. Create beads epic if needed (\\`bd create --title=\"...\" --type=epic --priority=<N>\\`)\n2. Store spec in the epic description (\\`bd update <epic-id> --description=\"...\"\\`) -- single source of truth, including both EARS requirements and scenario table\n3. Flag open questions for plan phase\n4. Capture lessons: \\`npx ca learn\\`\n\n## Memory Integration\n- \\`npx ca search\\` before generating approaches\n- \\`npx ca knowledge\\` for indexed project docs\n- \\`npx ca learn\\` after corrections or discoveries\n\n## Reference Material\nRead \\`.claude/skills/compound/spec-dev/references/spec-guide.md\\` on demand for EARS patterns, Mermaid templates, ambiguity checklists, and trade-off frameworks.\n\n## Common Pitfalls\n- Jumping to solutions before exploring the problem\n- Skipping diagrams -- they reveal hidden assumptions\n- Vague requirements without EARS patterns\n- Not searching memory for past patterns and pitfalls\n- Over-specifying trivial tasks\n- Ignoring iteration signals when gaps emerge\n- Not creating the beads epic\n- Specifying implementation instead of requirements\n- Skipping scenario table generation after EARS requirements\n- Not classifying requirements by Cynefin domain (Complex needs experiments)\n\n## Quality Criteria\n- [ ] Requirements use EARS notation\n- [ ] Ambiguities detected and resolved via dialogue\n- [ ] Mermaid diagrams used as thinking tools\n- [ ] Memory searched (\\`npx ca search\\`)\n- [ ] Trade-offs documented with rationale\n- [ ] User engaged via \\`AskUserQuestion\\` at decisions\n- [ ] Scenario table generated from EARS requirements and diagrams\n- [ ] Spec and scenario table stored in beads epic description\n- [ ] ADRs created for significant decisions\n- [ ] Cynefin classification applied, volatility assessed\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. Read the spec from the epic description (\\`bd show <epic>\\`) for EARS requirements, decisions, and open questions. Verify its type is \\`epic\\` -- if it was created as \\`task\\`, fix with \\`bd update <id> --type=epic\\`\n2. Search memory with \\`npx ca search\\` and docs with \\`npx ca knowledge \"relevant topic\"\\` 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. **Boundary stability check**: verify each task stays within its epic's scope boundary. If a task crosses epic boundaries, split it or expand scope.\n9. **Last Responsible Moment**: for each task, assess if it can be deferred for information gain. Mark deferrable tasks with rationale: \"defer until <milestone> because <information needed>\".\n10. **Change coupling check**: if files A and B change together >50% of the time (git log), they should be in the same task, not separate ones.\n11. Define acceptance criteria for each task\n12. Ensure each task traces back to a spec requirement for traceability\n13. Map dependencies between tasks\n14. Create beads issues: \\`bd create --title=\"...\" --type=task\\`\n15. 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\n\n## Memory Integration\n- Run \\`npx ca search\\` and \\`npx ca knowledge \"relevant topic\"\\` 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- Not checking tasks against epic boundaries (boundary drift)\n- Splitting change-coupled files into separate tasks\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- Each task traces back to a spec requirement\n- Tasks respect epic scope boundaries (no cross-boundary work)\n- Change-coupled files grouped together\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`,\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. Read the epic description (\\`bd show <epic>\\`) for spec context -- EARS requirements guide what \"done\" looks like\n4. Run \\`npx ca search\\` per agent/subtask for targeted context. Display results.\n5. Assess parallelization: identify independent tasks that can be worked simultaneously\n6. 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\n7. Agents communicate via SendMessage when working on overlapping areas.\n8. Lead coordinates: review agent outputs, resolve conflicts, verify tests pass. Do not write code directly.\n9. If implementation diverges from spec requirements, stop and discuss with user via AskUserQuestion before proceeding.\n10. If blocked, use AskUserQuestion to get user direction.\n11. Shut down the team when done: send shutdown_request to all teammates.\n12. Commit incrementally as tests pass.\n13. Run full test suite for regressions.\n14. 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## Literature\n- Consult \\`docs/compound/research/tdd/\\` for TDD methodology, test-first development evidence, and best practices\n- Consult \\`docs/compound/research/property-testing/\\` for property-based testing theory and invariant design\n- Run \\`npx ca knowledge \"TDD test-first\"\\` for indexed knowledge on testing methodology\n- Run \\`npx ca search \"testing\"\\` for lessons from past TDD cycles\n\n## Technical Debt Protocol\nWhen shortcuts are proposed, classify using Fowler's quadrant: only **Prudent/Deliberate** debt is rational (conscious choice, known trade-off, explicit repayment plan). Reckless or Inadvertent debt must be fixed immediately. Document debt decisions in epic notes.\n\n## Composition Boundary Verification\nIf work touches a composition boundary (inter-epic or inter-service interface):\n- Verify implementation matches the interface contracts (explicit + implicit) from architect phase\n- Write tests for implicit contracts: timeout interactions, retry behavior, backpressure\n- Check for metastable failure risk: feedback loops (retry amplification, cache storms)\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- Accumulating reckless/inadvertent tech debt without classification\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- Implementation aligns with spec requirements from epic\n- Technical debt classified (only Prudent/Deliberate accepted)\n- Composition boundaries verified against interface contracts\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 (P0/P1/P2/P3), and gating completion on implementation-reviewer approval.\n\n## Methodology\n1. Run quality gates first: \\`pnpm test && pnpm lint\\`\n2. Read the epic description (\\`bd show <epic>\\`) for EARS requirements -- reviewers verify each requirement is met\n3. Search memory with \\`npx ca search\\` for known patterns and recurring issues\n4. 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, scenario-coverage (8 total)\n - **Large** (500+): all 12+ reviewers including docs, consistency, error-handling, pattern-matcher\n - **Composition changes**: add boundary-reviewer (coupling within epic boundaries?), control-structure-reviewer (STPA mitigations implemented?), observability-reviewer (metrics at boundaries?)\n5. 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,scenario-coverage-reviewer}/SKILL.md\\`\n - Security specialist skills (on-demand, spawned by security-reviewer): \\`.claude/skills/compound/agents/{security-injection,security-secrets,security-auth,security-data,security-deps}/SKILL.md\\`\n - For large diffs (500+), deploy MULTIPLE instances; split files across instances, coordinate via SendMessage\n6. Reviewers communicate findings to each other via \\`SendMessage\\`\n7. Collect, consolidate, and deduplicate all findings\n8. Classify by severity: P0 (blocks merge), P1 (critical/blocking), P2 (important), P3 (minor)\n9. Use \\`AskUserQuestion\\` when severity is ambiguous or fix has multiple valid options\n10. Create beads issues for P1 findings: \\`bd create --title=\"P1: ...\"\\`\n11. Verify spec alignment: flag unmet EARS requirements as P1. Verify assumptions from architect phase still hold. Check change coupling: do modified files cluster within epic boundaries or leak across?\n12. Fix all P1 findings before proceeding\n13. Run \\`/implementation-reviewer\\` as mandatory gate\n14. 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## Literature\n- Consult \\`docs/compound/research/code-review/\\` for systematic review methodology, severity taxonomies, and evidence-based review practices\n- Run \\`npx ca knowledge \"code review methodology\"\\` for indexed knowledge on review techniques\n- Run \\`npx ca search \"review\"\\` for lessons from past review cycles\n\n## Common Pitfalls\n- Ignoring reviewer feedback because \"it works\"\n- Not running all 12 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- Not verifying architect assumptions still hold after implementation\n\n## Quality Criteria\n- All quality gates pass (\\`pnpm test\\`, lint)\n- All 12 reviewer perspectives were applied in parallel\n- Findings are classified P0/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- security-reviewer P0 findings: none (blocks merge)\n- security-reviewer P1 findings: all acknowledged or resolved\n- All P1 findings fixed before \\`/implementation-reviewer\\` approval\n- All spec requirements verified against implementation\n- scenario-coverage-reviewer verified scenario table coverage (medium+ diffs)\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. Detect spec drift: compare final implementation against original EARS requirements in the epic description (\\`bd show <epic>\\`). Note any divergences -- what changed, why, was it justified. If drift reveals a spec was wrong or incomplete, flag that for lesson extraction.\n3. **Decomposition quality assessment**: compare actual implementation against predicted boundaries from architect. Did files cluster as predicted? Were assumptions valid? Rate boundary quality: \"This boundary [succeeded/failed] because...\" Capture as lesson for future architect runs.\n4. **Assumption tracking**: for each assumption from architect phase, record predicted vs actual volatility. Store with \\`npx ca learn\\` for calibration.\n5. **Emergence analysis**: if unexpected system behaviors occurred, classify root cause: incomplete interface contract (Garlan), control structure inadequacy (STPA), or scale-induced phase transition. Capture preventive lesson.\n3. 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\n4. 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.\n5. Apply quality filters: novelty check (>0.98 cosine similarity = skip), specificity check\n6. Classify each item by type: lesson, solution, pattern, or preference\n7. Classify severity: high (data loss/security/contradictions), medium (workflow/patterns), low (style/optimizations)\n8. Store via \\`npx ca learn\\` with supersedes/related links where applicable.\n At minimum, capture 1 lesson per significant decision made during this cycle\n9. Delegate to the \\`compounding\\` subagent to run synthesis: cluster accumulated lessons by similarity and write CCT patterns to \\`.claude/lessons/cct-patterns.jsonl\\`\n10. Update outdated docs and deprecate superseded ADRs (set status to \\`deprecated\\`)\n11. 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## Literature\n- Consult \\`docs/compound/research/learning-systems/\\` for knowledge compounding theory, spaced repetition, and lesson extraction methodology\n- Run \\`npx ca knowledge \"knowledge compounding\"\\` for indexed knowledge on learning systems\n- Run \\`npx ca search \"compound\"\\` for lessons from past compounding cycles\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- Not assessing decomposition boundary quality against architect predictions\n- Not tracking assumption accuracy for future calibration\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- Spec drift analyzed and captured\n- Decomposition boundary quality assessed\n- Architect assumptions tracked (predicted vs actual)\n- Emergent failures classified by root cause if any occurred\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 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 (spec-dev/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/\\` and \\`docs/compound/research/\\` that overlap\n- After completion, key findings can be captured via \\`npx ca learn\\`\n\n## Docs Integration\n- Scan \\`docs/research/\\` and \\`docs/compound/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 'cook-it': `---\nname: Cook It\ndescription: Full-cycle orchestrator chaining all five phases with gates and controls\n---\n\n# Cook It Skill\n\n## Overview\n\nChain all 5 phases end-to-end: Spec Dev, 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/spec-dev/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## Session Start\nWhen a cooking session begins, IMMEDIATELY print the banner below (copy it verbatim):\n\n${cn} o\n /|\\\\\n o-o-o\n /|\\\\ /|\\\\\n o-o-o-o-o\n \\\\|/ \\\\|/\n o-o-o\n \\\\|/\n o${rs}\n\nThen proceed with the protocol below.\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\\` and \\`npx ca knowledge\\` 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- Spec dev 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 'agentic': `---\nname: Agentic Codebase\ndescription: Audit and set up a codebase for agentic AI development using the 15-principle manifesto\n---\n\n# Agentic Codebase Skill\n\n## Overview\n\nAssess and improve a codebase's readiness for AI agent collaboration. Based on the 15-principle Agentic Codebase Manifesto organized across 3 pillars.\n\nThis skill operates in two modes:\n- **Mode: audit** -- Score the codebase against all 15 principles, produce a report with evidence and prioritized actions\n- **Mode: setup** -- Run audit first, then incrementally fill gaps with real content generated from codebase analysis\n\nMode is set by the calling command (\\\\\\`/compound:agentic-audit\\\\\\` or \\\\\\`/compound:agentic-setup\\\\\\`). The command wrapper tells you which mode to run -- do not parse \\\\\\`$ARGUMENTS\\\\\\` for mode detection.\n\n## Stack Detection\n\nBefore auditing, detect the project stack to adapt checks:\n1. Look for package.json (Node/TS), pyproject.toml or setup.py (Python), Cargo.toml (Rust), go.mod (Go), Makefile, CMakeLists.txt (C/C++)\n2. Check for framework markers: next.config, django, fastapi, express, etc.\n3. Identify build/test/lint commands from config files\n4. Store detected stack for use in principle checks and AGENTS.md generation\n\n## Audit Methodology\n\n### Scoring Rubric\nEach principle is scored:\n- **0 (Absent)**: No evidence of this principle in the codebase\n- **1 (Partial)**: Some evidence but incomplete or inconsistent\n- **2 (Present)**: Clear, consistent implementation\n\nAdapt criteria to the detected stack. For example: \"strict mode\" means TypeScript strict, Python mypy --strict, or Rust default safety. \"Linter\" means ESLint, pylint/ruff, clippy, golangci-lint, etc. Score based on the ecosystem's equivalent tooling.\n\n### The 15 Principles\n\n#### Pillar I: Codebase Memory (Traceability) -- max 8 points\n\n**P1. Repository is the only truth**\nCheck: All context an agent needs lives in version control\nEvidence: Look for docs/ directory, inline documentation, config files\nScore 0: No docs directory, no README beyond boilerplate\nScore 1: README exists but key context lives elsewhere\nScore 2: Comprehensive docs/, config, and context all in-repo\n\n**P2. Trace decisions, not just outcomes**\nCheck: Architectural decisions have recorded rationale\nEvidence: Look for docs/adr/, docs/decisions/, ADR files\nScore 0: No decision records\nScore 1: Some decisions documented but inconsistent format\nScore 2: ADR directory with structured records\n\n**P3. Never answer the same question twice**\nCheck: Solutions/fixes are documented to prevent rediscovery\nEvidence: Solutions docs, post-mortems, troubleshooting guides, or a memory system\nScore 0: No solutions documentation\nScore 1: Scattered notes but no systematic approach\nScore 2: Structured solutions docs or integrated memory system\n\n**P4. Knowledge is infrastructure**\nCheck: Documentation is versioned alongside code\nEvidence: Specs, research, standards co-located in repo\nScore 0: Documentation lives outside version control\nScore 1: Some docs in repo but key knowledge is external\nScore 2: All project knowledge versioned in docs/\n\n#### Pillar II: Implementation Feedbacks (Mechanical Verification) -- max 8 points\n\n**P5. Test is specification**\nCheck: Tests define behavior before or alongside implementation\nEvidence: Test files, coverage tooling, test-first patterns\nScore 0: No tests or minimal coverage\nScore 1: Tests exist but post-hoc or inconsistent\nScore 2: Comprehensive test suite with test-driven patterns\n\n**P6. Constraints are multipliers**\nCheck: Linters, type checkers, architectural rules configured and enforced\nEvidence: ESLint/pylint/clippy config, TypeScript strict mode, CI enforcement\nScore 0: No linting or type checking\nScore 1: Linter exists but not enforced in CI\nScore 2: Strict linting + type checking enforced in CI\n\n**P7. Write feedback for machines**\nCheck: Error messages, logs, and output are structured for agent consumption\nEvidence: Structured logging, clear error messages with context\nScore 0: Unstructured logs, generic error messages\nScore 1: Some structured logging but inconsistent\nScore 2: Structured logging throughout, remediation hints in errors\n\n**P8. Fight entropy continuously**\nCheck: Active maintenance processes prevent drift\nEvidence: Automated formatting, dependency updates, quality monitoring\nScore 0: No automated maintenance\nScore 1: Basic formatting but no proactive monitoring\nScore 2: Automated formatting + dependency updates + quality tracking\n\n#### Pillar III: Mapping the Context (Navigable Structure) -- max 8 points\n\n**P9. Map, not manual**\nCheck: Entry point document provides a navigable map, not an encyclopedia\nEvidence: AGENTS.md, CLAUDE.md, or similar\nScore 0: No agent-facing entry point document\nScore 1: README exists but not optimized for agents\nScore 2: Dedicated AGENTS.md or CLAUDE.md with commands, structure, conventions\n\n**P10. Explicit over implicit, always**\nCheck: Types, naming, patterns are explicit\nEvidence: Type annotations, consistent naming, documented conventions\nScore 0: No type annotations, inconsistent naming\nScore 1: Some types but gaps, or undocumented conventions\nScore 2: Full type coverage, documented naming conventions\n\n**P11. Modularity is non-negotiable**\nCheck: Single responsibility per file, clear boundaries\nEvidence: File sizes, module organization, dependency structure\nScore 0: Monolithic files (>500 LOC common), unclear boundaries\nScore 1: Some modular structure but large files remain\nScore 2: Consistent small files, clear APIs, enforced boundaries\n\n**P12. Structure in layers, govern by inheritance**\nCheck: Layered architecture with explicit dependency rules\nEvidence: Layer separation, import rules, dependency graph\nScore 0: No discernible layering\nScore 1: Informal layers but no enforcement\nScore 2: Explicit layers with enforced dependency directions\n\n#### Cross-Cutting -- max 6 points\n\n**P13. Simplicity compounds**\nCheck: Prefer boring technologies, minimal abstractions\nEvidence: Dependency count, abstraction depth\nScore 0: Over-engineered with many abstractions\nScore 1: Moderate complexity, some unnecessary abstractions\nScore 2: Minimal dependencies, straightforward patterns\n\n**P14. Human designs the system, not the output**\nCheck: Human effort in system design (tests, docs, constraints)\nEvidence: Quality of test harnesses, documentation, CI/CD\nScore 0: No investment in development infrastructure\nScore 1: Some tooling but gaps in key areas\nScore 2: Strong CI, testing framework, documentation system\n\n**P15. Parallelize by decomposition**\nCheck: Work can be split into independent units\nEvidence: Module independence, clear interfaces, minimal coupling\nScore 0: Tightly coupled, hard to work on independently\nScore 1: Some independent modules but shared state\nScore 2: Well-decomposed with clear interfaces\n\n### Audit Execution Steps\n\n1. Run \\\\\\`npx ca search \"agentic codebase\"\\\\\\` for relevant lessons\n2. Detect project stack (see Stack Detection above)\n3. Use Glob and Grep to check for evidence of each principle:\n - Glob for: docs/**, *.test.*, .eslintrc*, AGENTS.md, CLAUDE.md\n - Grep for: type annotations, structured logging, ADR format\n - Read key files: README, config files, sample source files\n4. Score each principle (0-2) with specific evidence\n5. Aggregate scores by pillar and compute total out of 30\n6. Generate prioritized actions (score-0 first, then score-1)\n7. Present report to user\n\n### Report Format\n\nPresent as markdown tables per pillar:\n\nPillar I: Codebase Memory -- X/8\n| # | Principle | Score | Evidence |\n|---|-----------|-------|----------|\n| P1 | Repository is the only truth | 0/1/2 | finding |\n...repeat for all pillars with separator rows...\n\n**Overall Score: X/30**\n\n### Priority Actions\n1. [Score-0 items first, most impactful]\n2. ...\n\nAfter presenting, use \\\\\\`AskUserQuestion\\\\\\`: \"Create a beads epic with issues for improvements?\"\nIf yes, create epic via bd create and individual issues.\n\n## Setup Methodology\n\n### Prerequisites\nRun the full audit first. Setup only addresses gaps found by the audit.\n\n### Setup Execution Steps\n\n1. Present audit findings summary\n2. For each principle scored 0 or 1, propose a concrete action:\n\n**P1/P4 gaps**: Create docs/ skeleton (INDEX.md, adr/, standards/) with real content from analysis\n**P2 gaps**: Create ADR template and first ADR from actual architecture analysis\n**P3 gaps**: Suggest solutions documentation structure\n**P5 gaps**: Suggest test framework setup based on detected stack\n**P6 gaps**: Suggest linter/type checker configuration for detected stack\n**P7 gaps**: Suggest structured logging patterns for detected stack\n**P9 gaps**: Generate AGENTS.md by analyzing actual codebase (build commands, structure, conventions)\n**P10 gaps**: Suggest type annotation and strict mode settings\n**P11 gaps**: Identify files >500 LOC, suggest refactoring targets\n**P12 gaps**: Document layer structure and suggest import lint rules (e.g., eslint-plugin-import boundaries, Rust mod visibility)\n**P13 gaps**: Flag over-abstraction (deep inheritance, excessive wrappers), suggest simplification targets\n**P14 gaps**: Suggest CI pipeline improvements, test harness setup, or pre-commit hooks for detected stack\n**P15 gaps**: Identify tightly coupled modules, suggest interface extraction for parallel workability\n**P8 gaps**: Suggest automated formatting (prettier/black/rustfmt), dependency update tooling (renovate/dependabot), and quality monitoring\n\n3. Before each action, use \\\\\\`AskUserQuestion\\\\\\`: \"Create [file]? Preview: [content]\"\n4. Only create/modify files the user approves\n5. Never overwrite existing files without explicit approval\n\n### Setup Completion Gate\nAfter all approved actions are applied, verify:\n- List all files created/modified during setup\n- Run quality gates if available (\\\\\\`pnpm test\\\\\\`, \\\\\\`pnpm lint\\\\\\`, or stack equivalent)\n- Confirm no existing files were overwritten without approval\n- Present summary: principles addressed, files created, remaining gaps\n\n## Memory Integration\n\n- Before analysis: \\\\\\`npx ca search \"agentic codebase\"\\\\\\` for relevant lessons\n- After completing: offer \\\\\\`npx ca learn\\\\\\` to capture insights\n\n## Common Pitfalls\n\n- Scoring too generously without specific evidence for score 2\n- Generating template content instead of analyzing the actual codebase\n- Overwriting existing files without asking\n- Not detecting the project stack before generating content\n- Creating too many files at once instead of prioritizing\n- Forgetting to offer beads epic creation after audit\n\n## Quality Criteria\n\n- All 15 principles assessed with specific evidence\n- Scores justified with findings\n- Pillar totals and overall score calculated correctly\n- Actions prioritized (score-0 before score-1)\n- Stack detected and checks adapted accordingly\n- User consulted via AskUserQuestion at key decisions\n- Memory searched before analysis\n- Setup mode ran audit first\n- No files overwritten without approval\n- Generated content based on actual codebase analysis\n`,\n\n 'architect': `---\nname: Architect\ndescription: Decompose a large system specification into cook-it-ready epic beads via DDD bounded contexts\n---\n\n# Architect Skill\n\n## Overview\nTake a large system specification and decompose it into naturally-scoped epic beads that the infinity loop can process via cook-it. Each output epic is sized for one cook-it cycle.\n\n4 phases with 3 human gates. Runs BEFORE spec-dev -- each decomposed epic then goes through full cook-it (including spec-dev to refine its EARS subset).\n\n## Input\n- Beads epic ID: read epic description as input\n- File path: read markdown file as input\n- Neither: use \\`AskUserQuestion\\` to gather the system description\n\n## Phase 1: Socratic\n**Goal**: Understand the system domain before decomposing.\n1. Search memory: \\`npx ca search\\` for past features, constraints, decisions\n2. Search knowledge: \\`npx ca knowledge \"relevant terms\"\\`\n3. Ask \"why\" before \"how\" -- understand the real need\n4. Build a **domain glossary** (ubiquitous language) from the dialogue\n5. Produce a **discovery mindmap** (Mermaid \\`mindmap\\`) to expose assumptions\n6. **Reversibility analysis**: classify decisions as irreversible (schema, public API, service boundary), moderate (framework), or reversible (library, config). Spend effort proportional to irreversibility.\n7. **Change volatility**: rate each boundary stable/moderate/high. High-volatility justifies modularity investment.\n8. Use \\`AskUserQuestion\\` to clarify scope and preferences\n\n**Gate 1**: Use \\`AskUserQuestion\\` to confirm the understanding is complete before proceeding to Spec.\n\n## Phase 2: Spec\n**Goal**: Produce a system-level specification.\n1. Write **system-level EARS requirements** (Ubiquitous/Event/State/Unwanted/Optional patterns)\n2. Produce **architecture diagrams**: C4Context, sequenceDiagram, stateDiagram-v2\n3. Generate a **scenario table** from the EARS requirements\n4. Write the spec to \\`docs/specs/<name>.md\\` and create a **meta-epic bead**\n\n**Gate 2**: Use \\`AskUserQuestion\\` to get human approval of the system-level spec.\n\n## Phase 3: Decompose\n**Goal**: Break the system into naturally-scoped epics using DDD bounded contexts.\n\nSpawn **6 parallel subagents** (via Task tool):\n1. **Bounded context mapper**: Identify natural domain boundaries and propose candidate epics\n2. **Dependency analyst**: Structural + change coupling (git history entropy), dependency graph, processing order\n3. **Scope sizer**: \"One cook-it cycle\" heuristic, cognitive load check (7+/-2 concepts per epic)\n4. **Interface designer**: Explicit contracts (API/data) + implicit contracts (threading, delivery guarantees, timeout/retry, backpressure, resource ownership, failure modes)\n5. **Control structure analyst** (STPA): Identify hazards at composition boundaries, unsafe control actions (commission/omission/timing), propose mitigations\n6. **Structural-semantic gap analyst**: Compare dependency graph partition vs DDD semantic partition, flag disagreements\n\n**Synthesis**: Merge subagent findings into a proposed epic structure. For each epic:\n- Title and scope boundaries (what is in, what is out)\n- Relevant EARS subset from the system spec\n- Interface contracts: explicit (API/data) + implicit (timing, threading, failure modes)\n- Assumptions that must hold for this boundary to remain valid\n- Org alignment: which team type owns this (stream-aligned/platform/enabling/complicated-subsystem)?\n- Pointer to the master spec file\n\n**Multi-criteria validation** before Gate 3 -- for each epic:\n- [ ] Structural: low change coupling, acyclic dependencies\n- [ ] Semantic: stable bounded context, coherent ubiquitous language\n- [ ] Organizational: single team owner, within cognitive budget\n- [ ] Economic: modularity benefit > coordination overhead\n\n**Gate 3**: Use \\`AskUserQuestion\\` to get human approval of the epic structure, dependency graph, and interface contracts.\n\n## Phase 4: Materialize\n**Goal**: Create the actual beads.\n1. Create epic beads via \\`bd create --title=\"...\" --type=epic --priority=<N>\\` for each approved epic\n2. Store scope, EARS subset, interface contracts (explicit + implicit), and key assumptions in each epic description\n3. Define **fitness functions** per epic to monitor assumptions. Document re-decomposition trigger.\n4. Wire dependencies via \\`bd dep add\\` for all relationships\n5. Store processing order as notes on the meta-epic\n6. Capture lessons via \\`npx ca learn\\`\n\n## Memory Integration\n- \\`npx ca search\\` before starting each phase\n- \\`npx ca knowledge\\` for indexed project docs\n- \\`npx ca learn\\` after corrections or discoveries\n\n## Common Pitfalls\n- Jumping to decomposition without understanding the domain (skip Socratic)\n- Micro-slicing epics too small (each epic should be a natural bounded context, not a single task)\n- Missing interface contracts between epics (coupling will bite during implementation)\n- Not searching memory for past decomposition patterns\n- Skipping human gates (the 3 gates are the quality checkpoints)\n- Creating epics without EARS subset (loses traceability to system spec)\n- Not wiring dependencies (loop will process in wrong order)\n- Treating complex decisions as complicated (Cynefin): service boundaries need experiments, not just analysis\n- Ignoring implicit contracts (threading, timing, backpressure) -- Garlan's architectural mismatch\n- Not capturing assumptions that would invalidate the decomposition if wrong\n\n## Quality Criteria\n- [ ] Socratic phase completed with domain glossary and mindmap\n- [ ] System-level EARS requirements cover all capabilities\n- [ ] Architecture diagrams produced (C4, sequence, state)\n- [ ] Spec written to docs/specs/ and meta-epic created\n- [ ] 6-angle convoy executed for decomposition (DDD + STPA + gap analysis)\n- [ ] Each epic has scope boundaries, EARS subset, interface contracts (explicit + implicit), and assumptions\n- [ ] Dependencies wired via bd dep add\n- [ ] Processing order stored on meta-epic\n- [ ] 3 human gates passed via AskUserQuestion\n- [ ] Memory searched at each phase\n`,\n};\n\n/**\n * Reference files for phase skills.\n * Map: \"phase/relative-path\" -> content\n * Installed alongside PHASE_SKILLS by installPhaseSkills().\n */\nexport const PHASE_SKILL_REFERENCES: Record<string, string> = {\n 'spec-dev/references/spec-guide.md': `# Spec Dev Quick Reference\n\n## EARS Notation Patterns\n\nEARS (Easy Approach to Requirements Syntax) provides five sentence templates:\n\n| Pattern | Template | Example |\n|---------|----------|---------|\n| **Ubiquitous** | The system shall \\`<action>\\`. | The system shall validate all inputs. |\n| **Event-driven** | When \\`<trigger>\\`, the system shall \\`<action>\\`. | When the user submits the form, the system shall validate all fields. |\n| **State-driven** | While \\`<state>\\`, the system shall \\`<action>\\`. | While the system is in maintenance mode, the system shall reject new connections. |\n| **Unwanted behavior** | If \\`<condition>\\`, then the system shall \\`<action>\\`. | If the database connection fails, then the system shall retry with exponential backoff. |\n| **Optional** | Where \\`<feature>\\`, the system shall \\`<action>\\`. | Where SSO is enabled, the system shall redirect to the identity provider. |\n\n**Combined ordering**: Where > While > When > If/then > shall\n\n### Quality Checks for Each Requirement\n- [ ] Uses one of the five EARS patterns\n- [ ] No vague adjectives (fast, efficient, user-friendly, easy)\n- [ ] Quantities specified where applicable (timeouts, limits, thresholds)\n- [ ] Edge cases addressed (empty input, max values, concurrent access)\n- [ ] Testable — can write a pass/fail test against it\n- [ ] Single responsibility — one requirement per sentence\n\n---\n\n## Mermaid Diagram Selection Guide\n\n| Diagram Type | Use When | Syntax |\n|-------------|----------|--------|\n| \\`mindmap\\` | Exploring problem domain, brainstorming | Phase 1 (Explore) |\n| \\`sequenceDiagram\\` | Showing interactions between components | Phase 2 (Understand) |\n| \\`stateDiagram-v2\\` | Modeling lifecycle, state transitions | Phase 2 (Understand) |\n| \\`flowchart\\` | Showing decision logic, data flow | Phase 3 (Specify) |\n| \\`erDiagram\\` | Defining data models, relationships | Phase 3 (Specify) |\n| \\`C4Context\\` | System-level architecture boundaries | Phase 3 (Specify) |\n\n### When to Use Diagrams\n- **Always** use a mindmap in Explore to surface hidden assumptions\n- **Use sequence diagrams** when 2+ components interact\n- **Use state diagrams** when an entity has a lifecycle\n- **Skip diagrams** only for truly trivial features (<1h of work)\n\n---\n\n## NL Ambiguity Detection Checklist\n\nWatch for these ambiguity patterns in requirements:\n\n| Pattern | Example | Fix |\n|---------|---------|-----|\n| **Vague adjectives** | \"fast response\" | Specify: \"response within 200ms\" |\n| **Unclear pronouns** | \"it should update\" | Name the subject: \"the cache should update\" |\n| **Passive voice** | \"data is validated\" | Active: \"the API validates data\" |\n| **Compound requirements** | \"shall validate and log and notify\" | Split into 3 separate requirements |\n| **Unbounded lists** | \"supports CSV, JSON, etc.\" | Enumerate all formats explicitly |\n| **Missing quantities** | \"handles large files\" | Specify: \"handles files up to 500MB\" |\n| **Implicit assumptions** | \"users can access\" | Specify: \"authenticated users with role X can access\" |\n| **Temporal ambiguity** | \"after processing\" | Specify: \"within 5s of processing completion\" |\n\n---\n\n## Trade-off Documentation Framework\n\nWhen requirements conflict, document the trade-off:\n\n### Template\n\\`\\`\\`\n### Trade-off: [Short Title]\n\n**Tension**: [Requirement A] conflicts with [Requirement B].\n\n**Options**:\n1. [Option 1]: [Description]. Pro: [benefit]. Con: [cost].\n2. [Option 2]: [Description]. Pro: [benefit]. Con: [cost].\n\n**Decision**: [Chosen option] because [rationale].\n\n**Consequence**: [What this means for implementation].\n\\`\\`\\`\n\n### Common Trade-off Dimensions\n- **Performance vs. Safety**: Validation adds latency\n- **Flexibility vs. Simplicity**: Configuration adds complexity\n- **Consistency vs. Availability**: Strict consistency limits throughput\n- **Security vs. Usability**: Auth steps add friction\n- **Completeness vs. Time-to-market**: More features delay delivery\n\n### Decision Criteria\nWhen evaluating trade-offs, consider:\n1. **Reversibility**: Can we change this later? Prefer reversible decisions.\n2. **Blast radius**: How many components does this affect?\n3. **Evidence**: What data supports each option?\n4. **Alignment**: Which option best serves the stated goal?\n`,\n};\n","/**\n * Setup Gemini command - Configure Gemini CLI compatibility hooks.\n *\n * Adapts compound-agent's Claude Code hooks to Gemini CLI's hook format.\n * Uses Gemini's @{path} file injection for commands, and inlines skill\n * content (since @{path} only works in TOML prompt fields, not SKILL.md).\n */\n\nimport { existsSync } 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 { out } from '../commands/index.js';\nimport { getRepoRoot } from '../cli-utils.js';\nimport { WORKFLOW_COMMANDS, PHASE_SKILLS, AGENT_ROLE_SKILLS } from './templates/index.js';\n\n// ============================================================================\n// Hook script templates\n// ============================================================================\n\nconst HOOKS: Record<string, string> = {\n 'ca-prime.sh': `#!/usr/bin/env bash\ninput=$(cat)\necho \"$input\" | npx ca prime > /dev/null 2>&1\necho '{\"decision\": \"allow\"}'\n`,\n 'ca-user-prompt.sh': `#!/usr/bin/env bash\ninput=$(cat)\necho \"$input\" | npx ca hooks run user-prompt > /dev/null 2>&1\necho '{\"decision\": \"allow\"}'\n`,\n 'ca-post-tool.sh': `#!/usr/bin/env bash\ninput=$(cat)\necho \"$input\" | npx ca hooks run post-tool-success > /dev/null 2>&1\necho '{\"decision\": \"allow\"}'\n`,\n 'ca-phase-guard.sh': `#!/usr/bin/env bash\ninput=$(cat)\necho \"$input\" | npx ca hooks run phase-guard > /dev/null 2>&1\nrc=$?\nif [ $rc -ne 0 ]; then\n echo '{\"decision\": \"deny\", \"reason\": \"Phase guard: read the phase skill before editing\"}'\n exit 0\nfi\necho '{\"decision\": \"allow\"}'\n`,\n};\n\nconst SETTINGS_JSON = {\n hooks: {\n SessionStart: [\n {\n matcher: \".*\",\n hooks: [{ name: \"ca-prime\", type: \"command\", command: \"bash .gemini/hooks/ca-prime.sh\" }],\n },\n ],\n BeforeAgent: [\n {\n matcher: \".*\",\n hooks: [{ name: \"ca-user-prompt\", type: \"command\", command: \"bash .gemini/hooks/ca-user-prompt.sh\" }],\n },\n ],\n BeforeTool: [\n {\n matcher: \"replace|write_file|create_file\",\n hooks: [{ name: \"ca-phase-guard\", type: \"command\", command: \"bash .gemini/hooks/ca-phase-guard.sh\" }],\n },\n ],\n AfterTool: [\n {\n matcher: \"run_shell_command|replace|write_file|create_file\",\n hooks: [{ name: \"ca-post-tool\", type: \"command\", command: \"bash .gemini/hooks/ca-post-tool.sh\" }],\n },\n ],\n },\n};\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction parseDescription(content: string, fallback: string): string {\n const raw = content.match(/description:\\s*(.*)/)?.[1] ?? fallback;\n return raw.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/** Strip YAML frontmatter (---...---) from content if present. */\nfunction stripFrontmatter(content: string): string {\n return content.replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n*/, '');\n}\n\nasync function writeSettings(geminiDir: string): Promise<void> {\n const settingsPath = join(geminiDir, 'settings.json');\n let settings = SETTINGS_JSON as Record<string, unknown>;\n if (existsSync(settingsPath)) {\n try {\n const existing = JSON.parse(await readFile(settingsPath, 'utf8')) as Record<string, unknown>;\n settings = {\n ...existing,\n hooks: {\n ...(existing.hooks as Record<string, unknown> | undefined),\n ...SETTINGS_JSON.hooks,\n },\n };\n } catch {\n // Can't parse existing - overwrite\n }\n }\n await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\\n', 'utf8');\n}\n\nasync function writeTomlCommands(geminiDir: string): Promise<void> {\n for (const [filename, content] of Object.entries(WORKFLOW_COMMANDS)) {\n const cmdName = filename.replace('.md', '');\n const description = parseDescription(content, `Compound ${cmdName} command`);\n const toml = `description = \"${description}\"\nprompt = \"\"\"\n@{.claude/commands/compound/${filename}}\n\n{{args}}\n\"\"\"\n`;\n await writeFile(join(geminiDir, 'commands', 'compound', `${cmdName}.toml`), toml, 'utf8');\n }\n}\n\nasync function writeSkills(geminiDir: string): Promise<void> {\n for (const [phase, content] of Object.entries(PHASE_SKILLS)) {\n const skillDir = join(geminiDir, 'skills', `compound-${phase}`);\n await mkdir(skillDir, { recursive: true });\n const description = parseDescription(content, `Compound ${phase} skill`);\n const body = stripFrontmatter(content);\n await writeFile(join(skillDir, 'SKILL.md'), `---\\nname: compound-${phase}\\ndescription: ${description}\\n---\\n\\n${body}\\n`, 'utf8');\n }\n\n for (const [name, content] of Object.entries(AGENT_ROLE_SKILLS)) {\n const skillDir = join(geminiDir, 'skills', `compound-agent-${name}`);\n await mkdir(skillDir, { recursive: true });\n const description = parseDescription(content, `Compound agent ${name} skill`);\n const body = stripFrontmatter(content);\n await writeFile(join(skillDir, 'SKILL.md'), `---\\nname: compound-agent-${name}\\ndescription: ${description}\\n---\\n\\n${body}\\n`, 'utf8');\n }\n}\n\n// ============================================================================\n// Installer\n// ============================================================================\n\nexport async function installGeminiAdapter(\n options: { dryRun?: boolean; json?: boolean }\n): Promise<void> {\n const repoRoot = getRepoRoot();\n const geminiDir = join(repoRoot, '.gemini');\n\n if (options.dryRun) {\n if (options.json) {\n console.log(JSON.stringify({ dryRun: true, wouldInstall: true, location: geminiDir }));\n } else {\n console.log(`Would install gemini hooks and commands to ${geminiDir}`);\n }\n return;\n }\n\n await mkdir(join(geminiDir, 'hooks'), { recursive: true });\n await mkdir(join(geminiDir, 'commands', 'compound'), { recursive: true });\n\n for (const [filename, content] of Object.entries(HOOKS)) {\n await writeFile(join(geminiDir, 'hooks', filename), content, { mode: 0o755 });\n }\n\n await writeSettings(geminiDir);\n await writeTomlCommands(geminiDir);\n await writeSkills(geminiDir);\n\n if (options.json) {\n console.log(JSON.stringify({ installed: true, location: geminiDir, action: 'created' }));\n } else {\n out.success('Gemini CLI compatibility hooks installed');\n console.log(` Location: ${geminiDir}`);\n console.log(' Hooks: SessionStart, BeforeAgent, BeforeTool, AfterTool');\n console.log(' Commands: /compound:* aliases generated');\n }\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register the gemini subcommand on an existing setup command.\n */\nexport function registerGeminiSubcommand(setupCommand: Command): void {\n setupCommand\n .command('gemini')\n .description('Install Gemini CLI compatibility hooks (Adapter Pattern)')\n .option('--dry-run', 'Show what would change without writing')\n .option('--json', 'Output as JSON')\n .action(async (options: { dryRun?: boolean; json?: boolean }) => {\n try {\n await installGeminiAdapter(options);\n } catch (err) {\n if (options.json) {\n console.log(JSON.stringify({ error: String(err) }));\n } else {\n console.error(formatError('setup', 'GEMINI_INSTALL_ERROR', String(err), 'Check .gemini/ directory permissions'));\n }\n process.exitCode = 1;\n }\n });\n}\n","/**\n * UserPromptSubmit hook: pattern detection and 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 * PostToolUseFailure hook: cross-process failure tracking with memory tip.\n */\n\nimport { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\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 * Phase check state machine.\n *\n * Manages cook-it 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\nimport { EPIC_ID_PATTERN, getRepoRoot } from '../cli-utils.js';\n\nconst STATE_DIR = '.claude';\nconst STATE_FILE = '.ca-phase-state.json';\n\n/** Max age for phase state before it's considered stale (72 hours). */\nexport const PHASE_STATE_MAX_AGE_MS = 72 * 60 * 60 * 1000;\n\nexport const PHASES = ['spec-dev', '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 'spec-dev': 1,\n plan: 2,\n work: 3,\n review: 4,\n compound: 5,\n};\n\nexport interface PhaseState {\n cookit_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\n/** Migrate legacy lfg_active field to cookit_active. */\nfunction migrateLegacyFields(raw: Record<string, unknown>): void {\n if (raw.cookit_active === undefined && typeof raw.lfg_active === 'boolean') {\n raw.cookit_active = raw.lfg_active;\n delete raw.lfg_active;\n }\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 migrateLegacyFields(state);\n\n return (\n typeof state.cookit_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 cookit_active: true,\n epic_id: epicId,\n current_phase: 'spec-dev',\n phase_index: PHASE_INDEX['spec-dev'],\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 if (!validatePhaseState(parsed)) return null;\n // TTL check: discard and clean up stale state from abandoned cook-it runs\n const age = Date.now() - new Date(parsed.started_at).getTime();\n if (age > PHASE_STATE_MAX_AGE_MS) {\n cleanPhaseState(repoRoot);\n return null;\n }\n return parsed;\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 cook-it session.');\n return;\n }\n console.log('Active cook-it 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: spec-dev (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 ?? { cookit_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 cook-it 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 => getRepoRoot();\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.cookit_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 cook-it 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.cookit_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, cook-it 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.cookit_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, lstatSync, readFileSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport type { Command } from 'commander';\n\nimport { formatError } from '../cli-error-format.js';\nimport { getRepoRoot } from '../cli-utils.js';\nimport { processUserPrompt } from './hooks-user-prompt.js';\nimport { processToolFailure, processToolSuccess } from './hooks-failure-tracker.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 POST_COMMIT_HOOK_MARKER,\n POST_COMMIT_HOOK_TEMPLATE,\n COMPOUND_AGENT_POST_COMMIT_BLOCK,\n} from './templates.js';\n\n/** Log hook errors to stderr when CA_DEBUG is set. */\nfunction logHookError(hookName: string, err: unknown): void {\n if (process.env.CA_DEBUG) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[CA_DEBUG] Hook ${hookName} error: ${msg}`);\n }\n}\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// Re-export extracted modules for backwards compatibility\nexport { detectCorrection, detectPlanning, processUserPrompt } from './hooks-user-prompt.js';\nexport type { UserPromptHookOutput } from './hooks-user-prompt.js';\nexport {\n processToolFailure,\n processToolSuccess,\n resetFailureState,\n readFailureState,\n writeFailureState,\n STATE_FILE_NAME,\n} from './hooks-failure-tracker.js';\nexport type { FailureState, PostToolFailureHookOutput } from './hooks-failure-tracker.js';\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 gitPath = join(repoRoot, '.git');\n\n if (!existsSync(gitPath)) {\n return null;\n }\n\n // Resolve actual .git dir (may be a file in worktrees: \"gitdir: ../../.git/worktrees/foo\")\n let gitDir = gitPath;\n if (lstatSync(gitPath).isFile()) {\n const content = readFileSync(gitPath, 'utf-8').trim();\n const match = /^gitdir:\\s*(.+)$/.exec(content);\n if (!match?.[1]) return null;\n gitDir = resolve(repoRoot, match[1]);\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 * Install post-commit hook for auto-indexing docs/ on commit.\n *\n * Mirrors installPreCommitHook: respects core.hooksPath, appends to\n * existing hooks, uses marker for idempotency.\n */\nexport async function installPostCommitHook(repoRoot: string): Promise<HookInstallResult> {\n const gitHooksDir = await getGitHooksDir(repoRoot);\n\n if (!gitHooksDir) {\n return { status: 'not_git_repo' };\n }\n\n await mkdir(gitHooksDir, { recursive: true });\n\n const hookPath = join(gitHooksDir, 'post-commit');\n\n if (existsSync(hookPath)) {\n const content = await readFile(hookPath, 'utf-8');\n if (content.includes(POST_COMMIT_HOOK_MARKER)) {\n return { status: 'already_installed' };\n }\n\n const lines = content.split('\\n');\n const exitLineIndex = findFirstTopLevelExitLine(lines);\n\n let newContent: string;\n if (exitLineIndex === -1) {\n newContent = content.trimEnd() + '\\n' + COMPOUND_AGENT_POST_COMMIT_BLOCK;\n } else {\n const before = lines.slice(0, exitLineIndex);\n const after = lines.slice(exitLineIndex);\n newContent = before.join('\\n') + COMPOUND_AGENT_POST_COMMIT_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 await writeFile(hookPath, POST_COMMIT_HOOK_TEMPLATE, 'utf-8');\n chmodSync(hookPath, HOOK_FILE_MODE);\n\n return { status: 'installed' };\n}\n\n/** Stdin read timeout for hooks (30 seconds). */\nconst HOOK_STDIN_TIMEOUT_MS = 30_000;\n\n/**\n * Read stdin as a string with timeout protection.\n */\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n let timerId: ReturnType<typeof setTimeout> | undefined;\n\n const timeout = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new Error('stdin read timed out')), HOOK_STDIN_TIMEOUT_MS);\n });\n\n const read = (async () => {\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 try {\n return await Promise.race([read, timeout]);\n } finally {\n clearTimeout(timerId);\n }\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 (err) {\n logHookError('user-prompt', err);\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(getRepoRoot(), '.claude');\n const result = processToolFailure(data.tool_name, data.tool_input ?? {}, stateDir);\n console.log(JSON.stringify(result));\n } catch (err) {\n logHookError('post-tool-failure', err);\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(getRepoRoot(), '.claude');\n processToolSuccess(stateDir);\n console.log(JSON.stringify({}));\n } catch (err) {\n logHookError('post-tool-success', err);\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(getRepoRoot(), data.tool_name, data.tool_input ?? {})));\n } catch (err) { logHookError('tool-hook', err); 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(getRepoRoot(), data.stop_hook_active ?? false)));\n } catch (err) { logHookError('stop-audit', err); 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 * Shared primitives for setup commands.\n * Used by both init.ts and setup-all.ts to avoid duplication.\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\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, PHASE_SKILL_REFERENCES } 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\n // Install reference files alongside skills\n for (const [relPath, content] of Object.entries(PHASE_SKILL_REFERENCES)) {\n const filePath = join(repoRoot, '.claude', 'skills', 'compound', relPath);\n await mkdir(dirname(filePath), { recursive: true });\n if (!existsSync(filePath)) {\n await writeFile(filePath, content, 'utf-8');\n created = true;\n }\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 * Install research docs from the package's docs/research/ to docs/compound/research/ in the user's project.\n *\n * @param force - When true, overwrites existing files if content differs (used by --update).\n * When false (default), skips existing files (idempotent fresh install).\n * @returns true if any research docs were created or updated\n */\nexport async function installResearchDocs(repoRoot: string, options?: { force?: boolean }): Promise<boolean> {\n const force = options?.force ?? false;\n // Resolve the package's docs/research/ directory via import.meta.url\n // In the built bundle, import.meta.url points to dist/cli.js.\n // Go up one level from dist/ to reach the package root.\n const pkgRoot = join(dirname(fileURLToPath(import.meta.url)), '..');\n const srcDir = join(pkgRoot, 'docs', 'research');\n\n if (!existsSync(srcDir)) {\n return false; // Package doesn't include research docs (dev-only)\n }\n\n const destDir = join(repoRoot, 'docs', 'compound', 'research');\n await mkdir(destDir, { recursive: true });\n\n let created = false;\n\n async function copyDir(src: string, dest: string): Promise<void> {\n const entries = await readdir(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = join(src, entry.name);\n const destPath = join(dest, entry.name);\n if (entry.isDirectory()) {\n await mkdir(destPath, { recursive: true });\n await copyDir(srcPath, destPath);\n continue;\n }\n if (!entry.name.endsWith('.md')) continue;\n const exists = existsSync(destPath);\n if (exists && !force) continue;\n\n let content = await readFile(srcPath, 'utf-8');\n // Rewrite index.md header to note provenance\n if (entry.name === 'index.md') {\n const patched = content.replace(\n /^# .*/m,\n '$&\\n\\n> Shipped by compound-agent. Source: `docs/research/` in the compound-agent package.',\n );\n content = patched !== content ? patched : `> Shipped by compound-agent.\\n\\n${content}`;\n }\n // In force mode, skip write if content is unchanged\n if (exists && (await readFile(destPath, 'utf-8')) === content) continue;\n await writeFile(destPath, content, 'utf-8');\n created = true;\n }\n }\n\n try {\n await copyDir(srcDir, destDir);\n } catch (err) {\n console.error(`Warning: Could not install research docs: ${(err as Error).message}`);\n return false;\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// ============================================================================\n// SQLite verification + auto-rebuild\n// ============================================================================\n\nimport { ensureSqliteAvailable, resetSqliteAvailability } from '../memory/storage/index.js';\n\n/** Result of post-setup SQLite verification. */\nexport interface SqliteVerifyResult {\n /** Whether SQLite (better-sqlite3) is currently loadable. */\n available: boolean;\n /** What action was taken (or attempted). */\n action: 'already_ok' | 'rebuilt' | 'installed_and_rebuilt' | 'failed';\n /** Error message if action is 'failed'. */\n error?: string;\n}\n\n/**\n * Try loading SQLite, returning true on success, false on failure.\n */\nfunction trySqliteLoad(): boolean {\n try {\n ensureSqliteAvailable();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify SQLite availability and attempt auto-rebuild if needed.\n *\n * Strategy:\n * 1. Try ensureSqliteAvailable() — if works, fast path (zero overhead)\n * 2. If non-pnpm: report failure with npm rebuild suggestion\n * 3. If pnpm: try `pnpm rebuild better-sqlite3`, re-check\n * 4. If still fails: try `pnpm install` then rebuild, re-check\n * 5. All attempts fail: report with manual instructions\n *\n * Non-blocking: never throws. Reports result honestly.\n */\nexport function verifySqlite(repoRoot: string, pnpmConfig: PnpmConfigResult): SqliteVerifyResult {\n // Fast path: already works\n if (trySqliteLoad()) {\n return { available: true, action: 'already_ok' };\n }\n\n // Non-pnpm: can't auto-fix (npm/yarn build native modules by default)\n if (!pnpmConfig.isPnpm) {\n return {\n available: false,\n action: 'failed',\n error: 'better-sqlite3 failed to load. Run: npm rebuild better-sqlite3',\n };\n }\n\n // Attempt 1: pnpm rebuild better-sqlite3\n try {\n execFileSync('pnpm', ['rebuild', 'better-sqlite3'], {\n cwd: repoRoot,\n stdio: 'pipe',\n timeout: 60_000,\n });\n } catch {\n // rebuild failed, will try install next\n }\n\n resetSqliteAvailability();\n if (trySqliteLoad()) {\n return { available: true, action: 'rebuilt' };\n }\n\n // Attempt 2: pnpm install + rebuild (escalation)\n try {\n execFileSync('pnpm', ['install'], {\n cwd: repoRoot,\n stdio: 'pipe',\n timeout: 120_000,\n });\n execFileSync('pnpm', ['rebuild', 'better-sqlite3'], {\n cwd: repoRoot,\n stdio: 'pipe',\n timeout: 60_000,\n });\n } catch {\n // install or rebuild failed\n }\n\n resetSqliteAvailability();\n if (trySqliteLoad()) {\n return { available: true, action: 'installed_and_rebuilt' };\n }\n\n return {\n available: false,\n action: 'failed',\n error: 'Auto-rebuild failed. Run manually: pnpm install && pnpm rebuild better-sqlite3',\n };\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+. learn.md replaced by learn-that.md in v1.4. brainstorm.md renamed to spec-dev.md in v1.5. lfg.md renamed to cook-it.md in v1.6. */\nconst DEPRECATED_COMMANDS = ['search.md', 'list.md', 'show.md', 'stats.md', 'wrong.md', 'learn.md', 'brainstorm.md', 'lfg.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): ${removedCommands.join(', ')}`);\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 * 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, installPostCommitHook, type HookInstallResult } from './hooks.js';\nimport {\n createPluginManifest,\n ensureClaudeMdReference,\n ensurePnpmBuildConfig,\n installAgentRoleSkills,\n installAgentTemplates,\n installDocTemplates,\n installPhaseSkills,\n installResearchDocs,\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// Model & Background Embedding Helpers\n// ============================================================================\n\ntype ModelStatus = 'downloaded' | 'exists' | 'failed' | 'skipped';\n\n/** Download embedding model and optionally trigger background embedding. */\nasync function handleModelAndEmbed(\n repoRoot: string,\n opts: { skipModel?: boolean; quiet: boolean; json?: boolean },\n): Promise<ModelStatus> {\n if (opts.skipModel) return 'skipped';\n\n let status: ModelStatus = 'skipped';\n try {\n const { isModelAvailable, resolveModel } = await import('../memory/embeddings/index.js');\n if (isModelAvailable()) {\n status = 'exists';\n if (!opts.quiet && !opts.json) console.log(' Embedding model: already exists');\n } else {\n if (!opts.quiet && !opts.json) out.info('Downloading embedding model...');\n await resolveModel({ cli: !opts.json });\n status = 'downloaded';\n if (!opts.quiet && !opts.json) out.info('Embedding model downloaded.');\n }\n } catch (err) {\n status = 'failed';\n const msg = err instanceof Error ? err.message : 'Unknown error';\n console.error('[compound-agent] Embedding model download failed: ' + msg);\n console.error('[compound-agent] Run `npx ca download-model` manually.');\n }\n\n // Trigger background embedding if docs/ exists and model available\n if (status === 'exists' || status === 'downloaded') {\n try {\n const { indexAndSpawnEmbed } = await import('../memory/knowledge/embed-background.js');\n const spawnResult = await indexAndSpawnEmbed(repoRoot);\n if (spawnResult?.spawned && !opts.quiet && !opts.json) {\n out.info('Embedding in progress (background). You can start working.');\n }\n } catch {\n // Non-fatal: don't break init if background embedding fails to spawn\n }\n\n // Pre-warm lesson embeddings so the first search is fast\n try {\n const { withEmbedding } = await import('../memory/embeddings/index.js');\n const { preWarmLessonEmbeddings } = await import('../memory/search/prewarm.js');\n await withEmbedding(async () => preWarmLessonEmbeddings(repoRoot));\n } catch {\n // Non-fatal: don't break init if lesson pre-warming fails\n }\n }\n\n return status;\n}\n\n// ============================================================================\n// Action Handler\n// ============================================================================\n\nasync function initAction(\n cmd: Command,\n options: { skipAgents?: boolean; skipHooks?: boolean; skipClaude?: boolean; skipModel?: 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 await ensureClaudeMdReference(repoRoot);\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 await installResearchDocs(repoRoot);\n }\n\n let hookResult: HookInstallResult | null = null;\n if (!options.skipHooks) {\n hookResult = await installPreCommitHook(repoRoot);\n await installPostCommitHook(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 const gitignoreResult = await ensureGitignore(repoRoot);\n const modelStatus = await handleModelAndEmbed(repoRoot, { skipModel: options.skipModel, quiet, json: options.json });\n const fullBeads = runFullBeadsCheck(repoRoot);\n\n if (options.json) {\n printInitJson({ lessonsDir, agentsMdUpdated, hookResult, claudeHooksResult, pnpmConfig, fullBeads, scopeResult, upgradeResult, gitignoreResult, modelStatus });\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 printModelStatus(modelStatus, options.skipModel);\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 modelStatus: string;\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 model: ctx.modelStatus,\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 printModelStatus(status: string, skipped?: boolean): void {\n if (skipped) {\n console.log(' Embedding model: Skipped (--skip-model)');\n } else if (status === 'exists') {\n // Already printed inline during download check\n } else if (status === 'downloaded') {\n // Already printed inline during download\n } else if (status === 'failed') {\n // Already printed inline via console.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('--skip-model', 'Skip embedding model download')\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; skipModel?: boolean; json?: boolean; update?: boolean }) {\n await initAction(this, options);\n });\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 } 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, deletedIds } = await readMemoryItems(repoRoot);\n const item = items.find((i) => i.id === id);\n\n if (!item) {\n const wasDeleted = deletedIds.has(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, deletedIds } = await readMemoryItems(repoRoot);\n const item = items.find((i) => i.id === id);\n\n if (!item) {\n const wasDeleted = deletedIds.has(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, deletedIds } = 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 warnings.push({ id, message: deletedIds.has(id) ? '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 * Memory module barrel export.\n *\n * Re-exports types and sub-module APIs for cross-module consumption.\n */\n\n// Types and schemas (from types.ts)\nexport {\n generateId,\n LessonItemSchema,\n LessonSchema,\n MemoryItemRecordSchema,\n MemoryItemSchema,\n MemoryItemTypeSchema,\n PatternItemSchema,\n PatternSchema,\n PreferenceItemSchema,\n SeveritySchema,\n SolutionItemSchema,\n} from './types.js';\nexport type {\n Context,\n Lesson,\n LessonRecord,\n LessonType,\n MemoryItem,\n MemoryItemRecord,\n MemoryItemType,\n PatternItem,\n Preference,\n Severity,\n Solution,\n Source,\n} from './types.js';\n\n// Storage API\nexport {\n appendLesson,\n appendMemoryItem,\n closeDb,\n DB_PATH,\n LESSONS_PATH,\n readLessons,\n readMemoryItems,\n rebuildIndex,\n searchKeyword,\n} from './storage/index.js';\n\n// Embeddings API\nexport {\n embedText,\n embedTexts,\n getEmbedding,\n isModelAvailable,\n isModelUsable,\n MODEL_FILENAME,\n MODEL_URI,\n resolveModel,\n unloadEmbedding,\n} from './embeddings/index.js';\n\n// Search API\nexport {\n CANDIDATE_MULTIPLIER,\n cosineSimilarity,\n mergeHybridResults,\n normalizeBm25Rank,\n rankLessons,\n searchVector,\n} from './search/index.js';\nexport type { RankedLesson, ScoredKeywordResult, ScoredLesson } from './search/index.js';\n\n// Capture API\nexport {\n detectSelfCorrection,\n detectTestFailure,\n detectUserCorrection,\n inferMemoryItemType,\n isActionable,\n isNovel,\n isSpecific,\n shouldPropose,\n} from './capture/index.js';\n\n// Retrieval API\nexport { loadSessionLessons, retrieveForPlan } from './retrieval/index.js';\n\n// Storage extras\nexport {\n compact,\n countTombstones,\n getRetrievalStats,\n incrementRetrievalCount,\n needsCompaction,\n syncIfNeeded,\n TOMBSTONE_THRESHOLD,\n} from './storage/index.js';\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 { isModelAvailable } from '../embeddings/model.js';\nimport { findSimilarLessons } from '../search/index.js';\nimport { syncIfNeeded } from '../storage/index.js';\n\n/** Cosine similarity threshold for near-duplicate detection */\nconst DUPLICATE_THRESHOLD = 0.98;\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 near-duplicate of existing lessons).\n * Uses semantic embeddings with cosine similarity.\n * Falls back to novel: true when model is unavailable or on error.\n */\nexport async function isNovel(\n repoRoot: string,\n insight: string,\n options: NoveltyOptions = {}\n): Promise<NoveltyResult> {\n const threshold = options.threshold ?? DUPLICATE_THRESHOLD;\n\n if (!isModelAvailable()) {\n return { novel: true };\n }\n\n try {\n await syncIfNeeded(repoRoot);\n const similar = await findSimilarLessons(repoRoot, insight, { threshold });\n const top = similar[0];\n if (top) {\n return {\n novel: false,\n reason: `Near-duplicate of existing lesson: \"${top.item.insight.slice(0, 50)}...\"`,\n existingId: top.item.id,\n };\n }\n return { novel: true };\n } catch (err) {\n if (process.env['CA_DEBUG']) {\n process.stderr.write(`[CA_DEBUG] isNovel catch: ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n return { novel: true };\n }\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 { CANDIDATE_MULTIPLIER, DEFAULT_TEXT_WEIGHT, MIN_HYBRID_SCORE, mergeHybridResults, rankLessons, searchVector, type RankedLesson, type ScoredLesson } from '../search/index.js';\nimport { incrementRetrievalCount, searchKeywordScored } 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 hybrid search (vector similarity + FTS5 keyword matching)\n * then applies ranking boosts for severity, recency, and confirmation.\n *\n * Falls back to keyword-only search when the embedding model is unavailable.\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 const candidateLimit = limit * CANDIDATE_MULTIPLIER;\n\n // Attempt hybrid search: vector similarity + keyword matching.\n // If vector search fails (model unavailable/broken), fall back to keyword-only.\n let vectorResults: ScoredLesson[] = [];\n let vectorFailed = false;\n const keywordResultsPromise = searchKeywordScored(repoRoot, planText, candidateLimit);\n\n try {\n vectorResults = await searchVector(repoRoot, planText, { limit: candidateLimit });\n } catch {\n vectorFailed = true;\n console.error('[compound-agent] Vector search unavailable, falling back to keyword-only search');\n }\n\n const keywordResults = await keywordResultsPromise;\n\n let merged: ScoredLesson[];\n if (vectorFailed) {\n // Keyword-only: use text scores directly (no vector blending, no minScore filter\n // since keyword-only scores are lower than hybrid blended scores)\n merged = mergeHybridResults([], keywordResults, {\n vectorWeight: 0,\n textWeight: DEFAULT_TEXT_WEIGHT,\n });\n } else {\n merged = mergeHybridResults(vectorResults, keywordResults, { minScore: MIN_HYBRID_SCORE });\n }\n\n // Apply ranking boosts (severity, recency, confirmation)\n const ranked = rankLessons(merged);\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 * 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.error(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 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 * Doctor command — verify external dependencies and project health.\n *\n * Usage: ca doctor\n */\n\nimport { execFileSync } 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 { ensureSqliteAvailable } from '../memory/storage/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/', '.claude/.ca-*.json'].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 checks.push(checkEmbeddingModel());\n\n // 7. SQLite (better-sqlite3)\n checks.push(checkSqliteHealth());\n\n // 8. pnpm onlyBuiltDependencies config\n const pnpmCheck = checkPnpmBuildConfig(repoRoot);\n if (pnpmCheck !== null) {\n checks.push(pnpmCheck);\n }\n\n // 9. 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: 'Run: ca install-beads' });\n\n // 10. .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 // 11. 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 // 12. 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 // 13. Beads healthy\n if (beadsResult.available && existsSync(beadsDir)) {\n try {\n execFileSync('bd', ['doctor'], { cwd: repoRoot, 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 // 14. 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\nfunction checkEmbeddingModel(): DoctorCheck {\n try {\n return isModelAvailable()\n ? { name: 'Embedding model', status: 'pass' }\n : { name: 'Embedding model', status: 'warn', fix: 'Run: npx ca download-model' };\n } catch {\n return { name: 'Embedding model', status: 'warn', fix: 'Run: npx ca download-model' };\n }\n}\n\nfunction checkSqliteHealth(): DoctorCheck {\n try {\n ensureSqliteAvailable();\n return { name: 'SQLite (better-sqlite3)', status: 'pass' };\n } catch {\n return { name: 'SQLite (better-sqlite3)', status: 'fail', fix: 'Run: pnpm rebuild better-sqlite3 (or npm rebuild better-sqlite3)' };\n }\n}\n\n/**\n * Check if a pnpm project has onlyBuiltDependencies configured for native addons.\n * Returns null for non-pnpm projects (check is irrelevant).\n *\n * NOTE: The required deps list must stay in sync with\n * src/setup/primitives.ts REQUIRED_BUILD_DEPS and scripts/postinstall.mjs.\n */\nexport function checkPnpmBuildConfig(repoRoot: string): DoctorCheck | null {\n const lockPath = join(repoRoot, 'pnpm-lock.yaml');\n const pkgPath = join(repoRoot, 'package.json');\n\n // Single read of package.json, reused for both pnpm detection and config check\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as Record<string, unknown>;\n } catch { return null; }\n\n const hasLockfile = existsSync(lockPath);\n const hasPmField = typeof pkg.packageManager === 'string' && pkg.packageManager.startsWith('pnpm');\n if (!hasLockfile && !hasPmField) return null;\n\n const pnpmConfig = pkg.pnpm as Record<string, unknown> | undefined;\n const deps = pnpmConfig?.onlyBuiltDependencies;\n if (!Array.isArray(deps)) {\n return { name: 'pnpm build config', status: 'fail', fix: 'Run: npx ca setup (or add \"pnpm.onlyBuiltDependencies\" to package.json)' };\n }\n // Wildcard \"*\" means all builds are allowed\n if (deps.includes('*')) return { name: 'pnpm build config', status: 'pass' };\n const required = ['better-sqlite3', 'node-llama-cpp'];\n const missing = required.filter(d => !deps.includes(d));\n if (missing.length > 0) {\n return { name: 'pnpm build config', status: 'fail', fix: `Missing from onlyBuiltDependencies: [${missing.join(', ')}]. Run: npx ca setup` };\n }\n return { name: 'pnpm build config', status: 'pass' };\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\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 // Output as JSONL (one JSON object per line) for round-trip compatibility with import\n for (const item of filtered) {\n console.log(JSON.stringify(item));\n }\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(` 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: remove tombstones and invalid records')\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';\nimport { join } from 'node:path';\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 { checkForUpdate } from '../update-check.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 - MUST call before architectural decisions; use anytime you need context |\n| \\`npx ca knowledge \"query\"\\` | Semantic search over project docs - MUST call before architectural decisions; use keyword phrases, not questions |\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\\` and \\`npx ca knowledge\\` 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\nBeyond mandatory triggers, use these commands freely — they are lightweight queries, not heavyweight operations. Uncertain about a pattern? \\`ca search\\`. Need a detail from the docs? \\`ca knowledge\\`. The cost of an unnecessary search is near-zero; the cost of a missed one can be hours.\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 formatActiveCookitSection(repoRoot: string): string | null {\n const state = getPhaseState(repoRoot);\n if (state === null || !state.cookit_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 COOK-IT 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 cookitSection = formatActiveCookitSection(root);\n if (cookitSection !== null) {\n output += cookitSection;\n }\n\n // Append update notification when NOT in a TTY.\n // In a TTY session, runProgram() already prints a post-command update notice,\n // so we skip it here to avoid duplication. In non-TTY contexts (Claude Code\n // session context), prime is the only place that can surface this.\n if (!process.stdout.isTTY) {\n try {\n const updateResult = await checkForUpdate(join(root, '.claude', '.cache'));\n if (updateResult?.updateAvailable) {\n output += `\n---\n# Update Available\ncompound-agent v${updateResult.latest} is available (current: v${updateResult.current}). Run \\`pnpm update --latest compound-agent\\` to update.\n`;\n }\n } catch {\n // Non-fatal: update check failure should never block prime\n }\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 * Update-check module -- fetches latest version from npm, caches results,\n * and formats upgrade notifications.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { VERSION } from './version.js';\n\nexport interface UpdateCheckResult {\n current: string;\n latest: string;\n updateAvailable: boolean;\n}\n\ninterface CacheData {\n latest: string;\n}\n\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst FETCH_TIMEOUT_MS = 3000;\nconst CACHE_FILENAME = 'update-check.json';\n\n/**\n * Fetch the latest published version of a package from the npm registry.\n * Returns null on any error.\n */\nexport async function fetchLatestVersion(\n packageName: string = 'compound-agent',\n): Promise<string | null> {\n try {\n const res = await fetch(`https://registry.npmjs.org/${packageName}`, {\n signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),\n });\n if (!res.ok) return null;\n const data = await res.json();\n const tags = (data as Record<string, unknown>)['dist-tags'];\n if (typeof tags !== 'object' || tags === null) return null;\n const latest = (tags as Record<string, unknown>)['latest'];\n return typeof latest === 'string' ? latest : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check whether an update is available, using a file-based cache to avoid\n * hitting the registry on every invocation.\n * Returns null on any failure.\n */\nexport async function checkForUpdate(\n cacheDir: string,\n): Promise<UpdateCheckResult | null> {\n try {\n const cachePath = join(cacheDir, CACHE_FILENAME);\n\n // Try reading a fresh cache\n const cached = readCache(cachePath);\n if (cached) {\n return {\n current: VERSION,\n latest: cached.latest,\n updateAvailable: semverGt(cached.latest, VERSION),\n };\n }\n\n // Cache miss / expired / corrupt -- fetch from registry\n const latest = await fetchLatestVersion();\n if (latest === null) return null;\n\n // Write cache\n try {\n mkdirSync(cacheDir, { recursive: true });\n const cacheData: CacheData = { latest };\n writeFileSync(cachePath, JSON.stringify(cacheData));\n } catch {\n // Cache write failure is non-fatal\n }\n\n return {\n current: VERSION,\n latest,\n updateAvailable: semverGt(latest, VERSION),\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Format a human-readable update notification string.\n */\nexport function formatUpdateNotification(\n current: string,\n latest: string,\n): string {\n return `Update available: ${current} -> ${latest}\\nRun: pnpm update --latest compound-agent`;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true if version a is strictly greater than version b.\n * Handles standard MAJOR.MINOR.PATCH semver format.\n */\nfunction semverGt(a: string, b: string): boolean {\n const parse = (v: string): [number, number, number] => {\n const parts = v.split('.').map(n => parseInt(n, 10) || 0);\n return [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0];\n };\n const [aMaj, aMin, aPat] = parse(a);\n const [bMaj, bMin, bPat] = parse(b);\n if (aMaj !== bMaj) return aMaj > bMaj;\n if (aMin !== bMin) return aMin > bMin;\n return aPat > bPat;\n}\n\nfunction readCache(cachePath: string): CacheData | null {\n try {\n const stat = statSync(cachePath);\n if (Date.now() - stat.mtimeMs > CACHE_TTL_MS) return null;\n\n const raw = readFileSync(cachePath, 'utf-8');\n const data = JSON.parse(raw) as CacheData;\n if (!data.latest) return null;\n return data;\n } catch {\n return null;\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 * 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 * 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 timeout: z.number().int().positive().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 */\n/** Default timeout for script checks (30 seconds). */\nconst DEFAULT_SCRIPT_TIMEOUT = 30_000;\n\nexport function runScriptCheck(check: ScriptCheck, baseDir?: string): Violation[] {\n const expectedCode = check.expectExitCode ?? 0;\n const timeout = check.timeout ?? DEFAULT_SCRIPT_TIMEOUT;\n\n try {\n execSync(check.command, { stdio: ['pipe', 'pipe', 'pipe'], cwd: baseDir, timeout });\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 * 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 * 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;\n\n/** Valid reviewer names for the infinity loop review phase. */\nexport const VALID_LOOP_REVIEWERS = ['claude-sonnet', 'claude-opus', 'gemini', 'codex'] as const;\nexport type LoopReviewerName = (typeof VALID_LOOP_REVIEWERS)[number];\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/** Allowed test command prefixes. */\nconst SAFE_CMD_PREFIXES = ['pnpm', 'npm', 'npx', 'yarn', 'vitest', 'jest'];\n\n/** Shell metacharacters that indicate injection attempts. */\nconst SHELL_META = /[;|&`$(){}!<>\\\\]/;\n\n/** Check if a --cmd value is safe to execute. */\nexport function isTestCommandSafe(cmd: string): boolean {\n if (SHELL_META.test(cmd)) return false;\n const firstWord = cmd.split(/\\s/)[0] ?? '';\n return SAFE_CMD_PREFIXES.includes(firstWord);\n}\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 if (!isTestCommandSafe(options.cmd)) {\n console.error(`Unsafe --cmd value: \"${options.cmd}\". Must start with ${SAFE_CMD_PREFIXES.join('/')} and contain no shell metacharacters.`);\n process.exitCode = 1;\n return;\n }\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.exitCode = 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 allPassed = checks.every((check) => check.status === 'pass');\n if (allPassed) {\n const state = getPhaseState(repoRoot);\n if (state !== null && state.cookit_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.7.6] - 2026-03-12\n\n### Added\n\n- **\\`ca install-beads\\` command**: Standalone subcommand to install the beads CLI via the official script. Includes a platform guard (skips on Windows with \\`exitCode 1\\`), an \"already installed\" short-circuit, a \\`--yes\\` flag to bypass the confirmation hint (safe: never runs \\`curl | bash\\` without explicit opt-in), \\`spawnSync\\` with a 60-second timeout, and a post-install shell-reload warning. Non-TTY mode without \\`--yes\\` prints the install command as a copy-pasteable hint rather than silently doing nothing.\n\n### Fixed\n\n- **Beads hint display**: \\`printBeadsFullStatus\\` was silently swallowing the install hint message when the beads CLI was not found. The curl install command is now printed below the \"not found\" line.\n- **Beads hint text**: \\`checkBeadsAvailable\\` now returns the actual \\`curl -sSL ... | bash\\` install command in its message instead of a bare repo URL.\n- **Doctor fix message**: \\`ca doctor\\` now shows \\`Run: ca install-beads\\` for the missing-beads check instead of pointing to a URL.\n- **\\`ca knowledge\\` description**: Reframed from \"Ask the project docs any question\" to \"Semantic search over project docs — use keyword phrases, not questions\" in both the live prime template and the setup template, reflecting the underlying embedding RAG retrieval mechanism.\n\n## [1.7.5] - 2026-03-12\n\n### Added\n\n- **\\`ca feedback\\` command**: Surfaces the GitHub Discussions URL for bug reports and feature requests. \\`ca feedback --open\\` opens the page directly in the browser. Cross-platform (macOS \\`open\\`, Windows \\`start\\`, Linux \\`xdg-open\\`).\n- **Star and feedback prompt in \\`ca about\\`**: TTY sessions now see a star-us link and the GitHub Discussions URL after the changelog output.\n\n### Changed\n\n- **README overhaul**: Complete rewrite to present compound-agent as a full agentic development environment rather than a memory plugin.\n - New thesis-driven one-liner that names category, mechanism, and benefit\n - \"What gets installed\" inventory table (15 commands, 24 agent role skills, 7 hooks, 5 phase skills, 5 docs)\n - Three principles section mapping each architecture layer to the problem it solves (Memory / Feedback Loops / Navigable Structure)\n - \"Agents are interchangeable\" design principle explained in the overview\n - Levels of use replacing flat Quick Start: memory-only, structured workflow, and factory mode with code examples\n - \\`/compound:architect\\` promoted to its own section with 4-phase description and context-window motivation\n - Infinity loop elevated from CLI table row to its own section with full flag examples and honest maturity note\n - Automatic hooks table with per-hook descriptions\n - Architecture diagram updated to reflect three-principle mapping and accurate counts\n - Compound loop diagram updated with architect as optional upstream entry point\n - \"Open with an AI agent\" entry point in the Documentation section\n\n## [1.7.4] - 2026-03-11\n\n### Added\n\n- **Research-enriched phase skills**: Applied insights from 3 PhD-level research documents (Science of Decomposition, Architecture Under Uncertainty, Emergent Behavior in Composed Systems) across all 6 core phase skills:\n - **Architect**: reversibility analysis (Baldwin & Clark), change volatility, 6-subagent convoy (added STPA control structure analyst + structural-semantic gap analyst), implicit interface contracts (threading, backpressure, delivery guarantees), organizational alignment (Team Topologies), multi-criteria validation gate (structural/semantic/organizational/economic), assumption capture with fitness functions and re-decomposition triggers\n - **Spec-dev**: Cynefin classification (Clear/Complicated/Complex), composition EARS templates (timeout/retry interactions), change volatility assessment\n - **Plan**: boundary stability check, Last Responsible Moment identification, change coupling prevention\n - **Work**: Fowler technical debt quadrant (only Prudent/Deliberate accepted), composition boundary verification with metastable failure checks\n - **Review**: composition-specific reviewers (boundary-reviewer, control-structure-reviewer, observability-reviewer), architect assumption validation\n - **Compound**: decomposition quality assessment, assumption tracking (predicted vs actual), emergence root cause classification (Garlan/STPA/phase transition)\n- **Lint graduation in compound phase**: The compound phase (step 10) now spawns a \\`lint-classifier\\` subagent that classifies each captured insight as LINTABLE, PARTIAL, or NOT_LINTABLE. High-confidence lintable insights are promoted to beads tasks under a \"Linting Improvement\" epic with self-contained rule specifications. Two rule classes: Class A (native \\`rules.json\\` — regex/glob) and Class B (external linter — AST analysis).\n- **Linter detection module** (\\`src/lint/\\`): Scans repos for ESLint (flat + legacy configs including TypeScript variants), Ruff (including \\`pyproject.toml\\`), Clippy, golangci-lint, ast-grep, and Semgrep. Exported from the package as \\`detectLinter()\\`, \\`LinterInfoSchema\\`, \\`LinterNameSchema\\`.\n- **Lint-classifier agent template**: Ships via \\`npx ca init\\` to \\`.claude/agents/compound/lint-classifier.md\\`. Includes 7 few-shot examples, Class A/B routing, and linter-aware task creation.\n\n### Fixed\n\n- **PhD research output path**: \\`/compound:get-a-phd\\` now writes user-generated research to \\`docs/research/\\` instead of \\`docs/compound/research/\\`. The \\`docs/compound/\\` directory is reserved for shipped library content; project-specific research no longer pollutes it. Overlap scanning checks both directories.`;\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\nconst REPO_URL = 'https://github.com/Nathandela/compound-agent';\nconst DISCUSSIONS_URL = `${REPO_URL}/discussions`;\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 if (process.stdout.isTTY) {\n console.log('');\n console.log(`Find this useful? Star us: ${REPO_URL}`);\n console.log(`Feedback & discussions: ${DISCUSSIONS_URL}`);\n }\n });\n}\n","/**\n * Feedback command — surface the GitHub Discussions link.\n *\n * Usage: ca feedback [--open]\n */\n\nimport { spawn } from 'node:child_process';\nimport type { Command } from 'commander';\n\nconst REPO_URL = 'https://github.com/Nathandela/compound-agent';\nconst DISCUSSIONS_URL = `${REPO_URL}/discussions`;\n\nfunction openUrl(url: string): void {\n const opener =\n process.platform === 'darwin' ? 'open' :\n process.platform === 'win32' ? 'start' :\n 'xdg-open';\n spawn(opener, [url], { detached: true, stdio: 'ignore' }).unref();\n}\n\nexport function registerFeedbackCommand(program: Command): void {\n program\n .command('feedback')\n .description('Open GitHub Discussions to share feedback or report issues')\n .option('--open', 'Open the Discussions page in your browser')\n .action((opts: { open?: boolean }) => {\n console.log(`Feedback & discussions: ${DISCUSSIONS_URL}`);\n console.log(`Repository: ${REPO_URL}`);\n\n if (opts.open && process.stdout.isTTY) {\n openUrl(DISCUSSIONS_URL);\n console.log('Opening in browser...');\n } else if (!opts.open) {\n console.log('');\n console.log('Run `ca feedback --open` to open in your browser.');\n }\n });\n}\n","/**\n * CLI command: ca knowledge <query>\n *\n * Search the docs knowledge base using hybrid search.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot, parseLimit } from '../cli-utils.js';\nimport { formatError } from '../cli-error-format.js';\nimport { withEmbedding } from '../memory/embeddings/index.js';\nimport { searchKnowledge } from '../memory/knowledge/index.js';\nimport { openKnowledgeDb, closeKnowledgeDb, getChunkCount } from '../memory/storage/sqlite-knowledge/index.js';\nimport { getGlobalOpts, out } from './shared.js';\n\nconst MAX_DISPLAY_TEXT = 200;\n\nexport function registerKnowledgeCommand(program: Command): void {\n program\n .command('knowledge <query>')\n .description('Search docs knowledge base')\n .option('-n, --limit <number>', 'Maximum results', '6')\n .action(async function (this: Command, query: string, opts: { limit: string }) {\n const globalOpts = getGlobalOpts(this);\n let limit: number;\n try {\n limit = parseLimit(opts.limit, 'limit');\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Invalid limit';\n console.error(formatError('knowledge', 'INVALID_LIMIT', message, 'Use -n with a positive integer'));\n process.exitCode = 1;\n return;\n }\n\n const repoRoot = getRepoRoot();\n\n try {\n // Check if DB has chunks; auto-index if empty\n openKnowledgeDb(repoRoot);\n if (getChunkCount(repoRoot) === 0) {\n try {\n const { indexDocs } = await import('../memory/knowledge/indexing.js');\n out.info('Knowledge base empty. Indexing docs...');\n const result = await indexDocs(repoRoot);\n if (result.filesIndexed === 0) {\n out.info('No docs found to index. Add docs/ directory or run: npx ca index-docs --help');\n return;\n }\n } catch (indexErr) {\n const msg = indexErr instanceof Error ? indexErr.message : 'Unknown error';\n out.info(`Auto-index failed (${msg}). Run manually: npx ca index-docs`);\n }\n }\n\n const results = await withEmbedding(async () => searchKnowledge(repoRoot, query, { limit }));\n\n if (results.length === 0) {\n out.info('No matching results found.');\n return;\n }\n\n for (const r of results) {\n const { filePath, startLine, endLine, text } = r.item;\n const truncated = text.length > MAX_DISPLAY_TEXT ? text.slice(0, MAX_DISPLAY_TEXT) + '...' : text;\n const displayText = truncated.replace(/\\n/g, ' ');\n\n if (globalOpts.verbose) {\n console.log(`[${filePath}:L${startLine}-L${endLine}] (score: ${r.score.toFixed(2)}) ${displayText}`);\n } else {\n console.log(`[${filePath}:L${startLine}-L${endLine}] ${displayText}`);\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n console.error(formatError('knowledge', 'SEARCH_FAILED', message, 'Check that docs are indexed'));\n process.exitCode = 1;\n } finally {\n closeKnowledgeDb();\n }\n });\n}\n","export { chunkFile } from './chunking.js';\nexport {\n chunkContentHash,\n generateChunkId,\n SUPPORTED_EXTENSIONS,\n} from './types.js';\nexport type { Chunk, ChunkOptions } from './types.js';\n\nexport { indexDocs } from './indexing.js';\nexport type { IndexOptions, IndexResult } from './indexing.js';\n\nexport { searchKnowledge, searchKnowledgeVector } from './search.js';\nexport type { KnowledgeSearchOptions } from './search.js';\n\nexport { embedChunks, getUnembeddedChunkCount } from './embed-chunks.js';\nexport type { EmbedChunksOptions, EmbedChunksResult } from './embed-chunks.js';\n\nexport { acquireEmbedLock, isEmbedLocked } from './embed-lock.js';\nexport type { LockResult } from './embed-lock.js';\n\nexport { writeEmbedStatus, readEmbedStatus } from './embed-status.js';\nexport type { EmbedStatus } from './embed-status.js';\n\nexport { spawnBackgroundEmbed, runBackgroundEmbed, indexAndSpawnEmbed } from './embed-background.js';\nexport type { SpawnEmbedResult } from './embed-background.js';\n","/**\n * Knowledge chunk search: vector similarity and hybrid (vector + FTS5).\n */\n\nimport type { KnowledgeChunk } from '../storage/sqlite-knowledge/types.js';\nimport type { GenericScoredItem } from '../search/hybrid.js';\nimport { openKnowledgeDb } from '../storage/sqlite-knowledge/connection.js';\nimport { searchChunksKeywordScored } from '../storage/sqlite-knowledge/search.js';\nimport { embedText } from '../embeddings/nomic.js';\nimport { cosineSimilarity } from '../search/vector.js';\nimport { mergeHybridScores, CANDIDATE_MULTIPLIER, MIN_HYBRID_SCORE } from '../search/hybrid.js';\nimport { isModelUsable } from '../embeddings/model.js';\n\nexport interface KnowledgeSearchOptions {\n limit?: number;\n}\n\nconst DEFAULT_KNOWLEDGE_LIMIT = 6;\n\n/** Lightweight row for phase-1 similarity scoring (no text payload) */\ninterface EmbeddingRow {\n id: string;\n embedding: Buffer;\n}\n\n/** Full row for phase-2 hydration of top-k results */\ninterface ChunkDataRow {\n id: string;\n file_path: string;\n start_line: number;\n end_line: number;\n content_hash: string;\n text: string;\n model: string | null;\n updated_at: string;\n}\n\n/**\n * Vector search over knowledge chunks (two-phase for memory efficiency).\n *\n * Phase 1: Load only IDs + embeddings, compute similarity, select top-k.\n * Phase 2: Hydrate full chunk data for top-k results only.\n */\nexport async function searchKnowledgeVector(\n repoRoot: string,\n query: string,\n options?: KnowledgeSearchOptions\n): Promise<GenericScoredItem<KnowledgeChunk>[]> {\n const limit = options?.limit ?? DEFAULT_KNOWLEDGE_LIMIT;\n const database = openKnowledgeDb(repoRoot);\n\n // Phase 1: IDs + embeddings only (avoids loading all text into memory)\n const embRows = database\n .prepare('SELECT id, embedding FROM chunks WHERE embedding IS NOT NULL')\n .all() as EmbeddingRow[];\n\n if (embRows.length === 0) return [];\n\n const queryVector = await embedText(query);\n\n const scored: { id: string; score: number }[] = [];\n for (const row of embRows) {\n const embFloat = new Float32Array(\n row.embedding.buffer,\n row.embedding.byteOffset,\n row.embedding.byteLength / 4\n );\n scored.push({ id: row.id, score: cosineSimilarity(queryVector, embFloat) });\n }\n\n scored.sort((a, b) => b.score - a.score);\n const topK = scored.slice(0, limit);\n if (topK.length === 0) return [];\n\n // Phase 2: Hydrate full data for top-k only\n // Safe: placeholders is a string of '?' characters, not user input\n const placeholders = topK.map(() => '?').join(',');\n const sql = `SELECT id, file_path, start_line, end_line, content_hash, text, model, updated_at FROM chunks WHERE id IN (${placeholders})`;\n const dataRows = database\n .prepare(sql)\n .all(...topK.map((r) => r.id)) as ChunkDataRow[];\n\n const dataMap = new Map(dataRows.map((r) => [r.id, r]));\n const results: GenericScoredItem<KnowledgeChunk>[] = [];\n\n for (const { id, score } of topK) {\n const row = dataMap.get(id);\n if (!row) continue;\n const chunk: KnowledgeChunk = {\n id: row.id,\n filePath: row.file_path,\n startLine: row.start_line,\n endLine: row.end_line,\n contentHash: row.content_hash,\n text: row.text,\n updatedAt: row.updated_at,\n };\n if (row.model !== null) {\n chunk.model = row.model;\n }\n results.push({ item: chunk, score });\n }\n\n return results;\n}\n\n/**\n * Hybrid search combining vector + FTS5 keyword on knowledge.sqlite.\n *\n * When embedding model is usable: parallel vector + keyword search, merged.\n * When model unavailable: FTS5-only fallback.\n */\nexport async function searchKnowledge(\n repoRoot: string,\n query: string,\n options?: KnowledgeSearchOptions\n): Promise<GenericScoredItem<KnowledgeChunk>[]> {\n const limit = options?.limit ?? DEFAULT_KNOWLEDGE_LIMIT;\n const candidateLimit = limit * CANDIDATE_MULTIPLIER;\n\n const usability = await isModelUsable();\n\n if (usability.usable) {\n // Hybrid: parallel vector + keyword\n const [vectorResults, keywordResults] = await Promise.all([\n searchKnowledgeVector(repoRoot, query, { limit: candidateLimit }),\n Promise.resolve(searchChunksKeywordScored(repoRoot, query, candidateLimit)),\n ]);\n\n // When no embeddings stored, vector results are empty and hybrid merge\n // would suppress keyword-only results below MIN_HYBRID_SCORE. Fall back\n // to keyword results directly.\n if (vectorResults.length === 0) {\n return keywordResults\n .map((k) => ({ item: k.chunk, score: k.score }))\n .slice(0, limit);\n }\n\n const genericKw: GenericScoredItem<KnowledgeChunk>[] = keywordResults.map((k) => ({\n item: k.chunk,\n score: k.score,\n }));\n\n const merged = mergeHybridScores(\n vectorResults,\n genericKw,\n (item) => item.id,\n { limit, minScore: MIN_HYBRID_SCORE }\n );\n\n return merged;\n }\n\n // FTS-only fallback\n const keywordResults = searchChunksKeywordScored(repoRoot, query, limit);\n return keywordResults.map((k) => ({ item: k.chunk, score: k.score }));\n}\n","/**\n * CLI command: index-docs\n *\n * Index docs/ directory into the knowledge base for retrieval.\n *\n * Usage: ca index-docs [--force] [--embed]\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { indexDocs } from '../memory/knowledge/index.js';\nimport { withEmbedding } from '../memory/embeddings/index.js';\nimport { closeKnowledgeDb } from '../memory/storage/sqlite-knowledge/index.js';\nimport { out } from './shared.js';\n\nexport function registerKnowledgeIndexCommand(program: Command): void {\n program\n .command('index-docs')\n .description('Index docs/ directory into knowledge base')\n .option('--force', 'Re-index all files (ignore cache)')\n .option('--embed', 'Embed chunks for semantic search')\n .action(async function (this: Command, options: { force?: boolean; embed?: boolean }) {\n const repoRoot = getRepoRoot();\n\n out.info('Indexing docs/ directory...');\n\n try {\n const result = await withEmbedding(async () => indexDocs(repoRoot, {\n force: options.force,\n embed: options.embed,\n }));\n\n const skippedPart = result.filesSkipped > 0\n ? ` (${result.filesSkipped} skipped)`\n : '';\n const deletedPart = result.chunksDeleted > 0\n ? `, ${result.chunksDeleted} deleted`\n : '';\n const duration = (result.durationMs / 1000).toFixed(1);\n\n out.info(\n `Indexed ${result.filesIndexed} file${result.filesIndexed !== 1 ? 's' : ''}${skippedPart}, ` +\n `${result.chunksCreated} chunk${result.chunksCreated !== 1 ? 's' : ''} created${deletedPart}`\n );\n if (result.chunksEmbedded > 0) {\n out.info(`${result.chunksEmbedded} chunk${result.chunksEmbedded !== 1 ? 's' : ''} embedded`);\n }\n if (result.filesErrored > 0) {\n out.warn(`${result.filesErrored} file(s) had errors during indexing`);\n }\n out.info(`Duration: ${duration}s`);\n } finally {\n closeKnowledgeDb();\n }\n });\n\n // Internal worker command for background embedding (spawned by init/setup)\n program\n .command('embed-worker <repoRoot>', { hidden: true })\n .description('Internal: background embedding worker')\n .action(async (repoRoot: string) => {\n const { existsSync, statSync } = await import('node:fs');\n if (!existsSync(repoRoot) || !statSync(repoRoot).isDirectory()) {\n out.error(`Invalid repoRoot: \"${repoRoot}\" is not a directory`);\n process.exitCode = 1;\n return;\n }\n const { runBackgroundEmbed } = await import('../memory/knowledge/embed-background.js');\n await runBackgroundEmbed(repoRoot);\n });\n}\n","/**\n * Clean-lessons command: Analyze lessons for semantic duplicates.\n *\n * Uses embedding model to find similar lesson pairs and outputs\n * structured diagnostic for the lessons-reviewer subagent.\n */\n\nimport type { Command } from 'commander';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { formatError } from '../cli-error-format.js';\nimport { embedText, isModelAvailable, withEmbedding } from '../memory/embeddings/index.js';\nimport { findSimilarLessons } from '../memory/search/index.js';\nimport { readMemoryItems, syncIfNeeded } from '../memory/storage/index.js';\nimport type { MemoryItem } from '../memory/index.js';\n\ninterface LessonPair {\n aId: string;\n aInsight: string;\n bId: string;\n bInsight: string;\n score: number;\n}\n\n/**\n * Find deduplicated similar lesson pairs using embedding similarity.\n */\nasync function findDuplicatePairs(repoRoot: string, activeItems: MemoryItem[]): Promise<LessonPair[]> {\n const pairs: LessonPair[] = [];\n const seen = new Set<string>();\n\n for (const item of activeItems) {\n const similar = await findSimilarLessons(repoRoot, item.insight, {\n excludeId: item.id,\n items: activeItems,\n });\n\n for (const match of similar) {\n const key = [item.id, match.item.id].sort().join(':');\n if (!seen.has(key)) {\n seen.add(key);\n pairs.push({\n aId: item.id,\n aInsight: item.insight,\n bId: match.item.id,\n bInsight: match.item.insight,\n score: match.score,\n });\n }\n }\n }\n\n return pairs;\n}\n\n/**\n * Print structured diagnostic output for flagged pairs.\n */\nfunction printReport(pairs: LessonPair[]): void {\n console.log('# Lessons Review Required');\n console.log('');\n console.log(`Found ${pairs.length} similar lesson pair(s) that may need attention.`);\n console.log('');\n console.log('## Flagged Pairs');\n console.log('');\n\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i]!;\n console.log(\n `### Pair ${i + 1}: ${pair.aId} <-> ${pair.bId} (similarity: ${(pair.score * 100).toFixed(0)}%)`,\n );\n console.log(`- **${pair.aId}**: ${pair.aInsight}`);\n console.log(`- **${pair.bId}**: ${pair.bInsight}`);\n console.log('');\n }\n\n console.log('## Instructions');\n console.log('');\n console.log('Spawn the lessons-reviewer subagent to analyze these pairs:');\n console.log('');\n console.log(' /lessons-reviewer');\n console.log('');\n console.log('The reviewer will classify each pair and propose cleanup actions.');\n}\n\nasync function cleanLessonsAction(): Promise<void> {\n const repoRoot = getRepoRoot();\n\n if (!isModelAvailable()) {\n console.error(\n formatError('clean-lessons', 'MODEL_UNAVAILABLE', 'Embedding model not available', 'Run: npx ca download-model'),\n );\n process.exitCode = 1;\n return;\n }\n\n await withEmbedding(async () => {\n // Early probe to catch runtime failures\n try {\n await embedText('test');\n } catch (e) {\n console.error(\n formatError(\n 'clean-lessons',\n 'MODEL_UNUSABLE',\n `Embedding model failed to initialize: ${e instanceof Error ? e.message : String(e)}`,\n 'Check model compatibility',\n ),\n );\n process.exitCode = 1;\n return;\n }\n\n await syncIfNeeded(repoRoot);\n const { items } = await readMemoryItems(repoRoot);\n const activeItems = items.filter((item) => !item.invalidatedAt && item.type === 'lesson');\n if (items.length > activeItems.length) {\n console.log(`Analyzing ${activeItems.length} lesson-type items only (${items.length - activeItems.length} non-lesson items excluded).`);\n }\n const pairs = await findDuplicatePairs(repoRoot, activeItems);\n\n if (pairs.length === 0) {\n console.log('No similar lessons found. Your lesson database is clean.');\n return;\n }\n\n printReport(pairs);\n });\n}\n\nexport function registerCleanLessonsCommand(program: Command): void {\n program\n .command('clean-lessons')\n .description('Analyze lessons for semantic duplicates and contradictions')\n .action(cleanLessonsAction);\n}\n","/**\n * Install-beads command — install the beads CLI via the official install script.\n *\n * Usage: ca install-beads [--yes]\n */\n\nimport { spawnSync } from 'node:child_process';\nimport type { Command } from 'commander';\n\nimport { checkBeadsAvailable } from '../setup/index.js';\n\nconst INSTALL_SCRIPT_URL =\n 'https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh';\nconst INSTALL_CMD = `curl -sSL ${INSTALL_SCRIPT_URL} | bash`;\n\nexport function registerInstallBeadsCommand(program: Command): void {\n program\n .command('install-beads')\n .description('Install the beads CLI via the official install script')\n .option('--yes', 'Skip confirmation prompt and install immediately')\n .action((opts: { yes?: boolean }) => {\n if (process.platform === 'win32') {\n console.error('Beads installation is not supported on Windows.');\n process.exitCode = 1;\n return;\n }\n\n if (checkBeadsAvailable().available) {\n console.log('Beads CLI (bd) is already installed.');\n return;\n }\n\n console.log(`Install script: ${INSTALL_SCRIPT_URL}`);\n\n if (!opts.yes) {\n console.log(`Run manually: ${INSTALL_CMD}`);\n return;\n }\n\n // --yes flag: proceed with installation\n const result = spawnSync('bash', ['-c', INSTALL_CMD], {\n stdio: 'inherit',\n timeout: 60_000,\n });\n\n if (result.error) {\n console.error(`Installation error: ${result.error.message}`);\n process.exitCode = 1;\n return;\n }\n\n if (result.status !== 0) {\n console.error(`Install error: process exited with code ${result.status}.`);\n process.exitCode = 1;\n return;\n }\n\n console.log('Restart your shell or run: source ~/.bashrc');\n });\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 await checkSimilarityPostCapture(repoRoot, item);\n}\n\n/**\n * Best-effort post-capture similarity check.\n * Warns if semantically similar lessons exist. Never blocks capture.\n */\nasync function checkSimilarityPostCapture(repoRoot: string, item: MemoryItem): Promise<void> {\n try {\n const { isModelAvailable } = await import('../memory/embeddings/model.js');\n if (!isModelAvailable()) return;\n\n const { syncIfNeeded } = await import('../memory/storage/sqlite/sync.js');\n const { findSimilarLessons } = await import('../memory/search/vector.js');\n const { embedText, withEmbedding } = await import('../memory/embeddings/nomic.js');\n const chalk = await import('chalk');\n await withEmbedding(async () => {\n // Early probe to catch runtime failures before full similarity check\n await embedText('test');\n await syncIfNeeded(repoRoot);\n const similar = await findSimilarLessons(repoRoot, item.insight, { excludeId: item.id });\n if (similar.length > 0) {\n console.log('');\n out.warn('Similar lessons found:');\n for (const s of similar.slice(0, 3)) {\n console.log(` ${chalk.default.dim(s.item.id)} (${(s.score * 100).toFixed(0)}%) ${s.item.insight.slice(0, 60)}${s.item.insight.length > 60 ? '...' : ''}`);\n }\n console.log('');\n console.log(`Run ${chalk.default.bold(\"'npx ca clean-lessons'\")} to review and resolve.`);\n }\n });\n } catch (err) {\n // Similarity check is best-effort\n if (process.env['CA_DEBUG']) {\n process.stderr.write(`[CA_DEBUG] checkSimilarityPostCapture catch: ${err instanceof Error ? err.message : String(err)}\\n`);\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 * Compound Agent - Repository-scoped learning system for Claude Code\n *\n * This package helps Claude Code learn from mistakes and avoid repeating them.\n * It captures lessons during coding sessions and retrieves relevant lessons\n * when planning new work.\n *\n * ## Quick Start\n *\n * ```typescript\n * import { appendLesson, retrieveForPlan, loadSessionLessons } from 'compound-agent';\n *\n * // At session start, load high-severity lessons\n * const criticalLessons = await loadSessionLessons(repoRoot);\n *\n * // When planning, retrieve relevant lessons\n * const { lessons, message } = await retrieveForPlan(repoRoot, planText);\n *\n * // When capturing a lesson\n * await appendLesson(repoRoot, lesson);\n * ```\n *\n * ## Setup\n *\n * Run `npx ca init` in your project root to configure hooks and AGENTS.md.\n *\n * ## Resource Management\n *\n * This library manages two heavyweight resources that require cleanup:\n *\n * ### SQLite Database\n * - **Acquired:** Lazily on first database operation (search, rebuild, etc.)\n * - **Memory:** Minimal (~few KB for connection, index cached by OS)\n * - **Cleanup:** Call `closeDb()` before process exit\n *\n * ### Embedding Model\n * - **Acquired:** Lazily on first embedding call (embedText, embedTexts, searchVector)\n * - **Memory:** ~150MB RAM for the EmbeddingGemma model\n * - **Cleanup:** Call `unloadEmbedding()` before process exit\n *\n * ### Recommended Cleanup Pattern\n *\n * ```typescript\n * import { closeDb, unloadEmbedding } from 'compound-agent';\n *\n * // For CLI commands - use try/finally\n * async function main() {\n * try {\n * // ... your code that uses compound-agent\n * } finally {\n * unloadEmbedding();\n * closeDb();\n * }\n * }\n *\n * // For long-running processes - use shutdown handlers\n * process.on('SIGTERM', () => {\n * unloadEmbedding();\n * closeDb();\n * process.exit(0);\n * });\n * process.on('SIGINT', () => {\n * unloadEmbedding();\n * closeDb();\n * process.exit(0);\n * });\n * ```\n *\n * **Note:** Failing to clean up will not corrupt data, but may cause:\n * - Memory leaks in long-running processes\n * - Unclean process exits (warnings in some environments)\n *\n * @see {@link closeDb} for database cleanup\n * @see {@link unloadEmbedding} for embedding model cleanup\n * @module compound-agent\n */\n\n/** Package version, read from package.json. */\nexport { VERSION } from './version.js';\n\n// Storage API (JSONL source of truth + SQLite index)\nexport {\n appendLesson,\n appendMemoryItem,\n closeDb,\n DB_PATH,\n LESSONS_PATH,\n readLessons,\n readMemoryItems,\n rebuildIndex,\n searchKeyword,\n} from './memory/storage/index.js';\nexport type { ParseError, ReadLessonsOptions, ReadLessonsResult, ReadMemoryItemsResult } from './memory/storage/index.js';\n\n// Embeddings API\nexport {\n embedText,\n embedTexts,\n getEmbedding,\n isModelAvailable,\n isModelUsable,\n MODEL_FILENAME,\n MODEL_URI,\n resolveModel,\n unloadEmbedding,\n} from './memory/embeddings/index.js';\nexport type { UsabilityResult } from './memory/embeddings/index.js';\n\n// Search API (vector similarity + ranking + hybrid)\nexport {\n calculateScore,\n CANDIDATE_MULTIPLIER,\n confirmationBoost,\n cosineSimilarity,\n DEFAULT_TEXT_WEIGHT,\n DEFAULT_VECTOR_WEIGHT,\n mergeHybridResults,\n normalizeBm25Rank,\n rankLessons,\n recencyBoost,\n searchVector,\n severityBoost,\n} from './memory/search/index.js';\nexport type { HybridMergeOptions, RankedLesson, ScoredKeywordResult, ScoredLesson, SearchVectorOptions } from './memory/search/index.js';\n\n// Capture API (quality filters + trigger detection)\nexport {\n detectSelfCorrection,\n detectTestFailure,\n detectUserCorrection,\n isActionable,\n isNovel,\n isSpecific,\n shouldPropose,\n} from './memory/capture/index.js';\nexport type {\n ActionabilityResult,\n CorrectionSignal,\n DetectedCorrection,\n DetectedSelfCorrection,\n DetectedTestFailure,\n EditEntry,\n EditHistory,\n NoveltyOptions,\n NoveltyResult,\n ProposeResult,\n SpecificityResult,\n TestResult,\n} from './memory/capture/index.js';\n\n// Retrieval API (session + plan time)\nexport { formatLessonsCheck, loadSessionLessons, retrieveForPlan } from './memory/retrieval/index.js';\nexport type { PlanRetrievalResult } from './memory/retrieval/index.js';\n\n// Knowledge API (docs embeddings + search)\nexport {\n closeKnowledgeDb,\n collectCachedChunkEmbeddings,\n getCachedChunkEmbedding,\n KNOWLEDGE_DB_PATH,\n KNOWLEDGE_SCHEMA_VERSION,\n openKnowledgeDb,\n searchChunksKeywordScored,\n setCachedChunkEmbedding,\n} from './memory/storage/sqlite-knowledge/index.js';\nexport type { KnowledgeChunk, KnowledgeDbOptions, ScoredChunk } from './memory/storage/sqlite-knowledge/index.js';\n\nexport {\n chunkFile,\n indexDocs,\n searchKnowledge,\n searchKnowledgeVector,\n embedChunks,\n getUnembeddedChunkCount,\n acquireEmbedLock,\n isEmbedLocked,\n writeEmbedStatus,\n readEmbedStatus,\n spawnBackgroundEmbed,\n runBackgroundEmbed,\n indexAndSpawnEmbed,\n} from './memory/knowledge/index.js';\nexport type {\n IndexOptions,\n IndexResult,\n KnowledgeSearchOptions,\n EmbedChunksOptions,\n EmbedChunksResult,\n LockResult,\n EmbedStatus,\n SpawnEmbedResult,\n} from './memory/knowledge/index.js';\n\n// Context recovery API\nexport { getPrimeContext } from './commands/index.js';\n\n// Audit API\nexport { runAudit, AuditFindingSchema, AuditReportSchema } from './audit/index.js';\nexport type { AuditFinding, AuditReport, AuditOptions } from './audit/index.js';\n\n// Compound API (clustering, synthesis, pattern I/O)\nexport {\n buildSimilarityMatrix,\n CCT_PATTERNS_PATH,\n CctPatternSchema,\n clusterBySimilarity,\n readCctPatterns,\n synthesizePattern,\n writeCctPatterns,\n} from './compound/index.js';\nexport type { CctPattern, ClusterResult } from './compound/index.js';\n\n// Lint detection API\nexport { detectLinter, LinterInfoSchema, LinterNameSchema } from './lint/index.js';\nexport type { LinterInfo, LinterName } from './lint/index.js';\n\n// Types and schemas\nexport {\n generateId,\n LessonItemSchema,\n LessonSchema,\n MemoryItemRecordSchema,\n MemoryItemSchema,\n MemoryItemTypeSchema,\n PatternItemSchema,\n PreferenceItemSchema,\n SolutionItemSchema,\n} from './memory/types.js';\nexport type {\n Context,\n Lesson,\n LessonRecord,\n LessonType,\n MemoryItem,\n MemoryItemRecord,\n MemoryItemType,\n PatternItem,\n Preference,\n Severity,\n Solution,\n Source,\n} from './memory/types.js';\n","/**\n * Linter detection utility.\n *\n * Scans a directory for linter config files and returns\n * info about the first detected linter.\n */\n\nimport { readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { z } from 'zod';\n\n/** Supported linter identifiers. */\nexport const LinterNameSchema = z.enum([\n 'eslint',\n 'ruff',\n 'clippy',\n 'golangci-lint',\n 'ast-grep',\n 'semgrep',\n 'unknown',\n]);\n\n/** Result of linter detection. */\nexport const LinterInfoSchema = z.object({\n linter: LinterNameSchema,\n configPath: z.string().nullable(),\n});\n\nexport type LinterInfo = z.infer<typeof LinterInfoSchema>;\nexport type LinterName = z.infer<typeof LinterNameSchema>;\n\n/** Detection rules in priority order. Each entry maps a linter to its config filenames. */\nconst DETECTION_RULES: Array<{\n linter: z.infer<typeof LinterNameSchema>;\n configs: string[];\n}> = [\n {\n linter: 'eslint',\n configs: [\n // Flat config (ESLint v9+)\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n 'eslint.config.mts',\n 'eslint.config.cts',\n // Legacy config\n '.eslintrc.js',\n '.eslintrc.cjs',\n '.eslintrc.json',\n '.eslintrc.yml',\n '.eslintrc.yaml',\n ],\n },\n {\n linter: 'ruff',\n configs: ['ruff.toml', '.ruff.toml'],\n },\n {\n linter: 'clippy',\n configs: ['clippy.toml', '.clippy.toml'],\n },\n {\n linter: 'golangci-lint',\n configs: ['.golangci.yml', '.golangci.yaml', '.golangci.toml', '.golangci.json'],\n },\n {\n linter: 'ast-grep',\n configs: ['sgconfig.yml'],\n },\n {\n linter: 'semgrep',\n configs: ['.semgrep.yml', '.semgrep.yaml'],\n },\n];\n\n/** Return a fresh unknown result (avoids shared mutable reference). */\nfunction unknown(): LinterInfo {\n return { linter: 'unknown', configPath: null };\n}\n\n/** Returns true only if the path exists AND is a regular file (not a directory). */\nfunction isFile(filePath: string): boolean {\n try {\n return statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Check if pyproject.toml contains a [tool.ruff] or [tool.ruff.*] section.\n * Returns true if found, false otherwise (including on read errors).\n */\nfunction pyprojectHasRuff(repoRoot: string): boolean {\n const filePath = join(repoRoot, 'pyproject.toml');\n try {\n const content = readFileSync(filePath, 'utf-8');\n // Match [tool.ruff] or any subsection like [tool.ruff.lint], [tool.ruff.format], etc.\n return /^\\s*\\[tool\\.ruff\\b/m.test(content);\n } catch {\n return false;\n }\n}\n\n/**\n * Detect the linter used in a repository by scanning for config files.\n *\n * Checks linters in priority order; first match wins.\n * Returns `{ linter: 'unknown', configPath: null }` if nothing found.\n */\nexport function detectLinter(repoRoot: string): LinterInfo {\n try {\n for (const rule of DETECTION_RULES) {\n for (const config of rule.configs) {\n if (isFile(join(repoRoot, config))) {\n return { linter: rule.linter, configPath: config };\n }\n }\n\n // Special case: Ruff can also live inside pyproject.toml\n if (rule.linter === 'ruff' && pyprojectHasRuff(repoRoot)) {\n return { linter: 'ruff', configPath: 'pyproject.toml' };\n }\n }\n } catch {\n // Graceful degradation on any unexpected error\n return unknown();\n }\n\n return unknown();\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 { isModelAvailable, loadSessionLessons, retrieveForPlan } from '../index.js';\nimport { withEmbedding } from '../memory/embeddings/index.js';\nimport { incrementRetrievalCount, readLessons, readMemoryItems, searchKeyword, searchKeywordScored, syncIfNeeded } from '../memory/storage/index.js';\nimport type { MemoryItem } from '../memory/index.js';\nimport { CANDIDATE_MULTIPLIER, MIN_HYBRID_SCORE, mergeHybridResults, rankLessons, searchVector } from '../memory/search/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/** Max stdin size for check-plan (1MB). */\nconst MAX_STDIN_BYTES = 1_048_576;\n/** Stdin read timeout (30 seconds). */\nconst STDIN_TIMEOUT_MS = 30_000;\n\n/**\n * Read plan text from stdin (non-TTY mode).\n * Enforces a size limit and timeout to prevent hangs in CI/CD.\n */\nasync function readPlanFromStdin(): Promise<string | undefined> {\n const { stdin } = await import('node:process');\n if (!stdin.isTTY) {\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new Error('stdin read timed out after 30s')), STDIN_TIMEOUT_MS);\n });\n\n const read = (async (): Promise<string> => {\n for await (const chunk of stdin) {\n const buf = chunk as Buffer;\n totalBytes += buf.length;\n if (totalBytes > MAX_STDIN_BYTES) {\n throw new Error(`stdin exceeds ${MAX_STDIN_BYTES} byte limit`);\n }\n chunks.push(buf);\n }\n return Buffer.concat(chunks).toString('utf-8').trim();\n })();\n\n try {\n return await Promise.race([read, timeout]);\n } catch (err) {\n console.error(`Warning: ${err instanceof Error ? err.message : String(err)}`);\n return undefined;\n } finally {\n clearTimeout(timerId);\n }\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 const results = await withEmbedding(async () => {\n if (isModelAvailable()) {\n try {\n // Hybrid search: blend vector + keyword\n const candidateLimit = limit * CANDIDATE_MULTIPLIER;\n const [vectorResults, keywordResults] = await Promise.all([\n searchVector(repoRoot, query, { limit: candidateLimit }),\n searchKeywordScored(repoRoot, query, candidateLimit),\n ]);\n const merged = mergeHybridResults(vectorResults, keywordResults, { minScore: MIN_HYBRID_SCORE });\n const ranked = rankLessons(merged);\n return ranked.slice(0, limit).map((r) => r.lesson);\n } catch {\n // Model failed at runtime — fall back to keyword-only search\n return await searchKeyword(repoRoot, query, limit);\n }\n }\n // FTS-only fallback when embedding model unavailable\n return await searchKeyword(repoRoot, query, limit);\n });\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 await syncIfNeeded(repoRoot);\n\n if (!isModelAvailable()) {\n if (options.json) {\n console.log(JSON.stringify({\n lessons: [],\n count: 0,\n error: 'Embedding model not found',\n action: 'Run: npx ca download-model',\n }));\n } else {\n console.error(formatError('check-plan', 'MODEL_UNAVAILABLE', 'Embedding model not found', 'Run: npx ca download-model'));\n }\n process.exitCode = 1;\n return;\n }\n\n try {\n const result = await withEmbedding(async () => 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')\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 registerGeminiSubcommand,\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 { registerFeedbackCommand } from './feedback.js';\nimport { registerKnowledgeCommand } from './knowledge.js';\nimport { registerKnowledgeIndexCommand } from './knowledge-index.js';\nimport { registerCleanLessonsCommand } from './clean-lessons.js';\nimport { registerInstallBeadsCommand } from './install-beads.js';\n\n\nexport { registerCaptureCommands } from './capture.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 } 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 registerGeminiSubcommand(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 registerFeedbackCommand(program);\n registerKnowledgeCommand(program);\n registerKnowledgeIndexCommand(program);\n registerCleanLessonsCommand(program);\n registerInstallBeadsCommand(program);\n\n // Deprecation stub: worktree feature removed (superseded by Claude Code native EnterWorktree)\n program.command('worktree').description('(removed) Use Claude Code native worktree support').action(() => {\n console.error('ca worktree has been removed. Use Claude Code\\'s native EnterWorktree support instead.');\n process.exitCode = 1;\n });\n}\n","/**\n * Bash script templates for the loop command.\n *\n * Pure functions that return bash script fragments.\n * Separated from loop.ts to stay within max-lines.\n */\n\nexport function buildDependencyCheck(): string {\n return `\n# check_deps_closed() - Verify all depends_on for an epic are closed\n# Returns 0 if all deps closed (or no deps), 1 if any dep is open\n# Uses the depends_on array from bd show --json (objects with .id/.status)\ncheck_deps_closed() {\n local epic_id=\"$1\"\n local deps_json\n deps_json=$(bd show \"$epic_id\" --json 2>/dev/null || echo \"\")\n if [ -z \"$deps_json\" ]; then\n return 0\n fi\n local blocking_dep\n if [ \"$HAS_JQ\" = true ]; then\n blocking_dep=$(echo \"$deps_json\" | jq -r '\n if type == \"array\" then .[0] else . end |\n (.depends_on // .dependencies // []) |\n map(select(.status != \"closed\")) |\n .[0].id // empty\n ' 2>/dev/null || echo \"\")\n else\n blocking_dep=$(echo \"$deps_json\" | python3 -c \"\nimport sys, json\ndata = json.load(sys.stdin)\nif isinstance(data, list):\n data = data[0] if data else {}\ndeps = data.get('depends_on', data.get('dependencies', []))\nfor d in deps:\n s = d.get('status', 'open') if isinstance(d, dict) else 'open'\n if s != 'closed':\n print(d.get('id', d) if isinstance(d, dict) else d)\n break\n\" 2>/dev/null || echo \"\")\n fi\n if [ -n \"$blocking_dep\" ]; then\n log \"Skip $epic_id: blocked by dependency $blocking_dep (not closed)\"\n return 1\n fi\n return 0\n}\n`;\n}\n\nexport function buildEpicSelector(): string {\n return buildDependencyCheck() + `\nget_next_epic() {\n if [ -n \"$EPIC_IDS\" ]; then\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 check_deps_closed \"$epic_id\" || continue\n echo \"$epic_id\"\n return 0\n fi\n done\n return 1\n else\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 check_deps_closed \"$id\" || continue\n echo \"$id\"\n break\n done)\n else\n # Emit ALL unprocessed candidates so the shell loop can check each one's deps.\n local candidates epic_id=\"\"\n candidates=$(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'])\" 2>/dev/null || echo \"\")\n for cid in $candidates; do\n check_deps_closed \"$cid\" || continue\n epic_id=\"$cid\"\n break\n done\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\nexport function 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(spec-dev is already done -- the epic exists):\n\n/compound:cook-it 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\nexport function buildStreamExtractor(): string {\n return `\n# extract_text() - Extract assistant text from stream-json events\n# Claude Code stream-json format: {\"type\":\"assistant\",\"message\":{\"content\":[{\"type\":\"text\",\"text\":\"...\"}]}}\nextract_text() {\n if [ \"$HAS_JQ\" = true ]; then\n jq -j --unbuffered '\n select(.type == \"assistant\") |\n .message.content[]? |\n select(.type == \"text\") |\n .text // empty\n ' 2>/dev/null || { echo \"WARN: extract_text parser failed\" >&2; }\n else\n python3 -c \"\nimport sys, json\nfor line in sys.stdin:\n line = line.strip()\n if not line:\n continue\n try:\n obj = json.loads(line)\n if obj.get('type') == 'assistant':\n for block in obj.get('message', {}).get('content', []):\n if block.get('type') == 'text':\n text = block.get('text', '')\n if text:\n print(text, end='', flush=True)\n except (json.JSONDecodeError, KeyError, TypeError):\n pass\n\" 2>/dev/null || { echo \"WARN: extract_text parser failed\" >&2; }\n fi\n}\n`;\n}\n\nexport function buildMarkerDetection(): string {\n return `\n# detect_marker() - Check for completion markers in log and trace\n# Primary: macro log (anchored patterns). Fallback: trace JSONL (unanchored).\n# Usage: MARKER=$(detect_marker \"$LOGFILE\" \"$TRACEFILE\")\n# Returns: \"complete\", \"failed\", \"human:<reason>\", or \"none\"\ndetect_marker() {\n local logfile=\"$1\" tracefile=\"$2\"\n\n # Primary: check extracted text with anchored patterns\n if [ -s \"$logfile\" ]; then\n if grep -q \"^EPIC_COMPLETE$\" \"$logfile\"; then\n echo \"complete\"; return 0\n elif grep -q \"^HUMAN_REQUIRED:\" \"$logfile\"; then\n local reason\n reason=$(grep \"^HUMAN_REQUIRED:\" \"$logfile\" | head -1 | sed 's/^HUMAN_REQUIRED: *//')\n echo \"human:$reason\"; return 0\n elif grep -q \"^EPIC_FAILED$\" \"$logfile\"; then\n echo \"failed\"; return 0\n fi\n fi\n\n # Fallback: check raw trace JSONL (unanchored -- markers are inside JSON strings)\n if [ -s \"$tracefile\" ]; then\n if grep -q \"EPIC_COMPLETE\" \"$tracefile\"; then\n echo \"complete\"; return 0\n elif grep -q \"HUMAN_REQUIRED:\" \"$tracefile\"; then\n echo \"human:detected in trace\"; return 0\n elif grep -q \"EPIC_FAILED\" \"$tracefile\"; then\n echo \"failed\"; return 0\n fi\n fi\n\n echo \"none\"\n}\n`;\n}\n\nexport function buildObservability(): string {\n return `\n# Observability: status file and execution log\nSTATUS_FILE=\"$LOG_DIR/.loop-status.json\"\nEXEC_LOG=\"$LOG_DIR/loop-execution.jsonl\"\n\nwrite_status() {\n local status=\"$1\"\n local epic_id=\"\\${2:-}\"\n local attempt=\"\\${3:-0}\"\n if [ \"$status\" = \"idle\" ]; then\n echo \"{\\\\\"status\\\\\":\\\\\"idle\\\\\",\\\\\"timestamp\\\\\":\\\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\\\"}\" > \"$STATUS_FILE\"\n else\n echo \"{\\\\\"epic_id\\\\\":\\\\\"$epic_id\\\\\",\\\\\"attempt\\\\\":$attempt,\\\\\"started_at\\\\\":\\\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\\\",\\\\\"status\\\\\":\\\\\"$status\\\\\"}\" > \"$STATUS_FILE\"\n fi\n}\n\nlog_result() {\n local epic_id=\"$1\" result=\"$2\" attempts=\"$3\" duration=\"$4\"\n echo \"{\\\\\"epic_id\\\\\":\\\\\"$epic_id\\\\\",\\\\\"result\\\\\":\\\\\"$result\\\\\",\\\\\"attempts\\\\\":$attempts,\\\\\"duration_s\\\\\":$duration,\\\\\"timestamp\\\\\":\\\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\\\"}\" >> \"$EXEC_LOG\"\n}\n`;\n}\n\nexport function buildSessionRunner(): string {\n return `\n PROMPT=$(build_prompt \"$EPIC_ID\")\n\n # Two-scope logging: stream-json to trace JSONL, extracted text to macro log\n claude --dangerously-skip-permissions \\\\\n --model \"$MODEL\" \\\\\n --output-format stream-json \\\\\n --verbose \\\\\n -p \"$PROMPT\" \\\\\n 2>\"$LOGFILE.stderr\" | tee \"$TRACEFILE\" | extract_text > \"$LOGFILE\" || true\n\n # Append stderr to macro log\n [ -f \"$LOGFILE.stderr\" ] && cat \"$LOGFILE.stderr\" >> \"$LOGFILE\" && rm -f \"$LOGFILE.stderr\"\n\n # Health check: warn if macro log extraction failed\n if [ -s \"$TRACEFILE\" ] && [ ! -s \"$LOGFILE\" ]; then\n log \"WARN: Macro log is empty but trace has content (extract_text may have failed)\"\n fi\n\n MARKER=$(detect_marker \"$LOGFILE\" \"$TRACEFILE\")\n case \"$MARKER\" in\n (complete)\n log \"Epic $EPIC_ID completed successfully\"\n SUCCESS=true\n break\n ;;\n (human:*)\n REASON=\"\\${MARKER#human:}\"\n log \"Epic $EPIC_ID needs human action: $REASON\"\n bd update \"$EPIC_ID\" --notes \"Human required: $REASON\" 2>/dev/null || true\n SUCCESS=skip\n break\n ;;\n (failed)\n log \"Epic $EPIC_ID reported failure (attempt $ATTEMPT)\"\n ;;\n (*)\n log \"Epic $EPIC_ID session ended without marker (attempt $ATTEMPT)\"\n ;;\n esac`;\n}\n\nexport interface MainLoopReviewOptions {\n hasReview: boolean;\n reviewEvery: number;\n}\n\nfunction buildReviewTriggers(hasReview: boolean, reviewEvery: number): {\n counterInit: string; periodic: string; final: string;\n} {\n if (!hasReview) return { counterInit: '', periodic: '', final: '' };\n const usePeriodic = reviewEvery > 0;\n return {\n counterInit: usePeriodic\n ? '\\nCOMPLETED_SINCE_REVIEW=0\\nREVIEW_BASE_SHA=$(git rev-parse HEAD)'\n : '\\nREVIEW_BASE_SHA=$(git rev-parse HEAD)',\n periodic: usePeriodic\n ? `\n COMPLETED_SINCE_REVIEW=$((COMPLETED_SINCE_REVIEW + 1))\n if [ \"$COMPLETED_SINCE_REVIEW\" -ge \"$REVIEW_EVERY\" ]; then\n REVIEW_DIFF_RANGE=\"$REVIEW_BASE_SHA..HEAD\"\n run_review_phase \"periodic\"\n COMPLETED_SINCE_REVIEW=0\n REVIEW_BASE_SHA=$(git rev-parse HEAD)\n fi`\n : '',\n final: usePeriodic\n ? `\nif [ \"$COMPLETED_SINCE_REVIEW\" -gt 0 ]; then\n REVIEW_DIFF_RANGE=\"$REVIEW_BASE_SHA..HEAD\"\n run_review_phase \"final\"\nfi\n`\n : `\nif [ \"$COMPLETED\" -gt 0 ]; then\n REVIEW_DIFF_RANGE=\"$REVIEW_BASE_SHA..HEAD\"\n run_review_phase \"final\"\nfi\n`,\n };\n}\n\nexport function buildMainLoop(reviewOptions?: MainLoopReviewOptions): string {\n const { counterInit, periodic, final } = buildReviewTriggers(\n reviewOptions?.hasReview ?? false,\n reviewOptions?.reviewEvery ?? 0,\n );\n\n return `\n# Main loop\nCOMPLETED=0\nFAILED=0\nSKIPPED=0\nPROCESSED=\"\"\nLOOP_START=$(date +%s)${counterInit}\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 EPIC_START=$(date +%s)\n\n ATTEMPT=0\n SUCCESS=false\n\n write_status \"running\" \"$EPIC_ID\" 1\n\n while [ $ATTEMPT -le $MAX_RETRIES ]; do\n ATTEMPT=$((ATTEMPT + 1))\n TS=$(timestamp)\n LOGFILE=\"$LOG_DIR/loop_$EPIC_ID-$TS.log\"\n TRACEFILE=\"$LOG_DIR/trace_$EPIC_ID-$TS.jsonl\"\n\n write_status \"running\" \"$EPIC_ID\" \"$ATTEMPT\"\n\n # Update .latest symlink for ca watch (before claude invocation so watch can discover it)\n ln -sf \"$(basename \"$TRACEFILE\")\" \"$LOG_DIR/.latest\"\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` + buildSessionRunner() + `\n\n if [ $ATTEMPT -le $MAX_RETRIES ]; then\n log \"Retrying $EPIC_ID...\"\n sleep 5\n fi\n done\n\n EPIC_DURATION=$(( $(date +%s) - EPIC_START ))\n\n if [ \"$SUCCESS\" = true ]; then\n COMPLETED=$((COMPLETED + 1))\n log_result \"$EPIC_ID\" \"complete\" \"$ATTEMPT\" \"$EPIC_DURATION\"\n log \"Epic $EPIC_ID done. Completed so far: $COMPLETED\"${periodic}\n elif [ \"$SUCCESS\" = skip ]; then\n SKIPPED=$((SKIPPED + 1))\n log_result \"$EPIC_ID\" \"skipped\" \"$ATTEMPT\" \"$EPIC_DURATION\"\n log \"Epic $EPIC_ID skipped (human required). Continuing.\"\n else\n FAILED=$((FAILED + 1))\n log_result \"$EPIC_ID\" \"failed\" \"$ATTEMPT\" \"$EPIC_DURATION\"\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${final}\nTOTAL_DURATION=$(( $(date +%s) - LOOP_START ))\necho \"{\\\\\"type\\\\\":\\\\\"summary\\\\\",\\\\\"completed\\\\\":$COMPLETED,\\\\\"failed\\\\\":$FAILED,\\\\\"skipped\\\\\":$SKIPPED,\\\\\"total_duration_s\\\\\":$TOTAL_DURATION}\" >> \"$EXEC_LOG\"\nwrite_status \"idle\"\nlog \"Loop finished. Completed: $COMPLETED, Failed: $FAILED, Skipped: $SKIPPED\"\n[ $FAILED -eq 0 ] && exit 0 || exit 1`;\n}\n","/**\n * Bash script templates for the loop review phase.\n * Pure functions that return bash script fragments for multi-model review.\n */\n\nexport interface ReviewConfigOptions {\n reviewers: string[];\n maxReviewCycles: number;\n reviewBlocking: boolean;\n reviewModel: string;\n reviewEvery: number;\n}\n\nexport function buildReviewConfig(options: ReviewConfigOptions): string {\n return `\n# Review phase config\nREVIEW_EVERY=${options.reviewEvery}\nMAX_REVIEW_CYCLES=${options.maxReviewCycles}\nREVIEW_BLOCKING=${options.reviewBlocking}\nREVIEW_MODEL=\"${options.reviewModel}\"\nREVIEW_REVIEWERS=\"${options.reviewers.join(' ')}\"\nREVIEW_DIR=\"$LOG_DIR/reviews\"\nREVIEW_TIMEOUT=\\${REVIEW_TIMEOUT:-600}\n\n# Portable timeout: GNU timeout -> gtimeout (macOS Homebrew) -> shell fallback\nportable_timeout() {\n local secs=\"$1\"; shift\n if command -v timeout >/dev/null 2>&1; then\n timeout \"$secs\" \"$@\"\n elif command -v gtimeout >/dev/null 2>&1; then\n gtimeout \"$secs\" \"$@\"\n else\n \"$@\" &\n local pid=$!\n ( sleep \"$secs\" && kill \"$pid\" 2>/dev/null ) &\n local watchdog=$!\n wait \"$pid\" 2>/dev/null\n local rc=$?\n kill \"$watchdog\" 2>/dev/null\n wait \"$watchdog\" 2>/dev/null\n return $rc\n fi\n}\n`;\n}\n\nexport function buildReviewerDetection(): string {\n return `\ndetect_reviewers() {\n AVAILABLE_REVIEWERS=\"\"\n for reviewer in $REVIEW_REVIEWERS; do\n case \"$reviewer\" in\n (claude-sonnet|claude-opus)\n if command -v claude >/dev/null 2>&1; then\n AVAILABLE_REVIEWERS=\"$AVAILABLE_REVIEWERS $reviewer\"\n else\n log \"WARN: claude CLI not found, skipping $reviewer\"\n fi\n ;;\n (gemini)\n if command -v gemini >/dev/null 2>&1; then\n AVAILABLE_REVIEWERS=\"$AVAILABLE_REVIEWERS gemini\"\n else\n log \"WARN: gemini CLI not found, skipping gemini\"\n fi\n ;;\n (codex)\n if command -v codex >/dev/null 2>&1; then\n AVAILABLE_REVIEWERS=\"$AVAILABLE_REVIEWERS codex\"\n else\n log \"WARN: codex CLI not found, skipping codex\"\n fi\n ;;\n esac\n done\n AVAILABLE_REVIEWERS=\"\\${AVAILABLE_REVIEWERS# }\"\n if [ -z \"$AVAILABLE_REVIEWERS\" ]; then\n log \"WARN: No reviewer CLIs available, skipping review phase\"\n return 1\n fi\n log \"Available reviewers: $AVAILABLE_REVIEWERS\"\n return 0\n}\n`;\n}\n\nexport function buildSessionIdManagement(): string {\n return `\ninit_review_sessions() {\n local cycle_dir=\"$1\"\n mkdir -p \"$cycle_dir\"\n local sessions_file=\"$REVIEW_DIR/sessions.json\"\n if [ ! -f \"$sessions_file\" ]; then\n echo \"{}\" > \"$sessions_file\"\n fi\n for reviewer in $AVAILABLE_REVIEWERS; do\n case \"$reviewer\" in\n (claude-sonnet|claude-opus)\n local existing=\"\"\n if [ \"$HAS_JQ\" = true ]; then\n existing=$(jq -r \".[\\\\\"$reviewer\\\\\"] // empty\" \"$sessions_file\" 2>/dev/null)\n else\n existing=$(python3 -c \"\nimport json, sys\nd = json.load(open('$sessions_file'))\nprint(d.get('$reviewer', ''))\" 2>/dev/null || echo \"\")\n fi\n if [ -z \"$existing\" ]; then\n local sid\n sid=$(uuidgen | tr '[:upper:]' '[:lower:]')\n if [ \"$HAS_JQ\" = true ]; then\n local tmp\n tmp=$(jq --arg k \"$reviewer\" --arg v \"$sid\" '. + {($k): $v}' \"$sessions_file\")\n echo \"$tmp\" > \"$sessions_file\"\n else\n python3 -c \"\nimport json\nd = json.load(open('$sessions_file'))\nd['$reviewer'] = '$sid'\njson.dump(d, open('$sessions_file', 'w'))\" 2>/dev/null || true\n fi\n fi\n ;;\n esac\n done\n}\n`;\n}\n\nexport function buildReviewPrompt(): string {\n return `\nbuild_review_prompt() {\n local diff_range=\"\\${1:-HEAD~1..HEAD}\"\n local diff_content\n diff_content=$(git diff \"$diff_range\" 2>/dev/null || echo \"(no diff)\")\n if [ -z \"$diff_content\" ]; then diff_content=\"(empty diff)\"; fi\n local beads_context\n beads_context=$(bd list --status=closed --limit=20 2>/dev/null || echo \"(no beads)\")\n cat <<REVIEW_PROMPT_EOF\nYou are reviewing code changes made by an autonomous agent loop.\n\n## Completed Beads\n$beads_context\n\n## Git Diff\n\\`\\`\\`diff\n$diff_content\n\\`\\`\\`\n\nReview for: correctness, security, edge cases, code quality.\nProvide a numbered list of findings with severity (P0/P1/P2/P3).\nBe concise, actionable, no praise.\n\nIf everything looks good: output REVIEW_APPROVED on its own line.\nIf changes needed: output REVIEW_CHANGES_REQUESTED then your findings.\nREVIEW_PROMPT_EOF\n}\n`;\n}\n\nexport function buildSpawnReviewers(): string {\n return `\nread_session_id() {\n local reviewer=\"$1\" sessions_file=\"$2\"\n if [ \"$HAS_JQ\" = true ]; then\n jq -r \".[\\\\\"$reviewer\\\\\"] // empty\" \"$sessions_file\" 2>/dev/null\n else\n python3 -c \"\nimport json\nd = json.load(open('$sessions_file'))\nprint(d.get('$reviewer', ''))\" 2>/dev/null || echo \"\"\n fi\n}\n\nspawn_reviewers() {\n local cycle=\"$1\" cycle_dir=\"$2\"\n local prompt\n prompt=$(build_review_prompt \"$REVIEW_DIFF_RANGE\")\n local pids=\"\"\n for reviewer in $AVAILABLE_REVIEWERS; do\n local report=\"$cycle_dir/$reviewer.md\"\n case \"$reviewer\" in\n (claude-sonnet|claude-opus)\n local model_name\n if [ \"$reviewer\" = \"claude-sonnet\" ]; then model_name=\"claude-sonnet-4-6\"\n else model_name=\"claude-opus-4-6\"; fi\n local sid=\"\"\n sid=$(read_session_id \"$reviewer\" \"$REVIEW_DIR/sessions.json\")\n if [ \"$cycle\" -eq 1 ]; then\n (portable_timeout \"$REVIEW_TIMEOUT\" claude --model \"$model_name\" --output-format text \\\n --session-id \"$sid\" -p \"$prompt\" > \"$report\" 2>&1 || true) &\n else\n (portable_timeout \"$REVIEW_TIMEOUT\" claude --model \"$model_name\" --output-format text \\\n --resume \"$sid\" \\\n -p \"Review the latest fixes. If resolved: REVIEW_APPROVED. Otherwise: REVIEW_CHANGES_REQUESTED with findings.\" \\\n > \"$report\" 2>&1 || true) &\n fi\n pids=\"$pids $!\"\n ;;\n (gemini)\n if [ \"$cycle\" -eq 1 ]; then\n (portable_timeout \"$REVIEW_TIMEOUT\" gemini -p \"$prompt\" -y > \"$report\" 2>&1 || true) &\n else\n (portable_timeout \"$REVIEW_TIMEOUT\" gemini --resume latest \\\n -p \"Review the latest fixes. If resolved: REVIEW_APPROVED. Otherwise: REVIEW_CHANGES_REQUESTED with findings.\" \\\n > \"$report\" 2>&1 || true) &\n fi\n pids=\"$pids $!\"\n ;;\n (codex)\n if [ \"$cycle\" -eq 1 ]; then\n (portable_timeout \"$REVIEW_TIMEOUT\" codex exec \"$prompt\" > \"$report\" 2>&1 || true) &\n else\n (portable_timeout \"$REVIEW_TIMEOUT\" codex exec resume --last > \"$report\" 2>&1 || true) &\n fi\n pids=\"$pids $!\"\n ;;\n esac\n log \"Spawned $reviewer (cycle $cycle) -> $report\"\n done\n log \"Waiting for reviewers: $pids\"\n for pid in $pids; do wait \"$pid\" 2>/dev/null || true; done\n log \"All reviewers finished (cycle $cycle)\"\n}\n`;\n}\n\nexport function buildImplementerPhase(): string {\n return `\nfeed_implementer() {\n local cycle_dir=\"$1\"\n local implementer_report=\"$cycle_dir/implementer.md\"\n local review_sections=\"\"\n for reviewer in $AVAILABLE_REVIEWERS; do\n local report=\"$cycle_dir/$reviewer.md\"\n if [ -s \"$report\" ]; then\n review_sections=\"$review_sections\n<$reviewer-review>\n$(cat \"$report\")\n</$reviewer-review>\n\"\n fi\n done\n local impl_prompt\n impl_prompt=$(cat <<IMPL_PROMPT_EOF\nYou received feedback from independent code reviewers. Analyze and implement all fixes.\n\nFirst, load your context:\n\\`\\`\\`bash\nnpx ca load-session\n\\`\\`\\`\n\n$review_sections\n\nFix ALL P0 and P1 findings. Address P2 where reasonable. Commit fixes.\nRun tests to verify. Output FIXES_APPLIED when done.\nIMPL_PROMPT_EOF\n)\n log \"Running implementer session...\"\n claude --model \"$REVIEW_MODEL\" --output-format text \\\n --dangerously-skip-permissions \\\n -p \"$impl_prompt\" > \"$implementer_report\" 2>&1 || true\n log \"Implementer session complete\"\n}\n`;\n}\n\nexport function buildReviewLoop(): string {\n return `\nrun_review_phase() {\n local trigger=\"$1\"\n log \"Starting review phase (trigger: $trigger)\"\n local diff_output\n diff_output=$(git diff \"$REVIEW_DIFF_RANGE\" 2>/dev/null || echo \"\")\n if [ -z \"$diff_output\" ]; then\n log \"Empty git diff, skipping review phase\"\n return 0\n fi\n detect_reviewers || return 0\n mkdir -p \"$REVIEW_DIR\"\n local cycle=1\n while [ \"$cycle\" -le \"$MAX_REVIEW_CYCLES\" ]; do\n local cycle_dir=\"$REVIEW_DIR/cycle-$cycle\"\n mkdir -p \"$cycle_dir\"\n init_review_sessions \"$cycle_dir\"\n log \"Review cycle $cycle/$MAX_REVIEW_CYCLES\"\n spawn_reviewers \"$cycle\" \"$cycle_dir\"\n local all_approved=true\n for reviewer in $AVAILABLE_REVIEWERS; do\n local report=\"$cycle_dir/$reviewer.md\"\n if [ -s \"$report\" ] && grep -q \"^REVIEW_APPROVED\" \"$report\"; then\n log \"$reviewer: APPROVED\"\n else\n log \"$reviewer: CHANGES_REQUESTED (or no report)\"\n all_approved=false\n fi\n done\n if [ \"$all_approved\" = true ]; then\n log \"All reviewers approved (cycle $cycle)\"\n return 0\n fi\n if [ \"$cycle\" -lt \"$MAX_REVIEW_CYCLES\" ]; then\n feed_implementer \"$cycle_dir\"\n local impl_report=\"$cycle_dir/implementer.md\"\n if [ -s \"$impl_report\" ] && ! grep -q \"FIXES_APPLIED\" \"$impl_report\"; then\n log \"WARN: Implementer did not output FIXES_APPLIED marker\"\n fi\n fi\n cycle=$((cycle + 1))\n done\n log \"Review phase ended after $MAX_REVIEW_CYCLES cycles without full approval\"\n if [ \"$REVIEW_BLOCKING\" = true ]; then\n log \"FATAL: Review blocking enabled, exiting\"\n exit 1\n fi\n}\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 {\n buildEpicSelector,\n buildMainLoop,\n buildMarkerDetection,\n buildObservability,\n buildPromptFunction,\n buildStreamExtractor,\n} from './loop-templates.js';\nimport {\n buildReviewConfig,\n buildReviewerDetection,\n buildSessionIdManagement,\n buildReviewPrompt,\n buildSpawnReviewers,\n buildImplementerPhase,\n buildReviewLoop,\n} from './loop-review-templates.js';\nimport { VALID_LOOP_REVIEWERS } from '../config/index.js';\nimport { out } from './shared.js';\n\n/** Safe pattern for epic IDs in loop scripts: extends cli-utils EPIC_ID_PATTERN with dots for version-like IDs */\nexport const LOOP_EPIC_ID_PATTERN = /^[a-zA-Z0-9_.-]+$/;\n\n/** Default Claude model for loop sessions */\nconst DEFAULT_MODEL = 'claude-opus-4-6';\n\n/** Safe pattern for model names: alphanumeric, hyphens, underscores, dots, colons */\nconst MODEL_PATTERN = /^[a-zA-Z0-9_.:/-]+$/;\n\nexport interface LoopScriptOptions {\n epics?: string[];\n maxRetries: number;\n model: string;\n reviewers?: string[];\n maxReviewCycles?: number;\n reviewBlocking?: boolean;\n reviewModel?: string;\n reviewEvery?: number;\n}\n\ninterface LoopOptions {\n epics?: string[];\n output?: string;\n maxRetries?: string;\n model?: string;\n force?: boolean;\n reviewers?: string[];\n reviewEvery?: string;\n maxReviewCycles?: string;\n reviewBlocking?: boolean;\n reviewModel?: string;\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# Auto-unwraps single-element arrays (bd show --json returns [...])\n# Usage: echo '[{\"status\":\"open\"}]' | parse_json '.status'\nparse_json() {\n local filter=\"$1\"\n if [ \"$HAS_JQ\" = true ]; then\n jq -r \"if type == \\\\\"array\\\\\" then .[0] else . end | $filter\"\n else\n python3 -c \"\nimport sys, json\ndata = json.load(sys.stdin)\nif isinstance(data, list):\n data = data[0] if data else {}\nf = '$filter'.strip('.')\nparts = [p for p in f.split('.') if p]\nv = data\ntry:\n for p in parts:\n v = v[p]\nexcept (KeyError, IndexError, TypeError):\n v = None\nprint('' if v is None else v)\n\"\n fi\n}\n\nmkdir -p \"$LOG_DIR\"\n` + buildEpicSelector() + buildPromptFunction();\n}\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 (!MODEL_PATTERN.test(options.model)) {\n throw new Error(`Invalid model \"${options.model}\": must match ${MODEL_PATTERN}`);\n }\n if (options.epics) {\n for (const id of options.epics) {\n if (!LOOP_EPIC_ID_PATTERN.test(id)) {\n throw new Error(`Invalid epic ID \"${id}\": must match ${LOOP_EPIC_ID_PATTERN}`);\n }\n }\n }\n if (options.reviewers) {\n for (const name of options.reviewers) {\n if (!(VALID_LOOP_REVIEWERS as readonly string[]).includes(name)) {\n throw new Error(`Invalid reviewer \"${name}\". Valid: ${VALID_LOOP_REVIEWERS.join(', ')}`);\n }\n }\n if (options.reviewModel && !MODEL_PATTERN.test(options.reviewModel)) {\n throw new Error(`Invalid review model \"${options.reviewModel}\": must match ${MODEL_PATTERN}`);\n }\n if (options.reviewEvery !== undefined && (!Number.isInteger(options.reviewEvery) || options.reviewEvery < 0)) {\n throw new Error(`Invalid reviewEvery: must be a non-negative integer, got ${options.reviewEvery}`);\n }\n if (options.maxReviewCycles !== undefined && (!Number.isInteger(options.maxReviewCycles) || options.maxReviewCycles < 1)) {\n throw new Error(`Invalid maxReviewCycles: must be a positive integer, got ${options.maxReviewCycles}`);\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 const hasReview = options.reviewers && options.reviewers.length > 0;\n\n let script = buildScriptHeader(timestamp, options.maxRetries, options.model, epicIds)\n + buildStreamExtractor()\n + buildMarkerDetection()\n + buildObservability();\n\n if (hasReview) {\n script += buildReviewConfig({\n reviewers: options.reviewers!,\n maxReviewCycles: options.maxReviewCycles ?? 3,\n reviewBlocking: options.reviewBlocking ?? false,\n reviewModel: options.reviewModel ?? DEFAULT_MODEL,\n reviewEvery: options.reviewEvery ?? 0,\n });\n script += buildReviewerDetection();\n script += buildSessionIdManagement();\n script += buildReviewPrompt();\n script += buildSpawnReviewers();\n script += buildImplementerPhase();\n script += buildReviewLoop();\n }\n\n script += buildMainLoop(hasReview ? { hasReview: true, reviewEvery: options.reviewEvery ?? 0 } : undefined);\n\n return script;\n}\n\nasync function handleLoop(cmd: Command, options: LoopOptions): Promise<void> {\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 const reviewEvery = Number(options.reviewEvery ?? 0);\n const maxReviewCycles = Number(options.maxReviewCycles ?? 3);\n\n let script: string;\n try {\n script = generateLoopScript({\n epics: options.epics,\n maxRetries,\n model: options.model ?? DEFAULT_MODEL,\n reviewers: options.reviewers,\n reviewEvery,\n maxReviewCycles,\n reviewBlocking: options.reviewBlocking,\n reviewModel: options.reviewModel ?? DEFAULT_MODEL,\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 * 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', DEFAULT_MODEL)\n .option('--force', 'Overwrite existing script')\n .option('--review-every <n>', 'Review every N completed epics (0=end-only)', '0')\n .option('--reviewers <names...>', 'Reviewers to use (claude-sonnet claude-opus gemini codex)')\n .option('--max-review-cycles <n>', 'Max review/fix iterations', '3')\n .option('--review-blocking', 'Fail loop if review not approved after max cycles')\n .option('--review-model <model>', 'Model for implementer fix sessions', DEFAULT_MODEL)\n .action(async function (this: Command, options: LoopOptions) {\n await handleLoop(this, options);\n });\n}\n","/**\n * Watch command: tail and pretty-print trace JSONL from infinity loop sessions.\n *\n * Provides real-time micro-observability into Claude Code sessions\n * spawned by the infinity loop.\n */\n\nimport { createReadStream, existsSync, readdirSync, readlinkSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { createInterface } from 'node:readline';\nimport { spawn } from 'node:child_process';\n\nimport type { Command } from 'commander';\nimport chalk from 'chalk';\n\nimport { getRepoRoot } from '../cli-utils.js';\nimport { LOOP_EPIC_ID_PATTERN } from './loop.js';\nimport { out } from './shared.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Represents a parsed stream-json event from Claude Code */\nexport interface StreamEvent {\n type: string;\n timestamp?: string;\n content_block?: { type: string; name?: string };\n delta?: { type: string; text?: string };\n message?: { usage?: { input_tokens?: number; output_tokens?: number } };\n result?: string;\n [key: string]: unknown;\n}\n\ninterface WatchOptions {\n epic?: string;\n follow?: boolean;\n}\n\n// ============================================================================\n// Event Formatting\n// ============================================================================\n\nfunction formatTime(timestamp?: string): string {\n if (!timestamp) {\n const now = new Date();\n return now.toTimeString().slice(0, 8);\n }\n try {\n return new Date(timestamp).toTimeString().slice(0, 8);\n } catch {\n return new Date().toTimeString().slice(0, 8);\n }\n}\n\nfunction formatNumber(n: number): string {\n return n.toLocaleString();\n}\n\n/**\n * Format a stream-json event into a human-readable line.\n * Returns null for events that should be skipped (pings, etc).\n */\nexport function formatStreamEvent(event: StreamEvent): string | null {\n const time = chalk.dim(formatTime(event.timestamp));\n\n switch (event.type) {\n case 'content_block_start': {\n if (event.content_block?.type === 'tool_use') {\n const name = event.content_block.name ?? 'unknown';\n return `${time} ${chalk.cyan('TOOL')} ${name}`;\n }\n if (event.content_block?.type === 'thinking') {\n return `${time} ${chalk.magenta('THINK')} thinking...`;\n }\n return null;\n }\n\n case 'content_block_delta': {\n if (event.delta?.type === 'text_delta') {\n const text = event.delta.text ?? '';\n const truncated = text.length > 60 ? text.slice(0, 57) + '...' : text;\n return `${time} ${chalk.blue('TEXT')} ${truncated.replace(/\\n/g, ' ')}`;\n }\n return null;\n }\n\n case 'message_delta': {\n const usage = (event as StreamEvent & { usage?: { output_tokens?: number } }).usage;\n if (usage?.output_tokens) {\n return `${time} ${chalk.dim('TOKENS')} ${formatNumber(usage.output_tokens)} out (final)`;\n }\n return null;\n }\n\n case 'message_start': {\n if (event.message?.usage) {\n const { input_tokens, output_tokens } = event.message.usage;\n const inTok = input_tokens ? formatNumber(input_tokens) : '?';\n const outTok = output_tokens ? formatNumber(output_tokens) : '?';\n return `${time} ${chalk.dim('TOKENS')} ${inTok} in / ${outTok} out`;\n }\n return null;\n }\n\n case 'result': {\n const text = typeof event.result === 'string' ? event.result : '';\n const markers = ['EPIC_COMPLETE', 'EPIC_FAILED', 'HUMAN_REQUIRED'];\n const found = markers.find(m => text.includes(m));\n if (found) {\n // Extract just the line containing the marker, truncate to 120 chars\n const markerLine = text.split('\\n').find(l => l.includes(found)) ?? found;\n const display = markerLine.length > 120 ? markerLine.slice(0, 117) + '...' : markerLine;\n return `${time} ${chalk.yellow.bold('MARKER')} ${display}`;\n }\n return null;\n }\n\n default:\n return null;\n }\n}\n\n// ============================================================================\n// Trace File Discovery\n// ============================================================================\n\n/**\n * Find the latest trace JSONL file in the given directory.\n * Checks for .latest symlink first, then falls back to sorting by name.\n */\nexport function findLatestTraceFile(logDir: string): string | null {\n if (!existsSync(logDir)) return null;\n\n // Check for .latest symlink\n const latestPath = join(logDir, '.latest');\n if (existsSync(latestPath)) {\n try {\n const target = readlinkSync(latestPath);\n const resolved = resolve(logDir, target);\n if (existsSync(resolved)) return resolved;\n } catch {\n // Not a symlink or broken, fall through\n }\n }\n\n // Fallback: find most recent trace_*.jsonl\n try {\n const files = readdirSync(logDir)\n .filter(f => f.startsWith('trace_') && f.endsWith('.jsonl'))\n .sort()\n .reverse();\n const first = files[0];\n if (first) return join(logDir, first);\n } catch {\n // Directory read error\n }\n\n return null;\n}\n\n// ============================================================================\n// Watch Logic\n// ============================================================================\n\nfunction processLine(line: string): void {\n const trimmed = line.trim();\n if (!trimmed) return;\n\n try {\n const event = JSON.parse(trimmed) as StreamEvent;\n const formatted = formatStreamEvent(event);\n if (formatted) {\n console.log(formatted);\n }\n } catch {\n // Skip malformed JSON lines\n }\n}\n\nasync function tailFile(filePath: string, follow: boolean): Promise<void> {\n if (follow) {\n const child = spawn('tail', ['-f', '-n', '+1', filePath], { stdio: ['ignore', 'pipe', 'ignore'] });\n const rl = createInterface({ input: child.stdout });\n\n rl.on('line', processLine);\n\n const cleanup = (): void => {\n child.kill('SIGTERM');\n };\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n return new Promise<void>((done) => {\n child.on('close', () => {\n process.off('SIGINT', cleanup);\n process.off('SIGTERM', cleanup);\n done();\n });\n });\n }\n\n const stream = createReadStream(filePath, { encoding: 'utf-8' });\n const rl = createInterface({ input: stream });\n\n try {\n for await (const line of rl) {\n processLine(line);\n }\n } finally {\n rl.close();\n stream.destroy();\n }\n}\n\n// ============================================================================\n// Command Handler\n// ============================================================================\n\nasync function handleWatch(cmd: Command, options: WatchOptions): Promise<void> {\n void cmd;\n\n let logDir: string;\n try {\n logDir = join(getRepoRoot(), 'agent_logs');\n } catch {\n logDir = resolve('agent_logs');\n }\n const follow = options.follow !== false; // default: true\n\n let traceFile: string | null = null;\n\n if (options.epic) {\n if (!LOOP_EPIC_ID_PATTERN.test(options.epic)) {\n out.error(`Invalid epic ID: ${options.epic}`);\n process.exitCode = 1;\n return;\n }\n\n // Find trace file for specific epic\n if (existsSync(logDir)) {\n try {\n const files = readdirSync(logDir)\n .filter(f => f.startsWith(`trace_${options.epic}`) && f.endsWith('.jsonl'))\n .sort()\n .reverse();\n const first = files[0];\n if (first) traceFile = join(logDir, first);\n } catch {\n // Directory read error\n }\n }\n\n if (!traceFile) {\n out.error(`No trace file found for epic: ${options.epic}`);\n process.exitCode = 1;\n return;\n }\n } else {\n traceFile = findLatestTraceFile(logDir);\n\n if (!traceFile) {\n out.info('No active trace found. Run `ca loop` to generate a loop script first.');\n process.exitCode = 0;\n return;\n }\n }\n\n out.info(`Watching: ${traceFile}`);\n await tailFile(traceFile, follow);\n}\n\n// ============================================================================\n// Command Registration\n// ============================================================================\n\n/**\n * Register watch command on the program.\n */\nexport function registerWatchCommand(program: Command): void {\n program\n .command('watch')\n .description('Tail and pretty-print live trace from infinity loop sessions')\n .option('--epic <id>', 'Watch a specific epic trace')\n .option('--no-follow', 'Print existing trace and exit (no live tail)')\n .action(async function (this: Command, options: WatchOptions) {\n await handleWatch(this, options);\n });\n}\n","/**\n * Native module preflight check logic.\n *\n * Extracted from cli.ts so tests can import without triggering\n * Commander's program.parse() side effect.\n */\n\nimport type { Command } from 'commander';\n\n/**\n * Commands that require SQLite (better-sqlite3) to function.\n * Only these commands trigger the native module preflight check.\n *\n * Inverted from a \"safe\" set so new commands work by default without\n * native modules. If a new command needs SQLite, it should be added here;\n * otherwise it will still get the error from ensureSqliteAvailable() at\n * call time, just with a less polished message.\n */\nconst NEEDS_SQLITE = new Set([\n // Capture\n 'learn', 'capture', 'detect',\n // Retrieval\n 'search', 'list', 'load-session', 'check-plan',\n // Knowledge\n 'knowledge', 'index-docs',\n // Management - CRUD\n 'show', 'update', 'delete',\n // Management - invalidation\n 'wrong', 'validate',\n // Management - maintenance\n 'compact', 'rebuild', 'stats', 'prime', 'clean-lessons',\n // Management - IO\n 'export', 'import',\n // Audit & compound\n 'audit', 'compound',\n]);\n\n/**\n * Check if a command (or any of its ancestors) needs SQLite.\n */\nexport function commandNeedsSqlite(cmd: Command): boolean {\n let current: Command | null = cmd;\n while (current) {\n if (NEEDS_SQLITE.has(current.name())) return true;\n current = current.parent;\n }\n return false;\n}\n","import { join } from 'node:path';\n\nimport { Command } from 'commander';\n\nimport { registerCompoundCommands } from './commands/compound.js';\nimport {\n registerCaptureCommands,\n registerManagementCommands,\n registerPhaseCheckCommand,\n registerRetrievalCommands,\n registerSetupCommands,\n} from './commands/index.js';\nimport { registerLoopCommands } from './commands/loop.js';\nimport { registerWatchCommand } from './commands/watch.js';\nimport { VERSION } from './version.js';\nimport { getRepoRoot } from './cli-utils.js';\nimport { type UpdateCheckResult, checkForUpdate, formatUpdateNotification } from './update-check.js';\nimport { commandNeedsSqlite } from './cli-preflight.js';\nimport { unloadEmbeddingResources } from './memory/embeddings/index.js';\nimport { closeDb, ensureSqliteAvailable } from './memory/storage/index.js';\nimport { printNativeBuildDiagnostic } from './native-diagnostic.js';\n\n/**\n * Release heavyweight CLI resources.\n *\n * Safe to call repeatedly even if the resources were never initialized.\n */\nexport async function cleanupCliResources(): Promise<void> {\n try {\n await unloadEmbeddingResources();\n } catch {\n // Ignore cleanup errors during shutdown.\n }\n\n try {\n closeDb();\n } catch {\n // Ignore errors - database may never have been opened.\n }\n}\n\n/**\n * Attach signal handlers that release resources before exiting.\n */\nexport function attachSignalHandlers(): void {\n const handleSignal = (exitCode: number) => {\n void cleanupCliResources().finally(() => process.exit(exitCode));\n };\n\n process.on('SIGINT', () => handleSignal(0));\n process.on('SIGTERM', () => handleSignal(0));\n}\n\n/**\n * Build the configured CLI program.\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .option('-v, --verbose', 'Show detailed output')\n .option('-q, --quiet', 'Suppress non-essential output');\n\n program\n .name('ca')\n .description('Semantically-intelligent workflow plugin for Claude Code')\n .version(VERSION);\n\n registerCaptureCommands(program);\n registerRetrievalCommands(program);\n registerManagementCommands(program);\n registerSetupCommands(program);\n registerCompoundCommands(program);\n registerLoopCommands(program);\n registerWatchCommand(program);\n registerPhaseCheckCommand(program);\n\n program.hook('preAction', (_thisCommand, actionCommand) => {\n if (!commandNeedsSqlite(actionCommand)) return;\n\n try {\n ensureSqliteAvailable();\n } catch (err) {\n let root: string | undefined;\n try {\n root = getRepoRoot();\n } catch {\n // Fall back to cwd inside printNativeBuildDiagnostic.\n }\n printNativeBuildDiagnostic(err, root);\n process.exit(1);\n }\n });\n\n return program;\n}\n\n/**\n * Parse CLI arguments and always release resources before returning.\n */\nexport async function runProgram(program: Command, argv: readonly string[] = process.argv): Promise<void> {\n // Start update check concurrently with command execution (TTY only).\n // Fired before parseAsync so the fetch runs in parallel with the command.\n let updatePromise: Promise<UpdateCheckResult | null> | null = null;\n if (process.stdout.isTTY) {\n try {\n const cacheDir = join(getRepoRoot(), '.claude', '.cache');\n updatePromise = checkForUpdate(cacheDir);\n } catch {\n // getRepoRoot() can fail outside a git repo -- update check is non-critical.\n }\n }\n\n try {\n await program.parseAsync(argv);\n\n if (updatePromise) {\n try {\n const result = await updatePromise;\n if (result?.updateAvailable) {\n console.log(formatUpdateNotification(result.current, result.latest));\n }\n } catch {\n // Never let update check break the CLI.\n }\n }\n } finally {\n await cleanupCliResources();\n }\n}\n","/**\n * Rich diagnostic output when native addon loading fails.\n *\n * Detects the consumer's package manager and provides targeted\n * fix instructions for pnpm v10+ build script approval.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Detect the package manager used in a project directory.\n */\nexport function detectPackageManager(cwd: string): 'pnpm' | 'npm' | 'yarn' | 'unknown' {\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n\n try {\n const raw = readFileSync(join(cwd, 'package.json'), 'utf-8');\n const pkg = JSON.parse(raw) as Record<string, unknown>;\n if (typeof pkg.packageManager === 'string') {\n if (pkg.packageManager.startsWith('pnpm')) return 'pnpm';\n if (pkg.packageManager.startsWith('yarn')) return 'yarn';\n }\n } catch { /* ignore */ }\n\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm';\n return 'unknown';\n}\n\n/**\n * Print a rich diagnostic when native modules fail to load.\n * Uses stderr to keep stdout clean for JSON output.\n *\n * @param err - The error thrown by ensureSqliteAvailable()\n * @param cwd - Project root for package manager detection (defaults to process.cwd())\n */\nexport function printNativeBuildDiagnostic(err: unknown, cwd: string = process.cwd()): void {\n const pm = detectPackageManager(cwd);\n\n console.error('');\n console.error('ERROR: Native module \"better-sqlite3\" failed to load.');\n console.error('');\n\n if (pm === 'pnpm') {\n console.error(' pnpm v10+ blocks native addon builds by default.');\n console.error('');\n console.error(' Fix (choose one):');\n console.error('');\n console.error(' Option A -- Run setup (recommended):');\n console.error(' npx ca setup');\n console.error('');\n console.error(' Option B -- Manual patch:');\n console.error(' 1. Add to package.json:');\n console.error(' \"pnpm\": { \"onlyBuiltDependencies\": [\"better-sqlite3\", \"node-llama-cpp\"] }');\n console.error(' 2. Run: pnpm install && pnpm rebuild better-sqlite3');\n console.error('');\n console.error(' Option C -- Approve build scripts interactively:');\n console.error(' pnpm approve-builds');\n console.error('');\n } else {\n console.error(' Fix: npm rebuild better-sqlite3');\n console.error('');\n console.error(' If the error persists, ensure build tools are installed:');\n printBuildToolsHint();\n console.error('');\n }\n\n if (err instanceof Error && err.cause) {\n const causeMsg = err.cause instanceof Error ? err.cause.message : String(err.cause);\n console.error(' Underlying error:', causeMsg);\n console.error('');\n }\n}\n\nfunction printBuildToolsHint(): void {\n const platform = process.platform;\n if (platform === 'darwin') {\n console.error(' macOS: xcode-select --install');\n } else if (platform === 'linux') {\n console.error(' Linux: sudo apt install build-essential python3 (Debian/Ubuntu)');\n console.error(' sudo dnf groupinstall \"Development Tools\" (Fedora)');\n } else if (platform === 'win32') {\n console.error(' Windows: Install Visual Studio Build Tools');\n console.error(' https://visualstudio.microsoft.com/visual-cpp-build-tools/');\n }\n}\n","#!/usr/bin/env node\n\nimport { attachSignalHandlers, createProgram, runProgram } from './cli-app.js';\n\nattachSignalHandlers();\n\nawait runProgram(createProgram());\n"]}
|