agentplane 0.3.14 → 0.3.16

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 (425) hide show
  1. package/assets/policy/incidents.md +7 -0
  2. package/bin/agentplane.js +1 -1
  3. package/bin/framework-dev-contract.js +1 -0
  4. package/dist/.build-manifest.json +508 -323
  5. package/dist/backends/task-backend/load.d.ts.map +1 -1
  6. package/dist/backends/task-backend/load.js +32 -19
  7. package/dist/backends/task-backend/local-backend-doc.d.ts.map +1 -1
  8. package/dist/backends/task-backend/local-backend-doc.js +1 -1
  9. package/dist/backends/task-backend/redmine/backend-runtime.d.ts +147 -0
  10. package/dist/backends/task-backend/redmine/backend-runtime.d.ts.map +1 -0
  11. package/dist/backends/task-backend/redmine/backend-runtime.js +258 -0
  12. package/dist/backends/task-backend/redmine/backend-sync/context.d.ts +44 -0
  13. package/dist/backends/task-backend/redmine/backend-sync/context.d.ts.map +1 -0
  14. package/dist/backends/task-backend/redmine/backend-sync/context.js +8 -0
  15. package/dist/backends/task-backend/redmine/backend-sync/ids.d.ts +6 -0
  16. package/dist/backends/task-backend/redmine/backend-sync/ids.d.ts.map +1 -0
  17. package/dist/backends/task-backend/redmine/backend-sync/ids.js +21 -0
  18. package/dist/backends/task-backend/redmine/backend-sync/migration.d.ts +4 -0
  19. package/dist/backends/task-backend/redmine/backend-sync/migration.d.ts.map +1 -0
  20. package/dist/backends/task-backend/redmine/backend-sync/migration.js +87 -0
  21. package/dist/backends/task-backend/redmine/backend-sync/status.d.ts +10 -0
  22. package/dist/backends/task-backend/redmine/backend-sync/status.d.ts.map +1 -0
  23. package/dist/backends/task-backend/redmine/backend-sync/status.js +78 -0
  24. package/dist/backends/task-backend/redmine/backend-sync/sync.d.ts +12 -0
  25. package/dist/backends/task-backend/redmine/backend-sync/sync.d.ts.map +1 -0
  26. package/dist/backends/task-backend/redmine/backend-sync/sync.js +82 -0
  27. package/dist/backends/task-backend/redmine/backend-sync/write.d.ts +5 -0
  28. package/dist/backends/task-backend/redmine/backend-sync/write.d.ts.map +1 -0
  29. package/dist/backends/task-backend/redmine/backend-sync/write.js +100 -0
  30. package/dist/backends/task-backend/redmine/backend-sync.d.ts +6 -66
  31. package/dist/backends/task-backend/redmine/backend-sync.d.ts.map +1 -1
  32. package/dist/backends/task-backend/redmine/backend-sync.js +5 -367
  33. package/dist/backends/task-backend/redmine-backend.d.ts +2 -33
  34. package/dist/backends/task-backend/redmine-backend.d.ts.map +1 -1
  35. package/dist/backends/task-backend/redmine-backend.js +26 -241
  36. package/dist/backends/task-backend/shared/errors.d.ts +12 -0
  37. package/dist/backends/task-backend/shared/errors.d.ts.map +1 -1
  38. package/dist/backends/task-backend/shared/errors.js +12 -0
  39. package/dist/cli/archive.d.ts.map +1 -1
  40. package/dist/cli/archive.js +3 -5
  41. package/dist/cli/error-map.d.ts +7 -1
  42. package/dist/cli/error-map.d.ts.map +1 -1
  43. package/dist/cli/error-map.js +231 -19
  44. package/dist/cli/exit-codes.d.ts +14 -2
  45. package/dist/cli/exit-codes.d.ts.map +1 -1
  46. package/dist/cli/exit-codes.js +24 -11
  47. package/dist/cli/output.d.ts +3 -0
  48. package/dist/cli/output.d.ts.map +1 -1
  49. package/dist/cli/output.js +25 -14
  50. package/dist/cli/prompts.d.ts.map +1 -1
  51. package/dist/cli/prompts.js +44 -0
  52. package/dist/cli/run-cli/command-catalog/core.d.ts.map +1 -1
  53. package/dist/cli/run-cli/command-catalog/core.js +34 -76
  54. package/dist/cli/run-cli/command-catalog/lifecycle.d.ts.map +1 -1
  55. package/dist/cli/run-cli/command-catalog/lifecycle.js +23 -26
  56. package/dist/cli/run-cli/command-catalog/project.d.ts.map +1 -1
  57. package/dist/cli/run-cli/command-catalog/project.js +39 -54
  58. package/dist/cli/run-cli/command-catalog/shared.d.ts +15 -3
  59. package/dist/cli/run-cli/command-catalog/shared.d.ts.map +1 -1
  60. package/dist/cli/run-cli/command-catalog/shared.js +19 -6
  61. package/dist/cli/run-cli/command-catalog/task.d.ts.map +1 -1
  62. package/dist/cli/run-cli/command-catalog/task.js +63 -57
  63. package/dist/cli/run-cli/command-loaders.d.ts +174 -0
  64. package/dist/cli/run-cli/command-loaders.d.ts.map +1 -0
  65. package/dist/cli/run-cli/command-loaders.js +128 -0
  66. package/dist/cli/run-cli/commands/init/model.d.ts +42 -0
  67. package/dist/cli/run-cli/commands/init/model.d.ts.map +1 -0
  68. package/dist/cli/run-cli/commands/init/orchestrate.d.ts +9 -0
  69. package/dist/cli/run-cli/commands/init/orchestrate.d.ts.map +1 -0
  70. package/dist/cli/run-cli/commands/init/orchestrate.js +321 -0
  71. package/dist/cli/run-cli/commands/init/parsers.d.ts +5 -0
  72. package/dist/cli/run-cli/commands/init/parsers.d.ts.map +1 -0
  73. package/dist/cli/run-cli/commands/init/parsers.js +36 -0
  74. package/dist/cli/run-cli/commands/init/presets.d.ts +15 -0
  75. package/dist/cli/run-cli/commands/init/presets.d.ts.map +1 -0
  76. package/dist/cli/run-cli/commands/init/presets.js +63 -0
  77. package/dist/cli/run-cli/commands/init/spec.d.ts +5 -0
  78. package/dist/cli/run-cli/commands/init/spec.d.ts.map +1 -0
  79. package/dist/cli/run-cli/commands/init/spec.js +212 -0
  80. package/dist/cli/run-cli/commands/init/write-config.d.ts +1 -0
  81. package/dist/cli/run-cli/commands/init/write-config.d.ts.map +1 -1
  82. package/dist/cli/run-cli/commands/init/write-config.js +1 -0
  83. package/dist/cli/run-cli/commands/init/write-gitignore.js +1 -1
  84. package/dist/cli/run-cli/commands/init.d.ts +1 -28
  85. package/dist/cli/run-cli/commands/init.d.ts.map +1 -1
  86. package/dist/cli/run-cli/commands/init.js +1 -596
  87. package/dist/cli/run-cli/update-warning.d.ts +1 -0
  88. package/dist/cli/run-cli/update-warning.d.ts.map +1 -1
  89. package/dist/cli/run-cli/update-warning.js +10 -2
  90. package/dist/cli/run-cli.d.ts.map +1 -1
  91. package/dist/cli/run-cli.js +1 -2
  92. package/dist/cli/spec/errors.d.ts +13 -1
  93. package/dist/cli/spec/errors.d.ts.map +1 -1
  94. package/dist/cli/spec/errors.js +14 -4
  95. package/dist/commands/backend.d.ts.map +1 -1
  96. package/dist/commands/backend.js +66 -118
  97. package/dist/commands/block.spec.js +1 -1
  98. package/dist/commands/branch/work-start.js +1 -1
  99. package/dist/commands/commit.spec.js +1 -1
  100. package/dist/commands/doctor/branch-pr.js +1 -1
  101. package/dist/commands/doctor/fixes.js +1 -1
  102. package/dist/commands/doctor/runtime.d.ts.map +1 -1
  103. package/dist/commands/doctor/runtime.js +2 -2
  104. package/dist/commands/doctor/workspace.js +1 -1
  105. package/dist/commands/finish.spec.js +1 -1
  106. package/dist/commands/guard/commit.command.js +1 -1
  107. package/dist/commands/guard/impl/clean.d.ts +6 -0
  108. package/dist/commands/guard/impl/clean.d.ts.map +1 -0
  109. package/dist/commands/guard/impl/clean.js +29 -0
  110. package/dist/commands/guard/impl/close-dirt.d.ts +6 -0
  111. package/dist/commands/guard/impl/close-dirt.d.ts.map +1 -0
  112. package/dist/commands/guard/impl/close-dirt.js +56 -0
  113. package/dist/commands/guard/impl/commands.d.ts +4 -36
  114. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  115. package/dist/commands/guard/impl/commands.js +4 -549
  116. package/dist/commands/guard/impl/comment-commit.js +1 -1
  117. package/dist/commands/guard/impl/commit-diagnostics.d.ts +4 -0
  118. package/dist/commands/guard/impl/commit-diagnostics.d.ts.map +1 -0
  119. package/dist/commands/guard/impl/commit-diagnostics.js +150 -0
  120. package/dist/commands/guard/impl/commit.d.ts +25 -0
  121. package/dist/commands/guard/impl/commit.d.ts.map +1 -0
  122. package/dist/commands/guard/impl/commit.js +366 -0
  123. package/dist/commands/guard/impl/guard-commit.d.ts +3 -0
  124. package/dist/commands/guard/impl/guard-commit.d.ts.map +1 -0
  125. package/dist/commands/guard/impl/guard-commit.js +21 -0
  126. package/dist/commands/guard/impl/policy.d.ts +1 -0
  127. package/dist/commands/guard/impl/policy.d.ts.map +1 -1
  128. package/dist/commands/guard/impl/policy.js +9 -2
  129. package/dist/commands/guard/impl/suggest.d.ts +6 -0
  130. package/dist/commands/guard/impl/suggest.d.ts.map +1 -0
  131. package/dist/commands/guard/impl/suggest.js +33 -0
  132. package/dist/commands/hooks/index.d.ts +3 -0
  133. package/dist/commands/hooks/index.d.ts.map +1 -1
  134. package/dist/commands/hooks/index.js +27 -10
  135. package/dist/commands/pr/integrate/cmd.js +1 -1
  136. package/dist/commands/pr/integrate/internal/prepare.js +1 -1
  137. package/dist/commands/pr/internal/auto-commit.d.ts.map +1 -1
  138. package/dist/commands/pr/internal/auto-commit.js +2 -5
  139. package/dist/commands/pr/internal/gh-api.d.ts.map +1 -1
  140. package/dist/commands/pr/internal/gh-api.js +15 -8
  141. package/dist/commands/pr/internal/sync-branch.d.ts +0 -1
  142. package/dist/commands/pr/internal/sync-branch.d.ts.map +1 -1
  143. package/dist/commands/pr/internal/sync-branch.js +2 -5
  144. package/dist/commands/pr/internal/sync.d.ts.map +1 -1
  145. package/dist/commands/pr/internal/sync.js +30 -0
  146. package/dist/commands/pr/open.d.ts.map +1 -1
  147. package/dist/commands/pr/open.js +98 -8
  148. package/dist/commands/recipes/impl/resolver.js +1 -1
  149. package/dist/commands/recipes/impl/version.js +1 -1
  150. package/dist/commands/release/apply.command.js +1 -1
  151. package/dist/commands/release/apply.mutation.d.ts +1 -0
  152. package/dist/commands/release/apply.mutation.d.ts.map +1 -1
  153. package/dist/commands/release/apply.mutation.js +5 -1
  154. package/dist/commands/release/apply.pipeline/finalize.d.ts +21 -0
  155. package/dist/commands/release/apply.pipeline/finalize.d.ts.map +1 -0
  156. package/dist/commands/release/apply.pipeline/finalize.js +80 -0
  157. package/dist/commands/release/apply.pipeline/mutation.d.ts +18 -0
  158. package/dist/commands/release/apply.pipeline/mutation.d.ts.map +1 -0
  159. package/dist/commands/release/apply.pipeline/mutation.js +78 -0
  160. package/dist/commands/release/apply.pipeline/preflight.d.ts +25 -0
  161. package/dist/commands/release/apply.pipeline/preflight.d.ts.map +1 -0
  162. package/dist/commands/release/apply.pipeline/preflight.js +69 -0
  163. package/dist/commands/release/apply.pipeline/shared.d.ts +2 -0
  164. package/dist/commands/release/apply.pipeline/shared.d.ts.map +1 -0
  165. package/dist/commands/release/apply.pipeline/shared.js +5 -0
  166. package/dist/commands/release/apply.pipeline/state.d.ts +25 -0
  167. package/dist/commands/release/apply.pipeline/state.d.ts.map +1 -0
  168. package/dist/commands/release/apply.pipeline/state.js +129 -0
  169. package/dist/commands/release/apply.pipeline.d.ts +1 -1
  170. package/dist/commands/release/apply.pipeline.d.ts.map +1 -1
  171. package/dist/commands/release/apply.pipeline.js +4 -347
  172. package/dist/commands/release/apply.preflight.d.ts +9 -6
  173. package/dist/commands/release/apply.preflight.d.ts.map +1 -1
  174. package/dist/commands/release/apply.preflight.js +71 -51
  175. package/dist/commands/runtime.command.d.ts +2 -2
  176. package/dist/commands/runtime.command.d.ts.map +1 -1
  177. package/dist/commands/runtime.command.js +2 -2
  178. package/dist/commands/scenario/impl/commands.d.ts.map +1 -1
  179. package/dist/commands/scenario/impl/commands.js +52 -39
  180. package/dist/commands/scenario/impl/report.d.ts.map +1 -1
  181. package/dist/commands/scenario/impl/report.js +4 -7
  182. package/dist/commands/shared/allow-prefix-policy.d.ts.map +1 -0
  183. package/dist/{shared → commands/shared}/allow-prefix-policy.js +1 -1
  184. package/dist/commands/shared/comment-format.d.ts.map +1 -0
  185. package/dist/commands/shared/diagnostics.d.ts.map +1 -0
  186. package/dist/commands/shared/git-context.d.ts +1 -27
  187. package/dist/commands/shared/git-context.d.ts.map +1 -1
  188. package/dist/commands/shared/git-context.js +1 -156
  189. package/dist/commands/shared/git-diff.d.ts +1 -10
  190. package/dist/commands/shared/git-diff.d.ts.map +1 -1
  191. package/dist/commands/shared/git-diff.js +1 -49
  192. package/dist/commands/shared/git-ops.d.ts +1 -14
  193. package/dist/commands/shared/git-ops.d.ts.map +1 -1
  194. package/dist/commands/shared/git-ops.js +20 -150
  195. package/dist/commands/shared/git-worktree.d.ts +1 -9
  196. package/dist/commands/shared/git-worktree.d.ts.map +1 -1
  197. package/dist/commands/shared/git-worktree.js +1 -68
  198. package/dist/commands/shared/git.d.ts +1 -3
  199. package/dist/commands/shared/git.d.ts.map +1 -1
  200. package/dist/commands/shared/git.js +1 -14
  201. package/dist/commands/shared/policy-deny.d.ts +1 -1
  202. package/dist/commands/shared/reconcile-check.js +1 -1
  203. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  204. package/dist/commands/shared/task-backend.js +24 -2
  205. package/dist/commands/shared/task-store/intents.d.ts.map +1 -1
  206. package/dist/commands/shared/task-store/intents.js +1 -1
  207. package/dist/commands/start.spec.js +1 -1
  208. package/dist/commands/task/close-tail-state.d.ts +7 -0
  209. package/dist/commands/task/close-tail-state.d.ts.map +1 -0
  210. package/dist/commands/task/close-tail-state.js +18 -0
  211. package/dist/commands/task/derive.js +1 -1
  212. package/dist/commands/task/finish-close.d.ts +22 -0
  213. package/dist/commands/task/finish-close.d.ts.map +1 -0
  214. package/dist/commands/task/finish-close.js +119 -0
  215. package/dist/commands/task/finish-command.d.ts +3 -0
  216. package/dist/commands/task/finish-command.d.ts.map +1 -0
  217. package/dist/commands/task/finish-command.js +56 -0
  218. package/dist/commands/task/finish-execute.d.ts +8 -0
  219. package/dist/commands/task/finish-execute.d.ts.map +1 -0
  220. package/dist/commands/task/finish-execute.js +272 -0
  221. package/dist/commands/task/finish-findings.d.ts +20 -0
  222. package/dist/commands/task/finish-findings.d.ts.map +1 -0
  223. package/dist/commands/task/finish-findings.js +27 -0
  224. package/dist/commands/task/finish-plan.d.ts +7 -0
  225. package/dist/commands/task/finish-plan.d.ts.map +1 -0
  226. package/dist/commands/task/finish-plan.js +157 -0
  227. package/dist/commands/task/finish-types.d.ts +69 -0
  228. package/dist/commands/task/finish-types.d.ts.map +1 -0
  229. package/dist/commands/task/finish.d.ts +1 -42
  230. package/dist/commands/task/finish.d.ts.map +1 -1
  231. package/dist/commands/task/finish.js +1 -527
  232. package/dist/commands/task/hosted-close-pr.command.d.ts.map +1 -1
  233. package/dist/commands/task/hosted-close-pr.command.js +29 -4
  234. package/dist/commands/task/hosted-close.command.d.ts.map +1 -1
  235. package/dist/commands/task/hosted-close.command.js +23 -2
  236. package/dist/commands/task/hosted-merge-sync/builders.d.ts +35 -0
  237. package/dist/commands/task/hosted-merge-sync/builders.d.ts.map +1 -0
  238. package/dist/commands/task/hosted-merge-sync/builders.js +148 -0
  239. package/dist/commands/task/hosted-merge-sync/github.d.ts +10 -0
  240. package/dist/commands/task/hosted-merge-sync/github.d.ts.map +1 -0
  241. package/dist/commands/task/hosted-merge-sync/github.js +113 -0
  242. package/dist/commands/task/hosted-merge-sync/local-branch.d.ts +12 -0
  243. package/dist/commands/task/hosted-merge-sync/local-branch.d.ts.map +1 -0
  244. package/dist/commands/task/hosted-merge-sync/local-branch.js +143 -0
  245. package/dist/commands/task/hosted-merge-sync/model.d.ts +47 -0
  246. package/dist/commands/task/hosted-merge-sync/model.d.ts.map +1 -0
  247. package/dist/commands/task/hosted-merge-sync/pr-meta.d.ts +12 -0
  248. package/dist/commands/task/hosted-merge-sync/pr-meta.d.ts.map +1 -0
  249. package/dist/commands/task/hosted-merge-sync/pr-meta.js +26 -0
  250. package/dist/commands/task/hosted-merge-sync.d.ts +5 -63
  251. package/dist/commands/task/hosted-merge-sync.d.ts.map +1 -1
  252. package/dist/commands/task/hosted-merge-sync.js +10 -444
  253. package/dist/commands/task/new.js +1 -1
  254. package/dist/commands/task/set-status.command.js +1 -1
  255. package/dist/commands/task/shared/direct-work-lock.d.ts.map +1 -0
  256. package/dist/commands/task/shared/git-log.d.ts.map +1 -0
  257. package/dist/commands/task/shared/transitions.d.ts +1 -1
  258. package/dist/commands/task/shared/transitions.d.ts.map +1 -1
  259. package/dist/commands/task/shared/transitions.js +4 -6
  260. package/dist/commands/upgrade/apply.js +1 -1
  261. package/dist/commands/workflow-playbook.command.d.ts.map +1 -1
  262. package/dist/commands/workflow-playbook.command.js +8 -7
  263. package/dist/harness/hooks-lifecycle.d.ts.map +1 -1
  264. package/dist/harness/hooks-lifecycle.js +11 -7
  265. package/dist/meta/release.d.ts.map +1 -1
  266. package/dist/meta/release.js +8 -4
  267. package/dist/policy/engine.d.ts +1 -1
  268. package/dist/policy/evaluate.d.ts +1 -1
  269. package/dist/policy/{types.d.ts → model.d.ts} +1 -1
  270. package/dist/policy/{types.d.ts.map → model.d.ts.map} +1 -1
  271. package/dist/policy/result.d.ts +1 -1
  272. package/dist/policy/rules/allowlist.d.ts +1 -1
  273. package/dist/policy/rules/branch-pr-base.d.ts +1 -1
  274. package/dist/policy/rules/clean-tree.d.ts +1 -1
  275. package/dist/policy/rules/commit-subject.d.ts +1 -1
  276. package/dist/policy/rules/protected-paths.d.ts +1 -1
  277. package/dist/runner/adapters/base.d.ts +42 -0
  278. package/dist/runner/adapters/base.d.ts.map +1 -0
  279. package/dist/runner/adapters/base.js +107 -0
  280. package/dist/runner/adapters/codex-preparation.d.ts +7 -0
  281. package/dist/runner/adapters/codex-preparation.d.ts.map +1 -0
  282. package/dist/runner/adapters/codex-preparation.js +86 -0
  283. package/dist/runner/adapters/codex.d.ts.map +1 -1
  284. package/dist/runner/adapters/codex.js +30 -175
  285. package/dist/runner/adapters/custom-preparation.d.ts +9 -0
  286. package/dist/runner/adapters/custom-preparation.d.ts.map +1 -0
  287. package/dist/runner/adapters/custom-preparation.js +191 -0
  288. package/dist/runner/adapters/custom.d.ts.map +1 -1
  289. package/dist/runner/adapters/custom.js +26 -279
  290. package/dist/runner/process-supervision/run.d.ts +30 -0
  291. package/dist/runner/process-supervision/run.d.ts.map +1 -0
  292. package/dist/runner/process-supervision/run.js +349 -0
  293. package/dist/runner/process-supervision/signals.d.ts +16 -0
  294. package/dist/runner/process-supervision/signals.d.ts.map +1 -0
  295. package/dist/runner/process-supervision/signals.js +85 -0
  296. package/dist/runner/process-supervision/state.d.ts +10 -0
  297. package/dist/runner/process-supervision/state.d.ts.map +1 -0
  298. package/dist/runner/process-supervision/state.js +42 -0
  299. package/dist/runner/process-supervision/streams.d.ts +6 -0
  300. package/dist/runner/process-supervision/streams.d.ts.map +1 -0
  301. package/dist/runner/process-supervision/streams.js +23 -0
  302. package/dist/runner/process-supervision.d.ts +5 -47
  303. package/dist/runner/process-supervision.d.ts.map +1 -1
  304. package/dist/runner/process-supervision.js +3 -490
  305. package/dist/runner/usecases/scenario-materialize-task.js +1 -1
  306. package/dist/runtime/approvals/index.d.ts +1 -1
  307. package/dist/runtime/approvals/{types.d.ts → model.d.ts} +1 -1
  308. package/dist/runtime/approvals/{types.d.ts.map → model.d.ts.map} +1 -1
  309. package/dist/runtime/approvals/runtime.d.ts +1 -1
  310. package/dist/runtime/behavior/index.d.ts +1 -1
  311. package/dist/runtime/behavior/{types.d.ts → model.d.ts} +1 -1
  312. package/dist/runtime/behavior/{types.d.ts.map → model.d.ts.map} +1 -1
  313. package/dist/runtime/behavior/resolve.d.ts +1 -1
  314. package/dist/runtime/capabilities/backend.d.ts +1 -1
  315. package/dist/runtime/capabilities/index.d.ts +1 -1
  316. package/dist/runtime/capabilities/{types.d.ts → model.d.ts} +1 -1
  317. package/dist/runtime/capabilities/{types.d.ts.map → model.d.ts.map} +1 -1
  318. package/dist/runtime/capabilities/model.js +1 -0
  319. package/dist/runtime/capabilities/recipe.d.ts +1 -1
  320. package/dist/runtime/capabilities/registry.d.ts +1 -1
  321. package/dist/runtime/capabilities/runner.d.ts +1 -1
  322. package/dist/runtime/execution-context.d.ts.map +1 -1
  323. package/dist/runtime/execution-context.js +16 -0
  324. package/dist/runtime/execution-profile/index.d.ts +1 -1
  325. package/dist/runtime/execution-profile/{types.d.ts → model.d.ts} +1 -1
  326. package/dist/runtime/execution-profile/{types.d.ts.map → model.d.ts.map} +1 -1
  327. package/dist/runtime/execution-profile/model.js +1 -0
  328. package/dist/runtime/execution-profile/resolve.d.ts +1 -1
  329. package/dist/runtime/explain/index.d.ts +1 -1
  330. package/dist/runtime/explain/{types.d.ts → model.d.ts} +1 -1
  331. package/dist/runtime/explain/{types.d.ts.map → model.d.ts.map} +1 -1
  332. package/dist/runtime/explain/model.js +1 -0
  333. package/dist/runtime/explain/resolve.d.ts +1 -1
  334. package/dist/runtime/protocol/index.d.ts +1 -1
  335. package/dist/runtime/protocol/index.js +1 -1
  336. package/dist/runtime/protocol/{types.d.ts → model.d.ts} +1 -1
  337. package/dist/runtime/protocol/{types.d.ts.map → model.d.ts.map} +1 -1
  338. package/dist/runtime/protocol/resolve.d.ts +1 -1
  339. package/dist/runtime/protocol/resolve.js +1 -1
  340. package/dist/runtime/shared/repo-cli-version.d.ts.map +1 -0
  341. package/dist/{shared → runtime/shared}/repo-cli-version.js +1 -1
  342. package/dist/runtime/shared/runtime-artifacts.d.ts.map +1 -0
  343. package/dist/{shared → runtime/shared}/runtime-source.d.ts +1 -1
  344. package/dist/runtime/shared/runtime-source.d.ts.map +1 -0
  345. package/dist/{shared → runtime/shared}/runtime-source.js +1 -1
  346. package/dist/runtime/shared/version-compare.d.ts.map +1 -0
  347. package/dist/runtime/task-intake/resolve.js +1 -1
  348. package/dist/shared/errors.d.ts +52 -2
  349. package/dist/shared/errors.d.ts.map +1 -1
  350. package/dist/shared/errors.js +66 -4
  351. package/dist/shared/trace-events.d.ts +13 -0
  352. package/dist/shared/trace-events.d.ts.map +1 -0
  353. package/dist/shared/trace-events.js +17 -0
  354. package/dist/{shared/task-doc-conflicts.d.ts → task-doc/conflicts.d.ts} +1 -1
  355. package/dist/task-doc/conflicts.d.ts.map +1 -0
  356. package/dist/{shared/task-doc-conflicts.js → task-doc/conflicts.js} +1 -1
  357. package/dist/{shared/task-doc-state.d.ts → task-doc/state.d.ts} +1 -1
  358. package/dist/task-doc/state.d.ts.map +1 -0
  359. package/package.json +8 -8
  360. package/dist/cli/run-cli/error-guidance.d.ts +0 -9
  361. package/dist/cli/run-cli/error-guidance.d.ts.map +0 -1
  362. package/dist/cli/run-cli/error-guidance.js +0 -210
  363. package/dist/cli/run-cli.test-helpers.d.ts +0 -2
  364. package/dist/cli/run-cli.test-helpers.d.ts.map +0 -1
  365. package/dist/cli/run-cli.test-helpers.js +0 -1
  366. package/dist/commands/recipes.test-helpers.d.ts +0 -202
  367. package/dist/commands/recipes.test-helpers.d.ts.map +0 -1
  368. package/dist/commands/recipes.test-helpers.js +0 -483
  369. package/dist/commands/release.test-helpers.d.ts +0 -38
  370. package/dist/commands/release.test-helpers.d.ts.map +0 -1
  371. package/dist/commands/release.test-helpers.js +0 -55
  372. package/dist/commands/task.test-helpers.d.ts +0 -13
  373. package/dist/commands/task.test-helpers.d.ts.map +0 -1
  374. package/dist/commands/task.test-helpers.js +0 -65
  375. package/dist/runner/test-helpers.d.ts +0 -30
  376. package/dist/runner/test-helpers.d.ts.map +0 -1
  377. package/dist/runner/test-helpers.js +0 -97
  378. package/dist/shared/agent-emoji.d.ts +0 -5
  379. package/dist/shared/agent-emoji.d.ts.map +0 -1
  380. package/dist/shared/agent-emoji.js +0 -51
  381. package/dist/shared/allow-prefix-policy.d.ts.map +0 -1
  382. package/dist/shared/comment-format.d.ts.map +0 -1
  383. package/dist/shared/diagnostics.d.ts.map +0 -1
  384. package/dist/shared/direct-work-lock.d.ts.map +0 -1
  385. package/dist/shared/git-log.d.ts.map +0 -1
  386. package/dist/shared/repo-cli-version.d.ts.map +0 -1
  387. package/dist/shared/runtime-artifacts.d.ts.map +0 -1
  388. package/dist/shared/runtime-source.d.ts.map +0 -1
  389. package/dist/shared/task-doc-conflicts.d.ts.map +0 -1
  390. package/dist/shared/task-doc-state.d.ts.map +0 -1
  391. package/dist/shared/version-compare.d.ts.map +0 -1
  392. package/dist/testing/cli-harness/recipe-archives.d.ts +0 -28
  393. package/dist/testing/cli-harness/recipe-archives.d.ts.map +0 -1
  394. package/dist/testing/cli-harness/recipe-archives.js +0 -374
  395. package/dist/testing/cli-harness/stdio.d.ts +0 -26
  396. package/dist/testing/cli-harness/stdio.d.ts.map +0 -1
  397. package/dist/testing/cli-harness/stdio.js +0 -84
  398. package/dist/testing/cli-harness.d.ts +0 -25
  399. package/dist/testing/cli-harness.d.ts.map +0 -1
  400. package/dist/testing/cli-harness.js +0 -313
  401. package/dist/testing/index.d.ts +0 -2
  402. package/dist/testing/index.d.ts.map +0 -1
  403. package/dist/testing/index.js +0 -1
  404. /package/dist/{policy/types.js → cli/run-cli/commands/init/model.js} +0 -0
  405. /package/dist/{shared → commands/shared}/allow-prefix-policy.d.ts +0 -0
  406. /package/dist/{shared → commands/shared}/comment-format.d.ts +0 -0
  407. /package/dist/{shared → commands/shared}/comment-format.js +0 -0
  408. /package/dist/{shared → commands/shared}/diagnostics.d.ts +0 -0
  409. /package/dist/{shared → commands/shared}/diagnostics.js +0 -0
  410. /package/dist/{runtime/approvals/types.js → commands/task/finish-types.js} +0 -0
  411. /package/dist/{runtime/behavior/types.js → commands/task/hosted-merge-sync/model.js} +0 -0
  412. /package/dist/{shared → commands/task/shared}/direct-work-lock.d.ts +0 -0
  413. /package/dist/{shared → commands/task/shared}/direct-work-lock.js +0 -0
  414. /package/dist/{shared → commands/task/shared}/git-log.d.ts +0 -0
  415. /package/dist/{shared → commands/task/shared}/git-log.js +0 -0
  416. /package/dist/{runtime/capabilities/types.js → policy/model.js} +0 -0
  417. /package/dist/runtime/{execution-profile/types.js → approvals/model.js} +0 -0
  418. /package/dist/runtime/{explain/types.js → behavior/model.js} +0 -0
  419. /package/dist/runtime/protocol/{types.js → model.js} +0 -0
  420. /package/dist/{shared → runtime/shared}/repo-cli-version.d.ts +0 -0
  421. /package/dist/{shared → runtime/shared}/runtime-artifacts.d.ts +0 -0
  422. /package/dist/{shared → runtime/shared}/runtime-artifacts.js +0 -0
  423. /package/dist/{shared → runtime/shared}/version-compare.d.ts +0 -0
  424. /package/dist/{shared → runtime/shared}/version-compare.js +0 -0
  425. /package/dist/{shared/task-doc-state.js → task-doc/state.js} +0 -0
@@ -243,18 +243,33 @@ async function closeHostedTask(opts) {
243
243
  const gitRoot = opts.ctx.resolvedProject.gitRoot;
244
244
  const taskDirRelative = path.join(opts.ctx.config.paths.workflow_dir, target.taskId);
245
245
  const taskReadmePath = path.join(gitRoot, taskDirRelative, "README.md");
246
+ const existingMetaPath = path.join(gitRoot, taskDirRelative, "pr", "meta.json");
247
+ let existingMeta = null;
248
+ if (await fileExists(existingMetaPath)) {
249
+ existingMeta = parsePrMeta(await readFile(existingMetaPath, "utf8"), target.taskId);
250
+ }
251
+ const existingMergeCommit = existingMeta?.merge_commit?.trim() ?? "";
252
+ const existingMetaAlreadyMerged = existingMeta?.status === "MERGED" &&
253
+ existingMergeCommit.length > 0 &&
254
+ existingMergeCommit === target.mergedPr.mergeCommit.oid;
246
255
  let task;
247
256
  try {
248
257
  task = await loadTaskFromContext({
249
258
  ctx: opts.ctx,
250
259
  taskId: target.taskId,
251
- preferBranchSnapshot: true,
252
- branchSnapshotBranch: target.branch,
260
+ preferBranchSnapshot: !existingMetaAlreadyMerged,
261
+ branchSnapshotBranch: existingMetaAlreadyMerged ? null : target.branch,
253
262
  });
254
263
  }
255
264
  catch (err) {
256
265
  if (!isMissingTaskReadmeError(err, taskReadmePath))
257
266
  throw err;
267
+ if (existingMetaAlreadyMerged) {
268
+ return {
269
+ outcome: "noop",
270
+ detail: `${target.taskId} is already closed for merge ${target.mergedPr.mergeCommit.oid.slice(0, 12)}`,
271
+ };
272
+ }
258
273
  const recovered = await buildHostedTaskFromTrackedPrArtifacts({
259
274
  gitRoot,
260
275
  taskDirRelative,
@@ -286,6 +301,12 @@ async function closeHostedTask(opts) {
286
301
  `${task.commit?.hash} != ${target.mergedPr.mergeCommit.oid}`,
287
302
  });
288
303
  }
304
+ if (alreadyClosed && existingMetaAlreadyMerged) {
305
+ return {
306
+ outcome: "noop",
307
+ detail: `${target.taskId} is already closed for merge ${target.mergedPr.mergeCommit.oid.slice(0, 12)}`,
308
+ };
309
+ }
289
310
  const nextMeta = buildIntegratedPrMeta({
290
311
  meta,
291
312
  branch: target.branch,
@@ -0,0 +1,35 @@
1
+ import { type TaskPrMeta } from "@agentplaneorg/core";
2
+ import type { TaskData } from "../../../backends/task-backend.js";
3
+ import type { HostedMergedPr, LocalBranchPrSyncCandidate, LocalMergedPrMeta } from "./model.js";
4
+ export declare function buildSyncedPrMeta(opts: {
5
+ meta: TaskPrMeta;
6
+ mergedPr: HostedMergedPr;
7
+ branch: string;
8
+ }): TaskPrMeta;
9
+ export declare function buildSyncedTask(opts: {
10
+ task: TaskData;
11
+ mergedPr: HostedMergedPr;
12
+ }): TaskData;
13
+ export declare function needsHostedMergeSyncFromLocalMeta(opts: {
14
+ task: TaskData;
15
+ meta: LocalMergedPrMeta;
16
+ }): boolean;
17
+ export declare function buildLocallyMergedSyncedTask(opts: {
18
+ task: TaskData;
19
+ meta: LocalMergedPrMeta;
20
+ }): TaskData;
21
+ export declare function buildLocallySyncedTask(opts: {
22
+ task: TaskData;
23
+ candidate: LocalBranchPrSyncCandidate;
24
+ }): TaskData;
25
+ export declare function buildLocallySyncedPrMeta(opts: {
26
+ meta: TaskPrMeta;
27
+ candidate: LocalBranchPrSyncCandidate;
28
+ }): TaskPrMeta;
29
+ export declare function needsHostedMergeSync(opts: {
30
+ task: TaskData;
31
+ meta: TaskPrMeta;
32
+ mergedPr: HostedMergedPr;
33
+ branch: string;
34
+ }): boolean;
35
+ //# sourceMappingURL=builders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../../../../src/commands/task/hosted-merge-sync/builders.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,KAAK,EAAE,cAAc,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,UAAU,CAab;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,GAAG,QAAQ,CAkC5F;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,iBAAiB,CAAC;CACzB,GAAG,OAAO,CAKV;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,iBAAiB,CAAC;CACzB,GAAG,QAAQ,CA4BX;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,0BAA0B,CAAC;CACvC,GAAG,QAAQ,CA8BX;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,0BAA0B,CAAC;CACvC,GAAG,UAAU,CAYb;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAaV"}
@@ -0,0 +1,148 @@
1
+ import { normalizeTaskDocVersion } from "@agentplaneorg/core";
2
+ import { appendTaskEvent } from "../shared.js";
3
+ export function buildSyncedPrMeta(opts) {
4
+ const at = opts.mergedPr.mergedAt ?? new Date().toISOString();
5
+ return {
6
+ ...opts.meta,
7
+ branch: opts.branch,
8
+ status: "MERGED",
9
+ base: opts.mergedPr.baseRefName ?? opts.meta.base,
10
+ merge_strategy: opts.meta.merge_strategy,
11
+ merged_at: opts.meta.merged_at ?? at,
12
+ merge_commit: opts.mergedPr.mergeCommit?.oid ?? opts.meta.merge_commit,
13
+ head_sha: opts.mergedPr.headRefOid ?? opts.meta.head_sha,
14
+ updated_at: at,
15
+ };
16
+ }
17
+ export function buildSyncedTask(opts) {
18
+ const at = opts.mergedPr.mergedAt ?? new Date().toISOString();
19
+ const currentStatus = String(opts.task.status || "TODO").toUpperCase();
20
+ const note = `Hosted PR #${opts.mergedPr.number} merged on GitHub main; ` +
21
+ "task projection reconciled from hosted PR artifacts.";
22
+ const mergeHash = opts.mergedPr.mergeCommit?.oid ?? "";
23
+ const mergeMessage = opts.mergedPr.title?.trim();
24
+ return {
25
+ ...opts.task,
26
+ status: "DONE",
27
+ result_summary: opts.task.result_summary ?? `Merged via PR #${opts.mergedPr.number}.`,
28
+ commit: opts.task.commit?.hash?.trim()
29
+ ? opts.task.commit
30
+ : mergeHash
31
+ ? {
32
+ hash: mergeHash,
33
+ message: (mergeMessage && mergeMessage.length > 0 ? mergeMessage : null) ??
34
+ `Hosted PR #${opts.mergedPr.number} merged on GitHub main`,
35
+ }
36
+ : null,
37
+ events: appendTaskEvent(opts.task, {
38
+ type: "status",
39
+ at,
40
+ author: "INTEGRATOR",
41
+ from: currentStatus,
42
+ to: "DONE",
43
+ note,
44
+ }),
45
+ doc_version: normalizeTaskDocVersion(opts.task.doc_version),
46
+ doc_updated_at: at,
47
+ doc_updated_by: "INTEGRATOR",
48
+ };
49
+ }
50
+ export function needsHostedMergeSyncFromLocalMeta(opts) {
51
+ const currentStatus = String(opts.task.status || "TODO").toUpperCase();
52
+ if (currentStatus !== "DONE")
53
+ return true;
54
+ if ((opts.task.commit?.hash ?? "") !== opts.meta.mergeCommit)
55
+ return true;
56
+ return false;
57
+ }
58
+ export function buildLocallyMergedSyncedTask(opts) {
59
+ const at = opts.meta.mergedAt ?? new Date().toISOString();
60
+ const currentStatus = String(opts.task.status || "TODO").toUpperCase();
61
+ const note = "Local PR metadata already marks the task branch as MERGED; " +
62
+ "task projection reconciled without an additional GitHub lookup.";
63
+ return {
64
+ ...opts.task,
65
+ status: "DONE",
66
+ result_summary: opts.task.result_summary ?? "Merged and reconciled from local PR metadata.",
67
+ commit: opts.task.commit?.hash?.trim()
68
+ ? opts.task.commit
69
+ : {
70
+ hash: opts.meta.mergeCommit,
71
+ message: "Merged branch_pr task reconciled from local PR metadata",
72
+ },
73
+ events: appendTaskEvent(opts.task, {
74
+ type: "status",
75
+ at,
76
+ author: "INTEGRATOR",
77
+ from: currentStatus,
78
+ to: "DONE",
79
+ note,
80
+ }),
81
+ doc_version: normalizeTaskDocVersion(opts.task.doc_version),
82
+ doc_updated_at: at,
83
+ doc_updated_by: "INTEGRATOR",
84
+ };
85
+ }
86
+ export function buildLocallySyncedTask(opts) {
87
+ const at = new Date().toISOString();
88
+ const currentStatus = String(opts.task.status || "TODO").toUpperCase();
89
+ const note = `Local branch_pr reconciliation detected task commit ${opts.candidate.commitHash.slice(0, 12)} ` +
90
+ `on base ${opts.candidate.base}; canonical task state normalized after shipment.`;
91
+ return {
92
+ ...opts.task,
93
+ status: "DONE",
94
+ result_summary: opts.task.result_summary ??
95
+ `Shipped on ${opts.candidate.base} and reconciled from local branch_pr state.`,
96
+ commit: opts.task.commit?.hash?.trim()
97
+ ? opts.task.commit
98
+ : {
99
+ hash: opts.candidate.commitHash,
100
+ message: `Shipped on ${opts.candidate.base} before canonical task closure`,
101
+ },
102
+ events: appendTaskEvent(opts.task, {
103
+ type: "status",
104
+ at,
105
+ author: "INTEGRATOR",
106
+ from: currentStatus,
107
+ to: "DONE",
108
+ note,
109
+ }),
110
+ doc_version: normalizeTaskDocVersion(opts.task.doc_version),
111
+ doc_updated_at: at,
112
+ doc_updated_by: "INTEGRATOR",
113
+ };
114
+ }
115
+ export function buildLocallySyncedPrMeta(opts) {
116
+ const at = new Date().toISOString();
117
+ return {
118
+ ...opts.meta,
119
+ branch: opts.candidate.branch,
120
+ base: opts.candidate.base,
121
+ status: "MERGED",
122
+ merged_at: opts.meta.merged_at ?? at,
123
+ merge_commit: opts.meta.merge_commit ?? opts.candidate.commitHash,
124
+ head_sha: opts.meta.head_sha ?? opts.candidate.commitHash,
125
+ updated_at: at,
126
+ };
127
+ }
128
+ export function needsHostedMergeSync(opts) {
129
+ const currentStatus = String(opts.task.status || "TODO").toUpperCase();
130
+ const expectedCommit = opts.mergedPr.mergeCommit?.oid ?? "";
131
+ const expectedBase = opts.mergedPr.baseRefName ?? opts.meta.base ?? "";
132
+ const expectedHeadSha = opts.mergedPr.headRefOid ?? opts.meta.head_sha ?? "";
133
+ if (currentStatus !== "DONE")
134
+ return true;
135
+ if ((opts.task.commit?.hash ?? "") !== expectedCommit)
136
+ return true;
137
+ if (opts.meta.status !== "MERGED")
138
+ return true;
139
+ if ((opts.meta.merge_commit ?? "") !== expectedCommit)
140
+ return true;
141
+ if ((opts.meta.branch ?? "") !== opts.branch)
142
+ return true;
143
+ if ((opts.meta.base ?? "") !== expectedBase)
144
+ return true;
145
+ if (opts.meta.head_sha?.trim() !== expectedHeadSha)
146
+ return true;
147
+ return false;
148
+ }
@@ -0,0 +1,10 @@
1
+ import type { HostedMergedPr, HostedMergeTarget } from "./model.js";
2
+ export declare function resolveHostedMergeTargetFromEvent(opts: {
3
+ event: unknown;
4
+ branchPrefix: string;
5
+ }): HostedMergeTarget | null;
6
+ export declare function resolveHostedMergedPr(opts: {
7
+ cwd: string;
8
+ branch: string;
9
+ }): Promise<HostedMergedPr | null>;
10
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../../src/commands/task/hosted-merge-sync/github.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA6EpE,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,iBAAiB,GAAG,IAAI,CAY3B;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA4BjC"}
@@ -0,0 +1,113 @@
1
+ import { execFileAsync } from "../../shared/git.js";
2
+ import { withGhTransportRetry } from "../../shared/gh-transport.js";
3
+ import { parseTaskIdFromBranch } from "../../shared/git-worktree.js";
4
+ import { ghEnv } from "../../pr/internal/gh-api.js";
5
+ function normalizeMergedPr(value) {
6
+ if (!value || typeof value !== "object" || Array.isArray(value))
7
+ return null;
8
+ const record = value;
9
+ const number = typeof record.number === "number" ? record.number : null;
10
+ if (!number || number <= 0)
11
+ return null;
12
+ const mergeCommit = record.mergeCommit &&
13
+ typeof record.mergeCommit === "object" &&
14
+ !Array.isArray(record.mergeCommit)
15
+ ? {
16
+ oid: typeof record.mergeCommit.oid === "string"
17
+ ? String(record.mergeCommit.oid)
18
+ : null,
19
+ }
20
+ : null;
21
+ return {
22
+ number,
23
+ title: typeof record.title === "string" ? record.title : null,
24
+ url: typeof record.url === "string" ? record.url : null,
25
+ mergedAt: typeof record.mergedAt === "string" ? record.mergedAt : null,
26
+ baseRefName: typeof record.baseRefName === "string" ? record.baseRefName : null,
27
+ headRefName: typeof record.headRefName === "string" ? record.headRefName : null,
28
+ headRefOid: typeof record.headRefOid === "string" ? record.headRefOid : null,
29
+ mergeCommit,
30
+ };
31
+ }
32
+ function normalizePullRequestLike(value) {
33
+ if (!value || typeof value !== "object" || Array.isArray(value))
34
+ return null;
35
+ const record = value;
36
+ if (record.merged !== true)
37
+ return null;
38
+ const number = typeof record.number === "number" ? record.number : null;
39
+ const mergeCommitSha = typeof record.merge_commit_sha === "string" && record.merge_commit_sha.trim().length > 0
40
+ ? record.merge_commit_sha.trim()
41
+ : null;
42
+ const head = record.head && typeof record.head === "object" && !Array.isArray(record.head)
43
+ ? record.head
44
+ : null;
45
+ const base = record.base && typeof record.base === "object" && !Array.isArray(record.base)
46
+ ? record.base
47
+ : null;
48
+ const headRefName = typeof head?.ref === "string" ? head.ref : null;
49
+ const headRefOid = typeof head?.sha === "string" ? head.sha : null;
50
+ const baseRefName = typeof base?.ref === "string" ? base.ref : null;
51
+ if (!number || number <= 0 || !mergeCommitSha || !headRefName)
52
+ return null;
53
+ return {
54
+ number,
55
+ title: typeof record.title === "string" ? record.title : null,
56
+ url: typeof record.html_url === "string" ? record.html_url : null,
57
+ mergedAt: typeof record.merged_at === "string" ? record.merged_at : null,
58
+ baseRefName,
59
+ headRefName,
60
+ headRefOid,
61
+ mergeCommit: { oid: mergeCommitSha },
62
+ };
63
+ }
64
+ function pickHostedMergedPr(records) {
65
+ const merged = records
66
+ .map((record) => normalizeMergedPr(record))
67
+ .filter((record) => !!record && !!record.mergeCommit?.oid);
68
+ if (merged.length === 0)
69
+ return null;
70
+ return (merged.toSorted((a, b) => {
71
+ const left = a.mergedAt ?? "";
72
+ const right = b.mergedAt ?? "";
73
+ return right.localeCompare(left);
74
+ })[0] ?? null);
75
+ }
76
+ export function resolveHostedMergeTargetFromEvent(opts) {
77
+ if (!opts.event || typeof opts.event !== "object" || Array.isArray(opts.event))
78
+ return null;
79
+ const pullRequest = opts.event.pull_request;
80
+ const mergedPr = normalizePullRequestLike(pullRequest);
81
+ if (!mergedPr?.headRefName || !mergedPr.mergeCommit?.oid)
82
+ return null;
83
+ const taskId = parseTaskIdFromBranch(opts.branchPrefix, mergedPr.headRefName);
84
+ if (!taskId)
85
+ return null;
86
+ return {
87
+ taskId,
88
+ branch: mergedPr.headRefName,
89
+ mergedPr,
90
+ };
91
+ }
92
+ export async function resolveHostedMergedPr(opts) {
93
+ return await withGhTransportRetry(async () => {
94
+ const { stdout } = await execFileAsync("gh", [
95
+ "pr",
96
+ "list",
97
+ "--state",
98
+ "merged",
99
+ "--head",
100
+ opts.branch,
101
+ "--json",
102
+ "number,title,url,mergedAt,baseRefName,headRefName,headRefOid,mergeCommit",
103
+ ], {
104
+ cwd: opts.cwd,
105
+ env: ghEnv(),
106
+ maxBuffer: 10 * 1024 * 1024,
107
+ });
108
+ const parsed = JSON.parse(stdout);
109
+ return Array.isArray(parsed) ? pickHostedMergedPr(parsed) : null;
110
+ }, {
111
+ label: `looking up merged PR metadata for ${opts.branch}`,
112
+ });
113
+ }
@@ -0,0 +1,12 @@
1
+ import type { TaskData } from "../../../backends/task-backend.js";
2
+ import type { CommandContext } from "../../shared/task-backend.js";
3
+ import type { LocalBranchPrSyncCandidate, LocalDoneBranchPrDrift } from "./model.js";
4
+ export declare function findLocallyShippedBranchPrTasks(opts: {
5
+ ctx: CommandContext;
6
+ tasks: TaskData[];
7
+ }): Promise<LocalBranchPrSyncCandidate[]>;
8
+ export declare function findDoneBranchPrTasksWithOpenPrArtifacts(opts: {
9
+ ctx: CommandContext;
10
+ tasks: TaskData[];
11
+ }): Promise<LocalDoneBranchPrDrift[]>;
12
+ //# sourceMappingURL=local-branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-branch.d.ts","sourceRoot":"","sources":["../../../../src/commands/task/hosted-merge-sync/local-branch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAGnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AA+DrF,wBAAsB,+BAA+B,CAAC,IAAI,EAAE;IAC1D,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB,GAAG,OAAO,CAAC,0BAA0B,EAAE,CAAC,CAiDxC;AAED,wBAAsB,wCAAwC,CAAC,IAAI,EAAE;IACnE,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAqCpC"}
@@ -0,0 +1,143 @@
1
+ import { resolveBaseBranch } from "@agentplaneorg/core";
2
+ import { execFileAsync } from "../../shared/git.js";
3
+ import { parseTaskIdFromBranch } from "../../shared/git-worktree.js";
4
+ import { backendUsesLocalTaskStore } from "../../shared/task-backend.js";
5
+ import { readPrMetaIfPresent } from "./pr-meta.js";
6
+ function hasTaskVerificationForLocalSync(opts) {
7
+ if (opts.task.verification?.state === "ok")
8
+ return "task";
9
+ if (opts.meta?.verify?.status === "pass")
10
+ return "pr";
11
+ return null;
12
+ }
13
+ async function gitRefExists(opts) {
14
+ try {
15
+ await execFileAsync("git", ["rev-parse", "--verify", "--quiet", opts.ref], {
16
+ cwd: opts.cwd,
17
+ env: process.env,
18
+ });
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ async function gitIsAncestor(opts) {
26
+ try {
27
+ await execFileAsync("git", ["merge-base", "--is-ancestor", opts.ancestor, opts.descendant], {
28
+ cwd: opts.cwd,
29
+ env: process.env,
30
+ });
31
+ return true;
32
+ }
33
+ catch (err) {
34
+ const code = err?.code;
35
+ if (code === 1)
36
+ return false;
37
+ throw err;
38
+ }
39
+ }
40
+ async function resolveSyncBaseBranch(opts) {
41
+ const fromMeta = opts.meta?.base?.trim() ?? "";
42
+ if (fromMeta.length > 0)
43
+ return fromMeta;
44
+ return await resolveBaseBranch({
45
+ cwd: opts.ctx.resolvedProject.gitRoot,
46
+ rootOverride: opts.ctx.resolvedProject.gitRoot,
47
+ cliBaseOpt: null,
48
+ mode: opts.ctx.config.workflow_mode,
49
+ });
50
+ }
51
+ function isStackedBranchAliasDoneTask(opts) {
52
+ const branchTaskId = parseTaskIdFromBranch("task", opts.branch);
53
+ if (!branchTaskId || branchTaskId === opts.task.id)
54
+ return false;
55
+ const summary = opts.task.result_summary?.trim().toLowerCase() ?? "";
56
+ if (!summary.includes("stacked branch_pr merge rooted at"))
57
+ return false;
58
+ return summary.includes(branchTaskId.toLowerCase());
59
+ }
60
+ export async function findLocallyShippedBranchPrTasks(opts) {
61
+ if (!backendUsesLocalTaskStore(opts.ctx) || opts.ctx.config.workflow_mode !== "branch_pr") {
62
+ return [];
63
+ }
64
+ const matches = [];
65
+ for (const task of opts.tasks) {
66
+ const currentStatus = String(task.status || "TODO").toUpperCase();
67
+ const prMetaRecord = await readPrMetaIfPresent({ ctx: opts.ctx, taskId: task.id });
68
+ const meta = prMetaRecord?.meta ?? null;
69
+ const branch = meta?.branch?.trim() ?? "";
70
+ if (!branch)
71
+ continue;
72
+ const verificationSource = hasTaskVerificationForLocalSync({ task, meta });
73
+ const commitHash = task.commit?.hash?.trim() ?? meta?.merge_commit?.trim() ?? meta?.head_sha?.trim() ?? "";
74
+ if (!commitHash)
75
+ continue;
76
+ const base = await resolveSyncBaseBranch({ ctx: opts.ctx, meta });
77
+ if (!base)
78
+ continue;
79
+ if (!(await gitRefExists({ cwd: opts.ctx.resolvedProject.gitRoot, ref: base })))
80
+ continue;
81
+ if (!(await gitIsAncestor({
82
+ cwd: opts.ctx.resolvedProject.gitRoot,
83
+ ancestor: commitHash,
84
+ descendant: base,
85
+ }))) {
86
+ continue;
87
+ }
88
+ const metaNeedsSync = Boolean(meta && meta.status !== "MERGED");
89
+ const taskNeedsSync = currentStatus !== "DONE" && verificationSource !== null;
90
+ if (!taskNeedsSync && !metaNeedsSync)
91
+ continue;
92
+ if (!taskNeedsSync && currentStatus !== "DONE")
93
+ continue;
94
+ matches.push({
95
+ taskId: task.id,
96
+ branch,
97
+ base,
98
+ commitHash,
99
+ verificationSource,
100
+ metaPath: prMetaRecord?.metaPath ?? null,
101
+ meta,
102
+ taskStatus: currentStatus,
103
+ });
104
+ }
105
+ return matches;
106
+ }
107
+ export async function findDoneBranchPrTasksWithOpenPrArtifacts(opts) {
108
+ if (!backendUsesLocalTaskStore(opts.ctx) || opts.ctx.config.workflow_mode !== "branch_pr") {
109
+ return [];
110
+ }
111
+ const matches = [];
112
+ for (const task of opts.tasks) {
113
+ const currentStatus = String(task.status || "TODO").toUpperCase();
114
+ if (currentStatus !== "DONE")
115
+ continue;
116
+ const prMetaRecord = await readPrMetaIfPresent({ ctx: opts.ctx, taskId: task.id });
117
+ const meta = prMetaRecord?.meta ?? null;
118
+ if (!meta || meta.status === "MERGED")
119
+ continue;
120
+ const branch = meta.branch?.trim() ?? "";
121
+ if (!branch)
122
+ continue;
123
+ const branchStillExists = (await gitRefExists({ cwd: opts.ctx.resolvedProject.gitRoot, ref: branch })) ||
124
+ (await gitRefExists({ cwd: opts.ctx.resolvedProject.gitRoot, ref: `origin/${branch}` }));
125
+ if (!branchStillExists)
126
+ continue;
127
+ if (isStackedBranchAliasDoneTask({ task, branch }))
128
+ continue;
129
+ const commitHash = task.commit?.hash?.trim() ?? "";
130
+ if (!commitHash)
131
+ continue;
132
+ const base = await resolveSyncBaseBranch({ ctx: opts.ctx, meta });
133
+ if (!base)
134
+ continue;
135
+ matches.push({
136
+ taskId: task.id,
137
+ branch,
138
+ base,
139
+ commitHash,
140
+ });
141
+ }
142
+ return matches;
143
+ }
@@ -0,0 +1,47 @@
1
+ import type { TaskPrMeta } from "@agentplaneorg/core";
2
+ import type { TaskData } from "../../../backends/task-backend.js";
3
+ export type HostedMergedPr = {
4
+ number: number;
5
+ title?: string | null;
6
+ url?: string | null;
7
+ mergedAt?: string | null;
8
+ baseRefName?: string | null;
9
+ headRefName?: string | null;
10
+ headRefOid?: string | null;
11
+ mergeCommit?: {
12
+ oid?: string | null;
13
+ } | null;
14
+ };
15
+ export type HostedMergeTarget = {
16
+ taskId: string;
17
+ branch: string;
18
+ mergedPr: HostedMergedPr;
19
+ };
20
+ export type HostedMergeSyncResult = {
21
+ tasks: TaskData[];
22
+ synced: number;
23
+ };
24
+ export type LocalBranchPrSyncCandidate = {
25
+ taskId: string;
26
+ branch: string;
27
+ base: string;
28
+ commitHash: string;
29
+ verificationSource: "task" | "pr" | null;
30
+ metaPath: string | null;
31
+ meta: TaskPrMeta | null;
32
+ taskStatus: string;
33
+ };
34
+ export type LocalDoneBranchPrDrift = {
35
+ taskId: string;
36
+ branch: string;
37
+ base: string;
38
+ commitHash: string;
39
+ };
40
+ export type LocalMergedPrMeta = {
41
+ branch: string;
42
+ base?: string | null;
43
+ mergedAt?: string | null;
44
+ mergeCommit: string;
45
+ headSha?: string | null;
46
+ };
47
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/commands/task/hosted-merge-sync/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { TaskPrMeta } from "@agentplaneorg/core";
2
+ import type { CommandContext } from "../../shared/task-backend.js";
3
+ import type { LocalMergedPrMeta } from "./model.js";
4
+ export declare function resolveLocalMergedPrMeta(meta: TaskPrMeta | null): LocalMergedPrMeta | null;
5
+ export declare function readPrMetaIfPresent(opts: {
6
+ ctx: CommandContext;
7
+ taskId: string;
8
+ }): Promise<{
9
+ meta: TaskPrMeta;
10
+ metaPath: string;
11
+ } | null>;
12
+ //# sourceMappingURL=pr-meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-meta.d.ts","sourceRoot":"","sources":["../../../../src/commands/task/hosted-merge-sync/pr-meta.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,iBAAiB,GAAG,IAAI,CAW1F;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAczD"}
@@ -0,0 +1,26 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parsePrMeta } from "../../shared/pr-meta.js";
4
+ export function resolveLocalMergedPrMeta(meta) {
5
+ const branch = meta?.branch?.trim() ?? "";
6
+ const mergeCommit = meta?.merge_commit?.trim() ?? "";
7
+ if (meta?.status !== "MERGED" || !branch || !mergeCommit)
8
+ return null;
9
+ return {
10
+ branch,
11
+ base: meta.base ?? null,
12
+ mergedAt: meta.merged_at ?? null,
13
+ mergeCommit,
14
+ headSha: meta.head_sha ?? null,
15
+ };
16
+ }
17
+ export async function readPrMetaIfPresent(opts) {
18
+ const metaPath = path.join(opts.ctx.resolvedProject.gitRoot, opts.ctx.config.paths.workflow_dir, opts.taskId, "pr", "meta.json");
19
+ try {
20
+ const raw = await readFile(metaPath, "utf8");
21
+ return { meta: parsePrMeta(raw, opts.taskId), metaPath };
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }