@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,586 @@
1
+ import { execFile } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { access, chmod, mkdir, readdir, rm, stat, writeFile } from "node:fs/promises";
4
+ import { createLogger, getLogContext } from "../logger.js";
5
+ const baseLog = createLogger({ component: "git" });
6
+ /** Return a logger enriched with the current ALS context (issueId, runId) if present. */
7
+ function getLog() {
8
+ const ctx = getLogContext();
9
+ return ctx ? baseLog.child(ctx) : baseLog;
10
+ }
11
+ /**
12
+ * Normalize a git remote URL for comparison.
13
+ * Strips trailing slashes and .git suffix.
14
+ */
15
+ function normalizeGitUrl(url) {
16
+ return url.replace(/\/+$/, "").replace(/\.git$/, "");
17
+ }
18
+ /**
19
+ * Execute a git command with the given args in the given cwd.
20
+ * Uses execFile (never exec) to prevent command injection.
21
+ *
22
+ * Per-command execution details are logged at debug level; errors at error level.
23
+ */
24
+ export function gitExec(args, cwd, timeoutMs = 120_000) {
25
+ const log = getLog();
26
+ log.debug({ args, cwd }, "git exec");
27
+ return new Promise((resolve, reject) => {
28
+ const proc = execFile("git", args, { cwd, timeout: timeoutMs, maxBuffer: 10 * 1024 * 1024 }, (error, stdout, stderr) => {
29
+ if (error) {
30
+ log.error({ args, cwd, stderr: stderr?.slice(0, 200) }, `git ${args[0]} failed`);
31
+ reject(new Error(`git ${args[0]} failed: ${stderr || error.message}`));
32
+ }
33
+ else {
34
+ log.debug({ args, cwd }, `git ${args[0]} succeeded`);
35
+ resolve(stdout.trim());
36
+ }
37
+ });
38
+ proc.on("exit", (code) => {
39
+ log.debug({ args: args[0], cwd, exitCode: code }, "git process exited");
40
+ });
41
+ });
42
+ }
43
+ /**
44
+ * Non-throwing variant of gitExec. Returns trimmed stdout on success,
45
+ * empty string on failure. For commands where leading whitespace matters
46
+ * (e.g. git status --porcelain), use gitExecRaw instead.
47
+ */
48
+ export async function gitExecSafe(args, cwd, timeoutMs = 15_000) {
49
+ try {
50
+ return await gitExec(args, cwd, timeoutMs);
51
+ }
52
+ catch {
53
+ return "";
54
+ }
55
+ }
56
+ /**
57
+ * Like gitExecSafe but preserves leading whitespace in output.
58
+ * Needed for `git status --porcelain` where " M file.txt" has meaningful leading space.
59
+ */
60
+ export function gitExecRaw(args, cwd, timeoutMs = 15_000) {
61
+ const log = getLog();
62
+ return new Promise((resolve) => {
63
+ execFile("git", args, { cwd, timeout: timeoutMs, maxBuffer: 10 * 1024 * 1024 }, (error, stdout) => {
64
+ if (error) {
65
+ log.warn({ args: args[0], err: error.message }, "git command failed (non-fatal)");
66
+ resolve("");
67
+ }
68
+ else {
69
+ resolve(stdout.trimEnd());
70
+ }
71
+ });
72
+ });
73
+ }
74
+ /**
75
+ * Clone the repo to dir. If dir exists and has the correct remote, run fetchLatest instead.
76
+ */
77
+ export async function cloneRepo(url, dir) {
78
+ try {
79
+ await access(dir);
80
+ // Directory exists — check if it has the correct remote
81
+ try {
82
+ const remote = await gitExec(["remote", "get-url", "origin"], dir);
83
+ if (normalizeGitUrl(remote) === normalizeGitUrl(url)) {
84
+ await fetchLatest(dir);
85
+ return;
86
+ }
87
+ }
88
+ catch {
89
+ // Not a git repo or no remote — fall through to clone
90
+ }
91
+ }
92
+ catch {
93
+ // Directory doesn't exist — proceed to clone
94
+ }
95
+ getLog().info({ url, dir }, "cloning repository");
96
+ await new Promise((resolve, reject) => {
97
+ execFile("git", ["clone", url, dir], { timeout: 120_000, maxBuffer: 10 * 1024 * 1024 }, (error, _stdout, stderr) => {
98
+ if (error) {
99
+ reject(new Error(`git clone failed: ${stderr || error.message}`));
100
+ }
101
+ else {
102
+ resolve();
103
+ }
104
+ });
105
+ });
106
+ }
107
+ /**
108
+ * Fetch latest from origin.
109
+ */
110
+ export async function fetchLatest(repoDir) {
111
+ await gitExec(["fetch", "origin"], repoDir);
112
+ }
113
+ /**
114
+ * Try to add a git worktree. If it fails with "already checked out",
115
+ * force-remove the stale worktree and retry once.
116
+ */
117
+ async function worktreeAddWithRetry(repoDir, args, worktreePath) {
118
+ const log = getLog();
119
+ await gitExec(["worktree", "prune"], repoDir);
120
+ try {
121
+ await gitExec(["worktree", "add", ...args], repoDir);
122
+ }
123
+ catch (err) {
124
+ const msg = err instanceof Error ? err.message : String(err);
125
+ if (!msg.includes("already checked out"))
126
+ throw err;
127
+ // Extract the stale worktree path from the error message:
128
+ // "fatal: '<branch>' is already checked out at '<path>'"
129
+ const match = msg.match(/already checked out at '([^']+)'/);
130
+ const stalePath = match?.[1];
131
+ if (stalePath) {
132
+ log.warn({ stalePath, worktreePath }, "removing stale worktree blocking branch checkout");
133
+ try {
134
+ await gitExec(["worktree", "remove", stalePath, "--force"], repoDir);
135
+ }
136
+ catch {
137
+ // If git worktree remove fails, force-delete the directory
138
+ await rm(stalePath, { recursive: true, force: true });
139
+ await gitExec(["worktree", "prune"], repoDir);
140
+ }
141
+ }
142
+ else {
143
+ // Can't parse the stale path — just prune and hope
144
+ await gitExec(["worktree", "prune"], repoDir);
145
+ }
146
+ // Retry once
147
+ await gitExec(["worktree", "add", ...args], repoDir);
148
+ }
149
+ }
150
+ /**
151
+ * Create a git worktree for the given run.
152
+ * Creates branch from HEAD. Returns the worktree path.
153
+ * If the branch is already checked out in a stale worktree, removes it and retries.
154
+ * Also installs a pre-push branch-safety hook in the shared .git directory.
155
+ */
156
+ export async function createWorktree(repoDir, runId, branch, baseDir = "/tmp/agent-runs") {
157
+ const worktreePath = join(baseDir, runId, "worktree");
158
+ await worktreeAddWithRetry(repoDir, ["-B", branch, worktreePath], worktreePath);
159
+ // Install pre-push hook to guard against cross-branch contamination (BEC-99).
160
+ await installPrePushHook(repoDir);
161
+ return worktreePath;
162
+ }
163
+ /**
164
+ * Create a git worktree that checks out an existing remote branch.
165
+ * Used for feedback runs where the PR branch already exists.
166
+ * Fetches origin first, then creates the worktree from origin/<branch>.
167
+ * Returns the worktree path.
168
+ * Also installs a pre-push branch-safety hook in the shared .git directory.
169
+ */
170
+ export async function createWorktreeFromRemote(repoDir, runId, branch, baseDir = "/tmp/agent-runs") {
171
+ const worktreePath = join(baseDir, runId, "worktree");
172
+ await gitExec(["fetch", "origin"], repoDir, 60_000);
173
+ await worktreeAddWithRetry(repoDir, ["-B", branch, worktreePath, `origin/${branch}`], worktreePath);
174
+ // Install pre-push hook to guard against cross-branch contamination (BEC-99).
175
+ await installPrePushHook(repoDir);
176
+ return worktreePath;
177
+ }
178
+ /**
179
+ * Read the current HEAD branch name for a worktree.
180
+ * Returns the branch name (e.g. "agent/BEC-99-foo") or empty string on failure.
181
+ */
182
+ export async function getCurrentBranch(worktreePath) {
183
+ return gitExecSafe(["rev-parse", "--abbrev-ref", "HEAD"], worktreePath);
184
+ }
185
+ /**
186
+ * Verify that the worktree's HEAD is on the expected branch.
187
+ * Throws an Error (and logs) if a mismatch is detected.
188
+ *
189
+ * This is the primary cross-worktree contamination guard: if an agent (or a
190
+ * tool invoked by the agent) ran `git checkout <other-branch>` inside the
191
+ * worktree, any subsequent commit or push would silently land on the wrong
192
+ * branch. Calling this function before committing or pushing turns the
193
+ * silent data loss into a loud, recoverable error.
194
+ */
195
+ export async function verifyBranchMatch(worktreePath, expectedBranch) {
196
+ const current = await getCurrentBranch(worktreePath);
197
+ if (current && current !== expectedBranch) {
198
+ const msg = `Branch mismatch detected in worktree — expected "${expectedBranch}" ` +
199
+ `but HEAD is on "${current}". ` +
200
+ `Aborting to prevent cross-branch contamination.`;
201
+ getLog().error({ worktreePath, expectedBranch, currentBranch: current }, msg);
202
+ throw new Error(msg);
203
+ }
204
+ }
205
+ /**
206
+ * Install a pre-push git hook in the shared .git directory of the given clone.
207
+ * The hook verifies that the branch being pushed matches the worktree's HEAD,
208
+ * providing a last-line-of-defence against cross-branch contamination.
209
+ *
210
+ * Because all worktrees of a clone share the same .git/hooks/ directory, this
211
+ * hook is installed once per clone — it protects every worktree.
212
+ *
213
+ * The hook is idempotent: if a pre-push hook already exists that was installed
214
+ * by the Linear Agent Framework, it is not overwritten.
215
+ */
216
+ export async function installPrePushHook(repoDir) {
217
+ const log = getLog();
218
+ // Find the .git directory for this repo (main clone, not a worktree)
219
+ const gitDir = join(repoDir, ".git");
220
+ // For a bare worktree the .git entry is a file, not a directory.
221
+ // We only install the hook in full clones (directory).
222
+ let isGitDir = false;
223
+ try {
224
+ const s = await stat(gitDir);
225
+ isGitDir = s.isDirectory();
226
+ }
227
+ catch {
228
+ isGitDir = false;
229
+ }
230
+ if (!isGitDir) {
231
+ log.debug({ repoDir }, "installPrePushHook: .git is not a directory (worktree file) — skipping");
232
+ return;
233
+ }
234
+ const hooksDir = join(gitDir, "hooks");
235
+ await mkdir(hooksDir, { recursive: true });
236
+ const hookPath = join(hooksDir, "pre-push");
237
+ // Only install/update if it is our hook or does not yet exist.
238
+ let existing = "";
239
+ try {
240
+ existing = await import("node:fs/promises").then(({ readFile }) => readFile(hookPath, "utf8"));
241
+ }
242
+ catch { /* not found */ }
243
+ if (existing && !existing.includes("# Installed by Linear Agent Framework")) {
244
+ log.debug({ hookPath }, "pre-push hook already exists (not ours) — leaving it in place");
245
+ return;
246
+ }
247
+ const hookScript = [
248
+ "#!/bin/sh",
249
+ "# Installed by Linear Agent Framework (BEC-99)",
250
+ "# Prevents cross-branch contamination when parallel agents share a .git directory.",
251
+ "#",
252
+ "# The hook verifies that every ref being pushed to the remote matches the",
253
+ "# current HEAD branch of this worktree. If a `git checkout <other-branch>`",
254
+ "# was run inside the worktree, this hook aborts the push immediately.",
255
+ "",
256
+ "while IFS=' ' read -r local_ref _local_sha remote_ref _remote_sha; do",
257
+ " # remote_ref looks like refs/heads/<branch-name>",
258
+ " expected_branch=\"${remote_ref#refs/heads/}\"",
259
+ " current_branch=$(git symbolic-ref --short HEAD 2>/dev/null)",
260
+ " if [ -n \"$current_branch\" ] && [ \"$current_branch\" != \"$expected_branch\" ]; then",
261
+ " echo \"ERROR: Linear Agent Framework pre-push hook: branch mismatch detected.\" >&2",
262
+ " echo \" HEAD is on : $current_branch\" >&2",
263
+ " echo \" Pushing to : $expected_branch\" >&2",
264
+ " echo \" Aborting push to prevent cross-branch contamination.\" >&2",
265
+ " exit 1",
266
+ " fi",
267
+ "done",
268
+ "",
269
+ "exit 0",
270
+ ].join("\n") + "\n";
271
+ await writeFile(hookPath, hookScript, "utf8");
272
+ await chmod(hookPath, 0o755);
273
+ log.info({ hookPath }, "installed pre-push branch-safety hook");
274
+ }
275
+ /**
276
+ * Remove a worktree.
277
+ */
278
+ export async function deleteWorktree(worktreePath) {
279
+ // We need to find the main repo from the worktree, then remove it
280
+ // git worktree remove must be run from the main repo or we can use --force
281
+ await new Promise((resolve, reject) => {
282
+ execFile("git", ["worktree", "remove", worktreePath, "--force"], (error, _stdout, stderr) => {
283
+ if (error) {
284
+ reject(new Error(`git worktree remove failed: ${stderr || error.message}`));
285
+ }
286
+ else {
287
+ resolve();
288
+ }
289
+ });
290
+ });
291
+ }
292
+ /**
293
+ * Push the branch to origin.
294
+ * Verifies that the worktree HEAD is on the expected branch before pushing
295
+ * to prevent cross-branch contamination (BEC-99).
296
+ */
297
+ export async function pushBranch(worktreePath, branch) {
298
+ await verifyBranchMatch(worktreePath, branch);
299
+ await gitExec(["push", "origin", branch], worktreePath);
300
+ }
301
+ /**
302
+ * Fetch latest from origin and rebase the current branch on top of
303
+ * origin/<baseBranch>.
304
+ *
305
+ * Returns { success: true } if the rebase applied cleanly.
306
+ * Returns { success: false } if there are unresolved conflicts — the caller
307
+ * must either resolve them (then run `git rebase --continue`) or call
308
+ * abortRebase() before attempting another git operation.
309
+ */
310
+ export async function rebaseBranch(worktreePath, baseBranch) {
311
+ const log = getLog();
312
+ try {
313
+ await gitExec(["fetch", "origin"], worktreePath, 30_000);
314
+ }
315
+ catch (fetchErr) {
316
+ log.error({ baseBranch, err: fetchErr }, "rebase: fetch failed");
317
+ return { success: false, hasConflicts: false };
318
+ }
319
+ try {
320
+ await gitExec(["rebase", `origin/${baseBranch}`], worktreePath, 60_000);
321
+ return { success: true, hasConflicts: false };
322
+ }
323
+ catch {
324
+ // Check if a rebase is actually in progress (i.e. conflicts)
325
+ try {
326
+ const status = await gitExec(["status", "--porcelain"], worktreePath, 5_000);
327
+ const hasConflicts = status.includes("UU") || status.includes("AA") || status.includes("DD");
328
+ if (hasConflicts) {
329
+ log.warn({ baseBranch }, "rebase failed — conflicts detected");
330
+ }
331
+ else {
332
+ log.error({ baseBranch }, "rebase failed — not a conflict (check git state)");
333
+ }
334
+ return { success: false, hasConflicts };
335
+ }
336
+ catch {
337
+ log.error({ baseBranch }, "rebase failed and could not check status");
338
+ return { success: false, hasConflicts: false };
339
+ }
340
+ }
341
+ }
342
+ /**
343
+ * Abort an in-progress rebase (non-throwing).
344
+ * Safe to call even when no rebase is in progress.
345
+ */
346
+ export async function abortRebase(worktreePath) {
347
+ await gitExecSafe(["rebase", "--abort"], worktreePath, 15_000);
348
+ }
349
+ /**
350
+ * Push the branch to origin using --force-with-lease.
351
+ * Used as a fallback when auto-rebase fails and the pipeline needs to push
352
+ * the original (possibly diverged) branch for human review.
353
+ * Verifies that the worktree HEAD is on the expected branch before pushing
354
+ * to prevent cross-branch contamination (BEC-99).
355
+ */
356
+ export async function pushBranchForce(worktreePath, branch) {
357
+ await verifyBranchMatch(worktreePath, branch);
358
+ await gitExec(["push", "origin", branch, "--force-with-lease"], worktreePath);
359
+ }
360
+ /**
361
+ * Determines the push strategy for a given branch and rebase state.
362
+ *
363
+ * Returns `"force-with-lease"` when:
364
+ * - The branch name starts with `"agent/"` (pipeline-owned branches that may
365
+ * have a stale remote ref from a previous failed run), OR
366
+ * - `rebaseConflict` is true (force-push to preserve diverged work for human review).
367
+ *
368
+ * Returns `"standard"` for all other branches (human-owned branches where an
369
+ * accidental force-push could overwrite reviewer commits).
370
+ */
371
+ export function choosePushStrategy(branch, rebaseConflict) {
372
+ if (rebaseConflict || branch.startsWith("agent/")) {
373
+ return "force-with-lease";
374
+ }
375
+ return "standard";
376
+ }
377
+ /**
378
+ * Check for uncommitted changes and auto-commit them if found.
379
+ * Returns true if a commit was made, false if the worktree was clean.
380
+ *
381
+ * This is a safety net for when the agent doesn't commit its work
382
+ * (hits maxTurns, maxTokens, or a permission error). Without this,
383
+ * the push queue's rebase fails and the work is lost.
384
+ *
385
+ * @param expectedBranch - When provided, the function verifies that the
386
+ * worktree HEAD is on this branch before committing. A mismatch throws
387
+ * immediately to prevent cross-branch contamination (BEC-99).
388
+ */
389
+ export async function autoCommitChanges(worktreePath, issueId, expectedBranch) {
390
+ // Branch-safety guard (BEC-99): verify HEAD before touching the worktree.
391
+ if (expectedBranch) {
392
+ await verifyBranchMatch(worktreePath, expectedBranch);
393
+ }
394
+ const status = await gitExecSafe(["status", "--porcelain"], worktreePath);
395
+ if (!status.trim())
396
+ return false;
397
+ getLog().warn({ issueId, worktreePath }, "auto-committing uncommitted changes (agent did not commit)");
398
+ await gitExecSafe(["add", "-A"], worktreePath);
399
+ try {
400
+ await gitExec(["commit", "-m", `feat(${issueId}): agent implementation (auto-committed)`], worktreePath);
401
+ return true;
402
+ }
403
+ catch {
404
+ getLog().warn({ issueId }, "auto-commit failed (possibly no changes after git add)");
405
+ return false;
406
+ }
407
+ }
408
+ /**
409
+ * Get commit subject lines authored on this branch since it diverged from the
410
+ * base branch. Used to include agent-authored commit messages in PR descriptions.
411
+ * Returns commits in chronological order (oldest first).
412
+ * Returns an empty array on failure (fail-open — commit listing is best-effort).
413
+ */
414
+ export async function getAgentCommits(worktreePath, baseBranch) {
415
+ const log = getLog();
416
+ try {
417
+ // Try using origin first (normal case in production)
418
+ const output = await gitExec(["log", "--format=%s", "--reverse", `origin/${baseBranch}..HEAD`], worktreePath);
419
+ return output.split("\n").map((l) => l.trim()).filter(Boolean);
420
+ }
421
+ catch (originErr) {
422
+ // Fall back to local branch (for testing or local-only repos)
423
+ try {
424
+ const output = await gitExec(["log", "--format=%s", "--reverse", `${baseBranch}..HEAD`], worktreePath);
425
+ return output.split("\n").map((l) => l.trim()).filter(Boolean);
426
+ }
427
+ catch {
428
+ log.warn({ baseBranch }, "getAgentCommits failed on both origin and local branch — commit messages will be omitted from PR");
429
+ return [];
430
+ }
431
+ }
432
+ }
433
+ /**
434
+ * Create a PR using the `gh` CLI. Returns the PR URL.
435
+ * Falls back gracefully — returns empty string if `gh` is not available.
436
+ */
437
+ export async function createPRViaCli(options) {
438
+ const args = [
439
+ "pr", "create",
440
+ "--head", options.branch,
441
+ "--base", options.base,
442
+ "--title", options.title,
443
+ "--body", options.body,
444
+ ];
445
+ if (options.draft)
446
+ args.push("--draft");
447
+ return new Promise((resolve) => {
448
+ execFile("gh", args, { cwd: options.worktreePath, timeout: 30_000 }, (error, stdout, stderr) => {
449
+ if (error) {
450
+ getLog().error({ branch: options.branch, stderr: stderr || error.message }, "gh pr create failed");
451
+ resolve("");
452
+ }
453
+ else {
454
+ // gh pr create outputs the PR URL on stdout
455
+ resolve(stdout.trim());
456
+ }
457
+ });
458
+ });
459
+ }
460
+ /**
461
+ * Merge a PR using the `gh` CLI. Returns true on success.
462
+ */
463
+ export async function mergePRViaCli(worktreePath, branch) {
464
+ return new Promise((resolve) => {
465
+ execFile("gh", ["pr", "merge", branch, "--merge", "--delete-branch"], { cwd: worktreePath, timeout: 30_000 }, (error, _stdout, stderr) => {
466
+ if (error) {
467
+ getLog().error({ branch, err: stderr || error.message }, "gh pr merge failed");
468
+ resolve(false);
469
+ }
470
+ else {
471
+ resolve(true);
472
+ }
473
+ });
474
+ });
475
+ }
476
+ /**
477
+ * Get the list of files changed between the branch and the merge base with the
478
+ * default branch. Used for auto-merge exclusion pattern matching.
479
+ * Returns an empty array on failure (fail-open — pattern matching is best-effort).
480
+ */
481
+ export async function getChangedFiles(worktreePath, baseBranch) {
482
+ try {
483
+ const output = await gitExec(["diff", "--name-only", `origin/${baseBranch}...HEAD`], worktreePath);
484
+ return output.split("\n").map((f) => f.trim()).filter(Boolean);
485
+ }
486
+ catch (err) {
487
+ getLog().warn({ baseBranch, err }, "getChangedFiles failed — exclusion patterns will be skipped");
488
+ return [];
489
+ }
490
+ }
491
+ /**
492
+ * Get the number of changed lines (additions + deletions) between the branch
493
+ * and the merge base with the default branch. This measures the actual PR diff,
494
+ * not uncommitted working tree changes.
495
+ */
496
+ export async function getDiffLineCount(worktreePath, baseBranch) {
497
+ try {
498
+ const stat = await gitExec(["diff", "--shortstat", `origin/${baseBranch}...HEAD`], worktreePath);
499
+ // Format: "3 files changed, 10 insertions(+), 5 deletions(-)"
500
+ const insertions = stat.match(/(\d+) insertion/)?.[1] ?? "0";
501
+ const deletions = stat.match(/(\d+) deletion/)?.[1] ?? "0";
502
+ return parseInt(insertions, 10) + parseInt(deletions, 10);
503
+ }
504
+ catch {
505
+ // Fail-safe: treat git errors as "large diff" to prevent unsafe auto-merge
506
+ return Infinity;
507
+ }
508
+ }
509
+ /**
510
+ * Check if a branch already exists on the remote for this issue.
511
+ * Uses the repo URL directly (no local clone needed).
512
+ * Returns the branch name if found, null otherwise.
513
+ * Silently returns null on failure (fail-open — dedup is best-effort).
514
+ */
515
+ export async function checkDuplicateBranch(repoUrl, issueId) {
516
+ return new Promise((resolve) => {
517
+ execFile("git", ["ls-remote", "--heads", repoUrl, `refs/heads/agent/${issueId}-*`], { timeout: 15_000, maxBuffer: 5 * 1024 * 1024 }, (error, stdout) => {
518
+ if (error) {
519
+ resolve(null); // Can't check — proceed without dedup
520
+ return;
521
+ }
522
+ const pattern = `agent/${issueId}-`;
523
+ for (const line of stdout.split("\n")) {
524
+ const ref = line.split("\t")[1]?.replace("refs/heads/", "");
525
+ if (ref?.startsWith(pattern)) {
526
+ resolve(ref);
527
+ return;
528
+ }
529
+ }
530
+ resolve(null);
531
+ });
532
+ });
533
+ }
534
+ /**
535
+ * Generate a branch name from issue ID and slug.
536
+ */
537
+ export function branchName(issueId, slug) {
538
+ return `agent/${issueId}-${slug}`;
539
+ }
540
+ /**
541
+ * Scan baseDir for run directories (each containing a "worktree" sub-dir) that
542
+ * are older than ttlHours and remove them. Returns the list of paths removed.
543
+ *
544
+ * TTL is measured against the directory's mtime so that an actively-modified
545
+ * worktree (e.g. still being debugged) resets the clock on every write.
546
+ */
547
+ export async function cleanupWorktrees(baseDir, ttlHours = 24) {
548
+ const cleaned = [];
549
+ const cutoffMs = ttlHours * 60 * 60 * 1000;
550
+ let entries;
551
+ try {
552
+ entries = await readdir(baseDir);
553
+ }
554
+ catch {
555
+ // baseDir does not exist yet — nothing to clean up
556
+ return cleaned;
557
+ }
558
+ const now = Date.now();
559
+ for (const entry of entries) {
560
+ const runDir = join(baseDir, entry);
561
+ try {
562
+ const s = await stat(runDir);
563
+ if (!s.isDirectory())
564
+ continue;
565
+ // Safety: only delete directories that contain a "worktree" sub-dir
566
+ // to prevent accidental deletion if AGENT_RUN_DIR is misconfigured
567
+ try {
568
+ await stat(join(runDir, "worktree"));
569
+ }
570
+ catch {
571
+ continue;
572
+ }
573
+ const ageMs = now - s.mtimeMs;
574
+ if (ageMs > cutoffMs) {
575
+ await rm(runDir, { recursive: true, force: true });
576
+ getLog().info({ runDir, ageHours: Math.floor(ageMs / 3_600_000) }, "cleaned up stale worktree");
577
+ cleaned.push(runDir);
578
+ }
579
+ }
580
+ catch (err) {
581
+ getLog().error({ runDir, err }, "failed to remove stale worktree directory");
582
+ }
583
+ }
584
+ return cleaned;
585
+ }
586
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/repo/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { Octokit } from "@octokit/rest";
2
+ export interface GitHubConfig {
3
+ appId: string;
4
+ privateKey: string;
5
+ installationId?: number;
6
+ }
7
+ export interface CreatePROptions {
8
+ owner: string;
9
+ repo: string;
10
+ branch: string;
11
+ base: string;
12
+ title: string;
13
+ body: string;
14
+ draft?: boolean;
15
+ }
16
+ /**
17
+ * Create an authenticated Octokit instance using GitHub App credentials.
18
+ */
19
+ export declare function createGitHubClient(config: GitHubConfig): Promise<Octokit>;
20
+ /**
21
+ * Create a pull request and return the PR URL (html_url).
22
+ */
23
+ export declare function createPR(octokit: Octokit, options: CreatePROptions): Promise<string>;
24
+ /**
25
+ * Add a comment to a pull request.
26
+ */
27
+ export declare function addPRComment(octokit: Octokit, owner: string, repo: string, prNumber: number, body: string): Promise<void>;
28
+ /**
29
+ * Count the number of unique approving reviews on a PR.
30
+ * Uses the latest state per reviewer — a reviewer who approved then requested changes
31
+ * is not counted as approving.
32
+ */
33
+ export declare function getPRApprovalCount(octokit: Octokit, owner: string, repo: string, prNumber: number): Promise<number>;
34
+ /**
35
+ * Get all passing/failing check names for a commit SHA.
36
+ * Covers both legacy commit statuses and modern GitHub check runs.
37
+ * Returns a map from check name → conclusion ("success" | "failure" | "pending" | …).
38
+ */
39
+ export declare function getPRCheckResults(octokit: Octokit, owner: string, repo: string, sha: string): Promise<Map<string, string>>;
40
+ /**
41
+ * Merge a pull request via the GitHub API.
42
+ * Returns { merged: true } on success.
43
+ * Returns { merged: false, message } if branch protection prevents the merge or there is a conflict.
44
+ * Throws on unexpected errors.
45
+ */
46
+ export declare function mergePRViaApi(octokit: Octokit, owner: string, repo: string, prNumber: number, mergeMethod?: "merge" | "squash" | "rebase"): Promise<{
47
+ merged: boolean;
48
+ message: string;
49
+ }>;
50
+ /**
51
+ * Re-request review from the current reviewers on a pull request.
52
+ * Fetches the list of requested reviewers from the PR and re-requests them.
53
+ * Returns true if review was re-requested, false if there were no reviewers to re-request.
54
+ */
55
+ export declare function rerequestPRReview(octokit: Octokit, owner: string, repo: string, prNumber: number): Promise<boolean>;
56
+ //# sourceMappingURL=github.d.ts.map