agentplane 0.3.9 → 0.3.11

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 (404) hide show
  1. package/assets/AGENTS.md +4 -2
  2. package/assets/agents/CODER.json +1 -1
  3. package/assets/policy/dod.core.md +1 -1
  4. package/assets/policy/governance.md +5 -3
  5. package/assets/policy/incidents.md +19 -77
  6. package/assets/policy/workflow.branch_pr.md +2 -0
  7. package/assets/policy/workflow.direct.md +3 -1
  8. package/bin/agentplane.js +56 -1
  9. package/bin/runtime-watch.js +1 -0
  10. package/bin/stale-dist-policy.d.ts +1 -1
  11. package/bin/stale-dist-policy.js +13 -0
  12. package/dist/.build-manifest.json +462 -202
  13. package/dist/cli/bootstrap-guide.d.ts +1 -0
  14. package/dist/cli/bootstrap-guide.d.ts.map +1 -1
  15. package/dist/cli/bootstrap-guide.js +20 -1
  16. package/dist/cli/command-guide.d.ts.map +1 -1
  17. package/dist/cli/command-guide.js +2 -1
  18. package/dist/cli/command-invocations.d.ts.map +1 -1
  19. package/dist/cli/command-invocations.js +6 -1
  20. package/dist/cli/command-snippets.d.ts +2 -0
  21. package/dist/cli/command-snippets.d.ts.map +1 -1
  22. package/dist/cli/command-snippets.js +2 -0
  23. package/dist/cli/run-cli/command-catalog/core.d.ts +1 -1
  24. package/dist/cli/run-cli/command-catalog/core.d.ts.map +1 -1
  25. package/dist/cli/run-cli/command-catalog/core.js +10 -0
  26. package/dist/cli/run-cli/command-catalog/project.d.ts +1 -1
  27. package/dist/cli/run-cli/command-catalog/project.d.ts.map +1 -1
  28. package/dist/cli/run-cli/command-catalog/project.js +3 -1
  29. package/dist/cli/run-cli/command-catalog/task.d.ts +1 -1
  30. package/dist/cli/run-cli/command-catalog/task.d.ts.map +1 -1
  31. package/dist/cli/run-cli/command-catalog/task.js +10 -0
  32. package/dist/cli/run-cli/command-catalog.d.ts +1 -1
  33. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  34. package/dist/cli/run-cli/commands/config.d.ts.map +1 -1
  35. package/dist/cli/run-cli/commands/config.js +13 -0
  36. package/dist/cli/run-cli/commands/core/preflight.d.ts.map +1 -1
  37. package/dist/cli/run-cli/commands/core/preflight.js +44 -1
  38. package/dist/cli/run-cli.js +2 -2
  39. package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
  40. package/dist/cli/run-cli.test-helpers.js +12 -0
  41. package/dist/commands/backend.d.ts.map +1 -1
  42. package/dist/commands/backend.js +4 -0
  43. package/dist/commands/branch/cleanup-merged.d.ts +2 -0
  44. package/dist/commands/branch/cleanup-merged.d.ts.map +1 -1
  45. package/dist/commands/branch/cleanup-merged.js +132 -28
  46. package/dist/commands/branch/work-start.d.ts.map +1 -1
  47. package/dist/commands/branch/work-start.js +60 -1
  48. package/dist/commands/cleanup/merged.command.d.ts +2 -0
  49. package/dist/commands/cleanup/merged.command.d.ts.map +1 -1
  50. package/dist/commands/cleanup/merged.command.js +24 -0
  51. package/dist/commands/doctor/branch-pr.d.ts +4 -0
  52. package/dist/commands/doctor/branch-pr.d.ts.map +1 -0
  53. package/dist/commands/doctor/branch-pr.js +96 -0
  54. package/dist/commands/doctor/fixes.d.ts +5 -0
  55. package/dist/commands/doctor/fixes.d.ts.map +1 -1
  56. package/dist/commands/doctor/fixes.js +70 -0
  57. package/dist/commands/doctor.run.d.ts.map +1 -1
  58. package/dist/commands/doctor.run.js +6 -1
  59. package/dist/commands/finish.run.d.ts.map +1 -1
  60. package/dist/commands/finish.run.js +11 -0
  61. package/dist/commands/finish.spec.d.ts +11 -0
  62. package/dist/commands/finish.spec.d.ts.map +1 -1
  63. package/dist/commands/finish.spec.js +51 -0
  64. package/dist/commands/guard/impl/close-message.d.ts.map +1 -1
  65. package/dist/commands/guard/impl/close-message.js +23 -6
  66. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  67. package/dist/commands/guard/impl/commands.js +24 -2
  68. package/dist/commands/guard/impl/env.d.ts +1 -0
  69. package/dist/commands/guard/impl/env.d.ts.map +1 -1
  70. package/dist/commands/guard/impl/env.js +1 -0
  71. package/dist/commands/hooks/index.d.ts.map +1 -1
  72. package/dist/commands/hooks/index.js +98 -1
  73. package/dist/commands/incidents/advise.command.d.ts +15 -0
  74. package/dist/commands/incidents/advise.command.d.ts.map +1 -0
  75. package/dist/commands/incidents/advise.command.js +139 -0
  76. package/dist/commands/incidents/collect.command.d.ts +11 -0
  77. package/dist/commands/incidents/collect.command.d.ts.map +1 -0
  78. package/dist/commands/incidents/collect.command.js +72 -0
  79. package/dist/commands/incidents/incidents.command.d.ts +5 -0
  80. package/dist/commands/incidents/incidents.command.d.ts.map +1 -0
  81. package/dist/commands/incidents/incidents.command.js +21 -0
  82. package/dist/commands/incidents/shared.d.ts +76 -0
  83. package/dist/commands/incidents/shared.d.ts.map +1 -0
  84. package/dist/commands/incidents/shared.js +261 -0
  85. package/dist/commands/pr/check.d.ts.map +1 -1
  86. package/dist/commands/pr/check.js +249 -75
  87. package/dist/commands/pr/close-superseded.d.ts +9 -0
  88. package/dist/commands/pr/close-superseded.d.ts.map +1 -0
  89. package/dist/commands/pr/close-superseded.js +129 -0
  90. package/dist/commands/pr/close.d.ts +11 -0
  91. package/dist/commands/pr/close.d.ts.map +1 -0
  92. package/dist/commands/pr/close.js +116 -0
  93. package/dist/commands/pr/index.d.ts +2 -0
  94. package/dist/commands/pr/index.d.ts.map +1 -1
  95. package/dist/commands/pr/index.js +2 -0
  96. package/dist/commands/pr/integrate/artifacts.d.ts +7 -0
  97. package/dist/commands/pr/integrate/artifacts.d.ts.map +1 -1
  98. package/dist/commands/pr/integrate/artifacts.js +66 -1
  99. package/dist/commands/pr/integrate/cmd.d.ts.map +1 -1
  100. package/dist/commands/pr/integrate/cmd.js +20 -0
  101. package/dist/commands/pr/integrate/internal/bootstrap-guidance.d.ts +8 -0
  102. package/dist/commands/pr/integrate/internal/bootstrap-guidance.d.ts.map +1 -0
  103. package/dist/commands/pr/integrate/internal/bootstrap-guidance.js +59 -0
  104. package/dist/commands/pr/integrate/internal/finalize.d.ts.map +1 -1
  105. package/dist/commands/pr/integrate/internal/finalize.js +40 -12
  106. package/dist/commands/pr/integrate/internal/merge.d.ts +4 -0
  107. package/dist/commands/pr/integrate/internal/merge.d.ts.map +1 -1
  108. package/dist/commands/pr/integrate/internal/merge.js +59 -15
  109. package/dist/commands/pr/integrate/internal/post-integrate-bootstrap.d.ts +13 -0
  110. package/dist/commands/pr/integrate/internal/post-integrate-bootstrap.d.ts.map +1 -0
  111. package/dist/commands/pr/integrate/internal/post-integrate-bootstrap.js +25 -0
  112. package/dist/commands/pr/integrate/internal/prepare.d.ts +3 -2
  113. package/dist/commands/pr/integrate/internal/prepare.d.ts.map +1 -1
  114. package/dist/commands/pr/integrate/internal/prepare.js +107 -19
  115. package/dist/commands/pr/internal/freshness.d.ts +20 -0
  116. package/dist/commands/pr/internal/freshness.d.ts.map +1 -0
  117. package/dist/commands/pr/internal/freshness.js +50 -0
  118. package/dist/commands/pr/internal/gh-api.d.ts +6 -0
  119. package/dist/commands/pr/internal/gh-api.d.ts.map +1 -0
  120. package/dist/commands/pr/internal/gh-api.js +80 -0
  121. package/dist/commands/pr/internal/note-store.d.ts +18 -0
  122. package/dist/commands/pr/internal/note-store.d.ts.map +1 -0
  123. package/dist/commands/pr/internal/note-store.js +66 -0
  124. package/dist/commands/pr/internal/pr-paths.d.ts +13 -0
  125. package/dist/commands/pr/internal/pr-paths.d.ts.map +1 -1
  126. package/dist/commands/pr/internal/pr-paths.js +13 -0
  127. package/dist/commands/pr/internal/review-template.d.ts +24 -4
  128. package/dist/commands/pr/internal/review-template.d.ts.map +1 -1
  129. package/dist/commands/pr/internal/review-template.js +221 -33
  130. package/dist/commands/pr/internal/sync.d.ts +41 -0
  131. package/dist/commands/pr/internal/sync.d.ts.map +1 -0
  132. package/dist/commands/pr/internal/sync.js +598 -0
  133. package/dist/commands/pr/note.d.ts.map +1 -1
  134. package/dist/commands/pr/note.js +37 -4
  135. package/dist/commands/pr/open.d.ts +1 -0
  136. package/dist/commands/pr/open.d.ts.map +1 -1
  137. package/dist/commands/pr/open.js +18 -54
  138. package/dist/commands/pr/pr.command.d.ts +15 -0
  139. package/dist/commands/pr/pr.command.d.ts.map +1 -1
  140. package/dist/commands/pr/pr.command.js +124 -5
  141. package/dist/commands/pr/update.d.ts.map +1 -1
  142. package/dist/commands/pr/update.js +58 -74
  143. package/dist/commands/recipes/impl/commands/cache-prune.d.ts.map +1 -1
  144. package/dist/commands/recipes/impl/commands/cache-prune.js +14 -0
  145. package/dist/commands/recipes/impl/commands/install.js +1 -1
  146. package/dist/commands/recipes/impl/commands/list-remote.d.ts.map +1 -1
  147. package/dist/commands/recipes/impl/commands/list-remote.js +1 -0
  148. package/dist/commands/recipes/impl/commands/remove.d.ts.map +1 -1
  149. package/dist/commands/recipes/impl/commands/remove.js +9 -1
  150. package/dist/commands/release/apply.command.d.ts.map +1 -1
  151. package/dist/commands/release/apply.command.js +12 -17
  152. package/dist/commands/release/apply.preflight.d.ts.map +1 -1
  153. package/dist/commands/release/apply.preflight.js +1 -1
  154. package/dist/commands/shared/approval-requirements.d.ts +5 -7
  155. package/dist/commands/shared/approval-requirements.d.ts.map +1 -1
  156. package/dist/commands/shared/approval-requirements.js +3 -73
  157. package/dist/commands/shared/gh-transport.d.ts +16 -0
  158. package/dist/commands/shared/gh-transport.d.ts.map +1 -0
  159. package/dist/commands/shared/gh-transport.js +71 -0
  160. package/dist/commands/shared/git-diff.d.ts +3 -1
  161. package/dist/commands/shared/git-diff.d.ts.map +1 -1
  162. package/dist/commands/shared/git-diff.js +10 -2
  163. package/dist/commands/shared/git-ops.d.ts +1 -0
  164. package/dist/commands/shared/git-ops.d.ts.map +1 -1
  165. package/dist/commands/shared/git-ops.js +15 -0
  166. package/dist/commands/shared/git-worktree.d.ts +2 -0
  167. package/dist/commands/shared/git-worktree.d.ts.map +1 -1
  168. package/dist/commands/shared/git-worktree.js +22 -2
  169. package/dist/commands/shared/network-approval.d.ts +2 -0
  170. package/dist/commands/shared/network-approval.d.ts.map +1 -1
  171. package/dist/commands/shared/network-approval.js +1 -1
  172. package/dist/commands/shared/post-commit-pr-artifacts.d.ts +9 -0
  173. package/dist/commands/shared/post-commit-pr-artifacts.d.ts.map +1 -0
  174. package/dist/commands/shared/post-commit-pr-artifacts.js +22 -0
  175. package/dist/commands/shared/pr-meta.d.ts +29 -0
  176. package/dist/commands/shared/pr-meta.d.ts.map +1 -1
  177. package/dist/commands/shared/pr-meta.js +152 -3
  178. package/dist/commands/shared/task-backend.d.ts +9 -0
  179. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  180. package/dist/commands/shared/task-backend.js +34 -22
  181. package/dist/commands/shared/task-local-freshness.d.ts +13 -0
  182. package/dist/commands/shared/task-local-freshness.d.ts.map +1 -0
  183. package/dist/commands/shared/task-local-freshness.js +20 -0
  184. package/dist/commands/shared/task-mutation.d.ts +2 -0
  185. package/dist/commands/shared/task-mutation.d.ts.map +1 -1
  186. package/dist/commands/shared/task-mutation.js +7 -0
  187. package/dist/commands/task/block.d.ts.map +1 -1
  188. package/dist/commands/task/block.js +1 -0
  189. package/dist/commands/task/close-duplicate.d.ts.map +1 -1
  190. package/dist/commands/task/close-duplicate.js +34 -1
  191. package/dist/commands/task/close-shared.d.ts.map +1 -1
  192. package/dist/commands/task/close-shared.js +1 -0
  193. package/dist/commands/task/derive.js +1 -1
  194. package/dist/commands/task/doc-template.d.ts.map +1 -1
  195. package/dist/commands/task/doc-template.js +7 -11
  196. package/dist/commands/task/findings-add.command.d.ts +20 -0
  197. package/dist/commands/task/findings-add.command.d.ts.map +1 -0
  198. package/dist/commands/task/findings-add.command.js +165 -0
  199. package/dist/commands/task/findings.command.d.ts +7 -0
  200. package/dist/commands/task/findings.command.d.ts.map +1 -0
  201. package/dist/commands/task/findings.command.js +20 -0
  202. package/dist/commands/task/findings.d.ts +63 -0
  203. package/dist/commands/task/findings.d.ts.map +1 -0
  204. package/dist/commands/task/findings.js +188 -0
  205. package/dist/commands/task/finish-shared.d.ts +1 -0
  206. package/dist/commands/task/finish-shared.d.ts.map +1 -1
  207. package/dist/commands/task/finish-shared.js +60 -3
  208. package/dist/commands/task/finish.d.ts +10 -0
  209. package/dist/commands/task/finish.d.ts.map +1 -1
  210. package/dist/commands/task/finish.js +143 -0
  211. package/dist/commands/task/hosted-close-pr.command.d.ts +11 -0
  212. package/dist/commands/task/hosted-close-pr.command.d.ts.map +1 -0
  213. package/dist/commands/task/hosted-close-pr.command.js +414 -0
  214. package/dist/commands/task/hosted-close.command.d.ts.map +1 -1
  215. package/dist/commands/task/hosted-close.command.js +49 -1
  216. package/dist/commands/task/hosted-merge-sync.d.ts +38 -0
  217. package/dist/commands/task/hosted-merge-sync.d.ts.map +1 -1
  218. package/dist/commands/task/hosted-merge-sync.js +249 -17
  219. package/dist/commands/task/index.d.ts +1 -0
  220. package/dist/commands/task/index.d.ts.map +1 -1
  221. package/dist/commands/task/index.js +1 -0
  222. package/dist/commands/task/new.d.ts +1 -0
  223. package/dist/commands/task/new.d.ts.map +1 -1
  224. package/dist/commands/task/new.js +140 -30
  225. package/dist/commands/task/new.spec.d.ts.map +1 -1
  226. package/dist/commands/task/new.spec.js +7 -0
  227. package/dist/commands/task/normalize.command.d.ts +2 -0
  228. package/dist/commands/task/normalize.command.d.ts.map +1 -1
  229. package/dist/commands/task/normalize.command.js +45 -0
  230. package/dist/commands/task/normalize.d.ts +2 -0
  231. package/dist/commands/task/normalize.d.ts.map +1 -1
  232. package/dist/commands/task/normalize.js +85 -8
  233. package/dist/commands/task/plan.d.ts.map +1 -1
  234. package/dist/commands/task/plan.js +7 -10
  235. package/dist/commands/task/set-status.d.ts.map +1 -1
  236. package/dist/commands/task/set-status.js +1 -0
  237. package/dist/commands/task/shared/docs.d.ts +6 -0
  238. package/dist/commands/task/shared/docs.d.ts.map +1 -1
  239. package/dist/commands/task/shared/docs.js +14 -0
  240. package/dist/commands/task/shared/transition-command.d.ts +2 -0
  241. package/dist/commands/task/shared/transition-command.d.ts.map +1 -1
  242. package/dist/commands/task/shared/transition-command.js +1 -0
  243. package/dist/commands/task/shared/transitions.d.ts.map +1 -1
  244. package/dist/commands/task/shared/transitions.js +11 -1
  245. package/dist/commands/task/shared.d.ts +1 -1
  246. package/dist/commands/task/shared.d.ts.map +1 -1
  247. package/dist/commands/task/shared.js +1 -1
  248. package/dist/commands/task/start-ready.d.ts.map +1 -1
  249. package/dist/commands/task/start-ready.js +98 -1
  250. package/dist/commands/task/start.d.ts.map +1 -1
  251. package/dist/commands/task/start.js +18 -10
  252. package/dist/commands/task/task.command.d.ts.map +1 -1
  253. package/dist/commands/task/task.command.js +4 -0
  254. package/dist/commands/task/verify-command-shared.d.ts +19 -0
  255. package/dist/commands/task/verify-command-shared.d.ts.map +1 -1
  256. package/dist/commands/task/verify-command-shared.js +152 -1
  257. package/dist/commands/task/verify-ok.command.d.ts.map +1 -1
  258. package/dist/commands/task/verify-ok.command.js +15 -2
  259. package/dist/commands/task/verify-record.d.ts +36 -0
  260. package/dist/commands/task/verify-record.d.ts.map +1 -1
  261. package/dist/commands/task/verify-record.js +193 -11
  262. package/dist/commands/task/verify-rework.command.d.ts.map +1 -1
  263. package/dist/commands/task/verify-rework.command.js +15 -2
  264. package/dist/commands/task/verify-show.command.d.ts +1 -1
  265. package/dist/commands/task/verify-show.command.d.ts.map +1 -1
  266. package/dist/commands/task/verify-show.command.js +28 -1
  267. package/dist/commands/upgrade.d.ts.map +1 -1
  268. package/dist/commands/upgrade.js +6 -1
  269. package/dist/commands/verify.run.d.ts.map +1 -1
  270. package/dist/commands/verify.run.js +12 -0
  271. package/dist/commands/verify.spec.d.ts +2 -6
  272. package/dist/commands/verify.spec.d.ts.map +1 -1
  273. package/dist/commands/verify.spec.js +30 -3
  274. package/dist/policy/engine.d.ts +3 -1
  275. package/dist/policy/engine.d.ts.map +1 -1
  276. package/dist/policy/engine.js +5 -6
  277. package/dist/policy/taxonomy.d.ts +17 -0
  278. package/dist/policy/taxonomy.d.ts.map +1 -0
  279. package/dist/policy/taxonomy.js +302 -0
  280. package/dist/policy/types.d.ts +2 -1
  281. package/dist/policy/types.d.ts.map +1 -1
  282. package/dist/runner/artifacts.d.ts.map +1 -1
  283. package/dist/runner/artifacts.js +2 -0
  284. package/dist/runner/context/base-prompts.d.ts +25 -0
  285. package/dist/runner/context/base-prompts.d.ts.map +1 -1
  286. package/dist/runner/context/base-prompts.js +182 -54
  287. package/dist/runner/context/recipe-context.d.ts.map +1 -1
  288. package/dist/runner/context/recipe-context.js +5 -0
  289. package/dist/runner/types.d.ts +12 -0
  290. package/dist/runner/types.d.ts.map +1 -1
  291. package/dist/runner/usecases/scenario-materialize-task.d.ts.map +1 -1
  292. package/dist/runner/usecases/scenario-materialize-task.js +81 -11
  293. package/dist/runner/usecases/task-run-inspect.d.ts.map +1 -1
  294. package/dist/runner/usecases/task-run-inspect.js +9 -7
  295. package/dist/runner/usecases/task-run-lifecycle-shared.d.ts.map +1 -1
  296. package/dist/runner/usecases/task-run-lifecycle-shared.js +8 -6
  297. package/dist/runner/usecases/task-run.d.ts.map +1 -1
  298. package/dist/runner/usecases/task-run.js +59 -12
  299. package/dist/runtime/approvals/index.d.ts +3 -0
  300. package/dist/runtime/approvals/index.d.ts.map +1 -0
  301. package/dist/runtime/approvals/index.js +1 -0
  302. package/dist/runtime/approvals/runtime.d.ts +12 -0
  303. package/dist/runtime/approvals/runtime.d.ts.map +1 -0
  304. package/dist/runtime/approvals/runtime.js +154 -0
  305. package/dist/runtime/approvals/types.d.ts +31 -0
  306. package/dist/runtime/approvals/types.d.ts.map +1 -0
  307. package/dist/runtime/approvals/types.js +1 -0
  308. package/dist/runtime/behavior/index.d.ts +3 -0
  309. package/dist/runtime/behavior/index.d.ts.map +1 -0
  310. package/dist/runtime/behavior/index.js +1 -0
  311. package/dist/runtime/behavior/resolve.d.ts +7 -0
  312. package/dist/runtime/behavior/resolve.d.ts.map +1 -0
  313. package/dist/runtime/behavior/resolve.js +66 -0
  314. package/dist/runtime/behavior/types.d.ts +25 -0
  315. package/dist/runtime/behavior/types.d.ts.map +1 -0
  316. package/dist/runtime/behavior/types.js +1 -0
  317. package/dist/runtime/capabilities/backend.d.ts +7 -0
  318. package/dist/runtime/capabilities/backend.d.ts.map +1 -0
  319. package/dist/runtime/capabilities/backend.js +104 -0
  320. package/dist/runtime/capabilities/index.d.ts +6 -0
  321. package/dist/runtime/capabilities/index.d.ts.map +1 -0
  322. package/dist/runtime/capabilities/index.js +4 -0
  323. package/dist/runtime/capabilities/recipe.d.ts +10 -0
  324. package/dist/runtime/capabilities/recipe.d.ts.map +1 -0
  325. package/dist/runtime/capabilities/recipe.js +123 -0
  326. package/dist/runtime/capabilities/registry.d.ts +6 -0
  327. package/dist/runtime/capabilities/registry.d.ts.map +1 -0
  328. package/dist/runtime/capabilities/registry.js +69 -0
  329. package/dist/runtime/capabilities/runner.d.ts +8 -0
  330. package/dist/runtime/capabilities/runner.d.ts.map +1 -0
  331. package/dist/runtime/capabilities/runner.js +73 -0
  332. package/dist/runtime/capabilities/types.d.ts +28 -0
  333. package/dist/runtime/capabilities/types.d.ts.map +1 -0
  334. package/dist/runtime/capabilities/types.js +1 -0
  335. package/dist/runtime/execution-profile/index.d.ts +3 -0
  336. package/dist/runtime/execution-profile/index.d.ts.map +1 -0
  337. package/dist/runtime/execution-profile/index.js +1 -0
  338. package/dist/runtime/execution-profile/resolve.d.ts +9 -0
  339. package/dist/runtime/execution-profile/resolve.d.ts.map +1 -0
  340. package/dist/runtime/execution-profile/resolve.js +80 -0
  341. package/dist/runtime/execution-profile/types.d.ts +27 -0
  342. package/dist/runtime/execution-profile/types.d.ts.map +1 -0
  343. package/dist/runtime/execution-profile/types.js +1 -0
  344. package/dist/runtime/explain/index.d.ts +3 -0
  345. package/dist/runtime/explain/index.d.ts.map +1 -0
  346. package/dist/runtime/explain/index.js +1 -0
  347. package/dist/runtime/explain/resolve.d.ts +14 -0
  348. package/dist/runtime/explain/resolve.d.ts.map +1 -0
  349. package/dist/runtime/explain/resolve.js +50 -0
  350. package/dist/runtime/explain/types.d.ts +28 -0
  351. package/dist/runtime/explain/types.d.ts.map +1 -0
  352. package/dist/runtime/explain/types.js +1 -0
  353. package/dist/runtime/harness/index.d.ts +4 -0
  354. package/dist/runtime/harness/index.d.ts.map +1 -0
  355. package/dist/runtime/harness/index.js +2 -0
  356. package/dist/runtime/harness/resolve-from-command-context.d.ts +4 -0
  357. package/dist/runtime/harness/resolve-from-command-context.d.ts.map +1 -0
  358. package/dist/runtime/harness/resolve-from-command-context.js +11 -0
  359. package/dist/runtime/harness/resolve.d.ts +13 -0
  360. package/dist/runtime/harness/resolve.d.ts.map +1 -0
  361. package/dist/runtime/harness/resolve.js +146 -0
  362. package/dist/runtime/harness/types.d.ts +65 -0
  363. package/dist/runtime/harness/types.d.ts.map +1 -0
  364. package/dist/runtime/harness/types.js +1 -0
  365. package/dist/runtime/incidents/index.d.ts +3 -0
  366. package/dist/runtime/incidents/index.d.ts.map +1 -0
  367. package/dist/runtime/incidents/index.js +1 -0
  368. package/dist/runtime/incidents/resolve.d.ts +26 -0
  369. package/dist/runtime/incidents/resolve.d.ts.map +1 -0
  370. package/dist/runtime/incidents/resolve.js +683 -0
  371. package/dist/runtime/incidents/types.d.ts +84 -0
  372. package/dist/runtime/incidents/types.d.ts.map +1 -0
  373. package/dist/runtime/incidents/types.js +1 -0
  374. package/dist/runtime/protocol/index.d.ts +3 -0
  375. package/dist/runtime/protocol/index.d.ts.map +1 -0
  376. package/dist/runtime/protocol/index.js +2 -0
  377. package/dist/runtime/protocol/resolve.d.ts +16 -0
  378. package/dist/runtime/protocol/resolve.d.ts.map +1 -0
  379. package/dist/runtime/protocol/resolve.js +36 -0
  380. package/dist/runtime/protocol/types.d.ts +36 -0
  381. package/dist/runtime/protocol/types.d.ts.map +1 -0
  382. package/dist/runtime/protocol/types.js +1 -0
  383. package/dist/runtime/task-intake/index.d.ts +3 -0
  384. package/dist/runtime/task-intake/index.d.ts.map +1 -0
  385. package/dist/runtime/task-intake/index.js +1 -0
  386. package/dist/runtime/task-intake/resolve.d.ts +48 -0
  387. package/dist/runtime/task-intake/resolve.d.ts.map +1 -0
  388. package/dist/runtime/task-intake/resolve.js +316 -0
  389. package/dist/runtime/task-intake/types.d.ts +117 -0
  390. package/dist/runtime/task-intake/types.d.ts.map +1 -0
  391. package/dist/runtime/task-intake/types.js +1 -0
  392. package/dist/shared/env.d.ts +1 -0
  393. package/dist/shared/env.d.ts.map +1 -1
  394. package/dist/shared/env.js +22 -1
  395. package/dist/shared/protected-paths.d.ts +4 -0
  396. package/dist/shared/protected-paths.d.ts.map +1 -1
  397. package/dist/shared/protected-paths.js +8 -4
  398. package/dist/usecases/context/resolve-context.d.ts +55 -6
  399. package/dist/usecases/context/resolve-context.d.ts.map +1 -1
  400. package/dist/usecases/context/resolve-context.js +96 -6
  401. package/dist/usecases/task/task-list-usecase.d.ts.map +1 -1
  402. package/dist/usecases/task/task-list-usecase.js +8 -2
  403. package/dist/usecases/task/task-new-usecase.js +4 -4
  404. package/package.json +2 -2
@@ -12,6 +12,7 @@ import { loadTaskFromContext } from "../shared/task-backend.js";
12
12
  import { createTaskCloseCommit, writeFinishedTasks } from "./finish-shared.js";
13
13
  import { resolveHostedMergeTargetFromEvent } from "./hosted-merge-sync.js";
14
14
  import { readCommitInfo } from "./shared.js";
15
+ import { collectTaskIncidents, renderIncidentCollectionPlanOutcome } from "../incidents/shared.js";
15
16
  export const taskHostedCloseSpec = {
16
17
  id: ["task", "hosted-close"],
17
18
  group: "Task",
@@ -50,6 +51,30 @@ export const taskHostedCloseSpec = {
50
51
  quiet: raw.opts.quiet === true,
51
52
  }),
52
53
  };
54
+ function isMissingCommitObjectError(err) {
55
+ const stderr = err.stderr;
56
+ const text = err instanceof Error
57
+ ? [err.message, typeof stderr === "string" ? stderr : ""]
58
+ .filter((part) => part.trim().length > 0)
59
+ .join("\n")
60
+ : String(err);
61
+ return (/bad object/i.test(text) || /unknown revision/i.test(text) || /ambiguous argument/i.test(text));
62
+ }
63
+ async function resolveHostedTaskCommitInfo(opts) {
64
+ const mergeHash = opts.mergedPr.mergeCommit?.oid ?? "";
65
+ try {
66
+ return await readCommitInfo(opts.gitRoot, mergeHash);
67
+ }
68
+ catch (err) {
69
+ if (!isMissingCommitObjectError(err))
70
+ throw err;
71
+ return {
72
+ hash: mergeHash,
73
+ message: opts.mergedPr.title?.trim() ??
74
+ `Hosted PR #${opts.mergedPr.number} merged on GitHub ${opts.mergedPr.baseRefName ?? "main"}`,
75
+ };
76
+ }
77
+ }
53
78
  async function hasTaskArtifactChanges(opts) {
54
79
  const { stdout } = await execFileAsync("git", ["status", "--short", "--", opts.taskDirRelative], {
55
80
  cwd: opts.gitRoot,
@@ -128,10 +153,19 @@ async function closeHostedTask(opts) {
128
153
  mergeHash: target.mergedPr.mergeCommit.oid,
129
154
  };
130
155
  }
131
- const taskCommitInfo = await readCommitInfo(gitRoot, target.mergedPr.mergeCommit.oid);
156
+ const taskCommitInfo = await resolveHostedTaskCommitInfo({
157
+ gitRoot,
158
+ mergedPr: target.mergedPr,
159
+ });
132
160
  const prLabel = `PR #${target.mergedPr.number}`;
133
161
  const finishBody = `Verified: ${prLabel} merged on GitHub ${target.mergedPr.baseRefName ?? "main"}; ` +
134
162
  "hosted closure automation recorded canonical task artifacts.";
163
+ await collectTaskIncidents({
164
+ ctx: opts.ctx,
165
+ taskId: target.taskId,
166
+ task,
167
+ write: false,
168
+ });
135
169
  await writeFinishedTasks({
136
170
  ctx: opts.ctx,
137
171
  loadedTasks: [{ taskId: target.taskId, task }],
@@ -145,6 +179,19 @@ async function closeHostedTask(opts) {
145
179
  breaking: false,
146
180
  taskCommitInfo,
147
181
  });
182
+ const collectedIncidents = await collectTaskIncidents({
183
+ ctx: opts.ctx,
184
+ taskId: target.taskId,
185
+ write: true,
186
+ });
187
+ if (!opts.quiet) {
188
+ process.stdout.write(`${infoMessage(renderIncidentCollectionPlanOutcome(collectedIncidents.plan, {
189
+ wrote: collectedIncidents.wrote,
190
+ context: "finish",
191
+ promotedIds: collectedIncidents.plan.promotable.map((item) => item.entry.id),
192
+ registryPaths: collectedIncidents.registryPaths,
193
+ }))}\n`);
194
+ }
148
195
  await createTaskCloseCommit({
149
196
  ctx: opts.ctx,
150
197
  cwd: opts.cwd,
@@ -152,6 +199,7 @@ async function closeHostedTask(opts) {
152
199
  taskId: target.taskId,
153
200
  baseBranchOverride: target.mergedPr.baseRefName ?? meta.base ?? "main",
154
201
  quiet: opts.quiet,
202
+ allowPolicy: collectedIncidents.wrote,
155
203
  });
156
204
  return {
157
205
  outcome: "closed",
@@ -1,3 +1,4 @@
1
+ import { type TaskPrMeta } from "@agentplaneorg/core";
1
2
  import type { TaskData } from "../../backends/task-backend.js";
2
3
  import type { CommandContext } from "../shared/task-backend.js";
3
4
  export type HostedMergedPr = {
@@ -21,10 +22,35 @@ type HostedMergeSyncResult = {
21
22
  tasks: TaskData[];
22
23
  synced: number;
23
24
  };
25
+ export type LocalBranchPrSyncCandidate = {
26
+ taskId: string;
27
+ branch: string;
28
+ base: string;
29
+ commitHash: string;
30
+ verificationSource: "task" | "pr";
31
+ };
32
+ export type LocalDoneBranchPrDrift = {
33
+ taskId: string;
34
+ branch: string;
35
+ base: string;
36
+ commitHash: string;
37
+ };
38
+ export type LocalMergedPrMeta = {
39
+ branch: string;
40
+ base?: string | null;
41
+ mergedAt?: string | null;
42
+ mergeCommit: string;
43
+ headSha?: string | null;
44
+ };
45
+ export declare function resolveLocalMergedPrMeta(meta: TaskPrMeta | null): LocalMergedPrMeta | null;
24
46
  export declare function resolveHostedMergeTargetFromEvent(opts: {
25
47
  event: unknown;
26
48
  branchPrefix: string;
27
49
  }): HostedMergeTarget | null;
50
+ export declare function resolveHostedMergedPr(opts: {
51
+ cwd: string;
52
+ branch: string;
53
+ }): Promise<HostedMergedPr | null>;
28
54
  export declare function syncHostedMergedTask(opts: {
29
55
  ctx: CommandContext;
30
56
  tasks: TaskData[];
@@ -32,6 +58,18 @@ export declare function syncHostedMergedTask(opts: {
32
58
  missingTask?: "noop" | "error";
33
59
  missingPrMeta?: "noop" | "error";
34
60
  }): Promise<HostedMergeSyncResult>;
61
+ export declare function findLocallyShippedBranchPrTasks(opts: {
62
+ ctx: CommandContext;
63
+ tasks: TaskData[];
64
+ }): Promise<LocalBranchPrSyncCandidate[]>;
65
+ export declare function findDoneBranchPrTasksWithOpenPrArtifacts(opts: {
66
+ ctx: CommandContext;
67
+ tasks: TaskData[];
68
+ }): Promise<LocalDoneBranchPrDrift[]>;
69
+ export declare function syncLocallyShippedBranchPrTasks(opts: {
70
+ ctx: CommandContext;
71
+ tasks: TaskData[];
72
+ }): Promise<HostedMergeSyncResult>;
35
73
  export declare function syncHostedMergedTasks(opts: {
36
74
  ctx: CommandContext;
37
75
  tasks: TaskData[];
@@ -1 +1 @@
1
- {"version":3,"file":"hosted-merge-sync.d.ts","sourceRoot":"","sources":["../../../src/commands/task/hosted-merge-sync.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAM/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,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,KAAK,qBAAqB,GAAG;IAC3B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA6EF,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,iBAAiB,GAAG,IAAI,CAY3B;AA2HD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAuDjC;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA0CjC"}
1
+ {"version":3,"file":"hosted-merge-sync.d.ts","sourceRoot":"","sources":["../../../src/commands/task/hosted-merge-sync.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { normalizeTaskDocVersion } from "@agentplaneorg/core";
3
+ import { normalizeTaskDocVersion, resolveBaseBranch } from "@agentplaneorg/core";
4
4
  import { CliError } from "../../shared/errors.js";
5
5
  import { writeJsonStableIfChanged } from "../../shared/write-if-changed.js";
6
6
  import { execFileAsync } from "../shared/git.js";
7
+ import { withGhTransportRetry } from "../shared/gh-transport.js";
7
8
  import { parseTaskIdFromBranch } from "../shared/git-worktree.js";
8
9
  import { parsePrMeta } from "../shared/pr-meta.js";
10
+ import { ghEnv } from "../pr/internal/gh-api.js";
9
11
  import { appendTaskEvent } from "./shared.js";
10
12
  function normalizeMergedPr(value) {
11
13
  if (!value || typeof value !== "object" || Array.isArray(value))
@@ -78,6 +80,19 @@ function pickHostedMergedPr(records) {
78
80
  return right.localeCompare(left);
79
81
  })[0] ?? null);
80
82
  }
83
+ export function resolveLocalMergedPrMeta(meta) {
84
+ const branch = meta?.branch?.trim() ?? "";
85
+ const mergeCommit = meta?.merge_commit?.trim() ?? "";
86
+ if (meta?.status !== "MERGED" || !branch || !mergeCommit)
87
+ return null;
88
+ return {
89
+ branch,
90
+ base: meta.base ?? null,
91
+ mergedAt: meta.merged_at ?? null,
92
+ mergeCommit,
93
+ headSha: meta.head_sha ?? null,
94
+ };
95
+ }
81
96
  export function resolveHostedMergeTargetFromEvent(opts) {
82
97
  if (!opts.event || typeof opts.event !== "object" || Array.isArray(opts.event))
83
98
  return null;
@@ -94,23 +109,27 @@ export function resolveHostedMergeTargetFromEvent(opts) {
94
109
  mergedPr,
95
110
  };
96
111
  }
97
- async function resolveHostedMergedPr(opts) {
98
- const { stdout } = await execFileAsync("gh", [
99
- "pr",
100
- "list",
101
- "--state",
102
- "merged",
103
- "--head",
104
- opts.branch,
105
- "--json",
106
- "number,title,url,mergedAt,baseRefName,headRefName,headRefOid,mergeCommit",
107
- ], {
108
- cwd: opts.cwd,
109
- env: process.env,
110
- maxBuffer: 10 * 1024 * 1024,
112
+ export async function resolveHostedMergedPr(opts) {
113
+ return await withGhTransportRetry(async () => {
114
+ const { stdout } = await execFileAsync("gh", [
115
+ "pr",
116
+ "list",
117
+ "--state",
118
+ "merged",
119
+ "--head",
120
+ opts.branch,
121
+ "--json",
122
+ "number,title,url,mergedAt,baseRefName,headRefName,headRefOid,mergeCommit",
123
+ ], {
124
+ cwd: opts.cwd,
125
+ env: ghEnv(),
126
+ maxBuffer: 10 * 1024 * 1024,
127
+ });
128
+ const parsed = JSON.parse(stdout);
129
+ return Array.isArray(parsed) ? pickHostedMergedPr(parsed) : null;
130
+ }, {
131
+ label: `looking up merged PR metadata for ${opts.branch}`,
111
132
  });
112
- const parsed = JSON.parse(stdout);
113
- return Array.isArray(parsed) ? pickHostedMergedPr(parsed) : null;
114
133
  }
115
134
  function buildSyncedPrMeta(opts) {
116
135
  const at = opts.mergedPr.mergedAt ?? new Date().toISOString();
@@ -160,6 +179,119 @@ function buildSyncedTask(opts) {
160
179
  doc_updated_by: "INTEGRATOR",
161
180
  };
162
181
  }
182
+ function needsHostedMergeSyncFromLocalMeta(opts) {
183
+ const currentStatus = String(opts.task.status || "TODO").toUpperCase();
184
+ const expectedCommit = opts.meta.mergeCommit;
185
+ if (currentStatus !== "DONE")
186
+ return true;
187
+ if ((opts.task.commit?.hash ?? "") !== expectedCommit)
188
+ return true;
189
+ return false;
190
+ }
191
+ function buildLocallyMergedSyncedTask(opts) {
192
+ const at = opts.meta.mergedAt ?? new Date().toISOString();
193
+ const currentStatus = String(opts.task.status || "TODO").toUpperCase();
194
+ const note = "Local PR metadata already marks the task branch as MERGED; " +
195
+ "task projection reconciled without an additional GitHub lookup.";
196
+ const statusEvent = {
197
+ type: "status",
198
+ at,
199
+ author: "INTEGRATOR",
200
+ from: currentStatus,
201
+ to: "DONE",
202
+ note,
203
+ };
204
+ return {
205
+ ...opts.task,
206
+ status: "DONE",
207
+ result_summary: opts.task.result_summary ?? "Merged and reconciled from local PR metadata.",
208
+ commit: opts.task.commit?.hash?.trim()
209
+ ? opts.task.commit
210
+ : {
211
+ hash: opts.meta.mergeCommit,
212
+ message: "Merged branch_pr task reconciled from local PR metadata",
213
+ },
214
+ events: appendTaskEvent(opts.task, statusEvent),
215
+ doc_version: normalizeTaskDocVersion(opts.task.doc_version),
216
+ doc_updated_at: at,
217
+ doc_updated_by: "INTEGRATOR",
218
+ };
219
+ }
220
+ function hasTaskVerificationForLocalSync(opts) {
221
+ if (opts.task.verification?.state === "ok")
222
+ return "task";
223
+ if (opts.meta?.verify?.status === "pass")
224
+ return "pr";
225
+ return null;
226
+ }
227
+ async function gitRefExists(opts) {
228
+ try {
229
+ await execFileAsync("git", ["rev-parse", "--verify", "--quiet", opts.ref], {
230
+ cwd: opts.cwd,
231
+ env: process.env,
232
+ });
233
+ return true;
234
+ }
235
+ catch {
236
+ return false;
237
+ }
238
+ }
239
+ async function gitIsAncestor(opts) {
240
+ try {
241
+ await execFileAsync("git", ["merge-base", "--is-ancestor", opts.ancestor, opts.descendant], {
242
+ cwd: opts.cwd,
243
+ env: process.env,
244
+ });
245
+ return true;
246
+ }
247
+ catch (err) {
248
+ const code = err?.code;
249
+ if (code === 1)
250
+ return false;
251
+ throw err;
252
+ }
253
+ }
254
+ async function resolveSyncBaseBranch(opts) {
255
+ const fromMeta = opts.meta?.base?.trim() ?? "";
256
+ if (fromMeta.length > 0)
257
+ return fromMeta;
258
+ return await resolveBaseBranch({
259
+ cwd: opts.ctx.resolvedProject.gitRoot,
260
+ rootOverride: opts.ctx.resolvedProject.gitRoot,
261
+ cliBaseOpt: null,
262
+ mode: opts.ctx.config.workflow_mode,
263
+ });
264
+ }
265
+ function buildLocallySyncedTask(opts) {
266
+ const at = new Date().toISOString();
267
+ const currentStatus = String(opts.task.status || "TODO").toUpperCase();
268
+ const note = `Local branch_pr reconciliation detected task commit ${opts.candidate.commitHash.slice(0, 12)} ` +
269
+ `on base ${opts.candidate.base}; canonical task state normalized after shipment.`;
270
+ const statusEvent = {
271
+ type: "status",
272
+ at,
273
+ author: "INTEGRATOR",
274
+ from: currentStatus,
275
+ to: "DONE",
276
+ note,
277
+ };
278
+ return {
279
+ ...opts.task,
280
+ status: "DONE",
281
+ result_summary: opts.task.result_summary ??
282
+ `Shipped on ${opts.candidate.base} and reconciled from local branch_pr state.`,
283
+ commit: opts.task.commit?.hash?.trim()
284
+ ? opts.task.commit
285
+ : {
286
+ hash: opts.candidate.commitHash,
287
+ message: `Shipped on ${opts.candidate.base} before canonical task closure`,
288
+ },
289
+ events: appendTaskEvent(opts.task, statusEvent),
290
+ doc_version: normalizeTaskDocVersion(opts.task.doc_version),
291
+ doc_updated_at: at,
292
+ doc_updated_by: "INTEGRATOR",
293
+ };
294
+ }
163
295
  async function readPrMetaIfPresent(opts) {
164
296
  const metaPath = path.join(opts.ctx.resolvedProject.gitRoot, opts.ctx.config.paths.workflow_dir, opts.taskId, "pr", "meta.json");
165
297
  try {
@@ -238,6 +370,97 @@ export async function syncHostedMergedTask(opts) {
238
370
  synced: 1,
239
371
  };
240
372
  }
373
+ export async function findLocallyShippedBranchPrTasks(opts) {
374
+ if (opts.ctx.backendId !== "local" || opts.ctx.config.workflow_mode !== "branch_pr") {
375
+ return [];
376
+ }
377
+ const matches = [];
378
+ for (const task of opts.tasks) {
379
+ const currentStatus = String(task.status || "TODO").toUpperCase();
380
+ if (currentStatus === "DONE")
381
+ continue;
382
+ const prMetaRecord = await readPrMetaIfPresent({ ctx: opts.ctx, taskId: task.id });
383
+ const verificationSource = hasTaskVerificationForLocalSync({
384
+ task,
385
+ meta: prMetaRecord?.meta ?? null,
386
+ });
387
+ if (!verificationSource)
388
+ continue;
389
+ const commitHash = task.commit?.hash?.trim() ?? "";
390
+ if (!commitHash)
391
+ continue;
392
+ const base = await resolveSyncBaseBranch({
393
+ ctx: opts.ctx,
394
+ meta: prMetaRecord?.meta ?? null,
395
+ });
396
+ if (!base)
397
+ continue;
398
+ if (!(await gitRefExists({ cwd: opts.ctx.resolvedProject.gitRoot, ref: base })))
399
+ continue;
400
+ if (!(await gitIsAncestor({
401
+ cwd: opts.ctx.resolvedProject.gitRoot,
402
+ ancestor: commitHash,
403
+ descendant: base,
404
+ }))) {
405
+ continue;
406
+ }
407
+ matches.push({
408
+ taskId: task.id,
409
+ branch: prMetaRecord?.meta.branch?.trim() ?? "",
410
+ base,
411
+ commitHash,
412
+ verificationSource,
413
+ });
414
+ }
415
+ return matches;
416
+ }
417
+ export async function findDoneBranchPrTasksWithOpenPrArtifacts(opts) {
418
+ if (opts.ctx.backendId !== "local" || opts.ctx.config.workflow_mode !== "branch_pr") {
419
+ return [];
420
+ }
421
+ const matches = [];
422
+ for (const task of opts.tasks) {
423
+ const currentStatus = String(task.status || "TODO").toUpperCase();
424
+ if (currentStatus !== "DONE")
425
+ continue;
426
+ const prMetaRecord = await readPrMetaIfPresent({ ctx: opts.ctx, taskId: task.id });
427
+ const meta = prMetaRecord?.meta ?? null;
428
+ if (!meta || meta.status === "MERGED")
429
+ continue;
430
+ const branch = meta.branch?.trim() ?? "";
431
+ if (!branch)
432
+ continue;
433
+ const commitHash = task.commit?.hash?.trim() ?? meta.head_sha?.trim() ?? "";
434
+ if (!commitHash)
435
+ continue;
436
+ const base = await resolveSyncBaseBranch({
437
+ ctx: opts.ctx,
438
+ meta,
439
+ });
440
+ if (!base)
441
+ continue;
442
+ matches.push({
443
+ taskId: task.id,
444
+ branch,
445
+ base,
446
+ commitHash,
447
+ });
448
+ }
449
+ return matches;
450
+ }
451
+ export async function syncLocallyShippedBranchPrTasks(opts) {
452
+ const matches = await findLocallyShippedBranchPrTasks(opts);
453
+ if (matches.length === 0)
454
+ return { tasks: opts.tasks, synced: 0 };
455
+ const byTaskId = new Map(matches.map((entry) => [entry.taskId, entry]));
456
+ return {
457
+ tasks: opts.tasks.map((task) => {
458
+ const candidate = byTaskId.get(task.id);
459
+ return candidate ? buildLocallySyncedTask({ task, candidate }) : task;
460
+ }),
461
+ synced: matches.length,
462
+ };
463
+ }
241
464
  export async function syncHostedMergedTasks(opts) {
242
465
  if (opts.ctx.backendId !== "local" || opts.ctx.config.workflow_mode !== "branch_pr") {
243
466
  return { tasks: opts.tasks, synced: 0 };
@@ -255,6 +478,15 @@ export async function syncHostedMergedTasks(opts) {
255
478
  nextTasks.push(task);
256
479
  continue;
257
480
  }
481
+ const localMergedMeta = resolveLocalMergedPrMeta(prMetaRecord.meta);
482
+ if (localMergedMeta) {
483
+ nextTasks.push(needsHostedMergeSyncFromLocalMeta({ task, meta: localMergedMeta })
484
+ ? buildLocallyMergedSyncedTask({ task, meta: localMergedMeta })
485
+ : task);
486
+ if (needsHostedMergeSyncFromLocalMeta({ task, meta: localMergedMeta }))
487
+ synced += 1;
488
+ continue;
489
+ }
258
490
  const mergedPr = await resolveHostedMergedPr({
259
491
  cwd: opts.ctx.resolvedProject.gitRoot,
260
492
  branch,
@@ -18,6 +18,7 @@ export { cmdTaskDerive } from "./derive.js";
18
18
  export { cmdTaskCloseDuplicate } from "./close-duplicate.js";
19
19
  export { cmdTaskStartReady } from "./start-ready.js";
20
20
  export { cmdTaskCloseNoop } from "./close-noop.js";
21
+ export { makeRunTaskHostedClosePrHandler, taskHostedClosePrSpec, } from "./hosted-close-pr.command.js";
21
22
  export { cmdTaskExport } from "./export.js";
22
23
  export { cmdTaskLint } from "./lint.js";
23
24
  export { cmdTaskPlanSet, cmdTaskPlanApprove, cmdTaskPlanReject } from "./plan.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAElF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/task/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAElF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -17,6 +17,7 @@ export { cmdTaskDerive } from "./derive.js";
17
17
  export { cmdTaskCloseDuplicate } from "./close-duplicate.js";
18
18
  export { cmdTaskStartReady } from "./start-ready.js";
19
19
  export { cmdTaskCloseNoop } from "./close-noop.js";
20
+ export { makeRunTaskHostedClosePrHandler, taskHostedClosePrSpec, } from "./hosted-close-pr.command.js";
20
21
  export { cmdTaskExport } from "./export.js";
21
22
  export { cmdTaskLint } from "./lint.js";
22
23
  export { cmdTaskPlanSet, cmdTaskPlanApprove, cmdTaskPlanReject } from "./plan.js";
@@ -7,6 +7,7 @@ export type TaskNewParsed = {
7
7
  tags: string[];
8
8
  dependsOn: string[];
9
9
  verify: string[];
10
+ allowDuplicate: boolean;
10
11
  };
11
12
  export declare function runTaskNewParsed(opts: {
12
13
  ctx?: CommandContext;
@@ -1 +1 @@
1
- {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/commands/task/new.ts"],"names":[],"mappings":"AAOA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAcpF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC5C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAmDF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsGlB"}
1
+ {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/commands/task/new.ts"],"names":[],"mappings":"AAaA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAepF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC5C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAiIF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuJlB"}