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
@@ -6,7 +6,7 @@ import path from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { promisify } from "node:util";
8
8
  import { gzipSync } from "node:zlib";
9
- import { afterAll, afterEach, beforeAll, beforeEach, vi } from "vitest";
9
+ import { afterAll, afterEach, beforeAll, beforeEach, expect, vi } from "vitest";
10
10
  import { defaultConfig } from "@agentplaneorg/core";
11
11
  import { runCli } from "./run-cli.js";
12
12
  const execFileAsync = promisify(execFile);
@@ -18,6 +18,7 @@ const originalGitAuthorName = process.env.GIT_AUTHOR_NAME;
18
18
  const originalGitAuthorEmail = process.env.GIT_AUTHOR_EMAIL;
19
19
  const originalGitCommitterName = process.env.GIT_COMMITTER_NAME;
20
20
  const originalGitCommitterEmail = process.env.GIT_COMMITTER_EMAIL;
21
+ const originalHookRunner = process.env.AGENTPLANE_HOOK_RUNNER;
21
22
  const originalStdoutWrite = process.stdout.write.bind(process.stdout);
22
23
  const originalStderrWrite = process.stderr.write.bind(process.stderr);
23
24
  let stdioSilenceDepth = 0;
@@ -29,13 +30,17 @@ async function ensureGitTemplateRoot() {
29
30
  return gitTemplateRoot;
30
31
  gitTemplatePromise ??= (async () => {
31
32
  const root = await mkdtemp(path.join(os.tmpdir(), "agentplane-git-template-"));
32
- await execFileAsync("git", ["init", "-q"], { cwd: root });
33
+ await execFileAsync("git", ["init", "-q"], { cwd: root, env: cleanGitEnv() });
33
34
  // Tests must not rely on global git config. Configure author identity locally
34
35
  // so any helper that creates commits works in CI.
35
36
  await execFileAsync("git", ["config", "user.email", "agentplane-test@example.com"], {
36
37
  cwd: root,
38
+ env: cleanGitEnv(),
39
+ });
40
+ await execFileAsync("git", ["config", "user.name", "agentplane-test"], {
41
+ cwd: root,
42
+ env: cleanGitEnv(),
37
43
  });
38
- await execFileAsync("git", ["config", "user.name", "agentplane-test"], { cwd: root });
39
44
  return root;
40
45
  })();
41
46
  gitTemplateRoot = await gitTemplatePromise;
@@ -50,6 +55,7 @@ export function registerAgentplaneHome() {
50
55
  agentplaneHome = await mkdtemp(path.join(os.tmpdir(), "agentplane-home-"));
51
56
  process.env.AGENTPLANE_HOME = agentplaneHome;
52
57
  process.env.AGENTPLANE_NO_UPDATE_CHECK = "1";
58
+ process.env.AGENTPLANE_HOOK_RUNNER ??= path.join(process.cwd(), "packages", "agentplane", "bin", "agentplane.js");
53
59
  // Keep tests hermetic: never rely on global git config for commit authorship.
54
60
  process.env.GIT_AUTHOR_NAME ??= "agentplane-test";
55
61
  process.env.GIT_AUTHOR_EMAIL ??= "agentplane-test@example.com";
@@ -88,6 +94,10 @@ export function registerAgentplaneHome() {
88
94
  delete process.env.GIT_COMMITTER_EMAIL;
89
95
  else
90
96
  process.env.GIT_COMMITTER_EMAIL = originalGitCommitterEmail;
97
+ if (originalHookRunner === undefined)
98
+ delete process.env.AGENTPLANE_HOOK_RUNNER;
99
+ else
100
+ process.env.AGENTPLANE_HOOK_RUNNER = originalHookRunner;
91
101
  });
92
102
  afterEach(async () => {
93
103
  const roots = [...testRoots];
@@ -142,6 +152,27 @@ export function captureStdIO() {
142
152
  },
143
153
  };
144
154
  }
155
+ export function splitOutputLines(text) {
156
+ return text
157
+ .trim()
158
+ .split(/\r?\n/)
159
+ .map((line) => line.trimEnd())
160
+ .filter(Boolean);
161
+ }
162
+ export function parseAgentJsonEnvelope(stdout) {
163
+ return JSON.parse(stdout);
164
+ }
165
+ export function expectAgentJsonEnvelope(payload, opts) {
166
+ expect(payload.schema_version).toBe(1);
167
+ expect(payload.mode).toBe("agent_json_v1");
168
+ expect(payload.command).toBe(opts.command);
169
+ expect(payload.ok).toBe(opts.ok);
170
+ expect(payload.exit_code).toBe(opts.exitCode);
171
+ expect(Object.keys(payload)).toEqual(opts.hasData
172
+ ? ["schema_version", "mode", "command", "ok", "exit_code", "stdout", "stderr", "data"]
173
+ : ["schema_version", "mode", "command", "ok", "exit_code", "stdout", "stderr"]);
174
+ expect(Object.hasOwn(payload, "data")).toBe(opts.hasData ?? false);
175
+ }
145
176
  export function silenceStdIO() {
146
177
  if (stdioSilenceDepth === 0) {
147
178
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -167,6 +198,7 @@ export function stubTaskBackend(overrides = {}) {
167
198
  capabilities: {
168
199
  canonical_source: "local",
169
200
  projection: "canonical",
201
+ projection_read_mode: "fallback",
170
202
  reads_from_projection_by_default: false,
171
203
  writes_task_readmes: true,
172
204
  supports_task_revisions: true,
@@ -210,6 +242,51 @@ export async function writeDefaultConfig(root) {
210
242
  const configPath = path.join(agentplaneDir, "config.json");
211
243
  await writeFile(configPath, JSON.stringify(defaultConfig(), null, 2), "utf8");
212
244
  }
245
+ export async function writeAndConfigureRoot() {
246
+ const root = await mkGitRepoRoot();
247
+ await writeDefaultConfig(root);
248
+ return root;
249
+ }
250
+ export async function approveTaskPlan(root, taskId) {
251
+ await runCliSilent([
252
+ "task",
253
+ "plan",
254
+ "set",
255
+ taskId,
256
+ "--text",
257
+ "1) Do the work\n2) Verify the work",
258
+ "--updated-by",
259
+ "ORCHESTRATOR",
260
+ "--root",
261
+ root,
262
+ ]);
263
+ await runCliSilent([
264
+ "task",
265
+ "plan",
266
+ "approve",
267
+ taskId,
268
+ "--by",
269
+ "USER",
270
+ "--note",
271
+ "OK",
272
+ "--root",
273
+ root,
274
+ ]);
275
+ }
276
+ export async function recordVerificationOk(root, taskId) {
277
+ await runCliSilent([
278
+ "verify",
279
+ taskId,
280
+ "--ok",
281
+ "--by",
282
+ "REVIEWER",
283
+ "--note",
284
+ "Ok to integrate",
285
+ "--quiet",
286
+ "--root",
287
+ root,
288
+ ]);
289
+ }
213
290
  export async function writeConfig(root, config) {
214
291
  const agentplaneDir = path.join(root, ".agentplane");
215
292
  await mkdir(agentplaneDir, { recursive: true });
@@ -294,10 +371,7 @@ export async function createRecipeArchive(opts) {
294
371
  run_profile: {
295
372
  mode: "analysis",
296
373
  sandbox: "workspace-write",
297
- network: false,
298
- requires_human_approval: false,
299
374
  writes_artifacts_to: ["logs/", "reports/"],
300
- expected_exit_contract: "report",
301
375
  },
302
376
  file: "scenarios/recipe-scenario.json",
303
377
  },
@@ -334,6 +408,21 @@ export async function createRecipeArchive(opts) {
334
408
  id: "RECIPE_SCENARIO",
335
409
  summary: "Recipe scenario",
336
410
  goal: "Preview installed tasks.",
411
+ task_template: {
412
+ title: "Recipe scenario task",
413
+ description: "Materialize a task from the recipe scenario.",
414
+ owner: "CODER",
415
+ priority: "med",
416
+ tags: ["code", "recipes"],
417
+ verify: ["bunx vitest run packages/agentplane/src/cli/run-cli.scenario.test.ts"],
418
+ doc: {
419
+ summary: "Recipe-backed task execution.",
420
+ scope: "Run the scenario without task materialization heuristics.",
421
+ plan: "1. Materialize the task. 2. Execute the shared runner.",
422
+ verify_steps: "1. Run scenario execution tests.",
423
+ rollback_plan: "Revert the generated task and runner artifacts.",
424
+ },
425
+ },
337
426
  inputs: [{ name: "task_id", type: "string" }],
338
427
  outputs: [{ name: "report", type: "html" }],
339
428
  steps: [{ tool: "RECIPE_TOOL" }],
@@ -448,6 +537,11 @@ export async function createUnsafeRecipeArchive(opts) {
448
537
  id: "RECIPE_SCENARIO",
449
538
  summary: "Recipe scenario",
450
539
  goal: "Exercise unsafe archive validation.",
540
+ task_template: {
541
+ title: "Unsafe archive task",
542
+ description: "Validate unsafe archive handling.",
543
+ owner: "CODER",
544
+ },
451
545
  inputs: [],
452
546
  outputs: [],
453
547
  steps: [{ tool: "RECIPE_TOOL" }],
@@ -577,12 +671,18 @@ export async function createUpgradeBundle(files) {
577
671
  }
578
672
  export async function mkGitRepoRootWithBranch(branch) {
579
673
  const root = await mkGitRepoRoot();
580
- await execFileAsync("git", ["checkout", "-b", branch], { cwd: root });
674
+ await execFileAsync("git", ["checkout", "-b", branch], { cwd: root, env: cleanGitEnv() });
581
675
  return root;
582
676
  }
583
677
  export async function configureGitUser(root) {
584
- await execFileAsync("git", ["config", "user.email", "test@example.com"], { cwd: root });
585
- await execFileAsync("git", ["config", "user.name", "Test User"], { cwd: root });
678
+ await execFileAsync("git", ["config", "user.email", "test@example.com"], {
679
+ cwd: root,
680
+ env: cleanGitEnv(),
681
+ });
682
+ await execFileAsync("git", ["config", "user.name", "Test User"], {
683
+ cwd: root,
684
+ env: cleanGitEnv(),
685
+ });
586
686
  }
587
687
  export function cleanGitEnv() {
588
688
  const env = { ...process.env };
@@ -592,6 +692,13 @@ export function cleanGitEnv() {
592
692
  delete env.GIT_INDEX_FILE;
593
693
  delete env.GIT_OBJECT_DIRECTORY;
594
694
  delete env.GIT_ALTERNATE_OBJECT_DIRECTORIES;
695
+ env.GIT_CONFIG_GLOBAL = "/dev/null";
696
+ env.GIT_CONFIG_SYSTEM = "/dev/null";
697
+ env.GIT_TERMINAL_PROMPT = "0";
698
+ env.GIT_AUTHOR_NAME = env.GIT_AUTHOR_NAME ?? "Agentplane Test";
699
+ env.GIT_AUTHOR_EMAIL = env.GIT_AUTHOR_EMAIL ?? "agentplane-test@example.com";
700
+ env.GIT_COMMITTER_NAME = env.GIT_COMMITTER_NAME ?? "Agentplane Test";
701
+ env.GIT_COMMITTER_EMAIL = env.GIT_COMMITTER_EMAIL ?? "agentplane-test@example.com";
595
702
  return env;
596
703
  }
597
704
  export async function pathExists(filePath) {
@@ -619,12 +726,15 @@ export async function gitBranchExists(root, branch) {
619
726
  }
620
727
  }
621
728
  export async function commitAll(root, message) {
622
- await execFileAsync("git", ["add", "."], { cwd: root });
623
- await execFileAsync("git", ["commit", "-m", message], { cwd: root });
729
+ await execFileAsync("git", ["add", "."], { cwd: root, env: cleanGitEnv() });
730
+ await execFileAsync("git", ["commit", "--no-verify", "-m", message], {
731
+ cwd: root,
732
+ env: cleanGitEnv(),
733
+ });
624
734
  }
625
735
  export async function stageGitignoreIfPresent(root) {
626
736
  const gitignorePath = path.join(root, ".gitignore");
627
737
  if (!(await pathExists(gitignorePath)))
628
738
  return;
629
- await execFileAsync("git", ["add", ".gitignore"], { cwd: root });
739
+ await execFileAsync("git", ["add", ".gitignore"], { cwd: root, env: cleanGitEnv() });
630
740
  }
@@ -1,10 +1,18 @@
1
1
  import type { CommandHandler, CommandSpec } from "./spec.js";
2
- import type { CommandRegistry } from "./registry.js";
3
2
  export type HelpParsed = {
4
3
  cmd: string[];
5
4
  compact: boolean;
6
5
  json: boolean;
7
6
  };
7
+ export type HelpRegistryView = {
8
+ list(): readonly {
9
+ spec: CommandSpec;
10
+ }[];
11
+ match(tokens: readonly string[]): {
12
+ spec: CommandSpec;
13
+ consumed: number;
14
+ } | null;
15
+ };
8
16
  export declare const helpSpec: CommandSpec<HelpParsed>;
9
- export declare function makeHelpHandler(registry: CommandRegistry): CommandHandler<HelpParsed>;
17
+ export declare function makeHelpHandler(registry: HelpRegistryView): CommandHandler<HelpParsed>;
10
18
  //# sourceMappingURL=help.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/cli/spec/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAQ7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,WAAW,CAAC,UAAU,CAwB5C,CAAC;AAEF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,cAAc,CAAC,UAAU,CAAC,CAuCrF"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/cli/spec/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAY7D,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,IAAI,SAAS;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,EAAE,CAAC;IACzC,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAClF,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,WAAW,CAAC,UAAU,CAwB5C,CAAC;AAEF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC,CAuCtF"}
@@ -1,6 +1,8 @@
1
+ import { createCliEmitter } from "../output.js";
1
2
  import { renderCommandHelpJson, renderCommandHelpText, renderRegistryHelpText, } from "./help-render.js";
2
3
  import { suggestOne } from "./suggest.js";
3
4
  import { usageError } from "./errors.js";
5
+ const output = createCliEmitter();
4
6
  export const helpSpec = {
5
7
  id: ["help"],
6
8
  group: "Core",
@@ -12,7 +14,7 @@ export const helpSpec = {
12
14
  { kind: "boolean", name: "json", description: "Emit JSON help (success output)." },
13
15
  ],
14
16
  examples: [
15
- { cmd: "agentplane help", why: "List commands available in cli2 registry." },
17
+ { cmd: "agentplane help", why: "List commands available in the CLI command catalog." },
16
18
  { cmd: "agentplane help task new --compact", why: "Show compact help for a command." },
17
19
  { cmd: "agentplane help task new --json", why: "Show JSON help for a command." },
18
20
  ],
@@ -31,10 +33,10 @@ export function makeHelpHandler(registry) {
31
33
  if (p.cmd.length === 0) {
32
34
  if (p.json) {
33
35
  const out = specs.map((s) => renderCommandHelpJson(s));
34
- process.stdout.write(`${JSON.stringify(out, null, 2)}\n`);
36
+ output.json(out);
35
37
  }
36
38
  else {
37
- process.stdout.write(`${renderRegistryHelpText(specs)}\n`);
39
+ output.line(renderRegistryHelpText(specs));
38
40
  }
39
41
  return Promise.resolve(0);
40
42
  }
@@ -51,14 +53,14 @@ export function makeHelpHandler(registry) {
51
53
  });
52
54
  }
53
55
  if (p.json) {
54
- process.stdout.write(`${JSON.stringify(renderCommandHelpJson(match.spec), null, 2)}\n`);
56
+ output.json(renderCommandHelpJson(match.spec));
55
57
  return Promise.resolve(0);
56
58
  }
57
59
  const text = renderCommandHelpText(match.spec, {
58
60
  compact: p.compact,
59
61
  includeHeader: true,
60
62
  });
61
- process.stdout.write(`${text}\n`);
63
+ output.line(text);
62
64
  return Promise.resolve(0);
63
65
  };
64
66
  }
@@ -1,12 +1,38 @@
1
1
  import type { CommandHandler, CommandId, CommandSpec, MatchResult } from "./spec.js";
2
+ export type CommandGraphMatch<T> = {
3
+ value: T;
4
+ consumed: number;
5
+ };
6
+ export declare class CommandGraph<T> {
7
+ private readonly getId;
8
+ private readonly root;
9
+ private readonly values;
10
+ constructor(getId: (value: T) => CommandId);
11
+ add(value: T): void;
12
+ list(): readonly T[];
13
+ lookup(id: CommandId): T | null;
14
+ match(tokens: readonly string[]): CommandGraphMatch<T> | null;
15
+ directChildren(parentId?: CommandId): readonly T[];
16
+ directChildSegments(parentId?: CommandId): readonly string[];
17
+ private resolveNode;
18
+ }
2
19
  export declare class CommandRegistry {
3
- private readonly entries;
20
+ private readonly graph;
4
21
  register<TParsed>(spec: CommandSpec<TParsed>, handler: CommandHandler<TParsed>): void;
5
22
  list(): readonly {
6
23
  spec: CommandSpec;
7
24
  handler: CommandHandler;
8
25
  }[];
9
26
  match(tokens: readonly string[]): MatchResult | null;
27
+ lookup(id: CommandId): {
28
+ spec: CommandSpec;
29
+ handler: CommandHandler;
30
+ } | null;
31
+ directChildren(parentId?: CommandId): readonly {
32
+ spec: CommandSpec;
33
+ handler: CommandHandler;
34
+ }[];
35
+ directChildSegments(parentId?: CommandId): readonly string[];
10
36
  }
11
37
  export declare function formatCommandId(id: CommandId): string;
12
38
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/cli/spec/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAIrF,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAIf;IAET,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC;IAgB9E,IAAI,IAAI,SAAS;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,cAAc,CAAA;KAAE,EAAE;IAIjE,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,GAAG,IAAI;CAoBrD;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAErD"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/cli/spec/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAUrF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAWF,qBAAa,YAAY,CAAC,CAAC;IAQb,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPlC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAGnB;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;gBAEL,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,SAAS;IAE3D,GAAG,CAAC,KAAK,EAAE,CAAC;IAwBZ,IAAI,IAAI,SAAS,CAAC,EAAE;IAIpB,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG,CAAC,GAAG,IAAI;IAI/B,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAiB7D,cAAc,CAAC,QAAQ,GAAE,SAAc,GAAG,SAAS,CAAC,EAAE;IAQtD,mBAAmB,CAAC,QAAQ,GAAE,SAAc,GAAG,SAAS,MAAM,EAAE;IAMhE,OAAO,CAAC,WAAW;CASpB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuD;IAE7E,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC;IAe9E,IAAI,IAAI,SAAS;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,cAAc,CAAA;KAAE,EAAE;IAIjE,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,GAAG,IAAI;IAOpD,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,cAAc,CAAA;KAAE,GAAG,IAAI;IAI5E,cAAc,CACZ,QAAQ,GAAE,SAAc,GACvB,SAAS;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,cAAc,CAAA;KAAE,EAAE;IAI5D,mBAAmB,CAAC,QAAQ,GAAE,SAAc,GAAG,SAAS,MAAM,EAAE;CAGjE;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAErD"}
@@ -1,45 +1,118 @@
1
1
  import { CliError } from "../../shared/errors.js";
2
+ function getRegistryEntryId(entry) {
3
+ return entry.spec.id;
4
+ }
5
+ export class CommandGraph {
6
+ getId;
7
+ root = {
8
+ id: [],
9
+ children: new Map(),
10
+ };
11
+ values = [];
12
+ constructor(getId) {
13
+ this.getId = getId;
14
+ }
15
+ add(value) {
16
+ const id = this.getId(value);
17
+ let node = this.root;
18
+ for (const segment of id) {
19
+ const existing = node.children.get(segment);
20
+ if (existing) {
21
+ node = existing;
22
+ continue;
23
+ }
24
+ const child = {
25
+ id: [...node.id, segment],
26
+ children: new Map(),
27
+ };
28
+ node.children.set(segment, child);
29
+ node = child;
30
+ }
31
+ if (node.value !== undefined) {
32
+ throw new Error(`Duplicate command id registered: ${formatCommandId(id)}`);
33
+ }
34
+ node.value = value;
35
+ this.values.push(value);
36
+ }
37
+ list() {
38
+ return this.values;
39
+ }
40
+ lookup(id) {
41
+ return this.resolveNode(id)?.value ?? null;
42
+ }
43
+ match(tokens) {
44
+ let node = this.root;
45
+ let best = null;
46
+ for (const [index, token] of tokens.entries()) {
47
+ const next = node.children.get(token);
48
+ if (!next)
49
+ break;
50
+ node = next;
51
+ if (node.value !== undefined) {
52
+ best = {
53
+ value: node.value,
54
+ consumed: index + 1,
55
+ };
56
+ }
57
+ }
58
+ return best;
59
+ }
60
+ directChildren(parentId = []) {
61
+ const parent = this.resolveNode(parentId);
62
+ if (!parent)
63
+ return [];
64
+ return [...parent.children.values()].flatMap((child) => child.value === undefined ? [] : [child.value]);
65
+ }
66
+ directChildSegments(parentId = []) {
67
+ const parent = this.resolveNode(parentId);
68
+ if (!parent)
69
+ return [];
70
+ return [...parent.children.keys()].toSorted((left, right) => left.localeCompare(right));
71
+ }
72
+ resolveNode(id) {
73
+ let node = this.root;
74
+ for (const segment of id) {
75
+ const next = node.children.get(segment);
76
+ if (!next)
77
+ return null;
78
+ node = next;
79
+ }
80
+ return node;
81
+ }
82
+ }
2
83
  export class CommandRegistry {
3
- entries = [];
84
+ graph = new CommandGraph(getRegistryEntryId);
4
85
  register(spec, handler) {
5
86
  const key = formatCommandId(spec.id);
6
- if (this.entries.some((e) => formatCommandId(e.id) === key)) {
87
+ if (this.graph.lookup(spec.id)) {
7
88
  throw new CliError({
8
89
  exitCode: 1,
9
90
  code: "E_INTERNAL",
10
91
  message: `Duplicate command id registered: ${key}`,
11
92
  });
12
93
  }
13
- this.entries.push({
14
- id: spec.id,
94
+ this.graph.add({
15
95
  spec: spec,
16
96
  handler: handler,
17
97
  });
18
98
  }
19
99
  list() {
20
- return this.entries;
100
+ return this.graph.list();
21
101
  }
22
102
  match(tokens) {
23
- // Longest-prefix match by id segments.
24
- let best = null;
25
- for (const e of this.entries) {
26
- const id = e.id;
27
- if (tokens.length < id.length)
28
- continue;
29
- let ok = true;
30
- for (const [i, seg] of id.entries()) {
31
- if (tokens[i] !== seg) {
32
- ok = false;
33
- break;
34
- }
35
- }
36
- if (!ok)
37
- continue;
38
- if (!best || id.length > best.consumed) {
39
- best = { spec: e.spec, handler: e.handler, consumed: id.length };
40
- }
41
- }
42
- return best;
103
+ const match = this.graph.match(tokens);
104
+ return match
105
+ ? { spec: match.value.spec, handler: match.value.handler, consumed: match.consumed }
106
+ : null;
107
+ }
108
+ lookup(id) {
109
+ return this.graph.lookup(id);
110
+ }
111
+ directChildren(parentId = []) {
112
+ return this.graph.directChildren(parentId);
113
+ }
114
+ directChildSegments(parentId = []) {
115
+ return this.graph.directChildSegments(parentId);
43
116
  }
44
117
  }
45
118
  export function formatCommandId(id) {
@@ -1,14 +1,12 @@
1
1
  import type { CommandCtx, CommandSpec } from "../../cli/spec/spec.js";
2
+ import { type GroupCommandParsed } from "../../cli/group-command.js";
2
3
  import type { CommandContext } from "../shared/task-backend.js";
3
4
  import { type BackendInspectParsed, type BackendMigrateCanonicalStateParsed, type BackendSyncParsed } from "../backend.js";
4
- type BackendRootParsed = {
5
- cmd: string[];
6
- };
7
- export declare const backendSpec: CommandSpec<BackendRootParsed>;
5
+ export declare const backendSpec: CommandSpec<GroupCommandParsed>;
8
6
  export declare const backendSyncSpec: CommandSpec<BackendSyncParsed>;
9
7
  export declare const backendMigrateCanonicalStateSpec: CommandSpec<BackendMigrateCanonicalStateParsed>;
10
8
  export declare const backendInspectSpec: CommandSpec<BackendInspectParsed>;
11
- declare function runBackendRootGroup(_ctx: CommandCtx, p: BackendRootParsed): Promise<number>;
9
+ declare function runBackendRootGroup(_ctx: CommandCtx, p: GroupCommandParsed): Promise<number>;
12
10
  export declare function makeRunBackendHandler(_getCtx: (cmd: string) => Promise<CommandContext>): typeof runBackendRootGroup;
13
11
  export declare function makeRunBackendSyncHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: BackendSyncParsed) => Promise<number>;
14
12
  export declare function makeRunBackendInspectHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: BackendInspectParsed) => Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"sync.command.d.ts","sourceRoot":"","sources":["../../../src/commands/backend/sync.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAItE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,kCAAkC,EACvC,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,KAAK,iBAAiB,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3C,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAStD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,iBAAiB,CAuC1D,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,WAAW,CAAC,kCAAkC,CAoB5F,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,oBAAoB,CAoBhE,CAAC;AAEF,iBAAS,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUpF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,8BAEtF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAC1E,KAAK,UAAU,EAAE,GAAG,iBAAiB,KAAG,OAAO,CAAC,MAAM,CAAC,CAStE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAC7E,KAAK,UAAU,EAAE,GAAG,oBAAoB,KAAG,OAAO,CAAC,MAAM,CAAC,CASzE;AAED,wBAAgB,0CAA0C,CACxD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAElC,KAAK,UAAU,EAAE,GAAG,kCAAkC,KAAG,OAAO,CAAC,MAAM,CAAC,CASvF"}
1
+ {"version":3,"file":"sync.command.d.ts","sourceRoot":"","sources":["../../../src/commands/backend/sync.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,kCAAkC,EACvC,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,kBAAkB,CASvD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,iBAAiB,CAuC1D,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,WAAW,CAAC,kCAAkC,CAoB5F,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,oBAAoB,CAoBhE,CAAC;AAEF,iBAAe,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ3F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,8BAEtF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAC1E,KAAK,UAAU,EAAE,GAAG,iBAAiB,KAAG,OAAO,CAAC,MAAM,CAAC,CAStE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAC7E,KAAK,UAAU,EAAE,GAAG,oBAAoB,KAAG,OAAO,CAAC,MAAM,CAAC,CASzE;AAED,wBAAgB,0CAA0C,CACxD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IAElC,KAAK,UAAU,EAAE,GAAG,kCAAkC,KAAG,OAAO,CAAC,MAAM,CAAC,CASvF"}
@@ -1,6 +1,5 @@
1
1
  import { COMMAND_SNIPPETS } from "../../cli/command-snippets.js";
2
- import { usageError } from "../../cli/spec/errors.js";
3
- import { suggestOne } from "../../cli/spec/suggest.js";
2
+ import { loadDirectSubcommandNames, parseGroupCommand, throwGroupCommandUsage, } from "../../cli/group-command.js";
4
3
  import { cmdBackendInspectParsed, cmdBackendMigrateCanonicalStateParsed, cmdBackendSyncParsed, } from "../backend.js";
5
4
  export const backendSpec = {
6
5
  id: ["backend"],
@@ -9,7 +8,7 @@ export const backendSpec = {
9
8
  description: "This is a command group. Use a subcommand such as `agentplane backend sync ...`, `agentplane backend inspect ...`, or `agentplane backend migrate-canonical-state ...`.",
10
9
  args: [{ name: "cmd", required: false, variadic: true, valueHint: "<cmd>" }],
11
10
  examples: [{ cmd: COMMAND_SNIPPETS.backendSync.pullLocal, why: "Sync the backend." }],
12
- parse: (raw) => ({ cmd: (raw.args.cmd ?? []) }),
11
+ parse: (raw) => parseGroupCommand(raw),
13
12
  };
14
13
  export const backendSyncSpec = {
15
14
  id: ["backend", "sync"],
@@ -93,15 +92,13 @@ export const backendInspectSpec = {
93
92
  quiet: raw.opts.quiet === true,
94
93
  }),
95
94
  };
96
- function runBackendRootGroup(_ctx, p) {
97
- const input = p.cmd.join(" ");
98
- const suggestion = suggestOne(input, ["sync", "inspect", "migrate-canonical-state"]);
99
- const suffix = suggestion ? ` Did you mean: ${suggestion}?` : "";
100
- const msg = p.cmd.length === 0 ? "Missing subcommand." : `Unknown subcommand: ${p.cmd[0]}.`;
101
- throw usageError({
102
- spec: backendSyncSpec,
103
- message: `${msg}${suffix}`,
104
- context: { command: "backend sync" },
95
+ async function runBackendRootGroup(_ctx, p) {
96
+ throwGroupCommandUsage({
97
+ spec: backendSpec,
98
+ cmd: p.cmd,
99
+ subcommands: await loadDirectSubcommandNames(["backend"]),
100
+ command: "backend",
101
+ contextCommand: "backend",
105
102
  });
106
103
  }
107
104
  export function makeRunBackendHandler(_getCtx) {
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/commands/backend.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGnF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;IAC7D,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;IAC7D,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyClB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyClB;AAED,wBAAsB,qCAAqC,CAAC,IAAI,EAAE;IAChE,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,kCAAkC,CAAC;CAC3C,GAAG,OAAO,CAAC,MAAM,CAAC,CA2DlB;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,oBAAoB,CAAC;CAC7B,GAAG,OAAO,CAAC,MAAM,CAAC,CAkElB"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/commands/backend.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAInF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;IAC7D,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,GAAG,MAAM,CAAC;IAC7D,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyClB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyClB;AAED,wBAAsB,qCAAqC,CAAC,IAAI,EAAE;IAChE,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,kCAAkC,CAAC;CAC3C,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDlB;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,oBAAoB,CAAC;CAC7B,GAAG,OAAO,CAAC,MAAM,CAAC,CAgElB"}
@@ -1,8 +1,9 @@
1
- import { backendNotSupportedMessage, successMessage, warnMessage } from "../cli/output.js";
1
+ import { backendNotSupportedMessage, createCliEmitter } from "../cli/output.js";
2
2
  import { mapBackendError } from "../cli/error-map.js";
3
3
  import { CliError } from "../shared/errors.js";
4
4
  import { loadCommandContext } from "./shared/task-backend.js";
5
5
  import { ensureNetworkApproved } from "./shared/network-approval.js";
6
+ const output = createCliEmitter();
6
7
  export async function cmdBackendSyncParsed(opts) {
7
8
  try {
8
9
  const ctx = opts.ctx ??
@@ -123,11 +124,11 @@ export async function cmdBackendMigrateCanonicalStateParsed(opts) {
123
124
  }
124
125
  const result = await backend.migrateCanonicalState();
125
126
  if (!opts.flags.quiet) {
126
- process.stdout.write(`${successMessage("backend migrate-canonical-state", undefined, `scanned=${result.scanned} migrated=${result.migrated.length} skipped-structured=${result.skippedStructured.length} skipped-no-doc=${result.skippedNoDoc.length} failed=${result.failed.length}`)}\n`);
127
+ output.success("backend migrate-canonical-state", undefined, `scanned=${result.scanned} migrated=${result.migrated.length} skipped-structured=${result.skippedStructured.length} skipped-no-doc=${result.skippedNoDoc.length} failed=${result.failed.length}`);
127
128
  }
128
129
  if (result.failed.length > 0) {
129
130
  for (const failure of result.failed.slice(0, 20)) {
130
- process.stderr.write(`${warnMessage(`backend migrate-canonical-state failed for ${failure.taskId}: ${failure.reason}`)}\n`);
131
+ output.warn(`backend migrate-canonical-state failed for ${failure.taskId}: ${failure.reason}`);
131
132
  }
132
133
  return 1;
133
134
  }
@@ -182,13 +183,13 @@ export async function cmdBackendInspectParsed(opts) {
182
183
  ? "missing"
183
184
  : `visible-unconfigured:${result.canonicalState.visibleFieldId}`
184
185
  : `configured:${result.canonicalState.configuredFieldId}`;
185
- process.stdout.write(`${successMessage("backend inspect", undefined, `visible-fields=${result.visibleCustomFields.length} canonical-state=${canonicalStateSummary} drift=${result.configuredFieldNameDrift.length}`)}\n`);
186
- process.stdout.write(`canonical_state configured=${result.canonicalState.configuredFieldId ?? "unset"} visible=${result.canonicalState.visibleFieldId ?? "absent"}\n`);
186
+ output.success("backend inspect", undefined, `visible-fields=${result.visibleCustomFields.length} canonical-state=${canonicalStateSummary} drift=${result.configuredFieldNameDrift.length}`);
187
+ output.line(`canonical_state configured=${result.canonicalState.configuredFieldId ?? "unset"} visible=${result.canonicalState.visibleFieldId ?? "absent"}`);
187
188
  for (const drift of result.configuredFieldNameDrift) {
188
- process.stdout.write(`drift key=${drift.key} configured-id=${drift.configuredId} visible-name=${JSON.stringify(drift.visibleName)}\n`);
189
+ output.line(`drift key=${drift.key} configured-id=${drift.configuredId} visible-name=${JSON.stringify(drift.visibleName)}`);
189
190
  }
190
191
  for (const field of result.visibleCustomFields) {
191
- process.stdout.write(`field id=${field.id} name=${JSON.stringify(field.name)} non-empty=${field.nonEmptyCount}\n`);
192
+ output.line(`field id=${field.id} name=${JSON.stringify(field.name)} non-empty=${field.nonEmptyCount}`);
192
193
  }
193
194
  return 0;
194
195
  }
@@ -1,7 +1,6 @@
1
1
  import type { CommandHandler, CommandSpec } from "../../cli/spec/spec.js";
2
- type BranchBaseGroupParsed = {
3
- cmd: string[];
4
- };
2
+ import { type GroupCommandParsed } from "../../cli/group-command.js";
3
+ type BranchBaseGroupParsed = GroupCommandParsed;
5
4
  export declare const branchBaseSpec: CommandSpec<BranchBaseGroupParsed>;
6
5
  export declare const branchBaseGetSpec: CommandSpec<Record<string, never>>;
7
6
  export declare const branchBaseClearSpec: CommandSpec<Record<string, never>>;
@@ -1 +1 @@
1
- {"version":3,"file":"base.command.d.ts","sourceRoot":"","sources":["../../../src/commands/branch/base.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAW1E,KAAK,qBAAqB,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE/C,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,qBAAqB,CAa7D,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAKhE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAKlE,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAKpE,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,mBAAmB,CA4C9D,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,qBAAqB,CAc/D,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAElE,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAEpE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAEtE,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,mBAAmB,CAOhE,CAAC"}
1
+ {"version":3,"file":"base.command.d.ts","sourceRoot":"","sources":["../../../src/commands/branch/base.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AAUpC,KAAK,qBAAqB,GAAG,kBAAkB,CAAC;AAEhD,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,qBAAqB,CAa7D,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAKhE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAKlE,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAKpE,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,mBAAmB,CA4C9D,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,qBAAqB,CAQ/D,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAElE,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAEpE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAEtE,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,mBAAmB,CAOhE,CAAC"}