@karajan-family/code 4.21.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.
Files changed (746) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +98 -0
  3. package/bin/karajan-mcp.js +2 -0
  4. package/bin/kj-rag-mcp.js +75 -0
  5. package/bin/kj-tail +361 -0
  6. package/bin/kj.js +2 -0
  7. package/docs/README.es.md +80 -0
  8. package/docs/karajan-code-logo-small.png +0 -0
  9. package/library/logical-clocks-lamport.md +40 -0
  10. package/package.json +140 -0
  11. package/packages/ai-trash/README.md +37 -0
  12. package/packages/ai-trash/bin/kj-trash.js +10 -0
  13. package/packages/ai-trash/package.json +43 -0
  14. package/packages/ai-trash/src/cli.js +200 -0
  15. package/packages/ai-trash/src/destructive-parser.js +74 -0
  16. package/packages/ai-trash/src/git-snapshot.js +128 -0
  17. package/packages/ai-trash/src/hook.js +137 -0
  18. package/packages/ai-trash/src/index.js +14 -0
  19. package/packages/ai-trash/src/install.js +73 -0
  20. package/packages/ai-trash/src/logger.js +60 -0
  21. package/packages/ai-trash/src/manifest.js +91 -0
  22. package/packages/ai-trash/src/permissions.js +26 -0
  23. package/packages/ai-trash/src/snapshot.js +66 -0
  24. package/packages/ai-trash/src/ulid.js +66 -0
  25. package/packages/hu-board/README.md +69 -0
  26. package/packages/hu-board/package.json +28 -0
  27. package/packages/hu-board/public/app.js +259 -0
  28. package/packages/hu-board/public/index.html +77 -0
  29. package/packages/hu-board/public/pipeline.css +132 -0
  30. package/packages/hu-board/public/pipeline.html +48 -0
  31. package/packages/hu-board/public/pipeline.js +200 -0
  32. package/packages/hu-board/public/rag.html +21 -0
  33. package/packages/hu-board/public/rag.js +39 -0
  34. package/packages/hu-board/public/styles.css +973 -0
  35. package/packages/hu-board/public/utils/api.js +139 -0
  36. package/packages/hu-board/public/utils/board-view.js +473 -0
  37. package/packages/hu-board/public/utils/command-launcher.js +213 -0
  38. package/packages/hu-board/public/utils/config-editor.js +181 -0
  39. package/packages/hu-board/public/utils/dashboard-view.js +103 -0
  40. package/packages/hu-board/public/utils/formatters.js +300 -0
  41. package/packages/hu-board/public/utils/graph-view.js +216 -0
  42. package/packages/hu-board/public/utils/hu-actions.js +224 -0
  43. package/packages/hu-board/public/utils/init-listeners.js +180 -0
  44. package/packages/hu-board/public/utils/log-panel.js +222 -0
  45. package/packages/hu-board/public/utils/modals.js +309 -0
  46. package/packages/hu-board/public/utils/plan-rollup-view.js +53 -0
  47. package/packages/hu-board/public/utils/preflight-view.js +89 -0
  48. package/packages/hu-board/public/utils/project-actions.js +143 -0
  49. package/packages/hu-board/public/utils/project-picker-view.js +139 -0
  50. package/packages/hu-board/public/utils/run-launcher.js +169 -0
  51. package/packages/hu-board/public/utils/server-push.js +252 -0
  52. package/packages/hu-board/public/utils/sessions-view.js +199 -0
  53. package/packages/hu-board/public/utils/story-detail-view.js +324 -0
  54. package/packages/hu-board/public/utils/story-edit-form.js +271 -0
  55. package/packages/hu-board/public/wiki.html +32 -0
  56. package/packages/hu-board/public/wiki.js +53 -0
  57. package/packages/hu-board/src/auth.js +92 -0
  58. package/packages/hu-board/src/boot-info.js +16 -0
  59. package/packages/hu-board/src/cleanup-zombies.js +145 -0
  60. package/packages/hu-board/src/command-runner.js +133 -0
  61. package/packages/hu-board/src/config-yaml.js +531 -0
  62. package/packages/hu-board/src/db.js +963 -0
  63. package/packages/hu-board/src/ephemeral-cleaner.js +196 -0
  64. package/packages/hu-board/src/event-bus.js +58 -0
  65. package/packages/hu-board/src/format.js +207 -0
  66. package/packages/hu-board/src/hu-zombie-reaper.js +103 -0
  67. package/packages/hu-board/src/journal-parser.js +180 -0
  68. package/packages/hu-board/src/plan-mutations.js +424 -0
  69. package/packages/hu-board/src/preflight.js +286 -0
  70. package/packages/hu-board/src/routes/api.js +1374 -0
  71. package/packages/hu-board/src/routes/pipeline.js +45 -0
  72. package/packages/hu-board/src/routes/rag.js +42 -0
  73. package/packages/hu-board/src/routes/wiki.js +43 -0
  74. package/packages/hu-board/src/run-tracker.js +121 -0
  75. package/packages/hu-board/src/server.js +438 -0
  76. package/packages/hu-board/src/sync.js +732 -0
  77. package/packages/hu-board/src/token-store.js +56 -0
  78. package/packages/hu-board/src/zombie-reaper.js +206 -0
  79. package/scripts/ai-attribution-guard.yml +84 -0
  80. package/scripts/audit-test-diet.mjs +151 -0
  81. package/scripts/build-sea.mjs +150 -0
  82. package/scripts/diet-baseline.mjs +170 -0
  83. package/scripts/dual-publish.mjs +67 -0
  84. package/scripts/esbuild-sea.config.mjs +273 -0
  85. package/scripts/git-hooks/post-merge +18 -0
  86. package/scripts/install-binary.ps1 +174 -0
  87. package/scripts/install-binary.sh +159 -0
  88. package/scripts/install-guard-all-repos.sh +85 -0
  89. package/scripts/install-kj.sh +193 -0
  90. package/scripts/install.js +901 -0
  91. package/scripts/install.sh +7 -0
  92. package/scripts/postinstall.js +117 -0
  93. package/scripts/protect-all-repos.sh +88 -0
  94. package/scripts/quickstart-gate.mjs +97 -0
  95. package/scripts/regen-arch-stats.sh +71 -0
  96. package/scripts/setup-multi-instance.sh +150 -0
  97. package/scripts/verify-pack.mjs +278 -0
  98. package/src/activity-log.js +59 -0
  99. package/src/agents/agy-agent.js +62 -0
  100. package/src/agents/aider-agent.js +78 -0
  101. package/src/agents/availability.js +52 -0
  102. package/src/agents/base-agent.js +134 -0
  103. package/src/agents/claude-agent.js +413 -0
  104. package/src/agents/codex-agent.js +112 -0
  105. package/src/agents/copilot-agent.js +65 -0
  106. package/src/agents/gemini-agent.js +85 -0
  107. package/src/agents/host-agent.js +38 -0
  108. package/src/agents/index.js +59 -0
  109. package/src/agents/kimi-agent.js +45 -0
  110. package/src/agents/model-registry.js +137 -0
  111. package/src/agents/opencode-agent.js +72 -0
  112. package/src/agents/qwen-agent.js +20 -0
  113. package/src/agents/resolve-bin.js +73 -0
  114. package/src/audit/agent-readiness.js +259 -0
  115. package/src/audit/ai-slop-findings.js +102 -0
  116. package/src/audit/audit-fallback.js +66 -0
  117. package/src/audit/audit-history-display.js +61 -0
  118. package/src/audit/audit-history.js +102 -0
  119. package/src/audit/basal-cost.js +281 -0
  120. package/src/audit/circular-deps.js +144 -0
  121. package/src/audit/dead-exports.js +186 -0
  122. package/src/audit/deterministic-summary.js +327 -0
  123. package/src/audit/harness-scorecard.js +100 -0
  124. package/src/audit/harness-section.js +81 -0
  125. package/src/audit/infra-findings.js +100 -0
  126. package/src/audit/injection-findings.js +114 -0
  127. package/src/audit/issue-filter.js +133 -0
  128. package/src/audit/osv-findings.js +167 -0
  129. package/src/audit/plan-adherence.js +224 -0
  130. package/src/audit/semgrep-findings.js +129 -0
  131. package/src/audit/sonar-findings.js +93 -0
  132. package/src/audit/webperf-input.js +133 -0
  133. package/src/autonomy/arbiter-role.js +71 -0
  134. package/src/autonomy/arbiter.js +22 -0
  135. package/src/autonomy/decider.js +18 -0
  136. package/src/autonomy/decision-resolver.js +58 -0
  137. package/src/autonomy/outcome-report.js +55 -0
  138. package/src/autonomy/policy.js +41 -0
  139. package/src/autonomy/stage-ask.js +30 -0
  140. package/src/bootstrap.js +276 -0
  141. package/src/brain/agent-error-classifier.js +116 -0
  142. package/src/brain/decision-tracker.js +125 -0
  143. package/src/brain/decisor.js +243 -0
  144. package/src/brain/solomon-consult.js +171 -0
  145. package/src/brain/standby-scheduler.js +8 -0
  146. package/src/brain/standby-store.js +12 -0
  147. package/src/brain/with-brain-recovery.js +235 -0
  148. package/src/budget/comparison.js +96 -0
  149. package/src/canvas/parse-md.js +238 -0
  150. package/src/canvas/schema.js +101 -0
  151. package/src/canvas/to-flat.js +85 -0
  152. package/src/canvas/validate.js +163 -0
  153. package/src/checks/ai-surface.js +79 -0
  154. package/src/checks/ai-trash.js +34 -0
  155. package/src/checks/binaries.js +207 -0
  156. package/src/checks/ci.js +105 -0
  157. package/src/checks/config-files.js +217 -0
  158. package/src/checks/dir-setup.js +103 -0
  159. package/src/checks/guarantee-level.js +38 -0
  160. package/src/checks/hardware.js +150 -0
  161. package/src/checks/harness-scorecard.js +41 -0
  162. package/src/checks/mcp-health.js +169 -0
  163. package/src/checks/method.js +73 -0
  164. package/src/checks/native-build.js +67 -0
  165. package/src/checks/node.js +70 -0
  166. package/src/checks/ollama.js +41 -0
  167. package/src/checks/orphans.js +77 -0
  168. package/src/checks/ports.js +188 -0
  169. package/src/checks/project-checks.js +245 -0
  170. package/src/checks/qmd.js +41 -0
  171. package/src/checks/rag-hooks.js +54 -0
  172. package/src/checks/release-check.js +102 -0
  173. package/src/checks/rtk.js +36 -0
  174. package/src/checks/runner.js +326 -0
  175. package/src/checks/skills.js +53 -0
  176. package/src/checks/sonar.js +67 -0
  177. package/src/checks/squeezr.js +36 -0
  178. package/src/checks/system.js +53 -0
  179. package/src/checks/tokens.js +172 -0
  180. package/src/checks/types.js +103 -0
  181. package/src/ci/dispatch.js +99 -0
  182. package/src/ci/index.js +3 -0
  183. package/src/ci/pr-diff.js +26 -0
  184. package/src/ci/repo.js +45 -0
  185. package/src/cli/_shared.js +30 -0
  186. package/src/cli/advanced-commands.js +61 -0
  187. package/src/cli/register-meta.js +772 -0
  188. package/src/cli/register-pipeline.js +335 -0
  189. package/src/cli/register-plan.js +224 -0
  190. package/src/cli/register-roles-skills.js +54 -0
  191. package/src/cli/register-sonar.js +28 -0
  192. package/src/cli/register-standby.js +26 -0
  193. package/src/cli.js +155 -0
  194. package/src/commands/advanced.js +31 -0
  195. package/src/commands/agent-run.js +63 -0
  196. package/src/commands/agents.js +105 -0
  197. package/src/commands/architect.js +123 -0
  198. package/src/commands/audit.js +430 -0
  199. package/src/commands/autorun.js +49 -0
  200. package/src/commands/board.js +458 -0
  201. package/src/commands/check.js +40 -0
  202. package/src/commands/clean.js +145 -0
  203. package/src/commands/code.js +45 -0
  204. package/src/commands/config.js +74 -0
  205. package/src/commands/discover.js +105 -0
  206. package/src/commands/doctor.js +251 -0
  207. package/src/commands/env.js +207 -0
  208. package/src/commands/harden.js +203 -0
  209. package/src/commands/hu.js +210 -0
  210. package/src/commands/identity.js +60 -0
  211. package/src/commands/init.js +950 -0
  212. package/src/commands/install-tools.js +432 -0
  213. package/src/commands/mutate.js +94 -0
  214. package/src/commands/ollama.js +44 -0
  215. package/src/commands/onboard.js +45 -0
  216. package/src/commands/plan/_shared.js +55 -0
  217. package/src/commands/plan/add-hu.js +23 -0
  218. package/src/commands/plan/delete.js +9 -0
  219. package/src/commands/plan/fix.js +99 -0
  220. package/src/commands/plan/generate.js +532 -0
  221. package/src/commands/plan/index.js +13 -0
  222. package/src/commands/plan/list.js +21 -0
  223. package/src/commands/plan/migrate-result.js +41 -0
  224. package/src/commands/plan/ready.js +46 -0
  225. package/src/commands/plan/remove-hu.js +17 -0
  226. package/src/commands/plan/share.js +85 -0
  227. package/src/commands/plan/show.js +81 -0
  228. package/src/commands/plan/unshare.js +41 -0
  229. package/src/commands/plan/validate.js +20 -0
  230. package/src/commands/plan.js +17 -0
  231. package/src/commands/policy.js +164 -0
  232. package/src/commands/privacy.js +45 -0
  233. package/src/commands/qmd.js +86 -0
  234. package/src/commands/rag-mcp.js +18 -0
  235. package/src/commands/rag.js +173 -0
  236. package/src/commands/report-issue.js +77 -0
  237. package/src/commands/report.js +469 -0
  238. package/src/commands/researcher.js +54 -0
  239. package/src/commands/resume.js +68 -0
  240. package/src/commands/review-gate.js +355 -0
  241. package/src/commands/review.js +89 -0
  242. package/src/commands/roles.js +116 -0
  243. package/src/commands/run.js +185 -0
  244. package/src/commands/scan.js +18 -0
  245. package/src/commands/skills.js +86 -0
  246. package/src/commands/sonar.js +53 -0
  247. package/src/commands/standby.js +117 -0
  248. package/src/commands/start.js +121 -0
  249. package/src/commands/status.js +36 -0
  250. package/src/commands/sync.js +103 -0
  251. package/src/commands/telemetry.js +70 -0
  252. package/src/commands/tournament.js +85 -0
  253. package/src/commands/triage.js +78 -0
  254. package/src/commands/undo.js +62 -0
  255. package/src/commands/watch.js +46 -0
  256. package/src/commands/webperf.js +162 -0
  257. package/src/commands/worktree.js +76 -0
  258. package/src/config/defaults.js +270 -0
  259. package/src/config/loader.js +204 -0
  260. package/src/config/overrides.js +220 -0
  261. package/src/config/role-resolver.js +171 -0
  262. package/src/config/schema.js +299 -0
  263. package/src/config/test-harness.js +78 -0
  264. package/src/config.js +34 -0
  265. package/src/domains/domain-loader.js +245 -0
  266. package/src/domains/domain-registry.js +140 -0
  267. package/src/domains/domain-synthesizer.js +129 -0
  268. package/src/environment/adr.js +45 -0
  269. package/src/environment/board-access.js +97 -0
  270. package/src/environment/board-select.js +59 -0
  271. package/src/environment/briefs.js +129 -0
  272. package/src/environment/issue-report.js +72 -0
  273. package/src/environment/mcp-wiring.js +44 -0
  274. package/src/environment/playbook.js +127 -0
  275. package/src/git/automation.js +334 -0
  276. package/src/git/hu-automation.js +171 -0
  277. package/src/git/hu-snapshot.js +10 -0
  278. package/src/golden/asserter.js +92 -0
  279. package/src/golden/loader.js +52 -0
  280. package/src/golden/runner.js +92 -0
  281. package/src/golden/schema.js +41 -0
  282. package/src/guards/intent-guard.js +161 -0
  283. package/src/guards/output-guard.js +149 -0
  284. package/src/guards/perf-guard.js +126 -0
  285. package/src/guards/policy-guard.js +90 -0
  286. package/src/guards/policy-resolver.js +85 -0
  287. package/src/guards/secret-redactor.js +71 -0
  288. package/src/harden/advisory.js +203 -0
  289. package/src/harden/alternatives.js +50 -0
  290. package/src/harden/check.js +81 -0
  291. package/src/harden/config-engine.js +128 -0
  292. package/src/harden/config-templates.js +122 -0
  293. package/src/harden/guidelines-engine.js +48 -0
  294. package/src/harden/guidelines-templates.js +36 -0
  295. package/src/harden/harden-engine.js +80 -0
  296. package/src/harden/harness-hooks.js +107 -0
  297. package/src/harden/hook-commands.js +25 -0
  298. package/src/harden/hook-templates.js +183 -0
  299. package/src/harden/interactive.js +76 -0
  300. package/src/harden/sentinel-hooks.js +721 -0
  301. package/src/harden/stack-roots.js +105 -0
  302. package/src/harden/test-on-push.js +38 -0
  303. package/src/harden/workflow-engine.js +116 -0
  304. package/src/harden/workflow-templates.js +285 -0
  305. package/src/hu/acceptance-runner.js +138 -0
  306. package/src/hu/auto-generator.js +358 -0
  307. package/src/hu/graph.js +71 -0
  308. package/src/hu/lazy-planner.js +109 -0
  309. package/src/hu/model-router.js +108 -0
  310. package/src/hu/parallel-executor.js +94 -0
  311. package/src/hu/split-validator.js +143 -0
  312. package/src/hu/splitting-detector.js +158 -0
  313. package/src/hu/splitting-generator.js +175 -0
  314. package/src/hu/store.js +392 -0
  315. package/src/hu/worktree-bootstrap.js +59 -0
  316. package/src/identity/bootstrap.js +48 -0
  317. package/src/identity/compare.js +38 -0
  318. package/src/identity/detect.js +51 -0
  319. package/src/identity/store.js +66 -0
  320. package/src/infrastructure/command-runner.js +44 -0
  321. package/src/infrastructure/environment.js +38 -0
  322. package/src/infrastructure/file-system-service.js +63 -0
  323. package/src/infrastructure/mocks.js +182 -0
  324. package/src/lang/chunk-go.js +94 -0
  325. package/src/lang/chunk-java.js +90 -0
  326. package/src/lang/chunk-python.js +88 -0
  327. package/src/lang/chunk-rust.js +102 -0
  328. package/src/lang/go.js +14 -0
  329. package/src/lang/java.js +16 -0
  330. package/src/lang/js.js +8 -0
  331. package/src/lang/python.js +14 -0
  332. package/src/lang/registry.js +79 -0
  333. package/src/lang/rust.js +14 -0
  334. package/src/lang/tree-sitter-loader.js +45 -0
  335. package/src/mcp/direct-role-runner.js +112 -0
  336. package/src/mcp/error-classifiers.js +66 -0
  337. package/src/mcp/handlers/direct-handlers.js +486 -0
  338. package/src/mcp/handlers/hu-handlers.js +93 -0
  339. package/src/mcp/handlers/management-handlers.js +265 -0
  340. package/src/mcp/handlers/rag-handler.js +52 -0
  341. package/src/mcp/handlers/run-handler.js +313 -0
  342. package/src/mcp/orphan-guard.js +131 -0
  343. package/src/mcp/preflight.js +47 -0
  344. package/src/mcp/progress.js +149 -0
  345. package/src/mcp/response-compressor.js +81 -0
  346. package/src/mcp/run-kj.js +135 -0
  347. package/src/mcp/server-handlers.js +79 -0
  348. package/src/mcp/server.js +66 -0
  349. package/src/mcp/shared-helpers.js +297 -0
  350. package/src/mcp/sovereignty-guard.js +112 -0
  351. package/src/mcp/suggest-handler.js +92 -0
  352. package/src/mcp/tool-arg-normalizers.js +16 -0
  353. package/src/mcp/tools.js +432 -0
  354. package/src/mutate/diff-scope.js +105 -0
  355. package/src/mutate/reviewer-signal.js +76 -0
  356. package/src/mutate/runner.js +72 -0
  357. package/src/mutate/tool-registry.js +90 -0
  358. package/src/onboarder/cache.js +24 -0
  359. package/src/onboarder/collectors/framework-multilang.js +64 -0
  360. package/src/onboarder/collectors/index.js +136 -0
  361. package/src/orchestrator/agent-fallback.js +81 -0
  362. package/src/orchestrator/brain-coordinator.js +186 -0
  363. package/src/orchestrator/ci-integration.js +139 -0
  364. package/src/orchestrator/config-init.js +510 -0
  365. package/src/orchestrator/direct-actions.js +217 -0
  366. package/src/orchestrator/drivers/error-recovery.js +287 -0
  367. package/src/orchestrator/drivers/init-context.js +227 -0
  368. package/src/orchestrator/drivers/iteration-loop.js +380 -0
  369. package/src/orchestrator/drivers/iteration-phases/coder-and-refactorer.js +69 -0
  370. package/src/orchestrator/drivers/iteration-phases/guards.js +84 -0
  371. package/src/orchestrator/drivers/iteration-phases/handle-approved.js +29 -0
  372. package/src/orchestrator/drivers/iteration-phases/quality-gates.js +114 -0
  373. package/src/orchestrator/drivers/iteration-phases/reviewer-gate.js +60 -0
  374. package/src/orchestrator/drivers/post-loop.js +383 -0
  375. package/src/orchestrator/drivers/pre-loop-phases/auto-hu-batch.js +136 -0
  376. package/src/orchestrator/drivers/pre-loop-phases/config-deprecations.js +47 -0
  377. package/src/orchestrator/drivers/pre-loop-phases/ensure-addyosmani-skills.js +84 -0
  378. package/src/orchestrator/drivers/pre-loop-phases/inject-loaded-plan.js +391 -0
  379. package/src/orchestrator/drivers/pre-loop.js +507 -0
  380. package/src/orchestrator/drivers/run-hu-batch.js +427 -0
  381. package/src/orchestrator/feedback-enrichment.js +140 -0
  382. package/src/orchestrator/feedback-queue.js +151 -0
  383. package/src/orchestrator/flow-control.js +170 -0
  384. package/src/orchestrator/flow-runner.js +364 -0
  385. package/src/orchestrator/fs-leak-detector.js +210 -0
  386. package/src/orchestrator/hu-scheduler.js +114 -0
  387. package/src/orchestrator/hu-sub-pipeline.js +616 -0
  388. package/src/orchestrator/integrations.js +81 -0
  389. package/src/orchestrator/iteration-gate.js +73 -0
  390. package/src/orchestrator/iteration-stages.js +9 -0
  391. package/src/orchestrator/parallel-limiter.js +74 -0
  392. package/src/orchestrator/pipeline-context.js +72 -0
  393. package/src/orchestrator/post-loop-stages.js +468 -0
  394. package/src/orchestrator/pre-loop-stages.js +11 -0
  395. package/src/orchestrator/preflight-checks.js +462 -0
  396. package/src/orchestrator/repair/repair-detector.js +117 -0
  397. package/src/orchestrator/repair/repair-runner.js +142 -0
  398. package/src/orchestrator/reviewer-fallback.js +45 -0
  399. package/src/orchestrator/role-output-compressor.js +189 -0
  400. package/src/orchestrator/session-journal.js +308 -0
  401. package/src/orchestrator/solomon-escalation.js +305 -0
  402. package/src/orchestrator/solomon-rules.js +212 -0
  403. package/src/orchestrator/stages/architect-stage.js +172 -0
  404. package/src/orchestrator/stages/coder-stage.js +480 -0
  405. package/src/orchestrator/stages/domain-curator-stage.js +82 -0
  406. package/src/orchestrator/stages/hu-reviewer-phases/detect-and-apply-splits.js +127 -0
  407. package/src/orchestrator/stages/hu-reviewer-stage.js +394 -0
  408. package/src/orchestrator/stages/perf-stage.js +140 -0
  409. package/src/orchestrator/stages/planner-stage.js +85 -0
  410. package/src/orchestrator/stages/rag-context-stage.js +77 -0
  411. package/src/orchestrator/stages/rag-preload-decisor.js +58 -0
  412. package/src/orchestrator/stages/research-stage.js +69 -0
  413. package/src/orchestrator/stages/reviewer-stage.js +422 -0
  414. package/src/orchestrator/stages/sonar-stage.js +421 -0
  415. package/src/orchestrator/stages/stage-classes.js +84 -0
  416. package/src/orchestrator/stages/stage-executor.js +155 -0
  417. package/src/orchestrator/stages/tdd-discipline-stage.js +56 -0
  418. package/src/orchestrator/stages/tool-judge-stage.js +53 -0
  419. package/src/orchestrator/stages/triage-stage.js +172 -0
  420. package/src/orchestrator/standby.js +71 -0
  421. package/src/orchestrator/verification-gate.js +183 -0
  422. package/src/orchestrator.js +22 -0
  423. package/src/plan/adr-generator.js +170 -0
  424. package/src/plan/adr-loader.js +60 -0
  425. package/src/plan/plan-executor.js +100 -0
  426. package/src/plan/plan-fixer.js +192 -0
  427. package/src/plan/plan-hu-ops.js +16 -0
  428. package/src/plan/plan-id.js +4 -0
  429. package/src/plan/plan-migrate-result.js +24 -0
  430. package/src/plan/plan-reviewer.js +236 -0
  431. package/src/plan/plan-schema.js +334 -0
  432. package/src/plan/plan-store.js +260 -0
  433. package/src/plan/plan-structural-pass.js +122 -0
  434. package/src/plan/plan-validation.js +4 -0
  435. package/src/plan/preflight-hu.js +105 -0
  436. package/src/plan/spec-detector.js +61 -0
  437. package/src/plan/tests-synthesizer.js +131 -0
  438. package/src/planning-game/adapter.js +108 -0
  439. package/src/planning-game/architect-adrs.js +45 -0
  440. package/src/planning-game/client.js +108 -0
  441. package/src/planning-game/decomposition.js +87 -0
  442. package/src/planning-game/pipeline-adapter.js +251 -0
  443. package/src/plugins/loader.js +67 -0
  444. package/src/policy/add.js +111 -0
  445. package/src/policy/decisions.js +42 -0
  446. package/src/policy/engine.js +82 -0
  447. package/src/policy/exceptions.js +60 -0
  448. package/src/privacy/onboarding.js +35 -0
  449. package/src/privacy/scan.js +120 -0
  450. package/src/prompts/arbiter.js +38 -0
  451. package/src/prompts/architect.js +103 -0
  452. package/src/prompts/audit.js +474 -0
  453. package/src/prompts/coder.js +287 -0
  454. package/src/prompts/diff-clip.js +27 -0
  455. package/src/prompts/discover.js +222 -0
  456. package/src/prompts/hu-reviewer.js +219 -0
  457. package/src/prompts/planner.js +312 -0
  458. package/src/prompts/prompt-layout.js +80 -0
  459. package/src/prompts/prompt-resolver.js +120 -0
  460. package/src/prompts/reviewer.js +75 -0
  461. package/src/prompts/rtk-snippet.js +25 -0
  462. package/src/prompts/spec-reviewer.js +66 -0
  463. package/src/prompts/split-signal.js +82 -0
  464. package/src/prompts/start-decision.js +52 -0
  465. package/src/prompts/tool-correctness-judge.js +31 -0
  466. package/src/prompts/triage.js +57 -0
  467. package/src/rag/auto-update.js +72 -0
  468. package/src/rag/chunker-ast.js +56 -0
  469. package/src/rag/chunker.js +132 -0
  470. package/src/rag/embedder.js +2 -0
  471. package/src/rag/embedders/_cloud-base.js +2 -0
  472. package/src/rag/embedders/cohere.js +2 -0
  473. package/src/rag/embedders/factory.js +2 -0
  474. package/src/rag/embedders/mistral.js +2 -0
  475. package/src/rag/embedders/onnx.js +2 -0
  476. package/src/rag/embedders/openai.js +2 -0
  477. package/src/rag/embedders/voyage.js +2 -0
  478. package/src/rag/eval.js +61 -0
  479. package/src/rag/governed-embedder.js +39 -0
  480. package/src/rag/indexer.js +199 -0
  481. package/src/rag/library.js +62 -0
  482. package/src/rag/ollama-capability.js +59 -0
  483. package/src/rag/ollama-manager.js +98 -0
  484. package/src/rag/onnx-fallback.js +69 -0
  485. package/src/rag/rerank.js +4 -0
  486. package/src/rag/retriever.js +2 -0
  487. package/src/rag/vec-store.js +17 -0
  488. package/src/rag/watcher.js +62 -0
  489. package/src/rag/where-parser.js +4 -0
  490. package/src/repeat-detector.js +88 -0
  491. package/src/review/card-first.js +99 -0
  492. package/src/review/card-verify.js +83 -0
  493. package/src/review/diff-generator.js +112 -0
  494. package/src/review/gate-gitignore.js +77 -0
  495. package/src/review/git-stash-helper.js +104 -0
  496. package/src/review/mutation-pregate.js +48 -0
  497. package/src/review/one-shot-review.js +122 -0
  498. package/src/review/parser.js +80 -0
  499. package/src/review/policy-gate.js +26 -0
  500. package/src/review/profiles.js +66 -0
  501. package/src/review/reviewer-fallback.js +125 -0
  502. package/src/review/schema.js +31 -0
  503. package/src/review/scope-filter.js +152 -0
  504. package/src/review/snapshot-diff.js +122 -0
  505. package/src/review/solomon-arbitration.js +113 -0
  506. package/src/review/sonar-pregate.js +63 -0
  507. package/src/review/tdd-discipline.js +90 -0
  508. package/src/review/tdd-policy.js +69 -0
  509. package/src/review/tests-with-code.js +33 -0
  510. package/src/review/verdict-store.js +87 -0
  511. package/src/review/workspace.js +21 -0
  512. package/src/roles/agent-role.js +194 -0
  513. package/src/roles/architect-role.js +77 -0
  514. package/src/roles/audit-role.js +258 -0
  515. package/src/roles/base-role.js +165 -0
  516. package/src/roles/coder-role.js +107 -0
  517. package/src/roles/commiter-role.js +110 -0
  518. package/src/roles/discover-role.js +81 -0
  519. package/src/roles/domain-curator-role.js +141 -0
  520. package/src/roles/hu-reviewer-role.js +64 -0
  521. package/src/roles/impeccable-role.js +85 -0
  522. package/src/roles/index.js +18 -0
  523. package/src/roles/karajan-brain-role.js +134 -0
  524. package/src/roles/onboarder-role.js +61 -0
  525. package/src/roles/perf-role.js +122 -0
  526. package/src/roles/planner-role.js +151 -0
  527. package/src/roles/refactorer-role.js +30 -0
  528. package/src/roles/repairer-role.js +181 -0
  529. package/src/roles/researcher-role.js +70 -0
  530. package/src/roles/reviewer-role.js +104 -0
  531. package/src/roles/security-role.js +73 -0
  532. package/src/roles/solomon-role.js +265 -0
  533. package/src/roles/sonar-role.js +70 -0
  534. package/src/roles/spec-reviewer-role.js +106 -0
  535. package/src/roles/tester-role.js +235 -0
  536. package/src/roles/tool-correctness-judge-role.js +78 -0
  537. package/src/roles/triage-role.js +99 -0
  538. package/src/session/journal/decisions-writer.js +200 -0
  539. package/src/session/journal/iteration-logger.js +194 -0
  540. package/src/session/journal/summary-writer.js +320 -0
  541. package/src/session/journal/tree-writer.js +164 -0
  542. package/src/session/journal/write-all.js +89 -0
  543. package/src/session/mutators.js +339 -0
  544. package/src/session/runtime-overrides.js +59 -0
  545. package/src/session/store.js +106 -0
  546. package/src/session-cleanup.js +116 -0
  547. package/src/skills/addyosmani-catalog.js +315 -0
  548. package/src/skills/addyosmani-role-map.js +139 -0
  549. package/src/skills/openskills-client.js +157 -0
  550. package/src/skills/semantic-detector.js +167 -0
  551. package/src/skills/skill-detector.js +385 -0
  552. package/src/skills/skill-loader.js +219 -0
  553. package/src/skills/skills-cache.js +128 -0
  554. package/src/sonar/api.js +128 -0
  555. package/src/sonar/cloud-scanner.js +78 -0
  556. package/src/sonar/config-resolver.js +88 -0
  557. package/src/sonar/credentials.js +60 -0
  558. package/src/sonar/discovery.js +124 -0
  559. package/src/sonar/enforcer.js +19 -0
  560. package/src/sonar/issue-filter.js +12 -0
  561. package/src/sonar/manager.js +181 -0
  562. package/src/sonar/project-key.js +120 -0
  563. package/src/sonar/scanner.js +307 -0
  564. package/src/sonar/token-bootstrap.js +205 -0
  565. package/src/sonar/token-recovery.js +67 -0
  566. package/src/spec-review/refine-loop.js +58 -0
  567. package/src/spec-review/run-spec-review.js +119 -0
  568. package/src/start/assessment.js +74 -0
  569. package/src/start/maturity.js +73 -0
  570. package/src/start/start-decider-role.js +79 -0
  571. package/src/start/sweep.js +157 -0
  572. package/src/sync/apply-canvas-patch.js +55 -0
  573. package/src/sync/detect-drift.js +113 -0
  574. package/src/tournament/crown.js +88 -0
  575. package/src/tournament/judge.js +150 -0
  576. package/src/tournament/run.js +142 -0
  577. package/src/tournament/scoreboard.js +124 -0
  578. package/src/tracker-bootstrap.js +44 -0
  579. package/src/types/agent.js +55 -0
  580. package/src/types/config.js +114 -0
  581. package/src/types/hu.js +47 -0
  582. package/src/types/index.js +38 -0
  583. package/src/types/policy.js +43 -0
  584. package/src/types/session.js +75 -0
  585. package/src/types/solomon.js +87 -0
  586. package/src/types/stage.js +68 -0
  587. package/src/utils/agent-detect.js +93 -0
  588. package/src/utils/ai-trash.js +48 -0
  589. package/src/utils/async-lock.js +31 -0
  590. package/src/utils/atomic-write.js +6 -0
  591. package/src/utils/banner.js +66 -0
  592. package/src/utils/binary-sources.js +70 -0
  593. package/src/utils/board-prompt-bridge.js +108 -0
  594. package/src/utils/budget.js +229 -0
  595. package/src/utils/cli-ask-question.js +93 -0
  596. package/src/utils/cli-progress.js +220 -0
  597. package/src/utils/cli-run-log.js +83 -0
  598. package/src/utils/cwd-confirm.js +39 -0
  599. package/src/utils/derive-project-name-from-cwd.js +119 -0
  600. package/src/utils/display/event-handlers.js +403 -0
  601. package/src/utils/display/formatters.js +132 -0
  602. package/src/utils/display/header.js +47 -0
  603. package/src/utils/display/resume-hint.js +41 -0
  604. package/src/utils/display/session-summary.js +118 -0
  605. package/src/utils/display/solomon.js +42 -0
  606. package/src/utils/display/spec-findings.js +44 -0
  607. package/src/utils/doc-links.js +29 -0
  608. package/src/utils/docker-install.js +34 -0
  609. package/src/utils/escape-regexp.js +15 -0
  610. package/src/utils/events.js +35 -0
  611. package/src/utils/fs.js +19 -0
  612. package/src/utils/garbage-collector.js +481 -0
  613. package/src/utils/git.js +279 -0
  614. package/src/utils/home-migration.js +87 -0
  615. package/src/utils/injection-guard.js +186 -0
  616. package/src/utils/install-hints.js +180 -0
  617. package/src/utils/json-extract.js +64 -0
  618. package/src/utils/locale.js +59 -0
  619. package/src/utils/logger.js +96 -0
  620. package/src/utils/managed-markers.js +93 -0
  621. package/src/utils/manifest-sniff.js +82 -0
  622. package/src/utils/messages.js +61 -0
  623. package/src/utils/model-selector.js +107 -0
  624. package/src/utils/os-detect.js +79 -0
  625. package/src/utils/paths.js +13 -0
  626. package/src/utils/pending-user-action.js +95 -0
  627. package/src/utils/port-check.js +6 -0
  628. package/src/utils/port-occupant.js +96 -0
  629. package/src/utils/pricing.js +29 -0
  630. package/src/utils/process.js +4 -0
  631. package/src/utils/project-detect.js +160 -0
  632. package/src/utils/prompt-project-name.js +35 -0
  633. package/src/utils/provider-env.js +116 -0
  634. package/src/utils/qmd-collection.js +72 -0
  635. package/src/utils/qmd-detect.js +18 -0
  636. package/src/utils/qmd-install.js +37 -0
  637. package/src/utils/quota-simulator.js +56 -0
  638. package/src/utils/rate-limit-detector.js +181 -0
  639. package/src/utils/repo-cleaner.js +79 -0
  640. package/src/utils/retry.js +88 -0
  641. package/src/utils/role-assigner.js +137 -0
  642. package/src/utils/role-env.js +58 -0
  643. package/src/utils/rtk-detect.js +18 -0
  644. package/src/utils/rtk-install.js +38 -0
  645. package/src/utils/rtk-wrapper.js +87 -0
  646. package/src/utils/run-context.js +75 -0
  647. package/src/utils/run-log.js +217 -0
  648. package/src/utils/run-registry.js +9 -0
  649. package/src/utils/shared-paths.js +12 -0
  650. package/src/utils/squeezr-detect.js +21 -0
  651. package/src/utils/squeezr-install.js +37 -0
  652. package/src/utils/stack-detect.js +135 -0
  653. package/src/utils/stall-detector.js +159 -0
  654. package/src/utils/status-dashboard.js +254 -0
  655. package/src/utils/task-file.js +109 -0
  656. package/src/utils/telemetry.js +124 -0
  657. package/src/utils/templates-root.js +61 -0
  658. package/src/utils/tool-call-extractor.js +56 -0
  659. package/src/utils/tool-governor.js +116 -0
  660. package/src/utils/tool-installer.js +93 -0
  661. package/src/utils/update-check.js +280 -0
  662. package/src/utils/vector-store-orphans.js +89 -0
  663. package/src/utils/welcome.js +47 -0
  664. package/src/utils/with-timeout.js +42 -0
  665. package/src/utils/wizard.js +47 -0
  666. package/src/webperf/cwv-gate.js +94 -0
  667. package/src/webperf/devtools-detect.js +112 -0
  668. package/src/webperf/scanner.js +209 -0
  669. package/src/webperf/webperf-role-integration.js +66 -0
  670. package/templates/coder-rules.md +45 -0
  671. package/templates/docker-compose.sonar.yml +60 -0
  672. package/templates/domains/example-dental.md +57 -0
  673. package/templates/kj.config.yml +128 -0
  674. package/templates/review-rules.md +17 -0
  675. package/templates/roles/architect/anthropic.md +74 -0
  676. package/templates/roles/architect/default.md +72 -0
  677. package/templates/roles/architect/google.md +61 -0
  678. package/templates/roles/architect/openai.md +60 -0
  679. package/templates/roles/architect/opencode.md +59 -0
  680. package/templates/roles/architect.md +76 -0
  681. package/templates/roles/audit.md +68 -0
  682. package/templates/roles/coder/anthropic.md +81 -0
  683. package/templates/roles/coder/default.md +78 -0
  684. package/templates/roles/coder/google.md +87 -0
  685. package/templates/roles/coder/openai.md +68 -0
  686. package/templates/roles/coder/opencode.md +58 -0
  687. package/templates/roles/coder.md +152 -0
  688. package/templates/roles/commiter.md +44 -0
  689. package/templates/roles/discover.md +167 -0
  690. package/templates/roles/domain-curator.md +52 -0
  691. package/templates/roles/hu-reviewer.md +236 -0
  692. package/templates/roles/impeccable-design.md +87 -0
  693. package/templates/roles/impeccable.md +125 -0
  694. package/templates/roles/karajan-brain.md +95 -0
  695. package/templates/roles/onboarder.md +45 -0
  696. package/templates/roles/planner/anthropic.md +59 -0
  697. package/templates/roles/planner/default.md +57 -0
  698. package/templates/roles/planner/google.md +75 -0
  699. package/templates/roles/planner/openai.md +55 -0
  700. package/templates/roles/planner/opencode.md +62 -0
  701. package/templates/roles/planner.md +61 -0
  702. package/templates/roles/refactorer.md +48 -0
  703. package/templates/roles/repairer.md +103 -0
  704. package/templates/roles/researcher.md +41 -0
  705. package/templates/roles/reviewer/anthropic.md +61 -0
  706. package/templates/roles/reviewer/default.md +62 -0
  707. package/templates/roles/reviewer/google.md +63 -0
  708. package/templates/roles/reviewer/openai.md +57 -0
  709. package/templates/roles/reviewer/opencode.md +42 -0
  710. package/templates/roles/reviewer-paranoid.md +38 -0
  711. package/templates/roles/reviewer-relaxed.md +34 -0
  712. package/templates/roles/reviewer-strict.md +37 -0
  713. package/templates/roles/reviewer.md +62 -0
  714. package/templates/roles/security.md +54 -0
  715. package/templates/roles/solomon/anthropic.md +71 -0
  716. package/templates/roles/solomon/default.md +83 -0
  717. package/templates/roles/solomon/google.md +61 -0
  718. package/templates/roles/solomon/openai.md +53 -0
  719. package/templates/roles/solomon/opencode.md +55 -0
  720. package/templates/roles/solomon.md +83 -0
  721. package/templates/roles/sonar.md +49 -0
  722. package/templates/roles/spec-reviewer.md +47 -0
  723. package/templates/roles/tester.md +50 -0
  724. package/templates/roles/triage.md +69 -0
  725. package/templates/skills/kj-architect.md +45 -0
  726. package/templates/skills/kj-audit.md +63 -0
  727. package/templates/skills/kj-board.md +16 -0
  728. package/templates/skills/kj-code.md +51 -0
  729. package/templates/skills/kj-csv-transform.md +40 -0
  730. package/templates/skills/kj-data-report.md +44 -0
  731. package/templates/skills/kj-discover.md +24 -0
  732. package/templates/skills/kj-rag-query.md +50 -0
  733. package/templates/skills/kj-review.md +47 -0
  734. package/templates/skills/kj-run.md +73 -0
  735. package/templates/skills/kj-security.md +49 -0
  736. package/templates/skills/kj-sonar.md +41 -0
  737. package/templates/skills/kj-sql-analysis.md +40 -0
  738. package/templates/skills/kj-test.md +40 -0
  739. package/templates/workflows/automerge.yml +30 -0
  740. package/templates/workflows/houston-override.yml +46 -0
  741. package/templates/workflows/kj-ci-gateway.yml +58 -0
  742. package/vendor/tree-sitter-grammars/README.md +21 -0
  743. package/vendor/tree-sitter-grammars/go.wasm +0 -0
  744. package/vendor/tree-sitter-grammars/java.wasm +0 -0
  745. package/vendor/tree-sitter-grammars/python.wasm +0 -0
  746. package/vendor/tree-sitter-grammars/rust.wasm +0 -0
@@ -0,0 +1,287 @@
1
+ import { buildRtkInstructions } from "./rtk-snippet.js";
2
+ import { loadAvailableSkills, buildSkillSection } from "../skills/skill-loader.js";
3
+ import { getLanguageInstruction } from "../utils/locale.js";
4
+ import { section, buildPromptLayout, joinLayout, STABLE, VOLATILE } from "./prompt-layout.js";
5
+
6
+ const SUBAGENT_PREAMBLE = [
7
+ "IMPORTANT: You are running as a Karajan sub-agent.",
8
+ "Do NOT ask about using Karajan, do NOT mention Karajan, do NOT suggest orchestration.",
9
+ "Execute the task directly. Do NOT use any MCP tools. Focus only on coding."
10
+ ].join(" ");
11
+
12
+ const SUBAGENT_PREAMBLE_SERENA = [
13
+ "IMPORTANT: You are running as a Karajan sub-agent.",
14
+ "Do NOT ask about using Karajan, do NOT mention Karajan, do NOT suggest orchestration.",
15
+ "Execute the task directly. Focus only on coding."
16
+ ].join(" ");
17
+
18
+ const SUBPROCESS_CONSTRAINTS = [
19
+ "## Environment constraints",
20
+ "You run as a non-interactive subprocess (no stdin, no TTY).",
21
+ "- If the task requires a CLI wizard or interactive init (e.g. `create-react-app`, `pnpm create astro`, `npm init`), ALWAYS use non-interactive flags: `--yes`, `--no-input`, `--template <name>`, `--defaults`, etc.",
22
+ "- Never run a command that waits for user input — it will hang forever.",
23
+ "- If a task absolutely cannot be done non-interactively, say so explicitly instead of hanging."
24
+ ].join("\n");
25
+
26
+ const SERENA_INSTRUCTIONS = [
27
+ "## Serena MCP — symbol-level code navigation",
28
+ "You have access to Serena MCP tools for efficient code navigation.",
29
+ "Prefer these over reading entire files to save tokens:",
30
+ "- `find_symbol(name)` — locate a function, class, or variable definition",
31
+ "- `find_referencing_symbols(name)` — find all code that references a symbol",
32
+ "- `insert_after_symbol(name, code)` — insert code precisely after a symbol",
33
+ "Use Serena for understanding existing code structure before making changes.",
34
+ "Fall back to reading files only when Serena tools are not sufficient."
35
+ ].join("\n");
36
+
37
+ /**
38
+ * Render structured acceptance_tests (v2.7.5) as a Markdown section the
39
+ * coder reads as its contract. Legacy plain-string entries and
40
+ * structured { type, content, file? } objects are both accepted.
41
+ *
42
+ * The layout is intentional:
43
+ * - Gherkin blocks preserve their newlines so the coder sees the
44
+ * Given/When/Then scenarios as-is.
45
+ * - Shell blocks are fenced so the coder can copy-paste to verify.
46
+ * - The header says "MUST pass" because this is the gate the tester
47
+ * role runs (phase 3) and refuses to approve without.
48
+ *
49
+ * @param {Array} tests
50
+ * @returns {string}
51
+ */
52
+ function renderAcceptanceTestsSection(tests) {
53
+ if (!Array.isArray(tests) || tests.length === 0) return "";
54
+ const lines = [
55
+ "## Acceptance Tests — MUST pass before the HU can be approved",
56
+ "",
57
+ "These are the concrete contract for this task. The tester stage will execute them as the pass/fail gate — if any one fails, the HU is rejected. Write your implementation so each test passes.",
58
+ "",
59
+ ];
60
+ tests.forEach((entry, i) => {
61
+ // Normalise: accept legacy strings and structured objects.
62
+ let type = "shell";
63
+ let content;
64
+ let file = null;
65
+ if (typeof entry === "string") {
66
+ content = entry;
67
+ } else if (entry && typeof entry === "object") {
68
+ type = entry.type === "gherkin" ? "gherkin" : "shell";
69
+ content = typeof entry.content === "string" ? entry.content : JSON.stringify(entry);
70
+ file = typeof entry.file === "string" && entry.file.trim() ? entry.file.trim() : null;
71
+ } else {
72
+ content = String(entry ?? "");
73
+ }
74
+ const heading = file
75
+ ? `### Test ${i + 1} · \`${type}\` · target: \`${file}\``
76
+ : `### Test ${i + 1} · \`${type}\``;
77
+ lines.push(heading);
78
+ if (type === "gherkin") {
79
+ lines.push("```gherkin", content, "```", "");
80
+ } else {
81
+ lines.push("```bash", content, "```", "");
82
+ }
83
+ });
84
+ lines.push(
85
+ "If a test is ambiguous, implement what makes it pass AND add the clarifying assertion to the PR description — do NOT silently rewrite the test."
86
+ );
87
+ return lines.join("\n");
88
+ }
89
+
90
+ /**
91
+ * Render the active ADRs (PR F) as a "MUST respect" preamble. Each
92
+ * ADR is shown verbatim — they're already in Nygard format
93
+ * (Context · Decision · Consequences) and the coder benefits from
94
+ * the full text, not a summary. Keeps the prompt size sane: caps at
95
+ * 8 ADRs (the planner shouldn't realistically emit more for one
96
+ * plan, but bound it just in case).
97
+ */
98
+ function renderAdrSection(adrs) {
99
+ if (!Array.isArray(adrs) || adrs.length === 0) return "";
100
+ const capped = adrs.slice(0, 8);
101
+ const lines = [
102
+ "## Architecture Decision Records (active)",
103
+ "",
104
+ "These ADRs were committed by the architect role. Your implementation MUST respect them. If the SPEC asks for something incompatible with one of these, surface the conflict in your PR description rather than silently overriding the ADR.",
105
+ "",
106
+ ];
107
+ for (const adr of capped) {
108
+ lines.push(adr.markdown.trim(), "", "---", "");
109
+ }
110
+ if (adrs.length > capped.length) {
111
+ lines.push(`_(…${adrs.length - capped.length} more ADRs not shown — see ~/.kj/plans/<slug>/<planId>/adrs/.)_`, "");
112
+ }
113
+ return lines.join("\n");
114
+ }
115
+
116
+ /**
117
+ * SPEC-section pointer (PR F). One short line. Lets the coder put
118
+ * "implements §X.Y of SPEC.md" in the PR description for traceability.
119
+ */
120
+ function renderSpecSectionLine(specSection) {
121
+ if (!specSection) return "";
122
+ return [
123
+ "## SPEC reference",
124
+ "",
125
+ `This HU implements **§${specSection}** of the source SPEC. Cite this section in your PR description so the reviewer can trace coverage end-to-end.`,
126
+ ].join("\n");
127
+ }
128
+
129
+ /**
130
+ * Plan-reviewer findings relevant to this HU (PR F). The reviewer's
131
+ * output is plan-wide; we filter to entries that mention the
132
+ * current HU id so the coder gets only what's actionable for them.
133
+ */
134
+ function renderReviewerFindingsSection(findings, huId) {
135
+ if (!findings || !huId) return "";
136
+ const items = [];
137
+ for (const md of findings.missing_dependencies || []) {
138
+ if (md.from === huId) items.push(`- This HU should depend on **${md.on}** — ${md.rationale}`);
139
+ else if (md.on === huId) items.push(`- HU **${md.from}** should depend on this one — ${md.rationale}`);
140
+ }
141
+ for (const ov of findings.scope_overlaps || []) {
142
+ if (Array.isArray(ov.between) && ov.between.includes(huId)) {
143
+ const others = ov.between.filter((id) => id !== huId);
144
+ items.push(`- Scope overlap with **${others.join(", ")}** — ${ov.rationale}`);
145
+ }
146
+ }
147
+ for (const oi of findings.order_issues || []) {
148
+ if (Array.isArray(oi.hus) && oi.hus.includes(huId)) {
149
+ items.push(`- Order issue (${oi.issue}): ${oi.rationale}`);
150
+ }
151
+ }
152
+ if (items.length === 0) return "";
153
+ return [
154
+ "## Reviewer findings about this HU",
155
+ "",
156
+ "The plan reviewer flagged the following — consider them while implementing:",
157
+ "",
158
+ ...items,
159
+ ].join("\n");
160
+ }
161
+
162
+ // KJC sesgo-de-stack: Karajan used to default every prompt to JS/TS
163
+ // (vitest, npm install, console.log, JSDoc, httpOnly cookies). When
164
+ // the project is Python / Go / Rust / Ruby, that produced absurd
165
+ // outputs (e.g. installing vitest in a pure-python repo to satisfy a
166
+ // hardcoded `npx vitest run` acceptance test). When we know the
167
+ // stack we tell the coder explicitly so it stops assuming.
168
+ function buildStackSection({ stack, testFramework }) {
169
+ if (!stack && !testFramework) return null;
170
+ const lines = ["## Project Stack — match this, don't assume JavaScript"];
171
+ if (stack?.language) lines.push(`- Language: **${stack.language}**`);
172
+ if (stack?.frameworks?.length) lines.push(`- Frameworks: ${stack.frameworks.join(", ")}`);
173
+ if (testFramework?.hasTests && testFramework?.framework) {
174
+ lines.push(`- Test framework already in use: **${testFramework.framework}** (${testFramework.language || stack?.language || "unknown"}). Use it for new tests; do NOT add a JS test framework on top.`);
175
+ } else if (stack?.language && stack.language !== "javascript" && stack.language !== "typescript") {
176
+ lines.push(`- No test framework detected yet. Pick the canonical one for ${stack.language} (e.g. pytest for python, \`go test\` for go, \`cargo test\` for rust, rspec for ruby). Do NOT use vitest / jest / \`npm install\` in a non-JS project.`);
177
+ }
178
+ lines.push("");
179
+ lines.push("If an acceptance_test command on this HU points at a foreign framework (e.g. `npx vitest run` on a python project), REPLACE the command with the equivalent for the project's actual stack and use that to verify your work.");
180
+ return lines.join("\n");
181
+ }
182
+
183
+ /**
184
+ * Build the coder prompt as a { stable, volatile } layout (Φ1, KJC-PCS-0057).
185
+ *
186
+ * stable: identical across iterations of the same HU and across HUs of the
187
+ * same plan — rendered FIRST so prefix-caching providers hit on it, and
188
+ * available separately so ClaudeAgent can ship it via --append-system-prompt.
189
+ * volatile: per-HU/iteration content, rendered LAST preserving the relative
190
+ * order the legacy prompt used (ADRs → SPEC → findings → tests → … → feedback).
191
+ */
192
+ export async function buildCoderPromptLayout({ task, reviewerFeedback = null, sonarSummary = null, coderRules = null, methodology = "tdd", serenaEnabled = false, rtkAvailable = false, deferredContext = null, productContext = null, domainContext = null, plan = null, projectDir = null, language = "en", provider = null, acceptanceTests = null, adrs = null, specSection = null, reviewerFindings = null, huId = null, stack = null, testFramework = null }) {
193
+ const langInstruction = getLanguageInstruction(language);
194
+ // KJC-BUG-0032 (PR-I): hard rule about file paths. Real bug: a HU
195
+ // titled "Initialize project skeleton: create assistant/ directory…"
196
+ // had Claude run `cd /home/manu/assistant && pnpm init …` and 36 MB
197
+ // of code landed in $HOME instead of inside projectDir. Reinforce
198
+ // the constraint at the prompt level (soft fix) AND enforce it
199
+ // post-coder via fs-leak-detector.js (hard fix).
200
+ const projectDirRule = projectDir
201
+ ? [
202
+ "## CRITICAL — Project directory boundary",
203
+ `The project root is **${projectDir}**. EVERY file you create, write, edit, mkdir or cd to MUST stay inside this directory.`,
204
+ "",
205
+ "Forbidden, regardless of what the task says:",
206
+ "- Absolute paths outside the project root (e.g. `/home/USER/something`, `/tmp/x`, `/etc/y`).",
207
+ "- `cd` to any directory outside the project root inside Bash commands.",
208
+ "- Creating sibling top-level directories under `$HOME`.",
209
+ "",
210
+ "If the task or HU title mentions a directory like `assistant/` or `app/`, treat it as RELATIVE to the project root. NEVER as an absolute path under $HOME.",
211
+ "",
212
+ "Karajan runs a deterministic post-coder guard that detects writes outside the project root and ABORTS the HU. If you ignore this rule the run will fail and your work will be discarded."
213
+ ].join("\n")
214
+ : null;
215
+
216
+ const stackRule = buildStackSection({ stack, testFramework });
217
+ const rtkSnippet = buildRtkInstructions({ rtkAvailable });
218
+ let skillSection = null;
219
+ if (projectDir) {
220
+ const skills = await loadAvailableSkills(projectDir);
221
+ skillSection = buildSkillSection(skills, { provider });
222
+ }
223
+
224
+ // Volatile sections keep the legacy relative order — order matters:
225
+ // 1. ADRs first (they constrain HOW you implement),
226
+ // 2. SPEC reference (what section we're satisfying),
227
+ // 3. Reviewer findings about THIS HU (warnings the coder needs
228
+ // to consider while writing code),
229
+ // 4. Acceptance tests (the gate the implementation must pass).
230
+ const reviewerFeedbackSection = reviewerFeedback
231
+ ? [
232
+ `## Reviewer blocking feedback — YOU MUST FIX THESE BEFORE PROCEEDING`,
233
+ reviewerFeedback,
234
+ "",
235
+ "For each issue above:",
236
+ "1. Find the relevant file(s) in the project",
237
+ "2. Make the specific code change needed to resolve the issue",
238
+ "3. If tests are missing, write them",
239
+ "4. If dependencies are needed, install them with the project's package manager (npm install / pip install / go get / cargo add — pick the one that matches the stack above)",
240
+ "5. Do NOT skip any issue — all must be resolved"
241
+ ].join("\n\n")
242
+ : null;
243
+
244
+ return buildPromptLayout([
245
+ section(serenaEnabled ? SUBAGENT_PREAMBLE_SERENA : SUBAGENT_PREAMBLE, STABLE),
246
+ section(langInstruction, STABLE),
247
+ section("Implement directly in the repository.", STABLE),
248
+ section("Keep changes minimal and production-ready.", STABLE),
249
+ section("Follow SOLID principles. Write small, focused functions (< 30 lines).", STABLE),
250
+ section("Make atomic commits: 1 logical change = 1 commit. Keep PRs small and reviewable.", STABLE),
251
+ section("Security: validate all input, parameterize queries, never expose secrets. Use the auth pattern that matches the stack (e.g. httpOnly cookies for web sessions).", STABLE),
252
+ section("Use the project's standard logger and type system (no console.log when a structured logger exists; use the project's type idiom — TS types, JSDoc, Python type hints, Go interfaces…).", STABLE),
253
+ section(SUBPROCESS_CONSTRAINTS, STABLE),
254
+ section(stackRule, STABLE),
255
+ section(projectDirRule, STABLE),
256
+ section(serenaEnabled ? SERENA_INSTRUCTIONS : null, STABLE),
257
+ section(rtkSnippet, STABLE),
258
+ section(productContext ? `## Product Context\n${productContext}` : null, STABLE),
259
+ section(domainContext ? `## Domain Context\n${domainContext}` : null, STABLE),
260
+ section(coderRules ? `Coder rules (MUST follow):\n${coderRules}` : null, STABLE),
261
+ section(
262
+ methodology === "tdd"
263
+ ? [
264
+ "Default development policy: TDD.",
265
+ "1) Add or update failing tests first.",
266
+ "2) Implement minimal code to make tests pass.",
267
+ "3) Refactor safely while keeping tests green."
268
+ ].join("\n")
269
+ : null,
270
+ STABLE
271
+ ),
272
+ section(skillSection, STABLE),
273
+ section(`Task:\n${task}`, VOLATILE),
274
+ section(plan ? `## Implementation Plan (from planner)\nFollow these steps:\n${plan}` : null, VOLATILE),
275
+ section(renderAdrSection(adrs) || null, VOLATILE),
276
+ section(renderSpecSectionLine(specSection) || null, VOLATILE),
277
+ section(renderReviewerFindingsSection(reviewerFindings, huId) || null, VOLATILE),
278
+ section(renderAcceptanceTestsSection(acceptanceTests) || null, VOLATILE),
279
+ section(sonarSummary ? `Sonar summary:\n${sonarSummary}` : null, VOLATILE),
280
+ section(reviewerFeedbackSection, VOLATILE),
281
+ section(deferredContext, VOLATILE),
282
+ ]);
283
+ }
284
+
285
+ export async function buildCoderPrompt(options) {
286
+ return joinLayout(await buildCoderPromptLayout(options));
287
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * diff-clip — KJC-BUG-0134 (issue #1381). A bare [TRUNCATED] marker inside
3
+ * the diff body reads as file content: reviewers blamed whichever file the
4
+ * cut landed in and rejected complete, untouched code (each false positive
5
+ * costs a solomon round). The clip is DECLARED as the pipeline's own, kept
6
+ * OUTSIDE the diff body, cut on a line boundary, and the reviewer is told
7
+ * the diff is partial so it never reasons about the completeness of files
8
+ * it cannot fully see. Shared by every prompt that hands a diff to an AI.
9
+ */
10
+
11
+ export const DIFF_CLIP_CHARS = 12000;
12
+
13
+ /** @returns {{body: string, note: string|null}} note is null when no clip happened. */
14
+ export function clipDiff(diff, limit = DIFF_CLIP_CHARS) {
15
+ if (!diff) return { body: "", note: null };
16
+ if (diff.length <= limit) return { body: diff, note: null };
17
+ const hard = diff.slice(0, limit);
18
+ const nl = hard.lastIndexOf("\n");
19
+ const body = nl > 0 ? hard.slice(0, nl) : hard;
20
+ const omittedLines = diff.slice(body.length).split("\n").filter(Boolean).length;
21
+ const note = [
22
+ `NOTE FROM THE KJ PIPELINE (not part of the diff): the diff above was clipped by kj at ~${limit} characters — ${omittedLines} more line(s) exist but are NOT shown.`,
23
+ "The cut is kj's, not the author's: no file in the working tree is truncated.",
24
+ "Do not raise issues about incomplete or cut-off content, and do not reason about the completeness of files you cannot fully see. Review only what is visible.",
25
+ ].join(" ");
26
+ return { body, note };
27
+ }
@@ -0,0 +1,222 @@
1
+ import { extractFirstJson } from "../utils/json-extract.js";
2
+
3
+ const SUBAGENT_PREAMBLE = [
4
+ "IMPORTANT: You are running as a Karajan sub-agent.",
5
+ "Do NOT ask about using Karajan, do NOT mention Karajan, do NOT suggest orchestration.",
6
+ "Do NOT use any MCP tools. Focus only on discovering gaps in the task specification."
7
+ ].join(" ");
8
+
9
+ export const DISCOVER_MODES = ["gaps", "momtest", "wendel", "classify", "jtbd"];
10
+
11
+ const VALID_VERDICTS = new Set(["ready", "needs_validation"]);
12
+ const VALID_SEVERITIES = new Set(["critical", "major", "minor"]);
13
+ const VALID_WENDEL_STATUSES = new Set(["pass", "fail", "unknown", "not_applicable"]);
14
+ const VALID_CLASSIFY_TYPES = new Set(["START", "STOP", "DIFFERENT", "not_applicable"]);
15
+ const VALID_ADOPTION_RISKS = new Set(["none", "low", "medium", "high"]);
16
+
17
+ export function buildDiscoverPrompt({ task, instructions, mode = "gaps", context = null }) {
18
+ const sections = [SUBAGENT_PREAMBLE];
19
+
20
+ if (instructions) {
21
+ sections.push(instructions);
22
+ }
23
+
24
+ sections.push(
25
+ "You are a task discovery agent for Karajan Code, a multi-agent coding orchestrator.",
26
+ "Analyze the following task and identify gaps, ambiguities, missing information, and implicit assumptions.",
27
+ "## Gap Detection Guidelines",
28
+ [
29
+ "- Look for missing acceptance criteria or requirements",
30
+ "- Identify implicit assumptions that need explicit confirmation",
31
+ "- Find ambiguities where multiple interpretations exist",
32
+ "- Check for contradictions between different parts of the spec",
33
+ "- Consider edge cases and error scenarios not addressed",
34
+ "- Classify each gap by severity: critical (blocks implementation), major (could cause rework), minor (reasonable default exists)"
35
+ ].join("\n")
36
+ );
37
+
38
+ if (mode === "momtest") {
39
+ sections.push(
40
+ "## Mom Test Rules",
41
+ [
42
+ "For each gap, generate questions that follow The Mom Test principles:",
43
+ "- ALWAYS ask about past behavior and real experiences, never hypothetical scenarios",
44
+ "- NEVER ask 'Would you...?', 'Do you think...?', 'Would it be useful if...?'",
45
+ "- ALWAYS ask 'When was the last time...?', 'How do you currently...?', 'What happened when...?'",
46
+ "- Ask about specifics, not generalities",
47
+ "- Each question must have a targetRole (who to ask) and rationale (why this matters)",
48
+ "",
49
+ "Examples of BAD questions (hypothetical/opinion):",
50
+ " - 'Would you use this feature?' -> opinion, not data",
51
+ " - 'Do you think users need this?' -> speculation",
52
+ "",
53
+ "Examples of GOOD questions (past behavior):",
54
+ " - 'When was the last time you had to do X manually?' -> real experience",
55
+ " - 'How are you currently handling Y?' -> current behavior",
56
+ " - 'What happened the last time Z failed?' -> real consequence"
57
+ ].join("\n")
58
+ );
59
+ }
60
+
61
+ if (mode === "wendel") {
62
+ sections.push(
63
+ "## Wendel Behavior Change Checklist",
64
+ [
65
+ "Evaluate whether the task implies a user behavior change. If it does, assess these 5 conditions:",
66
+ "",
67
+ "1. **CUE** — Is there a clear trigger that will prompt the user to take the new action?",
68
+ "2. **REACTION** — Will the user have a positive emotional reaction when they encounter the cue?",
69
+ "3. **EVALUATION** — Can the user quickly understand the value of the new behavior?",
70
+ "4. **ABILITY** — Does the user have the skill and resources to perform the new behavior?",
71
+ "5. **TIMING** — Is this the right moment to introduce this change?",
72
+ "",
73
+ "For each condition, set status to: pass, fail, unknown, or not_applicable",
74
+ "If the task does NOT imply behavior change (e.g., internal refactor, backend optimization), set ALL conditions to 'not_applicable'",
75
+ "If ANY condition is 'fail', set verdict to 'needs_validation'"
76
+ ].join("\n")
77
+ );
78
+ }
79
+
80
+ if (mode === "classify") {
81
+ sections.push(
82
+ "## Behavior Change Classification",
83
+ [
84
+ "Classify the task by its impact on user behavior:",
85
+ "",
86
+ "- **START**: User must adopt a completely new behavior or workflow",
87
+ "- **STOP**: User must stop doing something they currently do (highest resistance risk)",
88
+ "- **DIFFERENT**: User must do something they already do, but differently",
89
+ "- **not_applicable**: Task has no user behavior impact (internal refactor, backend, infra)",
90
+ "",
91
+ "Assess adoption risk: none (no user impact), low, medium, high",
92
+ "STOP changes carry the highest risk of resistance — always flag them",
93
+ "Provide a frictionEstimate explaining the expected friction"
94
+ ].join("\n")
95
+ );
96
+ }
97
+
98
+ if (mode === "jtbd") {
99
+ sections.push(
100
+ "## Jobs-to-be-Done Framework",
101
+ [
102
+ "Generate reinforced Jobs-to-be-Done from the task and any provided context (interview notes, field observations).",
103
+ "Each JTBD must include 5 layers:",
104
+ "",
105
+ "- **functional**: The practical job the user is trying to accomplish",
106
+ "- **emotionalPersonal**: How the user wants to feel personally",
107
+ "- **emotionalSocial**: How the user wants to be perceived by others",
108
+ "- **behaviorChange**: Type of change: START, STOP, DIFFERENT, or not_applicable",
109
+ "- **evidence**: Direct quotes or specific references from the context. If no context provided, set to 'not_available' and suggest what context is needed",
110
+ "",
111
+ "CRITICAL: evidence must contain real quotes or references from the provided context, NEVER invented assumptions",
112
+ "If no context is provided, mark evidence as 'not_available'"
113
+ ].join("\n")
114
+ );
115
+ }
116
+
117
+ const baseSchema = '{"verdict":"ready|needs_validation","gaps":[{"id":string,"description":string,"severity":"critical|major|minor","suggestedQuestion":string}]';
118
+ const momtestSchema = mode === "momtest"
119
+ ? ',"momTestQuestions":[{"gapId":string,"question":string,"targetRole":string,"rationale":string}]'
120
+ : "";
121
+ const wendelSchema = mode === "wendel"
122
+ ? ',"wendelChecklist":[{"condition":"CUE|REACTION|EVALUATION|ABILITY|TIMING","status":"pass|fail|unknown|not_applicable","justification":string}]'
123
+ : "";
124
+ const classifySchema = mode === "classify"
125
+ ? ',"classification":{"type":"START|STOP|DIFFERENT|not_applicable","adoptionRisk":"none|low|medium|high","frictionEstimate":string}'
126
+ : "";
127
+ const jtbdSchema = mode === "jtbd"
128
+ ? ',"jtbds":[{"id":string,"functional":string,"emotionalPersonal":string,"emotionalSocial":string,"behaviorChange":"START|STOP|DIFFERENT|not_applicable","evidence":string}]'
129
+ : "";
130
+
131
+ sections.push(
132
+ "Return a single valid JSON object and nothing else.",
133
+ `JSON schema: ${baseSchema}${momtestSchema}${wendelSchema}${classifySchema}${jtbdSchema},"summary":string}`
134
+ );
135
+
136
+ if (context) {
137
+ sections.push(`## Context\n${context}`);
138
+ }
139
+
140
+ sections.push(`## Task\n${task}`);
141
+
142
+ return sections.join("\n\n");
143
+ }
144
+
145
+ function parseClassification(raw) {
146
+ if (!raw || typeof raw !== "object") return null;
147
+ const rawType = String(raw.type || "").toUpperCase();
148
+ let type;
149
+ if (rawType === "NOT_APPLICABLE") type = "not_applicable";
150
+ else if (VALID_CLASSIFY_TYPES.has(rawType)) type = rawType;
151
+ else type = "not_applicable";
152
+ const rawRisk = String(raw.adoptionRisk || "").toLowerCase();
153
+ return {
154
+ type,
155
+ adoptionRisk: VALID_ADOPTION_RISKS.has(rawRisk) ? rawRisk : "medium",
156
+ frictionEstimate: raw.frictionEstimate || ""
157
+ };
158
+ }
159
+
160
+ function parseGaps(rawGaps) {
161
+ return (Array.isArray(rawGaps) ? rawGaps : [])
162
+ .filter((g) => g?.id && g.description && g.suggestedQuestion)
163
+ .map((g) => ({
164
+ id: g.id,
165
+ description: g.description,
166
+ severity: VALID_SEVERITIES.has(String(g.severity).toLowerCase())
167
+ ? String(g.severity).toLowerCase()
168
+ : "major",
169
+ suggestedQuestion: g.suggestedQuestion
170
+ }));
171
+ }
172
+
173
+ function parseMomTestQuestions(rawQuestions) {
174
+ return (Array.isArray(rawQuestions) ? rawQuestions : [])
175
+ .filter((q) => q?.gapId && q.question && q.targetRole && q.rationale)
176
+ .map((q) => ({
177
+ gapId: q.gapId,
178
+ question: q.question,
179
+ targetRole: q.targetRole,
180
+ rationale: q.rationale
181
+ }));
182
+ }
183
+
184
+ function parseWendelChecklist(rawChecklist) {
185
+ return (Array.isArray(rawChecklist) ? rawChecklist : [])
186
+ .filter((c) => c?.condition && c.justification && c.status)
187
+ .map((c) => ({
188
+ condition: c.condition,
189
+ status: VALID_WENDEL_STATUSES.has(String(c.status).toLowerCase())
190
+ ? String(c.status).toLowerCase()
191
+ : "unknown",
192
+ justification: c.justification
193
+ }));
194
+ }
195
+
196
+ function parseJtbds(rawJtbds) {
197
+ return (Array.isArray(rawJtbds) ? rawJtbds : [])
198
+ .filter((j) => j?.id && j.functional && j.emotionalPersonal && j.emotionalSocial && j.behaviorChange && j.evidence)
199
+ .map((j) => ({
200
+ id: j.id,
201
+ functional: j.functional,
202
+ emotionalPersonal: j.emotionalPersonal,
203
+ emotionalSocial: j.emotionalSocial,
204
+ behaviorChange: j.behaviorChange,
205
+ evidence: j.evidence
206
+ }));
207
+ }
208
+
209
+ export function parseDiscoverOutput(raw) {
210
+ const parsed = extractFirstJson(raw);
211
+ if (!parsed) return null;
212
+
213
+ return {
214
+ verdict: VALID_VERDICTS.has(parsed.verdict) ? parsed.verdict : "ready",
215
+ gaps: parseGaps(parsed.gaps),
216
+ momTestQuestions: parseMomTestQuestions(parsed.momTestQuestions),
217
+ wendelChecklist: parseWendelChecklist(parsed.wendelChecklist),
218
+ classification: parseClassification(parsed.classification),
219
+ jtbds: parseJtbds(parsed.jtbds),
220
+ summary: parsed.summary || ""
221
+ };
222
+ }