karajan-code 4.70.4 → 5.0.1

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 (390) hide show
  1. package/README.md +2 -2
  2. package/package.json +6 -14
  3. package/packages/hu-board/package.json +1 -1
  4. package/packages/hu-board/public/app.js +4 -18
  5. package/packages/hu-board/public/index.html +5 -2
  6. package/packages/hu-board/public/styles.css +26 -0
  7. package/packages/hu-board/public/utils/api.js +0 -74
  8. package/packages/hu-board/public/utils/board-tour.js +62 -0
  9. package/packages/hu-board/public/utils/board-view.js +49 -144
  10. package/packages/hu-board/public/utils/command-launcher.js +8 -70
  11. package/packages/hu-board/public/utils/formatters.js +10 -0
  12. package/packages/hu-board/public/utils/governance-view.js +13 -1
  13. package/packages/hu-board/public/utils/hu-actions.js +17 -68
  14. package/packages/hu-board/public/utils/init-listeners.js +7 -8
  15. package/packages/hu-board/public/utils/log-panel.js +3 -16
  16. package/packages/hu-board/public/utils/maggle-mode.js +2 -12
  17. package/packages/hu-board/public/utils/modals.js +7 -0
  18. package/packages/hu-board/public/utils/project-picker-view.js +1 -1
  19. package/packages/hu-board/public/utils/server-push.js +3 -22
  20. package/packages/hu-board/public/utils/shared-board-notice.js +33 -0
  21. package/packages/hu-board/public/utils/story-detail-view.js +5 -19
  22. package/packages/hu-board/src/cleanup-zombies.js +0 -1
  23. package/packages/hu-board/src/command-runner.js +36 -25
  24. package/packages/hu-board/src/db-connection.js +282 -0
  25. package/packages/hu-board/src/db-paths.js +113 -0
  26. package/packages/hu-board/src/db-queries.js +188 -0
  27. package/packages/hu-board/src/db-tombstones.js +51 -0
  28. package/packages/hu-board/src/db.js +28 -619
  29. package/packages/hu-board/src/ephemeral-cleaner.js +2 -3
  30. package/packages/hu-board/src/hu-zombie-reaper.js +5 -1
  31. package/packages/hu-board/src/plan-mutations.js +3 -153
  32. package/packages/hu-board/src/plans-service.js +55 -0
  33. package/packages/hu-board/src/routes/api/commands.js +122 -0
  34. package/packages/hu-board/src/routes/api/plans.js +55 -0
  35. package/packages/hu-board/src/routes/api/projects.js +267 -0
  36. package/packages/hu-board/src/routes/api/prompts.js +135 -0
  37. package/packages/hu-board/src/routes/api/sessions.js +95 -0
  38. package/packages/hu-board/src/routes/api/stories.js +183 -0
  39. package/packages/hu-board/src/routes/api/system.js +241 -0
  40. package/packages/hu-board/src/routes/api/tombstones.js +38 -0
  41. package/packages/hu-board/src/routes/api.js +24 -1371
  42. package/packages/hu-board/src/routes/governance.js +23 -1
  43. package/packages/hu-board/src/routes/lanes.js +40 -0
  44. package/packages/hu-board/src/routes/rag.js +4 -3
  45. package/packages/hu-board/src/server.js +20 -34
  46. package/packages/hu-board/src/sync-files.js +318 -0
  47. package/packages/hu-board/src/sync-project.js +99 -0
  48. package/packages/hu-board/src/sync.js +22 -566
  49. package/packages/hu-board/src/zombie-reaper.js +1 -1
  50. package/scripts/dual-publish.mjs +19 -3
  51. package/scripts/postinstall.js +15 -2
  52. package/scripts/verify-pack-mcp.mjs +11 -7
  53. package/scripts/verify-pack.mjs +4 -4
  54. package/src/audit/audit-history.js +3 -2
  55. package/src/audit/dead-exports.js +68 -59
  56. package/src/audit/deterministic-summary.js +33 -13
  57. package/src/audit/npm-signatures.js +41 -0
  58. package/src/audit/sbom.js +35 -0
  59. package/src/checks/agent-token.js +112 -0
  60. package/src/checks/dir-setup.js +34 -1
  61. package/src/checks/native-build.js +21 -39
  62. package/src/checks/runner.js +128 -142
  63. package/src/cli/advanced-commands.js +6 -6
  64. package/src/cli/register-meta.js +42 -82
  65. package/src/cli/register-pipeline.js +8 -143
  66. package/src/cli/register-plan.js +9 -100
  67. package/src/cli/register-roles-skills.js +1 -1
  68. package/src/cli/retired-commands.js +49 -0
  69. package/src/cli.js +18 -5
  70. package/src/commands/agent-run.js +40 -26
  71. package/src/commands/audit.js +127 -124
  72. package/src/commands/board.js +5 -9
  73. package/src/commands/check.js +29 -16
  74. package/src/commands/doctor.js +2 -0
  75. package/src/commands/env.js +176 -150
  76. package/src/commands/go.js +71 -53
  77. package/src/commands/harden.js +90 -81
  78. package/src/commands/hu-start.js +52 -0
  79. package/src/commands/hu.js +288 -221
  80. package/src/commands/identity.js +111 -78
  81. package/src/commands/init-atril.js +47 -0
  82. package/src/commands/init.js +11 -40
  83. package/src/commands/install-tools.js +70 -85
  84. package/src/commands/main-guard.js +78 -0
  85. package/src/commands/policy.js +226 -184
  86. package/src/commands/qmd.js +27 -21
  87. package/src/commands/rag.js +121 -55
  88. package/src/commands/review-gate.js +421 -341
  89. package/src/commands/skills.js +4 -1
  90. package/src/commands/start.js +4 -5
  91. package/src/commands/steward.js +96 -47
  92. package/src/commands/tournament.js +46 -37
  93. package/src/commands/worktree.js +107 -26
  94. package/src/config/defaults.js +1 -0
  95. package/src/config/loader.js +34 -17
  96. package/src/config/role-resolver.js +1 -0
  97. package/src/config/schema.js +1 -0
  98. package/src/config/secrets.js +36 -0
  99. package/src/config.js +1 -0
  100. package/src/environment/adr.js +16 -2
  101. package/src/git/karajan-label.js +20 -8
  102. package/src/guards/main-guard.js +54 -0
  103. package/src/harden/hook-templates.js +16 -1
  104. package/src/harden/sentinel/posttooluse.mjs +18 -6
  105. package/src/harden/sentinel/pretooluse-sentinel.mjs +64 -36
  106. package/src/harden/sentinel/sentinel-lib.mjs +129 -26
  107. package/src/harden/sentinel/sentinel-shell.mjs +5 -16
  108. package/src/harden/sentinel/sessionstart.mjs +3 -2
  109. package/src/harden/sentinel/stop.mjs +5 -4
  110. package/src/harden/workflow-templates.js +1 -1
  111. package/src/hu/board-lookup.js +29 -0
  112. package/src/hu/gh-identity.js +23 -0
  113. package/src/hu/github-board.js +4 -2
  114. package/src/hu/lane-prune.js +83 -13
  115. package/src/hu/lane-setup.js +65 -0
  116. package/src/hu/lanes.js +66 -0
  117. package/src/hu/team-board-mirror.js +3 -2
  118. package/src/infrastructure/command-runner.js +1 -1
  119. package/src/infrastructure/file-system-service.js +1 -1
  120. package/src/mcp/handlers/direct-handlers.js +2 -292
  121. package/src/mcp/handlers/hu-handlers.js +1 -35
  122. package/src/mcp/handlers/management-handlers.js +2 -42
  123. package/src/mcp/handlers/rag-handler.js +9 -1
  124. package/src/mcp/server-handlers.js +16 -22
  125. package/src/mcp/tools.js +1 -196
  126. package/src/plan/lane-plans.js +54 -0
  127. package/src/plan/plan-store.js +7 -4
  128. package/src/policy/add.js +26 -12
  129. package/src/policy/adr-number-check.js +31 -0
  130. package/src/prompts/audit.js +299 -339
  131. package/src/prompts/card-context.js +10 -5
  132. package/src/prompts/reviewer.js +5 -2
  133. package/src/rag/auto-update.js +71 -44
  134. package/src/rag/bootstrap-index.js +46 -54
  135. package/src/rag/indexer.js +9 -4
  136. package/src/rag/migrate.js +1 -1
  137. package/src/rag/onnx-fallback.js +2 -2
  138. package/src/rag/pid-lease.js +181 -0
  139. package/src/rag/project-store.js +2 -12
  140. package/src/review/card-first.js +57 -46
  141. package/src/review/gate-gitignore.js +23 -4
  142. package/src/review/gate-hook.js +12 -4
  143. package/src/review/one-shot-review.js +45 -35
  144. package/src/review/publish-pr.js +14 -2
  145. package/src/review/repo-docs.js +73 -0
  146. package/src/review/repo-stack.js +59 -0
  147. package/src/review/reviewer-fallback.js +19 -4
  148. package/src/review/seal-commit.js +29 -0
  149. package/src/review/sonar-pregate.js +59 -44
  150. package/src/review/third-party-review.js +90 -16
  151. package/src/review/third-party-size.js +43 -0
  152. package/src/review/third-party-skills.js +54 -0
  153. package/src/review/verify-pr.js +1 -24
  154. package/src/roles/audit-role.js +106 -125
  155. package/src/skills/atril-cli.js +19 -1
  156. package/src/skills/atril-skills.js +5 -4
  157. package/src/skills/skills-search.js +72 -0
  158. package/src/skills/translate.js +62 -0
  159. package/src/sonar/scanner.js +116 -101
  160. package/src/steward/invariants.js +5 -4
  161. package/src/steward/phantom-sweep.js +66 -0
  162. package/src/tournament/judge.js +60 -53
  163. package/src/utils/gh-account.js +37 -0
  164. package/src/utils/git.js +0 -13
  165. package/src/utils/home-migration.js +7 -1
  166. package/src/utils/main-checkout.js +53 -0
  167. package/src/utils/qmd-collection.js +3 -1
  168. package/src/utils/welcome.js +3 -3
  169. package/templates/{skills → atril/commands}/kj-architect.md +5 -0
  170. package/templates/{skills → atril/commands}/kj-audit.md +5 -0
  171. package/templates/{skills → atril/commands}/kj-board.md +5 -0
  172. package/templates/{skills → atril/commands}/kj-code.md +5 -0
  173. package/templates/{skills → atril/commands}/kj-csv-transform.md +5 -0
  174. package/templates/{skills → atril/commands}/kj-data-report.md +5 -0
  175. package/templates/{skills → atril/commands}/kj-discover.md +5 -0
  176. package/templates/{skills → atril/commands}/kj-rag-query.md +5 -0
  177. package/templates/{skills → atril/commands}/kj-review.md +5 -0
  178. package/templates/{skills → atril/commands}/kj-security.md +5 -0
  179. package/templates/{skills → atril/commands}/kj-sonar.md +5 -0
  180. package/templates/{skills → atril/commands}/kj-sql-analysis.md +5 -0
  181. package/templates/{skills → atril/commands}/kj-test.md +5 -0
  182. package/packages/hu-board/public/utils/run-launcher.js +0 -169
  183. package/packages/hu-board/src/run-tracker.js +0 -121
  184. package/src/activity-log.js +0 -59
  185. package/src/agents/host-agent.js +0 -38
  186. package/src/agents/model-registry.js +0 -142
  187. package/src/audit/plan-adherence.js +0 -224
  188. package/src/autonomy/arbiter-role.js +0 -71
  189. package/src/autonomy/arbiter.js +0 -22
  190. package/src/autonomy/decider.js +0 -18
  191. package/src/autonomy/decision-resolver.js +0 -58
  192. package/src/autonomy/outcome-report.js +0 -55
  193. package/src/autonomy/stage-ask.js +0 -30
  194. package/src/brain/decision-tracker.js +0 -125
  195. package/src/brain/decisor.js +0 -243
  196. package/src/brain/solomon-consult.js +0 -171
  197. package/src/brain/standby-scheduler.js +0 -8
  198. package/src/budget/comparison.js +0 -96
  199. package/src/canvas/parse-md.js +0 -238
  200. package/src/canvas/schema.js +0 -101
  201. package/src/canvas/to-flat.js +0 -85
  202. package/src/canvas/validate.js +0 -163
  203. package/src/ci/dispatch.js +0 -99
  204. package/src/ci/index.js +0 -3
  205. package/src/ci/pr-diff.js +0 -26
  206. package/src/cli/register-standby.js +0 -26
  207. package/src/commands/architect.js +0 -111
  208. package/src/commands/autorun.js +0 -49
  209. package/src/commands/researcher.js +0 -54
  210. package/src/commands/resume.js +0 -72
  211. package/src/commands/review.js +0 -89
  212. package/src/commands/run.js +0 -185
  213. package/src/commands/standby.js +0 -117
  214. package/src/commands/status.js +0 -36
  215. package/src/commands/triage.js +0 -78
  216. package/src/commands/undo.js +0 -62
  217. package/src/domains/domain-loader.js +0 -245
  218. package/src/domains/domain-registry.js +0 -140
  219. package/src/domains/domain-synthesizer.js +0 -129
  220. package/src/git/automation.js +0 -433
  221. package/src/git/coder-commit-guard.js +0 -40
  222. package/src/git/hu-automation.js +0 -243
  223. package/src/git/hu-snapshot.js +0 -10
  224. package/src/git/symlink-targets.js +0 -57
  225. package/src/golden/asserter.js +0 -92
  226. package/src/golden/loader.js +0 -52
  227. package/src/golden/runner.js +0 -92
  228. package/src/golden/schema.js +0 -41
  229. package/src/guards/duplicate-members.js +0 -86
  230. package/src/guards/intent-guard.js +0 -161
  231. package/src/guards/perf-guard.js +0 -126
  232. package/src/guards/policy-guard.js +0 -90
  233. package/src/guards/policy-resolver.js +0 -85
  234. package/src/guards/secret-redactor.js +0 -71
  235. package/src/hu/acceptance-runner.js +0 -138
  236. package/src/hu/lazy-planner.js +0 -109
  237. package/src/hu/parallel-executor.js +0 -94
  238. package/src/hu/routing-metrics.js +0 -17
  239. package/src/hu/split-validator.js +0 -143
  240. package/src/hu/splitting-detector.js +0 -158
  241. package/src/hu/splitting-generator.js +0 -175
  242. package/src/hu/store.js +0 -394
  243. package/src/infrastructure/mocks.js +0 -182
  244. package/src/mcp/handlers/run-handler.js +0 -318
  245. package/src/mcp/sovereignty-guard.js +0 -113
  246. package/src/mcp/tool-arg-normalizers.js +0 -16
  247. package/src/mutate/reviewer-signal.js +0 -76
  248. package/src/orchestrator/agent-fallback.js +0 -81
  249. package/src/orchestrator/brain-coordinator.js +0 -186
  250. package/src/orchestrator/ci-integration.js +0 -139
  251. package/src/orchestrator/config-init.js +0 -426
  252. package/src/orchestrator/direct-actions.js +0 -217
  253. package/src/orchestrator/drivers/error-recovery.js +0 -287
  254. package/src/orchestrator/drivers/init-context.js +0 -238
  255. package/src/orchestrator/drivers/iteration-loop.js +0 -382
  256. package/src/orchestrator/drivers/iteration-phases/coder-and-refactorer.js +0 -69
  257. package/src/orchestrator/drivers/iteration-phases/guards.js +0 -91
  258. package/src/orchestrator/drivers/iteration-phases/handle-approved.js +0 -29
  259. package/src/orchestrator/drivers/iteration-phases/quality-gates.js +0 -125
  260. package/src/orchestrator/drivers/iteration-phases/reviewer-gate.js +0 -62
  261. package/src/orchestrator/drivers/post-loop.js +0 -404
  262. package/src/orchestrator/drivers/pre-loop-phases/auto-hu-batch.js +0 -137
  263. package/src/orchestrator/drivers/pre-loop-phases/config-deprecations.js +0 -47
  264. package/src/orchestrator/drivers/pre-loop-phases/ensure-addyosmani-skills.js +0 -84
  265. package/src/orchestrator/drivers/pre-loop-phases/inject-loaded-plan.js +0 -393
  266. package/src/orchestrator/drivers/pre-loop.js +0 -524
  267. package/src/orchestrator/drivers/run-hu-batch.js +0 -468
  268. package/src/orchestrator/feedback-enrichment.js +0 -140
  269. package/src/orchestrator/feedback-queue.js +0 -151
  270. package/src/orchestrator/flow-control.js +0 -170
  271. package/src/orchestrator/flow-runner.js +0 -365
  272. package/src/orchestrator/fs-leak-detector.js +0 -228
  273. package/src/orchestrator/hu-scheduler.js +0 -114
  274. package/src/orchestrator/hu-sub-pipeline.js +0 -642
  275. package/src/orchestrator/iteration-gate.js +0 -73
  276. package/src/orchestrator/iteration-stages.js +0 -9
  277. package/src/orchestrator/parallel-limiter.js +0 -74
  278. package/src/orchestrator/pipeline-context.js +0 -72
  279. package/src/orchestrator/post-loop-stages.js +0 -468
  280. package/src/orchestrator/pre-loop-stages.js +0 -11
  281. package/src/orchestrator/preflight-checks.js +0 -487
  282. package/src/orchestrator/repair/repair-detector.js +0 -117
  283. package/src/orchestrator/repair/repair-runner.js +0 -142
  284. package/src/orchestrator/reviewer-fallback.js +0 -45
  285. package/src/orchestrator/role-output-compressor.js +0 -189
  286. package/src/orchestrator/session-journal.js +0 -308
  287. package/src/orchestrator/solomon-escalation.js +0 -331
  288. package/src/orchestrator/solomon-rules.js +0 -212
  289. package/src/orchestrator/stages/acceptance-coverage-stage.js +0 -47
  290. package/src/orchestrator/stages/architect-stage.js +0 -172
  291. package/src/orchestrator/stages/coder-stage.js +0 -506
  292. package/src/orchestrator/stages/domain-curator-stage.js +0 -82
  293. package/src/orchestrator/stages/format-stage.js +0 -61
  294. package/src/orchestrator/stages/hu-reviewer-phases/detect-and-apply-splits.js +0 -127
  295. package/src/orchestrator/stages/hu-reviewer-stage.js +0 -419
  296. package/src/orchestrator/stages/perf-stage.js +0 -140
  297. package/src/orchestrator/stages/planner-stage.js +0 -85
  298. package/src/orchestrator/stages/rag-context-stage.js +0 -80
  299. package/src/orchestrator/stages/rag-preload-decisor.js +0 -58
  300. package/src/orchestrator/stages/research-stage.js +0 -69
  301. package/src/orchestrator/stages/reviewer-stage.js +0 -431
  302. package/src/orchestrator/stages/sonar-stage.js +0 -439
  303. package/src/orchestrator/stages/stage-classes.js +0 -84
  304. package/src/orchestrator/stages/stage-executor.js +0 -155
  305. package/src/orchestrator/stages/suite-green-stage.js +0 -62
  306. package/src/orchestrator/stages/tdd-discipline-stage.js +0 -56
  307. package/src/orchestrator/stages/tool-judge-stage.js +0 -53
  308. package/src/orchestrator/stages/triage-stage.js +0 -172
  309. package/src/orchestrator/standby.js +0 -71
  310. package/src/orchestrator/verification-gate.js +0 -183
  311. package/src/orchestrator.js +0 -22
  312. package/src/plan/adr-generator.js +0 -170
  313. package/src/plan/adr-loader.js +0 -60
  314. package/src/plan/plan-executor.js +0 -100
  315. package/src/plan/plan-validation.js +0 -4
  316. package/src/prompts/acceptance-coverage.js +0 -32
  317. package/src/prompts/arbiter.js +0 -38
  318. package/src/prompts/architect.js +0 -103
  319. package/src/prompts/hu-reviewer.js +0 -244
  320. package/src/prompts/tool-correctness-judge.js +0 -31
  321. package/src/prompts/triage.js +0 -57
  322. package/src/rag/embedder.js +0 -2
  323. package/src/rag/embedders/_cloud-base.js +0 -2
  324. package/src/rag/embedders/cohere.js +0 -2
  325. package/src/rag/embedders/mistral.js +0 -2
  326. package/src/rag/embedders/onnx.js +0 -2
  327. package/src/rag/embedders/openai.js +0 -2
  328. package/src/rag/embedders/voyage.js +0 -2
  329. package/src/rag/rerank.js +0 -4
  330. package/src/rag/where-parser.js +0 -4
  331. package/src/repeat-detector.js +0 -88
  332. package/src/review/diff-generator.js +0 -112
  333. package/src/review/git-stash-helper.js +0 -104
  334. package/src/review/schema.js +0 -31
  335. package/src/review/scope-filter.js +0 -152
  336. package/src/review/snapshot-diff.js +0 -122
  337. package/src/review/tdd-discipline.js +0 -90
  338. package/src/review/tdd-policy.js +0 -69
  339. package/src/roles/acceptance-coverage-role.js +0 -78
  340. package/src/roles/architect-role.js +0 -77
  341. package/src/roles/coder-role.js +0 -113
  342. package/src/roles/commiter-role.js +0 -113
  343. package/src/roles/domain-curator-role.js +0 -134
  344. package/src/roles/hu-reviewer-role.js +0 -64
  345. package/src/roles/impeccable-role.js +0 -85
  346. package/src/roles/index.js +0 -18
  347. package/src/roles/karajan-brain-role.js +0 -134
  348. package/src/roles/perf-role.js +0 -122
  349. package/src/roles/planner-role.js +0 -151
  350. package/src/roles/refactorer-role.js +0 -30
  351. package/src/roles/repairer-role.js +0 -181
  352. package/src/roles/researcher-role.js +0 -70
  353. package/src/roles/reviewer-role.js +0 -115
  354. package/src/roles/security-role.js +0 -73
  355. package/src/roles/solomon-role.js +0 -271
  356. package/src/roles/sonar-role.js +0 -72
  357. package/src/roles/tester-role.js +0 -235
  358. package/src/roles/tool-correctness-judge-role.js +0 -78
  359. package/src/roles/triage-role.js +0 -99
  360. package/src/session/journal/decisions-writer.js +0 -200
  361. package/src/session/journal/iteration-logger.js +0 -194
  362. package/src/session/journal/summary-writer.js +0 -320
  363. package/src/session/journal/tree-writer.js +0 -164
  364. package/src/session/journal/write-all.js +0 -89
  365. package/src/session-cleanup.js +0 -116
  366. package/src/skills/semantic-detector.js +0 -167
  367. package/src/skills/skill-detector.js +0 -385
  368. package/src/sonar/cloud-scanner.js +0 -78
  369. package/src/tracker-bootstrap.js +0 -44
  370. package/src/types/index.js +0 -38
  371. package/src/types/policy.js +0 -43
  372. package/src/types/solomon.js +0 -87
  373. package/src/utils/async-lock.js +0 -31
  374. package/src/utils/budget.js +0 -229
  375. package/src/utils/cwd-confirm.js +0 -39
  376. package/src/utils/display/event-handlers.js +0 -403
  377. package/src/utils/display/formatters.js +0 -132
  378. package/src/utils/display/header.js +0 -47
  379. package/src/utils/display/session-summary.js +0 -118
  380. package/src/utils/display/solomon.js +0 -42
  381. package/src/utils/pricing.js +0 -29
  382. package/src/utils/quota-simulator.js +0 -56
  383. package/src/utils/role-assigner.js +0 -137
  384. package/src/utils/rtk-wrapper.js +0 -87
  385. package/src/utils/run-registry.js +0 -9
  386. package/src/utils/status-dashboard.js +0 -254
  387. package/src/utils/tool-call-extractor.js +0 -56
  388. package/src/webperf/devtools-detect.js +0 -112
  389. package/src/webperf/webperf-role-integration.js +0 -66
  390. package/templates/skills/kj-run.md +0 -73
@@ -1,287 +0,0 @@
1
- /**
2
- * Error-recovery driver — extracted from src/orchestrator/flow-runner.js
3
- * in TSK-0335 (Oleada 3 of the v2.7.4 audit refactor).
4
- *
5
- * Five handlers that react to pipeline-level failure signals and decide
6
- * whether to retry, pause, or escalate to Solomon:
7
- *
8
- * - handleStandbyResult: rate-limit / provider-outage →
9
- * Solomon decides skip/retry/wait/pause.
10
- * - emitSolomonAlerts: forward Solomon-rules findings to
11
- * the progress stream.
12
- * - handleSolomonCheck: evaluate Solomon-rules context,
13
- * escalate critical alerts (direct to
14
- * human without Brain, via Solomon
15
- * with Brain).
16
- * - checkSolomonCriticalAlerts: non-Brain branch — ask the user
17
- * whether to continue/pause/stop on
18
- * critical alerts.
19
- * - handleReviewerRetryAndSolomon: reviewer sub-loop limit → invoke
20
- * Solomon to resolve the stall.
21
- *
22
- * These were extracted verbatim; no behavior change. flow-runner.js now
23
- * imports them instead of defining them. Part of breaking up the 2254-LOC
24
- * god-module — see docs/ARCHITECTURE.md and the TSK-0335 acceptance
25
- * criteria.
26
- */
27
-
28
- import { invokeSolomon } from "../solomon-escalation.js";
29
- import { saveSession, pauseSession } from "../../session/store.js";
30
- import {
31
- setReviewerFeedback, setAlternativeAgent, resetRetryCount,
32
- incrementRetryCount,
33
- } from "../../session/mutators.js";
34
- import { emitProgress, makeEvent } from "../../utils/events.js";
35
- import { tryCiComment } from "../ci-integration.js";
36
-
37
- export async function handleStandbyResult({ stageResult, session, emitter, eventBase, i, stage, logger, config, askQuestion }) {
38
- if (stageResult?.action !== "standby") {
39
- return { handled: false };
40
- }
41
-
42
- const isOutage = stageResult.standbyInfo.isProviderOutage;
43
- const agent = stageResult.standbyInfo.agent;
44
- const cooldownUntil = stageResult.standbyInfo.cooldownUntil;
45
- const cooldownMs = stageResult.standbyInfo.cooldownMs;
46
-
47
- // Rate limit = out of normal flow → Solomon decides immediately
48
- const solomonResult = await invokeSolomon({
49
- config, logger, emitter, eventBase, stage: `${stage}_rate_limit`, askQuestion, session,
50
- iteration: i,
51
- conflict: {
52
- stage: `${stage}_rate_limit`,
53
- task: session.task,
54
- iterationCount: i,
55
- maxIterations: config?.max_iterations || 5,
56
- cooldownUntil,
57
- cooldownMs,
58
- history: [{
59
- agent: stage,
60
- feedback: `Agent "${agent}" rate-limited. ${isOutage ? "Provider outage (5xx)." : "API rate limit (429)."} ${cooldownUntil ? `Cooldown until ${cooldownUntil}.` : ""}`
61
- }]
62
- }
63
- });
64
-
65
- if (solomonResult.action === "approve") {
66
- // Solomon says skip is safe — only allowed after exhausting alternatives
67
- logger.info(`Solomon: skip ${stage} after evaluating risk (agent "${agent}" rate-limited)`);
68
- emitProgress(emitter, makeEvent(`${stage}:rate_limit`, { ...eventBase, stage }, {
69
- status: "ok",
70
- message: `Solomon: skip ${stage} (low risk, agent "${agent}" unavailable)`,
71
- detail: { agent, solomonAction: "approve" }
72
- }));
73
- return { handled: true, action: "skip" };
74
- }
75
-
76
- if (solomonResult.action === "continue") {
77
- // Solomon says: wait for cooldown, or retry with alternative agent
78
- const altAgent = solomonResult.alternativeAgent;
79
- const waitTarget = solomonResult.waitUntil;
80
-
81
- if (waitTarget) {
82
- const waitMs = Math.max(0, new Date(waitTarget).getTime() - Date.now());
83
- if (waitMs > 0 && waitMs < 10 * 60 * 1000) {
84
- logger.info(`Solomon: wait ${Math.round(waitMs / 1000)}s for cooldown, then retry ${stage}`);
85
- await new Promise(r => setTimeout(r, waitMs));
86
- }
87
- }
88
-
89
- if (altAgent) {
90
- logger.info(`Solomon: retry ${stage} with alternative agent "${altAgent}"`);
91
- setAlternativeAgent(session, stage, altAgent);
92
- }
93
-
94
- if (solomonResult.humanGuidance) {
95
- setReviewerFeedback(session, `Solomon guidance: ${solomonResult.humanGuidance}`);
96
- }
97
- await saveSession(session);
98
- return { handled: true, action: "retry_reviewer_only" };
99
- }
100
-
101
- if (solomonResult.action === "pause") {
102
- return {
103
- handled: true,
104
- action: "return",
105
- result: { paused: true, sessionId: session.id, question: solomonResult.question, context: "rate_limit" }
106
- };
107
- }
108
-
109
- // Solomon couldn't resolve — pause
110
- await pauseSession(session, {
111
- question: `Agent "${agent}" rate-limited. Solomon could not resolve.`,
112
- context: { iteration: i, stage, reason: "rate_limit" }
113
- });
114
- return {
115
- handled: true,
116
- action: "return",
117
- result: { paused: true, sessionId: session.id, question: `Agent "${agent}" rate-limited`, context: "rate_limit" }
118
- };
119
- }
120
-
121
-
122
- function emitSolomonAlerts(alerts, emitter, eventBase, logger) {
123
- for (const alert of alerts) {
124
- emitProgress(emitter, makeEvent("brain:rules-alert", { ...eventBase, stage: "brain" }, {
125
- status: alert.severity === "critical" ? "fail" : "warn",
126
- message: alert.message,
127
- detail: alert.detail
128
- }));
129
- logger.warn(`Rules alert [${alert.rule}]: ${alert.message}`);
130
- }
131
- }
132
-
133
- export async function handleSolomonCheck({ config, session, emitter, eventBase, logger, task, i, askQuestion, ciEnabled, blockingIssues, brainCtx }) {
134
- if (config.pipeline?.solomon?.enabled === false) return { action: "continue" };
135
-
136
- try {
137
- const { evaluateRules, buildRulesContext } = await import("../solomon-rules.js");
138
- const rulesContext = await buildRulesContext({ session, task, iteration: i, blockingIssues });
139
- const rulesResult = evaluateRules(rulesContext, config.solomon?.rules);
140
-
141
- if (rulesResult.alerts.length > 0) {
142
- emitSolomonAlerts(rulesResult.alerts, emitter, eventBase, logger);
143
- // Brain gateway: when Brain is the orchestrator, rule alerts are telemetry.
144
- // On critical alerts Brain consults Solomon (AI judge). Only if Solomon can't
145
- // resolve does Brain escalate to human. Solomon-rules never prompts directly.
146
- if (!brainCtx?.enabled) {
147
- const pauseResult = await checkSolomonCriticalAlerts({ rulesResult, askQuestion, session, i });
148
- if (pauseResult) return pauseResult;
149
- } else if (rulesResult.hasCritical) {
150
- const criticalAlerts = rulesResult.alerts.filter(a => a.severity === "critical");
151
- brainCtx.ruleAlerts = brainCtx.ruleAlerts || [];
152
- brainCtx.ruleAlerts.push(...criticalAlerts);
153
- logger.info(`Brain: ${criticalAlerts.length} critical rule alert(s) — consulting Solomon`);
154
-
155
- const alertSummary = criticalAlerts.map(a => a.message).join("; ");
156
- const solomonOpinion = await invokeSolomon({
157
- config, logger, emitter, eventBase, stage: "brain-dilemma", askQuestion, session, iteration: i,
158
- conflict: {
159
- stage: "brain-dilemma",
160
- task,
161
- iterationCount: i,
162
- maxIterations: config.max_iterations,
163
- dilemma: `Brain detected critical rule alerts: ${alertSummary}. Should we continue iterating, pause for human, or stop?`,
164
- ruleAlerts: criticalAlerts,
165
- blockingIssues: blockingIssues || [],
166
- history: (session.checkpoints || []).filter(cp => cp.stage === "reviewer").slice(-5).map(cp => ({ iteration: cp.iteration, feedback: cp.note || "" }))
167
- }
168
- });
169
-
170
- if (solomonOpinion.action === "pause") {
171
- logger.info("Brain: Solomon advised pause — escalating to human");
172
- return { action: "return", result: { paused: true, sessionId: session.id, question: solomonOpinion.question || `Brain+Solomon paused: ${alertSummary}`, context: "brain_solomon_dilemma" } };
173
- }
174
- if (solomonOpinion.action === "approve") {
175
- logger.info("Brain: Solomon advised proceeding — treating as approved");
176
- return { action: "continue", approved: true };
177
- }
178
- // action === "continue" | "subtask" | fallback → Brain continues the loop
179
- logger.info(`Brain: Solomon said '${solomonOpinion.action}' — continuing loop`);
180
- }
181
- }
182
-
183
- if (ciEnabled && session.ci_pr_number) {
184
- const alerts = rulesResult.alerts || [];
185
- const alertMsg = alerts.length > 0
186
- ? alerts.map(a => `- [${a.severity}] ${a.message}`).join("\n")
187
- : "No anomalies detected";
188
- await tryCiComment({
189
- config, session, logger,
190
- agent: "Solomon",
191
- body: `Supervisor check iteration ${i}: ${alertMsg}`
192
- });
193
- }
194
- } catch (err) {
195
- logger.warn(`Solomon rules evaluation failed: ${err.message}`);
196
- }
197
-
198
- return { action: "continue" };
199
- }
200
-
201
- async function checkSolomonCriticalAlerts({ rulesResult, askQuestion, session, i }) {
202
- if (!rulesResult.hasCritical || !askQuestion) return null;
203
-
204
- const alertSummary = rulesResult.alerts
205
- .filter(a => a.severity === "critical")
206
- .map(a => a.message)
207
- .join("\n");
208
- const question = [
209
- "Solomon detected critical issues:",
210
- alertSummary,
211
- "",
212
- "What should we do?",
213
- "1 = Continue anyway",
214
- "2 = Pause the session",
215
- "3 = Stop the session",
216
- "",
217
- "Type 1, 2, or 3:"
218
- ].join("\n");
219
- const answer = await askQuestion(question, { iteration: i, stage: "solomon" });
220
- const trimmed = (answer || "").trim().toLowerCase();
221
- const shouldPause = !answer
222
- || trimmed === "2" || trimmed === "3"
223
- || trimmed.startsWith("pause") || trimmed.startsWith("stop");
224
- if (shouldPause) {
225
- await pauseSession(session, {
226
- question: `Solomon supervisor paused: ${alertSummary}`,
227
- context: { iteration: i, stage: "solomon", alerts: rulesResult.alerts }
228
- });
229
- return { action: "pause", result: { paused: true, sessionId: session.id, reason: "solomon_alert" } };
230
- }
231
- return null;
232
- }
233
-
234
- export async function handleReviewerRetryAndSolomon({ config, session, emitter, eventBase, logger, review, task, i, askQuestion }) {
235
- setReviewerFeedback(session, review.blocking_issues
236
- .map((x) => {
237
- const parts = [`[${x.severity || "high"}] ${x.id || "ISSUE"}: ${x.description || "Missing description"}`];
238
- if (x.file) parts.push(` File: ${x.file}${x.line ? `:${x.line}` : ""}`);
239
- if (x.suggested_fix) parts.push(` Fix: ${x.suggested_fix}`);
240
- return parts.join("\n");
241
- })
242
- .join("\n\n"));
243
- incrementRetryCount(session, "reviewer");
244
- await saveSession(session);
245
-
246
- const maxReviewerRetries = config.session.max_reviewer_retries ?? config.session.fail_fast_repeats;
247
- if (session.reviewer_retry_count < maxReviewerRetries) {
248
- return { action: "continue" };
249
- }
250
-
251
- emitProgress(
252
- emitter,
253
- makeEvent("solomon:escalate", { ...eventBase, stage: "reviewer" }, {
254
- message: `Reviewer sub-loop limit reached (${session.reviewer_retry_count}/${maxReviewerRetries})`,
255
- detail: { subloop: "reviewer", retryCount: session.reviewer_retry_count, limit: maxReviewerRetries }
256
- })
257
- );
258
-
259
- const solomonResult = await invokeSolomon({
260
- config, logger, emitter, eventBase, stage: "reviewer", askQuestion, session, iteration: i,
261
- conflict: {
262
- stage: "reviewer",
263
- task,
264
- iterationCount: session.reviewer_retry_count,
265
- maxIterations: maxReviewerRetries,
266
- history: [{ agent: "reviewer", feedback: session.last_reviewer_feedback }]
267
- }
268
- });
269
-
270
- if (solomonResult.action === "pause") {
271
- return { action: "return", result: { paused: true, sessionId: session.id, question: solomonResult.question, context: "reviewer_fail_fast" } };
272
- }
273
- if (solomonResult.action === "continue") {
274
- if (solomonResult.humanGuidance) {
275
- // Append, not overwrite — keep the reviewer's blocking issues context.
276
- setReviewerFeedback(session, `${session.last_reviewer_feedback}\nUser guidance: ${solomonResult.humanGuidance}`);
277
- }
278
- resetRetryCount(session, "reviewer");
279
- await saveSession(session);
280
- return { action: "continue" };
281
- }
282
- if (solomonResult.action === "subtask") {
283
- return { action: "return", result: { paused: true, sessionId: session.id, subtask: solomonResult.subtask, context: "reviewer_subtask" } };
284
- }
285
-
286
- return { action: "continue" };
287
- }
@@ -1,238 +0,0 @@
1
- /**
2
- * Init-context driver — extracted from src/orchestrator/flow-runner.js in
3
- * TSK-0335 (Oleada 3 of the v2.7.4 audit refactor).
4
- *
5
- * Builds the PipelineContext for runFlow: loads config, resolves roles,
6
- * wires budget tracker, attaches RTK wrappers, starts the HU Board,
7
- * loads product context, creates the session, runs the pre-loop stages,
8
- * and sets up the session journal + git automation.
9
- *
10
- * Extracted verbatim; no behavior change. Split from pre-loop.js because
11
- * together they would exceed the 600-LOC/driver ceiling set by the
12
- * TSK-0335 acceptance criteria.
13
- */
14
-
15
- import { createAgent } from "../../agents/index.js";
16
- import { resolveRole } from "../../config.js";
17
- import { resolveReviewProfile } from "../../review/profiles.js";
18
- import { RepeatDetector, getRepeatThreshold } from "../../repeat-detector.js";
19
- import { emitProgress, makeEvent } from "../../utils/events.js";
20
- import { prepareGitAutomation } from "../../git/automation.js";
21
- import { CoderRole } from "../../roles/coder-role.js";
22
- import { PipelineContext } from "../pipeline-context.js";
23
- import { detectRtk } from "../../utils/rtk-detect.js";
24
- import { RtkSavingsTracker } from "../../utils/rtk-wrapper.js";
25
- import { setProjectDir as setDiffProjectDir } from "../../review/diff-generator.js";
26
- import {
27
- loadProductContext, resolvePipelineFlags, createBudgetManager,
28
- initializeSession, autoInit,
29
- } from "../config-init.js";
30
- import {
31
- createJournalDir, writePreLoopJournal, buildPlanSummary,
32
- } from "../session-journal.js";
33
- import { setPgCard, setJournalContext } from "../../session/mutators.js";
34
- import { getRunContext } from "../../utils/run-context.js";
35
- import { getIntegration } from "../integrations.js";
36
- import { tryAutoStartBoard } from "./post-loop.js";
37
- import { runPreLoopStages } from "./pre-loop.js";
38
-
39
- /**
40
- * KJC-BUG-0324: the coder is built before the pre-loop, with the run's first
41
- * config, so what the pre-loop resolves (the Domain Curator's domainContext,
42
- * the methodology) never reached its prompt. The run and the coder both take
43
- * the resolved config; the coder is initialized after this.
44
- */
45
- export function adoptPreLoopConfig(ctx, updatedConfig) {
46
- ctx.config = updatedConfig;
47
- ctx.coderRoleInstance.config = updatedConfig;
48
- }
49
-
50
- export async function initFlowContext({ task, config, logger, emitter, askQuestion, pgTaskId, pgProject, flags, preexisting = null }) {
51
- // Auto-init .karajan/ if missing (copies coder-rules, review-rules, role templates)
52
- const initProjectDir = config.projectDir || process.cwd();
53
- await autoInit(initProjectDir, logger);
54
-
55
- // Smart role assignment: detect installed AIs and assign to roles
56
- // Only runs if: (a) no roles configured AND (b) not in test environment
57
- const needsAssignment = !config.roles?.coder?.provider && !config.coder && process.env.NODE_ENV !== "test" && !process.env.VITEST;
58
- if (needsAssignment) {
59
- try {
60
- const { autoAssignRoles, applyRoleAssignments } = await import("../../utils/role-assigner.js");
61
- const { assignments } = await autoAssignRoles(logger);
62
- if (assignments) config = applyRoleAssignments({ ...config }, assignments);
63
- } catch { /* non-blocking — defaults will be used */ }
64
- }
65
-
66
- // Scope all git diffs to projectDir (prevents leaking unrelated branch changes)
67
- // When running from a subdirectory of a git repo, use relative path as scope
68
- let diffScope = config.projectDir || null;
69
- if (!diffScope) {
70
- try {
71
- // Audit follow-up: same execSync→execFileSync migration as #555.
72
- const { execFileSync } = await import("node:child_process");
73
- const repoRoot = execFileSync("git", ["rev-parse", "--show-toplevel"], { encoding: "utf8" }).trim();
74
- const cwd = process.cwd();
75
- if (cwd !== repoRoot && cwd.startsWith(repoRoot)) {
76
- diffScope = cwd.slice(repoRoot.length + 1);
77
- logger.info(`Running from subdirectory — diff scoped to ${diffScope}/`);
78
- }
79
- } catch { /* git not available */ }
80
- }
81
- // TSK-0338: write into the per-run AsyncLocalStorage context instead of
82
- // mutating module-level state. Falls back to setDiffProjectDir() when no
83
- // run context is active (legacy CLI callers, tests not going through
84
- // runFlow). The write-to-both keeps back-compat without trading isolation.
85
- const runCtx = getRunContext();
86
- if (runCtx) runCtx.projectDir = diffScope;
87
- else setDiffProjectDir(diffScope);
88
-
89
- // Auto-detect Chrome DevTools MCP
90
- const { detectDevToolsMcp } = await import("../../webperf/devtools-detect.js");
91
- const devToolsAvailable = await detectDevToolsMcp(logger);
92
- if (devToolsAvailable) {
93
- config = { ...config, webperf: { ...config.webperf, devtools_mcp: true } };
94
- }
95
-
96
- const ctx = new PipelineContext({ config, session: null, logger, emitter, task, flags });
97
- ctx.askQuestion = askQuestion;
98
- ctx.pgTaskId = pgTaskId;
99
- ctx.pgProject = pgProject;
100
-
101
- ctx.coderRole = resolveRole(config, "coder");
102
- ctx.reviewerRole = resolveRole(config, "reviewer");
103
- ctx.refactorerRole = resolveRole(config, "refactorer");
104
- ctx.pipelineFlags = resolvePipelineFlags(config);
105
- ctx.repeatDetector = new RepeatDetector({ threshold: getRepeatThreshold(config) });
106
- ctx.coderRoleInstance = new CoderRole({ config, logger, emitter, createAgentFn: createAgent, askHost: askQuestion });
107
- ctx.startedAt = Date.now();
108
- ctx.eventBase = { sessionId: null, iteration: 0, stage: null, startedAt: ctx.startedAt };
109
- const { budgetTracker, budgetLimit, budgetSummary, trackBudget } = createBudgetManager({
110
- config,
111
- emitter,
112
- eventBase: ctx.eventBase,
113
- // Provides fresh compression data for "With KJ vs Without KJ" comparison
114
- // (KJC-TSK-0274). Invoked on every budgetSummary() call.
115
- getCompressionStats: () => ({
116
- rtkSavings: ctx.rtkTracker?.hasData() ? ctx.rtkTracker.summary() : (ctx.session?.rtk_savings || null),
117
- brainCtx: ctx.brainCtx || null,
118
- }),
119
- });
120
- ctx.budgetTracker = budgetTracker;
121
- ctx.budgetLimit = budgetLimit;
122
- ctx.budgetSummary = budgetSummary;
123
- ctx.trackBudget = trackBudget;
124
-
125
- // --- RTK detection ---
126
- const rtkResult = await detectRtk();
127
- if (rtkResult.available) {
128
- config = { ...config, rtk: { available: true, version: rtkResult.version } };
129
- // KJC-BUG-0115: rtk MUST NOT wrap the pipeline's internal git/diff
130
- // commands. `rtk git diff` emits a compressed summary without
131
- // `diff --git` headers, so every consumer that parses the output
132
- // (tdd-policy extractChangedFiles, reviewer diffs, status checks)
133
- // sees an empty change set — in the field this made the TDD gate
134
- // fail forever with "(2 src, 0 test)" while real tests existed.
135
- // RTK still saves tokens where it belongs: inside the coder agent's
136
- // own shell, via its Claude Code hook. Detection is kept so the
137
- // config advertises availability to agents.
138
- ctx.rtkTracker = new RtkSavingsTracker();
139
- logger.info(`RTK detected (${rtkResult.version}) — available to agents (internal git/diff stay unwrapped)`);
140
- emitProgress(emitter, makeEvent("rtk:detected", ctx.eventBase, {
141
- message: "RTK detected — available to agents",
142
- detail: { version: rtkResult.version, executorType: "local" }
143
- }));
144
- }
145
-
146
- // --- HU Board auto-start ---
147
- await tryAutoStartBoard(config, logger, emitter, ctx.eventBase);
148
-
149
- // --- Product Context ---
150
- const ctxProjectDir = config.projectDir || process.cwd();
151
- const { content: productContext, source: productContextSource } = await loadProductContext(ctxProjectDir);
152
- if (productContext) {
153
- config = { ...config, productContext };
154
- logger.info(`Product context loaded from ${productContextSource}`);
155
- emitProgress(emitter, makeEvent("context:loaded", ctx.eventBase, {
156
- message: "Product context loaded",
157
- detail: { source: productContextSource }
158
- }));
159
- }
160
-
161
- ctx.session = await initializeSession({ task, config, flags, pgTaskId, pgProject });
162
- ctx.eventBase.sessionId = ctx.session.id;
163
-
164
- // Karajan Brain: initialize runtime context (opt-in via config.brain.enabled)
165
- const { createBrainContext, isBrainEnabled } = await import("../brain-coordinator.js");
166
- ctx.brainCtx = createBrainContext({ enabled: isBrainEnabled(config) });
167
- if (ctx.brainCtx.enabled) {
168
- logger.info("Karajan Brain enabled — feedback queue, verification, compression active");
169
- }
170
-
171
- const trackerResult = await getIntegration("tracker")?.onSessionStart?.({
172
- session: ctx.session, config, logger, pgTaskId, pgProject,
173
- });
174
- ctx.pgCard = trackerResult?.pgCard ?? null;
175
- setPgCard(ctx.session, ctx.pgCard || null);
176
-
177
- emitProgress(
178
- emitter,
179
- makeEvent("session:start", ctx.eventBase, {
180
- message: "Session started",
181
- detail: { task, coder: ctx.coderRole.provider, reviewer: ctx.reviewerRole.provider, maxIterations: config.max_iterations }
182
- })
183
- );
184
-
185
- // KJC-BUG-0058: on `kj resume`, rehydrate stage results from the loaded
186
- // session so completed pre-loop stages (researcher, architect, planner…)
187
- // are skipped instead of re-executed. `setStageResult` mirrors writes
188
- // into both `stage_results` (full payload) and `stages_completed` (flat
189
- // array) — copying `stage_results` here is sufficient because
190
- // `runPreLoopStages` only checks membership in `stageResults`.
191
- ctx.stageResults = { ...(ctx.session?.stage_results || {}) };
192
- ctx.sonarState = { issuesInitial: null, issuesFinal: null };
193
-
194
- const preLoopResult = await runPreLoopStages({ config, logger, emitter, eventBase: ctx.eventBase, session: ctx.session, flags, pipelineFlags: ctx.pipelineFlags, coderRole: ctx.coderRole, trackBudget: ctx.trackBudget, task, askQuestion, pgTaskId, pgProject, stageResults: ctx.stageResults, brainCtx: ctx.brainCtx });
195
- ctx.plannedTask = preLoopResult.plannedTask;
196
- adoptPreLoopConfig(ctx, preLoopResult.updatedConfig);
197
-
198
- // --- Session Journal: persist pre-loop outputs + display plan summary ---
199
- const reportDir = ctx.config.output?.report_dir || ".reviews";
200
- try {
201
- ctx.journalDir = await createJournalDir(reportDir, ctx.session.id);
202
- const journalFiles = await writePreLoopJournal(ctx.journalDir, ctx.stageResults);
203
- ctx.journalFiles = journalFiles;
204
- ctx.journalIterations = [];
205
- ctx.journalDecisions = [];
206
-
207
- // Attach journal state to session so finalizeApprovedSession can access it
208
- setJournalContext(ctx.session, {
209
- dir: ctx.journalDir,
210
- files: journalFiles,
211
- iterations: ctx.journalIterations,
212
- decisions: ctx.journalDecisions,
213
- startedAt: ctx.startedAt,
214
- });
215
-
216
- // Display plan summary in console before iteration loop
217
- const planSummary = buildPlanSummary({
218
- pipelineFlags: ctx.pipelineFlags,
219
- config: ctx.config,
220
- stageResults: ctx.stageResults,
221
- task
222
- });
223
- console.log(planSummary);
224
- } catch (err) {
225
- logger.warn(`Journal init failed (non-blocking): ${err.message}`);
226
- ctx.journalDir = null;
227
- ctx.journalFiles = [];
228
- ctx.journalIterations = [];
229
- ctx.journalDecisions = [];
230
- }
231
-
232
- ctx.gitCtx = await prepareGitAutomation({ config: ctx.config, task, logger, session: ctx.session, preexisting });
233
- const projectDir = ctx.config.projectDir || process.cwd();
234
- ctx.reviewRules = (await resolveReviewProfile({ mode: ctx.config.review_mode, projectDir })).rules;
235
- await ctx.coderRoleInstance.init();
236
-
237
- return ctx;
238
- }