@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,112 @@
1
+ // Chrome DevTools MCP detection and WebPerf skill auto-installation.
2
+
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import os from "node:os";
6
+ import { isOpenSkillsAvailable, listSkills } from "../skills/openskills-client.js";
7
+
8
+ /** Skill names relevant for WebPerf analysis. Already installed globally via openskills. */
9
+ export const WEBPERF_SKILLS = [
10
+ "optimize",
11
+ "audit",
12
+ "polish"
13
+ ];
14
+
15
+ /**
16
+ * Check whether Chrome DevTools MCP is configured and available.
17
+ * Checks: (1) config flag, (2) Claude MCP config (~/.claude.json), (3) VS Code MCP settings.
18
+ * @param {object} config - merged Karajan config
19
+ * @returns {boolean}
20
+ */
21
+ export function isDevToolsMcpAvailable(config) {
22
+ // Explicit config flag takes priority
23
+ if (config?.webperf?.devtools_mcp === true) return true;
24
+ if (config?.webperf?.devtools_mcp === false) return false;
25
+
26
+ // Check cached detection result
27
+ if (_devToolsDetected !== null) return _devToolsDetected;
28
+
29
+ // Not yet detected - return false (async detection runs at init)
30
+ return false;
31
+ }
32
+
33
+ let _devToolsDetected = null;
34
+
35
+ /**
36
+ * Auto-detect Chrome DevTools MCP from system configuration.
37
+ * Checks ~/.claude.json and VS Code MCP settings.
38
+ * Call once at pipeline init.
39
+ */
40
+ export async function detectDevToolsMcp(logger) {
41
+ // Check Claude MCP config
42
+ const claudeConfigPath = path.join(os.homedir(), ".claude.json");
43
+ try {
44
+ const raw = await fs.readFile(claudeConfigPath, "utf8");
45
+ const parsed = JSON.parse(raw);
46
+ const mcpServers = parsed?.mcpServers || parsed?.mcp_servers || {};
47
+ if (mcpServers["chrome-devtools"] || mcpServers["chrome_devtools"]) {
48
+ _devToolsDetected = true;
49
+ logger?.info?.("Chrome DevTools MCP detected in ~/.claude.json");
50
+ return true;
51
+ }
52
+ } catch { /* file not found or parse error */ }
53
+
54
+ // Check VS Code MCP settings
55
+ const vscodePaths = [
56
+ path.join(os.homedir(), ".vscode", "settings.json"),
57
+ path.join(process.cwd(), ".vscode", "settings.json")
58
+ ];
59
+ for (const vscPath of vscodePaths) {
60
+ try {
61
+ const raw = await fs.readFile(vscPath, "utf8");
62
+ if (raw.includes("chrome-devtools") || raw.includes("chrome_devtools")) {
63
+ _devToolsDetected = true;
64
+ logger?.info?.(`Chrome DevTools MCP detected in ${vscPath}`);
65
+ return true;
66
+ }
67
+ } catch { /* not found */ }
68
+ }
69
+
70
+ _devToolsDetected = false;
71
+ return false;
72
+ }
73
+
74
+ /**
75
+ * Ensure WebPerf skills are installed via OpenSkills.
76
+ * Installs any missing skills from WEBPERF_SKILLS.
77
+ * @param {string} projectDir - absolute path to the project root
78
+ * @param {object} [logger] - optional logger ({ info, warn })
79
+ * @returns {Promise<{ installed: string[], alreadyInstalled: string[], skipped: string[] }>}
80
+ */
81
+ export async function ensureWebPerfSkills(projectDir, logger) {
82
+ const result = { installed: [], alreadyInstalled: [], skipped: [] };
83
+
84
+ const available = await isOpenSkillsAvailable();
85
+ if (!available) {
86
+ logger?.debug?.("OpenSkills CLI not available - WebPerf skills unavailable");
87
+ result.skipped = [...WEBPERF_SKILLS];
88
+ return result;
89
+ }
90
+
91
+ // List skills (includes global installs)
92
+ const listResult = await listSkills({ projectDir });
93
+ const installedNames = new Set(
94
+ (listResult.ok ? listResult.skills : []).map(s => s.name)
95
+ );
96
+
97
+ for (const skill of WEBPERF_SKILLS) {
98
+ if (installedNames.has(skill)) {
99
+ result.alreadyInstalled.push(skill);
100
+ } else {
101
+ // Skills should be installed globally via `openskills install owner/repo`
102
+ // Don't attempt auto-install with bare names — just note they're missing
103
+ result.skipped.push(skill);
104
+ }
105
+ }
106
+
107
+ if (result.alreadyInstalled.length > 0) {
108
+ logger?.info?.(`WebPerf skills available: ${result.alreadyInstalled.join(", ")}`);
109
+ }
110
+
111
+ return result;
112
+ }
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Web performance scanner — KJC-TSK-0149.
3
+ *
4
+ * Wraps Google's Lighthouse CLI (`lighthouse`) to produce a structured
5
+ * Core Web Vitals + opportunity report against a local URL. Same
6
+ * pattern as sonar-findings.js, osv-findings.js, semgrep-findings.js:
7
+ * best-effort, missing binary returns {ok:false, reason}, all heavy
8
+ * lifting happens in an external tool the user installs themselves.
9
+ *
10
+ * Output shape is designed to feed two downstream consumers:
11
+ * 1. The CLI `kj webperf <url>` (KJC-TSK-0149) — print JSON or human
12
+ * report, optionally persist to config.webperf.lastResult.
13
+ * 2. `kj audit` WebPerf section (KJC-TSK-0360) — the `cwv-result` mode
14
+ * reads exactly this shape from `config.webperf.lastResult`.
15
+ *
16
+ * Lighthouse JSON schema reference:
17
+ * https://github.com/GoogleChrome/lighthouse/blob/main/types/lhr/lhr.d.ts
18
+ */
19
+
20
+ import { execFile } from "node:child_process";
21
+ import { promisify } from "node:util";
22
+ import { evaluateCwv, CWV_THRESHOLDS } from "./cwv-gate.js";
23
+
24
+ const execFileAsync = promisify(execFile);
25
+
26
+ const SCAN_TIMEOUT_MS = 120_000;
27
+ const MAX_OPPORTUNITIES = 20;
28
+
29
+ /**
30
+ * Opportunity audits we extract from Lighthouse output. Each maps to a
31
+ * known render-perf issue with actionable fixes; we keep the list short
32
+ * to bound the payload size and keep the LLM prompt tight when this
33
+ * result feeds `kj audit`.
34
+ */
35
+ const OPPORTUNITY_AUDITS = [
36
+ "render-blocking-resources",
37
+ "unused-css-rules",
38
+ "unused-javascript",
39
+ "unminified-css",
40
+ "unminified-javascript",
41
+ "modern-image-formats",
42
+ "uses-optimized-images",
43
+ "uses-text-compression",
44
+ "uses-responsive-images",
45
+ "uses-rel-preconnect",
46
+ "uses-rel-preload",
47
+ "font-display",
48
+ "preload-lcp-image",
49
+ "lcp-lazy-loaded",
50
+ "non-composited-animations",
51
+ "third-party-summary",
52
+ "bootup-time",
53
+ "mainthread-work-breakdown",
54
+ ];
55
+
56
+ /**
57
+ * Run Lighthouse against a URL and return a structured result.
58
+ *
59
+ * @param {string} url - target URL (must be reachable from the runner)
60
+ * @param {object} [opts]
61
+ * @param {object} [opts.thresholds] - CWV thresholds override (passed to evaluateCwv)
62
+ * @param {object} [opts.logger]
63
+ * @param {string} [opts.preset] - "desktop" or "mobile" (default: desktop)
64
+ * @param {number} [opts.timeoutMs] - override the 120s default
65
+ * @returns {Promise<object>} scanner result (see module JSDoc)
66
+ */
67
+ export async function runWebperfScan(url, opts = {}) {
68
+ if (!url || typeof url !== "string") {
69
+ return { ok: false, reason: "no URL provided" };
70
+ }
71
+
72
+ const logger = opts.logger || null;
73
+ const preset = opts.preset === "mobile" ? "mobile" : "desktop";
74
+ const timeoutMs = opts.timeoutMs || SCAN_TIMEOUT_MS;
75
+
76
+ const lighthouseArgs = [
77
+ url,
78
+ "--output=json",
79
+ "--quiet",
80
+ "--chrome-flags=--headless --no-sandbox --disable-gpu",
81
+ `--preset=${preset}`,
82
+ "--only-categories=performance",
83
+ ];
84
+
85
+ let stdout;
86
+ try {
87
+ const result = await execFileAsync("lighthouse", lighthouseArgs, {
88
+ timeout: timeoutMs,
89
+ maxBuffer: 64 * 1024 * 1024,
90
+ });
91
+ stdout = result.stdout;
92
+ } catch (err) {
93
+ if (err.code === "ENOENT") {
94
+ if (logger?.warn) logger.warn("lighthouse not found in PATH — install via 'npm install -g lighthouse'");
95
+ return { ok: false, reason: "lighthouse not installed", url };
96
+ }
97
+ if (err.killed) {
98
+ return { ok: false, reason: `lighthouse timed out after ${timeoutMs}ms`, url };
99
+ }
100
+ if (typeof err.stdout === "string" && err.stdout.trim().startsWith("{")) {
101
+ stdout = err.stdout;
102
+ } else {
103
+ const stderr = (err.stderr || "").trim().split("\n").pop() || err.message;
104
+ // Lighthouse prints clear NO_DCHECK / NO_NAVSTART errors when the URL
105
+ // is unreachable. Surface that verbatim.
106
+ const reason = /failed to fetch|connection refused|net::|navigation_start_time/i.test(stderr)
107
+ ? `URL ${url} not reachable: ${stderr}`
108
+ : `lighthouse failed: ${stderr}`;
109
+ if (logger?.warn) logger.warn(reason);
110
+ return { ok: false, reason, url };
111
+ }
112
+ }
113
+
114
+ let report;
115
+ try {
116
+ report = JSON.parse(stdout);
117
+ } catch (err) {
118
+ return { ok: false, reason: `lighthouse output not parseable: ${err.message}`, url };
119
+ }
120
+
121
+ return parseLighthouseReport(report, { url, preset, thresholds: opts.thresholds });
122
+ }
123
+
124
+ /**
125
+ * Convert a raw Lighthouse JSON report into the scanner's flat output.
126
+ * Public so tests can drive parsing without spawning lighthouse.
127
+ *
128
+ * @param {object} report - parsed Lighthouse output (lhr)
129
+ * @param {{url: string, preset?: string, thresholds?: object}} ctx
130
+ */
131
+ export function parseLighthouseReport(report, ctx = {}) {
132
+ const audits = report?.audits || {};
133
+ const metrics = extractMetrics(audits);
134
+ const issues = extractIssues(audits);
135
+ const cwv = evaluateCwv(metrics, ctx.thresholds || CWV_THRESHOLDS);
136
+
137
+ return {
138
+ ok: true,
139
+ url: ctx.url || report?.finalDisplayedUrl || report?.requestedUrl || null,
140
+ preset: ctx.preset || "desktop",
141
+ capturedAt: report?.fetchTime || new Date().toISOString(),
142
+ lighthouseVersion: report?.lighthouseVersion || null,
143
+ performanceScore: typeof report?.categories?.performance?.score === "number"
144
+ ? Math.round(report.categories.performance.score * 100)
145
+ : null,
146
+ metrics,
147
+ cwv,
148
+ issues,
149
+ thresholds: ctx.thresholds || CWV_THRESHOLDS,
150
+ };
151
+ }
152
+
153
+ /**
154
+ * Pull Core Web Vitals + supporting metrics out of the Lighthouse audit
155
+ * collection. `numericValue` is the raw measurement Google reports (ms
156
+ * for time-based metrics, score 0-1 for CLS).
157
+ */
158
+ function extractMetrics(audits) {
159
+ const get = (id) => {
160
+ const v = audits[id]?.numericValue;
161
+ return typeof v === "number" ? v : null;
162
+ };
163
+ return {
164
+ // CWV — these three drive the cwv-gate verdict
165
+ lcp: get("largest-contentful-paint"),
166
+ cls: get("cumulative-layout-shift"),
167
+ inp: get("interaction-to-next-paint") ?? get("max-potential-fid"),
168
+ // Supporting (informational)
169
+ fcp: get("first-contentful-paint"),
170
+ tbt: get("total-blocking-time"),
171
+ si: get("speed-index"),
172
+ tti: get("interactive"),
173
+ };
174
+ }
175
+
176
+ /**
177
+ * Distil the Lighthouse opportunity audits into a flat `issues` array.
178
+ * Each issue carries the audit id, score, savings (when applicable) and
179
+ * a one-line description so consumers can prioritise without parsing
180
+ * the full lhr.
181
+ */
182
+ function extractIssues(audits) {
183
+ const issues = [];
184
+ for (const id of OPPORTUNITY_AUDITS) {
185
+ const audit = audits[id];
186
+ if (!audit) continue;
187
+ // score === 1 means "passed" — skip clean audits
188
+ if (typeof audit.score === "number" && audit.score >= 1) continue;
189
+ if (audit.scoreDisplayMode === "notApplicable") continue;
190
+ issues.push({
191
+ id,
192
+ title: audit.title || id,
193
+ score: typeof audit.score === "number" ? audit.score : null,
194
+ savingsMs: audit.details?.overallSavingsMs ?? null,
195
+ savingsBytes: audit.details?.overallSavingsBytes ?? null,
196
+ severity: scoreToSeverity(audit.score),
197
+ });
198
+ }
199
+ return issues
200
+ .sort((a, b) => (b.savingsMs || 0) - (a.savingsMs || 0))
201
+ .slice(0, MAX_OPPORTUNITIES);
202
+ }
203
+
204
+ function scoreToSeverity(score) {
205
+ if (typeof score !== "number") return "info";
206
+ if (score < 0.5) return "high";
207
+ if (score < 0.9) return "medium";
208
+ return "low";
209
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Integration helpers that format CWV gate results for the
3
+ * impeccable prompt and for pipeline progress events.
4
+ */
5
+
6
+ const RATING_ICONS = { good: "PASS", "needs-improvement": "WARN", poor: "FAIL" };
7
+
8
+ /**
9
+ * Build a human-readable section for the impeccable prompt.
10
+ *
11
+ * @param {{ pass: boolean, scores: object, blocking: Array, advisory: Array }} cwvResult
12
+ * @returns {string}
13
+ */
14
+ export function buildWebPerfSection(cwvResult) {
15
+ const lines = [];
16
+ const verdict = cwvResult.pass ? "PASSED" : "FAILED";
17
+ lines.push(`## WebPerf — Core Web Vitals (${verdict})`);
18
+ lines.push("");
19
+
20
+ for (const [metric, { value, rating }] of Object.entries(cwvResult.scores)) {
21
+ const icon = RATING_ICONS[rating] || rating;
22
+ const unit = metric === "cls" ? "" : "ms";
23
+ lines.push(`- **${metric.toUpperCase()}**: ${value}${unit} [${icon}]`);
24
+ }
25
+
26
+ if (cwvResult.blocking.length > 0) {
27
+ lines.push("");
28
+ lines.push("### Blocking issues");
29
+ for (const b of cwvResult.blocking) {
30
+ const unit = b.metric === "cls" ? "" : "ms";
31
+ lines.push(`- ${b.metric.toUpperCase()}: ${b.value}${unit} exceeds poor threshold (${b.threshold}${unit})`);
32
+ }
33
+ }
34
+
35
+ if (cwvResult.advisory.length > 0) {
36
+ lines.push("");
37
+ lines.push("### Advisory (needs improvement)");
38
+ for (const a of cwvResult.advisory) {
39
+ const unit = a.metric === "cls" ? "" : "ms";
40
+ lines.push(`- ${a.metric.toUpperCase()}: ${a.value}${unit} exceeds good threshold (${a.threshold}${unit})`);
41
+ }
42
+ }
43
+
44
+ return lines.join("\n");
45
+ }
46
+
47
+ /**
48
+ * Format CWV result for a pipeline progress event payload.
49
+ *
50
+ * @param {{ pass: boolean, scores: object, blocking: Array, advisory: Array }} cwvResult
51
+ * @returns {{ type: string, pass: boolean, metrics: object, blockingCount: number, advisoryCount: number }}
52
+ */
53
+ export function formatCwvForEvent(cwvResult) {
54
+ const metrics = {};
55
+ for (const [metric, { value, rating }] of Object.entries(cwvResult.scores)) {
56
+ metrics[metric] = { value, rating };
57
+ }
58
+
59
+ return {
60
+ type: "webperf-cwv",
61
+ pass: cwvResult.pass,
62
+ metrics,
63
+ blockingCount: cwvResult.blocking.length,
64
+ advisoryCount: cwvResult.advisory.length
65
+ };
66
+ }
@@ -0,0 +1,45 @@
1
+ # Coder Rules
2
+
3
+ ## File modification safety
4
+
5
+ - NEVER overwrite existing files entirely. Always make targeted, minimal edits.
6
+ - When adding new code to an existing file, insert only the new lines at the correct location.
7
+ - After each edit, verify with `git diff` that ONLY the intended lines changed.
8
+ - If unintended changes are detected, revert immediately with `git checkout -- <file>`.
9
+ - Pay special attention to CSS, HTML, and config files where full rewrites destroy prior work (brand colors, layouts, styles).
10
+
11
+ ## Multi-agent / multi-developer environment
12
+
13
+ - Multiple developers and AI agents may be committing and modifying code simultaneously.
14
+ - ALWAYS run `git fetch origin main` and check recent commits before starting work.
15
+ - Before pushing or merging, rebase on the latest main: `git rebase origin/main`.
16
+ - If a commit or push fails, check whether someone else pushed in the meantime.
17
+ - Never assume main is unchanged since the last check — always verify.
18
+ - Create a dedicated branch per task (`feat/` or `fix/`) and merge via PR, never push directly to main.
19
+
20
+ ## General
21
+
22
+ - Keep changes minimal and focused on the task.
23
+ - Do not modify code unrelated to the task.
24
+ - Follow existing code conventions and patterns in the repository.
25
+
26
+ ## Environment isolation (parallel runs)
27
+
28
+ - Never hardcode ports, DB names, or docker project names — read them from env
29
+ vars, documenting each one in `.env.example`. When `KJ_LANE_SLOT` /
30
+ `KJ_PORT_OFFSET` exist in the env, derive per-task values from them so
31
+ parallel lanes never collide.
32
+ - Never commit a real `.env` — only `.env.example` is versioned.
33
+
34
+ ## Tests location (MANDATORY)
35
+
36
+ - Tests live in a top-level `tests/` directory mirroring `src/` (e.g. a function in
37
+ `src/services/foo.js` is tested by `tests/services/foo.test.js`).
38
+ - DO NOT scatter `*.test.js` files inside `src/` unless the project's local
39
+ `.karajan/coder-rules.md` explicitly overrides this.
40
+ - When generating a project from scratch:
41
+ - Create `tests/` and point the test runner at it (`include: ['tests/**/*.test.{js,ts}']`).
42
+ - Exclude `tests/` from the production bundle.
43
+ - If you write `sonar-project.properties`, set `sonar.tests=tests` AND make sure
44
+ that directory exists. Never declare a path that doesn't exist — Sonar will
45
+ refuse to scan and the run will fail every iteration with the same error.
@@ -0,0 +1,60 @@
1
+ # SonarQube Community Edition + PostgreSQL
2
+ # Karajan Code - Geniova Technologies
3
+ #
4
+ # Prerequisite (Linux):
5
+ # sudo sysctl -w vm.max_map_count=262144
6
+ # echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
7
+ #
8
+ # Usage:
9
+ # docker compose -f docker-compose.sonar.yml up -d
10
+ # Open http://localhost:9000 (admin/admin on first access)
11
+
12
+ services:
13
+ sonarqube:
14
+ image: sonarqube:community
15
+ container_name: karajan-sonarqube
16
+ depends_on:
17
+ sonarqube-db:
18
+ condition: service_healthy
19
+ ports:
20
+ - "9000:9000"
21
+ environment:
22
+ - SONAR_JDBC_URL=jdbc:postgresql://sonarqube-db:5432/sonar
23
+ - SONAR_JDBC_USERNAME=sonar
24
+ - SONAR_JDBC_PASSWORD=sonar
25
+ - SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true
26
+ volumes:
27
+ - sonarqube_data:/opt/sonarqube/data
28
+ - sonarqube_extensions:/opt/sonarqube/extensions
29
+ - sonarqube_logs:/opt/sonarqube/logs
30
+ networks:
31
+ - sonarnet
32
+ restart: unless-stopped
33
+
34
+ sonarqube-db:
35
+ image: postgres:17
36
+ container_name: karajan-sonarqube-db
37
+ healthcheck:
38
+ test: ["CMD-SHELL", "pg_isready -U sonar"]
39
+ interval: 10s
40
+ timeout: 5s
41
+ retries: 5
42
+ environment:
43
+ - POSTGRES_USER=sonar
44
+ - POSTGRES_PASSWORD=sonar
45
+ - POSTGRES_DB=sonar
46
+ volumes:
47
+ - postgresql_data:/var/lib/postgresql/data
48
+ networks:
49
+ - sonarnet
50
+ restart: unless-stopped
51
+
52
+ volumes:
53
+ sonarqube_data:
54
+ sonarqube_extensions:
55
+ sonarqube_logs:
56
+ postgresql_data:
57
+
58
+ networks:
59
+ sonarnet:
60
+ driver: bridge
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: dental-clinical
3
+ description: Clinical dental workflows, treatment types, and orthodontic terminology
4
+ tags:
5
+ - dental
6
+ - clinical
7
+ - orthodontics
8
+ - treatments
9
+ version: 1.0.0
10
+ author: geniova
11
+ visibility: private
12
+ sources:
13
+ - type: manual
14
+ note: Created by Geniova dental team based on clinical protocols
15
+ ---
16
+
17
+ # Dental Clinical Domain
18
+
19
+ ## Core Concepts
20
+
21
+ Teeth are numbered using the FDI World Dental Federation notation system:
22
+ - Upper right: 11-18, Upper left: 21-28
23
+ - Lower left: 31-38, Lower right: 41-48
24
+
25
+ Orthodontic treatment types:
26
+ - **Fixed appliances**: brackets, archwires, bands
27
+ - **Removable aligners**: transparent trays (e.g., Invisalign-type)
28
+ - **Mixed**: combination of fixed and removable phases
29
+
30
+ Treatment lifecycle: Diagnosis -> Planning -> Approval -> Manufacturing -> Delivery -> Follow-up
31
+
32
+ ## Terminology
33
+
34
+ - **Malocclusion**: misalignment of teeth or incorrect relation between upper and lower dental arches
35
+ - **Bracket**: small attachment bonded to the tooth surface to hold the archwire
36
+ - **Archwire**: wire threaded through brackets that applies corrective force
37
+ - **Aligner**: removable transparent tray that gradually moves teeth
38
+ - **IPR (Interproximal Reduction)**: controlled removal of enamel between teeth to create space
39
+ - **Attachment**: tooth-colored bump bonded to tooth to help aligners grip
40
+ - **Overcorrection**: intentional over-movement to account for relapse tendency
41
+ - **Staging**: the sequence and timing of tooth movements across aligner steps
42
+
43
+ ## Business Rules
44
+
45
+ - Treatment plans must be approved by the lead clinician before manufacturing begins.
46
+ - Maximum standard treatment duration is 36 months; extensions require clinical justification.
47
+ - Each aligner step should move teeth no more than 0.25mm or 2 degrees of rotation.
48
+ - Clinical photos and scans are mandatory at: initial diagnosis, mid-treatment, and completion.
49
+ - Patient consent form must be signed before any irreversible procedure (e.g., IPR, extractions).
50
+
51
+ ## Common Edge Cases
52
+
53
+ - **Mixed dentition**: pediatric patients with both primary and permanent teeth require special staging to account for natural tooth eruption during treatment.
54
+ - **Missing teeth**: treatment plans must explicitly account for gaps, pontics, or implant spaces.
55
+ - **Previous orthodontic treatment**: relapse cases need different force protocols than first-time treatments.
56
+ - **TMJ disorders**: patients with temporomandibular joint issues may need movement limits per step.
57
+ - **Pregnancy**: treatment may need to be paused; certain procedures (radiographs) are contraindicated.
@@ -0,0 +1,128 @@
1
+ # AI Agents
2
+ coder: claude
3
+ reviewer: codex
4
+
5
+ # Review settings
6
+ review_mode: standard
7
+ max_iterations: 5
8
+ review_rules: ./review-rules.md
9
+ coder_rules: ./coder-rules.md
10
+ base_branch: main
11
+
12
+ # Coder settings
13
+ coder_options:
14
+ model: null
15
+ auto_approve: true
16
+
17
+ # Reviewer settings
18
+ reviewer_options:
19
+ output_format: json
20
+ require_schema: true
21
+ model: null
22
+ deterministic: true
23
+ retries: 1
24
+ fallback_reviewer: codex
25
+
26
+ # Development methodology
27
+ development:
28
+ methodology: tdd
29
+ require_test_changes: true
30
+ test_file_patterns:
31
+ - /tests/
32
+ - /__tests__/
33
+ - .test.
34
+ - .spec.
35
+
36
+ # SonarQube settings
37
+ # Authentication: set token below, or KJ_SONAR_TOKEN env var,
38
+ # or save admin credentials in ~/.karajan/sonar-credentials.json:
39
+ # {"user": "admin", "password": "your-password"}
40
+ sonarqube:
41
+ enabled: true
42
+ host: http://localhost:9000
43
+ token: null
44
+ quality_gate: true
45
+ enforcement_profile: pragmatic
46
+ gate_block_on:
47
+ - new_reliability_rating=E
48
+ - new_security_rating=E
49
+ - new_maintainability_rating=E
50
+ - new_coverage<80
51
+ - new_duplicated_lines_density>5
52
+ fail_on:
53
+ - BLOCKER
54
+ - CRITICAL
55
+ ignore_on:
56
+ - INFO
57
+ max_scan_retries: 3
58
+ scanner:
59
+ sources: "src,public,lib"
60
+ exclusions: "**/node_modules/**,**/fake-apps/**,**/scripts/**,**/playground/**,**/dist/**,**/build/**,**/*.min.js"
61
+ test_inclusions: "**/*.test.js,**/*.spec.js,**/tests/**,**/__tests__/**"
62
+ coverage_exclusions: "**/tests/**,**/__tests__/**,**/*.test.js,**/*.spec.js"
63
+ disabled_rules:
64
+ - "javascript:S1116"
65
+ - "javascript:S3776"
66
+
67
+ # Deterministic Guards
68
+ guards:
69
+ output:
70
+ enabled: true
71
+ # Custom patterns (added to built-in destructive + credential patterns)
72
+ # patterns:
73
+ # - id: custom-pattern
74
+ # pattern: "DANGEROUS_FUNCTION"
75
+ # severity: critical
76
+ # message: "Custom dangerous pattern detected"
77
+ # Protected files (added to built-in: .env, serviceAccountKey.json, etc.)
78
+ # protected_files:
79
+ # - secrets.yml
80
+ # - .env.production
81
+ on_violation: block # block | warn | skip
82
+ perf:
83
+ enabled: true
84
+ block_on_warning: false # true to block on perf warnings (default: advisory only)
85
+ # Custom perf patterns (added to built-in frontend anti-patterns)
86
+ # patterns:
87
+ # - id: custom-perf
88
+ # pattern: "eval\\("
89
+ # severity: warning
90
+ # message: "eval() detected"
91
+ intent:
92
+ enabled: false # enable for deterministic pre-triage classification
93
+ confidence_threshold: 0.85
94
+ # Custom intent patterns (evaluated before built-in)
95
+ # patterns:
96
+ # - keywords: ["readme", "docs", "documentation"]
97
+ # taskType: doc
98
+ # confidence: 0.9
99
+
100
+ # Git (post-approval)
101
+ git:
102
+ auto_commit: false
103
+ auto_push: false
104
+ auto_pr: false
105
+ auto_rebase: true
106
+ branch_prefix: feat/
107
+
108
+ # Output
109
+ output:
110
+ report_dir: ./.reviews
111
+ log_level: info
112
+
113
+ # Session limits
114
+ session:
115
+ max_iteration_minutes: 15
116
+ max_total_minutes: 120
117
+ # Hard per-run spend ceiling (USD-equivalent). The run stops with a summary
118
+ # when exceeded; resume with `kj resume`. Set to null to remove the cap.
119
+ max_budget_usd: 5
120
+ fail_fast_repeats: 2
121
+ # Per-lane setup for parallel runs (worktrees). Runs INSIDE the fresh
122
+ # worktree instead of the default `npm ci`. Each lane receives
123
+ # KJ_LANE_SLOT (0,1,2…) and KJ_PORT_OFFSET (slot-derived) in its env —
124
+ # derive ports, DB names and docker project names from them so lanes
125
+ # never collide. The coder never orchestrates git; isolation is declared
126
+ # here. Example:
127
+ # worktree_setup: "npm ci && docker compose -p app_lane_$KJ_LANE_SLOT up -d db"
128
+ worktree_setup: null
@@ -0,0 +1,17 @@
1
+ # Review Rules
2
+
3
+ - Focus on security, correctness, and tests first.
4
+ - Only raise blocking issues for concrete production risks.
5
+ - Keep non-blocking suggestions separate.
6
+
7
+ ## Environment isolation
8
+
9
+ - Reject changes that hardcode ports, DB names or service hostnames instead of
10
+ reading them from env vars, and any diff that adds a real `.env` (only
11
+ `.env.example` is versioned).
12
+
13
+ ## File overwrite detection (BLOCKING)
14
+
15
+ - If the diff shows an entire file was replaced (massive deletions + additions instead of targeted edits), flag it as BLOCKING.
16
+ - Check specifically for: reverted brand colors, lost CSS styles, removed existing functionality, overwritten config values.
17
+ - A diff where most lines of a file are removed and re-added with minor changes is a sign of full-file overwrite.