agentplane 0.3.7 → 0.3.9

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 (619) hide show
  1. package/assets/AGENTS.md +11 -1
  2. package/assets/RUNNER.md +17 -0
  3. package/bin/agentplane.js +16 -7
  4. package/bin/framework-dev-contract.d.ts +6 -0
  5. package/bin/framework-dev-contract.js +13 -0
  6. package/bin/stale-dist-policy.js +6 -1
  7. package/dist/.build-manifest.json +692 -337
  8. package/dist/adapters/task-backend/task-backend-adapter.d.ts +3 -1
  9. package/dist/adapters/task-backend/task-backend-adapter.d.ts.map +1 -1
  10. package/dist/adapters/task-backend/task-backend-adapter.js +13 -0
  11. package/dist/backends/task-backend/local-backend-doc.d.ts +5 -0
  12. package/dist/backends/task-backend/local-backend-doc.d.ts.map +1 -0
  13. package/dist/backends/task-backend/local-backend-doc.js +98 -0
  14. package/dist/backends/task-backend/local-backend-read.d.ts +7 -0
  15. package/dist/backends/task-backend/local-backend-read.d.ts.map +1 -0
  16. package/dist/backends/task-backend/local-backend-read.js +186 -0
  17. package/dist/backends/task-backend/local-backend-state.d.ts +17 -0
  18. package/dist/backends/task-backend/local-backend-state.d.ts.map +1 -0
  19. package/dist/backends/task-backend/local-backend-state.js +50 -0
  20. package/dist/backends/task-backend/local-backend-write.d.ts +15 -0
  21. package/dist/backends/task-backend/local-backend-write.d.ts.map +1 -0
  22. package/dist/backends/task-backend/local-backend-write.js +254 -0
  23. package/dist/backends/task-backend/local-backend.d.ts +4 -2
  24. package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
  25. package/dist/backends/task-backend/local-backend.js +26 -403
  26. package/dist/backends/task-backend/redmine/backend-cache-doc.d.ts +40 -0
  27. package/dist/backends/task-backend/redmine/backend-cache-doc.d.ts.map +1 -0
  28. package/dist/backends/task-backend/redmine/backend-cache-doc.js +178 -0
  29. package/dist/backends/task-backend/redmine/backend-report.d.ts +10 -0
  30. package/dist/backends/task-backend/redmine/backend-report.d.ts.map +1 -0
  31. package/dist/backends/task-backend/redmine/backend-report.js +43 -0
  32. package/dist/backends/task-backend/redmine/backend-sync.d.ts +67 -0
  33. package/dist/backends/task-backend/redmine/backend-sync.d.ts.map +1 -0
  34. package/dist/backends/task-backend/redmine/backend-sync.js +367 -0
  35. package/dist/backends/task-backend/redmine/mapping.d.ts +2 -1
  36. package/dist/backends/task-backend/redmine/mapping.d.ts.map +1 -1
  37. package/dist/backends/task-backend/redmine/mapping.js +12 -2
  38. package/dist/backends/task-backend/redmine/parse.d.ts +2 -1
  39. package/dist/backends/task-backend/redmine/parse.d.ts.map +1 -1
  40. package/dist/backends/task-backend/redmine/parse.js +5 -3
  41. package/dist/backends/task-backend/redmine/state.d.ts +2 -0
  42. package/dist/backends/task-backend/redmine/state.d.ts.map +1 -1
  43. package/dist/backends/task-backend/redmine/state.js +15 -1
  44. package/dist/backends/task-backend/redmine-backend.d.ts +5 -2
  45. package/dist/backends/task-backend/redmine-backend.d.ts.map +1 -1
  46. package/dist/backends/task-backend/redmine-backend.js +88 -536
  47. package/dist/backends/task-backend/shared/constants.d.ts +2 -1
  48. package/dist/backends/task-backend/shared/constants.d.ts.map +1 -1
  49. package/dist/backends/task-backend/shared/doc.d.ts.map +1 -1
  50. package/dist/backends/task-backend/shared/doc.js +25 -39
  51. package/dist/backends/task-backend/shared/export.d.ts +2 -9
  52. package/dist/backends/task-backend/shared/export.d.ts.map +1 -1
  53. package/dist/backends/task-backend/shared/export.js +73 -8
  54. package/dist/backends/task-backend/shared/normalize.d.ts +5 -1
  55. package/dist/backends/task-backend/shared/normalize.d.ts.map +1 -1
  56. package/dist/backends/task-backend/shared/normalize.js +166 -0
  57. package/dist/backends/task-backend/shared/record.d.ts +1 -1
  58. package/dist/backends/task-backend/shared/record.d.ts.map +1 -1
  59. package/dist/backends/task-backend/shared/record.js +7 -2
  60. package/dist/backends/task-backend/shared/types.d.ts +38 -36
  61. package/dist/backends/task-backend/shared/types.d.ts.map +1 -1
  62. package/dist/backends/task-backend/shared.d.ts +2 -2
  63. package/dist/backends/task-backend/shared.d.ts.map +1 -1
  64. package/dist/backends/task-backend/shared.js +1 -1
  65. package/dist/backends/task-backend.d.ts +1 -1
  66. package/dist/backends/task-backend.d.ts.map +1 -1
  67. package/dist/backends/task-backend.js +1 -1
  68. package/dist/backends/task-index.d.ts +2 -2
  69. package/dist/backends/task-index.d.ts.map +1 -1
  70. package/dist/backends/task-index.js +9 -6
  71. package/dist/cli/bootstrap-guide.d.ts +2 -2
  72. package/dist/cli/bootstrap-guide.d.ts.map +1 -1
  73. package/dist/cli/bootstrap-guide.js +10 -10
  74. package/dist/cli/command-guide.d.ts.map +1 -1
  75. package/dist/cli/command-guide.js +11 -9
  76. package/dist/cli/command-invocations.d.ts +4 -0
  77. package/dist/cli/command-invocations.d.ts.map +1 -0
  78. package/dist/cli/command-invocations.js +35 -0
  79. package/dist/cli/command-snippets.d.ts +12 -8
  80. package/dist/cli/command-snippets.d.ts.map +1 -1
  81. package/dist/cli/command-snippets.js +14 -8
  82. package/dist/cli/exit-codes.d.ts.map +1 -1
  83. package/dist/cli/exit-codes.js +1 -0
  84. package/dist/cli/group-command.d.ts +18 -0
  85. package/dist/cli/group-command.d.ts.map +1 -0
  86. package/dist/cli/group-command.js +45 -0
  87. package/dist/cli/output.d.ts +29 -0
  88. package/dist/cli/output.d.ts.map +1 -1
  89. package/dist/cli/output.js +76 -0
  90. package/dist/cli/prompts.d.ts.map +1 -1
  91. package/dist/cli/prompts.js +5 -1
  92. package/dist/cli/run-cli/command-catalog/core.d.ts.map +1 -1
  93. package/dist/cli/run-cli/command-catalog/core.js +38 -29
  94. package/dist/cli/run-cli/command-catalog/lifecycle.d.ts.map +1 -1
  95. package/dist/cli/run-cli/command-catalog/lifecycle.js +9 -6
  96. package/dist/cli/run-cli/command-catalog/project.d.ts +1 -1
  97. package/dist/cli/run-cli/command-catalog/project.d.ts.map +1 -1
  98. package/dist/cli/run-cli/command-catalog/project.js +8 -6
  99. package/dist/cli/run-cli/command-catalog/shared.d.ts +12 -3
  100. package/dist/cli/run-cli/command-catalog/shared.d.ts.map +1 -1
  101. package/dist/cli/run-cli/command-catalog/shared.js +6 -3
  102. package/dist/cli/run-cli/command-catalog/task.d.ts +1 -1
  103. package/dist/cli/run-cli/command-catalog/task.d.ts.map +1 -1
  104. package/dist/cli/run-cli/command-catalog/task.js +46 -11
  105. package/dist/cli/run-cli/command-catalog.d.ts +11 -1
  106. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  107. package/dist/cli/run-cli/command-catalog.js +29 -0
  108. package/dist/cli/run-cli/commands/config.d.ts.map +1 -1
  109. package/dist/cli/run-cli/commands/config.js +52 -6
  110. package/dist/cli/run-cli/commands/core/agent-profiles.d.ts +34 -0
  111. package/dist/cli/run-cli/commands/core/agent-profiles.d.ts.map +1 -0
  112. package/dist/cli/run-cli/commands/core/agent-profiles.js +97 -0
  113. package/dist/cli/run-cli/commands/core/agents.d.ts +7 -0
  114. package/dist/cli/run-cli/commands/core/agents.d.ts.map +1 -0
  115. package/dist/cli/run-cli/commands/core/agents.js +97 -0
  116. package/dist/cli/run-cli/commands/core/preflight.d.ts +10 -0
  117. package/dist/cli/run-cli/commands/core/preflight.d.ts.map +1 -0
  118. package/dist/cli/run-cli/commands/core/preflight.js +286 -0
  119. package/dist/cli/run-cli/commands/core/quickstart.d.ts +8 -0
  120. package/dist/cli/run-cli/commands/core/quickstart.d.ts.map +1 -0
  121. package/dist/cli/run-cli/commands/core/quickstart.js +43 -0
  122. package/dist/cli/run-cli/commands/core/role.d.ts +9 -0
  123. package/dist/cli/run-cli/commands/core/role.d.ts.map +1 -0
  124. package/dist/cli/run-cli/commands/core/role.js +128 -0
  125. package/dist/cli/run-cli/commands/core.d.ts +4 -24
  126. package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
  127. package/dist/cli/run-cli/commands/core.js +4 -630
  128. package/dist/cli/run-cli/error-guidance.js +10 -0
  129. package/dist/cli/run-cli/globals.d.ts +5 -2
  130. package/dist/cli/run-cli/globals.d.ts.map +1 -1
  131. package/dist/cli/run-cli/globals.js +82 -86
  132. package/dist/cli/run-cli.d.ts.map +1 -1
  133. package/dist/cli/run-cli.js +137 -100
  134. package/dist/cli/run-cli.test-helpers.d.ts +21 -0
  135. package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
  136. package/dist/cli/run-cli.test-helpers.js +122 -12
  137. package/dist/cli/spec/help.d.ts +10 -2
  138. package/dist/cli/spec/help.d.ts.map +1 -1
  139. package/dist/cli/spec/help.js +7 -5
  140. package/dist/cli/spec/registry.d.ts +27 -1
  141. package/dist/cli/spec/registry.d.ts.map +1 -1
  142. package/dist/cli/spec/registry.js +98 -25
  143. package/dist/commands/backend/sync.command.d.ts +3 -5
  144. package/dist/commands/backend/sync.command.d.ts.map +1 -1
  145. package/dist/commands/backend/sync.command.js +9 -12
  146. package/dist/commands/backend.d.ts.map +1 -1
  147. package/dist/commands/backend.js +8 -7
  148. package/dist/commands/branch/base.command.d.ts +2 -3
  149. package/dist/commands/branch/base.command.d.ts.map +1 -1
  150. package/dist/commands/branch/base.command.js +8 -12
  151. package/dist/commands/branch/base.d.ts.map +1 -1
  152. package/dist/commands/branch/base.js +11 -7
  153. package/dist/commands/branch/cleanup-merged.d.ts.map +1 -1
  154. package/dist/commands/branch/cleanup-merged.js +9 -8
  155. package/dist/commands/branch/remove.d.ts.map +1 -1
  156. package/dist/commands/branch/remove.js +4 -3
  157. package/dist/commands/branch/status.d.ts.map +1 -1
  158. package/dist/commands/branch/status.js +4 -3
  159. package/dist/commands/branch/work-start.d.ts.map +1 -1
  160. package/dist/commands/branch/work-start.js +48 -5
  161. package/dist/commands/cleanup/merged.command.d.ts +2 -3
  162. package/dist/commands/cleanup/merged.command.d.ts.map +1 -1
  163. package/dist/commands/cleanup/merged.command.js +8 -12
  164. package/dist/commands/docs/cli.command.js +2 -2
  165. package/dist/commands/doctor/runtime.js +1 -1
  166. package/dist/commands/doctor/workflow.d.ts.map +1 -1
  167. package/dist/commands/doctor/workflow.js +10 -1
  168. package/dist/commands/finish.spec.d.ts.map +1 -1
  169. package/dist/commands/finish.spec.js +7 -0
  170. package/dist/commands/guard/guard.command.d.ts +3 -3
  171. package/dist/commands/guard/guard.command.d.ts.map +1 -1
  172. package/dist/commands/guard/guard.command.js +9 -14
  173. package/dist/commands/guard/impl/commands.d.ts +2 -0
  174. package/dist/commands/guard/impl/commands.d.ts.map +1 -1
  175. package/dist/commands/guard/impl/commands.js +55 -7
  176. package/dist/commands/guard/impl/policy.d.ts +1 -0
  177. package/dist/commands/guard/impl/policy.d.ts.map +1 -1
  178. package/dist/commands/guard/impl/policy.js +9 -6
  179. package/dist/commands/hooks/hooks.command.d.ts +3 -3
  180. package/dist/commands/hooks/hooks.command.d.ts.map +1 -1
  181. package/dist/commands/hooks/hooks.command.js +9 -11
  182. package/dist/commands/hooks/index.d.ts.map +1 -1
  183. package/dist/commands/hooks/index.js +8 -4
  184. package/dist/commands/pr/check.d.ts.map +1 -1
  185. package/dist/commands/pr/check.js +90 -18
  186. package/dist/commands/pr/integrate/cmd.d.ts.map +1 -1
  187. package/dist/commands/pr/integrate/cmd.js +31 -3
  188. package/dist/commands/pr/integrate/internal/cleanup.d.ts +12 -0
  189. package/dist/commands/pr/integrate/internal/cleanup.d.ts.map +1 -0
  190. package/dist/commands/pr/integrate/internal/cleanup.js +46 -0
  191. package/dist/commands/pr/integrate/internal/finalize.d.ts +4 -0
  192. package/dist/commands/pr/integrate/internal/finalize.d.ts.map +1 -1
  193. package/dist/commands/pr/integrate/internal/finalize.js +34 -40
  194. package/dist/commands/pr/integrate/internal/merge.d.ts +6 -0
  195. package/dist/commands/pr/integrate/internal/merge.d.ts.map +1 -1
  196. package/dist/commands/pr/integrate/internal/merge.js +92 -0
  197. package/dist/commands/pr/integrate/internal/prepare.d.ts +1 -0
  198. package/dist/commands/pr/integrate/internal/prepare.d.ts.map +1 -1
  199. package/dist/commands/pr/integrate/internal/prepare.js +1 -0
  200. package/dist/commands/pr/integrate/verify.d.ts.map +1 -1
  201. package/dist/commands/pr/integrate/verify.js +4 -3
  202. package/dist/commands/pr/note.d.ts.map +1 -1
  203. package/dist/commands/pr/note.js +3 -2
  204. package/dist/commands/pr/open.d.ts.map +1 -1
  205. package/dist/commands/pr/open.js +9 -12
  206. package/dist/commands/pr/pr.command.d.ts +3 -4
  207. package/dist/commands/pr/pr.command.d.ts.map +1 -1
  208. package/dist/commands/pr/pr.command.js +6 -11
  209. package/dist/commands/pr/update.d.ts.map +1 -1
  210. package/dist/commands/pr/update.js +5 -10
  211. package/dist/commands/recipes/cache.command.d.ts +3 -4
  212. package/dist/commands/recipes/cache.command.d.ts.map +1 -1
  213. package/dist/commands/recipes/cache.command.js +8 -26
  214. package/dist/commands/recipes/impl/apply.js +1 -1
  215. package/dist/commands/recipes/impl/commands/explain.js +1 -1
  216. package/dist/commands/recipes/impl/installed-recipes.d.ts.map +1 -1
  217. package/dist/commands/recipes/impl/installed-recipes.js +1 -1
  218. package/dist/commands/recipes/impl/manifest.d.ts.map +1 -1
  219. package/dist/commands/recipes/impl/manifest.js +0 -10
  220. package/dist/commands/recipes/impl/project-installed-recipes.d.ts.map +1 -1
  221. package/dist/commands/recipes/impl/project-installed-recipes.js +1 -1
  222. package/dist/commands/recipes/impl/resolver.d.ts +1 -1
  223. package/dist/commands/recipes/impl/resolver.d.ts.map +1 -1
  224. package/dist/commands/recipes/impl/resolver.js +26 -16
  225. package/dist/commands/recipes/impl/scenario.d.ts.map +1 -1
  226. package/dist/commands/recipes/impl/scenario.js +80 -0
  227. package/dist/commands/recipes/impl/types.d.ts +27 -13
  228. package/dist/commands/recipes/impl/types.d.ts.map +1 -1
  229. package/dist/commands/recipes/recipes.command.d.ts +3 -4
  230. package/dist/commands/recipes/recipes.command.d.ts.map +1 -1
  231. package/dist/commands/recipes/recipes.command.js +8 -34
  232. package/dist/commands/recipes.d.ts.map +1 -1
  233. package/dist/commands/recipes.test-helpers.d.ts +17 -0
  234. package/dist/commands/recipes.test-helpers.d.ts.map +1 -1
  235. package/dist/commands/recipes.test-helpers.js +56 -2
  236. package/dist/commands/release/apply.command.d.ts.map +1 -1
  237. package/dist/commands/release/apply.command.js +77 -56
  238. package/dist/commands/release/plan.command.d.ts.map +1 -1
  239. package/dist/commands/release/plan.command.js +7 -3
  240. package/dist/commands/release/release.command.d.ts +3 -3
  241. package/dist/commands/release/release.command.d.ts.map +1 -1
  242. package/dist/commands/release/release.command.js +9 -11
  243. package/dist/commands/release.test-helpers.d.ts +34 -0
  244. package/dist/commands/release.test-helpers.d.ts.map +1 -0
  245. package/dist/commands/release.test-helpers.js +48 -0
  246. package/dist/commands/runtime.command.d.ts +7 -7
  247. package/dist/commands/runtime.command.d.ts.map +1 -1
  248. package/dist/commands/runtime.command.js +29 -33
  249. package/dist/commands/scenario/execute.command.d.ts +8 -0
  250. package/dist/commands/scenario/execute.command.d.ts.map +1 -0
  251. package/dist/commands/scenario/execute.command.js +117 -0
  252. package/dist/commands/scenario/impl/commands.d.ts.map +1 -1
  253. package/dist/commands/scenario/impl/commands.js +45 -32
  254. package/dist/commands/scenario/run.command.js +2 -2
  255. package/dist/commands/scenario/scenario.command.d.ts +3 -4
  256. package/dist/commands/scenario/scenario.command.d.ts.map +1 -1
  257. package/dist/commands/scenario/scenario.command.js +8 -26
  258. package/dist/commands/shared/git-context.d.ts +1 -0
  259. package/dist/commands/shared/git-context.d.ts.map +1 -1
  260. package/dist/commands/shared/git-context.js +4 -2
  261. package/dist/commands/shared/git-ops.d.ts +1 -0
  262. package/dist/commands/shared/git-ops.d.ts.map +1 -1
  263. package/dist/commands/shared/git-ops.js +13 -0
  264. package/dist/commands/shared/operator-pipeline.d.ts +10 -0
  265. package/dist/commands/shared/operator-pipeline.d.ts.map +1 -0
  266. package/dist/commands/shared/operator-pipeline.js +16 -0
  267. package/dist/commands/shared/pr-meta.d.ts +32 -12
  268. package/dist/commands/shared/pr-meta.d.ts.map +1 -1
  269. package/dist/commands/shared/pr-meta.js +49 -14
  270. package/dist/commands/shared/reconcile-check.d.ts.map +1 -1
  271. package/dist/commands/shared/reconcile-check.js +28 -3
  272. package/dist/commands/shared/task-backend.d.ts +10 -6
  273. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  274. package/dist/commands/shared/task-backend.js +99 -25
  275. package/dist/commands/shared/task-handoff.d.ts +64 -0
  276. package/dist/commands/shared/task-handoff.d.ts.map +1 -0
  277. package/dist/commands/shared/task-handoff.js +151 -0
  278. package/dist/commands/shared/task-mutation.d.ts +36 -0
  279. package/dist/commands/shared/task-mutation.d.ts.map +1 -0
  280. package/dist/commands/shared/task-mutation.js +67 -0
  281. package/dist/commands/shared/task-store.d.ts +5 -1
  282. package/dist/commands/shared/task-store.d.ts.map +1 -1
  283. package/dist/commands/shared/task-store.js +72 -92
  284. package/dist/commands/task/add.d.ts.map +1 -1
  285. package/dist/commands/task/add.js +41 -39
  286. package/dist/commands/task/block.d.ts.map +1 -1
  287. package/dist/commands/task/block.js +31 -110
  288. package/dist/commands/task/close-duplicate.d.ts.map +1 -1
  289. package/dist/commands/task/close-duplicate.js +0 -7
  290. package/dist/commands/task/close-noop.d.ts.map +1 -1
  291. package/dist/commands/task/close-noop.js +0 -21
  292. package/dist/commands/task/close-shared.d.ts +0 -2
  293. package/dist/commands/task/close-shared.d.ts.map +1 -1
  294. package/dist/commands/task/close-shared.js +25 -55
  295. package/dist/commands/task/comment.d.ts.map +1 -1
  296. package/dist/commands/task/comment.js +48 -37
  297. package/dist/commands/task/derive.d.ts.map +1 -1
  298. package/dist/commands/task/derive.js +14 -7
  299. package/dist/commands/task/doc.command.d.ts.map +1 -1
  300. package/dist/commands/task/doc.command.js +7 -6
  301. package/dist/commands/task/doc.d.ts.map +1 -1
  302. package/dist/commands/task/doc.js +58 -62
  303. package/dist/commands/task/finish-shared.d.ts +60 -0
  304. package/dist/commands/task/finish-shared.d.ts.map +1 -0
  305. package/dist/commands/task/finish-shared.js +181 -0
  306. package/dist/commands/task/finish.d.ts +1 -0
  307. package/dist/commands/task/finish.d.ts.map +1 -1
  308. package/dist/commands/task/finish.js +79 -210
  309. package/dist/commands/task/handoff-record.command.d.ts +17 -0
  310. package/dist/commands/task/handoff-record.command.d.ts.map +1 -0
  311. package/dist/commands/task/handoff-record.command.js +140 -0
  312. package/dist/commands/task/handoff-show.command.d.ts +8 -0
  313. package/dist/commands/task/handoff-show.command.d.ts.map +1 -0
  314. package/dist/commands/task/handoff-show.command.js +77 -0
  315. package/dist/commands/task/handoff.command.d.ts +7 -0
  316. package/dist/commands/task/handoff.command.d.ts.map +1 -0
  317. package/dist/commands/task/handoff.command.js +21 -0
  318. package/dist/commands/task/handoff.shared.d.ts +39 -0
  319. package/dist/commands/task/handoff.shared.d.ts.map +1 -0
  320. package/dist/commands/task/handoff.shared.js +134 -0
  321. package/dist/commands/task/hosted-close.command.d.ts +9 -0
  322. package/dist/commands/task/hosted-close.command.d.ts.map +1 -0
  323. package/dist/commands/task/hosted-close.command.js +190 -0
  324. package/dist/commands/task/hosted-merge-sync.d.ts +40 -0
  325. package/dist/commands/task/hosted-merge-sync.d.ts.map +1 -0
  326. package/dist/commands/task/hosted-merge-sync.js +277 -0
  327. package/dist/commands/task/list.d.ts.map +1 -1
  328. package/dist/commands/task/list.js +7 -24
  329. package/dist/commands/task/new.d.ts.map +1 -1
  330. package/dist/commands/task/new.js +26 -6
  331. package/dist/commands/task/next.d.ts.map +1 -1
  332. package/dist/commands/task/next.js +10 -28
  333. package/dist/commands/task/normalize.command.d.ts +1 -0
  334. package/dist/commands/task/normalize.command.d.ts.map +1 -1
  335. package/dist/commands/task/normalize.command.js +12 -0
  336. package/dist/commands/task/normalize.d.ts +1 -0
  337. package/dist/commands/task/normalize.d.ts.map +1 -1
  338. package/dist/commands/task/normalize.js +21 -9
  339. package/dist/commands/task/plan.command.d.ts +3 -4
  340. package/dist/commands/task/plan.command.d.ts.map +1 -1
  341. package/dist/commands/task/plan.command.js +6 -12
  342. package/dist/commands/task/plan.d.ts.map +1 -1
  343. package/dist/commands/task/plan.js +96 -103
  344. package/dist/commands/task/reclaim.command.d.ts +11 -0
  345. package/dist/commands/task/reclaim.command.d.ts.map +1 -0
  346. package/dist/commands/task/reclaim.command.js +102 -0
  347. package/dist/commands/task/resume-context.command.d.ts +9 -0
  348. package/dist/commands/task/resume-context.command.d.ts.map +1 -0
  349. package/dist/commands/task/resume-context.command.js +60 -0
  350. package/dist/commands/task/run-cancel.command.d.ts +6 -0
  351. package/dist/commands/task/run-cancel.command.d.ts.map +1 -0
  352. package/dist/commands/task/run-cancel.command.js +45 -0
  353. package/dist/commands/task/run-cancel.spec.d.ts +7 -0
  354. package/dist/commands/task/run-cancel.spec.d.ts.map +1 -0
  355. package/dist/commands/task/run-cancel.spec.js +20 -0
  356. package/dist/commands/task/run-resume.command.d.ts +6 -0
  357. package/dist/commands/task/run-resume.command.d.ts.map +1 -0
  358. package/dist/commands/task/run-resume.command.js +55 -0
  359. package/dist/commands/task/run-resume.spec.d.ts +7 -0
  360. package/dist/commands/task/run-resume.spec.d.ts.map +1 -0
  361. package/dist/commands/task/run-resume.spec.js +20 -0
  362. package/dist/commands/task/run-retry.command.d.ts +6 -0
  363. package/dist/commands/task/run-retry.command.d.ts.map +1 -0
  364. package/dist/commands/task/run-retry.command.js +56 -0
  365. package/dist/commands/task/run-retry.spec.d.ts +7 -0
  366. package/dist/commands/task/run-retry.spec.d.ts.map +1 -0
  367. package/dist/commands/task/run-retry.spec.js +20 -0
  368. package/dist/commands/task/run-show.command.d.ts +6 -0
  369. package/dist/commands/task/run-show.command.d.ts.map +1 -0
  370. package/dist/commands/task/run-show.command.js +133 -0
  371. package/dist/commands/task/run-show.spec.d.ts +8 -0
  372. package/dist/commands/task/run-show.spec.d.ts.map +1 -0
  373. package/dist/commands/task/run-show.spec.js +44 -0
  374. package/dist/commands/task/run-tail.command.d.ts +6 -0
  375. package/dist/commands/task/run-tail.command.d.ts.map +1 -0
  376. package/dist/commands/task/run-tail.command.js +26 -0
  377. package/dist/commands/task/run-tail.spec.d.ts +8 -0
  378. package/dist/commands/task/run-tail.spec.d.ts.map +1 -0
  379. package/dist/commands/task/run-tail.spec.js +51 -0
  380. package/dist/commands/task/run-trace.command.d.ts +6 -0
  381. package/dist/commands/task/run-trace.command.d.ts.map +1 -0
  382. package/dist/commands/task/run-trace.command.js +25 -0
  383. package/dist/commands/task/run-trace.spec.d.ts +7 -0
  384. package/dist/commands/task/run-trace.spec.d.ts.map +1 -0
  385. package/dist/commands/task/run-trace.spec.js +31 -0
  386. package/dist/commands/task/run.command.d.ts +6 -0
  387. package/dist/commands/task/run.command.d.ts.map +1 -0
  388. package/dist/commands/task/run.command.js +74 -0
  389. package/dist/commands/task/run.spec.d.ts +7 -0
  390. package/dist/commands/task/run.spec.d.ts.map +1 -0
  391. package/dist/commands/task/run.spec.js +26 -0
  392. package/dist/commands/task/scaffold.d.ts.map +1 -1
  393. package/dist/commands/task/scaffold.js +4 -2
  394. package/dist/commands/task/scrub.d.ts.map +1 -1
  395. package/dist/commands/task/scrub.js +27 -24
  396. package/dist/commands/task/search.d.ts.map +1 -1
  397. package/dist/commands/task/search.js +21 -31
  398. package/dist/commands/task/set-status.d.ts.map +1 -1
  399. package/dist/commands/task/set-status.js +36 -152
  400. package/dist/commands/task/shared/dependencies.d.ts +4 -4
  401. package/dist/commands/task/shared/dependencies.d.ts.map +1 -1
  402. package/dist/commands/task/shared/dependencies.js +10 -2
  403. package/dist/commands/task/shared/docs.d.ts +6 -1
  404. package/dist/commands/task/shared/docs.d.ts.map +1 -1
  405. package/dist/commands/task/shared/docs.js +13 -0
  406. package/dist/commands/task/shared/listing.d.ts +16 -2
  407. package/dist/commands/task/shared/listing.d.ts.map +1 -1
  408. package/dist/commands/task/shared/listing.js +56 -0
  409. package/dist/commands/task/shared/transition-command.d.ts +15 -0
  410. package/dist/commands/task/shared/transition-command.d.ts.map +1 -0
  411. package/dist/commands/task/shared/transition-command.js +43 -0
  412. package/dist/commands/task/shared/transitions.d.ts +39 -0
  413. package/dist/commands/task/shared/transitions.d.ts.map +1 -1
  414. package/dist/commands/task/shared/transitions.js +62 -1
  415. package/dist/commands/task/shared/workflow-transition-service.d.ts +75 -0
  416. package/dist/commands/task/shared/workflow-transition-service.d.ts.map +1 -0
  417. package/dist/commands/task/shared/workflow-transition-service.js +226 -0
  418. package/dist/commands/task/shared.d.ts +5 -3
  419. package/dist/commands/task/shared.d.ts.map +1 -1
  420. package/dist/commands/task/shared.js +5 -3
  421. package/dist/commands/task/show.d.ts.map +1 -1
  422. package/dist/commands/task/show.js +37 -3
  423. package/dist/commands/task/start.d.ts.map +1 -1
  424. package/dist/commands/task/start.js +33 -119
  425. package/dist/commands/task/task.command.d.ts +3 -4
  426. package/dist/commands/task/task.command.d.ts.map +1 -1
  427. package/dist/commands/task/task.command.js +22 -37
  428. package/dist/commands/task/verify-record.d.ts.map +1 -1
  429. package/dist/commands/task/verify-record.js +16 -141
  430. package/dist/commands/task/verify.command.d.ts.map +1 -1
  431. package/dist/commands/task/verify.command.js +7 -6
  432. package/dist/commands/task.test-helpers.d.ts +13 -0
  433. package/dist/commands/task.test-helpers.d.ts.map +1 -0
  434. package/dist/commands/task.test-helpers.js +65 -0
  435. package/dist/commands/upgrade/materialize.d.ts +28 -0
  436. package/dist/commands/upgrade/materialize.d.ts.map +1 -0
  437. package/dist/commands/upgrade/materialize.js +154 -0
  438. package/dist/commands/upgrade/plan.d.ts +18 -0
  439. package/dist/commands/upgrade/plan.d.ts.map +1 -0
  440. package/dist/commands/upgrade/plan.js +219 -0
  441. package/dist/commands/upgrade/policy.d.ts +24 -0
  442. package/dist/commands/upgrade/policy.d.ts.map +1 -0
  443. package/dist/commands/upgrade/policy.js +182 -0
  444. package/dist/commands/upgrade/report.d.ts.map +1 -1
  445. package/dist/commands/upgrade/report.js +7 -5
  446. package/dist/commands/upgrade.d.ts.map +1 -1
  447. package/dist/commands/upgrade.js +154 -642
  448. package/dist/commands/workflow.command.d.ts +3 -4
  449. package/dist/commands/workflow.command.d.ts.map +1 -1
  450. package/dist/commands/workflow.command.js +8 -25
  451. package/dist/ports/task-backend-port.d.ts +3 -1
  452. package/dist/ports/task-backend-port.d.ts.map +1 -1
  453. package/dist/runner/adapters/codex.d.ts +9 -0
  454. package/dist/runner/adapters/codex.d.ts.map +1 -0
  455. package/dist/runner/adapters/codex.js +414 -0
  456. package/dist/runner/adapters/custom.d.ts +12 -0
  457. package/dist/runner/adapters/custom.d.ts.map +1 -0
  458. package/dist/runner/adapters/custom.js +512 -0
  459. package/dist/runner/adapters/index.d.ts +8 -0
  460. package/dist/runner/adapters/index.d.ts.map +1 -0
  461. package/dist/runner/adapters/index.js +15 -0
  462. package/dist/runner/adapters/recipe-run-profile.d.ts +8 -0
  463. package/dist/runner/adapters/recipe-run-profile.d.ts.map +1 -0
  464. package/dist/runner/adapters/recipe-run-profile.js +53 -0
  465. package/dist/runner/adapters/shared.d.ts +45 -0
  466. package/dist/runner/adapters/shared.d.ts.map +1 -0
  467. package/dist/runner/adapters/shared.js +58 -0
  468. package/dist/runner/artifacts.d.ts +31 -0
  469. package/dist/runner/artifacts.d.ts.map +1 -0
  470. package/dist/runner/artifacts.js +153 -0
  471. package/dist/runner/codex-approval-probe.d.ts +23 -0
  472. package/dist/runner/codex-approval-probe.d.ts.map +1 -0
  473. package/dist/runner/codex-approval-probe.js +55 -0
  474. package/dist/runner/codex-smoke.d.ts +11 -0
  475. package/dist/runner/codex-smoke.d.ts.map +1 -0
  476. package/dist/runner/codex-smoke.js +45 -0
  477. package/dist/runner/config.d.ts +6 -0
  478. package/dist/runner/config.d.ts.map +1 -0
  479. package/dist/runner/config.js +15 -0
  480. package/dist/runner/context/base-prompts.d.ts +10 -0
  481. package/dist/runner/context/base-prompts.d.ts.map +1 -0
  482. package/dist/runner/context/base-prompts.js +255 -0
  483. package/dist/runner/context/recipe-context.d.ts +17 -0
  484. package/dist/runner/context/recipe-context.d.ts.map +1 -0
  485. package/dist/runner/context/recipe-context.js +48 -0
  486. package/dist/runner/context/task-context.d.ts +24 -0
  487. package/dist/runner/context/task-context.d.ts.map +1 -0
  488. package/dist/runner/context/task-context.js +266 -0
  489. package/dist/runner/index.d.ts +12 -0
  490. package/dist/runner/index.d.ts.map +1 -0
  491. package/dist/runner/index.js +11 -0
  492. package/dist/runner/policy-decision.d.ts +12 -0
  493. package/dist/runner/policy-decision.d.ts.map +1 -0
  494. package/dist/runner/policy-decision.js +89 -0
  495. package/dist/runner/policy-display.d.ts +4 -0
  496. package/dist/runner/policy-display.d.ts.map +1 -0
  497. package/dist/runner/policy-display.js +41 -0
  498. package/dist/runner/process-supervision.d.ts +48 -0
  499. package/dist/runner/process-supervision.d.ts.map +1 -0
  500. package/dist/runner/process-supervision.js +490 -0
  501. package/dist/runner/result-manifest-policy.d.ts +9 -0
  502. package/dist/runner/result-manifest-policy.d.ts.map +1 -0
  503. package/dist/runner/result-manifest-policy.js +96 -0
  504. package/dist/runner/result-manifest.d.ts +30 -0
  505. package/dist/runner/result-manifest.d.ts.map +1 -0
  506. package/dist/runner/result-manifest.js +322 -0
  507. package/dist/runner/run-id.d.ts +2 -0
  508. package/dist/runner/run-id.d.ts.map +1 -0
  509. package/dist/runner/run-id.js +3 -0
  510. package/dist/runner/run-repository.d.ts +51 -0
  511. package/dist/runner/run-repository.d.ts.map +1 -0
  512. package/dist/runner/run-repository.js +222 -0
  513. package/dist/runner/task-run-paths.d.ts +19 -0
  514. package/dist/runner/task-run-paths.d.ts.map +1 -0
  515. package/dist/runner/task-run-paths.js +25 -0
  516. package/dist/runner/task-state.d.ts +9 -0
  517. package/dist/runner/task-state.d.ts.map +1 -0
  518. package/dist/runner/task-state.js +354 -0
  519. package/dist/runner/test-helpers.d.ts +30 -0
  520. package/dist/runner/test-helpers.d.ts.map +1 -0
  521. package/dist/runner/test-helpers.js +97 -0
  522. package/dist/runner/trace-artifacts.d.ts +14 -0
  523. package/dist/runner/trace-artifacts.d.ts.map +1 -0
  524. package/dist/runner/trace-artifacts.js +80 -0
  525. package/dist/runner/trace.d.ts +10 -0
  526. package/dist/runner/trace.d.ts.map +1 -0
  527. package/dist/runner/trace.js +37 -0
  528. package/dist/runner/types.d.ts +317 -0
  529. package/dist/runner/types.d.ts.map +1 -0
  530. package/dist/runner/types.js +3 -0
  531. package/dist/runner/usecases/scenario-materialize-task.d.ts +29 -0
  532. package/dist/runner/usecases/scenario-materialize-task.d.ts.map +1 -0
  533. package/dist/runner/usecases/scenario-materialize-task.js +151 -0
  534. package/dist/runner/usecases/task-run-inspect.d.ts +41 -0
  535. package/dist/runner/usecases/task-run-inspect.d.ts.map +1 -0
  536. package/dist/runner/usecases/task-run-inspect.js +74 -0
  537. package/dist/runner/usecases/task-run-lifecycle-cancel.d.ts +10 -0
  538. package/dist/runner/usecases/task-run-lifecycle-cancel.d.ts.map +1 -0
  539. package/dist/runner/usecases/task-run-lifecycle-cancel.js +172 -0
  540. package/dist/runner/usecases/task-run-lifecycle-replay.d.ts +18 -0
  541. package/dist/runner/usecases/task-run-lifecycle-replay.d.ts.map +1 -0
  542. package/dist/runner/usecases/task-run-lifecycle-replay.js +128 -0
  543. package/dist/runner/usecases/task-run-lifecycle-shared.d.ts +45 -0
  544. package/dist/runner/usecases/task-run-lifecycle-shared.d.ts.map +1 -0
  545. package/dist/runner/usecases/task-run-lifecycle-shared.js +172 -0
  546. package/dist/runner/usecases/task-run-lifecycle.d.ts +4 -0
  547. package/dist/runner/usecases/task-run-lifecycle.d.ts.map +1 -0
  548. package/dist/runner/usecases/task-run-lifecycle.js +2 -0
  549. package/dist/runner/usecases/task-run.d.ts +32 -0
  550. package/dist/runner/usecases/task-run.d.ts.map +1 -0
  551. package/dist/runner/usecases/task-run.js +278 -0
  552. package/dist/shared/agent-emoji.d.ts.map +1 -1
  553. package/dist/shared/agent-emoji.js +1 -0
  554. package/dist/shared/errors.d.ts +1 -1
  555. package/dist/shared/errors.d.ts.map +1 -1
  556. package/dist/shared/guards.d.ts.map +1 -1
  557. package/dist/shared/guards.js +1 -0
  558. package/dist/shared/repo-cli-version.d.ts.map +1 -1
  559. package/dist/shared/repo-cli-version.js +7 -5
  560. package/dist/shared/task-doc-conflicts.d.ts +12 -0
  561. package/dist/shared/task-doc-conflicts.d.ts.map +1 -0
  562. package/dist/shared/task-doc-conflicts.js +40 -0
  563. package/dist/shared/task-doc-state.d.ts +10 -0
  564. package/dist/shared/task-doc-state.d.ts.map +1 -0
  565. package/dist/shared/task-doc-state.js +15 -0
  566. package/dist/test-helpers/fs.d.ts +2 -0
  567. package/dist/test-helpers/fs.d.ts.map +1 -0
  568. package/dist/test-helpers/fs.js +9 -0
  569. package/dist/usecases/context/resolve-context.d.ts +2 -0
  570. package/dist/usecases/context/resolve-context.d.ts.map +1 -1
  571. package/dist/usecases/context/resolve-context.js +4 -1
  572. package/dist/usecases/task/task-list-usecase.d.ts.map +1 -1
  573. package/dist/usecases/task/task-list-usecase.js +2 -8
  574. package/dist/workflow-runtime/fix.d.ts +9 -1
  575. package/dist/workflow-runtime/fix.d.ts.map +1 -1
  576. package/dist/workflow-runtime/fix.js +9 -1
  577. package/package.json +2 -2
  578. package/dist/backends/task-backend.test-helpers.d.ts +0 -4
  579. package/dist/backends/task-backend.test-helpers.d.ts.map +0 -1
  580. package/dist/backends/task-backend.test-helpers.js +0 -33
  581. package/dist/cli/run-cli/catalog.d.ts +0 -7
  582. package/dist/cli/run-cli/catalog.d.ts.map +0 -1
  583. package/dist/cli/run-cli/catalog.js +0 -22
  584. package/dist/cli/run-cli.core.pr-flow.test-helpers.d.ts +0 -3
  585. package/dist/cli/run-cli.core.pr-flow.test-helpers.d.ts.map +0 -1
  586. package/dist/cli/run-cli.core.pr-flow.test-helpers.js +0 -41
  587. package/dist/cli/run-cli.core.tasks.test-helpers.d.ts +0 -2
  588. package/dist/cli/run-cli.core.tasks.test-helpers.d.ts.map +0 -1
  589. package/dist/cli/run-cli.core.tasks.test-helpers.js +0 -6
  590. package/dist/commands/block.command.d.ts +0 -4
  591. package/dist/commands/block.command.d.ts.map +0 -1
  592. package/dist/commands/block.command.js +0 -2
  593. package/dist/commands/doctor.command.d.ts +0 -3
  594. package/dist/commands/doctor.command.d.ts.map +0 -1
  595. package/dist/commands/doctor.command.js +0 -2
  596. package/dist/commands/finish.command.d.ts +0 -4
  597. package/dist/commands/finish.command.d.ts.map +0 -1
  598. package/dist/commands/finish.command.js +0 -2
  599. package/dist/commands/recipes/install.command.d.ts +0 -3
  600. package/dist/commands/recipes/install.command.d.ts.map +0 -1
  601. package/dist/commands/recipes/install.command.js +0 -2
  602. package/dist/commands/start.command.d.ts +0 -4
  603. package/dist/commands/start.command.d.ts.map +0 -1
  604. package/dist/commands/start.command.js +0 -2
  605. package/dist/commands/task/list.command.d.ts +0 -4
  606. package/dist/commands/task/list.command.d.ts.map +0 -1
  607. package/dist/commands/task/list.command.js +0 -2
  608. package/dist/commands/task/next.command.d.ts +0 -4
  609. package/dist/commands/task/next.command.d.ts.map +0 -1
  610. package/dist/commands/task/next.command.js +0 -2
  611. package/dist/commands/task/search.command.d.ts +0 -4
  612. package/dist/commands/task/search.command.d.ts.map +0 -1
  613. package/dist/commands/task/search.command.js +0 -2
  614. package/dist/commands/task/show.command.d.ts +0 -4
  615. package/dist/commands/task/show.command.d.ts.map +0 -1
  616. package/dist/commands/task/show.command.js +0 -2
  617. package/dist/commands/verify.command.d.ts +0 -4
  618. package/dist/commands/verify.command.d.ts.map +0 -1
  619. package/dist/commands/verify.command.js +0 -2
@@ -1,9 +1,10 @@
1
1
  import { readFile, stat } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { docChanged, extractTaskDoc, mergeTaskDoc, parseTaskReadme, renderTaskReadme, renderTaskDocFromSections, taskDocToSectionMap, } from "@agentplaneorg/core";
3
+ import { applyTaskDocMutations, docChanged, extractTaskDoc, mergeTaskDoc, normalizeTaskDocVersion, parseTaskReadme, renderTaskReadme, taskDocToSectionMap, } from "@agentplaneorg/core";
4
4
  import { LocalBackend, taskRecordToData, } from "../../backends/task-backend.js";
5
5
  import { exitCodeForError } from "../../cli/exit-codes.js";
6
6
  import { CliError } from "../../shared/errors.js";
7
+ import { assertExpectedTaskDoc, assertExpectedTaskSection, } from "../../shared/task-doc-conflicts.js";
7
8
  import { writeTextIfChanged } from "../../shared/write-if-changed.js";
8
9
  import { resolveDocUpdatedBy, taskDataToFrontmatter } from "./task-backend.js";
9
10
  export function setTaskFieldsIntent(task) {
@@ -33,20 +34,12 @@ export function touchTaskDocMetaIntent(opts = {}) {
33
34
  function taskReadmePath(ctx, taskId) {
34
35
  return path.join(ctx.resolvedProject.gitRoot, ctx.config.paths.workflow_dir, taskId, "README.md");
35
36
  }
36
- function normalizeTaskDocVersion(value, fallback = 3) {
37
- return value === 3 ? 3 : value === 2 ? 2 : fallback;
38
- }
39
37
  function normalizeTaskRevision(value, fallback = 1) {
40
38
  return Number.isInteger(value) && Number(value) > 0 ? Number(value) : fallback;
41
39
  }
42
40
  function readStoredTaskRevision(value) {
43
41
  return Number.isInteger(value) && Number(value) > 0 ? Number(value) : null;
44
42
  }
45
- function normalizeDocComparison(text) {
46
- return String(text ?? "")
47
- .replaceAll("\r\n", "\n")
48
- .trim();
49
- }
50
43
  function normalizeComments(task) {
51
44
  return Array.isArray(task.comments)
52
45
  ? task.comments.filter((item) => !!item && typeof item.author === "string" && typeof item.body === "string")
@@ -65,31 +58,6 @@ function isConcurrentReadmeChangeError(err) {
65
58
  err.code === "E_IO" &&
66
59
  err.message.startsWith("Task README changed concurrently:"));
67
60
  }
68
- function throwTaskSectionConflict(opts) {
69
- throw new CliError({
70
- exitCode: exitCodeForError("E_VALIDATION"),
71
- code: "E_VALIDATION",
72
- message: `Task README section changed concurrently: ${opts.taskId} ## ${opts.section} ` +
73
- "(re-read the task and re-apply your change)",
74
- context: {
75
- task_id: opts.taskId,
76
- section: opts.section,
77
- reason_code: "task_readme_section_conflict",
78
- },
79
- });
80
- }
81
- function throwTaskDocConflict(opts) {
82
- throw new CliError({
83
- exitCode: exitCodeForError("E_VALIDATION"),
84
- code: "E_VALIDATION",
85
- message: `Task README changed concurrently: ${opts.taskId} ` +
86
- "(re-read the task and re-apply your change)",
87
- context: {
88
- task_id: opts.taskId,
89
- reason_code: "task_readme_conflict",
90
- },
91
- });
92
- }
93
61
  function throwTaskRevisionConflict(opts) {
94
62
  throw new CliError({
95
63
  exitCode: exitCodeForError("E_VALIDATION"),
@@ -104,31 +72,18 @@ function throwTaskRevisionConflict(opts) {
104
72
  },
105
73
  });
106
74
  }
107
- function applyTaskDocPatch(opts) {
108
- if (opts.patch.kind === "replace-doc") {
109
- if (opts.patch.expectedCurrentDoc !== undefined) {
110
- const currentDoc = normalizeDocComparison(opts.currentDocRaw);
111
- const expectedDoc = normalizeDocComparison(opts.patch.expectedCurrentDoc);
112
- if (currentDoc !== expectedDoc) {
113
- throwTaskDocConflict({ taskId: opts.taskId });
114
- }
115
- }
116
- return renderTaskDocFromSections(taskDocToSectionMap(opts.patch.doc));
117
- }
118
- const sections = taskDocToSectionMap(opts.currentDocRaw);
119
- for (const requiredSection of opts.patch.requiredSections) {
120
- if (!(requiredSection in sections))
121
- sections[requiredSection] = "";
122
- }
123
- if (opts.patch.expectedCurrentText !== undefined) {
124
- const currentSection = normalizeDocComparison(sections[opts.patch.section] ?? null);
125
- const expectedSection = normalizeDocComparison(opts.patch.expectedCurrentText);
126
- if (currentSection !== expectedSection) {
127
- throwTaskSectionConflict({ taskId: opts.taskId, section: opts.patch.section });
128
- }
129
- }
130
- sections[opts.patch.section] = opts.patch.text.replaceAll("\r\n", "\n").trimEnd();
131
- return renderTaskDocFromSections(sections);
75
+ function applyDocMutationsToState(docState, mutations, opts) {
76
+ const applied = applyTaskDocMutations(docState, mutations, {
77
+ now: opts.docUpdatedAt,
78
+ });
79
+ return {
80
+ ...docState,
81
+ doc: applied.doc,
82
+ sections: applied.sections,
83
+ doc_version: applied.doc_version,
84
+ doc_updated_at: applied.doc_updated_at,
85
+ doc_updated_by: applied.doc_updated_by,
86
+ };
132
87
  }
133
88
  function normalizeTaskStoreIntents(intents) {
134
89
  if (!intents)
@@ -241,23 +196,37 @@ export async function mutateTaskStore(store, taskId, builder, opts = {}) {
241
196
  }
242
197
  return await store.patch(taskId, async (current) => taskStorePatchFromIntents(await builder(current)), opts);
243
198
  }
244
- function applyTaskStoreIntents(entry, intents) {
245
- if (intents.length === 0)
246
- return { ...entry.task };
247
- const current = entry.task;
199
+ export function applyTaskStoreIntentsToTask(task, intents, opts = {}) {
200
+ const normalizedIntents = normalizeTaskStoreIntents(intents);
201
+ if (normalizedIntents.length === 0)
202
+ return { ...task };
203
+ const current = task;
248
204
  const next = { ...current };
205
+ let docState = {
206
+ comments: next.comments ?? null,
207
+ doc: String(next.doc ?? ""),
208
+ doc_updated_by: next.doc_updated_by,
209
+ doc_version: normalizeTaskDocVersion(opts.currentDocVersion ?? task.doc_version),
210
+ owner: next.owner,
211
+ sections: next.sections ?? null,
212
+ };
249
213
  let touchDoc = false;
250
- let docMetaUpdatedBy;
251
- let docMetaVersion;
252
- for (const intent of intents) {
214
+ for (const intent of normalizedIntents) {
253
215
  switch (intent.kind) {
254
216
  case "set-task-fields": {
255
217
  Object.assign(next, intent.task);
218
+ docState = {
219
+ ...docState,
220
+ doc_updated_by: next.doc_updated_by,
221
+ doc_version: normalizeTaskDocVersion(next.doc_version ?? docState.doc_version),
222
+ owner: next.owner,
223
+ };
256
224
  break;
257
225
  }
258
226
  case "append-comments": {
259
227
  if (intent.comments.length > 0) {
260
228
  next.comments = [...normalizeComments(next), ...intent.comments];
229
+ docState = { ...docState, comments: next.comments };
261
230
  }
262
231
  break;
263
232
  }
@@ -268,55 +237,66 @@ function applyTaskStoreIntents(entry, intents) {
268
237
  break;
269
238
  }
270
239
  case "replace-doc": {
271
- next.doc = applyTaskDocPatch({
272
- taskId: current.id,
273
- currentDocRaw: String(next.doc ?? ""),
274
- patch: {
275
- kind: "replace-doc",
276
- doc: intent.doc,
277
- expectedCurrentDoc: intent.expectedCurrentDoc,
278
- },
240
+ if (intent.expectedCurrentDoc !== undefined) {
241
+ assertExpectedTaskDoc({
242
+ taskId: current.id,
243
+ currentDoc: docState.doc,
244
+ expectedDoc: intent.expectedCurrentDoc,
245
+ });
246
+ }
247
+ docState = applyDocMutationsToState(docState, [{ kind: "replace-doc", doc: intent.doc }], {
248
+ docUpdatedAt: opts.docUpdatedAt,
279
249
  });
280
- next.sections = taskDocToSectionMap(String(next.doc ?? ""));
281
250
  touchDoc = true;
282
251
  break;
283
252
  }
284
253
  case "set-section": {
285
- next.doc = applyTaskDocPatch({
286
- taskId: current.id,
287
- currentDocRaw: String(next.doc ?? ""),
288
- patch: {
254
+ if (intent.expectedCurrentText !== undefined) {
255
+ assertExpectedTaskSection({
256
+ taskId: current.id,
257
+ currentDoc: docState.doc,
258
+ section: intent.section,
259
+ expectedText: intent.expectedCurrentText,
260
+ });
261
+ }
262
+ docState = applyDocMutationsToState(docState, [
263
+ {
289
264
  kind: "set-section",
290
265
  section: intent.section,
291
266
  text: intent.text,
292
267
  requiredSections: intent.requiredSections,
293
- expectedCurrentText: intent.expectedCurrentText,
294
268
  },
295
- });
296
- next.sections = taskDocToSectionMap(String(next.doc ?? ""));
269
+ ], { docUpdatedAt: opts.docUpdatedAt });
297
270
  touchDoc = true;
298
271
  break;
299
272
  }
300
273
  case "touch-doc-meta": {
274
+ docState = applyDocMutationsToState(docState, [
275
+ {
276
+ kind: "touch-doc-meta",
277
+ updatedBy: intent.updatedBy,
278
+ version: intent.version,
279
+ },
280
+ ], { docUpdatedAt: opts.docUpdatedAt });
301
281
  touchDoc = true;
302
- if (intent.updatedBy !== undefined) {
303
- docMetaUpdatedBy = intent.updatedBy;
304
- }
305
- if (intent.version !== undefined) {
306
- docMetaVersion = intent.version;
307
- }
308
282
  break;
309
283
  }
310
284
  }
311
285
  }
312
286
  if (touchDoc) {
313
- const currentDocVersion = normalizeTaskDocVersion(entry.parsed.frontmatter.doc_version);
314
- next.doc_version = normalizeTaskDocVersion(docMetaVersion ?? next.doc_version, currentDocVersion);
315
- next.doc_updated_at = new Date().toISOString();
316
- next.doc_updated_by = docMetaUpdatedBy ?? resolveDocUpdatedBy(next);
287
+ next.doc = docState.doc;
288
+ next.sections = docState.sections ?? taskDocToSectionMap(docState.doc);
289
+ next.doc_version = docState.doc_version;
290
+ next.doc_updated_at = docState.doc_updated_at;
291
+ next.doc_updated_by = docState.doc_updated_by;
317
292
  }
318
293
  return next;
319
294
  }
295
+ function applyTaskStoreIntents(entry, intents) {
296
+ return applyTaskStoreIntentsToTask(entry.task, intents, {
297
+ currentDocVersion: normalizeTaskDocVersion(entry.parsed.frontmatter.doc_version),
298
+ });
299
+ }
320
300
  async function readTaskReadmeCached(opts) {
321
301
  const readmePath = taskReadmePath(opts.ctx, opts.taskId);
322
302
  let text;
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/task/add.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIpF,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDlB"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/task/add.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAKpF,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,CA2DlB"}
@@ -1,6 +1,7 @@
1
1
  import { mapBackendError } from "../../cli/error-map.js";
2
2
  import { CliError } from "../../shared/errors.js";
3
3
  import { loadCommandContext } from "../shared/task-backend.js";
4
+ import { applyTaskCollectionMutation } from "../shared/task-mutation.js";
4
5
  import { dedupeStrings, normalizeTaskStatus, nowIso } from "./shared.js";
5
6
  import { defaultTaskDocV3, TASK_DOC_VERSION_V3 } from "./doc-template.js";
6
7
  export async function cmdTaskAdd(opts) {
@@ -8,49 +9,50 @@ export async function cmdTaskAdd(opts) {
8
9
  const ctx = opts.ctx ??
9
10
  (await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
10
11
  const status = normalizeTaskStatus(opts.status);
11
- const existing = await ctx.taskBackend.listTasks();
12
- const existingIds = new Set(existing.map((task) => task.id));
13
- for (const taskId of opts.taskIds) {
14
- if (existingIds.has(taskId)) {
15
- throw new CliError({
16
- exitCode: 2,
17
- code: "E_USAGE",
18
- message: `Task already exists: ${taskId}`,
19
- });
20
- }
21
- }
22
12
  const tags = dedupeStrings(opts.tags);
23
13
  const dependsOn = dedupeStrings(opts.dependsOn);
24
14
  const verify = dedupeStrings(opts.verify);
25
15
  const docUpdatedBy = (opts.commentAuthor ?? "").trim() || opts.owner;
26
- const tasks = opts.taskIds.map((taskId) => ({
27
- id: taskId,
28
- title: opts.title,
29
- description: opts.description,
30
- status,
31
- priority: opts.priority,
32
- owner: opts.owner,
33
- tags,
34
- depends_on: dependsOn,
35
- verify,
36
- comments: opts.commentAuthor && opts.commentBody
37
- ? [{ author: opts.commentAuthor, body: opts.commentBody }]
38
- : [],
39
- doc_version: TASK_DOC_VERSION_V3,
40
- doc_updated_at: nowIso(),
41
- doc_updated_by: docUpdatedBy,
42
- id_source: "explicit",
43
- doc: defaultTaskDocV3({ title: opts.title, description: opts.description }),
44
- }));
45
- if (ctx.taskBackend.writeTasks) {
46
- await ctx.taskBackend.writeTasks(tasks);
47
- }
48
- else {
49
- for (const task of tasks) {
50
- await ctx.taskBackend.writeTask(task);
51
- }
52
- }
53
- for (const task of tasks) {
16
+ const { tasksToWrite } = await applyTaskCollectionMutation({
17
+ ctx,
18
+ build: (existing) => {
19
+ const existingIds = new Set(existing.map((task) => task.id));
20
+ for (const taskId of opts.taskIds) {
21
+ if (existingIds.has(taskId)) {
22
+ throw new CliError({
23
+ exitCode: 2,
24
+ code: "E_USAGE",
25
+ message: `Task already exists: ${taskId}`,
26
+ });
27
+ }
28
+ }
29
+ const tasksToWrite = opts.taskIds.map((taskId) => ({
30
+ id: taskId,
31
+ title: opts.title,
32
+ description: opts.description,
33
+ status,
34
+ priority: opts.priority,
35
+ owner: opts.owner,
36
+ origin: { system: "manual" },
37
+ tags,
38
+ depends_on: dependsOn,
39
+ verify,
40
+ comments: opts.commentAuthor && opts.commentBody
41
+ ? [{ author: opts.commentAuthor, body: opts.commentBody }]
42
+ : [],
43
+ doc_version: TASK_DOC_VERSION_V3,
44
+ doc_updated_at: nowIso(),
45
+ doc_updated_by: docUpdatedBy,
46
+ id_source: "explicit",
47
+ doc: defaultTaskDocV3({ title: opts.title, description: opts.description }),
48
+ }));
49
+ return {
50
+ result: null,
51
+ tasksToWrite,
52
+ };
53
+ },
54
+ });
55
+ for (const task of tasksToWrite) {
54
56
  process.stdout.write(`${task.id}\n`);
55
57
  }
56
58
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../../src/commands/task/block.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AA0BnC,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IACnC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgKlB"}
1
+ {"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../../src/commands/task/block.ts"],"names":[],"mappings":"AAKA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAWpF,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IACnC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+ElB"}
@@ -1,13 +1,9 @@
1
1
  import { mapBackendError } from "../../cli/error-map.js";
2
- import { successMessage, warnMessage } from "../../cli/output.js";
3
- import { formatCommentBodyForCommit } from "../../shared/comment-format.js";
2
+ import { successMessage } from "../../cli/output.js";
4
3
  import { CliError } from "../../shared/errors.js";
5
- import { commitFromComment } from "../guard/index.js";
6
4
  import { ensureActionApproved } from "../shared/approval-requirements.js";
7
- import { loadCommandContext, loadTaskFromContext, } from "../shared/task-backend.js";
8
- import { appendTaskCommentIntent, appendTaskEventIntent, backendIsLocalFileBackend, getTaskStore, mutateTaskStore, setTaskFieldsIntent, touchTaskDocMetaIntent, } from "../shared/task-store.js";
9
- import { readDirectWorkLock } from "../../shared/direct-work-lock.js";
10
- import { appendTaskEvent, defaultCommitEmojiForStatus, ensureCommentCommitAllowed, resolveCommentCommitWarning, ensureStatusTransitionAllowed, normalizeTaskDocVersion, nowIso, requireStructuredComment, resolvePrimaryTag, toStringArray, } from "./shared.js";
5
+ import { loadCommandContext } from "../shared/task-backend.js";
6
+ import { applyTaskStatusTransitionCommand, defaultCommitEmojiForStatus, nowIso, prepareTaskTransitionComment, requireStructuredComment, runTaskTransitionCommentCommit, } from "./shared.js";
11
7
  export async function cmdBlock(opts) {
12
8
  try {
13
9
  const ctx = opts.ctx ??
@@ -22,129 +18,54 @@ export async function cmdBlock(opts) {
22
18
  }
23
19
  const { prefix, min_chars: minChars } = ctx.config.tasks.comments.blocked;
24
20
  requireStructuredComment(opts.body, prefix, minChars);
25
- const useStore = backendIsLocalFileBackend(ctx);
26
- const store = useStore ? getTaskStore(ctx) : null;
27
- const task = useStore
28
- ? await store.get(opts.taskId)
29
- : await loadTaskFromContext({ ctx, taskId: opts.taskId });
30
- const currentStatus = String(task.status || "TODO").toUpperCase();
31
- if (!useStore) {
32
- ensureStatusTransitionAllowed({
33
- currentStatus,
34
- nextStatus: "BLOCKED",
35
- force: opts.force,
36
- });
37
- ensureCommentCommitAllowed({
38
- enabled: opts.commitFromComment,
39
- config: ctx.config,
40
- action: "block",
41
- confirmed: opts.confirmStatusCommit,
42
- quiet: opts.quiet,
43
- statusFrom: currentStatus,
44
- statusTo: "BLOCKED",
45
- });
46
- }
47
- const formattedComment = opts.commitFromComment
48
- ? formatCommentBodyForCommit(opts.body, ctx.config)
49
- : null;
50
- const commentBody = formattedComment ?? opts.body;
51
- const existingComments = Array.isArray(task.comments)
52
- ? task.comments.filter((item) => !!item && typeof item.author === "string" && typeof item.body === "string")
53
- : [];
54
- const commentsValue = [...existingComments, { author: opts.author, body: commentBody }];
21
+ const preparedComment = prepareTaskTransitionComment({
22
+ body: opts.body,
23
+ enabled: opts.commitFromComment,
24
+ config: ctx.config,
25
+ });
26
+ const commentBody = preparedComment.commentBody ?? opts.body;
55
27
  const at = nowIso();
56
- let currentStatusForCommit = currentStatus;
57
- let primaryTagForCommit = resolvePrimaryTag(toStringArray(task.tags), ctx).primary;
58
- let deferredWarnings = [];
59
- await (useStore
60
- ? mutateTaskStore(store, opts.taskId, (current) => {
61
- deferredWarnings = [];
62
- const currentStatus = String(current.status || "TODO").toUpperCase();
63
- currentStatusForCommit = currentStatus;
64
- primaryTagForCommit = resolvePrimaryTag(toStringArray(current.tags), ctx).primary;
65
- ensureStatusTransitionAllowed({
66
- currentStatus,
67
- nextStatus: "BLOCKED",
68
- force: opts.force,
69
- });
70
- const commitWarning = resolveCommentCommitWarning({
28
+ const transition = await applyTaskStatusTransitionCommand({
29
+ ctx,
30
+ taskId: opts.taskId,
31
+ quiet: opts.quiet,
32
+ build: () => ({
33
+ at,
34
+ toStatus: "BLOCKED",
35
+ eventAuthor: opts.author,
36
+ updatedBy: opts.author,
37
+ note: commentBody,
38
+ comment: { author: opts.author, body: commentBody },
39
+ force: opts.force,
40
+ dependencyPolicy: { kind: "none" },
41
+ commentCommitPolicy: {
71
42
  enabled: opts.commitFromComment,
72
- config: ctx.config,
73
43
  action: "block",
74
44
  confirmed: opts.confirmStatusCommit,
75
45
  quiet: opts.quiet,
76
- statusFrom: currentStatus,
77
- statusTo: "BLOCKED",
78
- });
79
- if (commitWarning)
80
- deferredWarnings.push(commitWarning);
81
- return [
82
- setTaskFieldsIntent({ status: "BLOCKED" }),
83
- appendTaskCommentIntent({ author: opts.author, body: commentBody }),
84
- appendTaskEventIntent({
85
- type: "status",
86
- at,
87
- author: opts.author,
88
- from: currentStatus,
89
- to: "BLOCKED",
90
- note: commentBody,
91
- }),
92
- touchTaskDocMetaIntent({
93
- updatedBy: opts.author,
94
- version: normalizeTaskDocVersion(current.doc_version),
95
- }),
96
- ];
97
- })
98
- : ctx.taskBackend.writeTask({
99
- ...task,
100
- status: "BLOCKED",
101
- comments: commentsValue,
102
- events: appendTaskEvent(task, {
103
- type: "status",
104
- at,
105
- author: opts.author,
106
- from: currentStatus,
107
- to: "BLOCKED",
108
- note: commentBody,
109
- }),
110
- doc_version: normalizeTaskDocVersion(task.doc_version),
111
- doc_updated_at: at,
112
- doc_updated_by: opts.author,
113
- }));
114
- if (!opts.quiet) {
115
- for (const warning of new Set(deferredWarnings)) {
116
- process.stderr.write(`${warnMessage(warning)}\n`);
117
- }
118
- }
46
+ },
47
+ }),
48
+ });
119
49
  let commitInfo = null;
120
50
  if (opts.commitFromComment) {
121
- const mode = ctx.config.workflow_mode;
122
- let executorAgent = opts.author;
123
- if (mode === "direct") {
124
- const lock = await readDirectWorkLock(ctx.resolvedProject.agentplaneDir);
125
- const lockAgent = lock?.task_id === opts.taskId ? (lock.agent?.trim() ?? "") : "";
126
- if (lockAgent)
127
- executorAgent = lockAgent;
128
- }
129
- commitInfo = await commitFromComment({
51
+ commitInfo = await runTaskTransitionCommentCommit({
130
52
  ctx,
131
53
  cwd: opts.cwd,
132
54
  rootOverride: opts.rootOverride,
133
55
  taskId: opts.taskId,
134
- primaryTag: primaryTagForCommit,
135
- executorAgent,
56
+ primaryTag: transition.primaryTag,
136
57
  author: opts.author,
137
- statusFrom: currentStatusForCommit,
58
+ statusFrom: transition.execution.currentStatus,
138
59
  statusTo: "BLOCKED",
139
60
  commentBody: opts.body,
140
- formattedComment,
61
+ formattedComment: preparedComment.formattedComment,
141
62
  emoji: opts.commitEmoji ?? defaultCommitEmojiForStatus("BLOCKED"),
142
63
  allow: opts.commitAllow,
143
64
  autoAllow: opts.commitAutoAllow || opts.commitAllow.length === 0,
144
65
  allowTasks: opts.commitAllowTasks,
145
66
  requireClean: opts.commitRequireClean,
146
67
  quiet: opts.quiet,
147
- config: ctx.config,
68
+ resolveExecutorAgent: true,
148
69
  });
149
70
  }
150
71
  if (!opts.quiet) {
@@ -1 +1 @@
1
- {"version":3,"file":"close-duplicate.d.ts","sourceRoot":"","sources":["../../../src/commands/task/close-duplicate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIrF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,cAAc,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2DlB"}
1
+ {"version":3,"file":"close-duplicate.d.ts","sourceRoot":"","sources":["../../../src/commands/task/close-duplicate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGrF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,cAAc,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDlB"}
@@ -2,7 +2,6 @@ import { mapBackendError } from "../../cli/error-map.js";
2
2
  import { CliError } from "../../shared/errors.js";
3
3
  import { ensureActionApproved } from "../shared/approval-requirements.js";
4
4
  import { loadTaskFromContext } from "../shared/task-backend.js";
5
- import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
6
5
  import { recordVerifiedNoopClosure } from "./close-shared.js";
7
6
  export async function cmdTaskCloseDuplicate(opts) {
8
7
  try {
@@ -31,11 +30,6 @@ export async function cmdTaskCloseDuplicate(opts) {
31
30
  });
32
31
  }
33
32
  const canonical = await loadTaskFromContext({ ctx: opts.ctx, taskId: duplicateOf });
34
- const useStore = backendIsLocalFileBackend(opts.ctx);
35
- const store = useStore ? getTaskStore(opts.ctx) : null;
36
- const task = useStore
37
- ? await store.get(sourceId)
38
- : await loadTaskFromContext({ ctx: opts.ctx, taskId: sourceId });
39
33
  const reason = opts.note?.trim();
40
34
  const canonicalTitle = canonical.title?.trim() ? ` (${canonical.title.trim()})` : "";
41
35
  const baseBody = `Verified: ${sourceId} is a bookkeeping duplicate of ${duplicateOf}${canonicalTitle}; ` +
@@ -43,7 +37,6 @@ export async function cmdTaskCloseDuplicate(opts) {
43
37
  const body = reason ? `${baseBody}\n\nReason: ${reason}` : baseBody;
44
38
  await recordVerifiedNoopClosure({
45
39
  ctx: opts.ctx,
46
- task,
47
40
  taskId: sourceId,
48
41
  author: opts.author,
49
42
  body,
@@ -1 +1 @@
1
- {"version":3,"file":"close-noop.d.ts","sourceRoot":"","sources":["../../../src/commands/task/close-noop.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGpF,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,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDlB"}
1
+ {"version":3,"file":"close-noop.d.ts","sourceRoot":"","sources":["../../../src/commands/task/close-noop.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGpF,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,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgClB"}
@@ -1,7 +1,6 @@
1
1
  import { mapBackendError } from "../../cli/error-map.js";
2
2
  import { CliError } from "../../shared/errors.js";
3
3
  import { ensureActionApproved } from "../shared/approval-requirements.js";
4
- import { backendIsLocalFileBackend, getTaskStore } from "../shared/task-store.js";
5
4
  import { loadCommandContext } from "../shared/task-backend.js";
6
5
  import { recordVerifiedNoopClosure } from "./close-shared.js";
7
6
  export async function cmdTaskCloseNoop(opts) {
@@ -16,31 +15,11 @@ export async function cmdTaskCloseNoop(opts) {
16
15
  reason: "task close-noop --force",
17
16
  });
18
17
  }
19
- const useStore = backendIsLocalFileBackend(ctx);
20
- const store = useStore ? getTaskStore(ctx) : null;
21
- const task = useStore
22
- ? await store.get(opts.taskId)
23
- : await ctx.taskBackend.getTask(opts.taskId);
24
- if (!task) {
25
- throw new CliError({
26
- exitCode: 4,
27
- code: "E_IO",
28
- message: `Task not found: ${opts.taskId}`,
29
- });
30
- }
31
- if (!opts.force && String(task.status || "TODO").toUpperCase() === "DONE") {
32
- throw new CliError({
33
- exitCode: 2,
34
- code: "E_USAGE",
35
- message: `Task is already DONE: ${opts.taskId} (use --force to override)`,
36
- });
37
- }
38
18
  const normalizedNote = opts.note?.trim();
39
19
  const baseBody = "Verified: no implementation changes were required; closure is recorded as no-op bookkeeping.";
40
20
  const body = normalizedNote ? `${baseBody}\n\nNote: ${normalizedNote}` : baseBody;
41
21
  await recordVerifiedNoopClosure({
42
22
  ctx,
43
- task,
44
23
  taskId: opts.taskId,
45
24
  author: opts.author,
46
25
  body,
@@ -1,8 +1,6 @@
1
- import { type TaskData } from "../../backends/task-backend.js";
2
1
  import { type CommandContext } from "../shared/task-backend.js";
3
2
  export declare function recordVerifiedNoopClosure(opts: {
4
3
  ctx: CommandContext;
5
- task: TaskData;
6
4
  taskId: string;
7
5
  author: string;
8
6
  body: string;
@@ -1 +1 @@
1
- {"version":3,"file":"close-shared.d.ts","sourceRoot":"","sources":["../../../src/commands/task/close-shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAgBhE,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEhB"}
1
+ {"version":3,"file":"close-shared.d.ts","sourceRoot":"","sources":["../../../src/commands/task/close-shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyChB"}