@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,7 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
+ cd "$ROOT_DIR"
6
+
7
+ node scripts/install.js "$@"
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * postinstall hook – registers karajan-mcp in Claude Code and Codex
4
+ * automatically after `npm install`.
5
+ *
6
+ * - Non-interactive, silent on success.
7
+ * - Idempotent: safe to run many times.
8
+ * - Never fails hard (exits 0 even on error) so `npm install` is not blocked.
9
+ */
10
+ import fs from "node:fs/promises";
11
+ import os from "node:os";
12
+ import path from "node:path";
13
+ import { fileURLToPath } from "node:url";
14
+
15
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
16
+ const ROOT_DIR = path.resolve(__dirname, "..");
17
+ const REGISTRY_PATH = path.join(os.homedir(), ".karajan", "instances.json");
18
+
19
+ async function readJson(file) {
20
+ const raw = await fs.readFile(file, "utf8");
21
+ return JSON.parse(raw);
22
+ }
23
+
24
+ async function writeJson(file, obj) {
25
+ await fs.mkdir(path.dirname(file), { recursive: true });
26
+ await fs.writeFile(file, `${JSON.stringify(obj, null, 2)}\n`, "utf8");
27
+ }
28
+
29
+ function resolveKjHome() {
30
+ if (process.env.KJ_HOME) return process.env.KJ_HOME;
31
+ return path.join(ROOT_DIR, ".karajan");
32
+ }
33
+
34
+ async function resolveKjHomeFromRegistry() {
35
+ try {
36
+ const registry = await readJson(REGISTRY_PATH);
37
+ const names = Object.keys(registry.instances || {});
38
+ if (names.length > 0) {
39
+ const first = registry.instances[names.includes("default") ? "default" : names[0]];
40
+ if (first?.kjHome) return first.kjHome;
41
+ }
42
+ } catch {
43
+ // No registry yet — use default
44
+ }
45
+ return resolveKjHome();
46
+ }
47
+
48
+ async function setupClaudeMcp(kjHome) {
49
+ const claudeJsonPath = path.join(os.homedir(), ".claude.json");
50
+ let config = {};
51
+ try {
52
+ config = await readJson(claudeJsonPath);
53
+ } catch {
54
+ config = {};
55
+ }
56
+
57
+ config.mcpServers = config.mcpServers || {};
58
+ config.mcpServers["karajan-mcp"] = {
59
+ type: "stdio",
60
+ command: "node",
61
+ args: [path.join(ROOT_DIR, "src", "mcp", "server.js")],
62
+ cwd: ROOT_DIR,
63
+ env: { KJ_HOME: kjHome }
64
+ };
65
+
66
+ await writeJson(claudeJsonPath, config);
67
+ }
68
+
69
+ function upsertCodexMcpBlock(toml, block) {
70
+ const begin = "# BEGIN karajan-mcp";
71
+ const end = "# END karajan-mcp";
72
+ const startIdx = toml.indexOf(begin);
73
+ const endIdx = toml.indexOf(end);
74
+ let base = toml;
75
+
76
+ if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
77
+ base = `${toml.slice(0, startIdx).trimEnd()}\n\n${toml.slice(endIdx + end.length).trimStart()}`;
78
+ }
79
+
80
+ return `${base.trimEnd()}\n\n${begin}\n${block}\n${end}\n`;
81
+ }
82
+
83
+ async function setupCodexMcp(kjHome) {
84
+ const configPath = path.join(os.homedir(), ".codex", "config.toml");
85
+ let toml = "";
86
+ try {
87
+ toml = await fs.readFile(configPath, "utf8");
88
+ } catch {
89
+ toml = "";
90
+ }
91
+
92
+ const block = [
93
+ '[mcp_servers."karajan-mcp"]',
94
+ 'command = "node"',
95
+ `args = ["${path.join(ROOT_DIR, "src", "mcp", "server.js")}"]`,
96
+ `cwd = "${ROOT_DIR}"`,
97
+ '[mcp_servers."karajan-mcp".env]',
98
+ `KJ_HOME = "${kjHome}"`
99
+ ].join("\n");
100
+
101
+ const updated = upsertCodexMcpBlock(toml, block);
102
+ await fs.mkdir(path.dirname(configPath), { recursive: true });
103
+ await fs.writeFile(configPath, updated, "utf8");
104
+ }
105
+
106
+ async function main() {
107
+ const kjHome = await resolveKjHomeFromRegistry();
108
+
109
+ await setupClaudeMcp(kjHome);
110
+ await setupCodexMcp(kjHome);
111
+
112
+ console.log("karajan-mcp registered in Claude Code and Codex.");
113
+ }
114
+
115
+ main().catch(() => {
116
+ // Silent failure — never block npm install
117
+ });
@@ -0,0 +1,88 @@
1
+ #!/bin/bash
2
+ #
3
+ # Configures branch protection on all repos of a GitHub user.
4
+ # Requires: gh CLI authenticated with admin permissions.
5
+ #
6
+ # Usage:
7
+ # ./scripts/protect-all-repos.sh # dry-run (shows what it would do)
8
+ # ./scripts/protect-all-repos.sh --apply # apply protection rules
9
+ #
10
+ # What it does:
11
+ # - Require PRs before merging (no direct push to default branch)
12
+ # - Block force push
13
+ # - Block branch deletion
14
+ #
15
+ # Skips repos where branch protection is already configured.
16
+
17
+ set -euo pipefail
18
+
19
+ OWNER="${GH_OWNER:-manufosela}"
20
+ APPLY=false
21
+
22
+ if [[ "${1:-}" == "--apply" ]]; then
23
+ APPLY=true
24
+ fi
25
+
26
+ echo "=== Branch Protection for all repos of $OWNER ==="
27
+ echo ""
28
+
29
+ if [[ "$APPLY" == false ]]; then
30
+ echo " DRY RUN mode. Use --apply to actually configure."
31
+ echo ""
32
+ fi
33
+
34
+ REPOS=$(gh repo list "$OWNER" --limit 500 --json name,defaultBranchRef,isArchived \
35
+ --jq '.[] | select(.isArchived == false) | "\(.name)\t\(.defaultBranchRef.name // "main")"')
36
+
37
+ TOTAL=0
38
+ PROTECTED=0
39
+ SKIPPED=0
40
+ FAILED=0
41
+
42
+ while IFS=$'\t' read -r REPO BRANCH; do
43
+ TOTAL=$((TOTAL + 1))
44
+
45
+ # Check if already protected
46
+ STATUS=$(gh api "repos/$OWNER/$REPO/branches/$BRANCH/protection" --jq '.required_pull_request_reviews.required_approving_review_count // 0' 2>/dev/null || echo "none")
47
+
48
+ if [[ "$STATUS" != "none" ]]; then
49
+ echo " SKIP $REPO ($BRANCH) — already protected"
50
+ SKIPPED=$((SKIPPED + 1))
51
+ continue
52
+ fi
53
+
54
+ if [[ "$APPLY" == false ]]; then
55
+ echo " WOULD $REPO ($BRANCH)"
56
+ continue
57
+ fi
58
+
59
+ # Apply protection
60
+ if gh api "repos/$OWNER/$REPO/branches/$BRANCH/protection" -X PUT \
61
+ --input - <<EOF 2>/dev/null; then
62
+ {
63
+ "required_pull_request_reviews": {
64
+ "required_approving_review_count": 0,
65
+ "dismiss_stale_reviews": false
66
+ },
67
+ "enforce_admins": false,
68
+ "required_status_checks": null,
69
+ "restrictions": null,
70
+ "allow_force_pushes": false,
71
+ "allow_deletions": false
72
+ }
73
+ EOF
74
+ echo " OK $REPO ($BRANCH)"
75
+ PROTECTED=$((PROTECTED + 1))
76
+ else
77
+ echo " FAIL $REPO ($BRANCH) — check permissions"
78
+ FAILED=$((FAILED + 1))
79
+ fi
80
+
81
+ done <<< "$REPOS"
82
+
83
+ echo ""
84
+ echo "=== Summary ==="
85
+ echo " Total: $TOTAL"
86
+ echo " Protected: $PROTECTED"
87
+ echo " Skipped: $SKIPPED"
88
+ echo " Failed: $FAILED"
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Quickstart gate (KJC-TSK-0635) — the landing's Quick Start, end to end,
4
+ * against the PACKED tarball, with a REAL coder run.
5
+ *
6
+ * Run manually before a release (`npm run verify-quickstart`). Opt-in
7
+ * because the coder run spends real subscription quota (~$0.5-1.5, 5-8
8
+ * minutes). What it catches that unit tests and verify-pack cannot:
9
+ * the exact first-contact sequence a new user follows — install → init →
10
+ * `kj run` on a no-remote repo → playable artifact (2026-07-19: that
11
+ * sequence surfaced KJC-BUG-0111/0112/0113 in one afternoon).
12
+ *
13
+ * Asserts: run exits 0 · report says approved · index.html exists with
14
+ * game markers · "skipping push/PR" logged · ZERO Solomon escalations.
15
+ */
16
+ import { execFileSync, spawnSync } from "node:child_process";
17
+ import fs from "node:fs";
18
+ import os from "node:os";
19
+ import path from "node:path";
20
+
21
+ const repoRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
22
+ const TASK = "Create a tic-tac-toe game in a single self-contained index.html — vanilla HTML, CSS and JavaScript, no server and no build step. The human plays X, the bot plays O and blocks or takes a winning move when it can. Detect wins and draws, and add a New Game button. Opening index.html in a browser must be enough to play.";
23
+
24
+ function fail(msg, detail) {
25
+ console.error(`\n✗ quickstart-gate: ${msg}`);
26
+ if (detail) console.error(String(detail).slice(-1200));
27
+ process.exitCode = 1;
28
+ throw new Error(msg);
29
+ }
30
+
31
+ let work = null;
32
+ try {
33
+ console.log("quickstart-gate: packing…");
34
+ const packOut = execFileSync("npm", ["pack", "--json", "--silent"], { cwd: repoRoot, encoding: "utf8" });
35
+ const tgz = path.join(repoRoot, JSON.parse(packOut)[0].filename);
36
+
37
+ work = fs.mkdtempSync(path.join(os.tmpdir(), "kj-qs-gate-"));
38
+ const prefix = path.join(work, "npm");
39
+ const project = path.join(work, "project");
40
+ fs.mkdirSync(project, { recursive: true });
41
+
42
+ console.log("quickstart-gate: installing the tarball (isolated prefix)…");
43
+ execFileSync("npm", ["install", "-g", tgz, "--no-audit", "--no-fund", "--silent", "--prefix", prefix], { encoding: "utf8" });
44
+ const kj = path.join(prefix, "bin", "kj");
45
+ fs.rmSync(tgz, { force: true });
46
+
47
+ // Isolated KARAJAN_HOME: faithful to a brand-new user (no global
48
+ // config) and never touches the maintainer's real ~/.karajan.
49
+ const env = { ...process.env, KARAJAN_HOME: path.join(work, "karajan-home") };
50
+ delete env.CLAUDECODE;
51
+ // If the maintainer's machine has a SonarQube server running, preflight
52
+ // (correctly) demands a token the isolated home doesn't have. Forward the
53
+ // maintainer's token so the gate exercises the sonar stage instead of
54
+ // dying in preflight. A machine with no sonar server is unaffected.
55
+ if (!env.KJ_SONAR_TOKEN) {
56
+ try {
57
+ const cfg = fs.readFileSync(path.join(os.homedir(), ".karajan", "kj.config.yml"), "utf8");
58
+ const m = cfg.match(/^\s*token:\s*(sqa_[A-Za-z0-9]+|squ_[A-Za-z0-9]+)\s*$/m);
59
+ if (m) env.KJ_SONAR_TOKEN = m[1];
60
+ } catch { /* no global config — brand-new machine, nothing to forward */ }
61
+ }
62
+
63
+ console.log("quickstart-gate: git init + kj init (unattended)…");
64
+ execFileSync("git", ["init", "-q", "-b", "main"], { cwd: project });
65
+ const init = spawnSync(kj, ["init", "--no-interactive", "--no-ollama", "--no-rtk", "--no-squeezr", "--no-qmd"], {
66
+ cwd: project, env, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], timeout: 300000,
67
+ });
68
+ if (init.status !== 0) fail("kj init failed", init.stderr || init.stdout);
69
+
70
+ console.log("quickstart-gate: kj run (REAL coder — this spends quota, ~5-8 min)…");
71
+ const runRes = spawnSync(kj, ["run", "-y", TASK], {
72
+ cwd: project, env, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], timeout: 20 * 60 * 1000,
73
+ });
74
+ const runOut = `${runRes.stdout || ""}${runRes.stderr || ""}`;
75
+ fs.writeFileSync(path.join(work, "run.log"), runOut);
76
+
77
+ if (runRes.status !== 0) fail(`kj run exited ${runRes.status} (log: ${work}/run.log)`, runOut);
78
+ if (/escalating to Solomon/i.test(runOut)) fail(`Solomon escalation detected — the happy path must not consult Solomon (log: ${work}/run.log)`);
79
+ // KJC-BUG-0112 regression: a remote-less repo must never attempt (and
80
+ // fail) push/fetch automation. With init's defaults (auto_push: false)
81
+ // the "skipping push/PR" line is legitimately absent, so assert the
82
+ // absence of failure symptoms rather than the presence of the skip line.
83
+ if (/failed to push|fatal: .*origin|couldn't find remote/i.test(runOut)) fail(`push/fetch against a missing remote detected (log: ${work}/run.log)`);
84
+
85
+ const html = path.join(project, "index.html");
86
+ if (!fs.existsSync(html)) fail("index.html was not created");
87
+ const htmlText = fs.readFileSync(html, "utf8");
88
+ if (!/new game/i.test(htmlText)) fail("index.html has no New Game control — not the requested game");
89
+
90
+ const report = spawnSync(kj, ["report"], { cwd: project, env, encoding: "utf8", timeout: 60000 });
91
+ if (!/approved/i.test(`${report.stdout || ""}`)) fail("kj report does not say approved", report.stdout);
92
+
93
+ console.log("\n✓ quickstart-gate: install → init → run → playable index.html → approved. Ship it.");
94
+ } finally {
95
+ if (work && process.exitCode !== 1 && fs.existsSync(work)) fs.rmSync(work, { recursive: true, force: true });
96
+ if (work && process.exitCode === 1) console.error(`quickstart-gate: workdir kept for inspection: ${work}`);
97
+ }
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env bash
2
+ # Regenerate the numeric stats in docs/ARCHITECTURE.md from the current tree.
3
+ #
4
+ # Motivation: docs/ARCHITECTURE.md accumulates staleness. The v2.7.4 audit
5
+ # found it claimed "28k LOC, 234 files" when reality was 35.9k LOC / 260
6
+ # files (+28% LOC, +11% files), and pointed at `src/orchestrator.js` as the
7
+ # main pipeline (~1400 LOC) when the real orchestrator is
8
+ # `src/orchestrator/flow-runner.js` (2241 LOC) and `src/orchestrator.js` is
9
+ # a 22-line barrel.
10
+ #
11
+ # This script rewrites the specific lines that contain numeric stats
12
+ # in-place; narrative paragraphs are left alone.
13
+ #
14
+ # Usage:
15
+ # scripts/regen-arch-stats.sh # rewrite and exit 0
16
+ # scripts/regen-arch-stats.sh --check # exit 1 if the file would change
17
+ #
18
+ # Add to the release checklist: run without --check, commit any diff.
19
+ set -euo pipefail
20
+
21
+ MODE="${1:-}"
22
+ DOC="docs/ARCHITECTURE.md"
23
+
24
+ if [[ ! -f "$DOC" ]]; then
25
+ echo "ARCHITECTURE.md not found at $DOC — run from the repo root." >&2
26
+ exit 2
27
+ fi
28
+
29
+ # ── Compute current stats ──────────────────────────────────────────────
30
+
31
+ SRC_LOC=$(find src -name "*.js" -not -path "*/node_modules/*" | xargs wc -l 2>/dev/null | tail -1 | awk '{print $1}')
32
+ SRC_FILES=$(find src -name "*.js" -not -path "*/node_modules/*" | wc -l)
33
+ TEST_COUNT=$(find tests -name "*.test.js" -not -path "*/worktrees/*" -not -path "*/.kj/*" | wc -l)
34
+
35
+ # Format LOC with thousands separator ("36038" → "36k" for narrative, raw for table)
36
+ SRC_LOC_SHORT=$(awk -v n="$SRC_LOC" 'BEGIN{ printf "%dk", int(n/1000) }')
37
+
38
+ # Orchestrator pipeline stats
39
+ FLOW_RUNNER_LOC=$(wc -l < src/orchestrator/flow-runner.js 2>/dev/null | awk '{print $1}')
40
+ BARREL_LOC=$(wc -l < src/orchestrator.js 2>/dev/null | awk '{print $1}')
41
+
42
+ # ── Build a sed program ────────────────────────────────────────────────
43
+ # Each line targets a specific claim. Patterns are narrow enough to miss
44
+ # unrelated mentions but wide enough to absorb small formatting drifts.
45
+
46
+ SED_SCRIPT=$(cat <<EOF
47
+ s|Source code ([0-9kKmM.]\\+ LOC, [0-9]\\+ files)|Source code (${SRC_LOC_SHORT} LOC, ${SRC_FILES} files)|g
48
+ s|Test suite ([0-9]\\+ tests)|Test suite (${TEST_COUNT} test files)|g
49
+ s|\`src/orchestrator.js\` (~[0-9]\\+ LOC)|\`src/orchestrator.js\` (${BARREL_LOC}-line barrel) → delegates to \`src/orchestrator/flow-runner.js\` (${FLOW_RUNNER_LOC} LOC)|g
50
+ EOF
51
+ )
52
+
53
+ if [[ "$MODE" == "--check" ]]; then
54
+ if sed "$SED_SCRIPT" "$DOC" | diff -q "$DOC" - >/dev/null; then
55
+ echo "docs/ARCHITECTURE.md stats are up to date."
56
+ exit 0
57
+ fi
58
+ echo "docs/ARCHITECTURE.md stats are STALE. Run scripts/regen-arch-stats.sh to rewrite." >&2
59
+ sed "$SED_SCRIPT" "$DOC" | diff -u "$DOC" - || true
60
+ exit 1
61
+ fi
62
+
63
+ # Real rewrite, in place, with backup we immediately delete to keep the
64
+ # working tree clean.
65
+ sed -i.bak "$SED_SCRIPT" "$DOC"
66
+ rm -f "${DOC}.bak"
67
+
68
+ echo "docs/ARCHITECTURE.md updated with:"
69
+ echo " Source code: ${SRC_LOC_SHORT} LOC, ${SRC_FILES} files"
70
+ echo " Tests: ${TEST_COUNT} test files"
71
+ echo " Orchestrator: src/orchestrator.js ${BARREL_LOC}-line barrel → flow-runner.js ${FLOW_RUNNER_LOC} LOC"
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
+ INSTALLER="$ROOT_DIR/scripts/install.sh"
6
+
7
+ if [[ ! -x "$INSTALLER" ]]; then
8
+ echo "Installer not found: $INSTALLER"
9
+ exit 1
10
+ fi
11
+
12
+ echo "Karajan multi-instance setup (personal + pro)"
13
+ echo
14
+
15
+ read -r -p "Sonar host [http://localhost:9000]: " SONAR_HOST
16
+ SONAR_HOST="${SONAR_HOST:-http://localhost:9000}"
17
+
18
+ read -r -p "Personal KJ_HOME [$HOME/.karajan-personal]: " PERSONAL_HOME
19
+ PERSONAL_HOME="${PERSONAL_HOME:-$HOME/.karajan-personal}"
20
+
21
+ read -r -p "Pro KJ_HOME [$HOME/.karajan-pro]: " PRO_HOME
22
+ PRO_HOME="${PRO_HOME:-$HOME/.karajan-pro}"
23
+
24
+ echo
25
+ read -r -p "Personal Sonar token (KJ_SONAR_TOKEN): " PERSONAL_TOKEN
26
+ read -r -p "Pro Sonar token (KJ_SONAR_TOKEN): " PRO_TOKEN
27
+
28
+ read -r -p "Coder default [codex]: " CODER
29
+ CODER="${CODER:-codex}"
30
+
31
+ read -r -p "Reviewer default [claude]: " REVIEWER
32
+ REVIEWER="${REVIEWER:-claude}"
33
+
34
+ read -r -p "Reviewer fallback [codex]: " REVIEWER_FALLBACK
35
+ REVIEWER_FALLBACK="${REVIEWER_FALLBACK:-codex}"
36
+
37
+ echo
38
+ echo "Setting up PERSONAL instance..."
39
+ "$INSTALLER" \
40
+ --non-interactive \
41
+ --link-global false \
42
+ --kj-home "$PERSONAL_HOME" \
43
+ --sonar-host "$SONAR_HOST" \
44
+ --sonar-token "$PERSONAL_TOKEN" \
45
+ --coder "$CODER" \
46
+ --reviewer "$REVIEWER" \
47
+ --reviewer-fallback "$REVIEWER_FALLBACK" \
48
+ --setup-mcp-claude false \
49
+ --setup-mcp-codex false \
50
+ --run-doctor true
51
+
52
+ echo
53
+ echo "Setting up PRO instance..."
54
+ "$INSTALLER" \
55
+ --non-interactive \
56
+ --link-global false \
57
+ --kj-home "$PRO_HOME" \
58
+ --sonar-host "$SONAR_HOST" \
59
+ --sonar-token "$PRO_TOKEN" \
60
+ --coder "$CODER" \
61
+ --reviewer "$REVIEWER" \
62
+ --reviewer-fallback "$REVIEWER_FALLBACK" \
63
+ --setup-mcp-claude false \
64
+ --setup-mcp-codex false \
65
+ --run-doctor true
66
+
67
+ CLAUDE_SETTINGS="$HOME/.claude/settings.json"
68
+ CODEX_CONFIG="$HOME/.codex/config.toml"
69
+ SERVER_PATH="$ROOT_DIR/src/mcp/server.js"
70
+
71
+ mkdir -p "$HOME/.claude" "$HOME/.codex"
72
+
73
+ if [[ ! -f "$CLAUDE_SETTINGS" ]]; then
74
+ cat > "$CLAUDE_SETTINGS" <<JSON
75
+ {
76
+ "mcpServers": {}
77
+ }
78
+ JSON
79
+ fi
80
+
81
+ node - <<NODE
82
+ const fs = require('fs');
83
+ const p = "$CLAUDE_SETTINGS";
84
+ const serverPath = "$SERVER_PATH";
85
+ const rootDir = "$ROOT_DIR";
86
+ const personalHome = "$PERSONAL_HOME";
87
+ const proHome = "$PRO_HOME";
88
+ const personalToken = "$PERSONAL_TOKEN";
89
+ const proToken = "$PRO_TOKEN";
90
+ let settings = {};
91
+ try { settings = JSON.parse(fs.readFileSync(p, 'utf8')); } catch { settings = {}; }
92
+ settings.mcpServers = settings.mcpServers || {};
93
+ settings.mcpServers['karajan-personal'] = {
94
+ command: 'node',
95
+ args: [serverPath],
96
+ cwd: rootDir,
97
+ env: { KJ_HOME: personalHome, KJ_SONAR_TOKEN: personalToken }
98
+ };
99
+ settings.mcpServers['karajan-pro'] = {
100
+ command: 'node',
101
+ args: [serverPath],
102
+ cwd: rootDir,
103
+ env: { KJ_HOME: proHome, KJ_SONAR_TOKEN: proToken }
104
+ };
105
+ fs.writeFileSync(p, JSON.stringify(settings, null, 2) + '\\n');
106
+ NODE
107
+
108
+ if [[ ! -f "$CODEX_CONFIG" ]]; then
109
+ touch "$CODEX_CONFIG"
110
+ fi
111
+
112
+ TMP_CODEX="$(mktemp)"
113
+ cp "$CODEX_CONFIG" "$TMP_CODEX"
114
+
115
+ sed -i '/# BEGIN karajan-multi/,/# END karajan-multi/d' "$TMP_CODEX"
116
+ cat >> "$TMP_CODEX" <<TOML
117
+
118
+ # BEGIN karajan-multi
119
+ [mcp_servers."karajan-personal"]
120
+ command = "node"
121
+ args = ["$SERVER_PATH"]
122
+ cwd = "$ROOT_DIR"
123
+
124
+ [mcp_servers."karajan-personal".env]
125
+ KJ_HOME = "$PERSONAL_HOME"
126
+ KJ_SONAR_TOKEN = "$PERSONAL_TOKEN"
127
+
128
+ [mcp_servers."karajan-pro"]
129
+ command = "node"
130
+ args = ["$SERVER_PATH"]
131
+ cwd = "$ROOT_DIR"
132
+
133
+ [mcp_servers."karajan-pro".env]
134
+ KJ_HOME = "$PRO_HOME"
135
+ KJ_SONAR_TOKEN = "$PRO_TOKEN"
136
+ # END karajan-multi
137
+ TOML
138
+
139
+ mv "$TMP_CODEX" "$CODEX_CONFIG"
140
+
141
+ echo
142
+ echo "Multi-instance setup completed."
143
+ echo "- Personal KJ_HOME: $PERSONAL_HOME"
144
+ echo "- Pro KJ_HOME: $PRO_HOME"
145
+ echo "- Claude MCP updated: $CLAUDE_SETTINGS"
146
+ echo "- Codex MCP updated: $CODEX_CONFIG"
147
+ echo
148
+ echo "Next steps:"
149
+ echo "1) Restart Claude and Codex."
150
+ echo "2) In each client, use MCP server karajan-personal or karajan-pro."