@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,170 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Test Diet — baseline snapshot generator.
4
+ *
5
+ * Captures the *current* state of the unit test suite so subsequent diet
6
+ * commits (HU plan-20260429094214-0srv_002 .. _008) can prove they did not
7
+ * blow past the guardrails (wall-clock budget and branch-coverage drop).
8
+ *
9
+ * Output file: tests/_diet/baseline.json
10
+ *
11
+ * Schema:
12
+ * {
13
+ * capturedAt: ISO-8601 timestamp,
14
+ * locTotal: total wc -l across every tests/...test.js file,
15
+ * wallClockSec: number, // `time npm test` wall-clock
16
+ * branchCoveragePct: number, // src/ branch coverage % from vitest --coverage
17
+ * fileCount: number, // files.length
18
+ * files: [ { path, loc, architecture } ]
19
+ * }
20
+ *
21
+ * The script is intentionally *measurement-only*: it never edits source
22
+ * or test files. Re-running it overwrites the snapshot — but the diet
23
+ * compares against the committed copy, not the latest run.
24
+ */
25
+
26
+ import { execFileSync, spawnSync } from "node:child_process";
27
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
28
+ import { dirname, relative, resolve } from "node:path";
29
+ import { fileURLToPath } from "node:url";
30
+
31
+ const REPO_ROOT = resolve(fileURLToPath(import.meta.url), "..", "..");
32
+ const OUTPUT_PATH = resolve(REPO_ROOT, "tests/_diet/baseline.json");
33
+ const ARCH_PREFIX = "tests/architecture/";
34
+
35
+ /**
36
+ * Enumerate every committed `tests/**\/*.test.js` file via `git ls-files`.
37
+ * Using git rather than fs walk keeps the snapshot reproducible: untracked
38
+ * scratch files in someone's worktree never leak into the baseline.
39
+ *
40
+ * @returns {string[]} repo-relative paths
41
+ */
42
+ function listTestFiles() {
43
+ const out = execFileSync(
44
+ "git",
45
+ ["ls-files", "tests"],
46
+ { cwd: REPO_ROOT, encoding: "utf8" }
47
+ );
48
+ return out
49
+ .split("\n")
50
+ .map((line) => line.trim())
51
+ .filter((line) => line.endsWith(".test.js"));
52
+ }
53
+
54
+ /**
55
+ * Count lines in a file. Uses readFileSync because the files are small and
56
+ * spawning `wc -l` 300+ times is wasteful.
57
+ *
58
+ * @param {string} absPath
59
+ * @returns {number}
60
+ */
61
+ function countLines(absPath) {
62
+ const content = readFileSync(absPath, "utf8");
63
+ if (content.length === 0) return 0;
64
+ // wc -l counts newlines; mimic that so the JSON matches `wc -l` output.
65
+ let lines = 0;
66
+ for (let i = 0; i < content.length; i += 1) {
67
+ if (content.charCodeAt(i) === 10) lines += 1;
68
+ }
69
+ return lines;
70
+ }
71
+
72
+ /**
73
+ * Run `npm test` once and report wall-clock seconds. The suite has a
74
+ * pre-existing architecture-budget failure (tests/architecture/dynamic-imports);
75
+ * its exit code is irrelevant for the wall-clock baseline.
76
+ *
77
+ * @returns {number} seconds, rounded to 2 decimals
78
+ */
79
+ function measureWallClock() {
80
+ const started = process.hrtime.bigint();
81
+ spawnSync("npm", ["test", "--silent"], {
82
+ cwd: REPO_ROOT,
83
+ stdio: "ignore"
84
+ });
85
+ const elapsedNs = process.hrtime.bigint() - started;
86
+ return Math.round(Number(elapsedNs) / 1e7) / 100;
87
+ }
88
+
89
+ /**
90
+ * Run vitest with v8 coverage and parse the `text-summary` reporter output
91
+ * for the `Branches` percentage of the src/ tree.
92
+ *
93
+ * The architecture-budget test fails before the coverage summary is emitted,
94
+ * so we exclude that single file from this measurement run only. It scans
95
+ * source files statically and does not exercise src/ runtime code, so its
96
+ * absence does not move branch coverage in any meaningful way.
97
+ *
98
+ * @returns {number} branch coverage % (e.g. 17.23)
99
+ */
100
+ function measureBranchCoverage() {
101
+ const result = spawnSync(
102
+ "npx",
103
+ [
104
+ "vitest",
105
+ "run",
106
+ "--coverage",
107
+ "--coverage.provider=v8",
108
+ "--coverage.reporter=text-summary",
109
+ "--exclude=tests/architecture/dynamic-imports.test.js"
110
+ ],
111
+ { cwd: REPO_ROOT, encoding: "utf8" }
112
+ );
113
+ const out = `${result.stdout}\n${result.stderr}`;
114
+ const match = out.match(/Branches\s*:\s*([\d.]+)%/);
115
+ if (!match) {
116
+ throw new Error(
117
+ "Could not parse branch coverage from vitest output:\n" +
118
+ out.slice(-2000)
119
+ );
120
+ }
121
+ return Number(match[1]);
122
+ }
123
+
124
+ /**
125
+ * Build the files[] array with metadata for every test file.
126
+ *
127
+ * @param {string[]} relativePaths
128
+ * @returns {Array<{path: string, loc: number, architecture: boolean}>}
129
+ */
130
+ function buildFileEntries(relativePaths) {
131
+ return relativePaths
132
+ .map((rel) => ({
133
+ path: rel,
134
+ loc: countLines(resolve(REPO_ROOT, rel)),
135
+ architecture: rel.startsWith(ARCH_PREFIX)
136
+ }))
137
+ .sort((a, b) => a.path.localeCompare(b.path));
138
+ }
139
+
140
+ function main() {
141
+ const relPaths = listTestFiles();
142
+ const files = buildFileEntries(relPaths);
143
+ const locTotal = files.reduce((sum, f) => sum + f.loc, 0);
144
+
145
+ // Order matters: cheap measurements first, expensive ones last, so a
146
+ // wedge in the slow ones is easy to bisect via Ctrl-C.
147
+ const wallClockSec = measureWallClock();
148
+ const branchCoveragePct = measureBranchCoverage();
149
+
150
+ const baseline = {
151
+ capturedAt: new Date().toISOString(),
152
+ locTotal,
153
+ wallClockSec,
154
+ branchCoveragePct,
155
+ fileCount: files.length,
156
+ files
157
+ };
158
+
159
+ mkdirSync(dirname(OUTPUT_PATH), { recursive: true });
160
+ writeFileSync(OUTPUT_PATH, `${JSON.stringify(baseline, null, 2)}\n`, "utf8");
161
+
162
+ process.stdout.write(
163
+ `Wrote ${relative(REPO_ROOT, OUTPUT_PATH)} — ` +
164
+ `${baseline.fileCount} files, ${baseline.locTotal} LOC, ` +
165
+ `${baseline.wallClockSec}s wall-clock, ` +
166
+ `${baseline.branchCoveragePct}% branch coverage.\n`
167
+ );
168
+ }
169
+
170
+ main();
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * dual-publish (MIG-A, KJC-TSK-0751, épica KJC-PCS-0077, ADR 0004) — el
4
+ * MISMO contenido sale bajo dos nombres npm durante la migración al scope:
5
+ * karajan-code (legacy, publish normal) y @karajan-family/code (scoped).
6
+ *
7
+ * Uso:
8
+ * node scripts/dual-publish.mjs --pack-only # genera+verifica el tarball scoped
9
+ * node scripts/dual-publish.mjs --publish --otp=XXX # publica el scoped (tras publicar el legacy)
10
+ *
11
+ * El swap del name es EN SITIO con restauración en finally: un crash a mitad
12
+ * no deja el manifest renombrado. La verificación es el MISMO verify-pack
13
+ * (name-agnóstico desde la parte 1): empaqueta, instala aislado y corre kj.
14
+ * El PRIMER publish del scoped lo hace el usuario (cuenta karajan-family,
15
+ * security key); los siguientes van con la sesión normal.
16
+ */
17
+ import { readFileSync, writeFileSync } from "node:fs";
18
+ import { execFileSync } from "node:child_process";
19
+ import { join, dirname, resolve } from "node:path";
20
+ import { fileURLToPath } from "node:url";
21
+
22
+ export const LEGACY_NAME = "karajan-code";
23
+ export const SCOPED_NAME = "@karajan-family/code";
24
+
25
+ /**
26
+ * Ejecuta `fn` con el manifest renombrado al scoped (+ publishConfig public,
27
+ * obligatorio para scoped) y lo RESTAURA byte a byte pase lo que pase.
28
+ */
29
+ export async function withScopedName(repoRoot, fn) {
30
+ const pkgPath = join(repoRoot, "package.json");
31
+ const original = readFileSync(pkgPath, "utf8");
32
+ const pkg = JSON.parse(original);
33
+ if (pkg.name !== LEGACY_NAME) {
34
+ throw new Error(`dual-publish: el manifest dice "${pkg.name}" y solo se renombra desde ${LEGACY_NAME} — jamás a ciegas`);
35
+ }
36
+ // publishConfig se MERGEA, no se pisa (catch de codex): un registry/tag
37
+ // preexistente debe sobrevivir al publish scoped.
38
+ writeFileSync(pkgPath, `${JSON.stringify({ ...pkg, name: SCOPED_NAME, publishConfig: { ...pkg.publishConfig, access: "public" } }, null, 2)}\n`, "utf8");
39
+ try {
40
+ return await fn();
41
+ } finally {
42
+ writeFileSync(pkgPath, original, "utf8");
43
+ }
44
+ }
45
+
46
+ // argv[1] normalizado (catch de codex): node lo absolutiza hoy, pero el
47
+ // guard no debe depender de ese detalle de implementación.
48
+ const isMain = process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1]);
49
+ if (isMain) {
50
+ const repoRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
51
+ const args = process.argv.slice(2);
52
+ const publish = args.includes("--publish");
53
+ const otp = args.find((a) => a.startsWith("--otp="))?.slice(6);
54
+ await withScopedName(repoRoot, async () => {
55
+ console.log(`dual-publish: manifest → ${SCOPED_NAME} (temporal)`);
56
+ // La E2E real: empaqueta el scoped, instálalo aislado y corre kj.
57
+ execFileSync("node", [join(repoRoot, "scripts", "verify-pack.mjs")], { cwd: repoRoot, stdio: "inherit" });
58
+ if (publish) {
59
+ const pubArgs = ["publish", "--ignore-scripts", ...(otp ? [`--otp=${otp}`] : [])];
60
+ console.log(`dual-publish: npm ${pubArgs.join(" ").replace(/--otp=\S+/, "--otp=***")}`);
61
+ execFileSync("npm", pubArgs, { cwd: repoRoot, stdio: "inherit" });
62
+ } else {
63
+ console.log("dual-publish: --pack-only — verificado y SIN publicar (usa --publish en la release)");
64
+ }
65
+ });
66
+ console.log(`dual-publish: manifest restaurado a ${LEGACY_NAME} ✓`);
67
+ }
@@ -0,0 +1,273 @@
1
+ /**
2
+ * esbuild configuration for Node.js SEA (Single Executable Application) bundle.
3
+ *
4
+ * Bundles the entire CLI into a single CJS file suitable for SEA injection.
5
+ * A plugin handles:
6
+ * 1. import.meta.url / import.meta.dirname -> CJS equivalents
7
+ * 2. Top-level await in cli.js -> async IIFE wrapper
8
+ * 3. Runtime package.json reads -> inlined version string
9
+ */
10
+
11
+ import path from "node:path";
12
+ import fs from "node:fs/promises";
13
+ import { readFileSync, readdirSync } from "node:fs";
14
+ import { fileURLToPath } from "node:url";
15
+
16
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
17
+ const PKG_VERSION = JSON.parse(readFileSync(path.join(ROOT, "package.json"), "utf8")).version;
18
+
19
+ const seaTransformPlugin = {
20
+ name: "sea-transform",
21
+ setup(build) {
22
+ // Only process real files. Imports redirected by hu-board-stub (or any
23
+ // other namespaced plugin) MUST not pass through this transform —
24
+ // their `args.path` is a virtual id, not a path readFile can open.
25
+ build.onLoad({ filter: /\.m?js$/, namespace: "file" }, async (args) => {
26
+ let contents = await fs.readFile(args.path, "utf8");
27
+ let modified = false;
28
+
29
+ // Replace import.meta.dirname with __dirname
30
+ if (contents.includes("import.meta.dirname")) {
31
+ contents = contents.replaceAll("import.meta.dirname", "__dirname");
32
+ modified = true;
33
+ }
34
+
35
+ // Replace import.meta.url with CJS equivalent
36
+ if (contents.includes("import.meta.url")) {
37
+ contents = contents.replaceAll(
38
+ "import.meta.url",
39
+ 'require("node:url").pathToFileURL(__filename).href'
40
+ );
41
+ modified = true;
42
+ }
43
+
44
+ // Inline version: replace any pattern that reads ../../package.json or ../package.json
45
+ // to extract the version, with the hardcoded version string.
46
+ // Covers cli.js, display.js, doctor.js, bootstrap.js, init.js, server.js
47
+ if (contents.includes("package.json") && contents.match(/["']\.\.\/.*package\.json/)) {
48
+ // Pattern: const X = path.resolve(..., "../../package.json");
49
+ // const Y = JSON.parse(readFileSync(X, "utf8")).version;
50
+ // Replace both lines with: const Y = "1.57.0";
51
+ contents = contents.replace(
52
+ /const (\w+) = (?:path\.resolve|resolve)\(.*?["']\.\.\/.*?package\.json["']\);\s*\n\s*(?:const|return) (\w+) = JSON\.parse\(.*?readFileSync\(\1.*?\).*?\.version;/g,
53
+ `const $2 = ${JSON.stringify(PKG_VERSION)};`
54
+ );
55
+ // Single-line pattern: return JSON.parse(readFileSync(pkgPath...)).version
56
+ contents = contents.replace(
57
+ /const (\w+) = (?:path\.resolve|resolve)\(.*?["']\.\.\/.*?package\.json["']\);\s*\n\s*return JSON\.parse\(.*?readFileSync\(\1.*?\).*?\.version;/g,
58
+ `return ${JSON.stringify(PKG_VERSION)};`
59
+ );
60
+ // Pattern in cli.js: const PKG_PATH = ...; const PKG_VERSION = ...;
61
+ contents = contents.replace(
62
+ /const PKG_PATH = .*?package\.json.*?;\s*\nconst PKG_VERSION = .*?\.version;/,
63
+ `const PKG_VERSION = ${JSON.stringify(PKG_VERSION)};`
64
+ );
65
+ // Pattern in display.js: const DISPLAY_PKG_PATH = ...; const DISPLAY_VERSION = ...;
66
+ contents = contents.replace(
67
+ /const DISPLAY_PKG_PATH = .*?package\.json.*?;\s*\nconst DISPLAY_VERSION = .*?\.version;/,
68
+ `const DISPLAY_VERSION = ${JSON.stringify(PKG_VERSION)};`
69
+ );
70
+ // Pattern in server.js: const PKG_PATH = ...; (used later to read version)
71
+ contents = contents.replace(
72
+ /const PKG_PATH = .*?package\.json.*?;\s*\nconst PKG = JSON\.parse\(readFileSync\(PKG_PATH.*?\)\);/,
73
+ `const PKG = { version: ${JSON.stringify(PKG_VERSION)}, name: "karajan-code" };`
74
+ );
75
+ modified = true;
76
+ }
77
+
78
+ // Wrap top-level await in cli.js inside an async IIFE
79
+ if (args.path.endsWith("src/cli.js") || args.path.endsWith("src\\cli.js")) {
80
+ contents = contents.replace(
81
+ /^(try\s*\{[\s\S]*?await\s+program\.parseAsync\(\)[\s\S]*?^\})\s*$/m,
82
+ "(async () => {\n$1\n})();"
83
+ );
84
+ modified = true;
85
+ }
86
+
87
+ return modified ? { contents, loader: "js" } : undefined;
88
+ });
89
+ }
90
+ };
91
+
92
+ /**
93
+ * Stub plugin for the HU Board package (KJC-BUG-0040).
94
+ *
95
+ * The HU Board lives in `packages/hu-board/` and requires `better-sqlite3`
96
+ * — a native node-gyp module that esbuild cannot resolve at bundle time
97
+ * (it has no JS entry point, only `.node` binaries compiled per platform).
98
+ *
99
+ * The SEA binary is the lean CLI distribution. Users who want the HU
100
+ * Board install via `npm install -g karajan-code`, which installs
101
+ * better-sqlite3 normally. So the right answer is: do NOT include
102
+ * `packages/hu-board/` in the SEA bundle at all.
103
+ *
104
+ * This plugin intercepts every import / dynamic import that points into
105
+ * `packages/hu-board/src/*` and rewrites it to a stub module that throws
106
+ * a clear, actionable error when invoked at runtime — instead of failing
107
+ * silently during bundling.
108
+ */
109
+ const huBoardStubPlugin = {
110
+ name: "hu-board-stub",
111
+ setup(build) {
112
+ build.onResolve({ filter: /packages[\\/]hu-board[\\/]src[\\/].*/ }, (args) => ({
113
+ path: args.path,
114
+ namespace: "hu-board-stub",
115
+ }));
116
+ build.onLoad({ filter: /.*/, namespace: "hu-board-stub" }, () => ({
117
+ contents: `
118
+ const NOT_AVAILABLE = "The HU Board is not available in this standalone binary.\\n" +
119
+ "Install karajan-code from npm to get the dashboard:\\n" +
120
+ " npm install -g karajan-code\\n";
121
+ function notAvailable() { throw new Error(NOT_AVAILABLE); }
122
+ // Explicit named exports for every symbol the CLI imports from
123
+ // hu-board. Adding them by name (rather than relying on a Proxy)
124
+ // avoids esbuild's CJS↔ESM interop confusion: a Proxy that
125
+ // returns truthy for "__esModule" makes esbuild wrap the import
126
+ // and the destructured names resolve to undefined.
127
+ module.exports = {
128
+ __esModule: false,
129
+ initDb: notAvailable,
130
+ closeDb: notAvailable,
131
+ cleanupZombies: notAvailable,
132
+ // Catch-all default so \`import foo from\` and \`import * as foo\`
133
+ // also throw the same message instead of returning undefined.
134
+ default: notAvailable,
135
+ };
136
+ `,
137
+ loader: "js",
138
+ }));
139
+ },
140
+ };
141
+
142
+ // Same reasoning as the HU Board stub: src/rag/* + src/commands/rag.js
143
+ // depend on better-sqlite3 + sqlite-vec, native modules that esbuild
144
+ // cannot bundle. The SEA binary stubs them out and tells the user to
145
+ // install via npm to get RAG. KJC-PCS-0049 / Step 6.
146
+ const ragStubPlugin = {
147
+ name: "rag-stub",
148
+ setup(build) {
149
+ // KJC-TSK-0704 — src/privacy/* rides this stub too: its engine is redactPII.
150
+ build.onResolve({ filter: /[\\/](rag[\\/].+|privacy[\\/].+|commands[\\/](rag|watch|privacy))\.js$/ }, (args) => ({
151
+ path: args.path, namespace: "rag-stub",
152
+ }));
153
+ build.onLoad({ filter: /.*/, namespace: "rag-stub" }, () => ({
154
+ contents: `
155
+ const NOT_AVAILABLE = "The RAG subsystem is not available in this standalone binary.\\n" +
156
+ "Install karajan-code from npm to get \\\`kj rag\\\`:\\n" +
157
+ " npm install -g karajan-code\\n";
158
+ function notAvailable() { throw new Error(NOT_AVAILABLE); }
159
+ module.exports = {
160
+ __esModule: false,
161
+ ragIndexCommand: notAvailable, ragQueryCommand: notAvailable,
162
+ openVecStore: notAvailable, OllamaEmbedder: notAvailable,
163
+ indexFile: notAvailable, indexProject: notAvailable,
164
+ query: notAvailable, chunkMarkdown: notAvailable, chunkPlan: notAvailable, chunkSource: notAvailable,
165
+ // KJC-TSK-0435 — Ollama Docker manager.
166
+ ollamaUp: notAvailable, ollamaDown: notAvailable, ensureComposeFile: notAvailable,
167
+ isOllamaReachable: notAvailable, findAvailableOllamaPort: notAvailable,
168
+ waitForOllamaReady: notAvailable, buildComposeTemplate: notAvailable, normalizeOllamaConfig: notAvailable,
169
+ // KJC-TSK-0436 — Ollama capability check + model pull.
170
+ checkDockerAvailable: notAvailable, checkRamCapacity: notAvailable,
171
+ checkOllamaCapability: notAvailable, pullOllamaModel: notAvailable,
172
+ // KJC-TSK-0438 — RAG project isolation.
173
+ projectSlug: notAvailable,
174
+ // KJC-TSK-0441 — RAG chokidar watcher.
175
+ startWatcher: notAvailable, readPidFile: notAvailable, clearPidFile: notAvailable,
176
+ isPidAlive: notAvailable, writePidFile: notAvailable,
177
+ // KJC-TSK-0442 / KJC-TSK-0446 — RAG embedders cloud + factory.
178
+ makeEmbedder: notAvailable, OpenAIEmbedder: notAvailable, VoyageEmbedder: notAvailable,
179
+ OpenAIEmbedderError: notAvailable, VoyageEmbedderError: notAvailable, PROVIDERS: notAvailable,
180
+ CohereEmbedder: notAvailable, CohereEmbedderError: notAvailable,
181
+ MistralEmbedder: notAvailable, MistralEmbedderError: notAvailable,
182
+ ONNXEmbedder: notAvailable, ONNXEmbedderError: notAvailable,
183
+ // KJC-TSK-0448 — RAG --where metadata filter.
184
+ parseWhere: notAvailable, buildWhereSql: notAvailable,
185
+ // KJC-TSK-0449 — RAG cross-encoder rerank.
186
+ rerank: notAvailable, RerankError: notAvailable, _resetPipeline: notAvailable,
187
+ // KJC-BUG-0097 — src/rag/auto-update.js lives under src/rag/ so it is
188
+ // caught by this stub, but its exports are called on the hot path.
189
+ // maybeAutoUpdate() runs on EVERY \`kj run\` (run.js): it must be a
190
+ // silent no-op here (RAG index is unavailable in SEA anyway), NOT an
191
+ // absent symbol — otherwise the whole command crashes with
192
+ // "maybeAutoUpdate is not a function". installPostMergeHook() is only
193
+ // reached from \`kj rag install-hooks\`, so it degrades like the rest.
194
+ maybeAutoUpdate: async () => ({ skipped: true }),
195
+ installPostMergeHook: notAvailable,
196
+ // KJC-TSK-0704 — privacy scan (engine = karajan-rag redactPII).
197
+ privacyScanCommand: notAvailable, loadPrivacyList: notAvailable,
198
+ scanText: notAvailable, scanPaths: notAvailable, privacyConfigPath: notAvailable,
199
+ ensurePrivacyList: async () => ({ created: false, reason: "sea-stub" }),
200
+ // KJC-BUG-0100 — the doctor rag-hooks check imports this; it throws
201
+ // here and the check swallows it (degrades to a benign info result).
202
+ resolveHooksDir: notAvailable,
203
+ default: notAvailable,
204
+ };
205
+ `,
206
+ loader: "js",
207
+ }));
208
+ },
209
+ };
210
+
211
+ // KJC-TSK-0472 — audit-history sqlite stub (same reasoning as rag/hu-board stubs).
212
+ const auditHistoryStubPlugin = {
213
+ name: "audit-history-stub",
214
+ setup(b) {
215
+ b.onResolve({ filter: /[\\/]audit[\\/]audit-history\.js$/ }, (a) => ({ path: a.path, namespace: "ahs" }));
216
+ b.onLoad({ filter: /.*/, namespace: "ahs" }, () => ({ contents: "module.exports = { __esModule: false, persistAuditRun: () => ({ ok: false, error: 'history disabled in SEA' }), getAuditHistoryDbPath: () => null, openAuditHistoryDb: () => null, recordAuditRun: () => null, listRecentRuns: () => [], countRuns: () => 0, pruneOldRuns: () => 0, getLatestPreviousRun: () => null, getRecentScores: () => [] };", loader: "js" }));
217
+ },
218
+ };
219
+
220
+ /** @type {import('esbuild').BuildOptions} */
221
+ /**
222
+ * List every built-in template file, as paths relative to templates/
223
+ * (KJC-BUG-0104). The SEA binary ships them as SEA assets — build-sea.mjs
224
+ * turns this list into the sea-config `assets` map plus an index the
225
+ * runtime (src/utils/templates-root.js) uses to extract them on first use.
226
+ * Exported (instead of living in build-sea.mjs, which runs main() on
227
+ * import) so tests can exercise it.
228
+ */
229
+ export function collectTemplateFiles(rootDir = path.join(ROOT, "templates")) {
230
+ const files = [];
231
+ const walk = (dir) => {
232
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
233
+ const p = path.join(dir, entry.name);
234
+ if (entry.isDirectory()) walk(p);
235
+ else files.push(path.relative(rootDir, p));
236
+ }
237
+ };
238
+ walk(rootDir);
239
+ return files.sort();
240
+ }
241
+
242
+ export const seaBuildOptions = {
243
+ entryPoints: ["src/cli.js"],
244
+ outfile: "dist/kj-bundle.cjs",
245
+ format: "cjs",
246
+ platform: "node",
247
+ target: "node20",
248
+ bundle: true,
249
+ minify: false,
250
+ // better-sqlite3 is a native module imported by packages/hu-board/src/db.js.
251
+ // The hu-board-stub plugin below replaces the whole hu-board package so
252
+ // this `external` entry is belt-and-braces — if any other dependency
253
+ // pulls better-sqlite3 in we want a clear "not bundled" error, not a
254
+ // silent half-bundle.
255
+ //
256
+ // madge (KJC-TSK v2.17): pulled in by src/audit/circular-deps.js via a
257
+ // dynamic import. Madge transitively depends on @vue/compiler-sfc which
258
+ // optionally requires ~20 template engines (velocityjs, dustjs-linkedin,
259
+ // twig, …) that are not installed — esbuild fails the bundle if it
260
+ // tries to walk those. Marking madge external keeps `kj audit` working
261
+ // in npm-installed Karajan (madge is in node_modules) and degrades
262
+ // gracefully in the SEA binary (the dynamic import fails → audit
263
+ // continues without circular-dep findings).
264
+ // knip (KJC-TSK v2.17): invoked as a subprocess by src/audit/dead-exports.js
265
+ // via `process.execPath knip-bin --reporter json`. Its native parser
266
+ // (oxc-parser, oxc-resolver) and CLI machinery must not be bundled. In SEA
267
+ // builds the createRequire(import.meta.url).resolve("knip/bin/knip.js")
268
+ // throws → collector returns available:false. npm installs get knip
269
+ // resolved normally from node_modules.
270
+ external: ["better-sqlite3", "madge", "knip", "oxc-parser", "oxc-resolver"],
271
+ plugins: [seaTransformPlugin, huBoardStubPlugin, ragStubPlugin, auditHistoryStubPlugin],
272
+ logLevel: "info",
273
+ };
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bash
2
+ # KJC-TSK-0455 — Auto-refresh the local RAG index after a merge so retrieval
3
+ # never serves stale code. Installed by `kj rag install-hooks`. The marker
4
+ # in this comment is how the installer tells kj-managed hooks from user hooks.
5
+ set -euo pipefail
6
+ if command -v kj >/dev/null 2>&1; then
7
+ kj rag index --since auto >/dev/null 2>&1 || true
8
+ fi
9
+
10
+ # KJC-TSK-0507 — Refresh the per-project QMD semantic wiki when the merge
11
+ # touched indexable folders (docs/, .reviews/, .karajan/plans/). Background
12
+ # so it never blocks the user's `git pull` / `git merge`.
13
+ if command -v qmd >/dev/null 2>&1; then
14
+ if git diff-tree -r --name-only ORIG_HEAD HEAD 2>/dev/null \
15
+ | grep -qE '^(docs/|\.reviews/|\.karajan/plans/)'; then
16
+ (qmd update >/dev/null 2>&1 || true) &
17
+ fi
18
+ fi