@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,109 @@
1
+ import { parseJsonObject } from "../../executor/agent-stream.js";
2
+ import { resolveWorkflowStates } from "../linear-helpers.js";
3
+ import { createLogger } from "../../logger.js";
4
+ const log = createLogger({ component: "PmAgent:triage" });
5
+ const MAX_ISSUES_PER_TICK = 10;
6
+ const DEFAULT_BATCH_SIZE = 3;
7
+ /**
8
+ * Process an array of items in batches of `size`, awaiting each batch before
9
+ * starting the next. Returns a flat array of results (preserving order).
10
+ */
11
+ async function runInBatches(items, size, fn) {
12
+ const results = [];
13
+ for (let i = 0; i < items.length; i += size) {
14
+ const batch = items.slice(i, i + size);
15
+ const batchResults = await Promise.all(batch.map(fn));
16
+ results.push(...batchResults);
17
+ }
18
+ return results;
19
+ }
20
+ export async function triageNewIssues(input) {
21
+ const { linearClient, teamIds, callClaude, sanitize, batchSize = DEFAULT_BATCH_SIZE } = input;
22
+ const stateMap = input.stateMap ?? await resolveWorkflowStates(linearClient, teamIds);
23
+ const issuesResponse = await linearClient.issues({
24
+ filter: {
25
+ team: { id: { in: teamIds } },
26
+ state: { name: { eq: "Triage" } },
27
+ },
28
+ first: MAX_ISSUES_PER_TICK,
29
+ });
30
+ const issues = issuesResponse.nodes ?? [];
31
+ if (issues.length === 0)
32
+ return [];
33
+ const allLabels = await linearClient.issueLabels({ first: 100 });
34
+ const labelMap = new Map();
35
+ for (const label of allLabels.nodes ?? []) {
36
+ labelMap.set(label.name.toLowerCase(), label.id);
37
+ }
38
+ const results = (await runInBatches(issues.slice(0, MAX_ISSUES_PER_TICK), batchSize, async (issue) => {
39
+ try {
40
+ const sanitizedDesc = sanitize(issue.description ?? "");
41
+ const prompt = `Classify this software issue and generate acceptance criteria. Respond with ONLY a JSON object, no other text.\n\n` +
42
+ `Issue: ${issue.identifier}\n` +
43
+ `Title: ${sanitize(issue.title)}\n` +
44
+ `Description: ${sanitizedDesc}\n\n` +
45
+ `IMPORTANT rules for generating acceptance criteria:\n` +
46
+ `1. INTEGRATION: Every new function, module, or utility MUST have a criterion that specifies where it is called from in existing code (e.g. "runner.ts calls checkFoo() after the test stage completes"). Code that is exported but never imported outside its own test file is incomplete.\n` +
47
+ `2. DOCUMENTATION: If the change adds new configuration, public API, CLI flags, or changes behavior, include a criterion requiring updates to relevant documentation (CLAUDE.md, README.md, deploy/README.md, or inline JSDoc).\n` +
48
+ `3. TESTING: Include a criterion for tests that exercise the integration path, not just the utility in isolation.\n` +
49
+ `4. Each criterion must be concrete and verifiable by reading the code — avoid vague criteria like "works correctly" or "is implemented".\n\n` +
50
+ `Respond with exactly this JSON format (no markdown, no explanation, just the JSON):\n` +
51
+ `{"priority": <1-4 where 1=urgent>, "labels": [<"bug"|"feature"|"backend"|"frontend"|"infra"|"docs">], "complexity": <"trivial"|"small"|"medium"|"large">, "rationale": "<one sentence>", "acceptanceCriteria": ["<integration criterion — specifies call site in existing code>", "<behavior criterion — testable outcome>", "<documentation criterion — if applicable>", ...]}`;
52
+ const response = await callClaude(prompt);
53
+ const parsed = parseJsonObject(response);
54
+ if (!parsed) {
55
+ log.warn({ issueId: issue.identifier, responsePreview: response.slice(0, 200) }, "invalid Claude JSON, skipping triage");
56
+ return null;
57
+ }
58
+ const { priority, labels, complexity, rationale } = parsed;
59
+ if (typeof priority !== "number" || !Array.isArray(labels) || !rationale) {
60
+ log.warn({ issueId: issue.identifier, parsed }, "incomplete Claude response, skipping");
61
+ return null;
62
+ }
63
+ const hasBug = labels.some((l) => l.toLowerCase() === "bug");
64
+ const pipelineLabel = hasBug ? "bug" : (complexity === "trivial" ? "quick-fix" : "auto-implement");
65
+ const issueLabels = [...new Set([...labels, pipelineLabel])];
66
+ const labelIds = issueLabels
67
+ .map((l) => labelMap.get(l.toLowerCase()))
68
+ .filter(Boolean);
69
+ const team = await issue.team;
70
+ const teamId = team?.id;
71
+ const backlogStateId = teamId ? stateMap.get(`${teamId}:Backlog`) : undefined;
72
+ const acceptanceCriteria = Array.isArray(parsed.acceptanceCriteria)
73
+ ? parsed.acceptanceCriteria.filter((c) => typeof c === "string" && c.length > 0)
74
+ : [];
75
+ // Append acceptance criteria to issue description if not already present
76
+ const updatePayload = { priority };
77
+ if (labelIds.length > 0)
78
+ updatePayload.labelIds = labelIds;
79
+ if (backlogStateId)
80
+ updatePayload.stateId = backlogStateId;
81
+ const existingDesc = issue.description ?? "";
82
+ if (acceptanceCriteria.length > 0 && !existingDesc.includes("**Acceptance Criteria:**")) {
83
+ const criteriaSection = `\n\n**Acceptance Criteria:**\n${acceptanceCriteria.map((c) => `- [ ] ${c}`).join("\n")}`;
84
+ updatePayload.description = existingDesc + criteriaSection;
85
+ }
86
+ await linearClient.updateIssue(issue.id, updatePayload);
87
+ await linearClient.createComment({
88
+ issueId: issue.id,
89
+ body: `🤖 **PM Agent — Triaged**\n\n` +
90
+ `**Priority:** ${priority} | **Complexity:** ${complexity}\n` +
91
+ `**Labels:** ${issueLabels.join(", ")}\n` +
92
+ `**Pipeline:** ${pipelineLabel}\n` +
93
+ `**Rationale:** ${rationale}` +
94
+ (acceptanceCriteria.length > 0
95
+ ? `\n\n**Generated Acceptance Criteria:**\n${acceptanceCriteria.map((c) => `- ${c}`).join("\n")}`
96
+ : ""),
97
+ });
98
+ const result = { issueId: issue.identifier, priority, labels: issueLabels, complexity, rationale, acceptanceCriteria };
99
+ log.info({ issueId: issue.identifier, priority, labels: issueLabels, pipelineLabel, complexity }, "triaged issue");
100
+ return result;
101
+ }
102
+ catch (err) {
103
+ log.error({ issueId: issue.identifier, err }, "failed to triage issue");
104
+ return null;
105
+ }
106
+ })).filter((r) => r !== null);
107
+ return results;
108
+ }
109
+ //# sourceMappingURL=triage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AnyDb } from "../db/client.js";
2
+ import type { BudgetGuardResult } from "./types.js";
3
+ export interface BudgetGuardInput {
4
+ db: AnyDb;
5
+ maxInFlight: number;
6
+ dailyTokenBudget: number;
7
+ }
8
+ export declare function checkBudgetGuards(input: BudgetGuardInput): Promise<BudgetGuardResult>;
9
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/pm/budget.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKpD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,KAAK,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoE3F"}
@@ -0,0 +1,62 @@
1
+ import { sql, and, gte, lt } from "drizzle-orm";
2
+ import { pipelineRuns } from "../db/schema.js";
3
+ import { createLogger } from "../logger.js";
4
+ const log = createLogger({ component: "PmAgent:budget" });
5
+ export async function checkBudgetGuards(input) {
6
+ const { db, maxInFlight, dailyTokenBudget } = input;
7
+ const today = new Date().toISOString().slice(0, 10);
8
+ const dayStart = new Date(`${today}T00:00:00Z`);
9
+ const dayEnd = new Date(dayStart);
10
+ dayEnd.setUTCDate(dayEnd.getUTCDate() + 1);
11
+ let totalIn = 0;
12
+ let totalOut = 0;
13
+ let activeCount = 0;
14
+ try {
15
+ const rows = await db
16
+ .select({
17
+ totalIn: sql `coalesce(sum(${pipelineRuns.totalInputTokens}), 0)`,
18
+ totalOut: sql `coalesce(sum(${pipelineRuns.totalOutputTokens}), 0)`,
19
+ activeCount: sql `coalesce(sum(case when ${pipelineRuns.status} in ('queued', 'running') then 1 else 0 end), 0)`,
20
+ })
21
+ .from(pipelineRuns)
22
+ .where(and(gte(pipelineRuns.startedAt, dayStart), lt(pipelineRuns.startedAt, dayEnd)));
23
+ const row = rows[0];
24
+ if (row) {
25
+ totalIn = Number(row.totalIn);
26
+ totalOut = Number(row.totalOut);
27
+ activeCount = Number(row.activeCount);
28
+ }
29
+ }
30
+ catch (err) {
31
+ log.error({ err }, "failed to query budget data");
32
+ }
33
+ const dailyTokensUsed = totalIn + totalOut;
34
+ const tokenSpendPercent = dailyTokenBudget > 0
35
+ ? Math.round((dailyTokensUsed / dailyTokenBudget) * 100)
36
+ : 0;
37
+ if (activeCount >= maxInFlight) {
38
+ return {
39
+ promoteBlocked: true,
40
+ reason: `maxInFlight reached (${activeCount}/${maxInFlight})`,
41
+ activeCount,
42
+ tokenSpendPercent,
43
+ dailyTokensUsed,
44
+ };
45
+ }
46
+ if (tokenSpendPercent >= 80) {
47
+ return {
48
+ promoteBlocked: true,
49
+ reason: `token budget at ${tokenSpendPercent}% (${dailyTokensUsed.toLocaleString()}/${dailyTokenBudget.toLocaleString()})`,
50
+ activeCount,
51
+ tokenSpendPercent,
52
+ dailyTokensUsed,
53
+ };
54
+ }
55
+ return {
56
+ promoteBlocked: false,
57
+ activeCount,
58
+ tokenSpendPercent,
59
+ dailyTokensUsed,
60
+ };
61
+ }
62
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/pm/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function makeCallClaude(): (prompt: string) => Promise<string>;
2
+ export declare function makeCallClaudeSonnet(): (prompt: string) => Promise<string>;
3
+ //# sourceMappingURL=call-claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-claude.d.ts","sourceRoot":"","sources":["../../src/pm/call-claude.ts"],"names":[],"mappings":"AAqCA,wBAAgB,cAAc,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAEpE;AAED,wBAAgB,oBAAoB,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAE1E"}
@@ -0,0 +1,37 @@
1
+ import { consumeAgentStream } from "../executor/agent-stream.js";
2
+ import { isClaudeAuthValid } from "../executor/auth-check.js";
3
+ const PM_AGENT_MODEL = "claude-haiku-4-5-20251001";
4
+ const PM_AGENT_SONNET_MODEL = "claude-sonnet-4-5-20251001";
5
+ // The Agent SDK registers exit listeners per query() call. With frequent PM Agent
6
+ // ticks these accumulate past Node's default limit of 10. Raise it to prevent warnings.
7
+ if (typeof process !== "undefined" && process.setMaxListeners) {
8
+ process.setMaxListeners(Math.max(process.getMaxListeners(), 50));
9
+ }
10
+ function makeCallClaudeWithModel(model) {
11
+ let callFn = null;
12
+ return async (prompt) => {
13
+ // Pre-flight auth check — fail fast before burning a query.
14
+ if (!(await isClaudeAuthValid())) {
15
+ throw new Error("Claude auth credentials are invalid or expired. Run: docker compose exec <service> claude login");
16
+ }
17
+ if (!callFn) {
18
+ const { query } = await import("@anthropic-ai/claude-agent-sdk");
19
+ callFn = async (p) => {
20
+ const messages = query({
21
+ prompt: p,
22
+ options: { model, maxTurns: 1, allowedTools: [] },
23
+ });
24
+ const result = await consumeAgentStream(messages);
25
+ return result.lastText;
26
+ };
27
+ }
28
+ return callFn(prompt);
29
+ };
30
+ }
31
+ export function makeCallClaude() {
32
+ return makeCallClaudeWithModel(PM_AGENT_MODEL);
33
+ }
34
+ export function makeCallClaudeSonnet() {
35
+ return makeCallClaudeWithModel(PM_AGENT_SONNET_MODEL);
36
+ }
37
+ //# sourceMappingURL=call-claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-claude.js","sourceRoot":"","sources":["../../src/pm/call-claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,cAAc,GAAG,2BAA2B,CAAC;AACnD,MAAM,qBAAqB,GAAG,4BAA4B,CAAC;AAE3D,kFAAkF;AAClF,wFAAwF;AACxF,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAC9D,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa;IAC5C,IAAI,MAAM,GAAiD,IAAI,CAAC;IAChE,OAAO,KAAK,EAAE,MAAc,EAAE,EAAE;QAC9B,4DAA4D;QAC5D,IAAI,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YACjE,MAAM,GAAG,KAAK,EAAE,CAAS,EAAE,EAAE;gBAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC;oBACrB,MAAM,EAAE,CAAC;oBACT,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;iBAClD,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAClD,OAAO,MAAM,CAAC,QAAQ,CAAC;YACzB,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,uBAAuB,CAAC,cAAc,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,uBAAuB,CAAC,qBAAqB,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Parse the `**Files**:` section from a Linear issue description.
3
+ * Matches the pattern: **Files**: path/a.ts, path/b.ts
4
+ * or multi-value forms like:
5
+ * **Files**: `path/a.ts`, `packages/core/src/b.ts`
6
+ */
7
+ export declare function parseIssueFiles(description: string): string[];
8
+ export interface IssueWithFiles {
9
+ issueId: string;
10
+ /** Linear priority: 1 = urgent, 2 = high, 3 = medium, 4 = low, 0 = no priority */
11
+ priority: number;
12
+ files: string[];
13
+ }
14
+ /**
15
+ * Build a conflict matrix for a list of issues.
16
+ * Returns a Map of issueId -> array of issueIds it conflicts with.
17
+ * Conflict = at least one shared file path.
18
+ */
19
+ export declare function buildConflictMatrix(issues: IssueWithFiles[]): Map<string, string[]>;
20
+ export interface FileOverlapResult {
21
+ hasConflict: boolean;
22
+ overlappingFiles: string[];
23
+ conflictingRunIds: string[];
24
+ }
25
+ /**
26
+ * Check whether a candidate's files overlap with any currently active run.
27
+ *
28
+ * @param candidateFiles - Files the new issue is expected to touch.
29
+ * @param activeWorkMap - runId → Set<filePath> from PipelineRunner.
30
+ */
31
+ export declare function detectFileOverlap(candidateFiles: string[], activeWorkMap: ReadonlyMap<string, ReadonlySet<string>>): FileOverlapResult;
32
+ /**
33
+ * Sort issues for parallel assignment:
34
+ * 1. Higher priority issues first (lower numeric value = higher priority).
35
+ * 2. When two issues conflict, the one with higher priority is kept for
36
+ * immediate assignment; the other is deferred.
37
+ *
38
+ * Returns an ordered list where each selected issue has no file overlap with
39
+ * any previously selected issue in the slice.
40
+ */
41
+ export declare function sortAndFilterNonConflicting(issues: IssueWithFiles[]): IssueWithFiles[];
42
+ //# sourceMappingURL=conflict-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-detector.d.ts","sourceRoot":"","sources":["../../src/pm/conflict-detector.ts"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB7D;AAMD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,EAAE,GACvB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CA4BvB;AAMD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,EAAE,EACxB,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,GACtD,iBAAiB,CAsBnB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,cAAc,EAAE,GACvB,cAAc,EAAE,CAyBlB"}
@@ -0,0 +1,116 @@
1
+ import { createLogger } from "../logger.js";
2
+ const log = createLogger({ component: "PmAgent:conflict-detector" });
3
+ // ---------------------------------------------------------------------------
4
+ // Issue file parsing
5
+ // ---------------------------------------------------------------------------
6
+ /**
7
+ * Parse the `**Files**:` section from a Linear issue description.
8
+ * Matches the pattern: **Files**: path/a.ts, path/b.ts
9
+ * or multi-value forms like:
10
+ * **Files**: `path/a.ts`, `packages/core/src/b.ts`
11
+ */
12
+ export function parseIssueFiles(description) {
13
+ if (!description)
14
+ return [];
15
+ // Match **Files**: followed by a value on the same line
16
+ const match = description.match(/\*\*Files\*\*:\s*([^\n]+)/i);
17
+ if (!match)
18
+ return [];
19
+ const raw = match[1];
20
+ // Split by comma, strip backticks, whitespace, and sanitize each path
21
+ return raw
22
+ .split(",")
23
+ .map((f) => f
24
+ .replace(/`/g, "")
25
+ .replace(/[^\w/.@_-]/g, "")
26
+ .trim())
27
+ .filter(Boolean);
28
+ }
29
+ /**
30
+ * Build a conflict matrix for a list of issues.
31
+ * Returns a Map of issueId -> array of issueIds it conflicts with.
32
+ * Conflict = at least one shared file path.
33
+ */
34
+ export function buildConflictMatrix(issues) {
35
+ const matrix = new Map();
36
+ for (let i = 0; i < issues.length; i++) {
37
+ const a = issues[i];
38
+ if (!matrix.has(a.issueId))
39
+ matrix.set(a.issueId, []);
40
+ for (let j = i + 1; j < issues.length; j++) {
41
+ const b = issues[j];
42
+ const aFiles = new Set(a.files);
43
+ const hasOverlap = b.files.some((f) => aFiles.has(f));
44
+ if (hasOverlap) {
45
+ matrix.get(a.issueId).push(b.issueId);
46
+ if (!matrix.has(b.issueId))
47
+ matrix.set(b.issueId, []);
48
+ matrix.get(b.issueId).push(a.issueId);
49
+ log.debug({ issueA: a.issueId, issueB: b.issueId }, "conflict detected between issues");
50
+ }
51
+ }
52
+ }
53
+ return matrix;
54
+ }
55
+ /**
56
+ * Check whether a candidate's files overlap with any currently active run.
57
+ *
58
+ * @param candidateFiles - Files the new issue is expected to touch.
59
+ * @param activeWorkMap - runId → Set<filePath> from PipelineRunner.
60
+ */
61
+ export function detectFileOverlap(candidateFiles, activeWorkMap) {
62
+ const overlappingFiles = [];
63
+ const conflictingRunIds = [];
64
+ const candidateSet = new Set(candidateFiles);
65
+ for (const [runId, files] of activeWorkMap) {
66
+ const shared = [];
67
+ for (const f of files) {
68
+ if (candidateSet.has(f))
69
+ shared.push(f);
70
+ }
71
+ if (shared.length > 0) {
72
+ overlappingFiles.push(...shared);
73
+ conflictingRunIds.push(runId);
74
+ }
75
+ }
76
+ return {
77
+ hasConflict: conflictingRunIds.length > 0,
78
+ overlappingFiles: [...new Set(overlappingFiles)],
79
+ conflictingRunIds,
80
+ };
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Priority-aware issue ordering
84
+ // ---------------------------------------------------------------------------
85
+ /**
86
+ * Sort issues for parallel assignment:
87
+ * 1. Higher priority issues first (lower numeric value = higher priority).
88
+ * 2. When two issues conflict, the one with higher priority is kept for
89
+ * immediate assignment; the other is deferred.
90
+ *
91
+ * Returns an ordered list where each selected issue has no file overlap with
92
+ * any previously selected issue in the slice.
93
+ */
94
+ export function sortAndFilterNonConflicting(issues) {
95
+ // Sort: priority ascending (1 = urgent first), then stable by original order
96
+ const sorted = [...issues].sort((a, b) => {
97
+ const pa = a.priority === 0 ? 999 : a.priority;
98
+ const pb = b.priority === 0 ? 999 : b.priority;
99
+ return pa - pb;
100
+ });
101
+ const selected = [];
102
+ const assignedFiles = new Set();
103
+ for (const issue of sorted) {
104
+ const overlap = issue.files.some((f) => assignedFiles.has(f));
105
+ if (!overlap) {
106
+ selected.push(issue);
107
+ for (const f of issue.files)
108
+ assignedFiles.add(f);
109
+ }
110
+ else {
111
+ log.info({ issueId: issue.issueId, priority: issue.priority }, "deferring issue — file conflict with higher-priority assignment");
112
+ }
113
+ }
114
+ return selected;
115
+ }
116
+ //# sourceMappingURL=conflict-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-detector.js","sourceRoot":"","sources":["../../src/pm/conflict-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ConflictCheckResult } from "./types.js";
2
+ export interface ActiveRun {
3
+ issueId: string;
4
+ branch: string;
5
+ }
6
+ export interface GetActiveFileMapsInput {
7
+ activeRuns: ActiveRun[];
8
+ defaultBranch: string;
9
+ repoDir: string;
10
+ execGit: (args: string[], cwd: string) => Promise<string>;
11
+ }
12
+ export declare function getActiveFileMaps(input: GetActiveFileMapsInput): Promise<Map<string, Set<string>>>;
13
+ export interface PredictConflictInput {
14
+ candidateDescription: string;
15
+ activeFileMaps: Map<string, Set<string>>;
16
+ callClaude: (prompt: string) => Promise<string>;
17
+ sanitize?: (text: string) => string;
18
+ }
19
+ export declare function predictConflict(input: PredictConflictInput): Promise<ConflictCheckResult>;
20
+ //# sourceMappingURL=conflict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict.d.ts","sourceRoot":"","sources":["../../src/pm/conflict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAMtD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3D;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CA8BnC;AAED,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAqC9B"}
@@ -0,0 +1,63 @@
1
+ import { parseJsonObject } from "../executor/agent-stream.js";
2
+ import { createLogger } from "../logger.js";
3
+ const log = createLogger({ component: "PmAgent:conflict" });
4
+ export async function getActiveFileMaps(input) {
5
+ const { activeRuns, defaultBranch, repoDir, execGit } = input;
6
+ const fileMaps = new Map();
7
+ if (activeRuns.length === 0)
8
+ return fileMaps;
9
+ try {
10
+ await execGit(["fetch", "--quiet"], repoDir);
11
+ }
12
+ catch {
13
+ log.warn("git fetch failed, proceeding with local refs");
14
+ }
15
+ for (const run of activeRuns) {
16
+ try {
17
+ const output = await execGit(["diff", "--name-only", `origin/${defaultBranch}..origin/${run.branch}`], repoDir);
18
+ const files = output
19
+ .split("\n")
20
+ .map((f) => f.trim())
21
+ .filter(Boolean);
22
+ fileMaps.set(run.issueId, new Set(files));
23
+ }
24
+ catch (err) {
25
+ log.warn({ issueId: run.issueId, branch: run.branch, err }, "git diff failed, treating as empty");
26
+ fileMaps.set(run.issueId, new Set());
27
+ }
28
+ }
29
+ return fileMaps;
30
+ }
31
+ export async function predictConflict(input) {
32
+ const { candidateDescription, activeFileMaps, callClaude, sanitize } = input;
33
+ const allActiveFiles = [];
34
+ for (const files of activeFileMaps.values()) {
35
+ for (const f of files)
36
+ allActiveFiles.push(f);
37
+ }
38
+ if (allActiveFiles.length === 0) {
39
+ return { overlapRisk: "none", likelyFiles: [], reasoning: "no active runs with known files" };
40
+ }
41
+ const safeDescription = sanitize ? sanitize(candidateDescription) : candidateDescription;
42
+ const safeFiles = allActiveFiles.map((f) => f.replace(/[^\w/.@_-]/g, "").slice(0, 500));
43
+ const prompt = `You are analyzing whether a new issue would conflict with files already being modified.\n\n` +
44
+ `Files currently being modified by in-flight issues:\n${safeFiles.join("\n")}\n\n` +
45
+ `New issue description:\n${safeDescription}\n\n` +
46
+ `Return ONLY a JSON object: { "likelyFiles": ["file paths this issue would touch"], "overlapRisk": "none"|"low"|"high", "reasoning": "one sentence" }`;
47
+ try {
48
+ const response = await callClaude(prompt);
49
+ const parsed = parseJsonObject(response);
50
+ if (!parsed)
51
+ throw new Error("No JSON found");
52
+ return {
53
+ overlapRisk: parsed.overlapRisk ?? "low",
54
+ likelyFiles: parsed.likelyFiles ?? [],
55
+ reasoning: parsed.reasoning ?? "",
56
+ };
57
+ }
58
+ catch (err) {
59
+ log.warn({ err }, "conflict prediction failed, defaulting to low risk");
60
+ return { overlapRisk: "low", likelyFiles: [], reasoning: "prediction failed, defaulting to low" };
61
+ }
62
+ }
63
+ //# sourceMappingURL=conflict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict.js","sourceRoot":"","sources":["../../src/pm/conflict.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;AAc5D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA6B;IAE7B,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEhD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,aAAa,YAAY,GAAG,CAAC,MAAM,EAAE,CAAC,EACxE,OAAO,CACR,CAAC;YACF,MAAM,KAAK,GAAG,MAAM;iBACjB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,oCAAoC,CAAC,CAAC;YAClG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B;IAE3B,MAAM,EAAE,oBAAoB,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAE7E,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,iCAAiC,EAAE,CAAC;IAChG,CAAC;IAED,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACzF,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACzC,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAC3C,CAAC;IAEF,MAAM,MAAM,GACV,6FAA6F;QAC7F,wDAAwD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;QAClF,2BAA2B,eAAe,MAAM;QAChD,sJAAsJ,CAAC;IAEzJ,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAE9C,OAAO;YACL,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK;YACxC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;YACrC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,oDAAoD,CAAC,CAAC;QACxE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,sCAAsC,EAAE,CAAC;IACpG,CAAC;AACH,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { AnyDb } from "../db/client.js";
2
+ export interface ActiveWorkEntry {
3
+ id: string;
4
+ runId: string;
5
+ issueId: string;
6
+ stage: string;
7
+ filesModified: string[] | null;
8
+ startedAt: Date;
9
+ updatedAt: Date;
10
+ }
11
+ export interface FileOverlapResult {
12
+ hasOverlap: boolean;
13
+ overlappingFiles: string[];
14
+ conflictingRunIds: string[];
15
+ }
16
+ /**
17
+ * Register or update an active work entry for a pipeline run.
18
+ * Call this before each stage starts.
19
+ */
20
+ export declare function upsertActiveWork(db: AnyDb, entry: {
21
+ runId: string;
22
+ issueId: string;
23
+ stage: string;
24
+ filesModified?: string[];
25
+ }): Promise<void>;
26
+ /**
27
+ * Remove an active work entry once a pipeline run completes or fails.
28
+ */
29
+ export declare function removeActiveWork(db: AnyDb, runId: string): Promise<void>;
30
+ /**
31
+ * Check whether any currently-active runs are modifying the given files.
32
+ * Returns overlap details so the caller can decide to wait or adjust scope.
33
+ */
34
+ export declare function checkFileOverlap(db: AnyDb, runId: string, files: string[]): Promise<FileOverlapResult>;
35
+ /**
36
+ * Get all currently-active work entries (for dashboard display).
37
+ */
38
+ export declare function getActiveWork(db: AnyDb): Promise<ActiveWorkEntry[]>;
39
+ /**
40
+ * Get the list of files modified in the worktree — both uncommitted working
41
+ * tree changes and any commits pushed ahead of origin on this branch.
42
+ *
43
+ * Combines two sources:
44
+ * 1. `git status --porcelain` — staged and unstaged working-tree changes
45
+ * 2. `git log --name-only origin..HEAD` — files in branch-local commits
46
+ *
47
+ * Results are deduplicated. Returns [] on error (non-throwing).
48
+ */
49
+ export declare function getModifiedFiles(worktreePath: string): Promise<string[]>;
50
+ //# sourceMappingURL=coordination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordination.d.ts","sourceRoot":"","sources":["../../src/pm/coordination.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAY7C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,KAAK,EACT,KAAK,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,GACA,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,KAAK,EACT,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,KAAK,EACT,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,iBAAiB,CAAC,CA8C5B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAgBzE;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA8B9E"}