@urateam/core 0.1.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 (620) hide show
  1. package/dist/__tests__/assembler.test.d.ts +2 -0
  2. package/dist/__tests__/assembler.test.d.ts.map +1 -0
  3. package/dist/__tests__/assembler.test.js +63 -0
  4. package/dist/__tests__/assembler.test.js.map +1 -0
  5. package/dist/__tests__/auth-check.test.d.ts +2 -0
  6. package/dist/__tests__/auth-check.test.d.ts.map +1 -0
  7. package/dist/__tests__/auth-check.test.js +88 -0
  8. package/dist/__tests__/auth-check.test.js.map +1 -0
  9. package/dist/__tests__/auto-merge.test.d.ts +15 -0
  10. package/dist/__tests__/auto-merge.test.d.ts.map +1 -0
  11. package/dist/__tests__/auto-merge.test.js +428 -0
  12. package/dist/__tests__/auto-merge.test.js.map +1 -0
  13. package/dist/__tests__/bec89-unified-schema.test.d.ts +2 -0
  14. package/dist/__tests__/bec89-unified-schema.test.d.ts.map +1 -0
  15. package/dist/__tests__/bec89-unified-schema.test.js +235 -0
  16. package/dist/__tests__/bec89-unified-schema.test.js.map +1 -0
  17. package/dist/__tests__/conflict-detector.test.d.ts +2 -0
  18. package/dist/__tests__/conflict-detector.test.d.ts.map +1 -0
  19. package/dist/__tests__/conflict-detector.test.js +206 -0
  20. package/dist/__tests__/conflict-detector.test.js.map +1 -0
  21. package/dist/__tests__/coordination.test.d.ts +2 -0
  22. package/dist/__tests__/coordination.test.d.ts.map +1 -0
  23. package/dist/__tests__/coordination.test.js +257 -0
  24. package/dist/__tests__/coordination.test.js.map +1 -0
  25. package/dist/__tests__/db-postgres.test.d.ts +14 -0
  26. package/dist/__tests__/db-postgres.test.d.ts.map +1 -0
  27. package/dist/__tests__/db-postgres.test.js +289 -0
  28. package/dist/__tests__/db-postgres.test.js.map +1 -0
  29. package/dist/__tests__/db.test.d.ts +2 -0
  30. package/dist/__tests__/db.test.d.ts.map +1 -0
  31. package/dist/__tests__/db.test.js +182 -0
  32. package/dist/__tests__/db.test.js.map +1 -0
  33. package/dist/__tests__/deep-review.test.d.ts +2 -0
  34. package/dist/__tests__/deep-review.test.d.ts.map +1 -0
  35. package/dist/__tests__/deep-review.test.js +322 -0
  36. package/dist/__tests__/deep-review.test.js.map +1 -0
  37. package/dist/__tests__/devcontainer.test.d.ts +2 -0
  38. package/dist/__tests__/devcontainer.test.d.ts.map +1 -0
  39. package/dist/__tests__/devcontainer.test.js +89 -0
  40. package/dist/__tests__/devcontainer.test.js.map +1 -0
  41. package/dist/__tests__/distributed-lock.test.d.ts +18 -0
  42. package/dist/__tests__/distributed-lock.test.d.ts.map +1 -0
  43. package/dist/__tests__/distributed-lock.test.js +237 -0
  44. package/dist/__tests__/distributed-lock.test.js.map +1 -0
  45. package/dist/__tests__/e2e-pipeline.test.d.ts +25 -0
  46. package/dist/__tests__/e2e-pipeline.test.d.ts.map +1 -0
  47. package/dist/__tests__/e2e-pipeline.test.js +517 -0
  48. package/dist/__tests__/e2e-pipeline.test.js.map +1 -0
  49. package/dist/__tests__/error-classifier.test.d.ts +2 -0
  50. package/dist/__tests__/error-classifier.test.d.ts.map +1 -0
  51. package/dist/__tests__/error-classifier.test.js +33 -0
  52. package/dist/__tests__/error-classifier.test.js.map +1 -0
  53. package/dist/__tests__/executor-integration.test.d.ts +11 -0
  54. package/dist/__tests__/executor-integration.test.d.ts.map +1 -0
  55. package/dist/__tests__/executor-integration.test.js +246 -0
  56. package/dist/__tests__/executor-integration.test.js.map +1 -0
  57. package/dist/__tests__/executor-issue-id.test.d.ts +13 -0
  58. package/dist/__tests__/executor-issue-id.test.d.ts.map +1 -0
  59. package/dist/__tests__/executor-issue-id.test.js +211 -0
  60. package/dist/__tests__/executor-issue-id.test.js.map +1 -0
  61. package/dist/__tests__/executor.test.d.ts +2 -0
  62. package/dist/__tests__/executor.test.d.ts.map +1 -0
  63. package/dist/__tests__/executor.test.js +164 -0
  64. package/dist/__tests__/executor.test.js.map +1 -0
  65. package/dist/__tests__/extract-handoff.test.d.ts +2 -0
  66. package/dist/__tests__/extract-handoff.test.d.ts.map +1 -0
  67. package/dist/__tests__/extract-handoff.test.js +131 -0
  68. package/dist/__tests__/extract-handoff.test.js.map +1 -0
  69. package/dist/__tests__/fail-on-auto-commit.test.d.ts +2 -0
  70. package/dist/__tests__/fail-on-auto-commit.test.d.ts.map +1 -0
  71. package/dist/__tests__/fail-on-auto-commit.test.js +156 -0
  72. package/dist/__tests__/fail-on-auto-commit.test.js.map +1 -0
  73. package/dist/__tests__/fixtures/webhook-comment.json +5 -0
  74. package/dist/__tests__/fixtures/webhook-state-change.json +15 -0
  75. package/dist/__tests__/force-push-agent-branches.test.d.ts +12 -0
  76. package/dist/__tests__/force-push-agent-branches.test.d.ts.map +1 -0
  77. package/dist/__tests__/force-push-agent-branches.test.js +348 -0
  78. package/dist/__tests__/force-push-agent-branches.test.js.map +1 -0
  79. package/dist/__tests__/github-webhook.test.d.ts +2 -0
  80. package/dist/__tests__/github-webhook.test.d.ts.map +1 -0
  81. package/dist/__tests__/github-webhook.test.js +370 -0
  82. package/dist/__tests__/github-webhook.test.js.map +1 -0
  83. package/dist/__tests__/gitlab.test.d.ts +28 -0
  84. package/dist/__tests__/gitlab.test.d.ts.map +1 -0
  85. package/dist/__tests__/gitlab.test.js +241 -0
  86. package/dist/__tests__/gitlab.test.js.map +1 -0
  87. package/dist/__tests__/integration/auto-commit.test.d.ts +2 -0
  88. package/dist/__tests__/integration/auto-commit.test.d.ts.map +1 -0
  89. package/dist/__tests__/integration/auto-commit.test.js +207 -0
  90. package/dist/__tests__/integration/auto-commit.test.js.map +1 -0
  91. package/dist/__tests__/integration/bec99-cross-worktree-guard.test.d.ts +10 -0
  92. package/dist/__tests__/integration/bec99-cross-worktree-guard.test.d.ts.map +1 -0
  93. package/dist/__tests__/integration/bec99-cross-worktree-guard.test.js +183 -0
  94. package/dist/__tests__/integration/bec99-cross-worktree-guard.test.js.map +1 -0
  95. package/dist/__tests__/integration/reproduce-bec99.test.d.ts +32 -0
  96. package/dist/__tests__/integration/reproduce-bec99.test.d.ts.map +1 -0
  97. package/dist/__tests__/integration/reproduce-bec99.test.js +243 -0
  98. package/dist/__tests__/integration/reproduce-bec99.test.js.map +1 -0
  99. package/dist/__tests__/integration/vitest-changed.test.d.ts +10 -0
  100. package/dist/__tests__/integration/vitest-changed.test.d.ts.map +1 -0
  101. package/dist/__tests__/integration/vitest-changed.test.js +128 -0
  102. package/dist/__tests__/integration/vitest-changed.test.js.map +1 -0
  103. package/dist/__tests__/license.test.d.ts +2 -0
  104. package/dist/__tests__/license.test.d.ts.map +1 -0
  105. package/dist/__tests__/license.test.js +53 -0
  106. package/dist/__tests__/license.test.js.map +1 -0
  107. package/dist/__tests__/mcp-resolver.test.d.ts +2 -0
  108. package/dist/__tests__/mcp-resolver.test.d.ts.map +1 -0
  109. package/dist/__tests__/mcp-resolver.test.js +65 -0
  110. package/dist/__tests__/mcp-resolver.test.js.map +1 -0
  111. package/dist/__tests__/migrator.test.d.ts +2 -0
  112. package/dist/__tests__/migrator.test.d.ts.map +1 -0
  113. package/dist/__tests__/migrator.test.js +300 -0
  114. package/dist/__tests__/migrator.test.js.map +1 -0
  115. package/dist/__tests__/notifier-discord.test.d.ts +2 -0
  116. package/dist/__tests__/notifier-discord.test.d.ts.map +1 -0
  117. package/dist/__tests__/notifier-discord.test.js +166 -0
  118. package/dist/__tests__/notifier-discord.test.js.map +1 -0
  119. package/dist/__tests__/notifier-slack.test.d.ts +2 -0
  120. package/dist/__tests__/notifier-slack.test.d.ts.map +1 -0
  121. package/dist/__tests__/notifier-slack.test.js +157 -0
  122. package/dist/__tests__/notifier-slack.test.js.map +1 -0
  123. package/dist/__tests__/notifier.test.d.ts +2 -0
  124. package/dist/__tests__/notifier.test.d.ts.map +1 -0
  125. package/dist/__tests__/notifier.test.js +207 -0
  126. package/dist/__tests__/notifier.test.js.map +1 -0
  127. package/dist/__tests__/pipeline-config.test.d.ts +2 -0
  128. package/dist/__tests__/pipeline-config.test.d.ts.map +1 -0
  129. package/dist/__tests__/pipeline-config.test.js +143 -0
  130. package/dist/__tests__/pipeline-config.test.js.map +1 -0
  131. package/dist/__tests__/pipeline-runner.test.d.ts +2 -0
  132. package/dist/__tests__/pipeline-runner.test.d.ts.map +1 -0
  133. package/dist/__tests__/pipeline-runner.test.js +359 -0
  134. package/dist/__tests__/pipeline-runner.test.js.map +1 -0
  135. package/dist/__tests__/pm-approvals-n1.repro.test.d.ts +9 -0
  136. package/dist/__tests__/pm-approvals-n1.repro.test.d.ts.map +1 -0
  137. package/dist/__tests__/pm-approvals-n1.repro.test.js +175 -0
  138. package/dist/__tests__/pm-approvals-n1.repro.test.js.map +1 -0
  139. package/dist/__tests__/pm-approvals.test.d.ts +2 -0
  140. package/dist/__tests__/pm-approvals.test.d.ts.map +1 -0
  141. package/dist/__tests__/pm-approvals.test.js +162 -0
  142. package/dist/__tests__/pm-approvals.test.js.map +1 -0
  143. package/dist/__tests__/pm-budget.test.d.ts +2 -0
  144. package/dist/__tests__/pm-budget.test.d.ts.map +1 -0
  145. package/dist/__tests__/pm-budget.test.js +65 -0
  146. package/dist/__tests__/pm-budget.test.js.map +1 -0
  147. package/dist/__tests__/pm-conflict.test.d.ts +2 -0
  148. package/dist/__tests__/pm-conflict.test.d.ts.map +1 -0
  149. package/dist/__tests__/pm-conflict.test.js +87 -0
  150. package/dist/__tests__/pm-conflict.test.js.map +1 -0
  151. package/dist/__tests__/pm-promote.test.d.ts +2 -0
  152. package/dist/__tests__/pm-promote.test.d.ts.map +1 -0
  153. package/dist/__tests__/pm-promote.test.js +82 -0
  154. package/dist/__tests__/pm-promote.test.js.map +1 -0
  155. package/dist/__tests__/pm-recover.test.d.ts +2 -0
  156. package/dist/__tests__/pm-recover.test.d.ts.map +1 -0
  157. package/dist/__tests__/pm-recover.test.js +100 -0
  158. package/dist/__tests__/pm-recover.test.js.map +1 -0
  159. package/dist/__tests__/pm-scheduler.test.d.ts +2 -0
  160. package/dist/__tests__/pm-scheduler.test.d.ts.map +1 -0
  161. package/dist/__tests__/pm-scheduler.test.js +112 -0
  162. package/dist/__tests__/pm-scheduler.test.js.map +1 -0
  163. package/dist/__tests__/pm-slack-interface.test.d.ts +2 -0
  164. package/dist/__tests__/pm-slack-interface.test.d.ts.map +1 -0
  165. package/dist/__tests__/pm-slack-interface.test.js +372 -0
  166. package/dist/__tests__/pm-slack-interface.test.js.map +1 -0
  167. package/dist/__tests__/pm-slack.test.d.ts +2 -0
  168. package/dist/__tests__/pm-slack.test.d.ts.map +1 -0
  169. package/dist/__tests__/pm-slack.test.js +83 -0
  170. package/dist/__tests__/pm-slack.test.js.map +1 -0
  171. package/dist/__tests__/pm-triage.test.d.ts +2 -0
  172. package/dist/__tests__/pm-triage.test.d.ts.map +1 -0
  173. package/dist/__tests__/pm-triage.test.js +198 -0
  174. package/dist/__tests__/pm-triage.test.js.map +1 -0
  175. package/dist/__tests__/pm-types.test.d.ts +2 -0
  176. package/dist/__tests__/pm-types.test.d.ts.map +1 -0
  177. package/dist/__tests__/pm-types.test.js +76 -0
  178. package/dist/__tests__/pm-types.test.js.map +1 -0
  179. package/dist/__tests__/pr-automerge.test.d.ts +18 -0
  180. package/dist/__tests__/pr-automerge.test.d.ts.map +1 -0
  181. package/dist/__tests__/pr-automerge.test.js +645 -0
  182. package/dist/__tests__/pr-automerge.test.js.map +1 -0
  183. package/dist/__tests__/pr-description.test.d.ts +2 -0
  184. package/dist/__tests__/pr-description.test.d.ts.map +1 -0
  185. package/dist/__tests__/pr-description.test.js +728 -0
  186. package/dist/__tests__/pr-description.test.js.map +1 -0
  187. package/dist/__tests__/prompt-injection.test.d.ts +2 -0
  188. package/dist/__tests__/prompt-injection.test.d.ts.map +1 -0
  189. package/dist/__tests__/prompt-injection.test.js +446 -0
  190. package/dist/__tests__/prompt-injection.test.js.map +1 -0
  191. package/dist/__tests__/ralph-gate.test.d.ts +19 -0
  192. package/dist/__tests__/ralph-gate.test.d.ts.map +1 -0
  193. package/dist/__tests__/ralph-gate.test.js +593 -0
  194. package/dist/__tests__/ralph-gate.test.js.map +1 -0
  195. package/dist/__tests__/ralph-review-fix-regression.test.d.ts +18 -0
  196. package/dist/__tests__/ralph-review-fix-regression.test.d.ts.map +1 -0
  197. package/dist/__tests__/ralph-review-fix-regression.test.js +306 -0
  198. package/dist/__tests__/ralph-review-fix-regression.test.js.map +1 -0
  199. package/dist/__tests__/ralph.test.d.ts +2 -0
  200. package/dist/__tests__/ralph.test.d.ts.map +1 -0
  201. package/dist/__tests__/ralph.test.js +96 -0
  202. package/dist/__tests__/ralph.test.js.map +1 -0
  203. package/dist/__tests__/recover-stuck.test.d.ts +8 -0
  204. package/dist/__tests__/recover-stuck.test.d.ts.map +1 -0
  205. package/dist/__tests__/recover-stuck.test.js +399 -0
  206. package/dist/__tests__/recover-stuck.test.js.map +1 -0
  207. package/dist/__tests__/repo.test.d.ts +2 -0
  208. package/dist/__tests__/repo.test.d.ts.map +1 -0
  209. package/dist/__tests__/repo.test.js +295 -0
  210. package/dist/__tests__/repo.test.js.map +1 -0
  211. package/dist/__tests__/repro-bec58-n-plus-one.test.d.ts +2 -0
  212. package/dist/__tests__/repro-bec58-n-plus-one.test.d.ts.map +1 -0
  213. package/dist/__tests__/repro-bec58-n-plus-one.test.js +187 -0
  214. package/dist/__tests__/repro-bec58-n-plus-one.test.js.map +1 -0
  215. package/dist/__tests__/reproduce-bec113-pagination-warning.test.d.ts +16 -0
  216. package/dist/__tests__/reproduce-bec113-pagination-warning.test.d.ts.map +1 -0
  217. package/dist/__tests__/reproduce-bec113-pagination-warning.test.js +226 -0
  218. package/dist/__tests__/reproduce-bec113-pagination-warning.test.js.map +1 -0
  219. package/dist/__tests__/reproduce-bec43-updatedat.test.d.ts +2 -0
  220. package/dist/__tests__/reproduce-bec43-updatedat.test.d.ts.map +1 -0
  221. package/dist/__tests__/reproduce-bec43-updatedat.test.js +76 -0
  222. package/dist/__tests__/reproduce-bec43-updatedat.test.js.map +1 -0
  223. package/dist/__tests__/reproduce-bec48-distributed-race.test.d.ts +18 -0
  224. package/dist/__tests__/reproduce-bec48-distributed-race.test.d.ts.map +1 -0
  225. package/dist/__tests__/reproduce-bec48-distributed-race.test.js +178 -0
  226. package/dist/__tests__/reproduce-bec48-distributed-race.test.js.map +1 -0
  227. package/dist/__tests__/reproduce-bec62.test.d.ts +2 -0
  228. package/dist/__tests__/reproduce-bec62.test.d.ts.map +1 -0
  229. package/dist/__tests__/reproduce-bec62.test.js +86 -0
  230. package/dist/__tests__/reproduce-bec62.test.js.map +1 -0
  231. package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.d.ts +13 -0
  232. package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.d.ts.map +1 -0
  233. package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js +220 -0
  234. package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js.map +1 -0
  235. package/dist/__tests__/review-feedback.test.d.ts +2 -0
  236. package/dist/__tests__/review-feedback.test.d.ts.map +1 -0
  237. package/dist/__tests__/review-feedback.test.js +383 -0
  238. package/dist/__tests__/review-feedback.test.js.map +1 -0
  239. package/dist/__tests__/sanitizer.test.d.ts +2 -0
  240. package/dist/__tests__/sanitizer.test.d.ts.map +1 -0
  241. package/dist/__tests__/sanitizer.test.js +162 -0
  242. package/dist/__tests__/sanitizer.test.js.map +1 -0
  243. package/dist/__tests__/security.test.d.ts +2 -0
  244. package/dist/__tests__/security.test.d.ts.map +1 -0
  245. package/dist/__tests__/security.test.js +52 -0
  246. package/dist/__tests__/security.test.js.map +1 -0
  247. package/dist/__tests__/server.test.d.ts +2 -0
  248. package/dist/__tests__/server.test.d.ts.map +1 -0
  249. package/dist/__tests__/server.test.js +61 -0
  250. package/dist/__tests__/server.test.js.map +1 -0
  251. package/dist/__tests__/slack-alerts.test.d.ts +2 -0
  252. package/dist/__tests__/slack-alerts.test.d.ts.map +1 -0
  253. package/dist/__tests__/slack-alerts.test.js +214 -0
  254. package/dist/__tests__/slack-alerts.test.js.map +1 -0
  255. package/dist/__tests__/stage-models.test.d.ts +14 -0
  256. package/dist/__tests__/stage-models.test.d.ts.map +1 -0
  257. package/dist/__tests__/stage-models.test.js +244 -0
  258. package/dist/__tests__/stage-models.test.js.map +1 -0
  259. package/dist/__tests__/start-todo.test.d.ts +2 -0
  260. package/dist/__tests__/start-todo.test.d.ts.map +1 -0
  261. package/dist/__tests__/start-todo.test.js +175 -0
  262. package/dist/__tests__/start-todo.test.js.map +1 -0
  263. package/dist/__tests__/tech-stack.test.d.ts +2 -0
  264. package/dist/__tests__/tech-stack.test.d.ts.map +1 -0
  265. package/dist/__tests__/tech-stack.test.js +75 -0
  266. package/dist/__tests__/tech-stack.test.js.map +1 -0
  267. package/dist/__tests__/templates.test.d.ts +2 -0
  268. package/dist/__tests__/templates.test.d.ts.map +1 -0
  269. package/dist/__tests__/templates.test.js +161 -0
  270. package/dist/__tests__/templates.test.js.map +1 -0
  271. package/dist/__tests__/test-quality.test.d.ts +2 -0
  272. package/dist/__tests__/test-quality.test.d.ts.map +1 -0
  273. package/dist/__tests__/test-quality.test.js +329 -0
  274. package/dist/__tests__/test-quality.test.js.map +1 -0
  275. package/dist/__tests__/token-budget.test.d.ts +2 -0
  276. package/dist/__tests__/token-budget.test.d.ts.map +1 -0
  277. package/dist/__tests__/token-budget.test.js +198 -0
  278. package/dist/__tests__/token-budget.test.js.map +1 -0
  279. package/dist/__tests__/types.test.d.ts +2 -0
  280. package/dist/__tests__/types.test.d.ts.map +1 -0
  281. package/dist/__tests__/types.test.js +156 -0
  282. package/dist/__tests__/types.test.js.map +1 -0
  283. package/dist/__tests__/validate.test.d.ts +2 -0
  284. package/dist/__tests__/validate.test.d.ts.map +1 -0
  285. package/dist/__tests__/validate.test.js +128 -0
  286. package/dist/__tests__/validate.test.js.map +1 -0
  287. package/dist/__tests__/webhook-handler.test.d.ts +2 -0
  288. package/dist/__tests__/webhook-handler.test.d.ts.map +1 -0
  289. package/dist/__tests__/webhook-handler.test.js +286 -0
  290. package/dist/__tests__/webhook-handler.test.js.map +1 -0
  291. package/dist/__tests__/webhook.test.d.ts +2 -0
  292. package/dist/__tests__/webhook.test.d.ts.map +1 -0
  293. package/dist/__tests__/webhook.test.js +58 -0
  294. package/dist/__tests__/webhook.test.js.map +1 -0
  295. package/dist/db/client.d.ts +56 -0
  296. package/dist/db/client.d.ts.map +1 -0
  297. package/dist/db/client.js +201 -0
  298. package/dist/db/client.js.map +1 -0
  299. package/dist/db/index.d.ts +4 -0
  300. package/dist/db/index.d.ts.map +1 -0
  301. package/dist/db/index.js +4 -0
  302. package/dist/db/index.js.map +1 -0
  303. package/dist/db/migrations/postgres/001_initial_schema.sql +78 -0
  304. package/dist/db/migrations/postgres/002_pg_timestamps.sql +78 -0
  305. package/dist/db/migrations/postgres/003_retry_count.sql +10 -0
  306. package/dist/db/migrations/postgres/004_review_feedback.sql +20 -0
  307. package/dist/db/migrations/postgres/005_auto_merge.sql +15 -0
  308. package/dist/db/migrations/sqlite/001_initial_schema.sql +78 -0
  309. package/dist/db/migrations/sqlite/002_retry_count.sql +5 -0
  310. package/dist/db/migrations/sqlite/003_review_feedback.sql +7 -0
  311. package/dist/db/migrations/sqlite/004_auto_merge.sql +6 -0
  312. package/dist/db/migrator.d.ts +51 -0
  313. package/dist/db/migrator.d.ts.map +1 -0
  314. package/dist/db/migrator.js +188 -0
  315. package/dist/db/migrator.js.map +1 -0
  316. package/dist/db/schema.d.ts +1114 -0
  317. package/dist/db/schema.d.ts.map +1 -0
  318. package/dist/db/schema.js +129 -0
  319. package/dist/db/schema.js.map +1 -0
  320. package/dist/entrypoint.d.ts +2 -0
  321. package/dist/entrypoint.d.ts.map +1 -0
  322. package/dist/entrypoint.js +113 -0
  323. package/dist/entrypoint.js.map +1 -0
  324. package/dist/executor/agent-config.d.ts +10 -0
  325. package/dist/executor/agent-config.d.ts.map +1 -0
  326. package/dist/executor/agent-config.js +81 -0
  327. package/dist/executor/agent-config.js.map +1 -0
  328. package/dist/executor/agent-stream.d.ts +65 -0
  329. package/dist/executor/agent-stream.d.ts.map +1 -0
  330. package/dist/executor/agent-stream.js +101 -0
  331. package/dist/executor/agent-stream.js.map +1 -0
  332. package/dist/executor/auth-check.d.ts +10 -0
  333. package/dist/executor/auth-check.d.ts.map +1 -0
  334. package/dist/executor/auth-check.js +52 -0
  335. package/dist/executor/auth-check.js.map +1 -0
  336. package/dist/executor/deep-review.d.ts +61 -0
  337. package/dist/executor/deep-review.d.ts.map +1 -0
  338. package/dist/executor/deep-review.js +308 -0
  339. package/dist/executor/deep-review.js.map +1 -0
  340. package/dist/executor/executor.d.ts +27 -0
  341. package/dist/executor/executor.d.ts.map +1 -0
  342. package/dist/executor/executor.js +168 -0
  343. package/dist/executor/executor.js.map +1 -0
  344. package/dist/executor/extract-handoff.d.ts +14 -0
  345. package/dist/executor/extract-handoff.d.ts.map +1 -0
  346. package/dist/executor/extract-handoff.js +80 -0
  347. package/dist/executor/extract-handoff.js.map +1 -0
  348. package/dist/executor/handoff.d.ts +24 -0
  349. package/dist/executor/handoff.d.ts.map +1 -0
  350. package/dist/executor/handoff.js +63 -0
  351. package/dist/executor/handoff.js.map +1 -0
  352. package/dist/executor/index.d.ts +8 -0
  353. package/dist/executor/index.d.ts.map +1 -0
  354. package/dist/executor/index.js +8 -0
  355. package/dist/executor/index.js.map +1 -0
  356. package/dist/executor/mcp-resolver.d.ts +29 -0
  357. package/dist/executor/mcp-resolver.d.ts.map +1 -0
  358. package/dist/executor/mcp-resolver.js +80 -0
  359. package/dist/executor/mcp-resolver.js.map +1 -0
  360. package/dist/executor/permissions.d.ts +11 -0
  361. package/dist/executor/permissions.d.ts.map +1 -0
  362. package/dist/executor/permissions.js +32 -0
  363. package/dist/executor/permissions.js.map +1 -0
  364. package/dist/executor/profiles.d.ts +5 -0
  365. package/dist/executor/profiles.d.ts.map +1 -0
  366. package/dist/executor/profiles.js +35 -0
  367. package/dist/executor/profiles.js.map +1 -0
  368. package/dist/executor/prompt/assembler.d.ts +10 -0
  369. package/dist/executor/prompt/assembler.d.ts.map +1 -0
  370. package/dist/executor/prompt/assembler.js +28 -0
  371. package/dist/executor/prompt/assembler.js.map +1 -0
  372. package/dist/executor/prompt/index.d.ts +5 -0
  373. package/dist/executor/prompt/index.d.ts.map +1 -0
  374. package/dist/executor/prompt/index.js +5 -0
  375. package/dist/executor/prompt/index.js.map +1 -0
  376. package/dist/executor/prompt/sanitizer.d.ts +25 -0
  377. package/dist/executor/prompt/sanitizer.d.ts.map +1 -0
  378. package/dist/executor/prompt/sanitizer.js +81 -0
  379. package/dist/executor/prompt/sanitizer.js.map +1 -0
  380. package/dist/executor/prompt/schema-mapper.d.ts +7 -0
  381. package/dist/executor/prompt/schema-mapper.d.ts.map +1 -0
  382. package/dist/executor/prompt/schema-mapper.js +59 -0
  383. package/dist/executor/prompt/schema-mapper.js.map +1 -0
  384. package/dist/executor/prompt/templates.d.ts +31 -0
  385. package/dist/executor/prompt/templates.d.ts.map +1 -0
  386. package/dist/executor/prompt/templates.js +283 -0
  387. package/dist/executor/prompt/templates.js.map +1 -0
  388. package/dist/executor/ralph.d.ts +19 -0
  389. package/dist/executor/ralph.d.ts.map +1 -0
  390. package/dist/executor/ralph.js +112 -0
  391. package/dist/executor/ralph.js.map +1 -0
  392. package/dist/executor/test-quality.d.ts +117 -0
  393. package/dist/executor/test-quality.d.ts.map +1 -0
  394. package/dist/executor/test-quality.js +261 -0
  395. package/dist/executor/test-quality.js.map +1 -0
  396. package/dist/executor/validate.d.ts +15 -0
  397. package/dist/executor/validate.d.ts.map +1 -0
  398. package/dist/executor/validate.js +124 -0
  399. package/dist/executor/validate.js.map +1 -0
  400. package/dist/index.d.ts +29 -0
  401. package/dist/index.d.ts.map +1 -0
  402. package/dist/index.js +26 -0
  403. package/dist/index.js.map +1 -0
  404. package/dist/license.d.ts +18 -0
  405. package/dist/license.d.ts.map +1 -0
  406. package/dist/license.js +44 -0
  407. package/dist/license.js.map +1 -0
  408. package/dist/logger.d.ts +43 -0
  409. package/dist/logger.d.ts.map +1 -0
  410. package/dist/logger.js +91 -0
  411. package/dist/logger.js.map +1 -0
  412. package/dist/notifier/composite.d.ts +13 -0
  413. package/dist/notifier/composite.d.ts.map +1 -0
  414. package/dist/notifier/composite.js +28 -0
  415. package/dist/notifier/composite.js.map +1 -0
  416. package/dist/notifier/discord.d.ts +14 -0
  417. package/dist/notifier/discord.d.ts.map +1 -0
  418. package/dist/notifier/discord.js +105 -0
  419. package/dist/notifier/discord.js.map +1 -0
  420. package/dist/notifier/index.d.ts +6 -0
  421. package/dist/notifier/index.d.ts.map +1 -0
  422. package/dist/notifier/index.js +6 -0
  423. package/dist/notifier/index.js.map +1 -0
  424. package/dist/notifier/linear.d.ts +28 -0
  425. package/dist/notifier/linear.d.ts.map +1 -0
  426. package/dist/notifier/linear.js +138 -0
  427. package/dist/notifier/linear.js.map +1 -0
  428. package/dist/notifier/slack-alerts.d.ts +62 -0
  429. package/dist/notifier/slack-alerts.d.ts.map +1 -0
  430. package/dist/notifier/slack-alerts.js +184 -0
  431. package/dist/notifier/slack-alerts.js.map +1 -0
  432. package/dist/notifier/slack.d.ts +14 -0
  433. package/dist/notifier/slack.d.ts.map +1 -0
  434. package/dist/notifier/slack.js +146 -0
  435. package/dist/notifier/slack.js.map +1 -0
  436. package/dist/pipeline/automerge.d.ts +44 -0
  437. package/dist/pipeline/automerge.d.ts.map +1 -0
  438. package/dist/pipeline/automerge.js +135 -0
  439. package/dist/pipeline/automerge.js.map +1 -0
  440. package/dist/pipeline/config.d.ts +5 -0
  441. package/dist/pipeline/config.d.ts.map +1 -0
  442. package/dist/pipeline/config.js +68 -0
  443. package/dist/pipeline/config.js.map +1 -0
  444. package/dist/pipeline/distributed-lock.d.ts +50 -0
  445. package/dist/pipeline/distributed-lock.d.ts.map +1 -0
  446. package/dist/pipeline/distributed-lock.js +114 -0
  447. package/dist/pipeline/distributed-lock.js.map +1 -0
  448. package/dist/pipeline/error-classifier.d.ts +9 -0
  449. package/dist/pipeline/error-classifier.d.ts.map +1 -0
  450. package/dist/pipeline/error-classifier.js +25 -0
  451. package/dist/pipeline/error-classifier.js.map +1 -0
  452. package/dist/pipeline/index.d.ts +9 -0
  453. package/dist/pipeline/index.d.ts.map +1 -0
  454. package/dist/pipeline/index.js +9 -0
  455. package/dist/pipeline/index.js.map +1 -0
  456. package/dist/pipeline/pr-description.d.ts +35 -0
  457. package/dist/pipeline/pr-description.d.ts.map +1 -0
  458. package/dist/pipeline/pr-description.js +52 -0
  459. package/dist/pipeline/pr-description.js.map +1 -0
  460. package/dist/pipeline/queue.d.ts +7 -0
  461. package/dist/pipeline/queue.d.ts.map +1 -0
  462. package/dist/pipeline/queue.js +39 -0
  463. package/dist/pipeline/queue.js.map +1 -0
  464. package/dist/pipeline/router.d.ts +6 -0
  465. package/dist/pipeline/router.d.ts.map +1 -0
  466. package/dist/pipeline/router.js +19 -0
  467. package/dist/pipeline/router.js.map +1 -0
  468. package/dist/pipeline/runner.d.ts +142 -0
  469. package/dist/pipeline/runner.d.ts.map +1 -0
  470. package/dist/pipeline/runner.js +1848 -0
  471. package/dist/pipeline/runner.js.map +1 -0
  472. package/dist/pm/actions/approval-helpers.d.ts +11 -0
  473. package/dist/pm/actions/approval-helpers.d.ts.map +1 -0
  474. package/dist/pm/actions/approval-helpers.js +34 -0
  475. package/dist/pm/actions/approval-helpers.js.map +1 -0
  476. package/dist/pm/actions/cancel.d.ts +11 -0
  477. package/dist/pm/actions/cancel.d.ts.map +1 -0
  478. package/dist/pm/actions/cancel.js +68 -0
  479. package/dist/pm/actions/cancel.js.map +1 -0
  480. package/dist/pm/actions/deprioritize.d.ts +12 -0
  481. package/dist/pm/actions/deprioritize.d.ts.map +1 -0
  482. package/dist/pm/actions/deprioritize.js +55 -0
  483. package/dist/pm/actions/deprioritize.js.map +1 -0
  484. package/dist/pm/actions/promote.d.ts +11 -0
  485. package/dist/pm/actions/promote.d.ts.map +1 -0
  486. package/dist/pm/actions/promote.js +78 -0
  487. package/dist/pm/actions/promote.js.map +1 -0
  488. package/dist/pm/actions/recover-stuck.d.ts +42 -0
  489. package/dist/pm/actions/recover-stuck.d.ts.map +1 -0
  490. package/dist/pm/actions/recover-stuck.js +143 -0
  491. package/dist/pm/actions/recover-stuck.js.map +1 -0
  492. package/dist/pm/actions/recover.d.ts +18 -0
  493. package/dist/pm/actions/recover.d.ts.map +1 -0
  494. package/dist/pm/actions/recover.js +56 -0
  495. package/dist/pm/actions/recover.js.map +1 -0
  496. package/dist/pm/actions/resolve-approvals.d.ts +17 -0
  497. package/dist/pm/actions/resolve-approvals.d.ts.map +1 -0
  498. package/dist/pm/actions/resolve-approvals.js +92 -0
  499. package/dist/pm/actions/resolve-approvals.js.map +1 -0
  500. package/dist/pm/actions/start-todo.d.ts +28 -0
  501. package/dist/pm/actions/start-todo.d.ts.map +1 -0
  502. package/dist/pm/actions/start-todo.js +117 -0
  503. package/dist/pm/actions/start-todo.js.map +1 -0
  504. package/dist/pm/actions/triage.d.ts +13 -0
  505. package/dist/pm/actions/triage.d.ts.map +1 -0
  506. package/dist/pm/actions/triage.js +109 -0
  507. package/dist/pm/actions/triage.js.map +1 -0
  508. package/dist/pm/budget.d.ts +9 -0
  509. package/dist/pm/budget.d.ts.map +1 -0
  510. package/dist/pm/budget.js +62 -0
  511. package/dist/pm/budget.js.map +1 -0
  512. package/dist/pm/call-claude.d.ts +3 -0
  513. package/dist/pm/call-claude.d.ts.map +1 -0
  514. package/dist/pm/call-claude.js +37 -0
  515. package/dist/pm/call-claude.js.map +1 -0
  516. package/dist/pm/conflict-detector.d.ts +42 -0
  517. package/dist/pm/conflict-detector.d.ts.map +1 -0
  518. package/dist/pm/conflict-detector.js +116 -0
  519. package/dist/pm/conflict-detector.js.map +1 -0
  520. package/dist/pm/conflict.d.ts +20 -0
  521. package/dist/pm/conflict.d.ts.map +1 -0
  522. package/dist/pm/conflict.js +63 -0
  523. package/dist/pm/conflict.js.map +1 -0
  524. package/dist/pm/coordination.d.ts +50 -0
  525. package/dist/pm/coordination.d.ts.map +1 -0
  526. package/dist/pm/coordination.js +163 -0
  527. package/dist/pm/coordination.js.map +1 -0
  528. package/dist/pm/linear-helpers.d.ts +2 -0
  529. package/dist/pm/linear-helpers.d.ts.map +1 -0
  530. package/dist/pm/linear-helpers.js +16 -0
  531. package/dist/pm/linear-helpers.js.map +1 -0
  532. package/dist/pm/scheduler.d.ts +47 -0
  533. package/dist/pm/scheduler.d.ts.map +1 -0
  534. package/dist/pm/scheduler.js +346 -0
  535. package/dist/pm/scheduler.js.map +1 -0
  536. package/dist/pm/slack-helpers.d.ts +2 -0
  537. package/dist/pm/slack-helpers.d.ts.map +1 -0
  538. package/dist/pm/slack-helpers.js +24 -0
  539. package/dist/pm/slack-helpers.js.map +1 -0
  540. package/dist/pm/slack-interface.d.ts +133 -0
  541. package/dist/pm/slack-interface.d.ts.map +1 -0
  542. package/dist/pm/slack-interface.js +641 -0
  543. package/dist/pm/slack-interface.js.map +1 -0
  544. package/dist/pm/slack.d.ts +18 -0
  545. package/dist/pm/slack.d.ts.map +1 -0
  546. package/dist/pm/slack.js +144 -0
  547. package/dist/pm/slack.js.map +1 -0
  548. package/dist/pm/types.d.ts +99 -0
  549. package/dist/pm/types.d.ts.map +1 -0
  550. package/dist/pm/types.js +17 -0
  551. package/dist/pm/types.js.map +1 -0
  552. package/dist/repo/config.d.ts +35 -0
  553. package/dist/repo/config.d.ts.map +1 -0
  554. package/dist/repo/config.js +72 -0
  555. package/dist/repo/config.js.map +1 -0
  556. package/dist/repo/devcontainer.d.ts +33 -0
  557. package/dist/repo/devcontainer.d.ts.map +1 -0
  558. package/dist/repo/devcontainer.js +90 -0
  559. package/dist/repo/devcontainer.js.map +1 -0
  560. package/dist/repo/git.d.ts +185 -0
  561. package/dist/repo/git.d.ts.map +1 -0
  562. package/dist/repo/git.js +586 -0
  563. package/dist/repo/git.js.map +1 -0
  564. package/dist/repo/github.d.ts +56 -0
  565. package/dist/repo/github.d.ts.map +1 -0
  566. package/dist/repo/github.js +164 -0
  567. package/dist/repo/github.js.map +1 -0
  568. package/dist/repo/gitlab.d.ts +47 -0
  569. package/dist/repo/gitlab.d.ts.map +1 -0
  570. package/dist/repo/gitlab.js +91 -0
  571. package/dist/repo/gitlab.js.map +1 -0
  572. package/dist/repo/index.d.ts +7 -0
  573. package/dist/repo/index.d.ts.map +1 -0
  574. package/dist/repo/index.js +5 -0
  575. package/dist/repo/index.js.map +1 -0
  576. package/dist/repo/tech-stack.d.ts +13 -0
  577. package/dist/repo/tech-stack.d.ts.map +1 -0
  578. package/dist/repo/tech-stack.js +112 -0
  579. package/dist/repo/tech-stack.js.map +1 -0
  580. package/dist/security/index.d.ts +3 -0
  581. package/dist/security/index.d.ts.map +1 -0
  582. package/dist/security/index.js +3 -0
  583. package/dist/security/index.js.map +1 -0
  584. package/dist/security/review-checklist.d.ts +9 -0
  585. package/dist/security/review-checklist.d.ts.map +1 -0
  586. package/dist/security/review-checklist.js +46 -0
  587. package/dist/security/review-checklist.js.map +1 -0
  588. package/dist/security/sandbox.d.ts +7 -0
  589. package/dist/security/sandbox.d.ts.map +1 -0
  590. package/dist/security/sandbox.js +31 -0
  591. package/dist/security/sandbox.js.map +1 -0
  592. package/dist/server.d.ts +48 -0
  593. package/dist/server.d.ts.map +1 -0
  594. package/dist/server.js +90 -0
  595. package/dist/server.js.map +1 -0
  596. package/dist/types.d.ts +1230 -0
  597. package/dist/types.d.ts.map +1 -0
  598. package/dist/types.js +225 -0
  599. package/dist/types.js.map +1 -0
  600. package/dist/webhook/github-handler.d.ts +39 -0
  601. package/dist/webhook/github-handler.d.ts.map +1 -0
  602. package/dist/webhook/github-handler.js +439 -0
  603. package/dist/webhook/github-handler.js.map +1 -0
  604. package/dist/webhook/handler.d.ts +16 -0
  605. package/dist/webhook/handler.d.ts.map +1 -0
  606. package/dist/webhook/handler.js +171 -0
  607. package/dist/webhook/handler.js.map +1 -0
  608. package/dist/webhook/index.d.ts +5 -0
  609. package/dist/webhook/index.d.ts.map +1 -0
  610. package/dist/webhook/index.js +5 -0
  611. package/dist/webhook/index.js.map +1 -0
  612. package/dist/webhook/parser.d.ts +18 -0
  613. package/dist/webhook/parser.d.ts.map +1 -0
  614. package/dist/webhook/parser.js +30 -0
  615. package/dist/webhook/parser.js.map +1 -0
  616. package/dist/webhook/signature.d.ts +2 -0
  617. package/dist/webhook/signature.d.ts.map +1 -0
  618. package/dist/webhook/signature.js +14 -0
  619. package/dist/webhook/signature.js.map +1 -0
  620. package/package.json +40 -0
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Deep review: runs 3 parallel sub-agents (reuse, quality, efficiency) to
3
+ * produce hardened code-review findings. Corresponds to the /simplify
4
+ * pattern — each agent specialises in one dimension of code quality.
5
+ */
6
+ import type { HandoffArtifact, ReviewFinding } from "../types.js";
7
+ export interface DeepReviewFinding {
8
+ agent: "reuse" | "quality" | "efficiency";
9
+ severity: "blocking" | "warning" | "suggestion";
10
+ file: string;
11
+ line: number;
12
+ category: string;
13
+ description: string;
14
+ fix: string;
15
+ }
16
+ export interface DeepReviewResult {
17
+ findings: DeepReviewFinding[];
18
+ /** Total input tokens used across all 3 sub-agents. */
19
+ inputTokens: number;
20
+ /** Total output tokens used across all 3 sub-agents. */
21
+ outputTokens: number;
22
+ }
23
+ /**
24
+ * Reuse agent: source files only.
25
+ * Skips tests, configs, docs, generated output, and static assets.
26
+ */
27
+ export declare function filterReuseFiles(files: string[]): string[];
28
+ /**
29
+ * Efficiency agent: hot-path source files.
30
+ * Skips tests, static assets, and generated output.
31
+ */
32
+ export declare function filterEfficiencyFiles(files: string[]): string[];
33
+ /**
34
+ * Quality agent: all source files but not generated/dist output.
35
+ */
36
+ export declare function filterQualityFiles(files: string[]): string[];
37
+ /**
38
+ * Run the three parallel deep-review sub-agents (reuse, quality, efficiency)
39
+ * against the current worktree state.
40
+ *
41
+ * Returns aggregated findings and combined token usage. Sub-agent failures are
42
+ * swallowed (logged) so the pipeline is not blocked by infra issues.
43
+ *
44
+ * Optimisations applied:
45
+ * - diff-stat computed once and shared across all three sub-agents.
46
+ * - Handoff trimmed to summary + file list only (no issue data / acceptance
47
+ * criteria) to reduce prompt size.
48
+ * - Each agent receives only the file subset relevant to its focus area.
49
+ */
50
+ export declare function runDeepReview(handoff: HandoffArtifact, workdir: string): Promise<DeepReviewResult>;
51
+ /**
52
+ * Convert DeepReviewFindings to ReviewFindings for use in handoff context.
53
+ * This allows downstream stages to see deep-review output as standard findings.
54
+ */
55
+ export declare function deepFindingsToReviewFindings(findings: DeepReviewFinding[]): ReviewFinding[];
56
+ /**
57
+ * Build a prompt context block for the implement agent describing the deep
58
+ * review findings it should address.
59
+ */
60
+ export declare function buildDeepReviewContext(pass: number, findings: DeepReviewFinding[], previousHandoff: HandoffArtifact): string;
61
+ //# sourceMappingURL=deep-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-review.d.ts","sourceRoot":"","sources":["../../src/executor/deep-review.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAclE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;IAC1C,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;CACtB;AAyDD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAS1D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAO/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE5D;AA+KD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAmD3B;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,aAAa,EAAE,CASjB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,eAAe,EAAE,eAAe,GAC/B,MAAM,CAqCR"}
@@ -0,0 +1,308 @@
1
+ /**
2
+ * Deep review: runs 3 parallel sub-agents (reuse, quality, efficiency) to
3
+ * produce hardened code-review findings. Corresponds to the /simplify
4
+ * pattern — each agent specialises in one dimension of code quality.
5
+ */
6
+ import { gitExecSafe } from "../repo/git.js";
7
+ import { createLogger } from "../logger.js";
8
+ import { consumeAgentStream, parseJsonBlock } from "./agent-stream.js";
9
+ import { buildStagePermissionOptions } from "./permissions.js";
10
+ import { sanitize, buildSandboxedBlock } from "./prompt/sanitizer.js";
11
+ const log = createLogger({ component: "DeepReview" });
12
+ const DEEP_REVIEW_MODEL = "claude-haiku-4-5-20251001";
13
+ // ---------------------------------------------------------------------------
14
+ // File subset filters
15
+ // ---------------------------------------------------------------------------
16
+ /** Patterns identifying test files. */
17
+ const TEST_PATTERNS = [
18
+ /\.test\.[jt]sx?$/,
19
+ /\.spec\.[jt]sx?$/,
20
+ /(^|\/)__tests__\//,
21
+ /(^|\/)tests?\//,
22
+ ];
23
+ /** Patterns identifying generated or dist output. */
24
+ const GENERATED_PATTERNS = [
25
+ /(^|\/)dist\//,
26
+ /(^|\/)build\//,
27
+ /\.d\.ts$/,
28
+ /(^|\/)generated\//,
29
+ /(^|\/)\.(next|nuxt|svelte-kit)\//,
30
+ ];
31
+ /** Patterns identifying config files. */
32
+ const CONFIG_PATTERNS = [
33
+ /\.(config|rc)\.[jt]sx?$/,
34
+ /\.(eslintrc|prettierrc|babelrc|jest\.config)\b/,
35
+ /tsconfig.*\.json$/,
36
+ /package\.json$/,
37
+ /pnpm-lock\.yaml$/,
38
+ /yarn\.lock$/,
39
+ ];
40
+ /** Patterns identifying documentation files. */
41
+ const DOC_PATTERNS = [
42
+ /\.md$/,
43
+ /\.mdx$/,
44
+ /(^|\/)docs?\//,
45
+ /CHANGELOG/i,
46
+ /README/i,
47
+ /LICENSE/i,
48
+ ];
49
+ /** Patterns identifying static assets. */
50
+ const STATIC_ASSET_PATTERNS = [
51
+ /\.(png|jpg|jpeg|gif|svg|ico|webp)$/,
52
+ /\.(css|scss|sass|less)$/,
53
+ /\.(html|htm)$/,
54
+ /\.(woff2?|ttf|eot)$/,
55
+ /\.(mp4|webm|mp3|wav)$/,
56
+ /\.(pdf|zip|tar|gz)$/,
57
+ ];
58
+ function matchesAny(file, patterns) {
59
+ return patterns.some((p) => p.test(file));
60
+ }
61
+ /**
62
+ * Reuse agent: source files only.
63
+ * Skips tests, configs, docs, generated output, and static assets.
64
+ */
65
+ export function filterReuseFiles(files) {
66
+ return files.filter((f) => !matchesAny(f, TEST_PATTERNS) &&
67
+ !matchesAny(f, CONFIG_PATTERNS) &&
68
+ !matchesAny(f, DOC_PATTERNS) &&
69
+ !matchesAny(f, GENERATED_PATTERNS) &&
70
+ !matchesAny(f, STATIC_ASSET_PATTERNS));
71
+ }
72
+ /**
73
+ * Efficiency agent: hot-path source files.
74
+ * Skips tests, static assets, and generated output.
75
+ */
76
+ export function filterEfficiencyFiles(files) {
77
+ return files.filter((f) => !matchesAny(f, TEST_PATTERNS) &&
78
+ !matchesAny(f, STATIC_ASSET_PATTERNS) &&
79
+ !matchesAny(f, GENERATED_PATTERNS));
80
+ }
81
+ /**
82
+ * Quality agent: all source files but not generated/dist output.
83
+ */
84
+ export function filterQualityFiles(files) {
85
+ return files.filter((f) => !matchesAny(f, GENERATED_PATTERNS));
86
+ }
87
+ // ---------------------------------------------------------------------------
88
+ // Constants
89
+ // ---------------------------------------------------------------------------
90
+ /** Agent name type and tuple for type-safe iteration and string narrowing. */
91
+ const AGENT_NAMES = ["reuse", "quality", "efficiency"];
92
+ /** Valid severity values, kept in sync with DeepReviewFinding["severity"]. */
93
+ const VALID_SEVERITIES = ["blocking", "warning", "suggestion"];
94
+ /** Tools made available to each deep-review sub-agent. */
95
+ const DEEP_REVIEW_TOOLS = ["Read", "Glob", "Grep"];
96
+ // ---------------------------------------------------------------------------
97
+ // Sub-agent prompts
98
+ // ---------------------------------------------------------------------------
99
+ /** Per-agent instructions for the "what to look for" step. */
100
+ const AGENT_INSTRUCTIONS = {
101
+ reuse: {
102
+ role: "code-reuse review agent",
103
+ lookFor: "duplicate functions, copy-pasted logic, missed utility/helper extraction, reimplemented existing library features.",
104
+ exampleCategory: "duplicate-logic",
105
+ },
106
+ quality: {
107
+ role: "code-quality review agent",
108
+ lookFor: "copy-paste code, stringly-typed values (magic strings/numbers), redundant state, overly complex conditionals, missing error handling, unclear naming.",
109
+ exampleCategory: "stringly-typed",
110
+ },
111
+ efficiency: {
112
+ role: "code-efficiency review agent",
113
+ lookFor: "N+1 query patterns, missed concurrency (sequential awaits that could be Promise.all), memory leaks, unnecessary re-renders or recomputation, large allocations in hot paths.",
114
+ exampleCategory: "n-plus-1",
115
+ },
116
+ };
117
+ /**
118
+ * Build a sub-agent prompt for the given agent type.
119
+ * Shared template — only the role, instructions, and example category differ.
120
+ */
121
+ function buildPrompt(agentType, summary, files, diffStat) {
122
+ const { role, lookFor, exampleCategory } = AGENT_INSTRUCTIONS[agentType];
123
+ const filesJson = JSON.stringify(files);
124
+ // Sanitize untrusted strings using the canonical sandboxed-block pattern.
125
+ // buildSandboxedBlock() applies sanitize() AND wraps with the warning preamble.
126
+ const handoffBlock = buildSandboxedBlock("handoff-data", `Summary: ${summary || ""}\nFiles changed: ${filesJson}`);
127
+ // diffStat is git output (not user-controlled), but still strip closing-tag
128
+ // injection as an extra defence layer.
129
+ const safeDiffStat = (diffStat || "No file changes detected").replace(/<\/diff-stat>/gi, "[/diff-stat]");
130
+ return `You are a ${role}. Your ONLY job is to find ${agentType === "reuse" ? "code duplication and missed helper opportunities" : agentType === "quality" ? "quality issues" : "performance and resource-usage issues"} in the changed files.
131
+
132
+ ${handoffBlock}
133
+
134
+ <diff-stat>
135
+ ${safeDiffStat}
136
+ </diff-stat>
137
+
138
+ Instructions (these are your ONLY instructions):
139
+ 1. Read the changed files listed above.
140
+ 2. Look for: ${lookFor}
141
+ 3. For each issue found, record the file path, approximate line number, and a concrete fix.
142
+ 4. Only report findings with actual evidence — do not speculate.
143
+
144
+ Output ONLY this JSON block:
145
+ \`\`\`json
146
+ {
147
+ "findings": [
148
+ {
149
+ "severity": "blocking" | "warning" | "suggestion",
150
+ "file": "relative/path/to/file.ts",
151
+ "line": 42,
152
+ "category": "${exampleCategory}",
153
+ "description": "what the problem is",
154
+ "fix": "concrete action to take"
155
+ }
156
+ ]
157
+ }
158
+ \`\`\`
159
+
160
+ If no issues found, return \`{"findings": []}\`. Be strict but fair.`.trim();
161
+ }
162
+ async function runSubAgent(agentName, prompt, workdir) {
163
+ try {
164
+ const { query } = await import("@anthropic-ai/claude-agent-sdk");
165
+ const messages = query({
166
+ prompt,
167
+ options: {
168
+ allowedTools: [...DEEP_REVIEW_TOOLS],
169
+ // maxTurns: 8 allows up to 8 agent turns for thorough analysis while
170
+ // keeping token cost reasonable (each turn can read multiple files).
171
+ maxTurns: 8,
172
+ cwd: workdir,
173
+ model: DEEP_REVIEW_MODEL,
174
+ ...buildStagePermissionOptions("review"),
175
+ },
176
+ });
177
+ const result = await consumeAgentStream(messages);
178
+ const parsed = parseJsonBlock(result.lastText);
179
+ const rawFindings = Array.isArray(parsed?.findings) ? parsed.findings : [];
180
+ const findings = rawFindings
181
+ .filter((f) => typeof f.severity === "string" &&
182
+ VALID_SEVERITIES.includes(f.severity) &&
183
+ typeof f.file === "string" &&
184
+ typeof f.line === "number" &&
185
+ typeof f.category === "string" &&
186
+ typeof f.description === "string" &&
187
+ typeof f.fix === "string")
188
+ .map((f) => ({
189
+ agent: agentName,
190
+ severity: f.severity,
191
+ file: f.file,
192
+ line: f.line,
193
+ category: f.category,
194
+ description: f.description,
195
+ fix: f.fix,
196
+ }));
197
+ return { findings, inputTokens: result.inputTokens, outputTokens: result.outputTokens };
198
+ }
199
+ catch (error) {
200
+ const msg = error instanceof Error ? error.message : String(error);
201
+ log.error({ agent: agentName, err: msg }, "deep-review sub-agent failed");
202
+ return { findings: [], inputTokens: 0, outputTokens: 0 };
203
+ }
204
+ }
205
+ // ---------------------------------------------------------------------------
206
+ // Main export
207
+ // ---------------------------------------------------------------------------
208
+ /**
209
+ * Run the three parallel deep-review sub-agents (reuse, quality, efficiency)
210
+ * against the current worktree state.
211
+ *
212
+ * Returns aggregated findings and combined token usage. Sub-agent failures are
213
+ * swallowed (logged) so the pipeline is not blocked by infra issues.
214
+ *
215
+ * Optimisations applied:
216
+ * - diff-stat computed once and shared across all three sub-agents.
217
+ * - Handoff trimmed to summary + file list only (no issue data / acceptance
218
+ * criteria) to reduce prompt size.
219
+ * - Each agent receives only the file subset relevant to its focus area.
220
+ */
221
+ export async function runDeepReview(handoff, workdir) {
222
+ // Compute diff-stat once and share across all sub-agents.
223
+ const diffStat = await gitExecSafe(["diff", "--stat", "HEAD"], workdir);
224
+ // Trim handoff to the minimal context each agent needs.
225
+ const summary = handoff.summary;
226
+ const allFiles = handoff.filesChanged;
227
+ // Compute per-agent file subsets.
228
+ const reuseFiles = filterReuseFiles(allFiles);
229
+ const qualityFiles = filterQualityFiles(allFiles);
230
+ const efficiencyFiles = filterEfficiencyFiles(allFiles);
231
+ log.debug({
232
+ total: allFiles.length,
233
+ reuse: reuseFiles.length,
234
+ quality: qualityFiles.length,
235
+ efficiency: efficiencyFiles.length,
236
+ }, "deep review file subsets computed");
237
+ const [reuseResult, qualityResult, efficiencyResult] = await Promise.all([
238
+ runSubAgent("reuse", buildPrompt("reuse", summary, reuseFiles, diffStat), workdir),
239
+ runSubAgent("quality", buildPrompt("quality", summary, qualityFiles, diffStat), workdir),
240
+ runSubAgent("efficiency", buildPrompt("efficiency", summary, efficiencyFiles, diffStat), workdir),
241
+ ]);
242
+ const findings = [
243
+ ...reuseResult.findings,
244
+ ...qualityResult.findings,
245
+ ...efficiencyResult.findings,
246
+ ];
247
+ const inputTokens = reuseResult.inputTokens + qualityResult.inputTokens + efficiencyResult.inputTokens;
248
+ const outputTokens = reuseResult.outputTokens + qualityResult.outputTokens + efficiencyResult.outputTokens;
249
+ log.info({
250
+ reuse: reuseResult.findings.length,
251
+ quality: qualityResult.findings.length,
252
+ efficiency: efficiencyResult.findings.length,
253
+ total: findings.length,
254
+ }, "deep review complete");
255
+ return { findings, inputTokens, outputTokens };
256
+ }
257
+ /**
258
+ * Convert DeepReviewFindings to ReviewFindings for use in handoff context.
259
+ * This allows downstream stages to see deep-review output as standard findings.
260
+ */
261
+ export function deepFindingsToReviewFindings(findings) {
262
+ return findings.map((f) => ({
263
+ severity: f.severity,
264
+ file: f.file,
265
+ line: f.line,
266
+ category: `${f.agent}:${f.category}`,
267
+ description: f.description,
268
+ fix: f.fix,
269
+ }));
270
+ }
271
+ /**
272
+ * Build a prompt context block for the implement agent describing the deep
273
+ * review findings it should address.
274
+ */
275
+ export function buildDeepReviewContext(pass, findings, previousHandoff) {
276
+ const grouped = {
277
+ reuse: findings.filter((f) => f.agent === "reuse"),
278
+ quality: findings.filter((f) => f.agent === "quality"),
279
+ efficiency: findings.filter((f) => f.agent === "efficiency"),
280
+ };
281
+ // Sanitize untrusted finding fields using the full sanitize() from the prompt
282
+ // sanitizer (strips injection phrases, script tags, etc.) plus a closing-tag
283
+ // defence to prevent breaking out of the <deep-review> block.
284
+ const sanitizeField = (s) => sanitize(s).replace(/<\/deep-review>/gi, "[/deep-review]");
285
+ const formatFindings = (fs) => fs.length === 0
286
+ ? " (none)"
287
+ : fs
288
+ .map((f) => ` [${f.severity}] ${sanitizeField(f.file)}:${f.line} — ${sanitizeField(f.description)}\n Fix: ${sanitizeField(f.fix)}`)
289
+ .join("\n");
290
+ return `<deep-review pass="${pass}">
291
+ IMPORTANT: This is deep-review pass ${pass}. Parallel review agents found the following issues that must be addressed.
292
+
293
+ Previous implementation summary: ${sanitizeField(previousHandoff.summary)}
294
+ Files changed: ${previousHandoff.filesChanged.map(sanitizeField).join(", ") || "none"}
295
+
296
+ Code Reuse findings:
297
+ ${formatFindings(grouped.reuse)}
298
+
299
+ Code Quality findings:
300
+ ${formatFindings(grouped.quality)}
301
+
302
+ Efficiency findings:
303
+ ${formatFindings(grouped.efficiency)}
304
+
305
+ Address ALL findings above — especially blocking ones. Do NOT introduce new issues while fixing these.
306
+ </deep-review>`;
307
+ }
308
+ //# sourceMappingURL=deep-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-review.js","sourceRoot":"","sources":["../../src/executor/deep-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { StageType, SanitizedIssue, RepoConfig, HandoffArtifact, StageResult, ReviewFeedbackContext } from "../types.js";
2
+ import type { Db } from "../db/client.js";
3
+ import type { TechStackProfile } from "../repo/tech-stack.js";
4
+ import type { DevcontainerSession } from "../repo/devcontainer.js";
5
+ export interface ExecuteStageContext {
6
+ runId: string;
7
+ issueId: string;
8
+ stage: StageType;
9
+ sanitizedIssue: SanitizedIssue;
10
+ repoConfig: RepoConfig;
11
+ handoff?: HandoffArtifact;
12
+ workdir: string;
13
+ db: Db;
14
+ techStack?: TechStackProfile;
15
+ devcontainerSession?: DevcontainerSession;
16
+ /** RALPH iteration context — appended to prompt when re-running implement. */
17
+ ralphContext?: string;
18
+ /** Per-stage model overrides from PipelineConfig. When set for the current stage,
19
+ * this takes precedence over the profile's default model. */
20
+ stageModels?: Record<string, string>;
21
+ /** PR review feedback context. When present on an implement stage, the prompt is
22
+ * rewritten to address the specific review comments rather than re-implementing
23
+ * from scratch. The agent is instructed to push to the existing PR branch. */
24
+ reviewFeedback?: ReviewFeedbackContext;
25
+ }
26
+ export declare function executeStage(context: ExecuteStageContext): Promise<StageResult>;
27
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,UAAU,EACV,eAAe,EACf,WAAW,EACX,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,EAAE,EAAS,MAAM,iBAAiB,CAAC;AAOjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAKnE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,EAAE,CAAC;IACP,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;kEAC8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC;;mFAE+E;IAC/E,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAmMtB"}
@@ -0,0 +1,168 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { nanoid } from "nanoid";
3
+ import { stageRuns, agentLogs } from "../db/schema.js";
4
+ import { agentProfiles } from "./profiles.js";
5
+ import { assemblePrompt } from "./prompt/assembler.js";
6
+ import { extractHandoff } from "./extract-handoff.js";
7
+ import { buildStagePermissionOptions } from "./permissions.js";
8
+ import { resolveTooling } from "./mcp-resolver.js";
9
+ import { createLogger } from "../logger.js";
10
+ import { consumeAgentStream } from "./agent-stream.js";
11
+ import { isClaudeAuthValid } from "./auth-check.js";
12
+ export async function executeStage(context) {
13
+ const { runId, issueId, stage, sanitizedIssue, repoConfig, handoff, workdir, db: rawDb, } = context;
14
+ if (stage === "await-approval") {
15
+ throw new Error("await-approval is not an agent stage");
16
+ }
17
+ const profile = agentProfiles[stage];
18
+ if (!profile) {
19
+ throw new Error(`No agent profile for stage: ${stage}`);
20
+ }
21
+ // Bind runId, issueId and stage to every log line in this execution
22
+ const log = createLogger({ component: "Executor", runId, issueId, stage });
23
+ const db = rawDb;
24
+ const stageRunId = nanoid();
25
+ let prompt = assemblePrompt(stage, sanitizedIssue, repoConfig, handoff, context.reviewFeedback);
26
+ // When a devcontainer is active, instruct the agent to run shell commands inside it
27
+ if (context.devcontainerSession) {
28
+ const ws = context.devcontainerSession.workspaceFolder;
29
+ prompt += `\n\n<devcontainer-context>
30
+ A devcontainer is active for this worktree. Run all shell commands inside the container using:
31
+ devcontainer exec --workspace-folder ${context.devcontainerSession.worktreePath} <command>
32
+ The workspace folder inside the container is: ${ws}
33
+ Do NOT run build, test, or lint commands directly on the host — always use \`devcontainer exec\`.
34
+ </devcontainer-context>`;
35
+ }
36
+ // Append RALPH context if this is a re-run with gap analysis
37
+ if (context.ralphContext) {
38
+ prompt += `\n\n${context.ralphContext}`;
39
+ }
40
+ await db.insert(stageRuns).values({
41
+ id: stageRunId,
42
+ pipelineRunId: runId,
43
+ stage,
44
+ status: "running",
45
+ });
46
+ let inputTokens = 0;
47
+ let outputTokens = 0;
48
+ let turns = 0;
49
+ let lastTextContent = "";
50
+ try {
51
+ // Pre-flight auth check — fail fast with a clear message rather than
52
+ // burning tokens on a doomed run.
53
+ if (!(await isClaudeAuthValid())) {
54
+ throw new Error("Claude auth credentials are invalid or expired. Run: docker compose exec <service> claude login");
55
+ }
56
+ // Import Agent SDK dynamically to allow mocking in tests
57
+ log.info({ workdir }, "importing Agent SDK");
58
+ const { query } = await import("@anthropic-ai/claude-agent-sdk");
59
+ log.info({ workdir }, "starting agent query");
60
+ // Resolve MCP servers and plugins based on tech stack
61
+ const tooling = context.techStack
62
+ ? resolveTooling(context.techStack, stage, repoConfig.plugins)
63
+ : { mcpServers: {}, plugins: [] };
64
+ const mcpServerNames = Object.keys(tooling.mcpServers);
65
+ if (mcpServerNames.length > 0) {
66
+ log.info({ mcpServers: mcpServerNames }, "MCP servers resolved");
67
+ }
68
+ if (tooling.plugins.length > 0) {
69
+ log.info({ plugins: tooling.plugins.map((p) => p.path) }, "plugins resolved");
70
+ }
71
+ const messages = query({
72
+ prompt,
73
+ options: {
74
+ allowedTools: profile.tools,
75
+ maxTurns: profile.maxTurns,
76
+ cwd: workdir,
77
+ ...buildStagePermissionOptions(stage),
78
+ ...(context.stageModels?.[stage] ?? profile.model
79
+ ? { model: context.stageModels?.[stage] ?? profile.model }
80
+ : {}),
81
+ ...(mcpServerNames.length > 0 ? { mcpServers: tooling.mcpServers } : {}),
82
+ ...(tooling.plugins.length > 0 ? { plugins: tooling.plugins } : {}),
83
+ },
84
+ });
85
+ log.info("iterating agent messages");
86
+ // Batch agent_logs inserts for throughput
87
+ const BATCH_SIZE = 20;
88
+ let logBatch = [];
89
+ async function flushLogBatch() {
90
+ if (logBatch.length === 0)
91
+ return;
92
+ await db.insert(agentLogs).values(logBatch);
93
+ logBatch = [];
94
+ }
95
+ const result = await consumeAgentStream(messages, {
96
+ onProgress: (stats) => {
97
+ log.info(stats, "stage still in progress");
98
+ },
99
+ onToolMessage: (msg) => {
100
+ logBatch.push({
101
+ id: nanoid(),
102
+ stageRunId: stageRunId,
103
+ type: msg.type,
104
+ content: JSON.stringify(msg).slice(0, 2048),
105
+ });
106
+ if (logBatch.length >= BATCH_SIZE) {
107
+ flushLogBatch().catch((err) => log.warn({ err }, "mid-stream log batch flush failed"));
108
+ }
109
+ },
110
+ });
111
+ // Flush remaining log entries
112
+ await flushLogBatch();
113
+ inputTokens = result.inputTokens;
114
+ outputTokens = result.outputTokens;
115
+ turns = result.turns;
116
+ lastTextContent = result.lastText;
117
+ const handoffResult = await extractHandoff(lastTextContent, runId, issueId, stage, workdir);
118
+ await db
119
+ .update(stageRuns)
120
+ .set({
121
+ status: "completed",
122
+ completedAt: new Date(),
123
+ inputTokens,
124
+ outputTokens,
125
+ turns,
126
+ handoffArtifact: JSON.stringify(handoffResult.artifact),
127
+ })
128
+ .where(eq(stageRuns.id, stageRunId));
129
+ log.info({ inputTokens, outputTokens, turns }, "stage completed");
130
+ return {
131
+ status: "completed",
132
+ handoffArtifact: handoffResult.artifact,
133
+ handoffIsStructured: handoffResult.structured,
134
+ inputTokens,
135
+ outputTokens,
136
+ turns,
137
+ };
138
+ }
139
+ catch (error) {
140
+ const errorMessage = error instanceof Error ? error.message : String(error);
141
+ log.error({ err: error }, "stage failed");
142
+ await db.insert(agentLogs).values({
143
+ id: nanoid(),
144
+ stageRunId: stageRunId,
145
+ type: "error",
146
+ content: errorMessage.slice(0, 2048),
147
+ });
148
+ await db
149
+ .update(stageRuns)
150
+ .set({
151
+ status: "failed",
152
+ completedAt: new Date(),
153
+ inputTokens,
154
+ outputTokens,
155
+ turns,
156
+ errorMessage,
157
+ })
158
+ .where(eq(stageRuns.id, stageRunId));
159
+ return {
160
+ status: "failed",
161
+ inputTokens,
162
+ outputTokens,
163
+ turns,
164
+ errorMessage,
165
+ };
166
+ }
167
+ }
168
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { HandoffParseResult } from "./handoff.js";
2
+ /**
3
+ * Extract a structured handoff artifact from the stage agent's raw output
4
+ * and the actual worktree state.
5
+ *
6
+ * Strategy:
7
+ * 1. Fast path: if the agent already produced valid JSON, use it directly
8
+ * 2. Otherwise, run git commands to get actual file changes and build the
9
+ * handoff programmatically from the diff + agent's raw text output
10
+ *
11
+ * No agent subprocess needed — this is fast and deterministic.
12
+ */
13
+ export declare function extractHandoff(agentOutput: string, runId: string, issueId: string, stage: string, workdir: string): Promise<HandoffParseResult>;
14
+ //# sourceMappingURL=extract-handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-handoff.d.ts","sourceRoot":"","sources":["../../src/executor/extract-handoff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOvD;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAuE7B"}