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
@@ -1,19 +1,18 @@
1
- import { mkdir, readFile } from "node:fs/promises";
2
1
  import path from "node:path";
3
- import { atomicWriteFile } from "@agentplaneorg/core";
4
2
  import { mapBackendError } from "../../cli/error-map.js";
5
3
  import { exitCodeForError } from "../../cli/exit-codes.js";
6
- import { fileExists } from "../../cli/fs-utils.js";
7
- import { createCliEmitter, workflowModeMessage } from "../../cli/output.js";
4
+ import { createCliEmitter } from "../../cli/output.js";
8
5
  import { CliError } from "../../shared/errors.js";
9
- import { writeJsonStableIfChanged, writeTextIfChanged } from "../../shared/write-if-changed.js";
10
- import { gitCurrentBranch } from "../shared/git-ops.js";
11
- import { buildOpenedPrMeta, parsePrMeta } from "../shared/pr-meta.js";
12
- import { loadBackendTask, loadCommandContext, } from "../shared/task-backend.js";
13
- import { resolvePrPaths } from "./internal/pr-paths.js";
14
- import { renderPrReviewTemplate } from "./internal/review-template.js";
15
- function nowIso() {
16
- return new Date().toISOString();
6
+ import { syncPrArtifacts } from "./internal/sync.js";
7
+ function prOpenOutcomeDetails(meta, openOutcome) {
8
+ if (openOutcome)
9
+ return openOutcome.message;
10
+ if (typeof meta.pr_number === "number" && meta.pr_number > 0) {
11
+ return meta.pr_url?.trim()
12
+ ? `linked to GitHub PR #${meta.pr_number}: ${meta.pr_url.trim()}`
13
+ : `linked to GitHub PR #${meta.pr_number}`;
14
+ }
15
+ return "local PR artifacts synced; remote PR creation staged";
17
16
  }
18
17
  export async function cmdPrOpen(opts) {
19
18
  try {
@@ -26,52 +25,17 @@ export async function cmdPrOpen(opts) {
26
25
  message: "Invalid value for --author.",
27
26
  });
28
27
  }
29
- const ctx = opts.ctx ??
30
- (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
31
- const { task } = await loadBackendTask({
32
- ctx,
28
+ const { meta, prDir, resolved, openOutcome } = await syncPrArtifacts({
29
+ ctx: opts.ctx,
33
30
  cwd: opts.cwd,
34
31
  rootOverride: opts.rootOverride,
35
32
  taskId: opts.taskId,
33
+ mode: "open",
34
+ author,
35
+ branch: opts.branch,
36
+ remoteMode: opts.syncOnly ? "sync-only" : "auto",
36
37
  });
37
- const { resolved, config, prDir, metaPath, diffstatPath, verifyLogPath, reviewPath } = await resolvePrPaths({ ...opts, ctx });
38
- if (config.workflow_mode !== "branch_pr") {
39
- throw new CliError({
40
- exitCode: exitCodeForError("E_USAGE"),
41
- code: "E_USAGE",
42
- message: workflowModeMessage(config.workflow_mode, "branch_pr"),
43
- });
44
- }
45
- const branch = (opts.branch ?? (await gitCurrentBranch(resolved.gitRoot))).trim();
46
- if (!branch) {
47
- throw new CliError({
48
- exitCode: exitCodeForError("E_USAGE"),
49
- code: "E_USAGE",
50
- message: "Branch could not be resolved (use --branch).",
51
- });
52
- }
53
- await mkdir(prDir, { recursive: true });
54
- const now = nowIso();
55
- let meta = null;
56
- if (await fileExists(metaPath)) {
57
- const raw = await readFile(metaPath, "utf8");
58
- meta = parsePrMeta(raw, task.id);
59
- }
60
- const createdAt = meta?.created_at ?? now;
61
- const nextMeta = buildOpenedPrMeta({
62
- taskId: task.id,
63
- branch,
64
- at: now,
65
- previousMeta: meta,
66
- });
67
- await writeJsonStableIfChanged(metaPath, nextMeta);
68
- await writeTextIfChanged(diffstatPath, "");
69
- await writeTextIfChanged(verifyLogPath, "");
70
- if (!(await fileExists(reviewPath))) {
71
- const review = renderPrReviewTemplate({ author, createdAt, branch });
72
- await atomicWriteFile(reviewPath, review, "utf8");
73
- }
74
- output.success("pr open", path.relative(resolved.gitRoot, prDir));
38
+ output.success("pr open", path.relative(resolved.gitRoot, prDir), prOpenOutcomeDetails(meta, openOutcome ?? null));
75
39
  return 0;
76
40
  }
77
41
  catch (err) {
@@ -7,6 +7,7 @@ export type PrOpenParsed = {
7
7
  taskId: string;
8
8
  author: string;
9
9
  branch: string | null;
10
+ syncOnly: boolean;
10
11
  };
11
12
  export declare const prOpenSpec: CommandSpec<PrOpenParsed>;
12
13
  export type PrUpdateParsed = {
@@ -22,11 +23,25 @@ export type PrNoteParsed = {
22
23
  author: string;
23
24
  body: string;
24
25
  };
26
+ export type PrCloseParsed = {
27
+ prNumber: number;
28
+ repo?: string;
29
+ comment?: string;
30
+ deleteRemoteBranch: boolean;
31
+ };
32
+ export type PrCloseSupersededParsed = {
33
+ taskId: string;
34
+ deleteRemoteBranch: boolean;
35
+ };
25
36
  export declare const prNoteSpec: CommandSpec<PrNoteParsed>;
37
+ export declare const prCloseSpec: CommandSpec<PrCloseParsed>;
38
+ export declare const prCloseSupersededSpec: CommandSpec<PrCloseSupersededParsed>;
26
39
  export declare function makeRunPrHandler(_getCtx: (cmd: string) => Promise<CommandContext>): CommandHandler<GroupCommandParsed>;
27
40
  export declare function makeRunPrOpenHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: PrOpenParsed) => Promise<number>;
28
41
  export declare function makeRunPrUpdateHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: PrUpdateParsed) => Promise<number>;
29
42
  export declare function makeRunPrCheckHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: PrCheckParsed) => Promise<number>;
30
43
  export declare function makeRunPrNoteHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: PrNoteParsed) => Promise<number>;
44
+ export declare function makeRunPrCloseHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: PrCloseParsed) => Promise<number>;
45
+ export declare function makeRunPrCloseSupersededHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: PrCloseSupersededParsed) => Promise<number>;
31
46
  export {};
32
47
  //# sourceMappingURL=pr.command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pr.command.d.ts","sourceRoot":"","sources":["../../../src/commands/pr/pr.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,KAAK,aAAa,GAAG,kBAAkB,CAAC;AAExC,eAAO,MAAM,MAAM,EAAE,WAAW,CAAC,aAAa,CAgB7C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAErF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CAgChD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,cAAc,CAOpD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,aAAa,CAOlD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CA0ChD,CAAC;AAWF,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,GAChD,cAAc,CAAC,kBAAkB,CAAC,CAEpC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACrE,KAAK,UAAU,EAAE,GAAG,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,CAUjE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACvE,KAAK,UAAU,EAAE,GAAG,cAAc,KAAG,OAAO,CAAC,MAAM,CAAC,CAQnE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACtE,KAAK,UAAU,EAAE,GAAG,aAAa,KAAG,OAAO,CAAC,MAAM,CAAC,CAQlE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACrE,KAAK,UAAU,EAAE,GAAG,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,CAUjE"}
1
+ {"version":3,"file":"pr.command.d.ts","sourceRoot":"","sources":["../../../src/commands/pr/pr.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAWhE,KAAK,aAAa,GAAG,kBAAkB,CAAC;AAExC,eAAO,MAAM,MAAM,EAAE,WAAW,CAAC,aAAa,CA8B7C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CAuChD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,cAAc,CAOpD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,aAAa,CAOlD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,YAAY,CA0ChD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,aAAa,CAkDlD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,uBAAuB,CAwBtE,CAAC;AAWF,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,GAChD,cAAc,CAAC,kBAAkB,CAAC,CAEpC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACrE,KAAK,UAAU,EAAE,GAAG,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,CAWjE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACvE,KAAK,UAAU,EAAE,GAAG,cAAc,KAAG,OAAO,CAAC,MAAM,CAAC,CAQnE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACtE,KAAK,UAAU,EAAE,GAAG,aAAa,KAAG,OAAO,CAAC,MAAM,CAAC,CAQlE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACrE,KAAK,UAAU,EAAE,GAAG,YAAY,KAAG,OAAO,CAAC,MAAM,CAAC,CAUjE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACtE,KAAK,UAAU,EAAE,GAAG,aAAa,KAAG,OAAO,CAAC,MAAM,CAAC,CAWlE;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAChF,KAAK,UAAU,EAAE,GAAG,uBAAuB,KAAG,OAAO,CAAC,MAAM,CAAC,CAS5E"}
@@ -1,20 +1,33 @@
1
1
  import { loadDirectSubcommandNames, parseGroupCommand, throwGroupCommandUsage, } from "../../cli/group-command.js";
2
2
  import { usageError } from "../../cli/spec/errors.js";
3
- import { cmdPrCheck, cmdPrNote, cmdPrOpen, cmdPrUpdate } from "./index.js";
3
+ import { cmdPrCheck, cmdPrClose, cmdPrCloseSuperseded, cmdPrNote, cmdPrOpen, cmdPrUpdate, } from "./index.js";
4
4
  export const prSpec = {
5
5
  id: ["pr"],
6
6
  group: "PR",
7
- summary: "Manage local PR artifacts for a task (branch_pr workflow).",
8
- synopsis: ["agentplane pr <open|update|check|note> <task-id> [options]"],
7
+ summary: "Manage local PR review and GitHub publication artifacts for a task (branch_pr workflow).",
8
+ synopsis: [
9
+ "agentplane pr <open|update|check|note|close|close-superseded> <task-id|pr-number> [options]",
10
+ ],
9
11
  args: [{ name: "cmd", required: false, variadic: true, valueHint: "<cmd>" }],
10
12
  examples: [
11
13
  { cmd: "agentplane pr open 202602030608-F1Q8AB --author CODER", why: "Create PR artifacts." },
12
- { cmd: "agentplane pr update 202602030608-F1Q8AB", why: "Refresh diffstat and summary." },
14
+ {
15
+ cmd: "agentplane pr update 202602030608-F1Q8AB",
16
+ why: "Refresh review.md plus github-title/body projections.",
17
+ },
13
18
  { cmd: "agentplane pr check 202602030608-F1Q8AB", why: "Validate PR artifacts." },
14
19
  {
15
20
  cmd: 'agentplane pr note 202602030608-F1Q8AB --author REVIEWER --body "Looks good"',
16
21
  why: "Append a handoff note.",
17
22
  },
23
+ {
24
+ cmd: 'agentplane pr close 123 --comment "Superseded by #456" --delete-remote-branch',
25
+ why: "Close a stale GitHub PR through REST and optionally delete its remote head branch.",
26
+ },
27
+ {
28
+ cmd: "agentplane pr close-superseded 202604072308-A1XE27 --delete-remote-branch",
29
+ why: "Close a superseded task PR from task artifacts after protected-main closure.",
30
+ },
18
31
  ],
19
32
  parse: (raw) => parseGroupCommand(raw),
20
33
  };
@@ -37,6 +50,12 @@ export const prOpenSpec = {
37
50
  valueHint: "<name>",
38
51
  description: "Branch name (default: current branch).",
39
52
  },
53
+ {
54
+ kind: "boolean",
55
+ name: "sync-only",
56
+ default: false,
57
+ description: "Only write local PR artifacts; do not create a remote GitHub PR.",
58
+ },
40
59
  ],
41
60
  examples: [{ cmd: "agentplane pr open 202602030608-F1Q8AB --author CODER", why: "Open." }],
42
61
  validateRaw: (raw) => {
@@ -49,12 +68,13 @@ export const prOpenSpec = {
49
68
  taskId: String(raw.args["task-id"]),
50
69
  author: String(raw.opts.author),
51
70
  branch: typeof raw.opts.branch === "string" ? raw.opts.branch : null,
71
+ syncOnly: Boolean(raw.opts["sync-only"]),
52
72
  }),
53
73
  };
54
74
  export const prUpdateSpec = {
55
75
  id: ["pr", "update"],
56
76
  group: "PR",
57
- summary: "Update PR artifacts (diffstat and auto summary).",
77
+ summary: "Update PR artifacts (review packet, diffstat, and GitHub projections).",
58
78
  args: [{ name: "task-id", required: true, valueHint: "<task-id>" }],
59
79
  examples: [{ cmd: "agentplane pr update 202602030608-F1Q8AB", why: "Update artifacts." }],
60
80
  parse: (raw) => ({ taskId: String(raw.args["task-id"]) }),
@@ -110,6 +130,80 @@ export const prNoteSpec = {
110
130
  body: String(raw.opts.body),
111
131
  }),
112
132
  };
133
+ export const prCloseSpec = {
134
+ id: ["pr", "close"],
135
+ group: "PR",
136
+ summary: "Close a GitHub PR through REST with optional remote head-branch deletion.",
137
+ args: [{ name: "pr-number", required: true, valueHint: "<pr-number>" }],
138
+ options: [
139
+ {
140
+ kind: "string",
141
+ name: "repo",
142
+ valueHint: "<owner/name>",
143
+ description: "Optional. GitHub owner/repo override (defaults to origin remote).",
144
+ },
145
+ {
146
+ kind: "string",
147
+ name: "comment",
148
+ valueHint: "<text>",
149
+ description: "Optional. Add a close comment before closing the PR.",
150
+ },
151
+ {
152
+ kind: "boolean",
153
+ name: "delete-remote-branch",
154
+ default: false,
155
+ description: "Delete the remote head branch after a successful close when it belongs to the target repo.",
156
+ },
157
+ ],
158
+ examples: [
159
+ {
160
+ cmd: 'agentplane pr close 123 --comment "Superseded by #456" --delete-remote-branch',
161
+ why: "Close a stale PR and remove its remote head branch when it belongs to the same repo.",
162
+ },
163
+ ],
164
+ validateRaw: (raw) => {
165
+ const prNumber = Number.parseInt(String(raw.args["pr-number"] ?? ""), 10);
166
+ if (!Number.isInteger(prNumber) || prNumber <= 0) {
167
+ throw usageError({ spec: prCloseSpec, message: "Invalid value for <pr-number>." });
168
+ }
169
+ if (typeof raw.opts.repo === "string" && raw.opts.repo.trim() === "") {
170
+ throw usageError({ spec: prCloseSpec, message: "Invalid value for --repo: empty." });
171
+ }
172
+ if (typeof raw.opts.comment === "string" && raw.opts.comment.trim() === "") {
173
+ throw usageError({ spec: prCloseSpec, message: "Invalid value for --comment: empty." });
174
+ }
175
+ },
176
+ parse: (raw) => ({
177
+ prNumber: Number.parseInt(String(raw.args["pr-number"]), 10),
178
+ repo: typeof raw.opts.repo === "string" ? raw.opts.repo : undefined,
179
+ comment: typeof raw.opts.comment === "string" ? raw.opts.comment : undefined,
180
+ deleteRemoteBranch: raw.opts["delete-remote-branch"] === true,
181
+ }),
182
+ };
183
+ export const prCloseSupersededSpec = {
184
+ id: ["pr", "close-superseded"],
185
+ group: "PR",
186
+ summary: "Close a superseded task PR using task artifacts.",
187
+ args: [{ name: "task-id", required: true, valueHint: "<task-id>" }],
188
+ options: [
189
+ {
190
+ kind: "boolean",
191
+ name: "delete-remote-branch",
192
+ default: false,
193
+ description: "Delete the remote head branch after a successful close when it belongs to the task repo.",
194
+ },
195
+ ],
196
+ examples: [
197
+ {
198
+ cmd: "agentplane pr close-superseded 202604072308-A1XE27 --delete-remote-branch",
199
+ why: "Repair a stale task PR after the task has already been merged to main.",
200
+ },
201
+ ],
202
+ parse: (raw) => ({
203
+ taskId: String(raw.args["task-id"]),
204
+ deleteRemoteBranch: raw.opts["delete-remote-branch"] === true,
205
+ }),
206
+ };
113
207
  async function runPrRootGroup(_ctx, p) {
114
208
  throwGroupCommandUsage({
115
209
  spec: prSpec,
@@ -130,6 +224,7 @@ export function makeRunPrOpenHandler(getCtx) {
130
224
  taskId: p.taskId,
131
225
  author: p.author,
132
226
  branch: p.branch ?? undefined,
227
+ syncOnly: p.syncOnly,
133
228
  });
134
229
  };
135
230
  }
@@ -165,3 +260,27 @@ export function makeRunPrNoteHandler(getCtx) {
165
260
  });
166
261
  };
167
262
  }
263
+ export function makeRunPrCloseHandler(getCtx) {
264
+ return async (ctx, p) => {
265
+ return await cmdPrClose({
266
+ ctx: await getCtx("pr close"),
267
+ cwd: ctx.cwd,
268
+ rootOverride: ctx.rootOverride,
269
+ prNumber: p.prNumber,
270
+ repo: p.repo,
271
+ comment: p.comment,
272
+ deleteRemoteBranch: p.deleteRemoteBranch,
273
+ });
274
+ };
275
+ }
276
+ export function makeRunPrCloseSupersededHandler(getCtx) {
277
+ return async (ctx, p) => {
278
+ return await cmdPrCloseSuperseded({
279
+ ctx: await getCtx("pr close-superseded"),
280
+ cwd: ctx.cwd,
281
+ rootOverride: ctx.rootOverride,
282
+ taskId: p.taskId,
283
+ deleteRemoteBranch: p.deleteRemoteBranch,
284
+ });
285
+ };
286
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/pr/update.ts"],"names":[],"mappings":"AAaA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AASnC,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwFlB"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/pr/update.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAmEnC,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BlB"}
@@ -1,92 +1,76 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { resolveBaseBranch } from "@agentplaneorg/core";
4
3
  import { mapBackendError } from "../../cli/error-map.js";
5
- import { fileExists } from "../../cli/fs-utils.js";
6
- import { createCliEmitter, workflowModeMessage } from "../../cli/output.js";
4
+ import { createCliEmitter } from "../../cli/output.js";
7
5
  import { CliError } from "../../shared/errors.js";
8
- import { writeJsonStableIfChanged, writeTextIfChanged } from "../../shared/write-if-changed.js";
9
- import { execFileAsync, gitEnv } from "../shared/git.js";
10
- import { gitCurrentBranch } from "../shared/git-ops.js";
11
- import { buildUpdatedPrMeta, parsePrMeta } from "../shared/pr-meta.js";
6
+ import { gitRevParse } from "../shared/git-ops.js";
12
7
  import { loadBackendTask, loadCommandContext, } from "../shared/task-backend.js";
13
- import { resolvePrPaths } from "./internal/pr-paths.js";
14
- import { updateAutoSummaryBlock } from "./internal/review-template.js";
15
- function nowIso() {
16
- return new Date().toISOString();
8
+ import { assessPrArtifactFreshness } from "./internal/freshness.js";
9
+ import { syncPrArtifacts } from "./internal/sync.js";
10
+ async function readTextIfExists(filePath) {
11
+ try {
12
+ return await readFile(filePath, "utf8");
13
+ }
14
+ catch (err) {
15
+ const code = err?.code;
16
+ if (code === "ENOENT")
17
+ return null;
18
+ throw err;
19
+ }
20
+ }
21
+ async function warnOnStaleVerifyAfterUpdate(opts) {
22
+ const branch = opts.meta.branch?.trim() ?? "";
23
+ if (!branch)
24
+ return;
25
+ const ctx = opts.ctx ??
26
+ (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
27
+ const { config, task } = await loadBackendTask({
28
+ ctx,
29
+ cwd: opts.cwd,
30
+ rootOverride: opts.rootOverride,
31
+ taskId: opts.taskId,
32
+ });
33
+ const requiresVerify = Boolean(task.verify && task.verify.length > 0);
34
+ if (!requiresVerify)
35
+ return;
36
+ const branchHeadSha = await gitRevParse(opts.resolved.gitRoot, [`${branch}^{commit}`]);
37
+ const verifyLogText = await readTextIfExists(path.join(opts.prDir, "verify.log"));
38
+ const freshness = await assessPrArtifactFreshness({
39
+ gitRoot: opts.resolved.gitRoot,
40
+ workflowDir: path.join(opts.resolved.gitRoot, config.paths.workflow_dir),
41
+ taskId: opts.taskId,
42
+ branchHeadSha,
43
+ metaHeadSha: opts.meta.head_sha ?? null,
44
+ metaLastVerifiedSha: opts.meta.last_verified_sha ?? null,
45
+ metaVerifyStatus: opts.meta.verify?.status ?? null,
46
+ taskVerificationState: task.verification?.state ?? null,
47
+ verifyLogText,
48
+ requiresVerify,
49
+ });
50
+ if (opts.meta.last_verified_sha && !freshness.verifyFresh) {
51
+ opts.output.warn(`Verify state stale: last_verified_sha=${opts.meta.last_verified_sha} current_head=${branchHeadSha}; run \`agentplane verify ${opts.taskId} --ok --by <ROLE> --note "Verified: ..."\` before integrating`);
52
+ }
17
53
  }
18
54
  export async function cmdPrUpdate(opts) {
19
55
  try {
20
56
  const output = createCliEmitter();
21
- const ctx = opts.ctx ??
22
- (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
23
- await loadBackendTask({
24
- ctx,
57
+ const { meta, prDir, resolved } = await syncPrArtifacts({
58
+ ctx: opts.ctx,
25
59
  cwd: opts.cwd,
26
60
  rootOverride: opts.rootOverride,
27
61
  taskId: opts.taskId,
62
+ mode: "update",
28
63
  });
29
- const { resolved, config, prDir, metaPath, diffstatPath, reviewPath } = await resolvePrPaths({
30
- ...opts,
31
- ctx,
32
- });
33
- if (config.workflow_mode !== "branch_pr") {
34
- throw new CliError({
35
- exitCode: 2,
36
- code: "E_USAGE",
37
- message: workflowModeMessage(config.workflow_mode, "branch_pr"),
38
- });
39
- }
40
- if (!(await fileExists(metaPath)) || !(await fileExists(reviewPath))) {
41
- const missing = [];
42
- if (!(await fileExists(metaPath)))
43
- missing.push(path.relative(resolved.gitRoot, metaPath));
44
- if (!(await fileExists(reviewPath)))
45
- missing.push(path.relative(resolved.gitRoot, reviewPath));
46
- throw new CliError({
47
- exitCode: 3,
48
- code: "E_VALIDATION",
49
- message: `PR artifacts missing: ${missing.join(", ")} (run \`agentplane pr open\`)`,
50
- });
51
- }
52
- const baseBranch = await resolveBaseBranch({
64
+ await warnOnStaleVerifyAfterUpdate({
65
+ output,
66
+ ctx: opts.ctx,
53
67
  cwd: opts.cwd,
54
- rootOverride: opts.rootOverride ?? null,
55
- cliBaseOpt: null,
56
- mode: config.workflow_mode,
57
- });
58
- if (!baseBranch) {
59
- throw new CliError({
60
- exitCode: 2,
61
- code: "E_USAGE",
62
- message: "Base branch could not be resolved (use `agentplane branch base set`).",
63
- });
64
- }
65
- const branch = await gitCurrentBranch(resolved.gitRoot);
66
- const { stdout: diffStatOut } = await execFileAsync("git", ["diff", "--stat", `${baseBranch}...HEAD`], { cwd: resolved.gitRoot, env: gitEnv() });
67
- const diffstat = diffStatOut.trimEnd();
68
- await writeTextIfChanged(diffstatPath, diffstat ? `${diffstat}\n` : "");
69
- const { stdout: headOut } = await execFileAsync("git", ["rev-parse", "HEAD"], {
70
- cwd: resolved.gitRoot,
71
- env: gitEnv(),
68
+ rootOverride: opts.rootOverride,
69
+ taskId: opts.taskId,
70
+ prDir,
71
+ resolved,
72
+ meta,
72
73
  });
73
- const headSha = headOut.trim();
74
- const summaryLines = [
75
- `- Updated: ${nowIso()}`,
76
- `- Branch: ${branch}`,
77
- `- Head: ${headSha.slice(0, 12)}`,
78
- "- Diffstat:",
79
- "```",
80
- diffstat || "No changes detected.",
81
- "```",
82
- ];
83
- const reviewText = await readFile(reviewPath, "utf8");
84
- const nextReview = updateAutoSummaryBlock(reviewText, summaryLines.join("\n"));
85
- await writeTextIfChanged(reviewPath, nextReview);
86
- const rawMeta = await readFile(metaPath, "utf8");
87
- const meta = parsePrMeta(rawMeta, opts.taskId);
88
- const nextMeta = buildUpdatedPrMeta({ meta, branch, at: nowIso() });
89
- await writeJsonStableIfChanged(metaPath, nextMeta);
90
74
  output.success("pr update", path.relative(resolved.gitRoot, prDir));
91
75
  return 0;
92
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cache-prune.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/cache-prune.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA6BzD,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,qBAAqB,CAAC;CAC9B,GAAG,OAAO,CAAC,MAAM,CAAC,CAkFlB"}
1
+ {"version":3,"file":"cache-prune.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/cache-prune.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA6BzD,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,qBAAqB,CAAC;CAC9B,GAAG,OAAO,CAAC,MAAM,CAAC,CA8FlB"}
@@ -1,9 +1,11 @@
1
1
  import { readdir, rm } from "node:fs/promises";
2
2
  import path from "node:path";
3
+ import { defaultConfig } from "@agentplaneorg/core";
3
4
  import { mapCoreError } from "../../../../cli/error-map.js";
4
5
  import { fileExists } from "../../../../cli/fs-utils.js";
5
6
  import { infoMessage, successMessage } from "../../../../cli/output.js";
6
7
  import { CliError } from "../../../../shared/errors.js";
8
+ import { ensureActionApproved } from "../../../shared/approval-requirements.js";
7
9
  import { readInstalledRecipesFile, writeInstalledRecipesFile } from "../installed-recipes.js";
8
10
  import { resolveGlobalRecipesDir, resolveInstalledRecipesPath } from "../paths.js";
9
11
  async function listRecipeCacheEntries(cacheDir) {
@@ -49,6 +51,12 @@ export async function cmdRecipeCachePruneParsed(opts) {
49
51
  process.stdout.write(`${infoMessage(`dry-run: would remove ${cacheEntries.length} cached recipes`)}\n`);
50
52
  return 0;
51
53
  }
54
+ await ensureActionApproved({
55
+ action: "dangerous_fs",
56
+ config: defaultConfig(),
57
+ yes: false,
58
+ reason: `recipes cache prune --all (${cacheEntries.length} cached recipes)`,
59
+ });
52
60
  await rm(cacheDir, { recursive: true, force: true });
53
61
  await writeInstalledRecipesFile(resolveInstalledRecipesPath(), {
54
62
  schema_version: 1,
@@ -72,6 +80,12 @@ export async function cmdRecipeCachePruneParsed(opts) {
72
80
  process.stdout.write(`${infoMessage(`dry-run: would remove ${prune.length} cached recipes`)}\n`);
73
81
  return 0;
74
82
  }
83
+ await ensureActionApproved({
84
+ action: "dangerous_fs",
85
+ config: defaultConfig(),
86
+ yes: false,
87
+ reason: `recipes cache prune (${prune.length} cached recipes)`,
88
+ });
75
89
  const recipeDirs = new Set();
76
90
  for (const entry of prune) {
77
91
  recipeDirs.add(path.dirname(entry.path));
@@ -37,7 +37,7 @@ export async function cmdRecipeInstall(opts) {
37
37
  const ensureApproved = async (reason) => {
38
38
  if (networkApproved)
39
39
  return;
40
- await ensureNetworkApproved({ config, yes: opts.yes, reason });
40
+ await ensureNetworkApproved({ action: "recipe_install", config, yes: opts.yes, reason });
41
41
  networkApproved = true;
42
42
  };
43
43
  const tempRoot = await mkdtemp(path.join(os.tmpdir(), "agentplane-recipe-"));
@@ -1 +1 @@
1
- {"version":3,"file":"list-remote.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/list-remote.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,qBAAqB,CAAC;CAC9B,GAAG,OAAO,CAAC,MAAM,CAAC,CAwClB"}
1
+ {"version":3,"file":"list-remote.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/list-remote.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,qBAAqB,CAAC;CAC9B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyClB"}
@@ -25,6 +25,7 @@ export async function cmdRecipeListRemoteParsed(opts) {
25
25
  });
26
26
  if (willFetchRemote) {
27
27
  await ensureNetworkApproved({
28
+ action: "recipe_list_remote",
28
29
  config,
29
30
  yes: flags.yes,
30
31
  reason: "recipes list-remote fetches the remote recipes index",
@@ -1 +1 @@
1
- {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/remove.ts"],"names":[],"mappings":"AAYA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBlB"}
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../../../src/commands/recipes/impl/commands/remove.ts"],"names":[],"mappings":"AAaA,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BlB"}
@@ -1,9 +1,10 @@
1
- import { resolveProject } from "@agentplaneorg/core";
1
+ import { loadConfig, resolveProject } from "@agentplaneorg/core";
2
2
  import { rm } from "node:fs/promises";
3
3
  import { mapCoreError } from "../../../../cli/error-map.js";
4
4
  import { exitCodeForError } from "../../../../cli/exit-codes.js";
5
5
  import { successMessage } from "../../../../cli/output.js";
6
6
  import { CliError } from "../../../../shared/errors.js";
7
+ import { ensureActionApproved } from "../../../shared/approval-requirements.js";
7
8
  import { readProjectInstalledRecipes } from "../project-installed-recipes.js";
8
9
  import { resolveProjectInstalledRecipeDir } from "../paths.js";
9
10
  export async function cmdRecipeRemoveParsed(opts) {
@@ -12,6 +13,7 @@ export async function cmdRecipeRemoveParsed(opts) {
12
13
  cwd: opts.cwd,
13
14
  rootOverride: opts.rootOverride ?? null,
14
15
  });
16
+ const loaded = await loadConfig(resolved.agentplaneDir);
15
17
  const installed = await readProjectInstalledRecipes(resolved);
16
18
  const entry = installed.recipes.find((recipe) => recipe.id === opts.id);
17
19
  if (!entry) {
@@ -22,6 +24,12 @@ export async function cmdRecipeRemoveParsed(opts) {
22
24
  });
23
25
  }
24
26
  const recipeDir = resolveProjectInstalledRecipeDir(resolved, entry.id);
27
+ await ensureActionApproved({
28
+ action: "dangerous_fs",
29
+ config: loaded.config,
30
+ yes: false,
31
+ reason: `recipes remove ${entry.id}@${entry.version}`,
32
+ });
25
33
  await rm(recipeDir, { recursive: true, force: true });
26
34
  process.stdout.write(`${successMessage("removed recipe", `${entry.id}@${entry.version}`)}\n`);
27
35
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"apply.command.d.ts","sourceRoot":"","sources":["../../../src/commands/release/apply.command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AA6B1E,OAAO,KAAK,EAAE,kBAAkB,EAA0C,MAAM,kBAAkB,CAAC;AA0NnG,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,kBAAkB,CAiF5D,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,kBAAkB,CAmF9D,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"apply.command.d.ts","sourceRoot":"","sources":["../../../src/commands/release/apply.command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AA8B1E,OAAO,KAAK,EAAE,kBAAkB,EAA0C,MAAM,kBAAkB,CAAC;AAkOnG,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,kBAAkB,CA0E5D,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,kBAAkB,CA2E9D,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}