agentplane 0.3.17 → 0.3.18

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 (639) hide show
  1. package/assets/policy/incidents.md +1 -0
  2. package/dist/.build-manifest.json +683 -593
  3. package/dist/adapters/git/git-context-adapter.d.ts +1 -1
  4. package/dist/adapters/git/git-context-adapter.d.ts.map +1 -1
  5. package/dist/agents/agents-template.d.ts.map +1 -1
  6. package/dist/agents/agents-template.js +23 -9
  7. package/dist/backends/task-backend/load.d.ts +2 -1
  8. package/dist/backends/task-backend/load.d.ts.map +1 -1
  9. package/dist/backends/task-backend/load.js +2 -1
  10. package/dist/backends/task-backend/local-backend-doc.d.ts.map +1 -1
  11. package/dist/backends/task-backend/local-backend-doc.js +2 -1
  12. package/dist/backends/task-backend/local-backend-read.d.ts.map +1 -1
  13. package/dist/backends/task-backend/local-backend-read.js +2 -1
  14. package/dist/backends/task-backend/local-backend-state.d.ts +1 -1
  15. package/dist/backends/task-backend/local-backend-state.d.ts.map +1 -1
  16. package/dist/backends/task-backend/local-backend-write.d.ts.map +1 -1
  17. package/dist/backends/task-backend/local-backend-write.js +2 -1
  18. package/dist/backends/task-backend/redmine/backend-cache-doc.js +1 -1
  19. package/dist/backends/task-backend/redmine/backend-report.js +1 -1
  20. package/dist/backends/task-backend/redmine/backend-sync/migration.js +1 -1
  21. package/dist/backends/task-backend/redmine/backend-sync/status.d.ts.map +1 -1
  22. package/dist/backends/task-backend/redmine/backend-sync/status.js +2 -1
  23. package/dist/backends/task-backend/redmine/backend-sync/write.js +1 -1
  24. package/dist/backends/task-backend/redmine/mapping.d.ts +1 -1
  25. package/dist/backends/task-backend/redmine/mapping.d.ts.map +1 -1
  26. package/dist/backends/task-backend/redmine/mapping.js +2 -2
  27. package/dist/backends/task-backend/redmine/parse.d.ts +1 -1
  28. package/dist/backends/task-backend/redmine/parse.d.ts.map +1 -1
  29. package/dist/backends/task-backend/redmine/state.js +1 -1
  30. package/dist/backends/task-backend/shared/constants.d.ts +1 -1
  31. package/dist/backends/task-backend/shared/constants.d.ts.map +1 -1
  32. package/dist/backends/task-backend/shared/constants.js +1 -1
  33. package/dist/backends/task-backend/shared/doc.js +1 -1
  34. package/dist/backends/task-backend/shared/export.d.ts +1 -1
  35. package/dist/backends/task-backend/shared/export.d.ts.map +1 -1
  36. package/dist/backends/task-backend/shared/export.js +3 -14
  37. package/dist/backends/task-backend/shared/id.js +1 -1
  38. package/dist/backends/task-backend/shared/record.d.ts +1 -1
  39. package/dist/backends/task-backend/shared/record.d.ts.map +1 -1
  40. package/dist/backends/task-backend/shared/record.js +2 -3
  41. package/dist/backends/task-backend/shared/types.d.ts +2 -2
  42. package/dist/backends/task-backend/shared/types.d.ts.map +1 -1
  43. package/dist/cli/archive.d.ts.map +1 -1
  44. package/dist/cli/archive.js +1 -1
  45. package/dist/cli/group-command.d.ts +1 -0
  46. package/dist/cli/group-command.d.ts.map +1 -1
  47. package/dist/cli/group-command.js +7 -3
  48. package/dist/cli/output.d.ts +1 -1
  49. package/dist/cli/output.d.ts.map +1 -1
  50. package/dist/cli/output.js +1 -1
  51. package/dist/cli/prompts.d.ts.map +1 -1
  52. package/dist/cli/prompts.js +8 -6
  53. package/dist/cli/run-cli/command-catalog/core.d.ts +1 -1
  54. package/dist/cli/run-cli/command-catalog/core.js +8 -8
  55. package/dist/cli/run-cli/command-catalog/{shared.d.ts → kernel.d.ts} +3 -2
  56. package/dist/cli/run-cli/command-catalog/kernel.d.ts.map +1 -0
  57. package/dist/cli/run-cli/command-catalog/lifecycle.d.ts +1 -1
  58. package/dist/cli/run-cli/command-catalog/lifecycle.js +3 -3
  59. package/dist/cli/run-cli/command-catalog/project.d.ts +1 -1
  60. package/dist/cli/run-cli/command-catalog/project.js +4 -4
  61. package/dist/cli/run-cli/command-catalog/task.d.ts +1 -1
  62. package/dist/cli/run-cli/command-catalog/task.js +3 -3
  63. package/dist/cli/run-cli/command-catalog.d.ts +2 -2
  64. package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
  65. package/dist/cli/run-cli/command-catalog.js +2 -0
  66. package/dist/cli/run-cli/command-loaders/core.d.ts +55 -0
  67. package/dist/cli/run-cli/command-loaders/core.d.ts.map +1 -0
  68. package/dist/cli/run-cli/command-loaders/core.js +27 -0
  69. package/dist/cli/run-cli/command-loaders/lifecycle.d.ts +19 -0
  70. package/dist/cli/run-cli/command-loaders/lifecycle.d.ts.map +1 -0
  71. package/dist/cli/run-cli/command-loaders/lifecycle.js +18 -0
  72. package/dist/cli/run-cli/command-loaders/project.d.ts +37 -0
  73. package/dist/cli/run-cli/command-loaders/project.d.ts.map +1 -0
  74. package/dist/cli/run-cli/command-loaders/project.js +36 -0
  75. package/dist/cli/run-cli/command-loaders/task.d.ts +65 -0
  76. package/dist/cli/run-cli/command-loaders/task.d.ts.map +1 -0
  77. package/dist/cli/run-cli/command-loaders/task.js +50 -0
  78. package/dist/cli/run-cli/commands/codex.d.ts +1 -1
  79. package/dist/cli/run-cli/commands/codex.d.ts.map +1 -1
  80. package/dist/cli/run-cli/commands/config.d.ts +1 -1
  81. package/dist/cli/run-cli/commands/config.d.ts.map +1 -1
  82. package/dist/cli/run-cli/commands/config.js +1 -1
  83. package/dist/cli/run-cli/commands/core/agent-profiles.js +1 -1
  84. package/dist/cli/run-cli/commands/core/agents.d.ts +1 -1
  85. package/dist/cli/run-cli/commands/core/agents.d.ts.map +1 -1
  86. package/dist/cli/run-cli/commands/core/preflight.d.ts.map +1 -1
  87. package/dist/cli/run-cli/commands/core/preflight.js +3 -2
  88. package/dist/cli/run-cli/commands/ide.d.ts +1 -1
  89. package/dist/cli/run-cli/commands/ide.d.ts.map +1 -1
  90. package/dist/cli/run-cli/commands/init/model.d.ts +2 -1
  91. package/dist/cli/run-cli/commands/init/model.d.ts.map +1 -1
  92. package/dist/cli/run-cli/commands/init/orchestrate-v2.d.ts +9 -0
  93. package/dist/cli/run-cli/commands/init/orchestrate-v2.d.ts.map +1 -0
  94. package/dist/cli/run-cli/commands/init/orchestrate-v2.js +265 -0
  95. package/dist/cli/run-cli/commands/init/orchestrate.d.ts.map +1 -1
  96. package/dist/cli/run-cli/commands/init/orchestrate.js +19 -23
  97. package/dist/cli/run-cli/commands/init/prompts-v2.d.ts +10 -0
  98. package/dist/cli/run-cli/commands/init/prompts-v2.d.ts.map +1 -0
  99. package/dist/cli/run-cli/commands/init/prompts-v2.js +26 -0
  100. package/dist/cli/run-cli/commands/init/recipes.d.ts +2 -1
  101. package/dist/cli/run-cli/commands/init/recipes.d.ts.map +1 -1
  102. package/dist/cli/run-cli/commands/init/recipes.js +3 -1
  103. package/dist/cli/run-cli/commands/init/spec.d.ts.map +1 -1
  104. package/dist/cli/run-cli/commands/init/spec.js +14 -0
  105. package/dist/cli/run-cli/commands/init/steps/advanced-settings.d.ts +9 -0
  106. package/dist/cli/run-cli/commands/init/steps/advanced-settings.d.ts.map +1 -0
  107. package/dist/cli/run-cli/commands/init/steps/advanced-settings.js +48 -0
  108. package/dist/cli/run-cli/commands/init/steps/apply.d.ts +30 -0
  109. package/dist/cli/run-cli/commands/init/steps/apply.d.ts.map +1 -0
  110. package/dist/cli/run-cli/commands/init/steps/apply.js +96 -0
  111. package/dist/cli/run-cli/commands/init/steps/backend.d.ts +8 -0
  112. package/dist/cli/run-cli/commands/init/steps/backend.d.ts.map +1 -0
  113. package/dist/cli/run-cli/commands/init/steps/backend.js +17 -0
  114. package/dist/cli/run-cli/commands/init/steps/conflict-resolver.d.ts +10 -0
  115. package/dist/cli/run-cli/commands/init/steps/conflict-resolver.d.ts.map +1 -0
  116. package/dist/cli/run-cli/commands/init/steps/conflict-resolver.js +41 -0
  117. package/dist/cli/run-cli/commands/init/steps/contracts.d.ts +57 -0
  118. package/dist/cli/run-cli/commands/init/steps/contracts.d.ts.map +1 -0
  119. package/dist/cli/run-cli/commands/init/steps/contracts.js +1 -0
  120. package/dist/cli/run-cli/commands/init/steps/ide.d.ts +8 -0
  121. package/dist/cli/run-cli/commands/init/steps/ide.d.ts.map +1 -0
  122. package/dist/cli/run-cli/commands/init/steps/ide.js +18 -0
  123. package/dist/cli/run-cli/commands/init/steps/index.d.ts +10 -0
  124. package/dist/cli/run-cli/commands/init/steps/index.d.ts.map +1 -0
  125. package/dist/cli/run-cli/commands/init/steps/index.js +9 -0
  126. package/dist/cli/run-cli/commands/init/steps/policy-gateway.d.ts +8 -0
  127. package/dist/cli/run-cli/commands/init/steps/policy-gateway.d.ts.map +1 -0
  128. package/dist/cli/run-cli/commands/init/steps/policy-gateway.js +17 -0
  129. package/dist/cli/run-cli/commands/init/steps/prompt-utils.d.ts +21 -0
  130. package/dist/cli/run-cli/commands/init/steps/prompt-utils.d.ts.map +1 -0
  131. package/dist/cli/run-cli/commands/init/steps/prompt-utils.js +36 -0
  132. package/dist/cli/run-cli/commands/init/steps/recipe-selection.d.ts +15 -0
  133. package/dist/cli/run-cli/commands/init/steps/recipe-selection.d.ts.map +1 -0
  134. package/dist/cli/run-cli/commands/init/steps/recipe-selection.js +35 -0
  135. package/dist/cli/run-cli/commands/init/steps/setup-profile.d.ts +8 -0
  136. package/dist/cli/run-cli/commands/init/steps/setup-profile.d.ts.map +1 -0
  137. package/dist/cli/run-cli/commands/init/steps/setup-profile.js +32 -0
  138. package/dist/cli/run-cli/commands/init/steps/workflow.d.ts +9 -0
  139. package/dist/cli/run-cli/commands/init/steps/workflow.d.ts.map +1 -0
  140. package/dist/cli/run-cli/commands/init/steps/workflow.js +48 -0
  141. package/dist/cli/run-cli/commands/init/ui-v2.d.ts +17 -0
  142. package/dist/cli/run-cli/commands/init/ui-v2.d.ts.map +1 -0
  143. package/dist/cli/run-cli/commands/init/ui-v2.js +39 -0
  144. package/dist/cli/run-cli/commands/init/write-agents.d.ts.map +1 -1
  145. package/dist/cli/run-cli/commands/init/write-agents.js +1 -1
  146. package/dist/cli/run-cli/commands/init/write-config.d.ts +2 -1
  147. package/dist/cli/run-cli/commands/init/write-config.d.ts.map +1 -1
  148. package/dist/cli/run-cli/commands/init/write-config.js +1 -1
  149. package/dist/cli/run-cli/registry.run.d.ts +1 -1
  150. package/dist/cli/run-cli/registry.run.d.ts.map +1 -1
  151. package/dist/cli/run-cli.d.ts.map +1 -1
  152. package/dist/cli/run-cli.js +2 -1
  153. package/dist/cli.js +677 -4
  154. package/dist/commands/branch/base.js +3 -1
  155. package/dist/commands/branch/cleanup-merged.d.ts.map +1 -1
  156. package/dist/commands/branch/cleanup-merged.js +4 -5
  157. package/dist/commands/branch/remove.d.ts.map +1 -1
  158. package/dist/commands/branch/remove.js +4 -2
  159. package/dist/commands/branch/status.d.ts.map +1 -1
  160. package/dist/commands/branch/status.js +3 -3
  161. package/dist/commands/branch/work-start.d.ts.map +1 -1
  162. package/dist/commands/branch/work-start.direct.d.ts.map +1 -1
  163. package/dist/commands/branch/work-start.direct.js +2 -1
  164. package/dist/commands/branch/work-start.git.d.ts +1 -1
  165. package/dist/commands/branch/work-start.git.d.ts.map +1 -1
  166. package/dist/commands/branch/work-start.git.js +2 -2
  167. package/dist/commands/branch/work-start.js +2 -1
  168. package/dist/commands/branch/work-start.materialize.d.ts.map +1 -1
  169. package/dist/commands/branch/work-start.materialize.js +2 -0
  170. package/dist/commands/codex/plugin-install.d.ts.map +1 -1
  171. package/dist/commands/codex/plugin-install.js +2 -1
  172. package/dist/commands/commit.command.js +1 -1
  173. package/dist/commands/doctor/archive.d.ts.map +1 -1
  174. package/dist/commands/doctor/archive.js +4 -3
  175. package/dist/commands/doctor/runtime.d.ts +1 -1
  176. package/dist/commands/doctor/runtime.d.ts.map +1 -1
  177. package/dist/commands/doctor/workflow.js +1 -1
  178. package/dist/commands/doctor/workspace.d.ts.map +1 -1
  179. package/dist/commands/doctor/workspace.js +7 -9
  180. package/dist/commands/doctor.run.d.ts.map +1 -1
  181. package/dist/commands/doctor.run.js +2 -1
  182. package/dist/commands/finish.run.js +1 -1
  183. package/dist/commands/guard/commit.command.d.ts +3 -16
  184. package/dist/commands/guard/commit.command.d.ts.map +1 -1
  185. package/dist/commands/guard/commit.command.js +1 -132
  186. package/dist/commands/guard/commit.spec.d.ts +17 -0
  187. package/dist/commands/guard/commit.spec.d.ts.map +1 -0
  188. package/dist/commands/guard/commit.spec.js +132 -0
  189. package/dist/commands/guard/impl/allow.js +2 -2
  190. package/dist/commands/guard/impl/close-dirt.d.ts.map +1 -1
  191. package/dist/commands/guard/impl/close-dirt.js +2 -3
  192. package/dist/commands/guard/impl/close-message.d.ts.map +1 -1
  193. package/dist/commands/guard/impl/close-message.js +5 -3
  194. package/dist/commands/guard/impl/comment-commit.d.ts +1 -1
  195. package/dist/commands/guard/impl/comment-commit.d.ts.map +1 -1
  196. package/dist/commands/guard/impl/comment-commit.js +1 -1
  197. package/dist/commands/guard/impl/commit.d.ts.map +1 -1
  198. package/dist/commands/guard/impl/commit.js +3 -2
  199. package/dist/commands/guard/impl/env.js +1 -1
  200. package/dist/commands/guard/impl/policy.js +1 -1
  201. package/dist/commands/guard/index.d.ts +3 -2
  202. package/dist/commands/guard/index.d.ts.map +1 -1
  203. package/dist/commands/guard/index.js +3 -2
  204. package/dist/commands/hooks/index.d.ts +1 -1
  205. package/dist/commands/hooks/index.d.ts.map +1 -1
  206. package/dist/commands/hooks/install.js +1 -1
  207. package/dist/commands/hooks/run.commit-msg.d.ts.map +1 -1
  208. package/dist/commands/hooks/run.commit-msg.js +3 -2
  209. package/dist/commands/hooks/run.post-merge.js +1 -1
  210. package/dist/commands/hooks/run.pre-commit.d.ts.map +1 -1
  211. package/dist/commands/hooks/run.pre-commit.js +3 -2
  212. package/dist/commands/hooks/run.pre-push.d.ts.map +1 -1
  213. package/dist/commands/hooks/run.pre-push.js +4 -3
  214. package/dist/commands/incidents/shared.d.ts +1 -2
  215. package/dist/commands/incidents/shared.d.ts.map +1 -1
  216. package/dist/commands/incidents/shared.js +2 -2
  217. package/dist/commands/integrate.command.d.ts +2 -11
  218. package/dist/commands/integrate.command.d.ts.map +1 -1
  219. package/dist/commands/integrate.command.js +1 -45
  220. package/dist/commands/integrate.spec.d.ts +12 -0
  221. package/dist/commands/integrate.spec.d.ts.map +1 -0
  222. package/dist/commands/integrate.spec.js +44 -0
  223. package/dist/commands/pr/check.js +1 -1
  224. package/dist/commands/pr/integrate/artifacts.js +1 -1
  225. package/dist/commands/pr/integrate/cmd.d.ts.map +1 -1
  226. package/dist/commands/pr/integrate/cmd.js +2 -1
  227. package/dist/commands/pr/integrate/internal/cleanup.d.ts +1 -1
  228. package/dist/commands/pr/integrate/internal/cleanup.d.ts.map +1 -1
  229. package/dist/commands/pr/integrate/internal/cleanup.js +1 -1
  230. package/dist/commands/pr/integrate/internal/finalize.d.ts.map +1 -1
  231. package/dist/commands/pr/integrate/internal/finalize.js +3 -2
  232. package/dist/commands/pr/integrate/internal/merge.js +3 -2
  233. package/dist/commands/pr/integrate/internal/post-integrate-bootstrap.d.ts +2 -1
  234. package/dist/commands/pr/integrate/internal/post-integrate-bootstrap.d.ts.map +1 -1
  235. package/dist/commands/pr/integrate/internal/post-integrate-bootstrap.js +1 -1
  236. package/dist/commands/pr/integrate/internal/pre-integrate-bootstrap.d.ts +2 -1
  237. package/dist/commands/pr/integrate/internal/pre-integrate-bootstrap.d.ts.map +1 -1
  238. package/dist/commands/pr/integrate/internal/pre-integrate-bootstrap.js +1 -1
  239. package/dist/commands/pr/integrate/internal/prepare.d.ts +2 -1
  240. package/dist/commands/pr/integrate/internal/prepare.d.ts.map +1 -1
  241. package/dist/commands/pr/integrate/internal/prepare.js +1 -3
  242. package/dist/commands/pr/integrate/internal/worktree.d.ts +2 -1
  243. package/dist/commands/pr/integrate/internal/worktree.d.ts.map +1 -1
  244. package/dist/commands/pr/integrate/internal/worktree.js +2 -2
  245. package/dist/commands/pr/internal/auto-commit.js +3 -3
  246. package/dist/commands/pr/internal/gh-api.js +2 -2
  247. package/dist/commands/pr/internal/pr-paths.d.ts +1 -1
  248. package/dist/commands/pr/internal/pr-paths.d.ts.map +1 -1
  249. package/dist/commands/pr/internal/pr-paths.js +3 -2
  250. package/dist/commands/pr/internal/review-template.js +1 -1
  251. package/dist/commands/pr/internal/sync-branch.d.ts.map +1 -1
  252. package/dist/commands/pr/internal/sync-branch.js +3 -4
  253. package/dist/commands/pr/internal/sync-github.js +1 -1
  254. package/dist/commands/pr/internal/sync-support.js +1 -1
  255. package/dist/commands/pr/internal/sync.d.ts.map +1 -1
  256. package/dist/commands/pr/internal/sync.js +2 -2
  257. package/dist/commands/pr/note.d.ts.map +1 -1
  258. package/dist/commands/pr/note.js +1 -1
  259. package/dist/commands/pr/open.d.ts.map +1 -1
  260. package/dist/commands/pr/open.js +2 -1
  261. package/dist/commands/pr/pr.command.d.ts +3 -37
  262. package/dist/commands/pr/pr.command.d.ts.map +1 -1
  263. package/dist/commands/pr/pr.command.js +9 -211
  264. package/dist/commands/pr/pr.spec.d.ts +38 -0
  265. package/dist/commands/pr/pr.spec.d.ts.map +1 -0
  266. package/dist/commands/pr/pr.spec.js +210 -0
  267. package/dist/commands/recipes/active.command.js +1 -1
  268. package/dist/commands/recipes/add.command.js +1 -1
  269. package/dist/commands/recipes/cache-prune.command.d.ts +1 -1
  270. package/dist/commands/recipes/cache-prune.command.d.ts.map +1 -1
  271. package/dist/commands/recipes/cache-prune.command.js +1 -1
  272. package/dist/commands/recipes/detach.command.js +1 -1
  273. package/dist/commands/recipes/disable.command.js +1 -1
  274. package/dist/commands/recipes/enable.command.js +1 -1
  275. package/dist/commands/recipes/explain-active.command.js +1 -1
  276. package/dist/commands/recipes/explain.command.js +1 -1
  277. package/dist/commands/recipes/impl/commands/active.js +1 -1
  278. package/dist/commands/recipes/impl/commands/add.d.ts.map +1 -1
  279. package/dist/commands/recipes/impl/commands/add.js +2 -1
  280. package/dist/commands/recipes/impl/commands/cache-prune.js +1 -1
  281. package/dist/commands/recipes/impl/commands/detach.d.ts.map +1 -1
  282. package/dist/commands/recipes/impl/commands/detach.js +2 -1
  283. package/dist/commands/recipes/impl/commands/disable.js +1 -1
  284. package/dist/commands/recipes/impl/commands/enable.js +1 -1
  285. package/dist/commands/recipes/impl/commands/explain-active.js +1 -1
  286. package/dist/commands/recipes/impl/commands/explain.js +1 -1
  287. package/dist/commands/recipes/impl/commands/install.d.ts.map +1 -1
  288. package/dist/commands/recipes/impl/commands/install.js +2 -1
  289. package/dist/commands/recipes/impl/commands/list-remote.js +1 -1
  290. package/dist/commands/recipes/impl/commands/remove.d.ts.map +1 -1
  291. package/dist/commands/recipes/impl/commands/remove.js +2 -1
  292. package/dist/commands/recipes/impl/commands/update.d.ts.map +1 -1
  293. package/dist/commands/recipes/impl/commands/update.js +2 -1
  294. package/dist/commands/recipes/impl/overlay-project.d.ts.map +1 -1
  295. package/dist/commands/recipes/impl/overlay-project.js +2 -1
  296. package/dist/commands/recipes/impl/project.js +1 -1
  297. package/dist/commands/recipes/impl/resolver.d.ts +1 -1
  298. package/dist/commands/recipes/impl/resolver.d.ts.map +1 -1
  299. package/dist/commands/recipes/info.command.js +1 -1
  300. package/dist/commands/recipes/install.run.js +1 -1
  301. package/dist/commands/recipes/install.spec.d.ts +1 -1
  302. package/dist/commands/recipes/install.spec.d.ts.map +1 -1
  303. package/dist/commands/recipes/list-remote.command.d.ts +1 -1
  304. package/dist/commands/recipes/list-remote.command.d.ts.map +1 -1
  305. package/dist/commands/recipes/list-remote.command.js +1 -1
  306. package/dist/commands/recipes/list.command.d.ts +1 -1
  307. package/dist/commands/recipes/list.command.d.ts.map +1 -1
  308. package/dist/commands/recipes/list.command.js +1 -1
  309. package/dist/commands/recipes/remove.command.js +1 -1
  310. package/dist/commands/recipes/update.command.js +1 -1
  311. package/dist/commands/release/apply.command.d.ts +2 -3
  312. package/dist/commands/release/apply.command.d.ts.map +1 -1
  313. package/dist/commands/release/apply.command.js +4 -137
  314. package/dist/commands/release/apply.mutation.js +4 -3
  315. package/dist/commands/release/apply.pipeline/finalize.d.ts.map +1 -1
  316. package/dist/commands/release/apply.pipeline/finalize.js +2 -1
  317. package/dist/commands/release/apply.pipeline/mutation.d.ts +1 -1
  318. package/dist/commands/release/apply.pipeline/mutation.d.ts.map +1 -1
  319. package/dist/commands/release/apply.pipeline/mutation.js +3 -4
  320. package/dist/commands/release/apply.pipeline/preflight.js +1 -1
  321. package/dist/commands/release/apply.pipeline/state.d.ts.map +1 -1
  322. package/dist/commands/release/apply.pipeline/state.js +2 -1
  323. package/dist/commands/release/apply.pipeline.d.ts +5 -1
  324. package/dist/commands/release/apply.pipeline.d.ts.map +1 -1
  325. package/dist/commands/release/apply.pipeline.js +4 -0
  326. package/dist/commands/release/apply.preflight.d.ts.map +1 -1
  327. package/dist/commands/release/apply.preflight.js +2 -1
  328. package/dist/commands/release/apply.reporting.d.ts.map +1 -1
  329. package/dist/commands/release/apply.reporting.js +2 -1
  330. package/dist/commands/release/apply.spec.d.ts +5 -0
  331. package/dist/commands/release/apply.spec.d.ts.map +1 -0
  332. package/dist/commands/release/apply.spec.js +136 -0
  333. package/dist/commands/release/apply.types.d.ts +1 -1
  334. package/dist/commands/release/apply.types.d.ts.map +1 -1
  335. package/dist/commands/release/plan.command.d.ts +3 -10
  336. package/dist/commands/release/plan.command.d.ts.map +1 -1
  337. package/dist/commands/release/plan.command.js +4 -78
  338. package/dist/commands/release/plan.spec.d.ts +10 -0
  339. package/dist/commands/release/plan.spec.d.ts.map +1 -0
  340. package/dist/commands/release/plan.spec.js +76 -0
  341. package/dist/commands/runtime.command.d.ts +3 -6
  342. package/dist/commands/runtime.command.d.ts.map +1 -1
  343. package/dist/commands/runtime.command.js +5 -32
  344. package/dist/commands/runtime.spec.d.ts +8 -0
  345. package/dist/commands/runtime.spec.d.ts.map +1 -0
  346. package/dist/commands/runtime.spec.js +31 -0
  347. package/dist/commands/scenario/impl/commands.d.ts +1 -1
  348. package/dist/commands/scenario/impl/commands.d.ts.map +1 -1
  349. package/dist/commands/scenario/impl/commands.js +2 -1
  350. package/dist/commands/shared/approval-requirements.d.ts +1 -1
  351. package/dist/commands/shared/approval-requirements.d.ts.map +1 -1
  352. package/dist/commands/shared/comment-format.d.ts +1 -1
  353. package/dist/commands/shared/comment-format.d.ts.map +1 -1
  354. package/dist/commands/shared/git-ops.d.ts +1 -1
  355. package/dist/commands/shared/git-ops.d.ts.map +1 -1
  356. package/dist/commands/shared/git-ops.js +3 -2
  357. package/dist/commands/shared/merged-branch-cleanup.js +2 -2
  358. package/dist/commands/shared/network-approval.d.ts +1 -1
  359. package/dist/commands/shared/network-approval.d.ts.map +1 -1
  360. package/dist/commands/shared/post-commit-pr-artifacts.d.ts.map +1 -1
  361. package/dist/commands/shared/post-commit-pr-artifacts.js +2 -1
  362. package/dist/commands/shared/pr-meta.d.ts +1 -1
  363. package/dist/commands/shared/pr-meta.d.ts.map +1 -1
  364. package/dist/commands/shared/pr-meta.js +2 -2
  365. package/dist/commands/shared/task-backend.d.ts +3 -2
  366. package/dist/commands/shared/task-backend.d.ts.map +1 -1
  367. package/dist/commands/shared/task-backend.js +3 -4
  368. package/dist/commands/shared/task-handoff.d.ts +1 -1
  369. package/dist/commands/shared/task-handoff.d.ts.map +1 -1
  370. package/dist/commands/shared/task-handoff.js +3 -2
  371. package/dist/commands/shared/task-local-freshness.js +1 -1
  372. package/dist/commands/shared/task-store/intents.js +1 -1
  373. package/dist/commands/shared/task-store/readme.d.ts.map +1 -1
  374. package/dist/commands/shared/task-store/readme.js +1 -1
  375. package/dist/commands/shared/task-store/types.d.ts +1 -1
  376. package/dist/commands/shared/task-store/types.d.ts.map +1 -1
  377. package/dist/commands/task/add.command.d.ts +2 -1
  378. package/dist/commands/task/add.command.d.ts.map +1 -1
  379. package/dist/commands/task/add.command.js +2 -1
  380. package/dist/commands/task/close-duplicate.d.ts.map +1 -1
  381. package/dist/commands/task/close-duplicate.js +2 -2
  382. package/dist/commands/task/close-shared.d.ts.map +1 -1
  383. package/dist/commands/task/close-shared.js +2 -1
  384. package/dist/commands/task/close-tail-state.d.ts.map +1 -1
  385. package/dist/commands/task/close-tail-state.js +3 -2
  386. package/dist/commands/task/derive.js +1 -1
  387. package/dist/commands/task/doc-template.js +1 -1
  388. package/dist/commands/task/doc.d.ts.map +1 -1
  389. package/dist/commands/task/doc.js +4 -2
  390. package/dist/commands/task/findings.d.ts +1 -1
  391. package/dist/commands/task/findings.d.ts.map +1 -1
  392. package/dist/commands/task/findings.js +1 -1
  393. package/dist/commands/task/finish-close.js +2 -2
  394. package/dist/commands/task/finish-shared.d.ts.map +1 -1
  395. package/dist/commands/task/finish-shared.js +6 -8
  396. package/dist/commands/task/handoff.shared.d.ts.map +1 -1
  397. package/dist/commands/task/handoff.shared.js +4 -5
  398. package/dist/commands/task/hosted-close-pr.command.d.ts +4 -0
  399. package/dist/commands/task/hosted-close-pr.command.d.ts.map +1 -1
  400. package/dist/commands/task/hosted-close-pr.command.js +4 -0
  401. package/dist/commands/task/hosted-close-pr.precheck.d.ts.map +1 -1
  402. package/dist/commands/task/hosted-close-pr.precheck.js +4 -4
  403. package/dist/commands/task/hosted-close.command.d.ts +3 -6
  404. package/dist/commands/task/hosted-close.command.d.ts.map +1 -1
  405. package/dist/commands/task/hosted-close.command.js +4 -41
  406. package/dist/commands/task/hosted-close.spec.d.ts +7 -0
  407. package/dist/commands/task/hosted-close.spec.d.ts.map +1 -0
  408. package/dist/commands/task/hosted-close.spec.js +39 -0
  409. package/dist/commands/task/hosted-merge-sync/builders.d.ts +1 -1
  410. package/dist/commands/task/hosted-merge-sync/builders.d.ts.map +1 -1
  411. package/dist/commands/task/hosted-merge-sync/builders.js +6 -6
  412. package/dist/commands/task/hosted-merge-sync/github.js +2 -2
  413. package/dist/commands/task/hosted-merge-sync/local-branch.d.ts.map +1 -1
  414. package/dist/commands/task/hosted-merge-sync/local-branch.js +5 -5
  415. package/dist/commands/task/hosted-merge-sync/model.d.ts +1 -1
  416. package/dist/commands/task/hosted-merge-sync/model.d.ts.map +1 -1
  417. package/dist/commands/task/hosted-merge-sync/pr-meta.d.ts +1 -1
  418. package/dist/commands/task/hosted-merge-sync/pr-meta.d.ts.map +1 -1
  419. package/dist/commands/task/index.d.ts +1 -1
  420. package/dist/commands/task/index.d.ts.map +1 -1
  421. package/dist/commands/task/index.js +1 -1
  422. package/dist/commands/task/lint.js +1 -1
  423. package/dist/commands/task/list.d.ts.map +1 -1
  424. package/dist/commands/task/list.js +2 -1
  425. package/dist/commands/task/migrate-doc.d.ts +2 -1
  426. package/dist/commands/task/migrate-doc.d.ts.map +1 -1
  427. package/dist/commands/task/migrate-doc.js +6 -2
  428. package/dist/commands/task/new.d.ts.map +1 -1
  429. package/dist/commands/task/new.js +6 -21
  430. package/dist/commands/task/normalize.d.ts.map +1 -1
  431. package/dist/commands/task/normalize.js +2 -1
  432. package/dist/commands/task/plan.d.ts.map +1 -1
  433. package/dist/commands/task/plan.js +1 -1
  434. package/dist/commands/task/ready.d.ts.map +1 -1
  435. package/dist/commands/task/ready.js +2 -1
  436. package/dist/commands/task/scaffold.d.ts.map +1 -1
  437. package/dist/commands/task/scaffold.js +1 -1
  438. package/dist/commands/task/shared/dependencies.d.ts.map +1 -1
  439. package/dist/commands/task/shared/dependencies.js +4 -3
  440. package/dist/commands/task/shared/docs.d.ts +1 -1
  441. package/dist/commands/task/shared/docs.d.ts.map +1 -1
  442. package/dist/commands/task/shared/docs.js +1 -1
  443. package/dist/commands/task/shared/listing.d.ts.map +1 -1
  444. package/dist/commands/task/shared/listing.js +3 -2
  445. package/dist/commands/task/shared/tags.d.ts +1 -1
  446. package/dist/commands/task/shared/tags.d.ts.map +1 -1
  447. package/dist/commands/task/shared/tags.js +4 -4
  448. package/dist/commands/task/shared/transition-rules.d.ts +28 -0
  449. package/dist/commands/task/shared/transition-rules.d.ts.map +1 -0
  450. package/dist/commands/task/shared/transition-rules.js +96 -0
  451. package/dist/commands/task/shared/transitions.d.ts +2 -27
  452. package/dist/commands/task/shared/transitions.d.ts.map +1 -1
  453. package/dist/commands/task/shared/transitions.js +5 -98
  454. package/dist/commands/task/shared/workflow-transition-service.d.ts +1 -1
  455. package/dist/commands/task/shared/workflow-transition-service.d.ts.map +1 -1
  456. package/dist/commands/task/shared/workflow-transition-service.js +6 -6
  457. package/dist/commands/task/shared.d.ts +2 -1
  458. package/dist/commands/task/shared.d.ts.map +1 -1
  459. package/dist/commands/task/shared.js +2 -1
  460. package/dist/commands/task/show.d.ts.map +1 -1
  461. package/dist/commands/task/show.js +1 -1
  462. package/dist/commands/upgrade/apply.js +3 -2
  463. package/dist/commands/upgrade/materialize.d.ts.map +1 -1
  464. package/dist/commands/upgrade/materialize.js +1 -1
  465. package/dist/commands/upgrade.command.d.ts +3 -4
  466. package/dist/commands/upgrade.command.d.ts.map +1 -1
  467. package/dist/commands/upgrade.command.js +1 -179
  468. package/dist/commands/upgrade.d.ts.map +1 -1
  469. package/dist/commands/upgrade.js +4 -2
  470. package/dist/commands/upgrade.spec.d.ts +5 -0
  471. package/dist/commands/upgrade.spec.d.ts.map +1 -0
  472. package/dist/commands/upgrade.spec.js +179 -0
  473. package/dist/commands/workflow-build.command.d.ts.map +1 -1
  474. package/dist/commands/workflow-build.command.js +2 -1
  475. package/dist/commands/workflow-playbook.command.d.ts +3 -6
  476. package/dist/commands/workflow-playbook.command.d.ts.map +1 -1
  477. package/dist/commands/workflow-playbook.command.js +6 -24
  478. package/dist/commands/workflow-playbook.spec.d.ts +6 -0
  479. package/dist/commands/workflow-playbook.spec.d.ts.map +1 -0
  480. package/dist/commands/workflow-playbook.spec.js +21 -0
  481. package/dist/commands/workflow-restore.command.js +1 -1
  482. package/dist/commands/workflow.d.ts +4 -5
  483. package/dist/commands/workflow.d.ts.map +1 -1
  484. package/dist/commands/workflow.js +4 -5
  485. package/dist/harness/hooks-lifecycle.js +1 -1
  486. package/dist/meta/release.d.ts.map +1 -1
  487. package/dist/meta/release.js +3 -5
  488. package/dist/meta/version.d.ts.map +1 -1
  489. package/dist/meta/version.js +2 -2
  490. package/dist/policy/engine.d.ts +1 -1
  491. package/dist/policy/engine.d.ts.map +1 -1
  492. package/dist/policy/model.d.ts +1 -1
  493. package/dist/policy/model.d.ts.map +1 -1
  494. package/dist/policy/rules/commit-subject.js +1 -1
  495. package/dist/runner/adapters/base.d.ts +1 -1
  496. package/dist/runner/adapters/base.d.ts.map +1 -1
  497. package/dist/runner/adapters/codex.d.ts.map +1 -1
  498. package/dist/runner/adapters/codex.js +35 -113
  499. package/dist/runner/adapters/custom-preparation.d.ts +1 -1
  500. package/dist/runner/adapters/custom-preparation.d.ts.map +1 -1
  501. package/dist/runner/adapters/custom.d.ts +1 -1
  502. package/dist/runner/adapters/custom.d.ts.map +1 -1
  503. package/dist/runner/adapters/custom.js +34 -115
  504. package/dist/runner/adapters/execute-supervised.d.ts +41 -0
  505. package/dist/runner/adapters/execute-supervised.d.ts.map +1 -0
  506. package/dist/runner/adapters/execute-supervised.js +108 -0
  507. package/dist/runner/adapters/index.d.ts +1 -1
  508. package/dist/runner/adapters/index.d.ts.map +1 -1
  509. package/dist/runner/adapters/shared.d.ts +1 -1
  510. package/dist/runner/adapters/shared.d.ts.map +1 -1
  511. package/dist/runner/artifacts.d.ts.map +1 -1
  512. package/dist/runner/artifacts.js +1 -1
  513. package/dist/runner/config.d.ts +1 -1
  514. package/dist/runner/config.d.ts.map +1 -1
  515. package/dist/runner/context/base-prompt-sources.d.ts.map +1 -1
  516. package/dist/runner/context/base-prompt-sources.js +26 -4
  517. package/dist/runner/context/prompt-block-shared.d.ts +1 -1
  518. package/dist/runner/context/prompt-block-shared.d.ts.map +1 -1
  519. package/dist/runner/context/prompt-block-shared.js +8 -2
  520. package/dist/runner/context/recipe-context.d.ts +1 -1
  521. package/dist/runner/context/recipe-context.d.ts.map +1 -1
  522. package/dist/runner/context/task-context.d.ts.map +1 -1
  523. package/dist/runner/context/task-context.js +1 -1
  524. package/dist/runner/process-supervision/buffered-file-writer.d.ts +10 -0
  525. package/dist/runner/process-supervision/buffered-file-writer.d.ts.map +1 -0
  526. package/dist/runner/process-supervision/buffered-file-writer.js +70 -0
  527. package/dist/runner/process-supervision/run.d.ts.map +1 -1
  528. package/dist/runner/process-supervision/run.js +22 -9
  529. package/dist/runner/process-supervision/signals.js +1 -1
  530. package/dist/runner/result-manifest.d.ts.map +1 -1
  531. package/dist/runner/result-manifest.js +1 -1
  532. package/dist/runner/task-state.js +1 -1
  533. package/dist/runner/trace-artifacts.d.ts.map +1 -1
  534. package/dist/runner/trace-artifacts.js +1 -1
  535. package/dist/runner/types.d.ts +2 -2
  536. package/dist/runner/types.d.ts.map +1 -1
  537. package/dist/runner/usecases/scenario-materialize-task.d.ts.map +1 -1
  538. package/dist/runner/usecases/scenario-materialize-task.js +1 -1
  539. package/dist/runner/usecases/task-run-lifecycle-cancel.d.ts.map +1 -1
  540. package/dist/runner/usecases/task-run-lifecycle-cancel.js +2 -1
  541. package/dist/runner/usecases/task-run-lifecycle-shared.d.ts.map +1 -1
  542. package/dist/runner/usecases/task-run-lifecycle-shared.js +3 -7
  543. package/dist/runner/usecases/task-run.d.ts.map +1 -1
  544. package/dist/runner/usecases/task-run.js +2 -3
  545. package/dist/runtime/approvals/model.d.ts +1 -1
  546. package/dist/runtime/approvals/model.d.ts.map +1 -1
  547. package/dist/runtime/approvals/runtime.d.ts +1 -1
  548. package/dist/runtime/approvals/runtime.d.ts.map +1 -1
  549. package/dist/runtime/execution-context.d.ts +2 -1
  550. package/dist/runtime/execution-context.d.ts.map +1 -1
  551. package/dist/runtime/execution-profile/model.d.ts +1 -1
  552. package/dist/runtime/execution-profile/model.d.ts.map +1 -1
  553. package/dist/runtime/execution-profile/resolve.d.ts +1 -1
  554. package/dist/runtime/execution-profile/resolve.d.ts.map +1 -1
  555. package/dist/runtime/execution-profile/resolve.js +1 -1
  556. package/dist/runtime/harness/resolve.d.ts +2 -1
  557. package/dist/runtime/harness/resolve.d.ts.map +1 -1
  558. package/dist/runtime/harness/resolve.js +1 -1
  559. package/dist/runtime/harness/types.d.ts +2 -1
  560. package/dist/runtime/harness/types.d.ts.map +1 -1
  561. package/dist/runtime/incidents/paths.d.ts +3 -0
  562. package/dist/runtime/incidents/paths.d.ts.map +1 -0
  563. package/dist/runtime/incidents/paths.js +2 -0
  564. package/dist/runtime/shared/repo-cli-version.d.ts +1 -1
  565. package/dist/runtime/shared/repo-cli-version.d.ts.map +1 -1
  566. package/dist/runtime/task-intake/types.d.ts +2 -1
  567. package/dist/runtime/task-intake/types.d.ts.map +1 -1
  568. package/dist/shared/package-paths.d.ts +8 -0
  569. package/dist/shared/package-paths.d.ts.map +1 -0
  570. package/dist/shared/package-paths.js +80 -0
  571. package/dist/shared/trace-events.d.ts +1 -1
  572. package/dist/shared/trace-events.d.ts.map +1 -1
  573. package/dist/shared/trace-events.js +1 -1
  574. package/dist/shared/write-if-changed.js +2 -1
  575. package/dist/task-doc/conflicts.js +1 -1
  576. package/dist/task-doc/state.d.ts +2 -2
  577. package/dist/task-doc/state.d.ts.map +1 -1
  578. package/dist/task-doc/state.js +1 -1
  579. package/dist/workflow-runtime/file-ops.js +1 -1
  580. package/dist/workflow-runtime/markdown.js +1 -1
  581. package/dist/workflow-runtime/validate.d.ts +1 -1
  582. package/dist/workflow-runtime/validate.d.ts.map +1 -1
  583. package/package.json +6 -4
  584. package/dist/cli/cli-error.d.ts +0 -9
  585. package/dist/cli/cli-error.d.ts.map +0 -1
  586. package/dist/cli/cli-error.js +0 -13
  587. package/dist/cli/run-cli/command-catalog/shared.d.ts.map +0 -1
  588. package/dist/cli/run-cli/command-loaders.d.ts +0 -170
  589. package/dist/cli/run-cli/command-loaders.d.ts.map +0 -1
  590. package/dist/cli/run-cli/command-loaders.js +0 -128
  591. package/dist/cli/run-cli/commands/init/ui.d.ts +0 -3
  592. package/dist/cli/run-cli/commands/init/ui.d.ts.map +0 -1
  593. package/dist/cli/run-cli/commands/init/ui.js +0 -58
  594. package/dist/cli/run-cli/commands/init.d.ts +0 -2
  595. package/dist/cli/run-cli/commands/init.d.ts.map +0 -1
  596. package/dist/cli/run-cli/commands/init.js +0 -1
  597. package/dist/commands/guard/impl/commands.d.ts +0 -5
  598. package/dist/commands/guard/impl/commands.d.ts.map +0 -1
  599. package/dist/commands/guard/impl/commands.js +0 -4
  600. package/dist/commands/pr/index.d.ts +0 -8
  601. package/dist/commands/pr/index.d.ts.map +0 -1
  602. package/dist/commands/pr/index.js +0 -7
  603. package/dist/commands/pr/integrate.d.ts +0 -2
  604. package/dist/commands/pr/integrate.d.ts.map +0 -1
  605. package/dist/commands/pr/integrate.js +0 -1
  606. package/dist/commands/scenario/execute.command.d.ts +0 -8
  607. package/dist/commands/scenario/execute.command.d.ts.map +0 -1
  608. package/dist/commands/scenario/execute.command.js +0 -117
  609. package/dist/commands/scenario/impl/report.d.ts +0 -38
  610. package/dist/commands/scenario/impl/report.d.ts.map +0 -1
  611. package/dist/commands/scenario/impl/report.js +0 -97
  612. package/dist/commands/scenario/scenario.command.d.ts +0 -5
  613. package/dist/commands/scenario/scenario.command.d.ts.map +0 -1
  614. package/dist/commands/scenario/scenario.command.js +0 -19
  615. package/dist/commands/shared/git-context.d.ts +0 -2
  616. package/dist/commands/shared/git-context.d.ts.map +0 -1
  617. package/dist/commands/shared/git-context.js +0 -1
  618. package/dist/commands/shared/git-diff.d.ts +0 -2
  619. package/dist/commands/shared/git-diff.d.ts.map +0 -1
  620. package/dist/commands/shared/git-diff.js +0 -1
  621. package/dist/commands/shared/git-worktree.d.ts +0 -2
  622. package/dist/commands/shared/git-worktree.d.ts.map +0 -1
  623. package/dist/commands/shared/git-worktree.js +0 -1
  624. package/dist/commands/shared/git.d.ts +0 -2
  625. package/dist/commands/shared/git.d.ts.map +0 -1
  626. package/dist/commands/shared/git.js +0 -1
  627. package/dist/commands/task/finish.d.ts +0 -2
  628. package/dist/commands/task/finish.d.ts.map +0 -1
  629. package/dist/commands/task/finish.js +0 -1
  630. package/dist/harness/index.d.ts +0 -9
  631. package/dist/harness/index.d.ts.map +0 -1
  632. package/dist/harness/index.js +0 -8
  633. package/dist/runner/index.d.ts +0 -12
  634. package/dist/runner/index.d.ts.map +0 -1
  635. package/dist/runner/index.js +0 -11
  636. package/dist/runner/process-supervision.d.ts +0 -6
  637. package/dist/runner/process-supervision.d.ts.map +0 -1
  638. package/dist/runner/process-supervision.js +0 -3
  639. /package/dist/cli/run-cli/command-catalog/{shared.js → kernel.js} +0 -0
package/dist/cli.js CHANGED
@@ -1,5 +1,678 @@
1
1
  #!/usr/bin/env node
2
- import { runCli } from "./cli/run-cli.js";
3
- void runCli(process.argv.slice(2)).then((code) => {
4
- process.exit(code);
5
- });
2
+ import {normalizeTaskStatus,setMarkdownSection,normalizeDocSectionName,normalizeTaskDoc,renderTaskDocFromSections,taskDocToSectionMap,lintTasksFile,ensureDocSections,taskReadmePath,renderTaskReadme,validateTaskDocMetadata,parseTaskStatus,TASK_STATUS_VALUES,applyTaskDocMutations,parseDocSections,resolveTaskDocUpdatedBy,canonicalizeJson,parseTaskReadme,normalizeTaskDocVersion,extractTaskDoc,mergeTaskDoc,renderTaskFrontmatter,docChanged,TASK_ID_ALPHABET,generateTaskId}from'@agentplaneorg/core/tasks';import Rt,{readFile,mkdir,writeFile,rename,copyFile,readdir,realpath,access,rm as rm$1,cp as cp$1,chmod,appendFile,symlink,lstat,stat,readlink,mkdtemp}from'fs/promises';import {atomicWriteFile}from'@agentplaneorg/core/fs';import {randomBytes,createHash,createPublicKey,verify}from'crypto';import Ye from'path';import {validateTaskPrMeta,validateTaskHandoff,validateTaskReadmeFrontmatter,withTaskReadmeFrontmatterDefaults,validateTasksExportSnapshot}from'@agentplaneorg/core/schemas';import {resolveProject}from'@agentplaneorg/core/project';import {loadConfig,applyExecutionToApprovals,buildExecutionProfile,defaultConfig,setByDottedKey,saveConfig}from'@agentplaneorg/core/config';import {isZodErrorLike,fromZodError}from'zod-validation-error/v3';import KE,{readFileSync,existsSync,createReadStream,createWriteStream}from'fs';import {pipeline}from'stream/promises';import {createLogger}from'@agentplaneorg/core/logger';import {GitContext,gitEnv,resolveBaseBranch,gitBranchExists,gitCurrentBranch,gitRevParse,findWorktreeForBranch,gitListBranchesByPrefixes,gitDiffNames,gitBranchUpstream,gitAheadBehind,gitListTaskBranches,parseTaskIdFromBranch,toGitPath,gitShowFile,gitDiffStat,listWorktrees,parseTaskIdFromCloseBranch,gitIsAncestor,setPinnedBaseBranch,getPinnedBaseBranch,clearPinnedBaseBranch,gitInitRepo,resolveInitBaseBranch,gitStagedPaths,gitAddPaths,gitCommit,gitListBranches}from'@agentplaneorg/core/git';import {buildTaskArtifactRefreshCommitSubject,extractTaskSuffix,validateCommitSubject,isTaskArtifactRefreshCommitSubject}from'@agentplaneorg/core/commit';import {createInterface}from'readline/promises';import {createRequire}from'module';import {fileURLToPath,pathToFileURL}from'url';import {execFileAsync,runProcess,runProcessSync,startProcess}from'@agentplaneorg/core/process';import Q$ from'os';import {normalizeRecipeTags,collectRecipeScenarioDetails,DEFAULT_RECIPES_INDEX_URL,INSTALLED_RECIPES_NAME,PROJECT_RECIPES_PACKAGES_DIR_NAME,GLOBAL_RECIPES_DIR_NAME,RECIPES_DIR_NAME,validateCompiledOverlayBundle,RECIPES_REMOTE_INDEX_NAME,validateRecipeManifest,AGENTPLANE_HOME_ENV,PROJECT_RECIPES_REGISTRY_NAME,normalizeRecipeId,createEmptyOverlayBundle,hashOverlayInputs,readRecipeManifest,RECIPES_REMOTE_INDEX_SIG_NAME,RECIPES_INDEX_PUBLIC_KEYS_ENV,RECIPES_INDEX_PUBLIC_KEYS,readScenarioDefinition,matchOverlayWhen}from'@agentplaneorg/recipes';import {Readable}from'stream';import {gzip,gunzip,gunzipSync}from'zlib';import OZ from'yauzl';import {promisify}from'util';import {AsyncLocalStorage}from'async_hooks';var YU=Object.defineProperty;var u=(e,t)=>()=>(e&&(t=e(e=0)),t);var S=(e,t)=>{for(var r in t)YU(e,r,{get:t[r],enumerable:true});};function Qi(e){return typeof e=="string"&&e.trim()?e.trim():void 0}function we(e,t){return {...e?{...e}:{},diagnostic_state:t.state,diagnostic_likely_cause:t.likelyCause,...t.hint?{diagnostic_hint:t.hint}:{},...t.nextAction?{diagnostic_next_action_command:t.nextAction.command,diagnostic_next_action_reason:t.nextAction.reason,...t.nextAction.reasonCode?{diagnostic_next_action_reason_code:t.nextAction.reasonCode}:{}}:{}}}function dT(e){let t=Qi(e?.diagnostic_state),r=Qi(e?.diagnostic_likely_cause),n=Qi(e?.diagnostic_hint),o=Qi(e?.diagnostic_next_action_command),i=Qi(e?.diagnostic_next_action_reason),a=Qi(e?.diagnostic_next_action_reason_code);return {state:t,likelyCause:r,hint:n,nextAction:o&&i?{command:o,reason:i,...a?{reasonCode:a}:{}}:void 0}}function ur(e){let t=[`[${e.severity}] State: ${e.state}`,`Likely cause: ${e.likelyCause}`];if(e.nextAction&&t.push(`Next action: ${e.nextAction.command} (${e.nextAction.reason})`),Array.isArray(e.details)&&e.details.length>0){let[r,...n]=e.details;r&&t.push(`Details: ${r}`);for(let o of n)o.trim()&&t.push(` - ${o}`);}return t.join(`
3
+ `)}var Et=u(()=>{});function lT(e,t){return JSON.stringify({error:{code:e.code,message:e.message,context:e.context??void 0,state:t?.state,likely_cause:t?.likelyCause,hint:t?.hint,next_action:t?.nextAction,reason_decode:t?.reasonDecode}},null,2)}var Vt,Uh,m,Pl,Tl,Xi,Sl,El,Il,Al,v=u(()=>{Vt={E_USAGE:2,E_DEPRECATED_FLAG:2,E_VALIDATION:3,E_IO:4,E_GIT:5,E_BACKEND:6,E_NETWORK:7,E_RUNTIME:8,E_HANDOFF:9,E_INTERNAL:1},Uh=class extends Error{exitCode;code;context;constructor(t,r){super(r.message),this.name=new.target.name,this.exitCode=r.exitCode??Vt[t],this.code=t,this.context=r.context;}},m=class extends Uh{constructor(t){super(t.code,t);}},Pl=class extends m{constructor(t){super({...t,code:"E_USAGE"});}},Tl=class extends m{constructor(t){super({...t,code:"E_DEPRECATED_FLAG"});}},Xi=class extends m{constructor(t){super({...t,code:"E_VALIDATION"});}},Sl=class extends m{constructor(t){super({...t,code:"E_IO"});}},El=class extends m{constructor(t){super({...t,code:"E_GIT"});}},Il=class extends m{constructor(t){super({...t,code:"E_BACKEND"});}},Al=class extends m{constructor(t){super({...t,code:"E_NETWORK"});}};});var Zi,Ze,Ws,zs=u(()=>{Zi=new RegExp(String.raw`^\d{12}-[${TASK_ID_ALPHABET}]{4,}$`),Ze="agentplane",Ws=3;});function Lo(e){return new Promise(t=>setTimeout(t,e))}async function Kn(e,t,r){let n=Math.max(1,Math.floor(t)),o=[];o.length=e.length;let i=0,a=async()=>{for(;;){let c=i;if(i++,c>=e.length)return;o[c]=await r(e[c],c);}},s=Array.from({length:Math.min(n,e.length)},()=>a());return await Promise.all(s),o}var mT=u(()=>{});function F(e){return !!e&&typeof e=="object"&&!Array.isArray(e)}var De=u(()=>{});function Ut(){return new Date().toISOString()}function Ol(e){if(typeof e!="string")return "";let t=e.trim();return !t||t.toLowerCase()===Ze.toLowerCase()?"":t}function pT(e){return Array.isArray(e)?e.flatMap(r=>F(r)?[{author:typeof r.author=="string"?r.author:void 0}]:[]):null}function Wh(e,t,r){let n=t===void 0?void 0:Ol(t),o=resolveTaskDocUpdatedBy({comments:pT(e.comments),doc_updated_by:e.doc_updated_by,owner:e.owner},n??null);if(o.toLowerCase()!==Ze.toLowerCase())return o;let i=Ol(r);return i.length>0?i:r}function Jn(e,t){let r=resolveTaskDocUpdatedBy({comments:pT(e.comments),doc_updated_by:e.doc_updated_by,owner:e.owner},null);if(r.toLowerCase()!==Ze.toLowerCase())return r;let n=Ol(t);return n.length>0?n:t}function ut(e,t=Ws){return tW(e,t)}function Ho(e,t){e.doc_version=ut(e.doc_version),e.doc_updated_at=Ut();let r=Ol(t);if(t!==void 0){e.doc_updated_by=r||Jn(e,Ze);return}e.doc_updated_by=Jn(e,Ze);}var qo,ea,tW,Dl=u(()=>{De();zs();qo=extractTaskDoc,ea=mergeTaskDoc,tW=normalizeTaskDocVersion;});function nn(e){return `Missing required Redmine configuration env key(s): ${(Array.isArray(e)?e:[e]).join(", ")}. Set them in environment variables (for example via .env).`}function zh(e,t){return `Invalid Redmine configuration env value for ${e}. Expected ${t}.`}function Ks(){return "Missing Redmine issue id for task"}var te,It,fT=u(()=>{te=class extends Error{code;constructor(t,r){super(t),this.code=r;}},It=class extends te{constructor(t){super(t,"E_NETWORK");}};});async function iW(e){try{return await readFile(e,"utf8")}catch(t){if(t?.code==="ENOENT")return null;throw t}}async function X(e,t){let r=await iW(e);return r!==null&&r===t?false:(await atomicWriteFile(e,t,"utf8"),true)}async function ge(e,t){let r=canonicalizeJson(t),n=`${JSON.stringify(r,null,2)}
4
+ `;return await X(e,n)}var _e=u(()=>{});function q(e){return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"||typeof e=="bigint"?String(e):""}function Js(...e){for(let t of e)if(typeof t=="string"&&t.trim().length>0)return t.trim();return ""}function Go(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}var ta=u(()=>{});function Kh(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim()!=="[]"):typeof e=="string"&&e.trim()==="[]"?[]:[]}function Jh(e){let t=q(e).trim().toLowerCase();return t?t==="low"?"low":t==="normal"?"normal":t==="medium"||t==="med"?"med":t==="high"||t==="urgent"||t==="immediate"?"high":"med":"med"}function jl(){return {state:"pending",updated_at:null,updated_by:null,note:null}}function $l(){return {state:"pending",updated_at:null,updated_by:null,note:null}}function pr(e){if(!F(e))return null;let t=typeof e.system=="string"?e.system.trim():"";if(!t)return null;let r={system:t};for(let[n,o]of Object.entries(e)){if(n==="system"||typeof o!="string")continue;let i=n.trim(),a=o.trim();!i||!a||(r[i]=a);}return r}function ra(e){if(!F(e))return null;let t=typeof e.state=="string"?e.state:"";if(t!=="pending"&&t!=="approved"&&t!=="rejected")return null;let r=e.updated_at===null||typeof e.updated_at=="string"?e.updated_at:null,n=e.updated_by===null||typeof e.updated_by=="string"?e.updated_by:null,o=e.note===null||typeof e.note=="string"?e.note:null;return {state:t,updated_at:r,updated_by:n,note:o}}function na(e){if(!F(e))return null;let t=typeof e.state=="string"?e.state:"";if(t!=="pending"&&t!=="ok"&&t!=="needs_rework")return null;let r=e.updated_at===null||typeof e.updated_at=="string"?e.updated_at:null,n=e.updated_by===null||typeof e.updated_by=="string"?e.updated_by:null,o=e.note===null||typeof e.note=="string"?e.note:null;return {state:t,updated_at:r,updated_by:n,note:o}}function aW(e){if(!F(e))return null;let t=typeof e.kind=="string"?e.kind.trim():"";if(t!=="task"&&t!=="recipe_scenario")return null;let r={kind:t};return typeof e.task_id=="string"&&e.task_id.trim()&&(r.task_id=e.task_id.trim()),typeof e.recipe_id=="string"&&e.recipe_id.trim()&&(r.recipe_id=e.recipe_id.trim()),typeof e.scenario_id=="string"&&e.scenario_id.trim()&&(r.scenario_id=e.scenario_id.trim()),r}function sW(e){if(!F(e))return null;let t={};return typeof e.duration_ms=="number"&&Number.isFinite(e.duration_ms)&&(t.duration_ms=e.duration_ms),typeof e.stdout_bytes=="number"&&Number.isFinite(e.stdout_bytes)&&(t.stdout_bytes=e.stdout_bytes),typeof e.stderr_bytes=="number"&&Number.isFinite(e.stderr_bytes)&&(t.stderr_bytes=e.stderr_bytes),(e.output_last_message_bytes===null||typeof e.output_last_message_bytes=="number"&&Number.isFinite(e.output_last_message_bytes))&&(t.output_last_message_bytes=e.output_last_message_bytes),Object.keys(t).length>0?t:null}function Nl(e){if(!Array.isArray(e))return null;let t=e.filter(r=>typeof r=="string"&&r.trim().length>0).map(r=>r.trim());return t.length>0?t:null}function cW(e){if(!F(e))return null;let t={},r=Nl(e.evidence_paths);r&&(t.evidence_paths=r);let n=Nl(e.changed_paths);n&&(t.changed_paths=n);let o=Nl(e.tests_run);o&&(t.tests_run=o);let i=Nl(e.verification_candidates);return i&&(t.verification_candidates=i),typeof e.files_changed_count=="number"&&Number.isInteger(e.files_changed_count)&&e.files_changed_count>=0&&(t.files_changed_count=e.files_changed_count),Object.keys(t).length>0?t:null}function gT(e){if(!F(e))return null;let t=typeof e.run_id=="string"?e.run_id.trim():"",r=typeof e.status=="string"?e.status.trim():"",n=typeof e.adapter_id=="string"?e.adapter_id.trim():"",o=e.mode==="execute"||e.mode==="dry_run"?e.mode:null,i=typeof e.updated_at=="string"?e.updated_at.trim():"",a=aW(e.target);if(!t||!n||!i||!a||!o||r!=="prepared"&&r!=="running"&&r!=="success"&&r!=="failed"&&r!=="cancelled")return null;let s={run_id:t,status:r,adapter_id:n,mode:o,updated_at:i,exit_code:e.exit_code===null||typeof e.exit_code=="number"?e.exit_code:null,target:a};if(typeof e.started_at=="string"&&e.started_at.trim()&&(s.started_at=e.started_at.trim()),typeof e.ended_at=="string"&&e.ended_at.trim()&&(s.ended_at=e.ended_at.trim()),Array.isArray(e.output_paths)){let l=e.output_paths.filter(p=>typeof p=="string"&&p.trim().length>0);l.length>0&&(s.output_paths=l);}typeof e.summary=="string"&&e.summary.trim()&&(s.summary=e.summary.trim()),typeof e.stdout_summary=="string"&&e.stdout_summary.trim()&&(s.stdout_summary=e.stdout_summary.trim()),typeof e.stderr_summary=="string"&&e.stderr_summary.trim()&&(s.stderr_summary=e.stderr_summary.trim());let c=sW(e.metrics);c&&(s.metrics=c);let d=cW(e.evidence);return d&&(s.evidence=d),s}function on(e){let t=gT(e);if(!t)return null;let r=e,n=Array.isArray(r.history)?r.history.map(o=>gT(o)).filter(o=>!!o):[];return n.length>0?{...t,history:n}:t}function Vo(e){let{doc:t,sections:r,events:n,...o}=e;return o}function Ml(e){return e.map(t=>Vo(t))}var Ys=u(()=>{De();ta();});function yW(e){return typeof e=="string"&&e.trim().length>0?e.trim():hW}function wW(e){return typeof e=="string"&&e.trim().length>0?e.trim():kW}function bW(e){if(e==="low"||e==="normal"||e==="med"||e==="high")return e;if(typeof e=="string"){let t=e.trim().toLowerCase();if(t==="medium")return "med";if(t==="low"||t==="normal"||t==="med"||t==="high")return t}return "med"}function _W(e){return typeof e=="string"&&!Number.isNaN(Date.parse(e))?e:gW}function vW(e){let t={...e,id:e.id,title:yW(e.title),description:e.description??"",status:normalizeTaskStatus(e.status),priority:bW(e.priority),owner:wW(e.owner),result_summary:typeof e.result_summary=="string"?e.result_summary:void 0,risk_level:e.risk_level==="low"||e.risk_level==="med"||e.risk_level==="high"?e.risk_level:void 0,breaking:typeof e.breaking=="boolean"?e.breaking:void 0,revision:typeof e.revision=="number"&&Number.isInteger(e.revision)&&e.revision>0?e.revision:void 0,origin:pr(e.origin)??void 0,runner:on(e.runner)??void 0,depends_on:Go(e.depends_on),tags:Go(e.tags),verify:Go(e.verify),plan_approval:e.plan_approval??{state:"pending",updated_at:null,updated_by:null,note:null},verification:e.verification??{state:"pending",updated_at:null,updated_by:null,note:null},commit:e.commit??null,comments:Array.isArray(e.comments)?e.comments.filter(n=>!!n&&typeof n.author=="string"&&typeof n.body=="string"):[],doc_version:ut(e.doc_version),doc_updated_at:_W(e.doc_updated_at),doc_updated_by:Jn(e,Ze),dirty:!!e.dirty,id_source:e.id_source??"generated"},r=Array.isArray(e.events)?e.events.filter(n=>!!n&&typeof n.type=="string"&&typeof n.at=="string"&&typeof n.author=="string"):[];return r.length>0?{...t,events:r}:t}function hT(e){let r=e.map(i=>vW(i)).toSorted((i,a)=>i.id.localeCompare(a.id)),n=JSON.stringify(canonicalizeJson({tasks:r})),o=createHash("sha256").update(n,"utf8").digest("hex");return validateTasksExportSnapshot({tasks:r,meta:{schema_version:1,managed_by:"agentplane",checksum_algo:"sha256",checksum:o}})}async function oa(e){let t=hT(e.tasks);await mkdir(Ye.dirname(e.outputPath),{recursive:true}),await ge(e.outputPath,t);}var gW,hW,kW,kT=u(()=>{_e();zs();Dl();Ys();ta();gW="1970-01-01T00:00:00.000Z",hW="(untitled task)",kW="UNKNOWN";});function Uo(e){if(!Zi.test(e))throw new Error(`Invalid task id: ${e} (expected YYYYMMDDHHMM-XXXX)`)}function Bl(){return "Missing task id (expected non-empty value)"}function ia(e){return `Unknown task id: ${e}`}function yT(e,t){return `Invalid length: ${e} (expected >= ${t})`}var Fl,wT=u(()=>{zs();Fl=generateTaskId;});function aa(e){if(!Array.isArray(e))return [];let t=[];for(let r of e){if(!F(r))continue;let n=typeof r.type=="string"?r.type:"";if(!RW.has(n))continue;let o=typeof r.at=="string"?r.at:"",i=typeof r.author=="string"?r.author:"";!o.trim()||!i.trim()||t.push({type:n,at:o,author:i,from:typeof r.from=="string"?r.from:void 0,to:typeof r.to=="string"?r.to:void 0,state:typeof r.state=="string"?r.state:void 0,note:typeof r.note=="string"?r.note:void 0,body:typeof r.body=="string"?r.body:void 0});}return t}var RW,Yh=u(()=>{De();RW=new Set(["status","comment","verify"]);});function EW(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function IW(e){if(!F(e))return;let t={};for(let[r,n]of Object.entries(e)){let o=r.trim();!o||typeof n!="string"||(t[o]=n.replaceAll(`\r
5
+ `,`
6
+ `).trimEnd());}return Object.keys(t).length>0?t:void 0}function Sr(e){let t=e.frontmatter,r=Array.isArray(t.comments)?t.comments.filter(h=>F(h)).filter(h=>typeof h.author=="string"&&typeof h.body=="string").map(h=>({author:h.author,body:h.body})):[],n=F(t.commit)&&typeof t.commit.hash=="string"&&typeof t.commit.message=="string"?{hash:t.commit.hash,message:t.commit.message}:null,o=aa(t.events),i=ra(t.plan_approval),a=na(t.verification),s=pr(t.origin),c=on(t.runner),d=IW(t.sections),l=d?renderTaskDocFromSections(d):qo(e.body),g={id:(typeof t.id=="string"?t.id:typeof e.id=="string"?e.id:"").trim(),title:typeof t.title=="string"?t.title:"",result_summary:typeof t.result_summary=="string"?t.result_summary:void 0,risk_level:t.risk_level==="low"||t.risk_level==="med"||t.risk_level==="high"?t.risk_level:void 0,breaking:typeof t.breaking=="boolean"?t.breaking:void 0,description:typeof t.description=="string"?t.description:"",status:normalizeTaskStatus(t.status),priority:typeof t.priority=="string"||typeof t.priority=="number"?t.priority:"",owner:typeof t.owner=="string"?t.owner:"",revision:EW(t.revision)??1,origin:s??void 0,depends_on:Kh(t.depends_on),tags:Go(t.tags),verify:Go(t.verify),plan_approval:i??void 0,verification:a??void 0,runner:c??void 0,commit:n,comments:r,events:o,doc_version:typeof t.doc_version=="number"?normalizeTaskDocVersion(t.doc_version):void 0,doc_updated_at:typeof t.doc_updated_at=="string"?t.doc_updated_at:void 0,doc_updated_by:typeof t.doc_updated_by=="string"?t.doc_updated_by:void 0,dirty:typeof t.dirty=="boolean"?t.dirty:void 0,id_source:typeof t.id_source=="string"?t.id_source:void 0};return l&&(g.doc=l),g.sections=d??(l?taskDocToSectionMap(l):void 0),g}var bT=u(()=>{De();Dl();Yh();Ys();ta();});var Ce=u(()=>{zs();mT();Dl();fT();kT();wT();Ys();bT();ta();});function k(e){return AW[e]}var AW,G=u(()=>{v();AW={E_USAGE:Vt.E_USAGE,E_DEPRECATED_FLAG:Vt.E_DEPRECATED_FLAG,E_VALIDATION:Vt.E_VALIDATION,E_IO:Vt.E_IO,E_GIT:Vt.E_GIT,E_BACKEND:Vt.E_BACKEND,E_NETWORK:Vt.E_NETWORK,E_RUNTIME:Vt.E_RUNTIME,E_HANDOFF:Vt.E_HANDOFF,E_INTERNAL:Vt.E_INTERNAL};});function Ll(e){return String(e??"").replaceAll(`\r
7
+ `,`
8
+ `).trim()}function ql(e){if(Ll(e.currentDoc)!==Ll(e.expectedDoc))throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Task README changed concurrently: ${e.taskId} (re-read the task and re-apply your change)`,context:{task_id:e.taskId,reason_code:"task_readme_conflict"}})}function Hl(e){let t=taskDocToSectionMap(e.currentDoc),r=Ll(t[e.section]??null),n=Ll(e.expectedText);if(r!==n)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Task README section changed concurrently: ${e.taskId} ## ${e.section} (re-read the task and re-apply your change)`,context:{task_id:e.taskId,section:e.section,reason_code:"task_readme_section_conflict"}})}var Qh=u(()=>{G();v();});function Qs(e,t){return Number.isInteger(e.revision)&&typeof e.revision=="number"&&e.revision>0?e.revision:t}function Xs(e){if(e.expectedRevision===void 0)return;let t=Math.trunc(e.expectedRevision);if(!(t<=0||t===e.currentRevision))throw new te(`Task revision changed concurrently: ${e.taskId} (expected revision ${t}, current revision ${e.currentRevision})`,"E_BACKEND")}function _T(e){if(!Array.isArray(e))return null;let t=e.flatMap(r=>F(r)?[{author:typeof r.author=="string"?r.author:void 0}]:[]);return t.length>0?t:null}function Gl(e,t){return {doc:qo(t),doc_version:e.doc_version,doc_updated_by:e.doc_updated_by,owner:e.owner,comments:_T(e.comments)}}function vT(e,t){return {doc:t,doc_version:e.doc_version,doc_updated_by:e.doc_updated_by,owner:e.owner,comments:_T(e.comments)}}var Xh=u(()=>{De();Ce();});async function IT(e,t,r,n,o){let i=taskReadmePath(e.root,t),a=await readFile(i,"utf8"),s=parseTaskReadme(a);Xs({taskId:t,expectedRevision:o?.expectedRevision,currentRevision:Qs(s.frontmatter,1)});let c=String(r??""),d=Gl(s.frontmatter,s.body).doc;if(o?.expectedCurrentDoc!==void 0&&ql({taskId:t,currentDoc:d,expectedDoc:o.expectedCurrentDoc}),o?.expectedCurrentText!==void 0){if(!o.expectedSection)throw new te("expectedSection is required when expectedCurrentText is set","E_BACKEND");Hl({taskId:t,currentDoc:d,section:o.expectedSection,expectedText:o.expectedCurrentText});}let l=s.body,p={...s.frontmatter,id:typeof s.frontmatter.id=="string"&&s.frontmatter.id.trim().length>0?s.frontmatter.id:t},g=ut(p.doc_version);if(docChanged(d,c)||!p.doc_updated_at){let f=applyTaskDocMutations(Gl(p,s.body),[{kind:"replace-doc",doc:c},{kind:"touch-doc-meta",updatedBy:Wh(p,n,e.updatedBy),version:g}],{now:Ut()});l=ea(s.body,f.doc),p.doc_version=f.doc_version,p.doc_updated_at=f.doc_updated_at,p.doc_updated_by=f.doc_updated_by,p.sections=f.sections;}else l=ea(s.body,c),p.sections=taskDocToSectionMap(c);p.doc_version=ut(p.doc_version,g),validateTaskReadmeFrontmatter(withTaskReadmeFrontmatterDefaults(p));let h=renderTaskReadme(p,l);await X(i,h.endsWith(`
9
+ `)?h:`${h}
10
+ `);}async function AT(e,t,r,n){let o=taskReadmePath(e.root,t),i=await readFile(o,"utf8"),a=parseTaskReadme(i);Xs({taskId:t,expectedRevision:n?.expectedRevision,currentRevision:Qs(a.frontmatter,1)});let s={...a.frontmatter,id:typeof a.frontmatter.id=="string"&&a.frontmatter.id.trim().length>0?a.frontmatter.id:t},c=applyTaskDocMutations(Gl(s,a.body),[{kind:"touch-doc-meta",updatedBy:Wh(s,r,e.updatedBy),version:ut(s.doc_version)}],{now:Ut()});s.doc_version=c.doc_version,s.doc_updated_at=c.doc_updated_at,s.doc_updated_by=c.doc_updated_by,s.sections=typeof s.sections=="object"&&s.sections!==null&&Object.keys(s.sections).length>0?s.sections:c.sections,validateTaskReadmeFrontmatter(withTaskReadmeFrontmatterDefaults(s));let d=renderTaskReadme(s,a.body||"");await X(o,d.endsWith(`
11
+ `)?d:`${d}
12
+ `);}var OT=u(()=>{Qh();_e();Ce();Xh();});function Vl(e){if(Ye.normalize(e).split(Ye.sep).slice(-2).join(Ye.sep)===Ye.join(".agentplane","tasks")){let i=Ye.join(Ye.dirname(e),"cache");return Ye.join(i,DT)}let o=Ye.join(e,".cache");return Ye.join(o,DT)}function Zs(e){return !!e&&typeof e=="object"&&!Array.isArray(e)}function $W(e){if(!Zs(e)||!Zs(e.task)||typeof e.readmePath!="string"||typeof e.mtimeMs!="number")return false;let t=e.task;return !(typeof t.id!="string"||typeof t.title!="string"||typeof t.description!="string"||typeof t.status!="string"||typeof t.owner!="string"||!Array.isArray(t.depends_on)||!Array.isArray(t.tags)||!Array.isArray(t.verify)||!Array.isArray(t.comments))}function MW(e){if(!Zs(e)||e.schema_version!==2||!Zs(e.byId)||!Zs(e.byPath))return false;for(let t of Object.values(e.byId))if(!$W(t))return false;for(let t of Object.values(e.byPath))if(typeof t!="string")return false;return true}async function FW(e){let t="";try{t=await readFile(e,"utf8");}catch{return null}try{return JSON.parse(t)}catch{return null}}async function NT(e){let t=await FW(e);return t&&MW(t)?t:null}async function jT(e,t){await ge(e,t);}function $T(e,t,r){let{doc:n,sections:o,events:i,...a}=e;return {task:{...a,comments:Array.isArray(e.comments)?e.comments:[]},readmePath:t,mtimeMs:r}}var DT,Zh=u(()=>{_e();DT="tasks-index.v2.json";});function FT(e,t){return typeof e.id=="string"&&e.id.trim().length>0?e.id:t}function rk(e){let t=validateTaskReadmeFrontmatter(withTaskReadmeFrontmatterDefaults({...e.frontmatter,id:FT(e.frontmatter,e.taskId)}));return Sr({id:e.taskId,frontmatter:t,body:e.body,readmePath:e.readmePath})}async function VW(e,t){let r=taskReadmePath(e.root,t),n=await readFile(r,"utf8"),o=parseTaskReadme(n);return rk({taskId:t,readmePath:r,frontmatter:o.frontmatter,body:o.body})}async function ec(e,t){let r=t==="projection",n=[],o=[],i=await readdir(e.root,{withFileTypes:true}).catch(()=>[]),a=Vl(e.root),s=await NT(a),c=new Map;if(s)for(let[b,w]of Object.entries(s.byPath)){let _=s.byId[w];_&&c.set(b,_);}let d=s===null,l={},p={},g=new Set,h=i.filter(b=>b.isDirectory()).map(b=>b.name).toSorted(),f=await Kn(h,32,async b=>{let w=Ye.join(e.root,b,"README.md"),_;try{_=await stat(w);}catch{return o.push(`skip:${b}: missing_or_unreadable_readme`),null}if(!_.isFile())return null;let x=c.get(w);if(r&&x?.mtimeMs===_.mtimeMs)return {output:x.task,index:x};x?.mtimeMs!==_.mtimeMs&&(d=true);let C="";try{C=await readFile(w,"utf8");}catch{return o.push(`skip:${b}: unreadable_readme`),null}let j;try{j=parseTaskReadme(C);}catch{return o.push(`skip:${b}: invalid_readme_frontmatter`),null}let T=j.frontmatter;if(!F(T)||Object.keys(T).length===0)return o.push(`skip:${b}: empty_or_invalid_frontmatter`),null;let M=FT(T,b).trim(),$;try{$=rk({taskId:M,readmePath:w,frontmatter:T,body:j.body});}catch{return o.push(`skip:${b}: invalid_readme_frontmatter`),null}let W=$T($,w,_.mtimeMs);return {output:r?W.task:$,index:W}});for(let b of f){if(!b)continue;let w=b.index.task.id.trim();if(w){if(Uo(w),g.has(w))throw new Error(`Duplicate task id in local backend: ${w}`);g.add(w);}n.push(b.output),w&&(l[w]=b.index,p[b.index.readmePath]=w);}if(s&&d===false){let b=Object.keys(s.byPath),w=Object.keys(p);if(b.length===w.length){for(let _ of w)if(s.byPath[_]!==p[_]){d=true;break}}else d=true;}if(d)try{await jT(a,{schema_version:2,byId:l,byPath:p});}catch{}return e.setLastListWarnings?.(o),n}async function nk(e,t){let r=taskReadmePath(e.root,t),n="";try{n=await readFile(r,"utf8");}catch(i){if(i?.code==="ENOENT")return null;throw i}let o=parseTaskReadme(n);return rk({taskId:t,readmePath:r,frontmatter:o.frontmatter,body:o.body})}async function BT(e,t){return await Kn(t,8,async r=>await nk(e,r))}async function LT(e,t){return (await VW(e,t)).doc??""}var ok=u(()=>{De();Zh();Ce();});async function UT(e,t){let r=t.length;if(r<4)throw new Error(yT(r,4));let n=Math.max(1,t.attempts);return await Fl({length:r,attempts:n,isAvailable:async o=>{let i=taskReadmePath(e.root,o);try{return await readFile(i,"utf8"),!1}catch(a){if(a?.code==="ENOENT")return true;throw a}}})}async function dk(e,t,r){let n=t.id.trim();if(!n)throw new Error(Bl());Uo(n);let o=taskReadmePath(e.root,n),i="",a="",s={};try{let f=await readFile(o,"utf8"),b=parseTaskReadme(f);i=b.body,a=qo(b.body),s=b.frontmatter;}catch(f){if(f?.code!=="ENOENT")throw f}Xs({taskId:n,expectedRevision:r?.expectedRevision,currentRevision:Object.keys(s).length>0?Qs(s,1):0});let c={...t};delete c.doc,(!Number.isInteger(c.revision)||typeof c.revision!="number"||c.revision<=0)&&(c.revision=Number.isInteger(s.revision)&&typeof s.revision=="number"&&s.revision>0?s.revision:1);for(let[f,b]of Object.entries(c))b===void 0&&delete c[f];for(let f of ["doc_version","doc_updated_at","doc_updated_by"])c[f]===void 0&&s[f]!==void 0&&(c[f]=s[f]);c.plan_approval===void 0&&s.plan_approval!==void 0&&(c.plan_approval=s.plan_approval),c.plan_approval===void 0&&(c.plan_approval=jl()),c.verification===void 0&&s.verification!==void 0&&(c.verification=s.verification),c.verification===void 0&&(c.verification=$l());let d=ut(s.doc_version),l=ut(c.doc_version,d),p=t.doc===void 0?null:String(t.doc??""),g=p===null?t.sections&&Object.keys(t.sections).length>0?t.sections:a?taskDocToSectionMap(a):void 0:taskDocToSectionMap(p);if(t.doc!==void 0){let f=String(t.doc??"");if(i=ea(i,f),docChanged(a,f)||!c.doc_updated_at){let b=applyTaskDocMutations(vT({comments:t.comments,doc_updated_by:typeof c.doc_updated_by=="string"?c.doc_updated_by:void 0,doc_version:l,owner:t.owner},a),[{kind:"replace-doc",doc:f},{kind:"touch-doc-meta",updatedBy:Jn(t,e.updatedBy||Ze),version:l}],{now:Ut()});c.doc_version=b.doc_version,c.doc_updated_at=b.doc_updated_at,c.doc_updated_by=b.doc_updated_by,g=b.sections;}}g&&Object.keys(g).length>0&&(c.sections=g),c.doc_version=ut(c.doc_version,l),(c.doc_updated_at===void 0||c.doc_updated_at==="")&&(c.doc_updated_at=Ut()),(c.doc_updated_by===void 0||c.doc_updated_by==="")&&(c.doc_updated_by=Jn(t,e.updatedBy||Ze)),validateTaskReadmeFrontmatter(withTaskReadmeFrontmatterDefaults(c)),await mkdir(Ye.dirname(o),{recursive:true});let h=renderTaskReadme(c,i||"");await X(o,h.endsWith(`
13
+ `)?h:`${h}
14
+ `);}async function WT(e,t,r){await Kn(t,4,async n=>(await dk(e,n,r),null));}async function zT(e){let r=(await readdir(e.root,{withFileTypes:true}).catch(()=>[])).filter(s=>s.isDirectory()).map(s=>s.name),n=await Kn(r,8,async s=>{let c=Ye.join(e.root,s,"README.md"),d="";try{d=await readFile(c,"utf8");}catch{return {taskId:"",scanned:false,changed:false}}let l;try{l=parseTaskReadme(d);}catch{return {taskId:"",scanned:false,changed:false}}let p=l.frontmatter;if(!F(p)||Object.keys(p).length===0)return {taskId:"",scanned:false,changed:false};let g=(typeof p.id=="string"?p.id:s).trim(),h;try{h=validateTaskReadmeFrontmatter(withTaskReadmeFrontmatterDefaults({...p,id:g}));}catch{return {taskId:"",scanned:false,changed:false}}let f=g;f&&Uo(f);let b=Sr({id:f,frontmatter:h,body:l.body}),w={...b};delete w.doc,(!Number.isInteger(w.revision)||typeof w.revision!="number"||w.revision<=0)&&(w.revision=Number.isInteger(p.revision)&&typeof p.revision=="number"&&p.revision>0?p.revision:1);for(let[C,j]of Object.entries(w))j===void 0&&delete w[C];for(let C of ["doc_version","doc_updated_at","doc_updated_by"])w[C]===void 0&&p[C]!==void 0&&(w[C]=p[C]);w.plan_approval===void 0&&p.plan_approval!==void 0&&(w.plan_approval=p.plan_approval),w.plan_approval===void 0&&(w.plan_approval=jl()),w.verification===void 0&&p.verification!==void 0&&(w.verification=p.verification),w.verification===void 0&&(w.verification=$l()),w.doc_version=ut(w.doc_version,ut(p.doc_version)),(w.doc_updated_at===void 0||w.doc_updated_at==="")&&(w.doc_updated_at=Ut()),(w.doc_updated_by===void 0||w.doc_updated_by==="")&&(w.doc_updated_by=Jn(b,e.updatedBy||Ze)),!w.sections&&b.doc&&(w.sections=taskDocToSectionMap(b.doc)),validateTaskReadmeFrontmatter(withTaskReadmeFrontmatterDefaults(w));let _=renderTaskReadme(w,l.body||""),x=await X(c,_.endsWith(`
15
+ `)?_:`${_}
16
+ `);return {taskId:f,scanned:true,changed:x}}),o=new Set;for(let{taskId:s}of n)if(s){if(o.has(s))throw new Error(`Duplicate task id in local backend: ${s}`);o.add(s);}let i=n.reduce((s,c)=>s+(c.scanned?1:0),0),a=n.reduce((s,c)=>s+(c.changed?1:0),0);return {scanned:i,changed:a}}async function lk(e,t){let r=await ec(e,"full");await oa({outputPath:t,tasks:r});}async function KT(e,t){await lk(e,t);}var JT=u(()=>{De();_e();ok();Xh();Ce();});var Yn,mk=u(()=>{Ce();OT();ok();JT();Yn=class{id="local";capabilities={canonical_source:"local",projection:"canonical",projection_read_mode:"native",reads_from_projection_by_default:true,writes_task_readmes:true,supports_task_revisions:true,supports_revision_guarded_writes:true,may_access_network_on_read:false,may_access_network_on_write:false,supports_projection_refresh:false,supports_push_sync:false,supports_snapshot_export:true};root;updatedBy;lastListWarnings=[];constructor(t){this.root=Ye.resolve(t?.dir??".agentplane/tasks"),this.updatedBy=t?.updatedBy??Ze;}async generateTaskId(t){return await UT(this.backendContext(),t)}backendContext(){return {root:this.root,updatedBy:this.updatedBy,setLastListWarnings:t=>{this.lastListWarnings=t;}}}async listTasks(){return await ec(this.backendContext(),"full")}async listProjectionTasks(){return await ec(this.backendContext(),"projection")}getLastListWarnings(){return [...this.lastListWarnings]}async getTask(t){return await nk(this.backendContext(),t)}async getTasks(t){return await BT(this.backendContext(),t)}async getTaskDoc(t){return await LT(this.backendContext(),t)}async writeTask(t,r){await dk(this.backendContext(),t,r);}async setTaskDoc(t,r,n,o){await IT(this.backendContext(),t,r,n,o);}async touchTaskDocMetadata(t,r,n){await AT(this.backendContext(),t,r,n);}async writeTasks(t,r){await WT(this.backendContext(),t,r);}async normalizeTasks(){return await zT(this.backendContext())}async exportTasksJson(t){await lk(this.backendContext(),t);}async exportProjectionSnapshot(t){await KT(this.backendContext(),t);}};});function Ul(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function uk(e){if(!F(e))return;let t={};for(let[r,n]of Object.entries(e)){let o=r.trim();!o||typeof n!="string"||(t[o]=n.replaceAll(`\r
17
+ `,`
18
+ `).trimEnd());}return Object.keys(t).length>0?t:void 0}function QW(e){if(e==null)return null;let t=q(e).trim();if(!t)return null;if(!t.startsWith("{"))return t;try{return JSON.parse(t)}catch{return t}}function sn(e){let t=QW(e);if(!F(t))return null;let r=Ul(t.revision),n=pr(t.origin)??void 0,o=on(t.runner)??void 0,i=uk(t.sections),a=ra(t.plan_approval)??void 0,s=na(t.verification)??void 0,c=aa(t.events);return r===void 0&&n===void 0&&o===void 0&&i===void 0&&a===void 0&&s===void 0&&c.length===0?null:{...r===void 0?{}:{revision:r},...n?{origin:n}:{},...o?{runner:o}:{},...i?{sections:i}:{},...a?{plan_approval:a}:{},...s?{verification:s}:{},...c.length>0?{events:c}:{}}}function YT(e){return tc(e)}function tc(e,t){let r=t?.base??null,n=Ul(t?.revision)??Ul(e.revision)??Ul(r?.revision),o=pr(e.origin)??pr(r?.origin)??void 0,i=on(e.runner)??on(r?.runner)??void 0,a=uk(e.sections)??(typeof e.doc=="string"&&e.doc.trim().length>0?taskDocToSectionMap(e.doc):void 0)??uk(r?.sections),s=ra(e.plan_approval)??ra(r?.plan_approval)??void 0,c=na(e.verification)??na(r?.verification)??void 0,d=aa(e.events),l=d.length>0?d:aa(r?.events);return n===void 0&&o===void 0&&i===void 0&&a===void 0&&s===void 0&&c===void 0&&l.length===0?null:{...n===void 0?{}:{revision:n},...o?{origin:o}:{},...i?{runner:i}:{},...a?{sections:a}:{},...s?{plan_approval:s}:{},...c?{verification:c}:{},...l.length>0?{events:l}:{}}}var rc=u(()=>{De();Yh();Ys();ta();});function pk(e){return typeof e=="number"&&Number.isFinite(e)?e:0}async function fk(e){if(!e.cache)throw new te("Redmine cache is disabled; projection reads are unavailable","E_BACKEND");return await e.cache.listTasks()}async function XT(e){if(!e.cache)throw new te("Redmine cache is disabled; projection reads are unavailable","E_BACKEND");return e.cache.listProjectionTasks?await e.cache.listProjectionTasks():Ml(await e.cache.listTasks())}async function ZT(e,t){let r=await fk(e);await oa({outputPath:t,tasks:r});}async function eS(e,t){if(!e.cache)throw new te("Redmine cache is disabled; projection snapshot export is unavailable","E_BACKEND");let r=await e.cache.listTasks();await oa({outputPath:t,tasks:r});}async function tS(e){return e.cache?.normalizeTasks?await e.cache.normalizeTasks():{scanned:0,changed:0}}async function Wl(e,t){if(!e.cache)throw new te("Redmine cache is disabled; projection reads are unavailable","E_BACKEND");return await e.cache.getTask(t)??null}async function rS(e,t){return await Kn(t,e.batchSize,async r=>await Wl(e,r))}async function nS(e,t){let r=await Wl(e,t);if(!r)throw new Error(ia(t));return q(r.doc)}async function oS(e,t,r,n,o){if(!e.customFields.doc)throw new te(nn("AGENTPLANE_REDMINE_CUSTOM_FIELDS_DOC"),"E_BACKEND");try{let i=await e.findIssueByTaskId(t);if(!i)throw new Error(ia(t));let a=q(i.id);if(!a)throw new Error(Ks());let s=e.issueToTask(i,t),c=sn(e.customFieldValue(i,e.customFields.canonical_state));e.assertExpectedRevisionSupported(t,o),e.assertExpectedRevision(t,o?.expectedRevision,c?.revision??1);let d={doc:String(r??""),doc_version:s?.doc_version};Ho(d,n);let l=taskDocToSectionMap(String(d.doc??"")),p=Math.max(pk(s?.revision),pk(c?.revision),0)+1,g=[];e.appendCustomField(g,"doc",d.doc);let h=tc({id:t,title:s?.title??"",description:s?.description??"",status:s?.status??"TODO",priority:s?.priority??"med",owner:s?.owner??e.ownerAgent,depends_on:s?.depends_on??[],tags:s?.tags??[],verify:s?.verify??[],doc:d.doc,sections:l,revision:p,plan_approval:s?.plan_approval,verification:s?.verification,events:s?.events},{base:c,revision:p});h&&e.appendCustomField(g,"canonical_state",h),e.appendCustomField(g,"doc_version",d.doc_version),e.appendCustomField(g,"doc_updated_at",d.doc_updated_at),e.appendCustomField(g,"doc_updated_by",d.doc_updated_by),await e.requestJson("PUT",`issues/${a}.json`,{issue:{custom_fields:g}}),s&&(s.doc=d.doc,s.sections=l,s.revision=p,s.doc_version=d.doc_version,s.doc_updated_at=d.doc_updated_at,s.doc_updated_by=d.doc_updated_by,await e.cacheTask(s,!1));}catch(i){if(!(i instanceof It)||!e.cache)throw i;let a=await e.cache.getTask(t);if(!a)throw new Error(ia(t));e.assertExpectedRevisionSupported(t,o),e.assertExpectedRevision(t,o?.expectedRevision,a.revision??1),a.doc=String(r??""),a.sections=taskDocToSectionMap(a.doc),a.revision=Math.max(pk(a.revision),0)+1,Ho(a,n),a.dirty=true,await e.cache.writeTask(a,o);}}async function iS(e,t,r,n){try{let o=await e.findIssueByTaskId(t);if(!o)throw new Error(ia(t));let i=q(o.id);if(!i)throw new Error(Ks());let a=e.customFieldValue(o,e.customFields.doc),s=e.issueToTask(o,t),c=sn(e.customFieldValue(o,e.customFields.canonical_state));e.assertExpectedRevisionSupported(t,n),e.assertExpectedRevision(t,n?.expectedRevision,c?.revision??1);let d={doc:a??"",doc_version:s?.doc_version};Ho(d,r);let l=[];e.appendCustomField(l,"doc_version",d.doc_version),e.appendCustomField(l,"doc_updated_at",d.doc_updated_at),e.appendCustomField(l,"doc_updated_by",d.doc_updated_by),l.length>0&&(await e.requestJson("PUT",`issues/${i}.json`,{issue:{custom_fields:l}}),s&&(s.doc_version=d.doc_version,s.doc_updated_at=d.doc_updated_at,s.doc_updated_by=d.doc_updated_by,await e.cacheTask(s,!1)));}catch(o){if(!(o instanceof It)||!e.cache)throw o;let i=await e.cache.getTask(t);if(!i)throw new Error(ia(t));e.assertExpectedRevisionSupported(t,n),e.assertExpectedRevision(t,n?.expectedRevision,i.revision??1),Ho(i,r),i.dirty=true,await e.cache.writeTask(i,n);}}var aS=u(()=>{Ce();rc();});async function sS(e){let t=new Map,r=0,n=100;for(;;){let o=await e.requestJson("GET","issues.json",void 0,{project_id:e.projectId,limit:n,offset:r,status_id:"*"}),a=(Array.isArray(o.issues)?o.issues:[]).filter(c=>F(c));for(let c of a){let d=Array.isArray(c.custom_fields)?c.custom_fields:[];for(let l of d){if(!F(l)||typeof l.id!="number")continue;let p=q(l.name).trim();if(!p)continue;let g=t.get(l.id)??{id:l.id,name:p,nonEmptyCount:0},h=l.value;h!=null&&q(h).trim().length>0&&(g.nonEmptyCount+=1),t.set(l.id,g);}}let s=Number(o.total_count??0);if(s===0||r+n>=s)break;r+=n;}return [...t.values()].toSorted((o,i)=>o.id-i.id).map(o=>({id:o.id,name:o.name,nonEmptyCount:o.nonEmptyCount}))}function cS(e){return e.find(r=>r.name.trim()==="canonical_state")?.id??null}function dS(e){let t=new Map(e.visibleFields.map(n=>[n.id,n])),r=[];for(let[n,o]of Object.entries(e.configuredFields)){if(typeof o!="number")continue;let i=t.get(o);if(!i)continue;let a=n;i.name.trim()!==a&&r.push({key:n,configuredId:o,visibleName:i.name});}return r.toSorted((n,o)=>n.configuredId-o.configuredId||n.key.localeCompare(o.key))}var lS=u(()=>{De();Ce();});async function mS(e){let t=await sS({projectId:e.projectId,requestJson:async(n,o,i,a)=>await e.requestJson(n,o,i,a)}),r=cS(t);return {backendId:"redmine",visibleCustomFields:t,canonicalState:{configuredFieldId:typeof e.customFields.canonical_state=="number"?e.customFields.canonical_state:null,visibleFieldId:r},configuredFieldNameDrift:dS({configuredFields:e.customFields,visibleFields:t})}}function uS(e,t){let r=JSON.stringify(canonicalizeJson(e),null,2).split(`
19
+ `),n=JSON.stringify(canonicalizeJson(t),null,2).split(`
20
+ `),o=["--- remote","+++ local"],i=Math.max(r.length,n.length);for(let a=0;a<i;a++){let s=r[a],c=n[a];s!==c&&(c!==void 0&&o.push(`- ${c}`),s!==void 0&&o.push(`+ ${s}`));}return o.join(`
21
+ `)}function pS(e,t){return JSON.stringify(canonicalizeJson(e))!==JSON.stringify(canonicalizeJson(t))}var gk=u(()=>{lS();});async function hk(e,t){let r=new Set;try{let n=await e.listTasksRemote();r=new Set(n.map(o=>q(o.id)).filter(Boolean));}catch(n){if(!(n instanceof It)||!e.cache)throw n;let o=await e.cache.listTasks();r=new Set(o.map(i=>q(i.id)).filter(Boolean));}return await Fl({length:t.length,attempts:t.attempts,isAvailable:n=>!r.has(n)})}var fS=u(()=>{Ce();});function Qn(e){return typeof e=="number"&&Number.isFinite(e)?e:0}function Kl(e){return e.issue&&typeof e.issue=="object"&&!Array.isArray(e.issue)?e.issue:null}var kk=u(()=>{});async function yk(e){if(!e.customFields.canonical_state)throw new te(nn("AGENTPLANE_REDMINE_CUSTOM_FIELDS_CANONICAL_STATE"),"E_BACKEND");let t=await e.listTasksRemote(),r={scanned:t.length,migrated:[],skippedStructured:[],skippedNoDoc:[],failed:[]};for(let[n,o]of t.entries()){let i=q(o.id).trim();if(!i)continue;let a=e.issueCache.get(i);if(!a){r.failed.push({taskId:i,reason:"Redmine issue payload was not cached during remote list refresh"});continue}let s=sn(e.customFieldValue(a,e.customFields.canonical_state));if(s){r.skippedStructured.push(i);continue}let c=o.sections&&Object.keys(o.sections).length>0?o.sections:o.doc?taskDocToSectionMap(o.doc):void 0;if(!c||Object.keys(c).length===0){r.skippedNoDoc.push(i);continue}let d=q(a.id);if(!d){r.failed.push({taskId:i,reason:Ks()});continue}let l=Math.max(Qn(o.revision),0,1),p=tc({...o,sections:c,revision:l},{base:s,revision:l});if(!p){r.skippedNoDoc.push(i);continue}let g=[];e.appendCustomField(g,"canonical_state",p);try{await e.requestJson("PUT",`issues/${d}.json`,{issue:{custom_fields:g}}),e.setIssueCustomFieldValue(a,e.customFields.canonical_state,p),e.issueCache.set(i,a),await e.cacheTask({...o,sections:c,revision:l,dirty:!1},!1),r.migrated.push(i);}catch(h){r.failed.push({taskId:i,reason:h instanceof Error?h.message:"Unknown Redmine canonical_state migration failure"});}e.batchPauseMs>0&&e.batchSize>0&&(n+1)%e.batchSize===0&&await Lo(e.batchPauseMs);}return r}var gS=u(()=>{Ce();rc();kk();});async function wk(e,t){let r=normalizeTaskStatus(q(t));if(!r)return null;let n=e.statusMap?.[r];return typeof n=="number"&&Number.isFinite(n)?n:(await hS(e)).get(r)??null}async function hS(e){if(e.inferredStatusByTaskStatus)return e.inferredStatusByTaskStatus;let t=new Map;e.setInferredStatusByTaskStatus(t);try{let r=await e.requestJson("GET","issue_statuses.json"),n=Array.isArray(r.issue_statuses)?r.issue_statuses:[],o=[];for(let c of n){if(!c||typeof c!="object"||Array.isArray(c))continue;let d=c,l=typeof d.id=="number"?d.id:null;!l||!Number.isFinite(l)||o.push({id:l,name:q(d.name).trim().toLowerCase(),isClosed:d.is_closed===!0,isDefault:d.is_default===!0});}let i=Jl(o,"DONE"),a=Jl(o,"DOING"),s=Jl(o,"TODO");i!==null&&t.set("DONE",i),a!==null&&t.set("DOING",a),s!==null&&t.set("TODO",s);}catch{}return t}function Jl(e,t){if(e.length===0)return null;if(t==="DOING"){let o=e.find(a=>a.id===2);return o?o.id:e.find(a=>a.name.includes("progress")||a.name.includes("doing"))?.id??null}if(t==="DONE"){let o=e.find(s=>s.isClosed);if(o)return o.id;let i=e.find(s=>s.id===5||s.id===3||s.id===6);return i?i.id:e.find(s=>s.name.includes("done")||s.name.includes("closed")||s.name.includes("resolved")||s.name.includes("complete"))?.id??null}let r=e.find(o=>o.isDefault);return r?r.id:e.find(o=>o.id===1)?.id??e[0]?.id??null}var bk=u(()=>{Ce();});async function _k(e,t){if(t.direction==="push"){await kS(e,t.quiet,t.confirm);return}if(t.direction==="pull"){await Yl(e,t.conflict,t.quiet);return}throw new te("Invalid sync direction (expected push|pull)","E_BACKEND")}async function kS(e,t,r){if(!e.cache)throw new te("Redmine cache is disabled; sync push is unavailable","E_BACKEND");let o=(await e.cache.listTasks()).filter(i=>i.dirty);if(o.length===0){t||process.stdout.write(`\u2139\uFE0F no local task changes to push
22
+ `);return}if(!r){for(let i of o)process.stdout.write(`- pending push: ${i.id}
23
+ `);throw new te("Refusing to push without --yes (preview above)","E_BACKEND")}await e.writeTasks(o),t||process.stdout.write(`\u2705 pushed ${o.length} task(s) (dirty)
24
+ `);}async function Yl(e,t,r){if(!e.cache)throw new te("Redmine cache is disabled; sync pull is unavailable","E_BACKEND");let n=await e.listTasksRemote(),o=new Map;for(let s of n){let c=q(s.id);c&&o.set(c,s);}let i=await e.cache.listTasks(),a=new Map;for(let s of i){let c=q(s.id);c&&a.set(c,s);}for(let[s,c]of o.entries()){let d=a.get(s);if(d?.dirty){if(e.tasksDiffer(d,c)){await yS(e,s,d,c,t);continue}d.dirty=false,await e.cacheTask(d,false);continue}await e.cacheTask(c,false);}r||process.stdout.write(`\u2705 pulled ${o.size} task(s) (remote)
25
+ `);}async function yS(e,t,r,n,o){if(o==="prefer-local"){await e.writeTask(r);return}if(o==="prefer-remote"){await e.cacheTask(n,false);return}throw o==="diff"?(process.stdout.write(`${e.diffTasks(r,n)}
26
+ `),new te(`Conflict detected for ${t}`,"E_BACKEND")):new te(`Conflict detected for ${t}`,"E_BACKEND")}var wS=u(()=>{Ce();});async function vk(e,t,r){let n=q(t.id).trim();if(!n)throw new Error(Bl());Uo(n);try{e.ensureDocMetadata(t);let o=await e.findIssueByTaskId(n),i=o?.id,a=i?q(i):"",s=o??null;if(a&&!s){let g=await e.requestJson("GET",`issues/${a}.json`);s=Kl(g);}let c=s&&e.customFields.canonical_state?sn(e.customFieldValue(s,e.customFields.canonical_state)):null;e.assertExpectedRevisionSupported(n,r),e.assertExpectedRevision(n,r?.expectedRevision,c?.revision??0);let d=a?Math.max(Qn(t.revision),Qn(c?.revision),0)+1:Math.max(Qn(t.revision),Qn(c?.revision),1),l={...t,revision:d,sections:t.sections&&Object.keys(t.sections).length>0?t.sections:t.doc?taskDocToSectionMap(t.doc):void 0},p=e.taskToIssuePayload(l,s??void 0);if(p.status_id===void 0){let g=await wk(e,l.status);g!==null&&(p.status_id=g);}if(a)await e.requestJson("PUT",`issues/${a}.json`,{issue:p});else {let g={...p,project_id:e.projectId},h=await e.requestJson("POST","issues.json",{issue:g});if(i=Kl(h)?.id,a=i?q(i):"",a){let b={...p};delete b.project_id,await e.requestJson("PUT",`issues/${a}.json`,{issue:b});let w=await e.requestJson("GET",`issues/${a}.json`);s=Kl(w);}}if(a){let g=s&&e.customFields.comments?e.normalizeComments(e.maybeParseJson(e.customFieldValue(s,e.customFields.comments))):[],h=e.normalizeComments(l.comments);await e.appendCommentNotes(a,g,h);}l.dirty=!1,await e.cacheTask(l,!1),e.issueCache.clear();}catch(o){if(!(o instanceof It)||!e.cache)throw o;e.assertExpectedRevisionSupported(n,r);let i={...t,revision:Math.max(Qn(t.revision),1),sections:t.sections&&Object.keys(t.sections).length>0?t.sections:t.doc?taskDocToSectionMap(t.doc):void 0,dirty:true};await e.cache.writeTask(i,r);}}async function xk(e,t,r){for(let[n,o]of t.entries())await e.writeTask(o,r),e.batchPauseMs>0&&e.batchSize>0&&(n+1)%e.batchSize===0&&await Lo(e.batchPauseMs);}var _S=u(()=>{Ce();rc();kk();bk();});var vS=u(()=>{fS();gS();bk();wS();_S();});function Wt(e){return {cache:e.cache,customFields:e.customFields,ownerAgent:e.ownerAgent,batchSize:e.batchSize,findIssueByTaskId:async t=>await e.findIssueByTaskId(t),issueToTask:(t,r)=>e.issueToTask(t,r),customFieldValue:(t,r)=>e.customFieldValue(t,r),appendCustomField:(t,r,n)=>e.appendCustomField(t,r,n),requestJson:async(t,r,n,o)=>await e.requestJson(t,r,n,o),assertExpectedRevisionSupported:(t,r)=>e.assertExpectedRevisionSupported(t,r),assertExpectedRevision:(t,r,n)=>e.assertExpectedRevision(t,r,n),cacheTask:async(t,r)=>await e.cacheTask(t,r)}}function Rk(e){return {projectId:e.projectId,customFields:e.customFields,requestJson:async(t,r,n,o)=>await e.requestJson(t,r,n,o)}}function Xn(e){return {cache:e.cache,customFields:e.customFields,ownerAgent:e.ownerAgent,projectId:e.projectId,batchSize:e.batchSize,batchPauseMs:e.batchPauseMs,statusMap:e.statusMap,issueCache:e.issueCache,inferredStatusByTaskStatus:e.inferredStatusByTaskStatus,setInferredStatusByTaskStatus:e.setInferredStatusByTaskStatus,listTasksRemote:async()=>await e.listTasksRemote(),writeTask:async(t,r)=>await e.writeTask(t,r),writeTasks:async(t,r)=>await e.writeTasks(t,r),findIssueByTaskId:async t=>await e.findIssueByTaskId(t),issueToTask:(t,r)=>e.issueToTask(t,r),taskToIssuePayload:(t,r)=>e.taskToIssuePayload(t,r),appendCustomField:(t,r,n)=>e.appendCustomField(t,r,n),customFieldValue:(t,r)=>e.customFieldValue(t,r),maybeParseJson:t=>e.maybeParseJson(t),normalizeComments:t=>e.normalizeComments(t),appendCommentNotes:async(t,r,n)=>await e.appendCommentNotes(t,r,n),cacheTask:async(t,r)=>await e.cacheTask(t,r),assertExpectedRevisionSupported:(t,r)=>e.assertExpectedRevisionSupported(t,r),assertExpectedRevision:(t,r,n)=>e.assertExpectedRevision(t,r,n),ensureDocMetadata:t=>e.ensureDocMetadata(t),diffTasks:(t,r)=>e.diffTasks(t,r),tasksDiffer:(t,r)=>e.tasksDiffer(t,r),taskIdFieldId:()=>e.taskIdFieldId(),setIssueCustomFieldValue:(t,r,n)=>e.setIssueCustomFieldValue(t,r,n),requestJson:async(t,r,n,o,i)=>await e.requestJson(t,r,n,o,i)}}var xS=u(()=>{});function pt(e,t){if(!t)return null;let r=Array.isArray(e.custom_fields)?e.custom_fields:[];for(let n of r)if(F(n)&&n.id===t){let o=n.value;return o!=null?q(o):""}return null}function RS(e,t,r){let n=Array.isArray(e.custom_fields)?e.custom_fields:[],o=false,i=n.map(a=>F(a)&&a.id===t?(o=true,{...a,value:r}):a);o||i.push({id:t,value:r}),e.custom_fields=i;}function CS(e){let t=e.customFields?.[e.key];if(!t)return;let r=e.value;(Array.isArray(e.value)||F(e.value))&&(r=JSON.stringify(e.value)),e.fields.push({id:t,value:r});}var Ql=u(()=>{De();Ce();});function Wo(e){if(e==null)return null;let t=q(e).trim();if(!t)return null;if(t.startsWith("{")||t.startsWith("["))try{return JSON.parse(t)}catch{return t}return t}function PS(e){if(e==null)return null;if(e===2||e===3)return e;let t=q(e).trim();return t==="2"?2:t==="3"?3:null}var Ck=u(()=>{Ce();});function Xl(e){return Array.isArray(e)?e.filter(t=>F(t)?typeof t.author=="string"&&typeof t.body=="string":false):F(e)?[e]:typeof e=="string"&&e.trim()?[{author:"redmine",body:e.trim()}]:[]}function TS(e){let t=[];for(let r of e){let n=q(r.author).trim(),o=q(r.body).trim();!n&&!o||t.push([n,o]);}return t}function e2(e="unknown",t=""){return `[comment] ${e}: ${t}`.trim()}async function SS(e){let t=q(e.issueId);if(!t)return;let r=TS(e.existingComments),n=TS(e.desiredComments);if(n.length===0||n.length<r.length)return;if(r.length>0){let i=n.slice(0,r.length);if(!(i.length===r.length&&i.every((s,c)=>s[0]===r[c]?.[0]&&s[1]===r[c]?.[1])))return}let o=n.slice(r.length);for(let[i,a]of o){let s=e2(i,a);s&&await e.requestJson("PUT",`issues/${t}.json`,{issue:{notes:s}});}}var Pk=u(()=>{De();Ce();});function Tk(e){if(!e.includes("-"))return null;let t=e.split("-",1)[0]??"";if(t.length<8)return null;let r=t.slice(0,4),n=t.slice(4,6),o=t.slice(6,8);return /^\d{8}$/u.test(`${r}${n}${o}`)?`${r}-${n}-${o}`:null}function Sk(e){return e?e==="DONE"?100:0:null}function o2(e){let t=F(e.status)?e.status:null,r=q(t?.name).trim().toLowerCase(),n=typeof e.done_ratio=="number"?e.done_ratio:null,o=t?.is_closed===true,i=typeof t?.id=="number"?t.id:null;return i===2?"DOING":i===3||i===5||i===6||o||n!==null&&n>=100?"DONE":r.includes("progress")||r.includes("doing")?"DOING":r.includes("done")||r.includes("closed")||r.includes("resolved")||r.includes("complete")?"DONE":n!==null&&n>0?"DOING":"TODO"}function ES(e){let t=e.taskIdOverride??pt(e.issue,e.customFields.task_id);if(!t)return null;let r=F(e.issue.status)?e.issue.status:null,n=r&&typeof r.id=="number"?r.id:null,o=n!==null&&e.reverseStatus.has(n)?e.reverseStatus.get(n):o2(e.issue),i=pt(e.issue,e.customFields.verify),a=pt(e.issue,e.customFields.commit),s=pt(e.issue,e.customFields.doc),c=pt(e.issue,e.customFields.comments),d=pt(e.issue,e.customFields.tags),l=pt(e.issue,e.customFields.priority),p=pt(e.issue,e.customFields.owner),g=pt(e.issue,e.customFields.doc_version),h=pt(e.issue,e.customFields.doc_updated_at),f=pt(e.issue,e.customFields.doc_updated_by),b=pt(e.issue,e.customFields.canonical_state),w=typeof e.issue.updated_on=="string"?e.issue.updated_on:typeof e.issue.created_on=="string"?e.issue.created_on:null,_=sn(b),x=q(e.issue.id).trim(),C=q(e.issue.url).trim(),j=pr(_?.origin)??{system:"redmine",...x?{issue_id:x}:{},...C?{url:C}:{}},T=F(e.issue.priority)?e.issue.priority:null,M=Jh(T?.name??l),$=[];if(Array.isArray(e.issue.tags))for(let Y of e.issue.tags)F(Y)&&Y.name&&$.push(q(Y.name));let W=Wo(d);if(Array.isArray(W))for(let Y of W){let Re=q(Y).trim();Re&&$.push(Re);}else if(typeof W=="string")for(let Y of W.split(",")){let Re=Y.trim();Re&&$.push(Re);}let Z=[...new Set($)],U={id:q(t),title:q(e.issue.subject),description:q(e.issue.description),status:o??"TODO",priority:M,owner:q(p??e.ownerAgent),revision:_?.revision??1,origin:j,runner:_?.runner,tags:Z,depends_on:[],verify:Wo(i),commit:Wo(a),comments:Xl(Wo(c)),plan_approval:_?.plan_approval,verification:_?.verification,events:_?.events,id_source:"custom"},J=_?.sections,pe=J?renderTaskDocFromSections(J):s?q(s):"";pe&&(U.doc=pe),U.sections=J??(pe?taskDocToSectionMap(pe):void 0);let ye=PS(g);return U.doc_version=ye===e.defaultDocVersion?ye:e.defaultDocVersion,U.doc_updated_at=h?q(h):w??Ut(),U.doc_updated_by=f?q(f):e.ownerAgent,U}function IS(e){let t=normalizeTaskStatus(e.task.status),r={subject:q(e.task.title),description:q(e.task.description)};t&&e.statusMap&&t in e.statusMap&&(r.status_id=e.statusMap[t]),typeof e.task.priority=="number"&&(r.priority_id=e.task.priority);let n=null;e.existingIssue&&F(e.existingIssue.assigned_to)&&(n=e.existingIssue.assigned_to.id),e.assigneeId&&!n&&(r.assigned_to_id=e.assigneeId);let o=Tk(q(e.task.id));o&&(r.start_date=o);let i=Sk(t);i!==null&&(r.done_ratio=i);let a=[];Ho(e.task),e.appendCustomField(a,"task_id",e.task.id);let s=YT(e.task);return s&&e.appendCustomField(a,"canonical_state",s),e.appendCustomField(a,"verify",e.task.verify),e.appendCustomField(a,"commit",e.task.commit),e.appendCustomField(a,"comments",e.task.comments),e.appendCustomField(a,"doc",e.task.doc),e.appendCustomField(a,"doc_version",e.task.doc_version),e.appendCustomField(a,"doc_updated_at",e.task.doc_updated_at),e.appendCustomField(a,"doc_updated_by",e.task.doc_updated_by),e.appendCustomField(a,"tags",e.task.tags),e.appendCustomField(a,"priority",e.task.priority),e.appendCustomField(a,"owner",e.task.owner),a.length>0&&(r.custom_fields=a),r}var Ek=u(()=>{De();Ce();Ql();Ck();Pk();rc();});async function AS(e,t,r,n,o,i){let a=`${e.baseUrl}/${r.replace(/^\//u,"")}`;if(o){let l=new URLSearchParams;for(let[g,h]of Object.entries(o))h!=null&&l.append(g,q(h));let p=l.toString();p&&(a+=`?${p}`);}let s=Math.max(1,i?.attempts??3),c=i?.backoff??.5,d=null;for(let l=1;l<=s;l++)try{let p=await fetch(a,{method:t,headers:{"Content-Type":"application/json","X-Redmine-API-Key":e.apiKey},body:n?JSON.stringify(n):void 0}),g=await p.text();if(!p.ok){if((p.status===429||p.status>=500)&&l<s){await Lo(c*l*1e3);continue}throw new te(`Redmine API error: ${p.status} ${g}`,"E_BACKEND")}if(!g)return {};try{let h=JSON.parse(g);return F(h)?h:{}}catch{return {}}}catch(p){if(d=p,p instanceof te)throw p;if(l>=s)throw new It("Redmine unavailable");await Lo(c*l*1e3);}throw d instanceof Error?d:new It("Redmine unavailable")}var OS=u(()=>{De();Ce();});async function DS(e){let t=[],r=[],n=0,o=100;for(e.issueCache.clear();;){let s=await e.requestJson("GET","issues.json",void 0,{project_id:e.projectId,limit:o,offset:n,status_id:"*"}),d=(Array.isArray(s.issues)?s.issues:[]).filter(p=>F(p));r.push(...d);let l=Number(s.total_count??0);if(l===0||n+o>=l)break;n+=o;}let i=new Set,a=new Set;for(let s of r){let c=e.customFieldValue(s,e.taskFieldId);if(!c)continue;let d=q(c);Zi.test(d)&&(i.has(d)&&a.add(d),i.add(d));}if(a.size>0){let s=[...a].toSorted().slice(0,5).join(", ");throw new te(`Duplicate task_id values found in Redmine: ${s}`,"E_BACKEND")}for(let s of r){let c=e.customFieldValue(s,e.taskFieldId),d=q(c);if(!d||!Zi.test(d))continue;let l=e.issueToTask(s,d);if(l){let p=q(l.id);p&&e.issueCache.set(p,s),t.push(l);}}return t}async function NS(e){let t=q(e.taskId).trim();if(!t)return null;let r=e.issueCache.get(t);if(r)return r;let n=await e.requestJson("GET","issues.json",void 0,{project_id:e.projectId,status_id:"*",[`cf_${String(e.taskFieldId)}`]:t,limit:100}),o=Array.isArray(n.issues)?n.issues:[];for(let a of o){if(!F(a))continue;let s=e.customFieldValue(a,e.taskFieldId);if(s&&String(s)===t)return e.issueCache.set(t,a),a}return await e.refreshList(),e.issueCache.get(t)??null}var jS=u(()=>{De();Ce();});function Ik(e){e.doc!==void 0&&(e.doc_version=ut(e.doc_version),e.doc_updated_at??=Ut(),e.doc_updated_by??=Ze);}async function Ak(e,t,r){if(!e.cache)return;let n={...t,dirty:r};await e.cache.writeTask(n);}function Ok(e,t,r){if(r?.expectedRevision!==void 0&&!e.capabilities.supports_revision_guarded_writes)throw new te(`Task revision guarding is unavailable for ${t} without AGENTPLANE_REDMINE_CUSTOM_FIELDS_CANONICAL_STATE`,"E_BACKEND")}function Dk(e,t,r){if(t===void 0)return;let n=Math.trunc(t);if(!(n<=0||n===r))throw new te(`Task revision changed concurrently: ${e} (expected revision ${n}, current revision ${r})`,"E_BACKEND")}function sa(e){let t=e.customFields?.task_id;if(t)return t;throw new te(nn("AGENTPLANE_REDMINE_CUSTOM_FIELDS_TASK_ID"),"E_BACKEND")}function Nk(e,t,r){RS(e,t,r);}function jk(e){return e===2||e===3?e:null}var Zl=u(()=>{Ce();Ql();});async function $k(e){let t=sa(e);return await DS({projectId:e.projectId,taskFieldId:t,issueCache:e.issueCache,requestJson:async(r,n,o,i)=>await e.requestJson(r,n,o,i),customFieldValue:(r,n)=>e.customFieldValue(r,n),issueToTask:(r,n)=>e.issueToTask(r,n)})}async function Mk(e,t){let r=sa(e);return await NS({taskId:t,projectId:e.projectId,taskFieldId:r,issueCache:e.issueCache,requestJson:async(n,o,i,a)=>await e.requestJson(n,o,i,a),customFieldValue:(n,o)=>e.customFieldValue(n,o),refreshList:async()=>{await e.listTasksRemote();}})}function Fk(e,t,r){return ES({issue:t,taskIdOverride:r,reverseStatus:e.reverseStatus,customFields:e.customFields,ownerAgent:e.ownerAgent,defaultDocVersion:Ws})}function Bk(e,t,r){return IS({task:t,existingIssue:r,statusMap:e.statusMap,assigneeId:e.assigneeId,customFields:e.customFields,appendCustomField:(n,o,i)=>em(e,n,o,i)})}function em(e,t,r,n){CS({customFields:e.customFields,fields:t,key:r,value:n});}function Lk(e){return Xl(e)}async function qk(e,t,r,n){await SS({issueId:t,existingComments:r,desiredComments:n,requestJson:async(o,i,a,s)=>await tm(e,o,i,a,s)});}function Hk(e,t){return pt(e,t)}function Gk(e){return Wo(e)}function Vk(e,t){return uS(e,t)}function Uk(e,t){return pS(e,t)}async function tm(e,t,r,n,o,i){return await AS({baseUrl:e.baseUrl,apiKey:e.apiKey},t,r,n,o,i)}var Wk=u(()=>{Ce();Pk();OS();Ql();Ek();Ck();jS();gk();Zl();});var zk,$S=u(()=>{Ce();Ek();Wk();Zl();zk={setInferredStatusByTaskStatus(e){this.inferredStatusByTaskStatus=e;},ensureDocMetadata(e){Ik(e);},async cacheTask(e,t){await Ak(this,e,t);},assertExpectedRevisionSupported(e,t){Ok(this,e,t);},assertExpectedRevision(e,t,r){Dk(e,t,r);},taskIdFieldId(){return sa(this)},setIssueCustomFieldValue(e,t,r){Nk(e,t,r);},async listTasksRemote(){return await $k(this)},async findIssueByTaskId(e){return await Mk(this,e)},issueToTask(e,t){return Fk(this,e,t)},taskToIssuePayload(e,t){return Bk(this,e,t)},appendCustomField(e,t,r){em(this,e,t,r);},normalizeComments(e){return Lk(e)},commentsToPairs(e){let t=[];for(let r of e){let n=q(r.author).trim(),o=q(r.body).trim();!n&&!o||t.push([n,o]);}return t},formatCommentNote(e="unknown",t=""){return `[comment] ${e}: ${t}`.trim()},async appendCommentNotes(e,t,r){await qk(this,e,t,r);},startDateFromTaskId(e){return Tk(e)},doneRatioForStatus(e){return Sk(e)},customFieldValue(e,t){return Hk(e,t)},maybeParseJson(e){return Gk(e)},coerceDocVersion(e){return jk(e)},diffTasks(e,t){return Vk(e,t)},tasksDiffer(e,t){return Uk(e,t)},async requestJson(e,t,r,n,o){return await tm(this,e,t,r,n,o)}};});var MS=u(()=>{xS();$S();Wk();Zl();});function ca(e){let t=process.env[e];if(typeof t!="string")return;let r=t.trim();return r.length>0?r:void 0}function zt(e,t){let r=ca(e);if(!r)return;if(!/^\d+$/u.test(r))throw new te(zh(e,"a positive integer"),"E_BACKEND");let n=Number(r),o=t?.min??(t?.allowZero?0:1);if(!Number.isFinite(n)||n<o)throw new te(zh(e,`an integer >= ${o}`),"E_BACKEND");return n}function FS(){let e={},t=zt("AGENTPLANE_REDMINE_CUSTOM_FIELDS_TASK_ID");t!==void 0&&(e.task_id=t);let r=zt("AGENTPLANE_REDMINE_CUSTOM_FIELDS_CANONICAL_STATE");r!==void 0&&(e.canonical_state=r);let n=zt("AGENTPLANE_REDMINE_CUSTOM_FIELDS_DOC");n!==void 0&&(e.doc=n);let o=zt("AGENTPLANE_REDMINE_CUSTOM_FIELDS_DOC_VERSION");o!==void 0&&(e.doc_version=o);let i=zt("AGENTPLANE_REDMINE_CUSTOM_FIELDS_DOC_UPDATED_AT");i!==void 0&&(e.doc_updated_at=i);let a=zt("AGENTPLANE_REDMINE_CUSTOM_FIELDS_DOC_UPDATED_BY");a!==void 0&&(e.doc_updated_by=a);let s=zt("AGENTPLANE_REDMINE_CUSTOM_FIELDS_TAGS");s!==void 0&&(e.tags=s);let c=zt("AGENTPLANE_REDMINE_CUSTOM_FIELDS_PRIORITY");c!==void 0&&(e.priority=c);let d=zt("AGENTPLANE_REDMINE_CUSTOM_FIELDS_OWNER");return d!==void 0&&(e.owner=d),{url:ca("AGENTPLANE_REDMINE_URL"),apiKey:ca("AGENTPLANE_REDMINE_API_KEY"),projectId:ca("AGENTPLANE_REDMINE_PROJECT_ID"),assigneeId:zt("AGENTPLANE_REDMINE_ASSIGNEE_ID"),ownerAgent:ca("AGENTPLANE_REDMINE_OWNER")??ca("AGENTPLANE_REDMINE_OWNER_AGENT"),customFields:e,batch:{size:zt("AGENTPLANE_REDMINE_BATCH_SIZE"),pauseMs:zt("AGENTPLANE_REDMINE_BATCH_PAUSE",{allowZero:true,min:0})}}}var BS=u(()=>{Ce();});var da,Kk=u(()=>{De();aS();gk();vS();MS();BS();Ce();da=class{id="redmine";capabilities={canonical_source:"remote",projection:"cache",projection_read_mode:"native",reads_from_projection_by_default:true,writes_task_readmes:true,supports_task_revisions:false,supports_revision_guarded_writes:false,may_access_network_on_read:false,may_access_network_on_write:true,supports_projection_refresh:true,supports_push_sync:true,supports_snapshot_export:true};baseUrl;apiKey;projectId;assigneeId;ownerAgent;statusMap;customFields;batchSize;batchPauseMs;cache;issueCache=new Map;reverseStatus=new Map;inferredStatusByTaskStatus=null;constructor(t,r){let n=FS();this.baseUrl=Js(n.url,t.url).replaceAll(/\/+$/gu,""),this.apiKey=Js(n.apiKey,t.api_key),this.projectId=Js(n.projectId,t.project_id),this.assigneeId=n.assigneeId??null,this.statusMap=F(t.status_map)?t.status_map:{},this.customFields={...F(t.custom_fields)?t.custom_fields:{},...n.customFields},this.batchSize=n.batch.size??(typeof t.batch_size=="number"&&Number.isFinite(t.batch_size)?Math.max(1,Math.trunc(t.batch_size)):20),this.batchPauseMs=n.batch.pauseMs??(typeof t.batch_pause=="number"&&Number.isFinite(t.batch_pause)?t.batch_pause>=1?Math.trunc(t.batch_pause):Math.round(t.batch_pause*1e3):500),this.ownerAgent=Js(n.ownerAgent,t.owner_agent,"REDMINE"),this.cache=r.cache??null;let o=[];if(this.baseUrl||o.push("AGENTPLANE_REDMINE_URL"),this.apiKey||o.push("AGENTPLANE_REDMINE_API_KEY"),this.projectId||o.push("AGENTPLANE_REDMINE_PROJECT_ID"),o.length>0)throw new te(nn(o),"E_BACKEND");if(!this.customFields?.task_id)throw new te(nn("AGENTPLANE_REDMINE_CUSTOM_FIELDS_TASK_ID"),"E_BACKEND");let i=!!this.customFields?.canonical_state;this.capabilities={...this.capabilities,supports_task_revisions:i,supports_revision_guarded_writes:i};for(let[a,s]of Object.entries(this.statusMap))typeof s=="number"&&this.reverseStatus.set(s,a);}setInferredStatusByTaskStatus(t){this.inferredStatusByTaskStatus=t;}runtimeHost(){return this}async generateTaskId(t){return await hk(Xn(this.runtimeHost()),t)}async listTasks(){return await fk(Wt(this.runtimeHost()))}async listProjectionTasks(){return await XT(Wt(this.runtimeHost()))}async exportTasksJson(t){await ZT(Wt(this.runtimeHost()),t);}async exportProjectionSnapshot(t){await eS(Wt(this.runtimeHost()),t);}async refreshProjection(t){if(!t.allowNetwork)throw new te("Projection refresh requires network access approval","E_BACKEND");await Yl(Xn(this.runtimeHost()),t.conflict??"prefer-remote",t.quiet??true);}async normalizeTasks(){return await tS(Wt(this.runtimeHost()))}async migrateCanonicalState(){return await yk(Xn(this.runtimeHost()))}async inspectConfiguration(){return await mS(Rk(this.runtimeHost()))}async getTask(t){return await Wl(Wt(this.runtimeHost()),t)}async getTasks(t){return await rS(Wt(this.runtimeHost()),t)}async getTaskDoc(t){return await nS(Wt(this.runtimeHost()),t)}async setTaskDoc(t,r,n,o){await oS(Wt(this.runtimeHost()),t,r,n,o);}async touchTaskDocMetadata(t,r,n){await iS(Wt(this.runtimeHost()),t,r,n);}async writeTask(t,r){await vk(Xn(this.runtimeHost()),t,r);}async writeTasks(t,r){await xk(Xn(this.runtimeHost()),t,r);}async sync(t){await _k(Xn(this.runtimeHost()),t);}};Object.assign(da.prototype,zk);});function s2(e){let t={},r=e.split(/\r?\n/u);for(let n of r){let o=n.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i<=0)continue;let a=o.slice(0,i).trim(),s=o.slice(i+1).trim();if(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'")){let c=s[0];s=s.slice(1,-1),c==='"'&&(s=s.replaceAll(String.raw`\n`,`
27
+ `).replaceAll(String.raw`\r`,"\r").replaceAll(String.raw`\t`," ").replaceAll(String.raw`\"`,'"').replaceAll(String.raw`\\`,"\\"));}a&&(t[a]=s);}return t}function qS(e=process.env){let t=e[LS]?.trim()??"";return t?new Set(t.split(",").map(r=>r.trim()).filter(Boolean)):new Set}function c2(e,t=process.env){let r=qS(t);r.add(e),t[LS]=[...r].toSorted().join(",");}function nc(e,t=process.env){return qS(t).has(e)}async function rm(e){let t=Ye.join(e,".env"),r="";try{r=await readFile(t,"utf8");}catch(o){if(o?.code==="ENOENT")return;throw o}let n=s2(r);for(let[o,i]of Object.entries(n))process.env[o]===void 0&&(process.env[o]=i,c2(o));}var LS,nm=u(()=>{LS="AGENTPLANE_DOTENV_LOADED_KEYS";});async function u2(e){try{let t=JSON.parse(await readFile(e,"utf8"));return F(t)?t:null}catch(t){if(t?.code==="ENOENT")return null;throw t}}function p2(e){let t=VS(e.resolved.gitRoot,e.settings.dir)??Ye.join(e.resolved.gitRoot,e.config.paths.workflow_dir);return {backend:new Yn({dir:t}),backendId:"local"}}async function f2(e){await rm(e.resolved.gitRoot);let r=VS(e.resolved.gitRoot,e.settings.cache_dir)??Ye.join(e.resolved.gitRoot,e.config.paths.workflow_dir),n=r?new Yn({dir:r}):null;return {backend:new da(e.settings,{cache:n}),backendId:"redmine"}}function g2(e){return HS[e]??HS.local}async function GS(e){let t=Ye.join(e.resolved.gitRoot,e.config.tasks_backend.config_path),r=await u2(t),n=h2(r),o=n.id,i=n.settings,a=await g2(o)({resolved:e.resolved,config:e.config,settings:i});return {backend:a.backend,backendId:a.backendId,resolved:e.resolved,config:e.config,backendConfigPath:t}}function VS(e,t){if(!t)return null;let r=q(t).trim();return r?Ye.isAbsolute(r)?r:Ye.join(e,r):null}function h2(e){if(!F(e))return {id:"local",version:1,settings:{}};let t=q(e.id).trim()||"local",r=typeof e.version=="number"?e.version:1,n=F(e.settings)?e.settings:{};return {id:t,version:r,settings:n}}async function ic(e){let t=e.resolvedProject??await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null});if(e.config)return await GS({resolved:t,config:e.config});let n=(await loadConfig(t.agentplaneDir)).config;return await GS({resolved:t,config:n})}var HS,US=u(()=>{nm();De();mk();Kk();Ce();HS={local:p2,redmine:f2};});var zo=u(()=>{Ce();mk();Kk();US();});function WS(e){if(e)return k2[e]}var k2,zS=u(()=>{k2={usage_help:{code:"usage_help",category:"usage",summary:"command invocation is incomplete or invalid",action:"open command help and fix required args/flags"},sync_backend_mismatch:{code:"sync_backend_mismatch",category:"backend",summary:"sync command backend id does not match active backend",action:"inspect config and rerun sync for matching backend"},reconcile_git_state_unreadable:{code:"reconcile_git_state_unreadable",category:"reconcile",summary:"reconcile guard cannot read git state",action:"run git status and fix repository visibility/permissions"},reconcile_task_scan_failed:{code:"reconcile_task_scan_failed",category:"reconcile",summary:"reconcile guard could not complete task scan",action:"run strict task scan and resolve parse/read errors"},reconcile_task_scan_incomplete:{code:"reconcile_task_scan_incomplete",category:"reconcile",summary:"task scan produced skipped files/warnings",action:"resolve scan warnings before mutating commands"},git_branch_state:{code:"git_branch_state",category:"git",summary:"branch command cannot determine branch state",action:"inspect branch state and repository context"},git_index_state:{code:"git_index_state",category:"git",summary:"commit command found problematic index/worktree state",action:"inspect staged/unstaged changes and retry"},git_context:{code:"git_context",category:"git",summary:"command requires valid git repository context",action:"confirm repository root and tracked changes"},integrate_base_checkout_required:{code:"integrate_base_checkout_required",category:"git",summary:"integrate was launched from a task worktree instead of the registered base checkout",action:"rerun integrate against the base checkout/worktree for the resolved base branch"},git_task_commit_blocked:{code:"git_task_commit_blocked",category:"git",summary:"task-scoped commit was blocked after guard validation passed",action:"inspect the staged payload and fix the blocking hook or policy failure"},git_close_commit_blocked:{code:"git_close_commit_blocked",category:"git",summary:"deterministic close commit was blocked after staging the task README",action:"inspect the staged close payload and fix the blocking hook or policy failure"},git_close_commit_dirty_index:{code:"git_close_commit_dirty_index",category:"git",summary:"close commit cannot proceed while unrelated paths are already staged",action:"clear the git index and rerun the close commit flow"},git_pre_commit_format:{code:"git_pre_commit_format",category:"git",summary:"a formatting check in the pre-commit path blocked the commit",action:"run the formatter, stage the resulting changes, and retry the commit"},git_pre_commit_lint:{code:"git_pre_commit_lint",category:"git",summary:"a lint check in the pre-commit path blocked the commit",action:"run lint, fix the reported errors, and retry the commit"},protected_base_integrate_handoff:{code:"protected_base_integrate_handoff",category:"handoff",summary:"integrate intentionally stopped before mutating a protected base branch",action:"inspect the persisted handoff route, merge the GitHub PR, then pull the base branch after hosted close finishes"},network_gate:{code:"network_gate",category:"network",summary:"network access is blocked by policy or environment",action:"recheck approvals/connectivity and retry"},backend_sync_config:{code:"backend_sync_config",category:"backend",summary:"sync command failed due to backend configuration",action:"inspect backend config and active backend settings"},backend_config:{code:"backend_config",category:"backend",summary:"backend configuration is missing or invalid",action:"inspect backend config under .agentplane/backends"},validation_preflight:{code:"validation_preflight",category:"validation",summary:"input/config validation failed before execution",action:"run preflight and fix reported validation issues"}};});function w2(e){if(isZodErrorLike(e))return e;if(e instanceof Error){let t=e.cause;if(isZodErrorLike(t))return t}return null}function b2(e){return fromZodError(e,{prefix:"Validation error"}).message}function O(e,t){let r=e instanceof Error?e.message:String(e),n=w2(e);return n?new Xi({message:b2(n),context:t}):r.startsWith("Not a git repository")||r.startsWith("Detached HEAD")||r.includes("failed to resolve current branch")?new El({message:r,context:t}):e instanceof SyntaxError?new Xi({message:`Invalid JSON: ${r}`,context:t}):r.includes("schema_version")||r.startsWith("config.")?new Xi({message:r,context:t}):new Sl({message:r,context:t})}function E(e,t){return e instanceof te?e.code==="E_NETWORK"?new Al({message:e.message,context:t}):new Il({message:e.message,context:t}):O(e,t)}function Jk(e,t){let r=_2(e),o=(typeof e.context?.reason_code=="string"?String(e.context.reason_code):void 0)??r.nextAction?.reasonCode,i=WS(o);if(t){process.stdout.write(`${lT(e,{state:r.state,likelyCause:r.likelyCause,hint:r.hint,nextAction:r.nextAction,reasonDecode:i})}
28
+ `);return}let a=`error [${e.code}]`;e.message.includes(`
29
+ `)?process.stderr.write(`${a}
30
+ ${e.message}
31
+ `):process.stderr.write(`${a}: ${e.message}
32
+ `),r.state&&process.stderr.write(`state: ${r.state}
33
+ `),r.likelyCause&&process.stderr.write(`likely_cause: ${r.likelyCause}
34
+ `),r.hint&&process.stderr.write(`hint: ${r.hint}
35
+ `),r.nextAction&&process.stderr.write(`next_action: ${r.nextAction.command} (${r.nextAction.reason})
36
+ `),i&&(process.stderr.write(`reason_code: ${i.code} [${i.category}] ${i.summary}
37
+ `),process.stderr.write(`reason_action: ${i.action}
38
+ `));}function _2(e){let t=dT(e.context),r=typeof e.context?.command=="string"?e.context.command:void 0,n=typeof e.context?.reason_code=="string"?String(e.context.reason_code):void 0,o=r?`agentplane help ${r} --compact`:"agentplane help",i=a=>({state:t.state??a.state,likelyCause:t.likelyCause??a.likelyCause,hint:t.hint??a.hint,nextAction:t.nextAction??a.nextAction});switch(e.code){case "E_USAGE":return i(n==="sync_backend_mismatch"?{hint:"Configured backend id mismatch. Check active backend and retry with a matching id.",nextAction:{command:"agentplane config show",reason:"inspect active backend id before running sync",reasonCode:"sync_backend_mismatch"}}:{hint:`See \`${o}\` for usage.`,nextAction:{command:o,reason:"inspect required arguments and flags",reasonCode:"usage_help"}});case "E_GIT":return n==="integrate_base_checkout_required"?i({hint:"Integrate must run from the base checkout, not from the task branch worktree.",nextAction:{command:"git worktree list",reason:"locate the registered base checkout if the rerun command is not already provided",reasonCode:n}}):n==="reconcile_git_state_unreadable"?i({hint:"Reconcile check could not read git state.",nextAction:{command:"git status --short --untracked-files=no",reason:"confirm repository state is readable before mutating commands",reasonCode:"reconcile_git_state_unreadable"}}):r?.startsWith("branch")?i({hint:"Check git repo/branch; run `git branch` or pass --root <path>.",nextAction:{command:"git branch",reason:"inspect repository branch state",reasonCode:"git_branch_state"}}):i(r==="guard commit"||r==="commit"?{hint:"Check git status/index; stage changes and retry.",nextAction:{command:"git status --short",reason:"inspect staged/unstaged changes before commit",reasonCode:"git_index_state"}}:{hint:"Check git repo context; pass --root <path> if needed.",nextAction:{command:"git status --short --untracked-files=no",reason:"confirm repository context and tracked changes",reasonCode:"git_context"}});case "E_HANDOFF":return i({hint:"This is an intentional handoff route, not a local mutation failure.",nextAction:{command:r==="integrate"?"agentplane task handoff show <task-id>":o,reason:"inspect the persisted finalize route and continue through the external handoff path",reasonCode:"protected_base_integrate_handoff"}});case "E_NETWORK":return i({hint:"Check network access and credentials.",nextAction:{command:"agentplane preflight --json",reason:"recheck approvals and network requirements",reasonCode:"network_gate"}});case "E_RUNTIME":return i({hint:"Inspect runner artifacts and the external runner result before retrying.",nextAction:{command:"agentplane doctor",reason:"confirm runtime wiring and recent runner state before rerunning the command",reasonCode:"runtime_runner_state"}});case "E_BACKEND":return r?.includes("sync")?i({hint:"Check backend config under .agentplane/backends and retry.",nextAction:{command:"agentplane config show",reason:"verify backend config path and active settings",reasonCode:"backend_sync_config"}}):i({hint:"Check backend config under .agentplane/backends.",nextAction:{command:"agentplane config show",reason:"inspect backend configuration",reasonCode:"backend_config"}});case "E_VALIDATION":return i(n==="reconcile_task_scan_failed"||n==="reconcile_task_scan_incomplete"?{hint:"Reconcile check failed due to task scan drift or parse/read errors.",nextAction:{command:"agentplane task list --strict-read",reason:"surface task scan/read failures before retrying mutating commands",reasonCode:n}}:{hint:"Fix invalid config/input shape and rerun.",nextAction:{command:"agentplane preflight --json",reason:"pinpoint validation failure in one report",reasonCode:"validation_preflight"}});default:return i({})}}var D=u(()=>{Et();v();zo();zS();});var om,JS=u(()=>{om=class{nowIso(){return new Date().toISOString()}};});function A2(e){return e.isSymbolicLink()?"symlink":e.isDirectory()?"dir":"file"}var im,XS=u(()=>{im=class{async readFileText(t){return await readFile(t,"utf8")}async readFileBytes(t){return await readFile(t)}async writeFileText(t,r){await writeFile(t,r,"utf8");}async writeFileBytes(t,r){await writeFile(t,r);}async mkdirp(t){await mkdir(t,{recursive:true});}async readdir(t){return await readdir(t)}async lstat(t){let r=await lstat(t);return {kind:A2(r),mtimeMs:r.mtimeMs}}async rm(t){await rm$1(t,{recursive:true,force:true});}async readlink(t){return await readlink(t)}async symlink(t,r){await symlink(t,r);}async copyFileStream(t,r){await pipeline(createReadStream(t),createWriteStream(r));}};});var am,ZS=u(()=>{am=class{inner;constructor(t){this.inner=t;}statusChangedPaths(){return this.inner.statusChangedPaths()}statusStagedPaths(){return this.inner.statusStagedPaths()}statusUnstagedTrackedPaths(){return this.inner.statusUnstagedTrackedPaths()}headCommit(){return this.inner.headCommit()}headHashSubject(){return this.inner.headHashSubject()}stage(t){return this.inner.stage(t)}commit(t){return this.inner.commit(t)}};});var sm,eE=u(()=>{sm=class{ctx;listProjectionTasks;constructor(t){this.ctx=t,this.listProjectionTasks=t.taskBackend.listProjectionTasks?()=>t.taskBackend.listProjectionTasks():void 0;}get capabilities(){let{canonical_source:t,projection:r,projection_read_mode:n,reads_from_projection_by_default:o}=this.ctx.taskBackend.capabilities;return {canonical_source:t,projection:r,projection_read_mode:n,reads_from_projection_by_default:o}}listTasks(){return this.ctx.taskBackend.listTasks()}getTask(t){return this.ctx.taskBackend.getTask(t)}writeTask(t,r){return this.ctx.taskBackend.writeTask(t,r)}exportProjectionSnapshot(t){let r=this.ctx.taskBackend;if(r.exportProjectionSnapshot)return r.exportProjectionSnapshot(t);if(!r.exportTasksJson)throw new Error("Backend does not support exportProjectionSnapshot");return r.exportTasksJson(t)}};});function tE(e){return {fs:new im,git:new am(e.git),tasks:new sm(e),clock:new om}}var rE=u(()=>{JS();XS();ZS();eE();});function D2(e=process.env){let t=e.AGENTPLANE_TRACE?.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function Me(e,t){if(!D2(t?.env))return;(createLogger({mode:"json",stdout:t?.stderr,stderr:t?.stderr})).write({kind:"trace",stream:"stderr",component:e.component,event:e.event,details:e.details});}var la=u(()=>{});function G2(e){let t=e?.trim()??"";return !t||t.toLowerCase()==="agentplane"?"":t}function ac(e,t){return G2(resolveTaskDocUpdatedBy({comments:e.comments??null,doc_updated_by:e.doc_updated_by,owner:e.owner},t))}function Ir(e){let t=e.plan_approval??{state:"pending",updated_at:null,updated_by:null,note:null},r=e.verification??{state:"pending",updated_at:null,updated_by:null,note:null},n=Number.isInteger(e.revision)&&Number(e.revision)>0?Number(e.revision):1,o=e.doc===void 0?e.sections&&Object.keys(e.sections).length>0?e.sections:void 0:taskDocToSectionMap(e.doc);return {id:e.id,title:e.title,result_summary:e.result_summary,risk_level:e.risk_level,breaking:e.breaking,status:e.status,priority:e.priority,owner:e.owner,revision:n,origin:e.origin??void 0,depends_on:e.depends_on??[],tags:e.tags??[],verify:e.verify??[],plan_approval:t,verification:r,runner:e.runner??void 0,commit:e.commit??null,comments:e.comments??[],events:e.events??[],doc_version:e.doc_version,doc_updated_at:e.doc_updated_at,doc_updated_by:e.doc_updated_by,description:e.description??"",sections:o,id_source:e.id_source,dirty:e.dirty}}function aE(e){let t=e.taskBackend?.capabilities;if(t)return t;let r=e.backendId==="local";return {canonical_source:r?"local":"remote",projection:r?"canonical":"cache",projection_read_mode:"native",reads_from_projection_by_default:!r,writes_task_readmes:r,supports_task_revisions:r,supports_revision_guarded_writes:r,may_access_network_on_read:!r,may_access_network_on_write:!r,supports_projection_refresh:!r,supports_push_sync:!r,supports_snapshot_export:true}}function V2(e){return aE(e).canonical_source==="local"}function U2(e){return aE(e).writes_task_readmes===true}function ua(e){return V2(e)&&U2(e)}function Fe(e){return ua(e)}async function R(e){let t=await ic({cwd:e.cwd,rootOverride:e.rootOverride??null,resolvedProject:e.resolvedProject,config:e.config}),{backend:r,backendId:n,backendConfigPath:o,resolved:i,config:a}=t;return Me({component:"backend-ops",event:"command_context_loaded",details:{backend:n,config_path:Ye.relative(i.gitRoot,o),canonical_source:r.capabilities?.canonical_source??null}}),{resolvedProject:i,config:a,taskBackend:r,backendId:n,backendConfigPath:o,git:new GitContext({gitRoot:i.gitRoot}),memo:{}}}async function ue(e){let t=Ye.join(e.ctx.resolvedProject.gitRoot,e.ctx.config.paths.workflow_dir),r=Ye.join(t,e.taskId,"README.md"),n=()=>Yk({ctx:e.ctx,taskId:e.taskId,readmePath:r,branch:e.branchSnapshotBranch??null});if(e.preferBranchSnapshot){let a=await n();if(a)return a}let o=await e.ctx.taskBackend.getTask(e.taskId);if(o)return Me({component:"backend-ops",event:"task_loaded",details:{task_id:e.taskId,backend:e.ctx.backendId}}),o;let i=await n();if(i)return Me({component:"backend-ops",event:"task_loaded_from_branch_snapshot",details:{task_id:e.taskId,backend:e.ctx.backendId}}),i;throw new m({exitCode:4,code:"E_IO",message:`ENOENT: no such file or directory, open '${r}'`})}async function sc(e){if(!ua(e.ctx))return null;let t=e.ctx.config.branch.task_prefix,n=(await gitListTaskBranches(e.ctx.resolvedProject.gitRoot,t)).filter(o=>parseTaskIdFromBranch(t,o)===e.taskId);if(n.length===1)return n[0]??null;if(n.length>1)throw new m({exitCode:3,code:"E_VALIDATION",message:`Multiple task branches match ${e.taskId}: ${n.join(", ")}`});return null}async function Yk(e){if(!ua(e.ctx))return null;let t=typeof e.branch=="string"&&e.branch.trim().length>0?e.branch.trim():await sc({ctx:e.ctx,taskId:e.taskId});if(!t)return null;let r=await findWorktreeForBranch(e.ctx.resolvedProject.gitRoot,t);if(r){let d=Ye.join(r,Ye.relative(e.ctx.resolvedProject.gitRoot,e.readmePath));try{let l=await readFile(d,"utf8"),p=parseTaskReadme(l),g=validateTaskReadmeFrontmatter(withTaskReadmeFrontmatterDefaults({...p.frontmatter,id:typeof p.frontmatter.id=="string"&&p.frontmatter.id.trim().length>0?p.frontmatter.id:e.taskId}));return Sr({id:e.taskId,frontmatter:g,body:p.body,readmePath:e.readmePath})}catch{}}let n=toGitPath(Ye.relative(e.ctx.resolvedProject.gitRoot,e.readmePath)),o=[t,t.startsWith("origin/")?null:`origin/${t}`].filter(d=>!!(d&&d.trim().length>0)),i="",a=false;for(let d of o)try{i=await gitShowFile(e.ctx.resolvedProject.gitRoot,d,n),a=!0;break}catch{}if(!a)return null;let s=parseTaskReadme(i),c=validateTaskReadmeFrontmatter(withTaskReadmeFrontmatterDefaults({...s.frontmatter,id:typeof s.frontmatter.id=="string"&&s.frontmatter.id.trim().length>0?s.frontmatter.id:e.taskId}));return Sr({id:e.taskId,frontmatter:c,body:s.body,readmePath:e.readmePath})}async function Kt(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await ue({ctx:t,taskId:e.taskId});return {backend:t.taskBackend,backendId:t.backendId,backendConfigPath:t.backendConfigPath,resolved:t.resolvedProject,config:t.config,task:r}}async function sE(e,t){if(t.length!==0){if(e.writeTasks){await e.writeTasks([...t]);return}for(let r of t)await e.writeTask(r);}}async function Er(e){return e.memo.taskProjection??=(async()=>{if(e.taskBackend.capabilities?.projection_read_mode==="native"){if(!e.taskBackend.listProjectionTasks)throw new m({exitCode:1,code:"E_INTERNAL",message:`Backend ${e.taskBackend.id} advertises native projection reads but does not implement listProjectionTasks()`});return await e.taskBackend.listProjectionTasks()}return (await e.taskBackend.listTasks()).map(r=>Vo(r))})(),await e.memo.taskProjection}async function cE(e){return e.taskBackend.capabilities?.projection_read_mode==="native"?await Er(e):e.taskBackend.capabilities?.reads_from_projection_by_default?await Er(e):null}async function cm(e){if(e.ctx.taskBackend.exportProjectionSnapshot){await e.ctx.taskBackend.exportProjectionSnapshot(e.outputPath);return}if(e.ctx.taskBackend.exportTasksJson){await e.ctx.taskBackend.exportTasksJson(e.outputPath);return}throw new m({exitCode:3,code:"E_VALIDATION",message:"Configured backend does not support exporting a task snapshot"})}var N=u(()=>{v();la();zo();});function ct(){return {ok:true,errors:[],warnings:[]}}function dE(e){return {code:"E_USAGE",exitCode:2,message:e}}function et(e){return {code:"E_GIT",exitCode:5,message:e}}function dm(e){return {code:"E_INTERNAL",exitCode:1,message:e}}function Qk(...e){let t=ct();for(let r of e)t.errors.push(...r.errors),t.warnings.push(...r.warnings);return t.ok=t.errors.length===0,t}var Ko=u(()=>{});function mE(e){let t=(e??"").trim();if(!t)return "";for(t=t.replaceAll("\\","/");t.startsWith("./");)t=t.slice(2);return t=t.replaceAll(/\/{2,}/g,"/"),t=t.replaceAll(/\/+$/g,""),t=t.replaceAll(/^\/+/g,""),t}function ft(e){let t=(e??"").trim();return t==="."||t==="./"||t===".\\"?".":mE(t)}function vt(e,t){let r=mE(e),n=ft(t);if(n==="."||n===""||r===n)return true;let o=Ye.posix.relative(n,r);return o===""||!o.startsWith("..")&&!Ye.posix.isAbsolute(o)}var pa=u(()=>{});function W2(e,t){let r=ft(e??""),n=(t??"").trim();return !r||!n?null:ft(`${r}/${n}`)}function lm(e){let t=new Set,r=ft(e.tasksPath);r&&t.add(r);let n=W2(e.workflowDir,e.taskId);return n&&t.add(n),[...t].toSorted((o,i)=>o.localeCompare(i))}function mm(e){let t=new Set;if(e.allowTasks)for(let r of lm(e))t.add(r);if(e.allowPolicy)for(let r of Xk)t.add(r);if(e.allowConfig)for(let r of Zk)t.add(r);if(e.allowHooks)for(let r of ey)t.add(r);if(e.allowCI)for(let r of ty)t.add(r);return [...t].toSorted((r,n)=>r.localeCompare(n))}function ry(e){switch(e){case "tasks":return {kind:e,cliFlag:"--allow-tasks",envVar:"AGENTPLANE_ALLOW_TASKS"};case "policy":return {kind:e,cliFlag:"--allow-policy",envVar:"AGENTPLANE_ALLOW_POLICY"};case "config":return {kind:e,cliFlag:"--allow-config",envVar:"AGENTPLANE_ALLOW_CONFIG"};case "hooks":return {kind:e,cliFlag:"--allow-hooks",envVar:"AGENTPLANE_ALLOW_HOOKS"};case "ci":return {kind:e,cliFlag:"--allow-ci",envVar:"AGENTPLANE_ALLOW_CI"}}}function fa(e){let t=e.filePath;return t?lm({tasksPath:e.tasksPath,workflowDir:e.workflowDir,taskId:e.taskId}).some(r=>vt(t,r))?"tasks":t==="AGENTS.md"||t==="CLAUDE.md"||t==="packages/agentplane/assets/AGENTS.md"||vt(t,"packages/agentplane/assets/policy")||vt(t,".agentplane/policy")||vt(t,".agentplane/agents")?"policy":t===".agentplane/config.json"||vt(t,".agentplane/backends")?"config":t==="lefthook.yml"?"hooks":vt(t,".github/workflows")||vt(t,".github/actions")?"ci":null:null}var Xk,Zk,ey,ty,Jo=u(()=>{pa();Xk=["AGENTS.md","CLAUDE.md","packages/agentplane/assets/AGENTS.md","packages/agentplane/assets/policy",".agentplane/policy",".agentplane/agents"],Zk=[".agentplane/config.json",".agentplane/backends"],ey=["lefthook.yml"],ty=[".github/workflows",".github/actions"];});function uE(e){let t=e.allow?.prefixes??[],r=e.git.stagedPaths??[],n=t.map(s=>ft(s)),o=mm({tasksPath:e.config.paths.tasks_path,workflowDir:e.config.paths.workflow_dir,taskId:e.taskId,allowTasks:e.allow?.allowTasks===true,allowPolicy:e.allow?.allowPolicy===true,allowConfig:e.allow?.allowConfig===true,allowHooks:e.allow?.allowHooks===true,allowCI:e.allow?.allowCI===true}),i=[...new Set([...n,...o])];if(r.length===0)return {ok:false,errors:[et("No staged files (git index empty)")],warnings:[]};if(i.length===0){let s=e.action==="guard_commit"||e.action==="commit"?"Provide at least one --allow <path> prefix":"Provide at least one allowlist prefix";return {ok:false,errors:[et(s)],warnings:[]}}if(i.includes("."))return {ok:false,errors:[et("Repo-wide allowlist ('.') is not allowed; choose minimal prefixes (tip: `agentplane guard suggest-allow --format args`).")],warnings:[]};let a=[];for(let s of r)i.some(c=>vt(s,c))||a.push(`Staged file is outside allowlist: ${s}`);return a.length>0?{ok:false,errors:a.map(s=>et(s)),warnings:[]}:ct()}var pE=u(()=>{pa();Jo();Ko();});function ny(e){if(e.config.workflow_mode!=="branch_pr")return ct();let t=e.git.baseBranch,r=e.git.currentBranch,n=e.git.stagedPaths??[],o=e.config.paths.tasks_path;if(!t)return {ok:false,errors:[dE("Base branch could not be resolved (use `agentplane branch base set`).")],warnings:[]};if(!r)return {ok:false,errors:[dm("Internal error: current branch is required in branch_pr mode")],warnings:[]};let i=e.allow?.allowBase===true,a=n.includes(o),s=n.filter(c=>c!==o);return a&&r!==t?{ok:false,errors:[et(`${o} commits are allowed only on ${t} in branch_pr mode`)],warnings:[]}:s.length>0&&r===t&&!i?{ok:false,errors:[et(`Code commits are forbidden on ${t} in branch_pr mode`)],warnings:[]}:ct()}var fE=u(()=>{Ko();});function gE(e){if(e.requireClean!==true)return ct();let t=e.git.unstagedTrackedPaths??null;return t?t.length>0?{ok:false,errors:[et("Working tree is dirty")],warnings:[]}:ct():{ok:false,errors:[dm("Internal error: unstaged tracked paths are required for requireClean")],warnings:[]}}var hE=u(()=>{Ko();});function oy(e){let t=(e.commit?.subject??"").trim();if(!t)return {ok:false,errors:[et("Commit message subject is empty")],warnings:[]};let r=validateCommitSubject({subject:t,taskId:(e.taskId??"").trim()||void 0,genericTokens:e.config.commit.generic_tokens});return r.ok?ct():{ok:false,errors:r.errors.map(n=>et(n)),warnings:[]}}var kE=u(()=>{Ko();});function K2(e){return e.action==="hook_pre_commit"?`${e.filePath} is protected by agentplane hooks (set ${e.overrideEnvVar}=1 to override)`:`Staged file is protected by default: ${e.filePath} (use ${e.overrideFlag} to override)`}function iy(e){let t=e.git.stagedPaths??[];if(t.length===0)return ct();let r=e.config.paths.tasks_path,n=e.allow?.allowTasks===true,o=e.allow?.allowPolicy===true,i=e.allow?.allowConfig===true,a=e.allow?.allowHooks===true,s=e.allow?.allowCI===true,c=[];for(let d of t){let l=fa({filePath:d,tasksPath:r,workflowDir:e.config.paths.workflow_dir,taskId:e.taskId});if(l){if(l==="tasks"&&!n){let p=ry(l);c.push(e.action==="hook_pre_commit"?`${r} is protected by agentplane hooks (set ${p.envVar}=1 to override)`:`Staged file is forbidden by default: ${d} (use ${p.cliFlag} to override)`);continue}if(!(l==="policy"&&o)&&!(l==="config"&&i)&&!(l==="hooks"&&a)&&!(l==="ci"&&s)&&l!=="tasks"){let p=ry(l);c.push(K2({action:e.action,filePath:d,overrideFlag:p.cliFlag,overrideEnvVar:p.envVar}));}}}return c.length>0?{ok:false,errors:c.map(d=>et(d)),warnings:[]}:ct()}var yE=u(()=>{Jo();Ko();});function Zn(e){if(!(e.taskId??"").trim()&&(e.action==="guard_commit"||e.action==="commit"))return {ok:false,errors:[et("Task id is required")],warnings:[]};switch(e.action){case "hook_commit_msg":return oy(e);case "hook_pre_commit":return Qk(iy(e),ny(e));case "guard_commit":case "commit":return Qk(oy(e),gE(e),ny(e),iy(e),uE(e));default:return ct()}}var cc=u(()=>{Ko();pE();fE();hE();kE();yE();});function wE(e){let t=J2[e];return t?{id:e,...t,source:"builtin"}:{id:e,family:"custom",summary:`Unclassified policy action: ${e}`,mutates_state:false,risky:false,destructive:false,approval:null,enforcement:"none",source:"custom"}}var J2,bE=u(()=>{J2={guard_commit:{family:"git",summary:"Guard a scoped git commit before mutating repository history.",mutates_state:true,risky:true,destructive:false,approval:null,enforcement:"git_rules"},commit:{family:"git",summary:"Create a repository commit under agentplane policy rules.",mutates_state:true,risky:true,destructive:false,approval:null,enforcement:"git_rules"},hook_pre_commit:{family:"git",summary:"Validate staged changes in the pre-commit hook.",mutates_state:false,risky:true,destructive:false,approval:null,enforcement:"git_rules"},hook_commit_msg:{family:"git",summary:"Validate the commit subject in the commit-msg hook.",mutates_state:false,risky:true,destructive:false,approval:null,enforcement:"git_rules"},network_access:{family:"network",summary:"Access the network from a command or adapter path.",mutates_state:false,risky:true,destructive:false,approval:"network_access",enforcement:"approval_only"},force_action:{family:"workflow",summary:"Override a guarded workflow or validation boundary.",mutates_state:true,risky:true,destructive:true,approval:"force_action",enforcement:"approval_only"},policy_write:{family:"policy",summary:"Modify policy gateway files or canonical policy modules.",mutates_state:true,risky:true,destructive:false,approval:"policy_write",enforcement:"approval_only"},config_write:{family:"config",summary:"Modify repository configuration that changes runtime behavior.",mutates_state:true,risky:true,destructive:false,approval:"config_write",enforcement:"approval_only"},dangerous_fs:{family:"filesystem",summary:"Perform potentially dangerous filesystem mutations.",mutates_state:true,risky:true,destructive:true,approval:"dangerous_fs",enforcement:"approval_only"},git_push:{family:"git",summary:"Push local refs to a remote git endpoint.",mutates_state:true,risky:true,destructive:false,approval:"git_push",enforcement:"approval_only"},task_list:{family:"task",summary:"Read the current task collection without mutating repository state.",mutates_state:false,risky:false,destructive:false,approval:null,enforcement:"none"},task_new:{family:"task",summary:"Create a new task record and its task-local artifacts.",mutates_state:true,risky:false,destructive:false,approval:null,enforcement:"none"},task_mutation:{family:"task",summary:"Mutate persisted task state through the task backend.",mutates_state:true,risky:false,destructive:false,approval:null,enforcement:"none"},task_status_transition:{family:"task",summary:"Transition a task lifecycle status and record workflow evidence.",mutates_state:true,risky:false,destructive:false,approval:null,enforcement:"none"},task_start:{family:"task",summary:"Move a task into DOING after task-start invariants pass.",mutates_state:true,risky:false,destructive:false,approval:null,enforcement:"none"},task_block:{family:"task",summary:"Move a task into BLOCKED and persist blocking evidence.",mutates_state:true,risky:false,destructive:false,approval:null,enforcement:"none"},task_set_status:{family:"task",summary:"Apply an explicit task status mutation outside the default lifecycle path.",mutates_state:true,risky:true,destructive:false,approval:null,enforcement:"none"},task_finish:{family:"task",summary:"Close work on a task and persist verified result metadata.",mutates_state:true,risky:false,destructive:false,approval:null,enforcement:"none"},task_plan_set:{family:"task",summary:"Update the task plan body and reset plan approval state as needed.",mutates_state:true,risky:false,destructive:false,approval:null,enforcement:"none"},task_plan_approve:{family:"task",summary:"Approve a task plan and advance workflow gating state.",mutates_state:true,risky:false,destructive:false,approval:null,enforcement:"none"},task_verify:{family:"task",summary:"Record task verification evidence and outcome.",mutates_state:true,risky:false,destructive:false,approval:null,enforcement:"none"},task_run:{family:"runner",summary:"Prepare or execute a runner invocation for a task.",mutates_state:true,risky:true,destructive:false,approval:null,enforcement:"none"},scenario_execute:{family:"runner",summary:"Prepare or execute a runner invocation for a recipe scenario.",mutates_state:true,risky:true,destructive:false,approval:null,enforcement:"none"},recipe_install:{family:"recipe",summary:"Install recipe assets into the repository or project recipe cache.",mutates_state:true,risky:true,destructive:false,approval:"network_access",enforcement:"approval_only"},recipe_list_remote:{family:"recipe",summary:"Fetch and list recipe catalog entries from a remote source.",mutates_state:false,risky:true,destructive:false,approval:"network_access",enforcement:"approval_only"},backend_sync:{family:"backend",summary:"Synchronize task state between the local repo and the configured backend.",mutates_state:true,risky:true,destructive:false,approval:"network_access",enforcement:"approval_only"},backend_migrate_canonical_state:{family:"backend",summary:"Mutate backend-managed canonical task state through a migration path.",mutates_state:true,risky:true,destructive:false,approval:"network_access",enforcement:"approval_only"},backend_inspect:{family:"backend",summary:"Inspect backend configuration and canonical-state metadata.",mutates_state:false,risky:true,destructive:false,approval:"network_access",enforcement:"approval_only"},upgrade_apply:{family:"upgrade",summary:"Apply an agentplane upgrade that may fetch remote release metadata.",mutates_state:true,risky:true,destructive:false,approval:"network_access",enforcement:"approval_only"},release_apply:{family:"release",summary:"Apply and optionally publish a release across git and package registries.",mutates_state:true,risky:true,destructive:false,approval:"network_access",enforcement:"approval_only"},doctor_fix:{family:"diagnostics",summary:"Apply automatic repair actions suggested by doctor diagnostics.",mutates_state:true,risky:true,destructive:false,approval:null,enforcement:"none"}};});function Y2(e){let t=[];for(let r of e.errors)t.push({level:"error",code:r.code,exitCode:r.exitCode,message:r.message});for(let r of e.warnings)t.push({level:"warning",code:r.code,exitCode:r.exitCode,message:r.message});return t}var eo,um=u(()=>{cc();bE();eo=class{evaluate(t){let r=t.action,n=wE(r);if(n.enforcement==="git_rules"){let o=Zn(t);return {ok:o.ok,action:n,violations:Y2(o)}}return {ok:true,action:n,violations:[]}}};});function Q2(){return process.env.AGENTPLANE_PROMPTS!=="plain"&&process.stdin.isTTY===true&&process.stdout.isTTY===true}function sy(){return Q2()?(_E??=import('@clack/prompts'),_E):Promise.resolve(null)}async function pm(e,t,r){let n=await sy();if(n){let c=await n.select({message:e,options:t.map(d=>({value:d,label:d})),initialValue:r});return n.isCancel(c)?(n.cancel("Prompt cancelled; using default."),r):String(c)}let o=createInterface({input:process.stdin,output:process.stdout}),i=`${e} [${t.join("/")}] (default ${r}): `,a=await o.question(i);o.close();let s=a.trim();return s?t.includes(s)?s:(process.stdout.write(`Invalid choice; using default ${r}
39
+ `),r):r}async function fm(e,t){let r=await sy();if(r){let s=await r.confirm({message:e,initialValue:t});return r.isCancel(s)?(r.cancel("Prompt cancelled; using default."),t):s}let n=createInterface({input:process.stdin,output:process.stdout}),o=`${e} [${t?"Y/n":"y/N"}]: `,i=await n.question(o);n.close();let a=i.trim().toLowerCase();return a?["y","yes","true","1","on"].includes(a)?true:["n","no","false","0","off"].includes(a)?false:t:t}async function gm(e){let t=await sy();if(t){let o=await t.text({message:e});return t.isCancel(o)?(t.cancel("Prompt cancelled."),""):o.trim()}let r=createInterface({input:process.stdin,output:process.stdout}),n=await r.question(e);return r.close(),n.trim()}var _E,hm=u(()=>{_E=null;});function vE(e){let t=e.agents?.approvals,r={require_plan:t?.require_plan===true,require_network:t?.require_network===true,require_verify:t?.require_verify===true,require_force:t?.require_force===true};return e.execution.profile==="conservative"?{...r,require_network:true,require_force:true}:r}function X2(e){let t=vE(e.config),n=e.policy.evaluate({action:e.action,config:e.config,taskId:e.taskId??"",git:{stagedPaths:[]}}).action,o=e.config.agents?.approvals?.require_network===true,i=e.config.agents?.approvals?.require_force===true,a=e.config.execution.profile==="conservative";switch(n.approval){case "network_access":return {action:n,approvals:t,required:t.require_network===true,source:t.require_network?o?"config":a?"execution_profile":"none":"none",reason:"Network access requires explicit approval"};case "force_action":return {action:n,approvals:t,required:t.require_force===true,source:t.require_force?i?"config":a?"execution_profile":"none":"none",reason:"Force action requires explicit approval"};case "policy_write":return {action:n,approvals:t,required:false,source:"builtin",reason:"Policy writes require explicit approval"};case "config_write":return {action:n,approvals:t,required:false,source:"builtin",reason:"Config writes require explicit approval"};case "dangerous_fs":return {action:n,approvals:t,required:false,source:"builtin",reason:"Potentially dangerous file operations require approval"};case "git_push":return {action:n,approvals:t,required:false,source:"builtin",reason:"Git push requires explicit approval"};default:return {action:n,approvals:t,required:false,source:"none",reason:`${n.summary} does not require an approval gate`}}}function ga(e){return new km(e)}var km,xE=u(()=>{hm();um();v();km=class{config;policy;constructor(t){this.config=t.config,this.policy=t.policy??new eo;}resolve(t){return X2({config:this.config,action:t.action,taskId:t.taskId,policy:this.policy})}async ensure(t){let r=this.resolve({action:t.action,taskId:t.taskId});if(!r.required||t.yes)return r;if(!(t.interactive??!!process.stdin.isTTY))throw new m({exitCode:3,code:"E_VALIDATION",message:`${r.reason} (pass --yes): ${t.reason}`});if(!await fm(`Allow ${t.action}? ${t.reason}`,false))throw new m({exitCode:3,code:"E_VALIDATION",message:`${r.reason} denied: ${t.reason}`});return r}};});var cy=u(()=>{xE();});function RE(e){if(!(!e||e.length===0))return [...e].filter(t=>t.trim().length>0).toSorted()}function Z2(e){let t=e.id.trim(),r=RE(e.supported_values),n=RE(e.blocked_by);if(!t)throw new Error("Capability entries require a non-empty id");return {id:t,kind:e.kind,availability:e.availability,source:{id:e.source.id,detail:e.source.detail},...e.summary?{summary:e.summary}:{},...Object.hasOwn(e,"value")?{value:e.value}:{},...r?{supported_values:r}:{},...e.reason?{reason:e.reason}:{},...n?{blocked_by:n}:{},...e.metadata?{metadata:structuredClone(e.metadata)}:{}}}function e1(e){return JSON.stringify(e)}function t1(e,t){return e.id.localeCompare(t.id)||e.kind.localeCompare(t.kind)||e.availability.localeCompare(t.availability)||e.source.id.localeCompare(t.source.id)||e.source.detail.localeCompare(t.source.detail)}function Yo(e=[]){let t=new Set,r=[];for(let n of e){let o=Z2(n),i=e1(o);t.has(i)||(t.add(i),r.push(o));}return r.sort(t1),{entries:r}}var dc=u(()=>{});function dy(e){return {id:"backend",detail:e}}function ly(e,t){return `backend.${e}.${t}`}function my(e){if(!e.capabilities)return Yo([{id:ly(e.backend_id,"capabilities"),kind:"backend_field",availability:"unavailable",source:dy(e.backend_id),summary:"Declared task backend capabilities",reason:"The task backend did not expose a capability descriptor.",metadata:{backend_id:e.backend_id}}]);let t=[];for(let r of n1){let n=e.capabilities[r.field];t.push({id:ly(e.backend_id,r.field),kind:"backend_field",availability:n===void 0?"unavailable":"available",source:dy(e.backend_id),summary:r.summary,value:n,...n===void 0?{reason:"The task backend omitted this capability field."}:{},metadata:{backend_id:e.backend_id,field:r.field}});}for(let r of r1){let n=e.capabilities[r.field];t.push({id:ly(e.backend_id,r.field),kind:"backend_field",availability:n?"available":"unavailable",source:dy(e.backend_id),summary:r.summary,value:n,...n?{}:{reason:"The task backend declares this feature unavailable."},metadata:{backend_id:e.backend_id,field:r.field}});}return Yo(t)}var r1,n1,CE=u(()=>{dc();r1=[{field:"reads_from_projection_by_default",summary:"Reads task data from the projection by default"},{field:"writes_task_readmes",summary:"Writes task README documents through the backend"},{field:"supports_task_revisions",summary:"Supports backend task revisions"},{field:"supports_revision_guarded_writes",summary:"Supports revision-guarded writes"},{field:"may_access_network_on_read",summary:"May access the network while reading tasks"},{field:"may_access_network_on_write",summary:"May access the network while writing tasks"},{field:"supports_projection_refresh",summary:"Supports projection refresh"},{field:"supports_push_sync",summary:"Supports push synchronization"},{field:"supports_snapshot_export",summary:"Supports projection or task snapshot export"}],n1=[{field:"canonical_source",summary:"Canonical task source mode"},{field:"projection",summary:"Projection storage mode"},{field:"projection_read_mode",summary:"Projection read mode"}];});var PE=u(()=>{dc();});function TE(e){return {id:"runner_adapter",detail:e}}function SE(e){return `runner.adapter.${e}`}function o1(e,t){return `runner.adapter.${e}.policy_field.${t}`}function uy(e){let t=e.capabilities?.adapter_id??e.adapter_id,r=e.requested??{},n=[{id:SE(t),kind:"runner_adapter",availability:"available",source:TE(t),summary:`Runner adapter ${t}`,metadata:{adapter_id:t,declared_fields:Object.keys(e.capabilities?.fields??{}).toSorted()}}];for(let[o,i]of Object.entries(e.capabilities?.fields??{})){let a=Object.hasOwn(r,o),s=a?r[o]:void 0,c=i.supported_values?[...i.supported_values]:void 0,d=typeof s=="string"?s:null,l=i.level==="unsupported"?"unavailable":d&&Array.isArray(c)&&!c.includes(d)?"blocked":"available";n.push({id:o1(t,o),kind:"runner_policy_field",availability:l,source:TE(t),summary:`Runner policy field ${o}`,...a?{value:s}:{},...c?{supported_values:c}:{},...l==="unavailable"?{reason:"The adapter declares this policy field unsupported."}:{},...l==="blocked"?{reason:"The requested policy value is outside the adapter-supported set.",blocked_by:[SE(t)]}:{},metadata:{adapter_id:t,field:o,level:i.level,channel:i.channel,...i.note?{note:i.note}:{}}});}return Yo(n)}var EE=u(()=>{dc();});var py=u(()=>{dc();CE();PE();EE();});function IE(e){return {...e.runner.trace,retention:e.runner.trace.retention??"keep",compression:e.runner.trace.compression??"none",redact_patterns:e.runner.trace.redact_patterns??[]}}function AE(e){return e.runner.timeouts}var OE=u(()=>{});function fy(e){return {limit:e,used:0,remaining:e,exhausted:e<=0}}function a1(e){let t=IE(e);return e.execution.profile==="conservative"?{...t,capture_stderr:true,retention:"keep"}:t}function s1(e){let t=AE(e);return e.execution.profile==="conservative"?{...t,terminate_grace_ms:Math.max(t.terminate_grace_ms,5e3)}:t}function gy(e){let t=applyExecutionToApprovals({execution:e.execution,approvals:e.agents?.approvals??{require_plan:false,require_network:false,require_verify:false,require_force:false}});return {profile:e.execution.profile,reasoning_effort:e.execution.reasoning_effort,budget:{discovery:fy(e.execution.tool_budget.discovery),implementation:fy(e.execution.tool_budget.implementation),verification:fy(e.execution.tool_budget.verification)},stop_conditions:[...e.execution.stop_conditions],handoff_conditions:[...e.execution.handoff_conditions],unsafe_actions_requiring_explicit_user_ok:[...e.execution.unsafe_actions_requiring_explicit_user_ok],approvals:t,runner:{trace_policy:a1(e),timeout_policy:s1(e)}}}function ym(e){let t=Math.max(0,Math.trunc(e.units??1)),r=e.runtime.budget[e.phase],n=r.used+t,o=r.limit,i={limit:o,used:n,remaining:Math.max(0,o-n),exhausted:n>=o};return {...e.runtime,budget:{...e.runtime.budget,[e.phase]:i}}}var DE=u(()=>{OE();});var hy=u(()=>{DE();});function c1(e){let t=new Set,r=[];for(let n of e){let o=n.id.trim();if(!o)throw new Error("Explain behavior inputs require a non-empty id.");let i=`${n.category}:${o}:${n.source??""}:${n.resolution.key}`;t.has(i)||(t.add(i),r.push({id:o,category:n.category,...n.source?.trim()?{source:n.source.trim()}:{},resolution:structuredClone(n.resolution)}));}return r.toSorted((n,o)=>n.category.localeCompare(o.category)||n.id.localeCompare(o.id)||(n.source??"").localeCompare(o.source??""))}function wm(e){return {schema_version:1,harness:structuredClone(e.harness),policy:{approvals:structuredClone(e.harness.policy.approvals),protected_paths:structuredClone(e.harness.policy.protected_paths),unsafe_actions_requiring_explicit_user_ok:[...e.harness.policy.unsafe_actions_requiring_explicit_user_ok]},capabilities:structuredClone(e.capabilities),runtime:{execution_profile:structuredClone(e.execution_profile),task_intake:structuredClone(e.task_intake)},behavior_inputs:c1(e.behavior_inputs??[])}}function ky(e,t){return wm({harness:e.harness,capabilities:e.capabilities,execution_profile:e.runtime.execution_profile,task_intake:e.runtime.task_intake,behavior_inputs:[...e.behavior_inputs,...t]})}var NE=u(()=>{});var yy=u(()=>{NE();});async function jE(e){try{return await access(e),!0}catch{return false}}function cn(e){return by[e]}function bm(e,t){let r=e.replaceAll("{{POLICY_GATEWAY_FILE}}",t).replaceAll("AGENTS.md or CLAUDE.md",t).replaceAll("AGENTS.md and CLAUDE.md",t).replaceAll("AGENTS.md|CLAUDE.md",t);return t==="AGENTS.md"?r:r.replaceAll("AGENTS.md","CLAUDE.md").replaceAll("AGENTS_POLICY","CLAUDE_POLICY")}async function to(e){let t=Ye.join(e.gitRoot,by.codex),r=Ye.join(e.gitRoot,by.claude),n=await jE(t),o=await jE(r);if(n)return {flavor:"codex",fileName:"AGENTS.md",absPath:t};if(o)return {flavor:"claude",fileName:"CLAUDE.md",absPath:r};let i=e.fallbackFlavor??"codex",a=cn(i);return {flavor:i,fileName:a,absPath:Ye.join(e.gitRoot,a)}}var by,dn=u(()=>{by={codex:"AGENTS.md",claude:"CLAUDE.md"};});function At(e,t){return {id:e,detail:t}}function _y(...e){let t=[],r=new Set;for(let n of e)for(let o of n){let i=`${o.id}:${o.detail}`;r.has(i)||(r.add(i),t.push(o));}return t}function lc(...e){let t=[],r=new Set;for(let n of e)for(let o of n){let i=ft(o);!i||r.has(i)||(r.add(i),t.push(i));}return t.toSorted((n,o)=>n.localeCompare(o))}function u1(e){return {canonical_source:e?.canonical_source??"local",projection:e?.projection??"canonical",projection_read_mode:e?.projection_read_mode??"native",reads_from_projection_by_default:e?.reads_from_projection_by_default??false,writes_task_readmes:e?.writes_task_readmes??false,supports_task_revisions:e?.supports_task_revisions??false,supports_revision_guarded_writes:e?.supports_revision_guarded_writes??false,may_access_network_on_read:e?.may_access_network_on_read??false,may_access_network_on_write:e?.may_access_network_on_write??false,supports_projection_refresh:e?.supports_projection_refresh??false,supports_push_sync:e?.supports_push_sync??false,supports_snapshot_export:e?.supports_snapshot_export??false}}function p1(e){let t=At("builtin","shared protected path defaults"),r=At("config",".agentplane/config.json"),n=At("policy_gateway",e.policyGatewayFileName),o=At("backend",e.backendConfigPath),i=lc([e.config.paths.tasks_path,e.config.paths.workflow_dir]),a=lc([...Xk],[e.policyGatewayFileName,e.config.paths.agents_dir]),s=ft(Ye.dirname(e.backendConfigPath)),c=lc([...Zk],[e.backendConfigPath,s]),d=lc([...ey]),l=lc([...ty]);return {groups:{tasks:i,policy:a,config:c,hooks:d,ci:l},trace:_y(i.length>0?[r]:[],a.length>0?[t,n,r]:[],c.length>0?[t,o]:[],d.length>0?[t]:[],l.length>0?[t]:[])}}function f1(e){return At("policy_gateway",e)}async function vy(e){let t=await to({gitRoot:e.project.gitRoot,fallbackFlavor:e.fallbackPolicyGatewayFlavor}),r=applyExecutionToApprovals({execution:e.config.execution,approvals:e.config.agents?.approvals??{require_plan:false,require_network:false,require_verify:false,require_force:false}}),n=p1({config:e.config,policyGatewayFileName:t.fileName,backendConfigPath:e.backendConfigPath});return {repo:{...e.project,policy_gateway:t,tasks_backend_config_path:e.backendConfigPath},workflow:{mode:e.config.workflow_mode,status_commit_policy:e.config.status_commit_policy,finish_auto_status_commit:e.config.finish_auto_status_commit,task_prefix:e.config.branch.task_prefix,paths:structuredClone(e.config.paths)},task:{doc_sections:[...e.config.tasks.doc.sections],required_doc_sections:[...e.config.tasks.doc.required_sections],verify_required_tags:[...e.config.tasks.verify.required_tags],verify_steps_required_tags:[...e.config.tasks.verify.require_steps_for_tags??[]],verify_steps_required_primary:[...e.config.tasks.verify.require_steps_for_primary??[]],verification_required_primary:[...e.config.tasks.verify.require_verification_for_primary??[]],spike_tag:e.config.tasks.verify.spike_tag,enforce_verify_steps_on_plan_approve:e.config.tasks.verify.enforce_on_plan_approve,enforce_verify_steps_on_start_without_plan:e.config.tasks.verify.enforce_on_start_when_no_plan,comments:structuredClone(e.config.tasks.comments),closure_commit_requires_approval:e.config.closure_commit_requires_approval},policy:{approvals:r,unsafe_actions_requiring_explicit_user_ok:[...e.config.execution.unsafe_actions_requiring_explicit_user_ok],protected_paths:n.groups},execution:structuredClone(e.config.execution),backend:{id:e.backendId,config_path:e.backendConfigPath,capabilities:e.backendCapabilities?structuredClone(e.backendCapabilities):null,restrictions:u1(e.backendCapabilities)},trace:{repo:[At("project",e.project.gitRoot)],workflow:[At("config",".agentplane/config.json")],task_contract:[At("config",".agentplane/config.json")],policy_gateway:[f1(t.fileName)],approval_requirements:_y([At("config",".agentplane/config.json")],[At("execution_profile",e.config.execution.profile)]),protected_paths:n.trace,execution:[At("config",".agentplane/config.json")],backend:_y([At("backend",e.backendId)],[At("config",e.backendConfigPath)])}}}var xy=u(()=>{pa();dn();Jo();});async function Ry(e){return e.memo.harness??=vy({project:e.resolvedProject,config:e.config,backendId:e.backendId,backendConfigPath:e.backendConfigPath,backendCapabilities:e.taskBackend.capabilities}),await e.memo.harness}var $E=u(()=>{xy();});var ME=u(()=>{xy();$E();});var Cy=u(()=>{});function LE(e){return {schema_version:1,kind:e.kind,status:"ok",compatibility:structuredClone(BE),data:structuredClone(e.data)}}function qE(e){return LE({kind:"framework.explain",data:e})}function mc(e){return {explain:qE(e.explain)}}var BE,HE=u(()=>{Cy();BE={strategy:"additive",breaking_changes_require_schema_version:true,additive_fields_allowed:true,new_result_kinds_allowed:true};});var Py=u(()=>{HE();Cy();});function _m(e){return applyTaskDocMutations({doc:"",owner:e.owner,comments:e.comments??null},[{kind:"replace-doc",doc:e.doc},{kind:"touch-doc-meta",updatedBy:e.updatedBy??e.owner,version:e.version}],{now:e.updatedAt})}var Ty=u(()=>{});function Ar(e){let t=new Set,r=[];for(let n of e){let o=String(n??"").trim();!o||t.has(o)||(t.add(o),r.push(o));}return r}function Sy(e){let t=e.trim();if(!t)throw new Error("Task intake context requires a non-empty requested outcome.");return t}function y1(e){let t=e.trim();if(!t)throw new Error("Task intake source detail must be non-empty.");return t}function w1(e){return e.map(t=>({kind:t.kind,...t.label?.trim()?{label:t.label.trim()}:{},value:Sy(t.value),...t.required===true?{required:true}:{}})).toSorted((t,r)=>t.kind.localeCompare(r.kind)||(t.label??"").localeCompare(r.label??"")||t.value.localeCompare(r.value))}function b1(e){let t=new Set,r=[];for(let n of e){let o=n.id.trim(),i=n.question.trim(),a=n.reason.trim();if(!o)throw new Error("Clarification questions require a non-empty id.");if(!i)throw new Error(`Clarification question ${o} requires question text.`);if(!a)throw new Error(`Clarification question ${o} requires a reason.`);if(t.has(o))throw new Error(`Clarification question ids must be unique: ${o}`);t.add(o),r.push({id:o,question:i,reason:a,required:n.required===true,...n.target_field?.trim()?{target_field:n.target_field.trim()}:{},...n.accepted_values?{accepted_values:Ar(n.accepted_values).toSorted()}:{}});}return r.toSorted((n,o)=>n.id.localeCompare(o.id))}function _1(e){if(e.length===0)throw new Error("Task graph draft requires at least one task.");let t=new Set;return e.map(r=>{let n=r.draft_id.trim();if(!n)throw new Error("Task graph draft tasks require a non-empty draft_id.");if(t.has(n))throw new Error(`Duplicate task graph draft id: ${n}`);t.add(n);let o=r.title.trim();if(!o)throw new Error(`Task graph draft task ${n} requires a title.`);let i=r.description.trim();if(!i)throw new Error(`Task graph draft task ${n} requires a description.`);let a=r.owner.trim();if(!a)throw new Error(`Task graph draft task ${n} requires an owner.`);let s=r.doc.trim();if(!s)throw new Error(`Task graph draft task ${n} requires a task document.`);return {draft_id:n,title:o,description:i,owner:a,priority:r.priority,...r.origin?{origin:structuredClone(r.origin)}:{},tags:Ar(r.tags).toSorted(),verify:Ar(r.verify).toSorted(),depends_on:Ar(r.depends_on).toSorted(),doc:s,...r.doc_version?{doc_version:r.doc_version}:{},...r.id_source?.trim()?{id_source:r.id_source.trim()}:{}}})}function v1(e,t){let r=new Set(e.map(i=>i.draft_id)),n=new Set,o=[];for(let i of t){if(!r.has(i.from))throw new Error(`Task graph dependency source is unknown: ${i.from}`);if(!r.has(i.to))throw new Error(`Task graph dependency target is unknown: ${i.to}`);let a=`${i.from}:${i.kind}:${i.to}`;n.has(a)||(n.add(a),o.push({from:i.from,to:i.to,kind:"depends_on"}));}return o.toSorted((i,a)=>i.from.localeCompare(a.from)||i.kind.localeCompare(a.kind)||i.to.localeCompare(a.to))}function x1(e){let t=new Map,r=e.task_ids??{};for(let n of e.tasks){let o=r[n.draft_id]?.trim();o&&t.set(n.draft_id,o);}return (async()=>{if(t.size===e.tasks.length)return t;if(!e.allocateTaskId)throw new Error("Task graph materialization requires task_ids for every draft task or an allocateTaskId callback.");for(let[n,o]of e.tasks.entries()){if(t.has(o.draft_id))continue;let a=(await e.allocateTaskId(o,n)).trim();if(!a)throw new Error(`Task id allocator returned an empty id for draft ${o.draft_id}.`);t.set(o.draft_id,a);}return t})()}function R1(e){let t=_m({doc:e.draftTask.doc,owner:e.draftTask.owner,updatedBy:e.draftTask.owner,version:e.draftTask.doc_version??3,updatedAt:e.created_at}),r={id:e.task_id,title:e.draftTask.title,description:e.draftTask.description,status:"TODO",priority:e.draftTask.priority,owner:e.draftTask.owner,revision:1,...e.draftTask.origin?{origin:structuredClone(e.draftTask.origin)}:{},depends_on:Ar([...e.draftTask.depends_on,...e.internal_dependencies]).toSorted(),tags:[...e.draftTask.tags],verify:[...e.draftTask.verify],comments:[],events:[],doc_version:t.doc_version,doc_updated_at:t.doc_updated_at,doc_updated_by:t.doc_updated_by,id_source:e.draftTask.id_source??"generated",doc:t.doc,sections:t.sections};return {draft_id:e.draftTask.draft_id,task_id:e.task_id,task:r,readme_path:Ye.join(e.context.runtime.repo.git_root,e.context.runtime.repo.workflow_dir,e.task_id,"README.md")}}function Ey(e){return {repo:{git_root:e.repo.git_root,agentplane_dir:e.repo.agentplane_dir,workflow_dir:e.repo.workflow_dir},workflow:{mode:e.harness.workflow.mode},backend:{id:e.backend.id,config_path:e.backend.config_path,capabilities:e.backend.capabilities?structuredClone(e.backend.capabilities):null,supports_generate_task_id:e.backend.supports_generate_task_id,supports_bulk_write:e.backend.supports_bulk_write},task_contract:{doc_sections:[...e.harness.task.doc_sections],required_doc_sections:[...e.harness.task.required_doc_sections],verify_required_tags:[...e.harness.task.verify_required_tags]},policy:{approvals:structuredClone(e.harness.policy.approvals),protected_paths:structuredClone(e.harness.policy.protected_paths),unsafe_actions_requiring_explicit_user_ok:[...e.harness.policy.unsafe_actions_requiring_explicit_user_ok]},execution_profile:structuredClone(e.execution_profile),capabilities:structuredClone(e.capabilities),precedence:{behavior_order:[...k1],extension_layer:"recipes"}}}function Iy(e){return {runtime:structuredClone(e.runtime),source:{id:e.source.id,detail:y1(e.source.detail)},requested_outcome:Sy(e.requested_outcome),...e.requested_owner?.trim()?{requested_owner:e.requested_owner.trim()}:{},requested_tags:Ar(e.requested_tags??[]).toSorted(),requested_verify:Ar(e.requested_verify??[]).toSorted(),requested_dependencies:Ar(e.requested_dependencies??[]).toSorted(),...e.parent_task_id?.trim()?{parent_task_id:e.parent_task_id.trim()}:{},inputs:w1(e.inputs??[])}}function Ay(e){let t=b1(e.questions??[]);return {context:structuredClone(e.context),status:t.some(r=>r.required)?"needs_input":"ready",assumptions:Ar(e.assumptions??[]),questions:t}}function Oy(e){let t=_1(e.tasks);return {context:structuredClone(e.context),clarification:structuredClone(e.clarification),summary:Sy(e.summary),tasks:t,dependencies:v1(t,e.dependencies??[]),warnings:Ar(e.warnings??[])}}async function Dy(e){if(e.draft.clarification.status==="needs_input")throw new Error("Task graph materialization requires clarification.status=ready.");let t=e.created_at??new Date().toISOString(),r=await x1({tasks:e.draft.tasks,task_ids:e.task_ids,allocateTaskId:e.allocateTaskId}),n=e.draft.tasks.map(o=>{let i=r.get(o.draft_id);if(!i)throw new Error(`Task id resolution lost draft task ${o.draft_id}.`);let a=e.draft.dependencies.filter(s=>s.from===o.draft_id).map(s=>{let c=r.get(s.to);if(!c)throw new Error(`Task id resolution lost dependency target ${s.to}.`);return c});return R1({context:e.draft.context,draftTask:o,task_id:i,internal_dependencies:a,created_at:t})});return {context:structuredClone(e.draft.context),summary:e.draft.summary,backend:structuredClone(e.draft.context.runtime.backend),tasks:n}}var k1,GE=u(()=>{Ty();k1=["harness","extension","user","builtin"];});var Ny=u(()=>{GE();});async function WE(e){return await R({cwd:e.cwd,rootOverride:e.rootOverride??null,resolvedProject:e.resolvedProject,config:e.config})}async function fr(e){let t=VE.get(e);return t||(t=C1(e),VE.set(e,t)),await t}async function zE(e){let t=UE.get(e);return t||(t=P1(e),UE.set(e,t)),await t}async function C1(e){Me({component:"runtime-resolve",event:"execution_context_started",details:{backend:e.backendId}});let t=await Ry(e),r=new eo,n=gy(e.config),o=my({backend_id:e.backendId,capabilities:e.taskBackend.capabilities??null}),i=Ey({repo:{git_root:e.resolvedProject.gitRoot,agentplane_dir:e.resolvedProject.agentplaneDir,workflow_dir:e.config.paths.workflow_dir},backend:{id:e.backendId,config_path:e.backendConfigPath,capabilities:e.taskBackend.capabilities??null,supports_generate_task_id:typeof e.taskBackend.generateTaskId=="function",supports_bulk_write:typeof e.taskBackend.writeTasks=="function"},harness:t,execution_profile:n,capabilities:o}),a=wm({harness:t,capabilities:o,execution_profile:n,task_intake:i});return Me({component:"runtime-resolve",event:"execution_context_completed",details:{backend:e.backendId,workflow_mode:e.config.workflow_mode,runner_adapter_count:o.entries.filter(s=>s.kind==="runner_adapter").length}}),{command:e,project:e.resolvedProject,repo:{git_root:e.resolvedProject.gitRoot,agentplane_dir:e.resolvedProject.agentplaneDir,workflow_dir:e.config.paths.workflow_dir},config:e.config,backend:{id:e.backendId,config_path:e.backendConfigPath,capabilities:e.taskBackend.capabilities??null,task_backend:e.taskBackend},harness:t,capabilities:o,execution:t.execution,executionProfile:n,taskIntake:i,frameworkExplain:a,frameworkProtocol:mc({explain:a}),approvals:t.policy.approvals,policy:r,approvalRuntime:ga({config:e.config,policy:r})}}async function P1(e){return {...await fr(e),adapters:tE(e)}}var VE,UE,ro=u(()=>{rE();N();um();la();cy();py();hy();yy();ME();Py();Ny();VE=new WeakMap,UE=new WeakMap;});function A1(e){try{return KE.accessSync(e),!0}catch{return false}}function O1(e){try{let t=JSON.parse(KE.readFileSync(Ye.join(e,"package.json"),"utf8"));return typeof t.name=="string"?t.name:null}catch{return null}}function jy(e,t=E1){let r=Ye.resolve(e);for(Ye.extname(r)&&(r=Ye.dirname(r));;){if(A1(Ye.join(r,"package.json"))&&(!t||O1(r)===t))return r;let n=Ye.dirname(r);if(n===r)return null;r=n;}}function D1(){let e=String(process.env[I1]??"").trim();return e?jy(e):null}function N1(e){try{let t=createRequire(e);return jy(t.resolve("agentplane/package.json"))}catch{return null}}function vm(e=import.meta.url){let t=fileURLToPath(e),r=D1()??jy(t)??N1(e);if(!r)throw new Error("Unable to resolve agentplane package root.");return r}function YE(e=import.meta.url){return Ye.join(vm(e),"package.json")}function no(...e){return Ye.join(vm(),"assets",...e)}function QE(...e){return pathToFileURL(no(...e))}function xm(...e){return pathToFileURL(`${no(...e)}${Ye.sep}`)}function XE(){return Ye.join(vm(),"bin","agentplane.js")}function ZE(...e){return Ye.resolve(vm(),"..","..","scripts",...e)}var E1,I1,ln=u(()=>{E1="agentplane",I1="AGENTPLANE_RUNTIME_ACTIVE_BIN";});function gt(){if(uc)return uc;try{let e=readFileSync(YE(),"utf8"),t=JSON.parse(e);if(t.version&&(uc=String(t.version).trim(),uc))return uc}catch{}return "0.0.0"}var uc,oo=u(()=>{ln();uc=null;});function eI(e){return ga({config:e.config}).resolve({action:e.action})}async function ce(e){await ga({config:e.config}).ensure(e);}var Be=u(()=>{cy();});function $1(e,t){if(e===t)return 0;if(!e)return t.length;if(!t)return e.length;let r=e,n=t,o=r.length,i=n.length,a=Array.from({length:i+1},(c,d)=>d),s=Array.from({length:i+1},()=>0);for(let c=1;c<=o;c++){s[0]=c;let d=r.codePointAt(c-1)??0;for(let l=1;l<=i;l++){let p=n.codePointAt(l-1)??0,g=d===p?0:1,h=a[l]+1,f=s[l-1]+1,b=a[l-1]+g;s[l]=Math.min(h,f,b);}[a,s]=[s,a];}return a[i]}function mn(e,t){let r=e.trim();if(!r)return null;let n=null;for(let i of t){let a=$1(r,i);(!n||a<n.dist)&&(n={cand:i,dist:a});}if(!n)return null;let o=Math.max(2,Math.floor(n.cand.length/3));return n.dist<=o?n.cand:null}var pc=u(()=>{});function M1(e){let t=e.valueHint??`<${e.name}>`,r=e.variadic?`${t} ...`:t;return e.required?r:`[${r}]`}function F1(e){let t=`--${e.name}`,r=e.valueHint;if(e.repeatable){let n=`${t} ${r}`;return `${n} [${n} ...]`}return `${t} ${r}`}function tI(e){if(e.synopsis&&e.synopsis.length>0)return [...e.synopsis];let t=["agentplane",...e.id],r=e.args??[];for(let a of r)t.push(M1(a));let n=(e.options??[]).filter(a=>!a.hidden),o=n.filter(a=>a.kind==="string"&&a.required===true),i=n.some(a=>!(a.kind==="string"&&a.required));for(let a of o)t.push(F1(a));return i&&t.push("[options]"),[t.join(" ")]}function B1(e){let t=(e.options??[]).filter(n=>!n.hidden);if(t.length===0)return [];let r=[];for(let n of t){let i=` ${n.short?`-${n.short}, `:""}--${n.name}`;n.kind==="string"&&(i+=` ${n.valueHint}`);let a=[];n.kind==="string"&&n.required&&a.push("required"),n.kind==="string"&&n.repeatable&&a.push("repeatable"),n.kind==="string"&&n.minCount&&n.minCount>0&&a.push(`min=${n.minCount}`),n.kind==="string"&&n.choices&&n.choices.length>0&&a.push(`choices=${n.choices.join("|")}`),n.kind==="string"&&n.patternHint&&a.push(`format=${n.patternHint}`),n.default!==void 0&&a.push(`default=${String(n.default)}`),n.deprecated&&a.push(`deprecated=${n.deprecated}`);let s=a.length>0?` (${a.join(", ")})`:"";r.push(`${i} ${n.description}${s}`);}return r}function L1(e){let t=e.args??[];if(t.length===0)return [];let r=[];for(let n of t){let o=n.valueHint??`<${n.name}>`,i=n.required?"required":"optional",a=n.variadic?", variadic":"",s=n.description?` ${n.description}`:"";r.push(` ${n.name} ${o} (${i}${a})${s}`);}return r}function q1(e){if(!e||e.length===0)return [];let t=[];for(let r of e)t.push(` ${r.cmd}`),r.why&&t.push(` # ${r.why}`);return t}function fc(e,t){let r=[];t.includeHeader&&r.push(`${e.id.join(" ")} - ${e.summary}`,""),r.push("Usage:");for(let i of tI(e))r.push(` ${i}`);let n=L1(e);!t.compact&&n.length>0&&r.push("","Args:",...n);let o=B1(e);if(o.length>0&&r.push("","Options:",...o),!t.compact&&e.notes&&e.notes.length>0&&r.push("","Notes:",...e.notes.map(i=>` - ${i}`)),!t.compact){let i=q1(e.examples);i.length>0&&r.push("","Examples:",...i);}return r.join(`
40
+ `)}function gc(e){let t=(e.options??[]).map(o=>o.kind==="boolean"?{name:o.name,kind:"boolean",short:o.short,description:o.description,hidden:o.hidden,deprecated:o.deprecated,default:o.default}:{name:o.name,kind:"string",short:o.short,description:o.description,hidden:o.hidden,deprecated:o.deprecated,required:o.required,repeatable:o.repeatable,minCount:o.minCount,valueHint:o.valueHint,default:o.default,choices:o.choices?[...o.choices]:void 0,patternHint:o.patternHint}),r=(e.args??[]).map(o=>({name:o.name,required:o.required,variadic:o.variadic,valueHint:o.valueHint,description:o.description})),n=(e.examples??[]).map(o=>({cmd:o.cmd,why:o.why}));return {id:[...e.id],group:e.group,summary:e.summary,description:e.description,usage:tI(e),args:r,options:t,examples:n,notes:e.notes?[...e.notes]:[]}}function rI(e){let t=new Map;for(let o of e){let i=t.get(o.group)??[];i.push(o),t.set(o.group,i);}let r=[...t.keys()].toSorted((o,i)=>o.localeCompare(i)),n=["Usage:"," agentplane help [<cmd...>] [--compact] [--json]","","Commands:"];for(let o of r){n.push(` ${o}:`);let i=t.get(o).toSorted((a,s)=>a.id.join(" ").localeCompare(s.id.join(" ")));for(let a of i)n.push(` ${a.id.join(" ")} ${a.summary}`);}return n.join(`
41
+ `)}var Rm=u(()=>{});function y(e){let t=e.command??(e.spec?e.spec.id.join(" "):void 0),r=e.spec&&fc(e.spec,{compact:true,includeHeader:false}),n=r?`${e.message}
42
+
43
+ ${r}`:e.message,o={};return t&&(o.command=t),e.context&&Object.assign(o,e.context),new Pl({message:n,context:Object.keys(o).length>0?o:void 0})}function nI(e){let t=e.spec?e.spec.id.join(" "):void 0,r=e.spec&&fc(e.spec,{compact:true,includeHeader:false}),n=`Deprecated option ${e.option} is ${e.deprecated}; remove it or use the documented replacement.${r?`
44
+
45
+ ${r}`:""}`;return new Tl({message:n,context:{option:e.option,deprecated:e.deprecated,...t?{command:t}:{}}})}var H=u(()=>{v();Rm();});function U1(e){return e.endsWith(`
46
+ `)?e:`${e}
47
+ `}function W1(e){return typeof e=="string"?e:e.value===void 0||e.value===null?`${e.label}:`:`${e.label}: ${String(e.value)}`}function z(e,t,r){let n=t?`${e} ${t}`:e,o=r?` (${r})`:"";return `\u2705 ${n}${o}`}function K(e){return `\u2139\uFE0F ${e}`}function ie(e){return `\u26A0\uFE0F ${e}`}function tt(e){return `Backend does not support ${e}`}function Ot(e,t,r){return `Invalid ${e}: ${t} (expected ${r})`}function Pm(e,t,r){return Ot(`value for ${e}`,t,r)}function Le(e,t){return `Unknown ${e}: ${t}`}function hc(e,t){return `No ${e} found.${t?` ${t}`:""}`}function sI(e,t){return `Missing required field: ${e}${""}`}function he(e,t,r){return `Invalid field ${e}: expected ${t}${r?` (${r})`:""}`}function hr(e,t){return `Missing ${e}${t?` at ${t}`:""}`}function Jt(e,t){return `Invalid workflow_mode: ${e??"unknown"} (expected ${t})`}function z1(e){return JSON.stringify(e,null,2)}function K1(e){return U1(e)}function cI(e){return Array.from(e,K1).join("")}function J1(e,t){let r=t?.header?[t.header]:[];for(let n of e)r.push(W1(n));return cI(r)}function Y1(e,t,r){let n=z1(t);return n?cI([`${e}:`,...n.split(`
48
+ `).map(o=>`${r}${o}`)]):null}function A(e){let t=process.stdout,r=process.stderr,n=createLogger({mode:e?.loggerMode,stdout:t,stderr:r});return {line:(d,l="stdout")=>{n.write({kind:"line",text:d,stream:l});},lines:(d,l="stdout")=>{for(let p of d)n.write({kind:"line",text:p,stream:l});},json:(d,l="stdout")=>{n.write({kind:"json",value:d,stream:l});},jsonSection:(d,l,p)=>{let g=Y1(d,l,p?.indent??" ");if(g)for(let h of g.trimEnd().split(`
49
+ `))n.write({kind:"line",text:h,stream:p?.stream??"stdout"});},report:(d,l)=>{let p=J1(d,l);for(let g of p.trimEnd().split(`
50
+ `))n.write({kind:"line",text:g,stream:l?.stream??"stdout"});},info:(d,l="stdout")=>{n.write({kind:"event",level:"info",message:K(d),stream:l});},warn:(d,l="stderr")=>{n.write({kind:"event",level:"warn",message:ie(d),stream:l});},success:(d,l,p,g="stdout")=>{n.write({kind:"event",level:"success",message:z(d,l,p),stream:g,action:d,target:l,details:p});}}}function un(e,t){switch(t.kind){case "line":{e.line(t.text,t.stream);return}case "info":{e.info(t.message,t.stream);return}case "warn":{e.warn(t.message,t.stream);return}case "success":{e.success(t.action,t.target,t.details,t.stream);return}case "json":{e.json(t.value,t.stream);return}case "report":{e.report(t.entries,t.options);return}}}var I=u(()=>{});function Sm(e){return (t,r)=>{let n=e.list().map(a=>a.spec);if(r.cmd.length===0){if(r.json){let a=n.map(s=>gc(s));Tm.json(a);}else Tm.line(rI(n));return Promise.resolve(0)}let o=e.match(r.cmd);if(o?.consumed!==r.cmd.length){let a=r.cmd.join(" "),s=n.map(l=>l.id.join(" ")),c=mn(a,s),d=c?` Did you mean: ${c}?`:"";throw y({spec:Or,command:"help",message:`Unknown command: ${a}.${d}`})}if(r.json)return Tm.json(gc(o.spec)),Promise.resolve(0);let i=fc(o.spec,{compact:r.compact,includeHeader:true});return Tm.line(i),Promise.resolve(0)}}var Tm,Or,My=u(()=>{I();Rm();pc();H();Tm=A(),Or={id:["help"],group:"Core",summary:"Show help for a command.",description:"Renders spec-derived help for migrated commands. Use --compact for minimal output and --json for machine-readable help.",args:[{name:"cmd",required:false,variadic:true,valueHint:"<cmd>"}],options:[{kind:"boolean",name:"compact",description:"Compact help (usage + options)."},{kind:"boolean",name:"json",description:"Emit JSON help (success output)."}],examples:[{cmd:"agentplane help",why:"List commands available in the CLI command catalog."},{cmd:"agentplane help task new --compact",why:"Show compact help for a command."},{cmd:"agentplane help task new --json",why:"Show JSON help for a command."}],parse:e=>{let t=e.args.cmd??[];return {cmd:Array.isArray(t)?t.map(String):[String(t)],compact:e.opts.compact===true,json:e.opts.json===true}}};});function Q1(e){return e.spec.id}function dI(e){return e.join(" ")}var kc,Em,Fy=u(()=>{v();kc=class{constructor(t){this.getId=t;}root={id:[],children:new Map};values=[];add(t){let r=this.getId(t),n=this.root;for(let o of r){let i=n.children.get(o);if(i){n=i;continue}let a={id:[...n.id,o],children:new Map};n.children.set(o,a),n=a;}if(n.value!==void 0)throw new Error(`Duplicate command id registered: ${dI(r)}`);n.value=t,this.values.push(t);}list(){return this.values}lookup(t){return this.resolveNode(t)?.value??null}match(t){let r=this.root,n=null;for(let[o,i]of t.entries()){let a=r.children.get(i);if(!a)break;r=a,r.value!==void 0&&(n={value:r.value,consumed:o+1});}return n}directChildren(t=[]){let r=this.resolveNode(t);return r?[...r.children.values()].flatMap(n=>n.value===void 0?[]:[n.value]):[]}directChildSegments(t=[]){let r=this.resolveNode(t);return r?[...r.children.keys()].toSorted((n,o)=>n.localeCompare(o)):[]}resolveNode(t){let r=this.root;for(let n of t){let o=r.children.get(n);if(!o)return null;r=o;}return r}},Em=class{graph=new kc(Q1);register(t,r){let n=dI(t.id);if(this.graph.lookup(t.id))throw new m({exitCode:1,code:"E_INTERNAL",message:`Duplicate command id registered: ${n}`});this.graph.add({spec:t,handler:r});}list(){return this.graph.list()}match(t){let r=this.graph.match(t);return r?{spec:r.value.spec,handler:r.value.handler,consumed:r.consumed}:null}lookup(t){return this.graph.lookup(t)}directChildren(t=[]){return this.graph.directChildren(t)}directChildSegments(t=[]){return this.graph.directChildSegments(t)}};});function ke(e,t="cmd"){let r=e.args[t];return Array.isArray(r)?{cmd:r.map(String)}:typeof r=="string"&&r.length>0?{cmd:[r]}:{cmd:[]}}function lI(e){By=e;}async function ne(e){return By?await By(e):[]}function oe(e){let t=e.cmd.join(" "),r=mn(t,[...e.subcommands]),n=r?` Did you mean: ${r}?`:"",o=e.cmd.length===0?e.missingMessage??"Missing subcommand.":`${e.unknownMessage?.(e.cmd[0]??"")??`Unknown subcommand: ${e.cmd[0]}.`}${n}`;throw y({spec:e.spec,command:e.command,message:o,context:e.contextCommand?{command:e.contextCommand}:void 0})}var By,Oe=u(()=>{H();pc();By=null;});var mI,uI=u(()=>{mI={id:["doctor"],group:"Quality",summary:"Check workspace invariants for a normal agentplane installation (with optional dev source checks).",options:[{kind:"boolean",name:"fix",default:false,description:"Apply safe fixes."},{kind:"boolean",name:"dev",default:false,description:"Run monorepo source-layer checks (requires packages/agentplane/src)."},{kind:"boolean",name:"archive-full",default:false,description:"Run the full historical task archive audit instead of the bounded recent scan."}],examples:[{cmd:"agentplane doctor",why:"Check installed workspace invariants."},{cmd:"agentplane doctor --archive-full",why:"Also scan the full historical task archive for older commit anomalies."},{cmd:"agentplane doctor --dev",why:"Also run monorepo source-layer checks."},{cmd:"agentplane doctor --fix",why:"Apply safe-only fixes (idempotent)."}],parse:e=>({fix:e.opts.fix===true,dev:e.opts.dev===true,archiveFull:e.opts["archive-full"]===true})};});var ha,Im,Am=u(()=>{Oe();ha={id:["runtime"],group:"Diagnostics",summary:"Inspect which agentplane runtime/binary/package sources are active.",synopsis:["agentplane runtime <explain> [options]"],args:[{name:"cmd",required:false,variadic:true,valueHint:"<cmd>"}],examples:[{cmd:"agentplane runtime explain",why:"Show active runtime details."}],parse:e=>ke(e)},Im={id:["runtime","explain"],group:"Diagnostics",summary:"Explain the active binary, runtime mode, and resolved package roots.",options:[{kind:"boolean",name:"json",default:false,description:"Emit machine-readable runtime details."}],examples:[{cmd:"agentplane runtime explain",why:"Show the active runtime as readable text."},{cmd:"agentplane runtime explain --json",why:"Show runtime details for scripts and diagnostics tooling."}],parse:e=>({json:e.opts.json===true})};});var pn,Ly=u(()=>{H();pn={id:["upgrade"],group:"Setup",summary:"Upgrade the local agentplane framework bundle in the repo.",description:"Upgrades the local agentplane framework bundle in the repo using a strict manifest of managed files. By default, upgrade applies the bundled managed files from the locally installed agentplane package assets (no network) and creates a dedicated upgrade commit. Use --dry-run to preview changes without writing files, or --agent to generate a review plan instead of applying. Use --remote to fetch a GitHub release bundle; network access is gated by config approvals.",options:[{kind:"boolean",name:"agent",default:false,description:"Generate an agent-assisted upgrade plan instead of applying managed files."},{kind:"boolean",name:"auto",default:false,description:"Apply the upgrade automatically (same behavior as the default mode; useful for explicit scripts)."},{kind:"boolean",name:"remote",default:false,description:"Fetch the framework bundle from GitHub releases (requires network approvals)."},{kind:"boolean",name:"allow-tarball",default:false,description:"Allow falling back to a GitHub repo tarball when release assets are missing (no checksum verification)."},{kind:"string",name:"tag",valueHint:"<tag>",description:"GitHub release tag (defaults to latest)."},{kind:"string",name:"source",valueHint:"<repo-url>",description:"Override GitHub repo source URL (defaults to config.framework.source)."},{kind:"string",name:"bundle",valueHint:"<path|url>",description:"Use a local path or URL for the upgrade bundle archive."},{kind:"string",name:"checksum",valueHint:"<path|url>",description:"Use a local path or URL for the bundle checksum file (required with --bundle)."},{kind:"string",name:"asset",valueHint:"<name>",description:"Override the GitHub release asset name for the bundle."},{kind:"string",name:"checksum-asset",valueHint:"<name>",description:"Override the GitHub release asset name for the checksum file."},{kind:"boolean",name:"dry-run",default:false,description:"Report changes without modifying files."},{kind:"boolean",name:"migrate-task-docs",default:false,description:"After applying the framework upgrade, migrate legacy task README docs in the same run."},{kind:"boolean",name:"no-backup",default:false,description:"Disable backups (default is to create backups)."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve network access prompts (subject to config approvals)."}],validateRaw:e=>{if(e.opts.agent===true&&e.opts.auto===true)throw y({spec:pn,command:"upgrade",message:"Options --agent and --auto are mutually exclusive."})},examples:[{cmd:"agentplane upgrade",why:"Apply managed files from the installed CLI assets and create an upgrade commit."},{cmd:"agentplane upgrade --dry-run",why:"Preview managed-file changes without modifying the repo."},{cmd:"agentplane upgrade --agent",why:"Generate an agent-assisted upgrade plan instead of applying files."},{cmd:"agentplane upgrade --remote --tag v0.1.9 --dry-run",why:"Preview changes for a specific GitHub release tag (no writes)."},{cmd:"agentplane upgrade --bundle ./agentplane-upgrade.tar.gz --checksum ./agentplane-upgrade.tar.gz.sha256",why:"Upgrade from local bundle files (no network)."},{cmd:"agentplane upgrade --yes --migrate-task-docs",why:"Apply the framework upgrade and migrate legacy task README docs in one operator run."}],parse:e=>{let t=e.opts["no-backup"]===true;return {mode:e.opts.agent===true?"agent":"auto",remote:e.opts.remote===true,allowTarball:e.opts["allow-tarball"]===true,source:e.opts.source,tag:e.opts.tag,bundle:e.opts.bundle,checksum:e.opts.checksum,asset:e.opts.asset,checksumAsset:e.opts["checksum-asset"],dryRun:e.opts["dry-run"]===true,backup:!t,migrateTaskDocs:e.opts["migrate-task-docs"]===true,yes:e.opts.yes===true}},validate:e=>{let t=!!e.bundle,r=!!e.checksum;if(t!==r)throw y({spec:pn,command:"upgrade",message:"Options --bundle and --checksum must be provided together (or omitted together)."});let n=!!e.source||!!e.tag||!!e.asset||!!e.checksumAsset;if(!e.remote&&n&&!t)throw y({spec:pn,command:"upgrade",message:"Remote upgrade options (--tag/--source/--asset/--checksum-asset) require --remote."});if(e.migrateTaskDocs&&e.mode==="agent")throw y({spec:pn,command:"upgrade",message:"Option --migrate-task-docs cannot be used with --agent."});if(e.migrateTaskDocs&&e.dryRun)throw y({spec:pn,command:"upgrade",message:"Option --migrate-task-docs cannot be used with --dry-run."})}};});var pI=u(()=>{});function Yt(e){let t=Ye.join(e,".agentplane","workflows");return {workflowPath:Ye.join(e,".agentplane","WORKFLOW.md"),lastKnownGoodPath:Ye.join(t,"last-known-good.md"),workflowDir:t}}var Hy=u(()=>{});function xt(e){let t={ts:new Date().toISOString(),component:"workflow-runtime",...e};process.stderr.write(`${JSON.stringify(t)}
51
+ `);}function yc(e){let t=e.filter(o=>o.severity==="ERROR").length,r=e.filter(o=>o.severity==="WARN").length,n=e.filter(o=>o.severity==="INFO").length;return `errors=${t} warnings=${r} infos=${n}`}var Om=u(()=>{});function wc(e=process.env){let t=e.AGENTPLANE_WORKFLOW_ENFORCEMENT??e.AGENTPLANE_WORKFLOW_CONTRACT;return typeof t!="string"?false:X1.has(t.trim().toLowerCase())}function Dm(){return "AGENTPLANE_WORKFLOW_ENFORCEMENT"}var X1,fI=u(()=>{X1=new Set(["0","false","off","disabled"]);});function rz(e){let t=[];for(let r of tz){let n=e[r];(!n||n.trim().length===0)&&t.push({code:"WF_REQUIRED_SECTION_MISSING",severity:"ERROR",path:`sections.${r}`,message:`Missing required section: ${r}`});}return t}function nz(e){let t=e.replaceAll(`\r
52
+ `,`
53
+ `);if(!t.startsWith(`---
54
+ `))return {frontMatterText:"",body:t};let r=t.indexOf(`
55
+ ---
56
+ `,4);return r===-1?{frontMatterText:t.slice(4),body:""}:{frontMatterText:t.slice(4,r),body:t.slice(r+5)}}function oz(e){let t=e.replaceAll(`\r
57
+ `,`
58
+ `).split(`
59
+ `),r={},n=null,o=[],i=()=>{n&&(r[n]=o.join(`
60
+ `).trim(),o=[]);};for(let a of t){let s=/^##\s+(.+)\s*$/.exec(a);if(s?.[1]){i(),n=s[1].trim();continue}n&&o.push(a);}return i(),r}function iz(e){if(!e.trim())return {value:{},diagnostics:[{code:"WF_SCHEMA_MISSING",severity:"ERROR",path:"front_matter",message:"Front matter is required."}]};try{let t=parseTaskReadme(`---
61
+ ${e}
62
+ ---
63
+ `).frontmatter;return !t||typeof t!="object"||Array.isArray(t)?{value:{},diagnostics:[{code:"WF_FRONTMATTER_NOT_OBJECT",severity:"ERROR",path:"front_matter",message:"Workflow front matter must decode to an object."}]}:{value:t,diagnostics:[]}}catch(t){return {value:{},diagnostics:[{code:"WF_PARSE_ERROR",severity:"ERROR",path:"front_matter",message:`Failed to parse workflow front matter: ${t instanceof Error?t.message:String(t)}`}]}}}function kr(e,t){let{frontMatterText:r,body:n}=nz(e),o=iz(r),i=oz(n),a=[...o.diagnostics,...rz(i)];return {document:{frontMatter:o.value,frontMatterRaw:o.value,body:n,sections:i,promptTemplate:i["Prompt Template"]??"",sourcePath:t},diagnostics:a}}function az(e){return renderTaskFrontmatter(e).replace(/^---\n/,"").replace(/\n---\n$/,"")}function Nm(e,t){let r=["Prompt Template","Checks","Fallback"],n=[];for(let i of r){let a=t[i]??"";n.push(`## ${i}
64
+ ${a}`.trimEnd());}let o=Object.keys(t).filter(i=>!r.includes(i)).toSorted();for(let i of o)n.push(`## ${i}
65
+ ${t[i]??""}`.trimEnd());return `---
66
+ ${az(e)}
67
+ ---
68
+
69
+ ${n.join(`
70
+
71
+ `)}
72
+ `}function bc(e){return {ok:!e.some(r=>r.severity==="ERROR"),diagnostics:e}}var tz,Qo=u(()=>{tz=["Prompt Template","Checks","Fallback"];});function Ie(e,t){e.push(t);}function _c(e){return !!e&&typeof e=="object"&&!Array.isArray(e)}function $m(e,t,r,n){if(t===void 0){Ie(e,{code:"WF_SCHEMA_MISSING",severity:"ERROR",path:r,message:`${r} is required.`});return}if(typeof t!="boolean"){Ie(e,{code:"WF_SCHEMA_TYPE",severity:"ERROR",path:r,message:`${r} must be a boolean.`});return}return t}function Gy(e,t,r,n){if(t===void 0){Ie(e,{code:"WF_SCHEMA_MISSING",severity:"ERROR",path:r,message:`${r} is required.`});return}if(typeof t!="string"){Ie(e,{code:"WF_SCHEMA_TYPE",severity:"ERROR",path:r,message:`${r} must be a string.`});return}if(t.trim().length===0){Ie(e,{code:"WF_SCHEMA_RANGE",severity:"ERROR",path:r,message:`${r} must be non-empty.`});return}return t}function Vy(e,t,r,n,o,i){if(t===void 0){Ie(e,{code:"WF_SCHEMA_MISSING",severity:"ERROR",path:r,message:`${r} is required.`});return}if(typeof t!="number"||!Number.isInteger(t)){Ie(e,{code:"WF_SCHEMA_TYPE",severity:"ERROR",path:r,message:`${r} must be an integer.`});return}if(t<n||t>o){Ie(e,{code:"WF_SCHEMA_RANGE",severity:"ERROR",path:r,message:`${r} must be in [${n}, ${o}].`});return}return t}function cz(e,t){for(let r of Object.keys(t))sz.has(r)||Ie(e,{code:"WF_SCHEMA_UNKNOWN_KEY",severity:"ERROR",path:`front_matter.${r}`,message:`Unknown front matter key: ${r}`});}function dz(e,t){let r=Gy(e,t,"front_matter.mode");if(r){if(r!=="direct"&&r!=="branch_pr"){Ie(e,{code:"WF_SCHEMA_ENUM",severity:"ERROR",path:"front_matter.mode",message:"front_matter.mode must be one of: direct, branch_pr."});return}return r}}function lz(e,t,r){if(!_c(t)){Ie(e,{code:t===void 0?"WF_SCHEMA_MISSING":"WF_SCHEMA_TYPE",severity:"ERROR",path:"front_matter.owners",message:"front_matter.owners must be an object."});return}let n=Gy(e,t.orchestrator,"front_matter.owners.orchestrator");if(n)return r&&!r.has(n)&&Ie(e,{code:"WF_OWNER_NOT_FOUND",severity:"ERROR",path:"front_matter.owners.orchestrator",message:`Owner ${n} was not found in .agentplane/agents/*.json.`}),{orchestrator:n}}function mz(e,t){if(!_c(t)){Ie(e,{code:t===void 0?"WF_SCHEMA_MISSING":"WF_SCHEMA_TYPE",severity:"ERROR",path:"front_matter.approvals",message:"front_matter.approvals must be an object."});return}let r=$m(e,t.require_plan,"front_matter.approvals.require_plan"),n=$m(e,t.require_verify,"front_matter.approvals.require_verify"),o=$m(e,t.require_network,"front_matter.approvals.require_network");if(!(r===void 0||n===void 0||o===void 0))return {require_plan:r,require_verify:n,require_network:o}}function uz(e,t){if(!_c(t)){Ie(e,{code:t===void 0?"WF_SCHEMA_MISSING":"WF_SCHEMA_TYPE",severity:"ERROR",path:"front_matter.retry_policy",message:"front_matter.retry_policy must be an object."});return}let r=$m(e,t.normal_exit_continuation,"front_matter.retry_policy.normal_exit_continuation"),n=Gy(e,t.abnormal_backoff,"front_matter.retry_policy.abnormal_backoff");n&&n!=="exponential"&&Ie(e,{code:"WF_SCHEMA_ENUM",severity:"ERROR",path:"front_matter.retry_policy.abnormal_backoff",message:"front_matter.retry_policy.abnormal_backoff must be exponential."});let o=Vy(e,t.max_attempts,"front_matter.retry_policy.max_attempts",1,100);if(!(r===void 0||!n||o===void 0))return {normal_exit_continuation:r,abnormal_backoff:"exponential",max_attempts:o}}function pz(e,t){if(!_c(t)){Ie(e,{code:t===void 0?"WF_SCHEMA_MISSING":"WF_SCHEMA_TYPE",severity:"ERROR",path:"front_matter.timeouts",message:"front_matter.timeouts must be an object."});return}let r=Vy(e,t.stall_seconds,"front_matter.timeouts.stall_seconds",1,86400);if(r!==void 0)return {stall_seconds:r}}function fz(e,t,r){if(!Array.isArray(t)){Ie(e,{code:t===void 0?"WF_SCHEMA_MISSING":"WF_SCHEMA_TYPE",severity:"ERROR",path:"front_matter.in_scope_paths",message:"front_matter.in_scope_paths must be an array."});return}let n=t.map(o=>typeof o=="string"?o.trim():"").filter(o=>o.length>0);if(n.length===0){Ie(e,{code:"WF_SCHEMA_RANGE",severity:"ERROR",path:"front_matter.in_scope_paths",message:"front_matter.in_scope_paths must contain at least one path."});return}if(r)for(let o of n){let i=Ye.resolve(r,o.replaceAll(/[*]{1,2}$/g,"")),a=`${Ye.resolve(r)}${Ye.sep}`;i===Ye.resolve(r)||i.startsWith(a)||Ie(e,{code:"WF_PATH_OUTSIDE_ROOT",severity:"ERROR",path:"front_matter.in_scope_paths",message:`Path escapes repository root: ${o}`});}return n}function Xo(e,t){let r=[],n=e.frontMatterRaw;if(!_c(n))return Ie(r,{code:"WF_FRONTMATTER_NOT_OBJECT",severity:"ERROR",path:"front_matter",message:"Workflow front matter must decode to an object."}),bc(r);cz(r,n);let o=Vy(r,n.version,"front_matter.version",1,Number.MAX_SAFE_INTEGER),i=dz(r,n.mode),a=lz(r,n.owners,t?.knownAgentIds??null),s=mz(r,n.approvals),c=uz(r,n.retry_policy),d=pz(r,n.timeouts),l=fz(r,n.in_scope_paths,t?.repoRoot);if(t?.config&&i&&t.config.workflow_mode!==i&&Ie(r,{code:"WF_POLICY_MISMATCH",severity:"ERROR",path:"front_matter.mode",message:`workflow mode mismatch: WORKFLOW.md=${i}, config=${t.config.workflow_mode}`}),t?.config&&s){let p=t.config.agents?.approvals;p&&(p.require_plan!==s.require_plan&&Ie(r,{code:"WF_POLICY_MISMATCH",severity:"WARN",path:"front_matter.approvals.require_plan",message:"Approval mismatch with .agentplane/config.json (require_plan)."}),p.require_verify!==s.require_verify&&Ie(r,{code:"WF_POLICY_MISMATCH",severity:"WARN",path:"front_matter.approvals.require_verify",message:"Approval mismatch with .agentplane/config.json (require_verify)."}),p.require_network!==s.require_network&&Ie(r,{code:"WF_POLICY_MISMATCH",severity:"WARN",path:"front_matter.approvals.require_network",message:"Approval mismatch with .agentplane/config.json (require_network)."}));}return o!==void 0&&i&&a&&s&&c&&d&&l&&(e.frontMatter={version:o,mode:i,owners:a,approvals:s,retry_policy:c,timeouts:d,in_scope_paths:l}),bc(r)}var sz,Mm=u(()=>{Qo();sz=new Set(["version","mode","owners","approvals","retry_policy","timeouts","in_scope_paths"]);});function Fm(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"||typeof e=="bigint"?String(e):typeof e=="symbol"?e.description?`Symbol(${e.description})`:"Symbol()":JSON.stringify(e)??""}function hI(e,t){let r=t.split("."),n=e;for(let o of r){if(!n||typeof n!="object")return;n=n[o];}return n}function Wy(e,t,r={}){let n={...gI,...r,allowedFilters:{...Uy,...r.allowedFilters}},o=[],i=/{{\s*([a-zA-Z_][\w.]*)(?:\s*\|\s*([a-zA-Z_][\w-]*))?\s*}}/g;for(let a of e.matchAll(i)){let s=a[1],c=a[2];s&&n.strictVariables&&hI(t,s)===void 0&&o.push({code:"WF_TEMPLATE_UNKNOWN_VARIABLE",severity:"ERROR",path:`template.${s}`,message:`Unknown template variable: ${s}`}),c&&n.strictFilters&&!n.allowedFilters[c]&&o.push({code:"WF_TEMPLATE_UNKNOWN_FILTER",severity:"ERROR",path:`template.filter.${c}`,message:`Unknown template filter: ${c}`});}return bc(o)}function kI(e,t,r={}){let n={...gI,...r,allowedFilters:{...Uy,...r.allowedFilters}},o=Wy(e,t,n);return o.ok?{text:e.replaceAll(/{{\s*([a-zA-Z_][\w.]*)(?:\s*\|\s*([a-zA-Z_][\w-]*))?\s*}}/g,(a,s,c)=>{let d=hI(t,s);return c&&(d=n.allowedFilters[c]?.(d)),Fm(d)}),diagnostics:[]}:{text:e,diagnostics:o.diagnostics}}var Uy,gI,zy=u(()=>{Qo();Uy={upper:e=>Fm(e).toUpperCase(),lower:e=>Fm(e).toLowerCase(),trim:e=>Fm(e).trim(),json:e=>JSON.stringify(e)},gI={strictVariables:true,strictFilters:true,allowedFilters:Uy};});function yI(e,t){let r={...e};for(let[n,o]of Object.entries(t)){if(o&&typeof o=="object"&&!Array.isArray(o)&&r[n]&&typeof r[n]=="object"&&!Array.isArray(r[n])){r[n]=yI(r[n],o);continue}r[n]=o;}return r}function gz(e,t){let r={...e};for(let[n,o]of Object.entries(t))o.trim().length!==0&&(r[n]=o);return r}function Bm(e){xt({event:"workflow_build_started"});let t=[],r=kr(e.baseTemplate);t.push(...r.diagnostics);let n=e.projectOverrideTemplate?kr(e.projectOverrideTemplate):null;n&&t.push(...n.diagnostics);let o=yI(r.document.frontMatterRaw,n?.document.frontMatterRaw??{}),i=e.runtimeContext.workflow;if(i&&typeof i=="object"&&!Array.isArray(i)){let f=i,b=f.mode;(b==="direct"||b==="branch_pr")&&(o.mode=b);let w=f.approvals;if(w&&typeof w=="object"&&!Array.isArray(w)){let _=w;o.approvals={require_plan:_.require_plan===true,require_verify:_.require_verify===true,require_network:_.require_network===true};}}let a=gz(r.document.sections,n?.document.sections??{}),s=a["Prompt Template"]??"",c=Wy(s,e.runtimeContext,{strictVariables:true,strictFilters:true});t.push(...c.diagnostics);let d=kI(s,e.runtimeContext,{strictVariables:true,strictFilters:true});t.push(...d.diagnostics),a["Prompt Template"]=d.text;let l=Nm(o,a),p=kr(l);t.push(...p.diagnostics);let g=Xo(p.document);return t.push(...g.diagnostics),t.some(f=>f.severity==="ERROR")?xt({event:"workflow_build_failed",details:{diagnostics:t.length}}):xt({event:"workflow_build_completed",details:{diagnostics:t.length}}),{text:l,diagnostics:t}}var Lm,wI=u(()=>{Qo();Om();zy();Mm();Lm=`---
73
+ version: 1
74
+ mode: direct
75
+ owners:
76
+ orchestrator: ORCHESTRATOR
77
+ approvals:
78
+ require_plan: true
79
+ require_verify: true
80
+ require_network: true
81
+ retry_policy:
82
+ normal_exit_continuation: true
83
+ abnormal_backoff: exponential
84
+ max_attempts: 5
85
+ timeouts:
86
+ stall_seconds: 900
87
+ in_scope_paths:
88
+ - packages/**
89
+ ---
90
+
91
+ ## Prompt Template
92
+ Repository: {{ runtime.repo_name }}
93
+ Workflow mode: {{ workflow.mode }}
94
+
95
+ ## Checks
96
+ - preflight
97
+ - verify
98
+ - finish
99
+
100
+ ## Fallback
101
+ last_known_good: .agentplane/workflows/last-known-good.md
102
+ `;});async function hz(e){try{return await Rt.access(e),!0}catch{return false}}async function Hm(e){let t=new Set,r=Ye.join(e,"agents");try{let n=await Rt.readdir(r,{withFileTypes:!0});for(let o of n)o.isFile()&&o.name.endsWith(".json")&&t.add(o.name.replace(/\.json$/i,""));}catch{}return t}async function kz(e,t){let r=Yt(e),n=t??r.workflowPath;try{let o=await Rt.readFile(n,"utf8"),i=kr(o,n);return {document:i.document,diagnostics:i.diagnostics,path:n}}catch(o){return {document:null,diagnostics:[{code:await hz(n)?"WF_READ_FAILED":"WF_MISSING_FILE",severity:"ERROR",path:"file",message:`Cannot read workflow file ${n}: ${o instanceof Error?o.message:String(o)}`}],path:n}}}async function Gm(e,t){let r=await kz(e,t),n=[...r.diagnostics];if(!r.document)return {ok:false,diagnostics:n};let o=await loadConfig(Ye.join(e,".agentplane")),i=await Hm(Ye.join(e,".agentplane")),a=Xo(r.document,{repoRoot:e,knownAgentIds:i,config:o.config});return n.push(...a.diagnostics),{ok:n.every(s=>s.severity!=="ERROR"),diagnostics:n}}async function bI(e,t){let r=kr(t),n=await loadConfig(Ye.join(e,".agentplane")),o=await Hm(Ye.join(e,".agentplane")),i=Xo(r.document,{repoRoot:e,knownAgentIds:o,config:n.config});return {ok:[...r.diagnostics,...i.diagnostics].every(a=>a.severity!=="ERROR"),diagnostics:[...r.diagnostics,...i.diagnostics]}}async function Vm(e,t){let r=Yt(e),n=`${r.workflowPath}.tmp.${Date.now()}`,o=kr(t,r.workflowPath),i=await loadConfig(Ye.join(e,".agentplane")),a=Xo(o.document,{repoRoot:e,knownAgentIds:await Hm(Ye.join(e,".agentplane")),config:i.config}),s=[...o.diagnostics,...a.diagnostics];if(s.some(c=>c.severity==="ERROR"))return xt({event:"workflow_publish_failed",code:"WF_PARSE_ERROR",details:{reason:"validation failed before publish",diagnostics:s.length}}),{ok:false,diagnostics:s};try{return await Rt.mkdir(Ye.dirname(r.workflowPath),{recursive:!0}),await Rt.mkdir(r.workflowDir,{recursive:!0}),await Rt.writeFile(n,t,"utf8"),await Rt.rename(n,r.workflowPath),await Rt.copyFile(r.workflowPath,r.lastKnownGoodPath),xt({event:"workflow_publish_completed",details:{workflowPath:r.workflowPath,lastKnownGoodPath:r.lastKnownGoodPath}}),{ok:!0,diagnostics:s}}catch(c){try{await Rt.rm(n,{force:!0});}catch{}return xt({event:"workflow_publish_failed",code:"WF_READ_FAILED",details:{reason:c instanceof Error?c.message:String(c)}}),{ok:false,diagnostics:[...s,{code:"WF_READ_FAILED",severity:"ERROR",path:"file",message:`Failed to atomically publish workflow: ${c instanceof Error?c.message:String(c)}`}]}}}async function _I(e){let t=Yt(e),r=`${t.workflowPath}.restore.tmp.${Date.now()}`,n="";try{n=await Rt.readFile(t.lastKnownGoodPath,"utf8");}catch(c){return xt({event:"workflow_restore_failed",code:"WF_MISSING_FILE",details:{reason:c instanceof Error?c.message:String(c)}}),{ok:false,diagnostics:[{code:"WF_MISSING_FILE",severity:"ERROR",path:"file",message:`Missing last-known-good workflow snapshot at ${t.lastKnownGoodPath}`}]}}let o=kr(n,t.lastKnownGoodPath),i=await loadConfig(Ye.join(e,".agentplane")),a=Xo(o.document,{repoRoot:e,knownAgentIds:await Hm(Ye.join(e,".agentplane")),config:i.config}),s=[...o.diagnostics,...a.diagnostics];if(s.some(c=>c.severity==="ERROR"))return xt({event:"workflow_restore_failed",code:"WF_PARSE_ERROR",details:{reason:"last-known-good validation failed"}}),{ok:false,diagnostics:s};try{return await Rt.mkdir(Ye.dirname(t.workflowPath),{recursive:!0}),await Rt.writeFile(r,n,"utf8"),await Rt.rename(r,t.workflowPath),xt({event:"workflow_restore_completed",details:{workflowPath:t.workflowPath,from:t.lastKnownGoodPath}}),{ok:!0,diagnostics:s}}catch(c){try{await Rt.rm(r,{force:!0});}catch{}return xt({event:"workflow_restore_failed",code:"WF_READ_FAILED",details:{reason:c instanceof Error?c.message:String(c)}}),{ok:false,diagnostics:[...s,{code:"WF_READ_FAILED",severity:"ERROR",path:"file",message:`Failed to restore workflow from snapshot: ${c instanceof Error?c.message:String(c)}`}]}}}var vI=u(()=>{Qo();Om();Hy();Mm();});function Um(e){return !!e&&typeof e=="object"&&!Array.isArray(e)}function yz(e){let t={...e};(typeof t.version!="number"||!Number.isInteger(t.version)||t.version<1)&&(t.version=1),t.mode!=="direct"&&t.mode!=="branch_pr"&&(t.mode=io.mode);let r=Um(t.owners)?{...t.owners}:{};(typeof r.orchestrator!="string"||r.orchestrator.trim().length===0)&&(r.orchestrator=io.owners.orchestrator),t.owners=r;let n=Um(t.approvals)?{...t.approvals}:{};for(let s of ["require_plan","require_verify","require_network"])typeof n[s]!="boolean"&&(n[s]=io.approvals[s]);t.approvals=n;let o=Um(t.retry_policy)?{...t.retry_policy}:{};typeof o.normal_exit_continuation!="boolean"&&(o.normal_exit_continuation=io.retry_policy.normal_exit_continuation),o.abnormal_backoff!=="exponential"&&(o.abnormal_backoff=io.retry_policy.abnormal_backoff),(typeof o.max_attempts!="number"||!Number.isInteger(o.max_attempts)||o.max_attempts<1)&&(o.max_attempts=io.retry_policy.max_attempts),t.retry_policy=o;let i=Um(t.timeouts)?{...t.timeouts}:{};(typeof i.stall_seconds!="number"||!Number.isInteger(i.stall_seconds)||i.stall_seconds<1)&&(i.stall_seconds=io.timeouts.stall_seconds),t.timeouts=i;let a=Array.isArray(t.in_scope_paths)?t.in_scope_paths.filter(s=>typeof s=="string"&&s.trim().length>0):[];return t.in_scope_paths=a.length>0?a:io.in_scope_paths,t}function xI(e,t){let r=kr(e),n=[],o=Object.keys(r.document.frontMatterRaw).filter(c=>!["version","mode","owners","approvals","retry_policy","timeouts","in_scope_paths"].includes(c)).map(c=>({code:"WF_FIX_SKIPPED_UNSAFE",severity:"WARN",path:`front_matter.${c}`,message:`Unsafe autofix skipped for unknown key: ${c}`}));if(n.push(...o),o.length>0)return {changed:false,text:e,diagnostics:n};let i=yz(r.document.frontMatterRaw);t&&(i.mode=t.mode,i.approvals={require_plan:t.approvals.require_plan,require_verify:t.approvals.require_verify,require_network:t.approvals.require_network});let a={...r.document.sections,"Prompt Template":r.document.sections["Prompt Template"]??"",Checks:r.document.sections.Checks??`- preflight
103
+ - verify
104
+ - finish`,Fallback:r.document.sections.Fallback??"last_known_good: .agentplane/workflows/last-known-good.md"},s=Nm(i,a);return {changed:s!==e,text:s,diagnostics:n}}var io,RI=u(()=>{Qo();io={version:1,mode:"direct",owners:{orchestrator:"ORCHESTRATOR"},approvals:{require_plan:true,require_verify:true,require_network:true},retry_policy:{normal_exit_continuation:true,abnormal_backoff:"exponential",max_attempts:5},timeouts:{stall_seconds:900},in_scope_paths:["packages/**"]};});var Zo=u(()=>{pI();Hy();Om();fI();Qo();Mm();zy();wI();vI();RI();});function Ky(e){return {workflow:{mode:e.workflowMode,version:1,approvals:{require_plan:e.approvals.requirePlanApproval,require_verify:e.approvals.requireVerifyApproval,require_network:e.approvals.requireNetworkApproval}},runtime:{repo_name:Ye.basename(e.gitRoot)||"repo",repo_root:e.gitRoot,timestamp:e.timestamp??new Date().toISOString()}}}async function CI(e){try{return await readFile(e,"utf8")}catch{return null}}async function ka(e){let t=Yt(e.gitRoot),[r,n]=await Promise.all([CI(t.workflowPath),CI(t.lastKnownGoodPath)]),o=Bm({baseTemplate:Lm,projectOverrideTemplate:e.projectOverrideTemplate,runtimeContext:Ky({gitRoot:e.gitRoot,workflowMode:e.workflowMode,approvals:e.approvals})});if(o.diagnostics.some(c=>c.severity==="ERROR"))throw new m({exitCode:3,code:"E_VALIDATION",message:`Failed to generate WORKFLOW.md: ${yc(o.diagnostics)}`,context:{diagnostics:o.diagnostics.map(c=>({severity:c.severity,code:c.code,path:c.path,message:c.message}))}});let i=await Vm(e.gitRoot,o.text);if(!i.ok)throw new m({exitCode:3,code:"E_VALIDATION",message:`Failed to publish WORKFLOW.md: ${yc(i.diagnostics)}`,context:{diagnostics:i.diagnostics.map(c=>({severity:c.severity,code:c.code,path:c.path,message:c.message}))}});let a=[];r!==o.text&&a.push(t.workflowPath),n!==o.text&&a.push(t.lastKnownGoodPath);let s=[...new Set(a.map(c=>Ye.relative(e.gitRoot,c)))];return {installPaths:[t.workflowPath,t.lastKnownGoodPath],commitPaths:s,changedPaths:a}}var vc=u(()=>{Zo();v();});var SI={};S(SI,{runWorkflowBuild:()=>Rz,workflowBuildSpec:()=>Jy});async function xz(e){let t=Ye.join(e.workflowDir,"template.override.md");try{return await Rt.readFile(t,"utf8")}catch{return}}var Jy,Rz,Yy=u(()=>{I();vc();Zo();Jy={id:["workflow","build"],group:"Workflow",summary:"Build WORKFLOW.md from template layers with strict rendering checks.",options:[{kind:"boolean",name:"validate",default:false,description:"Validate built workflow and fail on errors."},{kind:"boolean",name:"dry-run",default:false,description:"Do not publish; print candidate and diagnostics only."}],examples:[{cmd:"agentplane workflow build --validate --dry-run",why:"Build and validate candidate workflow without publishing."},{cmd:"agentplane workflow build --validate",why:"Build, validate, and atomically publish workflow."}],parse:e=>({validate:e.opts.validate===true,dryRun:e.opts["dry-run"]===true})};Rz=async(e,t)=>{let r=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=await loadConfig(r.agentplaneDir),o=Yt(r.gitRoot),i=n.config.agents?.approvals,a=Ky({gitRoot:r.gitRoot,workflowMode:n.config.workflow_mode,approvals:{requirePlanApproval:i?.require_plan??true,requireVerifyApproval:i?.require_verify??true,requireNetworkApproval:i?.require_network??true}}),s=await xz(o),c=Bm({baseTemplate:Lm,projectOverrideTemplate:s,runtimeContext:a});t.dryRun&&process.stdout.write(`${c.text}
105
+ `);let d=[...c.diagnostics];if(t.validate||t.dryRun){let g=await bI(r.gitRoot,c.text);d=[...d,...g.diagnostics];}let l=d.some(g=>g.severity==="ERROR");if(d.length>0){process.stderr.write(`${ie(`workflow diagnostics: ${yc(d)}`)}
106
+ `);for(let g of d)process.stderr.write(`- [${g.severity}] ${g.code} ${g.path}: ${g.message}
107
+ `);}if(t.dryRun)return l?1:0;let p=await Vm(r.gitRoot,c.text);if(!p.ok){process.stderr.write(ie("workflow publish failed")+`
108
+ `);for(let g of p.diagnostics)process.stderr.write(`- [${g.severity}] ${g.code} ${g.path}: ${g.message}
109
+ `);return 1}return process.stdout.write(z("workflow build",void 0,`Published ${Ye.relative(r.gitRoot,o.workflowPath)}`)+`
110
+ `),l&&t.validate?1:0};});var EI={};S(EI,{runWorkflow:()=>Cz,workflowSpec:()=>Wm});var Wm,Cz,Qy=u(()=>{Oe();Wm={id:["workflow"],group:"Workflow",summary:"Workflow contract commands.",synopsis:["agentplane workflow <subcommand> [options]"],args:[{name:"subcommand",required:false,variadic:true,valueHint:"<subcommand>"}],parse:e=>ke(e,"subcommand")},Cz=async(e,t)=>{oe({spec:Wm,cmd:t.cmd,subcommands:await ne(["workflow"]),command:"workflow",missingMessage:"Missing workflow subcommand.",unknownMessage:r=>`Unknown workflow subcommand: ${r}.`});};});var zm,Km,Jm,Xy=u(()=>{zm={id:["workflow","debug"],group:"Workflow",summary:"Run built-in debug checks and capture workflow evidence.",parse:()=>({}),examples:[{cmd:"agentplane workflow debug",why:"Collect debug readiness evidence."}]},Km={id:["workflow","sync"],group:"Workflow",summary:"Run built-in sync checks and capture workflow evidence.",parse:()=>({}),examples:[{cmd:"agentplane workflow sync",why:"Collect sync-state evidence."}]},Jm={id:["workflow","land"],group:"Workflow",summary:"Run built-in pre-land checks and capture workflow evidence.",parse:()=>({}),examples:[{cmd:"agentplane workflow land",why:"Collect land-readiness evidence."}]};});var II={};S(II,{runWorkflowRestore:()=>Sz,workflowRestoreSpec:()=>Zy});var Zy,Sz,ew=u(()=>{I();Zo();Zy={id:["workflow","restore"],group:"Workflow",summary:"Restore WORKFLOW.md from last-known-good snapshot.",parse:()=>({}),examples:[{cmd:"agentplane workflow restore",why:"Restore active workflow from .agentplane/workflows/last-known-good.md."}]},Sz=async e=>{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=Yt(t.gitRoot),n=await _I(t.gitRoot);if(!n.ok){process.stderr.write(ie("workflow restore failed")+`
111
+ `);for(let o of n.diagnostics)process.stderr.write(`- [${o.severity}] ${o.code} ${o.path}: ${o.message}
112
+ `);return 1}return process.stdout.write(z("workflow restore",void 0,`Restored ${Ye.relative(t.gitRoot,r.workflowPath)} from snapshot.`)+`
113
+ `),0};});function Rc(e){return e.replaceAll(`\r
114
+ `,`
115
+ `).split(`
116
+ `)}function Cc(e){return e.trim().toLowerCase().replaceAll(/[\s_-]+/g,"")}function ao(e){return e.toLowerCase().replaceAll(/[^a-z0-9]+/gi," ").trim()}function Ym(e){let t=ao(e);return t?t.split(/\s+/).map(r=>r.trim()).filter(r=>r.length>=3):[]}function ya(e){let t=new Set,r=[];for(let n of e){let o=String(n??"").trim();if(!o)continue;let i=o.toLowerCase();t.has(i)||(t.add(i),r.push(o));}return r}function wa(e){return e?ya(e.split(",").map(t=>t.trim()).filter(Boolean)):[]}function Pe(e,t){return [e,t]}function tw(e){let t=String(e??"").trim().toLowerCase();return t==="true"||t==="yes"||t==="y"||t==="1"}function Qm(e){let t=String(e??"").trim().toLowerCase().replaceAll(/[\s_-]+/g,"");return t==="external"?"external":t==="repofixable"||t==="internal"?"repo-fixable":null}function NI(e){return e==="open"||e==="promoted"?e:"stabilized"}function ba(e,t,r,n=" "){if(!e[t]){e[t]=r.trim();return}e[t]=`${e[t]}${n}${r.trim()}`.trim();}function jI(e,t){let r=String(e??"").trim();return r||(/\btasks?\s+([A-Za-z0-9-]+)/iu.exec(String(t??""))?.[1]?.trim()??null)}function xc(e){return [ao(e.scope),ao(e.failure),ao(e.rule)].join("|")}function Pc(e){return [e.sourceTask??"",xc(e)].join("|")}function $I(e){let t=Ym(e.scope),r=(e.extraText??[]).flatMap(n=>Ym(n));return ya([...e.explicitMatch,...e.tags,...t,...r]).slice(0,16)}function Ez(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;let t=Date.parse(`${e}T00:00:00.000Z`);return Number.isFinite(t)?t:null}function Iz(e,t,r){let n=Ez(e);if(n===null)return false;let o=t.getTime()-n;return o<0?false:o<=r*24*60*60*1e3}function AI(e){return e==="promoted"?2:e==="stabilized"?1:0}function rw(e,t){if(t.score!==e.score)return t.score-e.score;let r=AI(t.entry.state),n=AI(e.entry.state);return r!==n?r-n:t.entry.date.localeCompare(e.entry.date)}function MI(e,t){let r=Rc(e??"");for(let n of r){let o=n.trim();if(!o)continue;let i=o.replace(/^-+\s*/,"");if(i=i.replace(/^in scope:\s*/i,"").trim(),!(!i||/^out of scope:/i.test(i)))return i}return t.trim()}function FI(e){return `Analogous ${e} work MUST review and apply the recorded external incident advice before retrying.`}function BI(e){let t=xc(e.entry);return e.registry.entries.filter(n=>xc(n)===t).some(n=>n.state==="promoted"||n.state==="stabilized"||Iz(n.date,e.now,30))?"stabilized":"open"}var OI,DI,Xm=u(()=>{OI=["# Policy Incidents Log","","This is the single file for incident-derived and situational policy rules."].join(`
117
+ `),DI=["# Policy Incidents Log","- Append-only. Required fields: `id`, `date`, `scope`, `failure`, `rule`, `evidence`, `enforcement`, `state`; optional: `tags`, `match`, `advice`, `source_task`, `fixability`."].join(`
118
+ `);});function fn(){return [OI,"","## Entry contract","","- Add entries append-only.","- Every entry MUST include: `id`, `date`, `scope`, `failure`, `rule`, `evidence`, `enforcement`, `state`.","- New machine-matched entries SHOULD also include: `tags`, `match`, `advice`, `source_task`, `fixability`.","- `rule` MUST be concrete and testable (`MUST` / `MUST NOT`).","- `fixability: external` means the issue cannot be removed by changing only repository code and should stay as reusable operational advice.","- `fixability: repo-fixable` means the issue can be removed by repository code changes and should still be captured as reusable incident advice when explicitly marked.","- First auto-promoted reusable incidents normally enter as `open` and still participate in targeted advice lookup; recurring equivalent incidents can append later `stabilized` entries.","- `state` values: `open`, `stabilized`, `promoted`.","","## Entry template","","- id: `INC-YYYYMMDD-NN`","- date: `YYYY-MM-DD`","- scope: `<affected scope>`","- tags: `<comma-separated matching tags>`","- match: `<comma-separated lookup keywords>`","- failure: `<observed failure mode>`","- advice: `<reusable recovery or prevention guidance>`","- rule: `<new or refined MUST/MUST NOT>`","- evidence: `<task ids / logs / links>`","- enforcement: `<CI|test|lint|script|manual>`","- source_task: `<task id>`","- fixability: `<external|repo-fixable>`","- state: `<open|stabilized|promoted>`","","## Entries",""].join(`
119
+ `)}function ei(e){let t=Rc(e),r=[],n=null,o=0,i=null,a=()=>{if(!n)return;let s=n.id?.trim();if(!s||!/^INC-\d{8}-\d+$/u.test(s)){n=null,i=null,o=0;return}let c=n.scope?.trim()??"",d=n.failure?.trim()??"",l=n.rule?.trim()??"",p=n.evidence?.trim()??"",g=n.enforcement?.trim()??"manual";if(!c||!d||!l||!p){n=null,i=null,o=0;return}let h=jI(n.source_task??n.sourcetask,p);r.push({id:s,date:n.date?.trim()??"",scope:c,tags:wa(n.tags),match:wa(n.match),failure:d,advice:n.advice?.trim()||null,rule:l,evidence:p,enforcement:g,sourceTask:h,fixability:Qm(n.fixability),state:NI(n.state),rawFields:{...n},line:o}),n=null,i=null,o=0;};for(let[s,c]of t.entries()){let d=c.trim(),l=Az(d);if(l){a(),n={...l},i=Object.keys(l).at(-1)??"id",o=s+1;continue}let p=/^\s*-\s+id:\s*(.*?)\s*$/u.exec(c);if(p){a(),n={id:p[1]??""},i="id",o=s+1;continue}if(!n)continue;if(/^##\s+/.test(d)){a();continue}if(/^\s*-\s+/.test(c)){a();let h=/^\s*-\s+id:\s*(.*?)\s*$/u.exec(c);h&&(n={id:h[1]??""},i="id",o=s+1);continue}let g=/^\s{2,}([A-Za-z][A-Za-z0-9 _-]*):\s*(.*?)\s*$/u.exec(c);if(g){i=Cc(g[1]??""),n[i]=g[2]??"";continue}if(i&&/^\s{2,}\S/.test(c)){ba(n,i,c.trim(),`
120
+ `);continue}if(!d){a();continue}i&&ba(n,i,c.trim());}return a(),{entries:r}}function Az(e){if(!e.startsWith("- "))return null;let t=e.slice(2).trim();if(!t)return null;let r=t.split(/\s+\|\s+(?=[a-z_]+:\s*)/u),n={};for(let o of r){let i=/^([a-z_]+):\s*(.*?)\s*$/u.exec(o.trim());if(!i)return null;let a=Cc(i[1]??"");if(!a)return null;n[a]=i[2]??"";}return n.id?n:null}function Oz(e,t){let r=[Pe("id",e.id),Pe("date",e.date),Pe("scope",e.scope),...e.tags.length>0?[Pe("tags",e.tags.join(", "))]:[],...e.match.length>0?[Pe("match",e.match.join(", "))]:[],Pe("failure",e.failure),...e.advice?[Pe("advice",e.advice)]:[],Pe("rule",e.rule),Pe("evidence",e.evidence),Pe("enforcement",e.enforcement),...e.fixability?[Pe("fixability",e.fixability)]:[],Pe("state",e.state)];if(t==="compact")return `- ${r.map(([o,i])=>`${o}: ${i}`).join(" | ")}`;let n=[Pe("id",e.id),Pe("date",e.date),Pe("scope",e.scope),...e.tags.length>0?[Pe("tags",e.tags.join(", "))]:[],...e.match.length>0?[Pe("match",e.match.join(", "))]:[],Pe("failure",e.failure),...e.advice?[Pe("advice",e.advice)]:[],Pe("rule",e.rule),Pe("evidence",e.evidence),Pe("enforcement",e.enforcement),...e.sourceTask?[Pe("source_task",e.sourceTask)]:[],...e.fixability?[Pe("fixability",e.fixability)]:[],Pe("state",e.state)];return [`- ${n[0]?.[0]}: ${n[0]?.[1]??""}`,...n.slice(1).map(([o,i])=>` ${o}: ${i}`)].join(`
121
+ `)}function Dz(e){return /(^|\n)## Entries\s*$/mu.test(e)||/(^|\n)## Entry contract\s*$/mu.test(e)?"structured":"compact"}function LI(e){return [e.sourceTask?4:0,e.advice?3:0,e.tags.length,e.match.length,e.fixability?1:0,e.evidence.length>0?1:0].reduce((t,r)=>t+r,0)}function Nz(e,t,r){let n=r.get(e)??0;do n+=1;while(t.has(`INC-${e}-${String(n).padStart(2,"0")}`));return r.set(e,n),`INC-${e}-${String(n).padStart(2,"0")}`}function jz(e){let t=new Map,r=[];for(let a of e){let s=Pc(a),c=t.get(s);if(!c){t.set(s,{...a}),r.push(s);continue}LI(a)>=LI(c)&&t.set(s,{...a});}let n=r.map(a=>t.get(a)),o=new Set,i=new Map;for(let a of n){let s=/^INC-(\d{8})-(\d+)$/u.exec(a.id);if(!s)continue;let[,c,d]=s,l=Number.parseInt(d??"",10);if(!Number.isInteger(l))continue;let p=i.get(c)??0;l>p&&i.set(c,l);}return n.map(a=>{let s=/^\d{4}-\d{2}-\d{2}$/u.test(a.date)?a.date.replaceAll("-",""):"00000000",c=o.has(a.id)?Nz(s,o,i):a.id;return o.add(c),c===a.id?a:{...a,id:c}})}function $z(e,t){let r=t==="structured"?fn().trimEnd():DI;if(e.length===0)return `${r}
122
+ `;let n=t==="structured"?`
123
+
124
+ `:`
125
+ `;return `${r}
126
+ ${e.map(o=>Oz(o,t)).join(n)}
127
+ `}function _a(e,t){if(t.length===0)return e;let r=e.trim().length>0?e:fn(),n=Dz(r),o=ei(r),i=jz([...o.entries,...t]);return $z(i,n)}var nw=u(()=>{Xm();});function va(e){return {taskId:e.taskId,title:e.title,description:e.description,scope:e.scope??null,tags:ya(e.tags)}}function xa(e){let t=Math.max(1,e.limit??5),r=new Set(e.query.tags.map(c=>c.trim().toLowerCase()).filter(Boolean)),n=[e.query.title,e.query.description,e.query.scope??""].join(" "),o=ao(n),i=new Set([...Ym(n),...r]),a=new Map;for(let c of e.registry.entries){let d=c.tags.filter(_=>r.has(_.trim().toLowerCase())),l=c.match.filter(_=>i.has(_.trim().toLowerCase())||o.includes(ao(_))),p=ao(c.scope),g=p.length>0&&o.includes(p),h=d.length*5+l.length*2+(g?3:0);if(h<=0)continue;let f={entry:c,score:h,matchedTags:d,matchedTerms:l,scopeMatched:g},b=xc(c),w=a.get(b);(!w||rw(f,w)<0)&&a.set(b,f);}let s=[...a.values()];return s.sort((c,d)=>rw(c,d)),s.slice(0,t)}function ti(e){return e.length===0?"No matching incident advice.":e.map(t=>{let r=[`- ${t.entry.id} | scope: ${t.entry.scope}`,` failure: ${t.entry.failure}`,` advice: ${t.entry.advice??t.entry.rule}`,` rule: ${t.entry.rule}`];return t.entry.evidence&&r.push(` evidence: ${t.entry.evidence}`),r.join(`
128
+ `)}).join(`
129
+ `)}var qI=u(()=>{Xm();});function Mz(e){let t=Rc(e),r=[],n=null,o=0,i=null,a=()=>{if(!n)return;let s=n.promotion?.trim()||null,c=Qm(n.fixability),d=tw(n.incidentexternal)||c==="external",l=tw(n.incidentinternal)||c==="repo-fixable",p=s?.toLowerCase()==="incident-candidate"||d||l,g=n.observation?.trim()??"";if(!g){n=null,i=null,o=0;return}r.push({observation:g,impact:n.impact?.trim()||null,resolution:n.resolution?.trim()||null,promotion:s,incidentScope:n.incidentscope?.trim()||null,incidentRule:n.incidentrule?.trim()||null,incidentAdvice:n.incidentadvice?.trim()||null,incidentTags:wa(n.incidenttags),incidentMatch:wa(n.incidentmatch),incidentExternal:d,incidentInternal:l,fixability:c,shouldPromote:p,line:o,rawFields:{...n}}),n=null,i=null,o=0;};for(let[s,c]of t.entries()){let d=/^\s*-\s+Observation:\s*(.*?)\s*$/.exec(c);if(d){a(),n={observation:d[1]??""},i="observation",o=s+1;continue}if(!n)continue;if(/^\s*-\s+/.test(c)){a();let p=/^\s*-\s+Observation:\s*(.*?)\s*$/.exec(c);p&&(n={observation:p[1]??""},i="observation",o=s+1);continue}let l=/^\s{2,}([A-Za-z][A-Za-z0-9 _-]*):\s*(.*?)\s*$/.exec(c);if(l){i=Cc(l[1]??""),n[i]=l[2]??"";continue}if(i&&/^\s{2,}\S/.test(c)){ba(n,i,c.trim(),`
130
+ `);continue}c.trim()&&i&&ba(n,i,c.trim());}return a(),r}function Fz(e,t){let n=`INC-${`${t.getUTCFullYear()}${String(t.getUTCMonth()+1).padStart(2,"0")}${String(t.getUTCDate()).padStart(2,"0")}`}-`,o=0;for(let i of e){if(!i.id.startsWith(n))continue;let a=Number.parseInt(i.id.slice(n.length),10);Number.isInteger(a)&&a>o&&(o=a);}return `${n}${String(o+1).padStart(2,"0")}`}function Bz(e){let t=[];return !e.incidentExternal&&!e.incidentInternal&&e.fixability===null&&t.push("Fixability: external or IncidentExternal: true"),!e.incidentAdvice&&!e.resolution&&t.push("Resolution or IncidentAdvice"),t.length>0?{candidate:e,missingFields:t}:null}function Lz(e){let t=e.now.toISOString().slice(0,10),r=e.candidate.incidentScope??MI(e.task.scope,e.task.title),n=ya([...e.candidate.incidentTags,...e.task.tags.map(c=>c.trim())]),o=e.candidate.incidentAdvice??e.candidate.resolution??e.candidate.observation,i=e.candidate.incidentRule??FI(r),a=BI({registry:e.registry,entry:{scope:r,failure:e.candidate.observation,rule:i},now:e.now}),s=$I({scope:r,tags:n,explicitMatch:e.candidate.incidentMatch,extraText:[e.task.title,e.task.description,o]});return {id:Fz(e.registry.entries,e.now),date:t,scope:r,failure:e.candidate.observation,rule:i,evidence:`task ${e.task.id}${e.task.commitHash?`; commit ${e.task.commitHash.slice(0,12)}`:""}`,enforcement:"manual",state:a,tags:n,match:s,advice:o,sourceTask:e.task.id,fixability:e.candidate.fixability??(e.candidate.incidentInternal?"repo-fixable":"external"),rawFields:{},line:0}}function Zm(e){let t=Mz(e.findings),r=t.filter(d=>d.shouldPromote).map(({shouldPromote:d,...l})=>l),n=t.filter(d=>!d.shouldPromote).map(({observation:d,line:l,rawFields:p})=>({observation:d,line:l,reason:"not_marked_external_or_promotable",rawFields:p})),o=[],i=[],a=[],s=e.now??new Date,c=new Set(e.registry.entries.map(d=>Pc(d)));for(let d of r){let l=Bz(d);if(l){o.push(l);continue}let p=Lz({task:e.task,candidate:d,now:s,registry:ei(_a(fn(),[...e.registry.entries,...i.map(f=>f.entry)]))}),g=Pc(p),h={candidate:d,entry:p,fingerprint:g};if(c.has(g)){a.push(h);continue}c.add(g),i.push(h);}return {candidates:r,skipped:n,promotable:i,duplicates:a,issues:o,findingsTextPresent:e.findings.trim().length>0,structuredFindingCount:t.length}}var HI=u(()=>{Xm();nw();});var GI=u(()=>{nw();qI();HI();});var eu=u(()=>{GI();});function ae(e){let t=new Set,r=[];for(let n of e){let o=n.trim();o&&(t.has(o)||(t.add(o),r.push(o)));}return r}var Dr=u(()=>{});function Te(){return new Date().toISOString()}function Qt(e){let t=e.replaceAll(`\r
131
+ `,`
132
+ `);return !t.includes(String.raw`\n`)&&!t.includes(String.raw`\r\n`)?t:t.replaceAll(String.raw`\r\n`,`
133
+ `).replaceAll(String.raw`\n`,`
134
+ `)}function be(e,t){let r=e.replaceAll(`\r
135
+ `,`
136
+ `).split(`
137
+ `),n=false,o=[];for(let i of r){let a=/^##\s+(.*)$/.exec(i.trim());if(a){if(n)break;n=(a[1]??"").trim()===t;continue}n&&o.push(i);}return n?o.join(`
138
+ `).trimEnd():null}function ru(e){let t=(e??"").trim();return !(!t||t.includes(VI)||Gz.test(t))}function hn(e){if(ru(e.sectionText))return;let t=e.guidance?` (${e.guidance})`:"";throw new m({exitCode:3,code:"E_VALIDATION",message:`${e.taskId}: cannot ${e.action}: ## Verify Steps section is missing/empty/unfilled`+t})}function Se(e,t=3){return e===3?3:e===2?2:t}function Ra(e,t){let r=(e??"").replaceAll(`\r
139
+ `,`
140
+ `).trimEnd();if(t===3){let i=r.split(`
141
+ `).filter(c=>{let d=c.trim();return d!=="### Plan"&&d!=="### Results"}).join(`
142
+ `).replaceAll(/\n{3,}/g,`
143
+
144
+ `).trim();if(!i)return [Nr,gn].join(`
145
+ `);let a=i.includes(Nr),s=i.includes(gn);return a&&s?i:[i,"",Nr,gn].join(`
146
+ `)}if(!r)return ["### Plan","","","### Results","","",Nr,gn].join(`
147
+ `);let n=r.includes(Nr),o=r.includes(gn);return n&&o?r:[r,"",Nr,gn].join(`
148
+ `)}function Xt(e){return e===3?"Findings":"Notes"}function Dt(e,t){let r=Xt(t),n=r==="Findings"?"Notes":"Findings";return be(e,r)??be(e,n)}function so(e){let t=new Set(e.requiredSections.map(o=>normalizeDocSectionName(o))),r=normalizeDocSectionName(e.targetSection),n=e.allowedSections.filter(o=>{let i=normalizeDocSectionName(o);return t.has(i)||i===r});return r&&!n.some(o=>normalizeDocSectionName(o)===r)&&n.push(e.targetSection),n}function UI(e){let t=(e??"").trim();return !(!t||Vz.test(t))}function Tc(e){let t=ae((e.config.tasks.doc.required_sections??[]).map(o=>String(o??"").trim()).filter(Boolean)),r=[];for(let o of t){let i=o.trim().toLowerCase();if(Uz.has(i)||Wz.has(i))continue;let a=be(e.doc,o);UI(a)||r.push(o);}if(r.length===0)return;let n=r.map(o=>`## ${o}`).join(", ");throw new m({exitCode:3,code:"E_VALIDATION",message:`${e.task.id}: cannot ${e.action}: required task doc sections are missing/empty: ${n} (fill via \`agentplane task doc set ${e.task.id} --section <name> --text "..."\`)`})}var VI,Nr,gn,Gz,Vz,Uz,Wz,Ca=u(()=>{v();Dr();VI="<!-- TODO: REPLACE WITH TASK-SPECIFIC ACCEPTANCE STEPS -->",Nr="<!-- BEGIN VERIFICATION RESULTS -->",gn="<!-- END VERIFICATION RESULTS -->",Gz=/^\d+\.\s*<[^>\n]+>\.\s*Expected:\s*<[^>\n]+>\.?$/m;Vz=/<!--\s*TODO\b/i,Uz=new Set(["verification"]),Wz=new Set(["verify steps","notes"]);});async function P(e){try{return await access(e),!0}catch{return false}}async function Zt(e){try{return (await lstat(e)).isDirectory()?"dir":"file"}catch{return null}}async function nu(e){let t=new Date().toISOString().replaceAll(/[:.]/g,""),r=`${e}.bak-${t}`;return await P(r)&&(r=`${e}.bak-${t}-${Math.random().toString(36).slice(2,8)}`),await rename(e,r),r}var ee=u(()=>{});async function eK(e){return e.memo.agentIds??=(async()=>{let t=Ye.join(e.resolvedProject.gitRoot,e.config.paths.agents_dir);return await P(t)?(await readdir(t)).filter(n=>n.endsWith(".json")).map(n=>n.slice(0,-5)).map(n=>n.trim()).filter(n=>n.length>0):[]})(),await e.memo.agentIds}function ri(e){let t=e.trim();return !t||t==="[]"?[]:[t]}function Sc(e){let t=parseTaskStatus(e);if(!t)throw new m({exitCode:2,code:"E_USAGE",message:Ot("status",e,`one of ${TASK_STATUS_VALUES.join(", ")}`)});return t}function ve(e){return Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.trim()):[]}function ou(e){return Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.trim()).filter(t=>t.length>0):[]}function WI(e,t){return typeof e=="boolean"?e:t}function tK(e,t){if(typeof e!="string")return t;let r=e.trim();return r.length>0?r:t}function rK(e){return "config"in e?e.config:e}function iu(e){let t=rK(e),n=(F(t.tasks)?t.tasks:{}).tags,o=F(n)?n:{},i=["code","data","research","docs","ops","product","meta"],a=ae(ou(o.primary_allowlist).map(s=>s.toLowerCase()).filter(Boolean));return {primaryAllowlist:a.length>0?a:i,strictPrimary:WI(o.strict_primary,false),fallbackPrimary:tK(o.fallback_primary,"meta").toLowerCase(),lockPrimaryOnUpdate:WI(o.lock_primary_on_update,true)}}function zI(e){let r=(F(e.tasks)?e.tasks:{}).verify,n=F(r)?r:{},o=ae(ou(n.require_steps_for_primary).map(d=>d.toLowerCase()).filter(Boolean)),i=ae(ou(n.require_steps_for_tags??n.required_tags).map(d=>d.toLowerCase()).filter(Boolean)),a=new Set(o.length>0?o:i),s=ae(ou(n.require_verification_for_primary).map(d=>d.toLowerCase()).filter(Boolean)),c=new Set(s.length>0?s:[...a.values()]);return {requireStepsForPrimary:a,requireVerificationForPrimary:c}}function au(e,t){let r=iu(t),n=r.primaryAllowlist;if(n.length===0)throw new m({exitCode:3,code:"E_VALIDATION",message:"tasks.tags.primary_allowlist must contain at least one tag."});let i=ae(e.map(s=>s.trim().toLowerCase()).filter(Boolean)).filter(s=>n.includes(s));if(i.length>1)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Task must include exactly one primary tag from allowlist (${n.join(", ")}); found multiple: ${i.join(", ")}`});if(i.length===1)return {primary:i[0],matched:i,usedFallback:false};if(r.strictPrimary)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Task must include exactly one primary tag from allowlist (${n.join(", ")}); none found and strict_primary=true`});let a=r.fallbackPrimary;if(!a||!n.includes(a))throw new m({exitCode:3,code:"E_VALIDATION",message:`tasks.tags.fallback_primary=${JSON.stringify(r.fallbackPrimary)} must be present in tasks.tags.primary_allowlist (${n.join(", ")}).`});return {primary:a,matched:i,usedFallback:true}}function er(e,t){let r=au(e,t).primary;return zI(t).requireStepsForPrimary.has(r)}function ow(e,t){let r=au(e,t).primary;return zI(t).requireVerificationForPrimary.has(r)}function Nt(e,t){return au(e,t.config)}async function ni(e,t){let r=t.trim();if(!r)return;let n=await eK(e);if(n.length!==0&&!n.includes(r))throw new m({exitCode:3,code:"E_VALIDATION",message:`unknown task owner id: ${r} (not found under ${e.config.paths.agents_dir}; pick an existing agent id or create ${e.config.paths.agents_dir}/${r}.json)`})}var Pa=u(()=>{ee();G();I();v();Dr();De();});function nK(e){let t=new Set,r=new Set,n=[];function o(i){if(r.has(i))return null;if(t.has(i)){let s=n.indexOf(i);return s===-1?[i]:[...n.slice(s),i]}t.add(i),n.push(i);let a=e.get(i)??[];for(let s of a){let c=o(s);if(c)return c}return n.pop(),t.delete(i),r.add(i),null}for(let i of e.keys()){let a=o(i);if(a)return a}return null}async function Ec(e){let t=ae(e.dependsOn);if(t.includes(e.taskId))throw new m({exitCode:2,code:"E_USAGE",message:`depends_on cannot include task itself (${e.taskId})`});let r;e.backend.listProjectionTasks?r=await e.backend.listProjectionTasks():r=(await e.backend.listTasks()).map(a=>Vo(a));let n=new Map;for(let i of r){let a=String(i.id||"").trim();a&&a!==e.taskId&&n.set(a,ae(ve(i.depends_on)));}n.set(e.taskId,t);let o=nK(n);if(o)throw new m({exitCode:2,code:"E_USAGE",message:`depends_on cycle detected: ${o.join(" -> ")}`})}async function oi(e,t){let r=ae(ve(e.depends_on));if(r.length===0)return {dependsOn:r,missing:[],incomplete:[]};let n=t.getTasks?await t.getTasks(r):await Promise.all(r.map(async a=>await t.getTask(a))),o=[],i=[];for(let[a,s]of r.entries()){let c=n[a]??null;if(!c){o.push(s);continue}normalizeTaskStatus(c.status)!=="DONE"&&i.push(s);}return {dependsOn:r,missing:o,incomplete:i}}function aw(e){let t=[];return e.missing.length>0&&t.push(`missing deps: ${e.missing.join(", ")}`),e.incomplete.length>0&&t.push(`incomplete deps: ${e.incomplete.join(", ")}`),t}function sw(e){let t=new Map(e.map(n=>[n.id,n])),r=new Map;for(let n of e){let o=ae(ve(n.depends_on)),i=[],a=[];for(let s of o){let c=t.get(s);if(!c){i.push(s);continue}normalizeTaskStatus(c.status)!=="DONE"&&a.push(s);}r.set(n.id,{dependsOn:o,missing:i,incomplete:a});}return r}function oK(e){if(!e)return null;if(e.dependsOn.length===0)return "deps=none";if(e.missing.length===0&&e.incomplete.length===0)return "deps=ready";let t=[];return e.missing.length>0&&t.push(`missing:${e.missing.join(",")}`),e.incomplete.length>0&&t.push(`wait:${e.incomplete.join(",")}`),`deps=${t.join(",")}`}function co(e,t){let r=normalizeTaskStatus(e.status),n=[];e.owner?.trim()&&n.push(`owner=${e.owner.trim()}`),e.priority!==void 0&&String(e.priority).trim()&&n.push(`prio=${String(e.priority).trim()}`);let o=oK(t);o&&n.push(o);let i=ae(ve(e.tags));i.length>0&&n.push(`tags=${i.join(",")}`);let a=ae(ve(e.verify));a.length>0&&n.push(`verify=${a.length}`);let s=n.length>0?` (${n.join(", ")})`:"";return `${e.id} [${r}] ${e.title?.trim()||"(untitled task)"}${s}`}var su=u(()=>{zo();v();Dr();Pa();});function jr(e,t){return [...Array.isArray(e.events)?e.events.filter(n=>!!n&&typeof n.type=="string"&&typeof n.at=="string"&&typeof n.author=="string"):[],t]}function KI(e,t){return e===t?true:e==="TODO"?t==="DOING"||t==="BLOCKED":e==="DOING"?t==="DONE"||t==="BLOCKED":e==="BLOCKED"?t==="TODO"||t==="DOING":false}function JI(e){if(!e.force&&!KI(e.currentStatus,e.nextStatus))throw new m({exitCode:2,code:"E_USAGE",message:`Refusing status transition ${e.currentStatus} -> ${e.nextStatus} (use --force to override)`})}function cw(e){if(!e.enabled)return null;if(e.config.commit_automation==="finish_only")throw new m({exitCode:2,code:"E_USAGE",message:`${e.action}: --commit-from-comment is disabled by commit_automation='finish_only' (allowed only in finish).`});return dw({policy:e.config.status_commit_policy,action:e.action,confirmed:e.confirmed,quiet:e.quiet,statusFrom:e.statusFrom,statusTo:e.statusTo})}function dw(e){if(!YI(e.statusFrom,e.statusTo))throw new m({exitCode:2,code:"E_USAGE",message:`${e.action}: status/comment-driven commit is allowed only for major transitions (got ${e.statusFrom.toUpperCase()} -> ${e.statusTo.toUpperCase()})`});if(e.policy==="off")return null;if(e.policy==="warn")return e.quiet||e.confirmed?null:`${e.action}: status/comment-driven commit requested; policy=warn (pass --confirm-status-commit to acknowledge)`;if(e.policy==="confirm"&&!e.confirmed)throw new m({exitCode:2,code:"E_USAGE",message:`${e.action}: status/comment-driven commit blocked by status_commit_policy='confirm' (pass --confirm-status-commit to proceed)`});return null}function YI(e,t){let r=e.trim().toUpperCase(),n=t.trim().toUpperCase();return !r||!n?false:iK.has(`${r}->${n}`)}var iK,cu=u(()=>{v();iK=new Set(["READY->DOING","TODO->DOING","DOING->BLOCKED","BLOCKED->DOING","DOING->DONE"]);});function lw(e){return e.replaceAll(`\r
149
+ `,`
150
+ `).replaceAll("\r",`
151
+ `).replaceAll(/\n+/g," | ").replaceAll(/\s+/g," ").trim()}function aK(e){let t=e.trim();return t.endsWith(":")&&(t=t.slice(0,-1)),t.trim().toLowerCase()}function sK(e){let t=[];for(let r of ["start","blocked","verified"]){let n=e.tasks.comments[r]?.prefix??"",o=aK(n);n&&o&&t.push({raw:n,label:o});}return t}function cK(e,t){let r=e.toLowerCase();for(let{raw:n,label:o}of t){let i=n.trim();if(i&&r.startsWith(i.toLowerCase()))return {label:o,remainder:e.slice(i.length).trim()}}return {label:null,remainder:e}}function dK(e){let t=e.trim();if(!t)return {summary:"",details:[]};for(let n of [/\s*\|\s*/,/\s*;\s*/,/\s+--\s+/,/\s+-\s+/])if(n.test(t)){let o=t.split(n).map(i=>i.trim()).filter(Boolean);if(o.length>0){let[i,...a]=o;return {summary:i??"",details:a}}}let r=t.split(/(?<=[.!?])\s+/).map(n=>n.trim()).filter(Boolean);if(r.length>1){let[n,...o]=r;return {summary:n??"",details:o}}return {summary:t,details:[]}}function du(e,t){let r=lw(e);if(!r)return "";let n=sK(t),{label:o,remainder:i}=cK(r,n),{summary:a,details:s}=dK(i);if(a||(a=i||r,a===r&&o&&(o=null)),o&&(a=`${o}: ${a}`.trim()),s.length>0){let c=s.filter(Boolean).join("; ").trim();if(c)return `${a} | details: ${c}`}return a}var mw=u(()=>{});function uK(e){return Ye.join(e,"cache","direct-work.json")}async function QI(e){try{let t=await readFile(uK(e),"utf8"),r=JSON.parse(t);return !r||typeof r!="object"||typeof r.task_id!="string"||typeof r.agent!="string"||typeof r.slug!="string"||typeof r.branch!="string"||typeof r.started_at!="string"?null:r}catch{return null}}var XI=u(()=>{});function ZI(e){let t=e.trimEnd(),r=t.indexOf("\0");if(r===-1)throw new Error("Unexpected git log output (missing NUL separator)");let n=t.slice(0,r).trim(),o=t.slice(r+1);if(!n)throw new Error("Unexpected git log output (missing hash)");if(!o)throw new Error("Unexpected git log output (missing subject)");return {hash:n,subject:o}}var eA=u(()=>{});async function rA(e){try{let{stdout:t}=await execFileAsync("git",["config","--global","--get",e],{cwd:process.cwd(),env:process.env}),r=t.trim();return r.length>0?r:null}catch{return null}}async function lo(){return tA??=(async()=>{let e=await rA("user.name"),t=await rA("user.email"),r=e??process.env.GIT_AUTHOR_NAME?.trim()??process.env.GIT_COMMITTER_NAME?.trim()??null,n=t??process.env.GIT_AUTHOR_EMAIL?.trim()??process.env.GIT_COMMITTER_EMAIL?.trim()??null;return !r||!n?null:{name:r,email:n}})(),await tA}function kn(e){return {...process.env,...e.gitIdentity?{GIT_AUTHOR_NAME:e.gitIdentity.name,GIT_AUTHOR_EMAIL:e.gitIdentity.email,GIT_COMMITTER_NAME:e.gitIdentity.name,GIT_COMMITTER_EMAIL:e.gitIdentity.email}:null,AGENTPLANE_TASK_ID:e.taskId,...e.agentId?{AGENTPLANE_AGENT_ID:e.agentId}:null,...e.statusTo?{AGENTPLANE_STATUS_TO:e.statusTo}:null,AGENTPLANE_ALLOW_TASKS:e.allowTasks?"1":"0",AGENTPLANE_ALLOW_BASE:e.allowBase?"1":"0",AGENTPLANE_ALLOW_POLICY:e.allowPolicy?"1":"0",AGENTPLANE_ALLOW_CONFIG:e.allowConfig?"1":"0",AGENTPLANE_ALLOW_HOOKS:e.allowHooks?"1":"0",AGENTPLANE_ALLOW_CI:e.allowCI?"1":"0",...e.allowStaleDist?{AGENTPLANE_DEV_ALLOW_STALE_DIST:"1"}:null}}var tA,Ic=u(()=>{tA=null;});function nA(e){let t=[...new Set(e.map(n=>ft(n)).filter(Boolean))].toSorted((n,o)=>n.length===o.length?n.localeCompare(o):n.length-o.length);if(t.includes("."))return ["."];let r=[];for(let n of t)r.some(o=>vt(n,o))||r.push(n);return r}function lu(e){let t=new Set;for(let r of e){if(!r)continue;let n=r.trim();if(!n)continue;let o=n.lastIndexOf("/"),i=o<=0?n:n.slice(0,o),a=ft(i);a&&t.add(i.startsWith("/")&&!a.startsWith("/")?`/${a}`:a);}return [...t].filter(Boolean).toSorted((r,n)=>r.localeCompare(n))}async function Ac(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});if((await t.git.statusStagedPaths()).length>0)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:"Working tree has staged changes"});if((await t.git.statusUnstagedTrackedPaths()).length>0)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:"Working tree has unstaged changes"})}async function Ta(e){let t=await e.ctx.git.statusChangedPaths();if(t.length===0)throw new m({exitCode:2,code:"E_USAGE",message:"No changes to stage (working tree clean)"});let r=nA(e.allow);if(r.includes("."))throw new m({exitCode:2,code:"E_USAGE",message:"Repo-wide allowlist ('.') is not allowed; choose minimal prefixes (tip: `agentplane guard suggest-allow --format args`)."});let n=lm({tasksPath:e.tasksPath,workflowDir:e.workflowDir,taskId:e.taskId}),o=mm({tasksPath:e.tasksPath,workflowDir:e.workflowDir,taskId:e.taskId,allowTasks:e.allowTasks,allowPolicy:e.allowPolicy,allowConfig:e.allowConfig,allowHooks:e.allowHooks,allowCI:e.allowCI}),i=nA([...r,...o]);if(i.length===0||r.length===0&&o.length===0&&e.allowTaskOnly!==true)throw new m({exitCode:2,code:"E_USAGE",message:e.emptyAllowMessage??"Provide at least one allowed prefix"});let a=e.allowTasks?[]:n,s=[];for(let d of t)a.some(l=>vt(d,l))||i.some(l=>vt(d,l))&&s.push(d);let c=[...new Set(s)].toSorted((d,l)=>d.localeCompare(l));if(c.length===0)throw new m({exitCode:2,code:"E_USAGE",message:e.noMatchMessage??"No changes matched allowed prefixes (update --commit-allow)"});return await e.ctx.git.stage(c),c}var Oc=u(()=>{G();pa();v();Jo();N();});async function mu(e){let t=await gitListBranches(e.gitRoot),r=null;try{r=await gitCurrentBranch(e.gitRoot);}catch{r=null;}let n=async s=>{let d=(await gm(`Enter new base branch name (default ${e.fallback}): `)).trim()||e.fallback;if(!d)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Base branch name cannot be empty"});if(await gitBranchExists(e.gitRoot,d))return d;try{await execFileAsync("git",s?["branch",d]:["checkout","-q","-b",d],{cwd:e.gitRoot,env:gitEnv()});}catch(l){let p=l instanceof Error?l.message:`Failed to create branch ${d}`;throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:p})}return d};if(t.length===0)return await n(false);let o="Create new branch",i=r&&t.includes(r)?r:t[0]??e.fallback,a=await pm("Select base branch",[...t,o],i);return a===o?await n(true):a}async function Sa(e){if(Me({component:"git-ops",event:"init_commit_started",details:{base_branch:e.baseBranch,path_count:e.installPaths.length}}),(await gitStagedPaths(e.gitRoot)).length>0)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:"Git index has staged changes; commit or unstage them before running agentplane init."});await setPinnedBaseBranch({cwd:e.gitRoot,rootOverride:e.gitRoot,value:e.baseBranch});let r=[...new Set(e.installPaths)].filter(i=>i.length>0);await gitAddPaths(e.gitRoot,r);let n=await gitStagedPaths(e.gitRoot);if(n.length===0){Me({component:"git-ops",event:"init_commit_skipped",details:{reason:"no_staged_changes"}});return}let o=`chore: install agentplane ${e.version}`;await gitCommit(e.gitRoot,o,{skipHooks:e.skipHooks}),Me({component:"git-ops",event:"init_commit_completed",details:{staged_path_count:n.length,skip_hooks:e.skipHooks}});}var Ee=u(()=>{G();hm();v();la();});function Ia(e){if(e.ok)return;let t=e.errors.map(n=>n.message).join(`
152
+ `),r=e.errors.find(n=>n.code==="E_INTERNAL")??e.errors.find(n=>n.code==="E_USAGE")??e.errors[0];if(r)throw new m({exitCode:r.exitCode,code:r.code,message:t})}var fu=u(()=>{v();});async function mo(e){let r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=await r.git.statusStagedPaths(),o=new Set((e.ignoredUnstagedTrackedPaths??[]).map(g=>g.trim()).filter(Boolean)),i=e.requireClean?await r.git.statusUnstagedTrackedPaths():[],a=e.requireClean?i.filter(g=>!o.has(g)):[],s=r.config.workflow_mode==="branch_pr",c=e.baseBranchOverride?.trim(),d=s?c&&c.length>0?c:await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:null,mode:r.config.workflow_mode}):null,l=s?await gitCurrentBranch(r.resolvedProject.gitRoot):void 0,p=Zn({action:"guard_commit",config:r.config,taskId:e.taskId,git:{stagedPaths:n,unstagedTrackedPaths:a,currentBranch:l,baseBranch:d},commit:{subject:e.message},allow:{prefixes:e.allow,allowTasks:e.allowTasks,allowBase:e.allowBase,allowPolicy:e.allowPolicy,allowConfig:e.allowConfig,allowHooks:e.allowHooks,allowCI:e.allowCI},requireClean:e.requireClean});Ia(p);}var gu=u(()=>{cc();Ee();fu();N();});function RK(e){let t=e.emoji.trim();if(!t)throw new m({exitCode:2,code:"E_USAGE",message:"Emoji prefix is required when deriving commit messages from task comments"});let r=extractTaskSuffix(e.taskId);if(!r)throw new m({exitCode:2,code:"E_USAGE",message:Ot("task id",e.taskId,"valid task id")});let n=e.primaryTag.trim().toLowerCase();if(!n)throw new m({exitCode:2,code:"E_USAGE",message:"Primary tag is required when deriving commit messages from task comments"});let o=(e.statusTo?.trim().toLowerCase()??"status-transition").replaceAll(/\s+/g,"-");return `${t} ${r} ${n}: ${o}`}function CK(e){return [`Task: ${e.taskId}`,`Primary: ${e.primaryTag}`,...e.executorAgent?[`Agent: ${e.executorAgent}`]:[],...e.author?[`Author: ${e.author}`]:[],...e.statusTo?[`Status: ${e.statusTo}`]:[],`Comment: ${lw(e.formattedComment??e.commentBody)}`].join(`
153
+ `).trimEnd()}async function iA(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});if(e.autoAllow)throw new m({exitCode:2,code:"E_USAGE",message:"--commit-auto-allow is disabled; pass explicit --commit-allow <path-prefix>."});let r=e.allow.map(l=>l.trim()).filter(Boolean);if(r.length===0)throw new m({exitCode:2,code:"E_USAGE",message:"Provide at least one --commit-allow prefix"});let n=await Ta({ctx:t,allow:r,allowTasks:e.allowTasks,tasksPath:e.config.paths.tasks_path,workflowDir:e.config.paths.workflow_dir,taskId:e.taskId}),o=RK({taskId:e.taskId,primaryTag:e.primaryTag,statusTo:e.statusTo,emoji:e.emoji}),i=e.formattedComment??du(e.commentBody,e.config),a=CK({taskId:e.taskId,primaryTag:e.primaryTag,executorAgent:e.executorAgent,author:e.author,statusFrom:e.statusFrom,statusTo:e.statusTo,commentBody:e.commentBody,formattedComment:i});await mo({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,message:o,allow:r,allowBase:false,allowTasks:e.allowTasks,allowPolicy:false,allowConfig:false,allowHooks:false,allowCI:false,requireClean:e.requireClean,quiet:e.quiet});let s=kn({taskId:e.taskId,agentId:e.executorAgent,statusTo:e.statusTo,allowTasks:e.allowTasks,allowBase:false,allowPolicy:false,allowConfig:false,allowHooks:false,allowCI:false,gitIdentity:await lo()});await t.git.commit({message:o,body:a,env:s});let{hash:c,subject:d}=await t.git.headHashSubject();return e.quiet||process.stdout.write(`${z("committed",`${c?.slice(0,12)??""} ${d??""}`.trim(),`staged=${n.join(", ")}`)}
154
+ `),{hash:c,message:d,staged:n}}var aA=u(()=>{I();v();mw();N();Ic();Oc();gu();});function yn(e){if(e instanceof Error){let t=[e.name,e.message],r=e.stderr,n=e.stdout;return typeof r=="string"&&r.trim()&&t.push(r),typeof n=="string"&&n.trim()&&t.push(n),t.filter(o=>o.trim().length>0).join(`
155
+ `)}return String(e)}function pw(e){let t=yn(e);return TK.some(r=>r.test(t))?false:PK.some(r=>r.test(t))}async function SK(e){e<=0||await new Promise(t=>setTimeout(t,e));}async function uo(e,t){let r=t.maxAttempts??3,n=t.baseDelayMs??250,o=null;for(let i=1;i<=r;i+=1)try{return await e()}catch(a){if(o=a,!pw(a)||i===r)throw a;t.onRetry?.({attempt:i,maxAttempts:r,error:a,label:t.label}),await SK(n*i);}throw o instanceof Error?o:new Error(String(o))}var PK,TK,Dc=u(()=>{PK=[/eof\b/i,/tls handshake timeout/i,/ssl_error_syscall/i,/connection reset by peer/i,/\beconnreset\b/i,/\betimedout\b/i,/socket hang up/i,/temporary failure in name resolution/i,/network is unreachable/i,/server closed the connection/i],TK=[/authentication required/i,/not logged into github/i,/could not resolve to a pull request/i,/graphql: field/i,/bad credentials/i,/permission denied/i,/\b404\b/i,/\b422\b/i,/\b403\b/i,/\b401\b/i,/unknown command/i,/usage:/i];});var po,hu,Nc=u(()=>{po=".agentplane/policy/incidents.md",hu="packages/agentplane/assets/policy/incidents.md";});function NK(e,t){return (e?.trim()??"")||t}function cA(e){let t=e.base??e.previousMeta?.base,r=e.headSha??e.previousMeta?.head_sha,n=e.previousMeta===null||(e.previousMeta.branch??null)!==e.branch||(e.previousMeta.base??null)!==(t??null)||(e.previousMeta.head_sha??null)!==(r??null);return {schema_version:1,task_id:e.taskId,branch:e.branch,pr_number:e.previousMeta?.pr_number,pr_url:e.previousMeta?.pr_url,created_at:e.previousMeta?.created_at??e.at,updated_at:n?e.at:e.previousMeta?.updated_at??e.at,status:e.previousMeta?.status,merge_strategy:e.previousMeta?.merge_strategy,merged_at:e.previousMeta?.merged_at,merge_commit:e.previousMeta?.merge_commit,last_verified_sha:e.previousMeta?.last_verified_sha??null,last_verified_at:e.previousMeta?.last_verified_at??null,verify:e.previousMeta?.verify??{status:"skipped"},base:t,head_sha:r}}function dA(e){let t=e.base??e.meta.base,r=e.headSha??e.meta.head_sha,n=(e.meta.branch??null)!==e.branch||(e.meta.base??null)!==(t??null)||(e.meta.head_sha??null)!==(r??null);return {...e.meta,branch:e.branch,base:t,head_sha:r,updated_at:n?e.at:e.meta.updated_at,last_verified_sha:e.meta.last_verified_sha??null,last_verified_at:e.meta.last_verified_at??null}}function lA(e){let t=rt(e.previousHeadSha),r=rt(e.currentHeadSha);return e.preservePrevious&&t?t:r??t}function jc(e){let t=e.observed.status,r=e.meta.head_sha??e.observed.headSha??void 0,n={...e.meta,pr_number:e.observed.prNumber,pr_url:e.observed.prUrl??e.meta.pr_url,status:t,base:e.observed.base??e.meta.base,head_sha:r,updated_at:e.meta.updated_at};return t==="MERGED"?(n.merged_at=e.observed.mergedAt??e.meta.merged_at,n.merge_commit=e.observed.mergeCommit??e.meta.merge_commit):(delete n.merged_at,delete n.merge_commit,delete n.merge_strategy),(n.pr_number!==e.meta.pr_number||(n.pr_url??null)!==(e.meta.pr_url??null)||n.status!==e.meta.status||(n.base??null)!==(e.meta.base??null)||(n.head_sha??null)!==(e.meta.head_sha??null)||(n.merged_at??null)!==(e.meta.merged_at??null)||(n.merge_commit??null)!==(e.meta.merge_commit??null))&&(n.updated_at=e.at),n}function mA(e){let t=e.meta.head_sha??null;return {...e.meta,updated_at:e.meta.updated_at,last_verified_sha:t,last_verified_at:e.at,verify:e.meta.verify?{...e.meta.verify,status:e.state}:{status:e.state}}}function ku(e){let t={...e.meta,branch:e.branch,base:e.base,merge_strategy:e.mergeStrategy,status:"MERGED",merged_at:NK(e.meta.merged_at,e.at),merge_commit:e.mergeHash,head_sha:e.branchHeadSha,updated_at:e.at};return e.verifyCommands.length>0&&(e.shouldRunVerify||e.alreadyVerifiedSha)&&(t.last_verified_sha=e.branchHeadSha,t.last_verified_at=e.at,t.verify=e.meta.verify?{...e.meta.verify,status:"pass"}:{status:"pass",command:e.verifyCommands.join(" && ")}),t}function jK(e){if(Q$.platform()==="win32"){let t=process.env.ComSpec??process.env.COMSPEC;return {command:t&&t!=="undefined"&&t!=="null"?t:"cmd.exe",args:["/d","/s","/c",e]}}return {command:"sh",args:["-lc",e]}}function je(e,t){let r;try{r=JSON.parse(e);}catch(o){let i=o instanceof Error?o.message:String(o);throw new Error(`JSON Parse error: ${i}`)}let n=validateTaskPrMeta(r);if(n.task_id!==t)throw new Error("pr/meta.json task_id mismatch");return n}function rt(e){if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0}function $K(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function MK(e){if(!e||typeof e!="object")return;let t=rt(e.status);if(t!=="pass"&&t!=="fail"&&t!=="skipped")return;let r=rt(e.command);return r?{status:t,command:r}:{status:t}}function FK(e){let t=rt(e);return t==="squash"||t==="merge"||t==="rebase"?t:void 0}function BK(e,t){if(e.schema_version!==1||rt(e.task_id)!==t)return null;let r=rt(e.branch),n=rt(e.created_at),o=rt(e.updated_at);if(!r||!n||!o)return null;let i=rt(e.status),a=i==="OPEN"||i==="CLOSED"||i==="MERGED"?i:void 0;return {schema_version:1,task_id:t,branch:r,pr_number:$K(e.pr_number),pr_url:rt(e.pr_url),created_at:n,updated_at:o,status:a,merge_strategy:FK(e.merge_strategy),merged_at:rt(e.merged_at),merge_commit:rt(e.merge_commit),last_verified_sha:rt(e.last_verified_sha),last_verified_at:rt(e.last_verified_at),verify:MK(e.verify)??{status:"skipped"},base:rt(e.base),head_sha:rt(e.head_sha)}}function Aa(e,t){let r;try{r=JSON.parse(e);}catch(n){let o=n instanceof Error?n.message:String(n);throw new Error(`JSON Parse error: ${o}`)}try{let n=validateTaskPrMeta(r);if(n.task_id!==t)throw new Error("pr/meta.json task_id mismatch");return n}catch(n){let o=BK(r,t);if(o)return o;throw n}}function yu(e){let t=/verified_sha=([0-9a-f]{7,40})/gi,r=null,n=null;for(;r=t.exec(e);)n=r[1]??null;return n}async function uA(e,t,r){await mkdir(Ye.dirname(e),{recursive:true});let n=[t.trimEnd()];r&&n.push(r.trimEnd()),n.push(""),await writeFile(e,`${n.join(`
156
+ `)}
157
+ `,{flag:"a"});}async function pA(e,t){let r=jK(e);try{let{stdout:n,stderr:o}=await execFileAsync(r.command,r.args,{cwd:t,env:process.env,maxBuffer:10485760}),i="";return n&&(i+=n),o&&(i+=(i&&!i.endsWith(`
158
+ `)?`
159
+ `:"")+o),{code:0,output:i}}catch(n){let o=n,i="";return o.stdout&&(i+=String(o.stdout)),o.stderr&&(i+=(i&&!i.endsWith(`
160
+ `)?`
161
+ `:"")+String(o.stderr)),{code:typeof o.code=="number"?o.code:1,output:i}}}var nt=u(()=>{});function HK(e,t){return `${toGitPath(Ye.join(e,t))}/`}function gw(e){let t=toGitPath(e.relPath);if(t.startsWith(HK(e.workflowDir,e.taskId)))return true;let r=e.tasksPath?toGitPath(e.tasksPath):null;return r!==null&&t===r}async function ii(e){if(!e.fromRef||e.fromRef===e.toRef)return false;let t=await gitDiffNames(e.gitRoot,e.fromRef,e.toRef);return t.length>0&&t.every(r=>gw({workflowDir:e.workflowDir,taskId:e.taskId,tasksPath:e.tasksPath,relPath:r}))}var $c=u(()=>{});async function ht(e){let t=e.ctx?.resolvedProject??await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=e.ctx?.config;r||(r=(await loadConfig(t.agentplaneDir)).config);let n=Ye.join(t.gitRoot,r.paths.workflow_dir,e.taskId),o=Ye.join(n,"pr");return {resolved:t,config:r,prDir:o,metaPath:Ye.join(o,"meta.json"),diffstatPath:Ye.join(o,"diffstat.txt"),notesPath:Ye.join(o,"notes.jsonl"),verifyLogPath:Ye.join(o,"verify.log"),reviewPath:Ye.join(o,"review.md"),githubTitlePath:Ye.join(o,"github-title.txt"),githubBodyPath:Ye.join(o,"github-body.md")}}async function Mc(e){let t=Ye.join(e.prDir,e.fileName);return await P(t)?await readFile(t,"utf8"):await $r(e)}async function $r(e){let t=Ye.join(e.prDir,e.fileName);if(e.worktreePath){let n=Ye.join(e.worktreePath,Ye.relative(e.resolved.gitRoot,t));if(await P(n))return await readFile(n,"utf8")}let r=toGitPath(Ye.relative(e.resolved.gitRoot,t));try{return await gitShowFile(e.resolved.gitRoot,e.branch,r)}catch{return null}}var wn=u(()=>{ee();});function Fc(e,t){return new Error(`Invalid pr/notes.jsonl entry ${e+1}: ${t}`)}function hw(e,t,r){if(typeof e!="string")throw Fc(r,`${t} must be a string`);let n=e.trim();if(!n)throw Fc(r,`${t} must not be empty`);return n}function gA(e){return {schema_version:1,created_at:e.createdAt,author:e.author.trim(),body:e.body.trim()}}function QK(e){return e.trim()?e.split(/\r?\n/).filter(t=>t.trim().length>0).map((t,r)=>{let n;try{n=JSON.parse(t);}catch(i){let a=i instanceof Error?i.message:String(i);throw Fc(r,`invalid JSON (${a})`)}let o=n;if(!o||typeof o!="object")throw Fc(r,"entry must be an object");if((o.schema_version??1)!==1)throw Fc(r,"unsupported schema_version");return {schema_version:1,created_at:hw(o.created_at,"created_at",r),author:hw(o.author,"author",r),body:hw(o.body,"body",r)}}):[]}async function wu(e){try{return QK(await readFile(e,"utf8"))}catch(t){if(t?.code==="ENOENT")return [];throw t}}async function hA(e){await mkdir(Ye.dirname(e.notesPath),{recursive:true}),await appendFile(e.notesPath,`${JSON.stringify(e.note)}
162
+ `,"utf8");}var kw=u(()=>{});function bw(e){let t=e instanceof Error?e.message:String(e);return /unknown revision or path not in the working tree/i.test(t)||/bad revision/i.test(t)||/ambiguous argument/i.test(t)}async function rJ(e){try{let{stdout:t}=await execFileAsync("git",["rev-parse",e.branch],{cwd:e.gitRoot,env:gitEnv()});return t.trim()||null}catch(t){if(!bw(t))throw t;return null}}async function kA(e){let t=await rJ({gitRoot:e.gitRoot,branch:e.branch});if(!t)return {headSha:null,artifactRefresh:false};try{let{stdout:r}=await execFileAsync("git",["log","-1","--pretty=%s",t],{cwd:e.gitRoot,env:gitEnv()}),n=r.trim();return {headSha:t,artifactRefresh:isTaskArtifactRefreshCommitSubject({subject:n,taskId:e.taskId})}}catch{return {headSha:t,artifactRefresh:false}}}async function nJ(e){let r=(await gitBranchUpstream(e.gitRoot,e.baseBranch))?.trim()??"";if(!r)return e.baseBranch;try{let{stdout:n}=await execFileAsync("git",["rev-parse","--verify",r],{cwd:e.gitRoot,env:gitEnv()});return n.trim()?r:e.baseBranch}catch(n){if(!bw(n))throw n;return e.baseBranch}}async function _u(e){let t=await nJ({gitRoot:e.gitRoot,baseBranch:e.baseBranch}),r=Ye.dirname(e.prDir);try{return await gitDiffStat(e.gitRoot,t,e.branch,{excludePaths:[Ye.relative(e.gitRoot,e.prDir),Ye.relative(e.gitRoot,Ye.join(r,"README.md"))]})}catch(n){if(!bw(n))throw n;return ""}}async function _w(e){let t=e.branch?.trim()??"";if(t)return {branch:t,source:"explicit"};if(await P(e.metaPath)){let o=je(await readFile(e.metaPath,"utf8"),e.taskId).branch?.trim()??"";if(o)return {branch:o,source:"meta"}}let n=(await gitCurrentBranch(e.gitRoot)).trim();return n?{branch:n,source:"current"}:{branch:null,source:"none"}}function yA(e,t,r){return parseTaskIdFromBranch(e,t)===r}var vu=u(()=>{ee();Ee();nt();});function Oa(e,t,r){return (typeof e.sections?.[t]=="string"?e.sections[t].trim():"")||r}function iJ(e,t){let r=e.trim().replaceAll(/\s+/g," ");return r?r.length>t?`${r.slice(0,Math.max(1,t-3))}...`:r:""}function aJ(e){let t=new Set,r=[];for(let n of Array.isArray(e.tags)?e.tags:[]){let o=n.trim().toLowerCase();!o||o==="code"||t.has(o)||(t.add(o),r.push(o));}return r}function sJ(e){let t=e.verification?.state??"pending",r=typeof e.verification?.note=="string"?e.verification.note.trim():"",n=Array.isArray(e.verify)?e.verify.filter(a=>typeof a=="string"&&a.trim().length>0):[],o=Oa(e,"Verify Steps",n.length>0?n.map(a=>`- ${a.trim()}`).join(`
163
+ `):"- Not recorded."),i=t==="ok"?r||"Recorded as passed.":t==="needs_rework"?r||"Recorded as needs rework.":r||"Not recorded yet.";return ["### Plan","",o,"","### Current Status","",`- State: ${t}`,`- Note: ${i}`].join(`
164
+ `)}function cJ(e){let t=typeof e.risk_level=="string"?e.risk_level:"not recorded",r=Oa(e,"Rollback Plan","- Revert task-related commit(s) if rollback is required.");return [`- Risk level: ${t}`,`- Breaking change: ${e.breaking===true?"yes":"no"}`,"","### Rollback","",r].join(`
165
+ `)}function dJ(e){return [Ru,"",Oa(e.task,"Summary",e.task.title.trim()||"- Not recorded."),"",Cu,"",Oa(e.task,"Scope","- Not recorded."),"",Pu,"",sJ(e.task),"",wA,"",cJ(e.task),"",Tu,"",..._A(e.handoffNotes),""]}function lJ(e){let t=e.verification?.state??"pending",r=typeof e.verification?.note=="string"?e.verification.note.trim():"",n=t==="ok"?r||"Recorded as passed.":t==="needs_rework"?r||"Recorded as needs rework.":r||"Not recorded yet.";return [`- State: ${t}`,`- Note: ${n}`,"- Full verification checklist lives in local review.md."].join(`
166
+ `)}function mJ(e){return [Ru,"",Oa(e.task,"Summary",e.task.title.trim()||"- Not recorded."),"",Cu,"",Oa(e.task,"Scope","- Not recorded."),"",Pu,"",lJ(e.task),"",Tu,"",..._A(e.handoffNotes),""]}function fo(e){let t=extractTaskSuffix(e.id),r=aJ(e).slice(0,2).join("/"),n=iJ(e.title,r?72:84);return r?`${r}: ${n} (${t})`:`${n} (${t})`}function Bc(e){return ["<details>","<summary>Raw evidence</summary>","",`- Updated: ${e.updatedAt}`,`- Branch: ${e.branch}`,`- Head: ${e.headSha?e.headSha.slice(0,12):"No commits yet"}`,"","```text",e.diffstat||"No changes detected.","```","","</details>"].join(`
167
+ `)}function bA(e){let t=e.indexOf(xu),r=e.indexOf(vw);return t===-1||r===-1||r<t?null:e.slice(t+xu.length,r).trim()}function uJ(e){return e.replace(/\.\d{3}Z$/,"Z")}function _A(e){return e.length===0?["- No handoff notes recorded yet. Use `agentplane pr note ...` to append one."]:e.map(t=>`- ${uJ(t.created_at)} ${t.author}: ${t.body}`)}function Da(e){return ["# PR Review","",`Created: ${e.createdAt||"UNKNOWN"}`,`Branch: ${e.branch||"UNKNOWN"}`,"",...dJ({task:e.task,handoffNotes:e.handoffNotes??[]}),xu,e.autoSummary,vw,""].join(`
168
+ `)}function ai(e){return [...mJ({task:e.task,handoffNotes:e.handoffNotes??[]}),e.autoSummary,""].join(`
169
+ `)}function Lc(e,t){let r=[Ru,Cu,Pu,wA,Tu];for(let n of r)e.includes(n)||t.push(`Missing section: ${n}`);e.includes(xu)||t.push("Missing auto summary start marker"),e.includes(vw)||t.push("Missing auto summary end marker");}function vA(e,t){let r=[Ru,Cu,Pu,Tu];for(let n of r)e.includes(n)||t.push(`Missing section: ${n}`);e.includes("<details>")||t.push("Missing raw evidence details block");}var xu,vw,Ru,Cu,Pu,wA,Tu,si=u(()=>{xu="<!-- BEGIN AUTO SUMMARY -->",vw="<!-- END AUTO SUMMARY -->",Ru="## Summary",Cu="## Scope",Pu="## Verification",wA="## Risks",Tu="## Handoff Notes";});function pJ(e){let t=e.trim();if(!t)return null;let r=/^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/.exec(t);if(r)return `${r[1]}/${r[2]}`;let n=/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/.exec(t);return n?`${n[1]}/${n[2]}`:null}function ci(){let e=gitEnv();return nc("GH_TOKEN")&&delete e.GH_TOKEN,nc("GITHUB_TOKEN")&&delete e.GITHUB_TOKEN,typeof process.env.GH_TOKEN=="string"&&!nc("GH_TOKEN")&&(e.GH_TOKEN=process.env.GH_TOKEN),typeof process.env.GITHUB_TOKEN=="string"&&!nc("GITHUB_TOKEN")&&(e.GITHUB_TOKEN=process.env.GITHUB_TOKEN),typeof process.env.GH_CONFIG_DIR=="string"&&(e.GH_CONFIG_DIR=process.env.GH_CONFIG_DIR),typeof process.env.XDG_CONFIG_HOME=="string"&&(e.XDG_CONFIG_HOME=process.env.XDG_CONFIG_HOME),typeof process.env.HOME=="string"&&(e.HOME=process.env.HOME),e}async function go(e){let{stdout:t}=await runProcess({command:"git",args:["remote","get-url","origin"],cwd:e,env:gitEnv(),encoding:"utf8",maxBuffer:10485760}),r=pJ(String(t));if(!r)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:"Could not derive GitHub owner/repo from git remote origin."});return r}async function jt(e,t){let{stdout:r}=await uo(()=>runProcess({command:"gh",args:["api",...t],cwd:e,env:ci(),encoding:"utf8",maxBuffer:10485760}),{label:`running gh api ${t[0]??""}`});return JSON.parse(String(r))}async function qc(e,t){await uo(()=>runProcess({command:"gh",args:["api",...t],cwd:e,env:ci(),encoding:"utf8",maxBuffer:10*1024*1024}),{label:`running gh api ${t[0]??""}`});}function Su(e){return /\b404\b/.test(yn(e))}var ho=u(()=>{G();v();nm();Dc();});function fJ(e){let t=e.trim();if(!t)return null;let r=/^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/.exec(t);if(r)return `${r[1]}/${r[2]}`;let n=/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/.exec(t);return n?`${n[1]}/${n[2]}`:null}async function RA(e){try{let{stdout:t}=await execFileAsync("git",["remote","get-url","origin"],{cwd:e,env:process.env});return fJ(t)}catch{return null}}function CA(e){let t=Number(e.number);if(!Number.isInteger(t)||t<=0)return null;let r=e.state?.trim().toLowerCase()??"",n=e.merged_at?.trim()??null,o=n&&n.length>0?"MERGED":r==="open"?"OPEN":r==="closed"?"CLOSED":null;if(!o)return null;let i=e.html_url?.trim()??null,a=e.merge_commit_sha?.trim()??null,s=e.base?.ref?.trim()??null,c=e.head?.sha?.trim()??null;return {prNumber:t,prUrl:i,status:o,mergedAt:n,mergeCommit:a,base:s,headSha:c}}async function Eu(e){let t=await RA(e.gitRoot);if(!t)return null;let r=t.split("/")[0]?.trim()??"";if(!r)return null;let n=new URLSearchParams({state:"all",head:`${r}:${e.branch}`}),o=e.baseBranch?.trim()??"";o&&n.set("base",o);let i=`repos/${t}/pulls?${n.toString()}`;try{let{stdout:a}=await uo(()=>execFileAsync("gh",["api",i],{cwd:e.gitRoot,env:ci(),maxBuffer:10485760}),{label:`running gh api ${i}`}),s=JSON.parse(a);if(!Array.isArray(s)||s.length===0)return null;for(let c of s){let d=CA(c);if(d)return d}return null}catch(a){return a?.code==="ENOENT"||yn(a).trim().length>0,null}}function Iu(e,t,r){return t?.trim()?`${r} GitHub PR #${e}: ${t.trim()}`:`${r} GitHub PR #${e}`}function Hc(e){return e?e.status==="MERGED":false}function gJ(e){return `task branch ${e} is not yet published on origin; push it with \`git push -u origin ${e}\` and rerun \`agentplane pr open\``}function hJ(e){let t=yn(e);return /\b422\b/i.test(t)?/head sha/i.test(t)||/head ref/i.test(t)||/head.*must be a branch/i.test(t)||/head.*not found/i.test(t)||/field["']?\s*:\s*["']head["']/i.test(t)||/field\s+head\b/i.test(t)||/no commits between/i.test(t):false}function kJ(e){let t=yn(e);return e?.code==="ENOENT"?"gh CLI is unavailable":/authentication required/i.test(t)||/not logged into github/i.test(t)||/bad credentials/i.test(t)||/permission denied/i.test(t)||/\b401\b/i.test(t)||/\b403\b/i.test(t)?"GitHub auth or permissions unavailable":pw(e)?"GitHub transport failed; retry `agentplane pr open`":"GitHub PR creation failed"}async function PA(e){let t=await RA(e.gitRoot);if(!t)return {observed:null,stagedReason:"GitHub origin repo unavailable"};let r=e.baseBranch?.trim()??"";if(!r)return {observed:null,stagedReason:"base branch unresolved"};try{let{stdout:n}=await uo(()=>execFileAsync("gh",["api",`repos/${t}/pulls`,"-X","POST","-f",`title=${e.title}`,"-f",`body=${e.body}`,"-f",`head=${e.branch}`,"-f",`base=${r}`],{cwd:e.gitRoot,env:ci(),maxBuffer:10485760}),{label:`running gh api repos/${t}/pulls`});return {observed:CA(JSON.parse(n)),stagedReason:null}}catch(n){return hJ(n)?{observed:null,stagedReason:gJ(e.branch)}:{observed:null,stagedReason:kJ(n)}}}var Cw=u(()=>{Dc();ho();});async function TA(e,t){let r=e.baseBranch?await _u({gitRoot:e.resolved.gitRoot,baseBranch:e.baseBranch,branch:e.branch,prDir:e.prDir}):"",n=e.artifactRefresh?e.renderedHeadSha:e.renderedHeadSha??e.headSha,o=cA({taskId:e.task.id,branch:e.branch,at:e.now,previousMeta:e.existingMeta,base:e.baseBranch,headSha:e.renderedHeadSha}),i=typeof o.pr_number=="number"&&o.pr_number>0?{action:"linked-existing",message:Iu(o.pr_number,o.pr_url??null,"linked to")}:null,a,s=fo(e.task),c=ai({task:e.task,handoffNotes:e.handoffNotes,autoSummary:Bc({updatedAt:e.renderUpdatedAt,branch:e.branch,headSha:n??null,diffstat:r})}),d=await Eu({gitRoot:e.resolved.gitRoot,branch:e.branch,baseBranch:e.baseBranch});if(d)Hc(d)&&(o=jc({meta:o,observed:d,at:e.now})),a={action:"linked-existing",message:Iu(d.prNumber,d.prUrl,"linked to")};else if(t.remoteMode==="sync-only")a=i??{action:"sync-only",message:"local PR artifacts synced; remote PR creation skipped (--sync-only)"};else {let h=await PA({gitRoot:e.resolved.gitRoot,branch:e.branch,baseBranch:e.baseBranch,title:s,body:c});h.observed?(Hc(h.observed)&&(o=jc({meta:o,observed:h.observed,at:e.now})),a={action:"created",message:Iu(h.observed.prNumber,h.observed.prUrl,"created")}):a=i??{action:"staged",message:`local PR artifacts synced; remote PR creation staged (${h.stagedReason??"remote creation unavailable"})`};}let l=Bc({updatedAt:e.renderUpdatedAt,branch:e.branch,headSha:n??null,diffstat:r}),p=Da({task:e.task,createdAt:e.createdAt,branch:e.branch,handoffNotes:e.handoffNotes,autoSummary:l}),g=ai({task:e.task,handoffNotes:e.handoffNotes,autoSummary:l});return await ge(e.metaPath,o),await X(e.diffstatPath,r?`${r}
170
+ `:""),await P(e.notesPath)||await X(e.notesPath,""),await P(e.verifyLogPath)||await X(e.verifyLogPath,""),await X(e.reviewPath,p),await X(e.githubTitlePath,`${s}
171
+ `),await X(e.githubBodyPath,g),{meta:o,openOutcome:a}}var SA=u(()=>{ee();_e();nt();si();vu();Cw();});function EA(){return new Date().toISOString()}async function Pw(e){try{return await readFile(e,"utf8")}catch(t){if(t?.code==="ENOENT")return null;throw t}}async function IA(e){let t=Ye.join(e.gitRoot,po);if(await Pw(t)!==e.previousText){if(e.previousText===null){await rm$1(t,{force:true});return}await X(t,e.previousText);}}var AA=u(()=>{Nc();_e();});async function OA(e){if(!e.baseBranch)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Base branch could not be resolved (use `agentplane branch base set`)."});let t=await _u({gitRoot:e.resolved.gitRoot,baseBranch:e.baseBranch,branch:e.branch,prDir:e.prDir}),r=dA({meta:e.existingMeta,branch:e.branch,at:e.now,base:e.baseBranch,headSha:e.renderedHeadSha}),n=await Eu({gitRoot:e.resolved.gitRoot,branch:e.branch,baseBranch:e.baseBranch});Hc(n)&&(r=jc({meta:r,observed:n,at:e.now}));let o=Bc({updatedAt:r.updated_at,branch:e.branch,headSha:e.artifactRefresh?r.head_sha??e.renderedHeadSha??null:r.head_sha??e.renderedHeadSha??e.headSha??null,diffstat:t}),i=Da({task:e.task,createdAt:e.createdAt,branch:e.branch,handoffNotes:e.handoffNotes,autoSummary:o}),a=fo(e.task),s=ai({task:e.task,handoffNotes:e.handoffNotes,autoSummary:o});return await X(e.diffstatPath,t?`${t}
172
+ `:""),await X(e.reviewPath,i),await X(e.githubTitlePath,`${a}
173
+ `),await X(e.githubBodyPath,s),await ge(e.metaPath,r),{meta:r}}var DA=u(()=>{v();G();_e();nt();si();vu();Cw();});async function xJ(e){let t=await wu(e.notesPath),r=EA(),n=e.existingMeta?.created_at??r,{headSha:o,artifactRefresh:i}=await kA({gitRoot:e.resolved.gitRoot,taskId:e.task.id,branch:e.branch}),a=!!e.existingMeta?.head_sha&&!!o&&await ii({gitRoot:e.resolved.gitRoot,workflowDir:e.workflowDir,tasksPath:e.tasksPath,taskId:e.task.id,fromRef:e.existingMeta?.head_sha??null,toRef:o}),s=i?e.existingMeta?.head_sha??void 0:lA({previousHeadSha:e.existingMeta?.head_sha??null,currentHeadSha:o,preservePrevious:a}),d=(e.existingMeta&&(e.existingMeta.branch??null)===e.branch&&(e.existingMeta.base??null)===(e.baseBranch??null)&&(e.existingMeta.head_sha??null)===(s??null)?e.existingMeta.updated_at:null)??r;return {task:e.task,resolved:e.resolved,workflowDir:e.workflowDir,tasksPath:e.tasksPath,prDir:e.prDir,metaPath:e.metaPath,diffstatPath:e.diffstatPath,notesPath:e.notesPath,verifyLogPath:e.verifyLogPath,reviewPath:e.reviewPath,githubTitlePath:e.githubTitlePath,githubBodyPath:e.githubBodyPath,existingMeta:e.existingMeta,handoffNotes:t,now:r,createdAt:n,branch:e.branch,baseBranch:e.baseBranch,headSha:o,artifactRefresh:i,renderedHeadSha:s,renderUpdatedAt:d}}async function ko(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),{resolved:r,config:n,prDir:o,metaPath:i}=await ht({...e,ctx:t});if(n.workflow_mode!=="branch_pr")return null;let a=await _w({gitRoot:r.gitRoot,metaPath:i,taskId:e.taskId,branch:e.branch}),s=a.branch?.trim()??"";if(!s||a.source==="current"&&!yA(n.branch.task_prefix,s,e.taskId))return null;let c=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:null,mode:n.workflow_mode});if(a.source==="current"&&c&&s===c)return null;let d=Ye.join(o,"review.md");return await P(i)&&await P(d)||await di({...e,ctx:t,mode:"open",author:e.author,branch:s,remoteMode:"sync-only"}),{...await di({...e,ctx:t,mode:"update",branch:s}),branch:s}}async function di(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});Me({component:"pr-sync",event:"sync_started",details:{task_id:e.taskId,mode:e.mode,backend:t.backendId}});let{task:r}=await Kt({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId}),{resolved:n,config:o,prDir:i,metaPath:a,diffstatPath:s,notesPath:c,verifyLogPath:d,reviewPath:l,githubTitlePath:p,githubBodyPath:g}=await ht({...e,ctx:t}),h=await Pw(Ye.join(n.gitRoot,po));try{if(o.workflow_mode!=="branch_pr")throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:Jt(o.workflow_mode,"branch_pr")});let b=(await _w({gitRoot:n.gitRoot,metaPath:a,taskId:r.id,branch:e.branch})).branch?.trim()??"";if(!b)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Branch could not be resolved (use --branch)."});let w=await P(a),_=await P(l);if(e.mode==="update"&&(!w||!_)){let M=[];throw w||M.push(Ye.relative(n.gitRoot,a)),_||M.push(Ye.relative(n.gitRoot,l)),new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`PR artifacts missing: ${M.join(", ")} (run \`agentplane pr open\`)`})}await mkdir(i,{recursive:!0});let x=w&&await P(a)?je(await readFile(a,"utf8"),r.id):null,C=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:null,mode:o.workflow_mode}),j=await xJ({task:r,resolved:n,workflowDir:o.paths.workflow_dir,tasksPath:o.paths.tasks_path,prDir:i,metaPath:a,diffstatPath:s,notesPath:c,verifyLogPath:d,reviewPath:l,githubTitlePath:p,githubBodyPath:g,existingMeta:x,branch:b,baseBranch:C});if(e.mode==="open"){let M=e.remoteMode??"auto",{meta:$,openOutcome:W}=await TA(j,{author:e.author,remoteMode:M});return Me({component:"pr-sync",event:"sync_completed",details:{task_id:r.id,mode:e.mode,branch:b,action:W?.action??null}}),{meta:$,prDir:i,resolved:n,openOutcome:W}}let{meta:T}=await OA(j);return Me({component:"pr-sync",event:"sync_completed",details:{task_id:r.id,mode:e.mode,branch:b,action:"updated"}}),{meta:T,prDir:i,resolved:n}}finally{await IA({gitRoot:n.gitRoot,previousText:h});}}catch(t){throw Me({component:"pr-sync",event:"sync_failed",details:{task_id:e.taskId,mode:e.mode,error:t instanceof Error?t.name:"UnknownError"}}),t instanceof m?t:E(t,{command:"pr sync",root:e.rootOverride??null})}}var li=u(()=>{D();G();ee();I();v();la();Nc();nt();$c();N();wn();kw();vu();SA();AA();DA();});function PJ(e){let t=e instanceof Error?e.message:String(e);return /unknown revision or path not in the working tree/i.test(t)||/bad revision/i.test(t)||/ambiguous argument/i.test(t)}async function TJ(e){try{let{stdout:t}=await execFileAsync("git",["rev-parse","HEAD^"],{cwd:e,env:gitEnv()}),r=t.trim();return r.length>0?r:null}catch(t){if(!PJ(t))throw t;return null}}async function Gc(e){if(e.ctx.config.workflow_mode==="branch_pr")try{let t=e.ctx.resolvedProject.gitRoot,r=await TJ(t);if(await ii({gitRoot:t,workflowDir:e.ctx.config.paths.workflow_dir,tasksPath:e.ctx.config.paths.tasks_path,taskId:e.taskId,fromRef:r,toRef:"HEAD"}))return;await ko({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId});}catch(t){if(e.quiet)return;let r=yn(t).trim(),n=r?` (${r})`:"";process.stderr.write(`${ie(`task commit succeeded but PR artifacts refresh failed for ${e.taskId}; run \`agentplane pr update ${e.taskId}\`${n}`)}
174
+ `);}}var Tw=u(()=>{I();Dc();li();$c();});function mi(e,t){if(t.agents?.approvals?.require_plan!==true)return;let r=e.plan_approval?.state??"missing";if(r!=="approved")throw new m({exitCode:3,code:"E_VALIDATION",message:`${e.id}: plan approval is required before work can proceed (plan_approval.state=${JSON.stringify(r)}; use \`agentplane task plan approve ${e.id} --by <USER>\` or set agents.approvals.require_plan=false).`})}function Vc(e,t){if(t.agents?.approvals?.require_verify!==true||!ow(ve(e.tags),t))return;let r=e.verification?.state??"missing";if(r==="ok")return;let n=`use \`agentplane verify ${e.id} --ok|--rework --by <ID> --note <TEXT>\` and add \`--observation <TEXT> --impact <TEXT> --resolution <TEXT>\` when you want a structured finding or \`agentplane task verify ok|rework ${e.id} --by <ID> --note <TEXT>\``;throw new m({exitCode:3,code:"E_VALIDATION",message:`${e.id}: verification result is required before integration/closure can proceed (verification.state=${JSON.stringify(r)}; ${n} or set agents.approvals.require_verify=false).`})}function Ou(e,t){if(!t)for(let r of new Set(e.filter(n=>n.trim().length>0)))process.stderr.write(`${ie(r)}
175
+ `);}function bn(e,t,r){let n=e.trim();if(!n.toLowerCase().startsWith(t.toLowerCase()))throw new m({exitCode:2,code:"E_USAGE",message:`Comment body must start with ${t}`});if(n.length<r)throw new m({exitCode:2,code:"E_USAGE",message:`Comment body must be at least ${r} characters`})}function _n(e){if(typeof e.body!="string")return {formattedComment:null,commentBody:void 0};let t=e.enabled?du(e.body,e.config):null;return {formattedComment:t,commentBody:t??e.body}}async function jA(e){let t=e.author?.trim()??"";if(e.ctx.config.workflow_mode!=="direct")return t||void 0;let r=await QI(e.ctx.resolvedProject.agentplaneDir);return (r?.task_id===e.taskId?r.agent?.trim()??"":"")||t||void 0}async function Mr(e){e.progressMessage&&!e.quiet&&process.stdout.write(`${K(e.progressMessage)}
176
+ `);let t=e.resolveExecutorAgent?await jA({ctx:e.ctx,taskId:e.taskId,author:e.author}):void 0,r=await iA({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,primaryTag:e.primaryTag,executorAgent:t,author:e.author,statusFrom:e.statusFrom,statusTo:e.statusTo,commentBody:e.commentBody,formattedComment:e.formattedComment,emoji:e.emoji,allow:e.allow,autoAllow:e.autoAllow,allowTasks:e.allowTasks,requireClean:e.requireClean,quiet:e.quiet,config:e.ctx.config});return await Gc({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,quiet:e.quiet}),r}function Sw(e){let t=dw(e);t&&process.stderr.write(`${ie(t)}
177
+ `);}async function vn(e,t){let{stdout:r}=await execFileAsync("git",["log","-1","--pretty=%H%x00%s",t],{cwd:e}),{hash:n,subject:o}=ZI(r);return {hash:n,message:o}}function Fr(e){let t=normalizeTaskStatus(e);return t==="DOING"?"\u{1F6A7}":t==="DONE"?"\u2705":t==="BLOCKED"?"\u26D4":"\u{1F9E9}"}var Ew=u(()=>{I();mw();XI();v();eA();aA();Tw();Pa();cu();});function Br(e){return {kind:"set-task-fields",task:e}}function Ow(e){return {kind:"append-comments",comments:e}}function Uc(e){return Ow([e])}function Dw(e){return {kind:"append-events",events:e}}function Na(e){return Dw([e])}function Du(e){return {kind:"replace-doc",...e}}function tr(e){return {kind:"set-section",...e}}function Ke(e={}){return {kind:"touch-doc-meta",...e}}function OJ(e){return Array.isArray(e.comments)?e.comments.filter(t=>!!t&&typeof t.author=="string"&&typeof t.body=="string"):[]}function DJ(e){return Array.isArray(e.events)?e.events.filter(t=>!!t&&typeof t.type=="string"&&typeof t.at=="string"&&typeof t.author=="string"):[]}function Iw(e,t,r){let n=applyTaskDocMutations(e,t,{now:r.docUpdatedAt});return {...e,doc:n.doc,sections:n.sections,doc_version:n.doc_version,doc_updated_at:n.doc_updated_at,doc_updated_by:n.doc_updated_by}}function Nw(e){return e?Array.isArray(e)?e.filter(t=>t!=null):[e]:[]}function NJ(e){if(!e)return [];let t=[];return e.task&&t.push(Br(e.task)),e.appendComments&&e.appendComments.length>0&&t.push(Ow(e.appendComments)),e.appendEvents&&e.appendEvents.length>0&&t.push(Dw(e.appendEvents)),e.doc&&t.push(e.doc.kind==="replace-doc"?Du({doc:e.doc.doc,expectedCurrentDoc:e.doc.expectedCurrentDoc}):tr({section:e.doc.section,text:e.doc.text,requiredSections:e.doc.requiredSections,expectedCurrentText:e.doc.expectedCurrentText})),e.docMeta&&(e.doc!==void 0||e.docMeta.touch===true)&&t.push(Ke({updatedBy:e.docMeta.updatedBy,version:e.docMeta.version})),t}function $A(e){let t=Nw(e);if(t.length===0)return null;let r={};for(let n of t)switch(n.kind){case "set-task-fields":{r.task=r.task?{...r.task,...n.task}:{...n.task};break}case "append-comments":{n.comments.length>0&&(r.appendComments=[...r.appendComments??[],...n.comments]);break}case "append-events":{n.events.length>0&&(r.appendEvents=[...r.appendEvents??[],...n.events]);break}case "replace-doc":{let o={kind:"replace-doc",doc:n.doc};n.expectedCurrentDoc!==void 0&&(o.expectedCurrentDoc=n.expectedCurrentDoc),r.doc=o;break}case "set-section":{let o={kind:"set-section",section:n.section,text:n.text,requiredSections:[...n.requiredSections]};n.expectedCurrentText!==void 0&&(o.expectedCurrentText=n.expectedCurrentText),r.doc=o;break}case "touch-doc-meta":{r.docMeta={touch:true,updatedBy:n.updatedBy??r.docMeta?.updatedBy,version:n.version??r.docMeta?.version};break}}return r}async function Nu(e,t,r,n={}){return typeof e.mutate=="function"?await e.mutate(t,r,n):await e.patch(t,async o=>$A(await r(o)),n)}function Wc(e,t,r={}){let n=Nw(t);if(n.length===0)return {...e};let o=e,i={...o},a={comments:i.comments??null,doc:String(i.doc??""),doc_updated_by:i.doc_updated_by,doc_version:normalizeTaskDocVersion(r.currentDocVersion??e.doc_version),owner:i.owner,sections:i.sections??null},s=false;for(let c of n)switch(c.kind){case "set-task-fields":{Object.assign(i,c.task),a={...a,doc_updated_by:i.doc_updated_by,doc_version:normalizeTaskDocVersion(i.doc_version??a.doc_version),owner:i.owner};break}case "append-comments":{c.comments.length>0&&(i.comments=[...OJ(i),...c.comments],a={...a,comments:i.comments});break}case "append-events":{c.events.length>0&&(i.events=[...DJ(i),...c.events]);break}case "replace-doc":{c.expectedCurrentDoc!==void 0&&ql({taskId:o.id,currentDoc:a.doc,expectedDoc:c.expectedCurrentDoc}),a=Iw(a,[{kind:"replace-doc",doc:c.doc}],{docUpdatedAt:r.docUpdatedAt}),s=true;break}case "set-section":{c.expectedCurrentText!==void 0&&Hl({taskId:o.id,currentDoc:a.doc,section:c.section,expectedText:c.expectedCurrentText}),a=Iw(a,[{kind:"set-section",section:c.section,text:c.text,requiredSections:c.requiredSections}],{docUpdatedAt:r.docUpdatedAt}),s=true;break}case "touch-doc-meta":{a=Iw(a,[{kind:"touch-doc-meta",updatedBy:c.updatedBy,version:c.version}],{docUpdatedAt:r.docUpdatedAt}),s=true;break}}return s&&(i.doc=a.doc,i.sections=a.sections??taskDocToSectionMap(a.doc),i.doc_version=a.doc_version,i.doc_updated_at=a.doc_updated_at,i.doc_updated_by=a.doc_updated_by),i}function MA(e,t){return Wc(e.task,t,{currentDocVersion:normalizeTaskDocVersion(e.parsed.frontmatter.doc_version)})}function FA(e){return Nw(e)}function BA(e){return NJ(e)}var jw=u(()=>{Qh();});function qJ(e,t){return Ye.join(e.resolvedProject.gitRoot,e.config.paths.workflow_dir,t,"README.md")}function Fw(e,t=1){return Number.isInteger(e)&&Number(e)>0?Number(e):t}function HJ(e){return Number.isInteger(e)&&Number(e)>0?Number(e):null}function qA(e){return e instanceof m&&e.code==="E_IO"&&e.message.startsWith("Task README changed concurrently:")}function HA(e){throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Task revision changed concurrently: ${e.taskId} (expected revision ${e.expectedRevision}, current revision ${e.currentRevision})`,context:{task_id:e.taskId,expected_revision:e.expectedRevision,current_revision:e.currentRevision,reason_code:"task_revision_conflict"}})}async function Bw(e){let t=qJ(e.ctx,e.taskId),r,n;try{n=await stat(t),r=await readFile(t,"utf8");}catch(a){throw a?.code==="ENOENT"?new m({exitCode:4,code:"E_IO",message:`ENOENT: no such file or directory, open '${t}'`}):a}let o=parseTaskReadme(r);return {task:Sr({id:e.taskId,frontmatter:o.frontmatter,body:o.body}),readmePath:t,mtimeMs:n.mtimeMs,parsed:o,rawText:r}}async function GJ(e){if((await stat(e.readmePath)).mtimeMs!==e.expectedMtimeMs)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Task README changed concurrently: ${e.readmePath}`})}async function GA(e){try{return (await stat(e.readmePath)).mtimeMs!==e.expectedMtimeMs}catch(t){if(t?.code==="ENOENT")return true;throw t}}async function VA(e){let{entry:t,next:r}=e,n={...t.parsed.frontmatter,...Ir(r)},o=t.parsed.body??"",i=extractTaskDoc(o),a=new Date().toISOString(),s=normalizeTaskDocVersion(t.parsed.frontmatter.doc_version),c=normalizeTaskDocVersion(r.doc_version,s);if(r.doc!==void 0){let p=String(r.doc??"");o=mergeTaskDoc(o,p),(docChanged(i,p)||!n.doc_updated_at)&&(n.doc_version=c,n.doc_updated_at=a,n.doc_updated_by=ac(r));}n.doc_version=normalizeTaskDocVersion(n.doc_version,c),(typeof n.doc_updated_at!="string"||n.doc_updated_at.trim()==="")&&(n.doc_updated_at=a),(typeof n.doc_updated_by!="string"||n.doc_updated_by.trim()==="")&&(n.doc_updated_by=ac(r));let d=HJ(t.parsed.frontmatter.revision);n.revision=d??1;let l=renderTaskReadme(n,o);return l=l.endsWith(`
178
+ `)?l:`${l}
179
+ `,d!==null&&l!==t.rawText&&(n.revision=d+1,l=renderTaskReadme(n,o),l=l.endsWith(`
180
+ `)?l:`${l}
181
+ `),await GJ({readmePath:t.readmePath,expectedMtimeMs:t.mtimeMs}),await X(t.readmePath,l)}var UA=u(()=>{zo();G();v();_e();N();});function Lr(e){let t=e.memo;return t.taskStore??=new ju(e),t.taskStore}function Lw(e){return Fe(e)}var ju,WA=u(()=>{G();v();N();jw();UA();ju=class{ctx;cache=new Map;constructor(t){this.ctx=t;}async get(t){return (await this.getCached(t)).task}async update(t,r,n={}){return await this.runWithRetry(t,n,async o=>await r({...o.task}))}async patch(t,r,n={}){return await this.mutate(t,async o=>BA(await r(o)),n)}async mutate(t,r,n={}){return await this.runWithRetry(t,n,async o=>{let i=FA(await r({...o.task}));return MA(o,i)})}async getCached(t){let r=t.trim();if(!r)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"task id is required"});let n=this.cache.get(r);if(n)return await n;let o=(async()=>await Bw({ctx:this.ctx,taskId:r}))();return this.cache.set(r,o),await o}async runWithRetry(t,r,n){for(let i=0;i<2;i++){let a=await this.getCached(t);if(r.expectedRevision!==void 0){let c=Fw(r.expectedRevision),d=Fw(a.task.revision);d!==c&&HA({taskId:t,expectedRevision:c,currentRevision:d});}let s;try{s=await n(a);}catch(c){if(i===0&&c instanceof m&&c.code==="E_VALIDATION"&&await GA({readmePath:a.readmePath,expectedMtimeMs:a.mtimeMs})){this.cache.delete(t);continue}throw c}try{return await this.writeNextTask(t,a,s)}catch(c){if(i===0&&qA(c)){this.cache.delete(t);continue}throw c}}return {changed:false,task:await this.get(t)}}async writeNextTask(t,r,n){let o=await VA({entry:r,next:n});this.cache.set(t,(async()=>await Bw({ctx:this.ctx,taskId:t}))());let i=await this.get(t);return {changed:o,task:i}}};});var qr=u(()=>{jw();WA();});function $u(e){if(!(e instanceof m))return [];let t=e.context?.deferred_warnings;return Array.isArray(t)?[...new Set(t.filter(r=>typeof r=="string"&&r.length>0))]:[]}function WJ(e){return Array.isArray(e.comments)?e.comments.filter(t=>!!t&&typeof t.author=="string"&&typeof t.body=="string"):[]}function zJ(e,t,r){let n=Ra(e,r),o=n.indexOf(Nr),i=n.indexOf(gn);if(o===-1||i===-1||i<=o)throw new Error("Verification results markers are malformed");let a=n.slice(0,i).trimEnd(),s=n.slice(i).trimStart(),c=t.trimEnd();return [a,...a.endsWith(Nr)?[]:[""],c,"",s].join(`
182
+ `).trimEnd()}function KJ(e){let t=[`### ${e.at} \u2014 VERIFY \u2014 ${e.state}`,"",`By: ${e.by}`,"",`Note: ${e.note}`],r=(e.verifyStepsRef??"").trim();r&&t.push("",`VerifyStepsRef: ${r}`);let n=(e.details??"").trim();return n&&t.push("","Details:","",n),`${t.join(`
183
+ `).trimEnd()}
184
+ `}function JJ(e){return createHash("sha256").update(e,"utf8").digest("hex")}function YJ(e){let t={status:e.toStatus};return e.extraFields&&Object.assign(t,e.extraFields),e.commit!==void 0&&(t.commit=e.commit),t}function KA(e){let t=normalizeTaskStatus(e.task.status),r=YJ(e),n={type:"status",at:e.at,author:e.eventAuthor,from:t,to:e.toStatus,note:e.note},o=[Br(r)];e.comment&&o.push(Uc(e.comment)),o.push(Na(n),Ke({updatedBy:e.updatedBy,version:Se(e.task.doc_version)}));let i={...e.task,...r,comments:e.comment?[...WJ(e.task),e.comment]:e.task.comments,events:jr(e.task,n),doc_version:Se(e.task.doc_version),doc_updated_at:e.at,doc_updated_by:e.updatedBy};return {currentStatus:t,intents:o,nextTask:i}}async function ui(e){let t=normalizeTaskStatus(e.task.status);JI({currentStatus:t,nextStatus:e.toStatus,force:e.force});let r=null,n=[],o=e.dependencyPolicy??{kind:"none"};if(o.kind==="require-ready"&&!e.force&&(r=await oi(e.task,e.backend),n.push(...aw(r)),r.missing.length>0||r.incomplete.length>0)){let i=[...new Set(n)];throw new m({exitCode:2,code:"E_USAGE",message:o.failureMessage??`Task is not ready: ${e.task.id} (use --force to override)`,context:{reason_code:"task_transition_dependencies_not_ready",deferred_warnings:i}})}if(e.commentCommitPolicy){let i=cw({enabled:e.commentCommitPolicy.enabled,config:e.config,action:e.commentCommitPolicy.action,confirmed:e.commentCommitPolicy.confirmed,quiet:e.commentCommitPolicy.quiet,statusFrom:t,statusTo:e.toStatus});i&&n.push(i);}return {...KA(e),dependencyState:r,deferredWarnings:[...new Set(n)]}}function JA(e){let t=normalizeTaskStatus(e.task.status),n={verification:{state:e.state,updated_at:e.at,updated_by:e.by,note:e.note},...e.state==="needs_rework"?{status:"DOING",commit:null}:{}},o={type:"verify",at:e.at,author:e.by,state:e.state,note:e.note},i=[Br(n),tr({section:"Verification",text:e.verificationSection,requiredSections:e.requiredSections}),Na(o),Ke({updatedBy:e.by})],a={...e.task,...n,doc:e.nextDoc,events:jr(e.task,o),doc_version:Se(e.task.doc_version),doc_updated_at:e.at,doc_updated_by:e.by};return {currentStatus:t,intents:i,nextTask:a}}function Hw(e){let t=ensureDocSections(e.doc,e.requiredSections),r=be(t,"Verification")??"",n=be(t,"Verify Steps"),o=n?JJ(n.replaceAll(`\r
185
+ `,`
186
+ `).trim()):null,i=Se(e.task.doc_version),a=[`doc_version=${String(i)}`,`doc_updated_at=${String(e.task.doc_updated_at??"missing")}`,`excerpt_hash=sha256:${o??"missing"}`].join(", "),s=KJ({at:e.at,state:e.state,by:e.by,note:e.note,details:e.details??null,verifyStepsRef:a}),c=zJ(r,s,i),d=ensureDocSections(setMarkdownSection(t,"Verification",c),e.requiredSections);return {...JA({task:e.task,at:e.at,by:e.by,note:e.note,state:e.state,verificationSection:c,nextDoc:d,requiredSections:e.requiredSections}),verificationSection:c,nextDoc:d}}var Gw=u(()=>{v();qr();su();Ca();cu();});async function zc(e){return Fe(e.ctx)?await e.local(Lr(e.ctx)):await e.remote(e.ctx.taskBackend)}async function dt(e){if(new eo().evaluate({action:e.policyAction??"task_mutation",config:e.ctx.config,taskId:e.taskId,git:{stagedPaths:[]}}),Fe(e.ctx))return {...await Lr(e.ctx).update(e.taskId,async d=>{let l=await e.build({...d});return l?l.nextTask!==void 0?l.nextTask:l.intents!==void 0?Wc(d,l.intents):d:d},{expectedRevision:e.writeOptions?.expectedRevision}),mode:"local-store"};let t=await ue({ctx:e.ctx,taskId:e.taskId}),r=t;if(e.ctx.taskBackend.getTaskDoc){let s=typeof t.doc=="string"&&t.doc.length>0?t.doc:await e.ctx.taskBackend.getTaskDoc(e.taskId)??"";s!==t.doc&&(r={...t,doc:s});}let n=await e.build({...r});if(!n)return {changed:false,task:t,mode:"backend"};let o=n.nextTask??(n.intents===void 0?void 0:Wc(r,n.intents));if(o===void 0)return {changed:false,task:t,mode:"backend"};let i=JSON.stringify(r)!==JSON.stringify(o);if(!i&&n.forceWrite!==true)return {changed:false,task:o,mode:"backend"};let a={};return e.writeOptions&&Object.assign(a,e.writeOptions),n.writeOptions&&Object.assign(a,n.writeOptions),await e.ctx.taskBackend.writeTask(o,a),{changed:i,task:o,mode:"backend"}}async function ja(e){let t=await e.ctx.taskBackend.listTasks(),r=await e.build(t.map(o=>({...o}))),n=[...r.tasksToWrite??[]];return n.length>0&&await sE(e.ctx.taskBackend,n),{result:r.result,tasksToWrite:n}}var rr=u(()=>{um();N();qr();});async function pi(e){let t=null,r="meta",n=[];try{await dt({ctx:e.ctx,taskId:e.taskId,policyAction:e.policyAction??"task_status_transition",build:async o=>{let i=await e.build(o);return t=await ui({...i,task:o,backend:e.ctx.taskBackend,config:e.ctx.config}),r=Nt(ve(o.tags),e.ctx).primary,n=t.deferredWarnings,{intents:t.intents}}});}catch(o){throw Ou($u(o).length>0?$u(o):n,e.quiet),o}if(Ou(n,e.quiet),!t)throw new m({exitCode:4,code:"E_IO",message:`Task transition produced no execution state: ${e.taskId}`});return {execution:t,primaryTag:r}}var YA=u(()=>{v();rr();Ew();Pa();Gw();});function fi(e){let t=e.backend.getLastListWarnings?.()??[];if(t.length===0)return;let r=t.slice(0,3).join("; "),n=t.length>3?`; +${t.length-3} more`:"",o=`skipped ${t.length} task files during scan (${r}${n})`;if(e.strictRead)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`task scan strict mode failed: ${o}`});process.stderr.write(`${ie(o)}
187
+ `);}function ZJ(e,t,r){let n=t.status.length>0?t.status:(r??[]).filter(i=>i.trim().length>0);if(n.length===0)return e;let o=new Set(n.map(i=>parseTaskStatus(i)).filter(i=>i!==null));return e.filter(i=>o.has(normalizeTaskStatus(i.status)))}function e8(e,t){if(t.owner.length===0)return e;let r=new Set(t.owner.map(n=>n.trim().toUpperCase()));return e.filter(n=>r.has(String(n.owner||"").toUpperCase()))}function t8(e,t){if(t.tag.length===0)return e;let r=new Set(t.tag.map(n=>n.trim()).filter(Boolean));return e.filter(n=>ae(ve(n.tags)).some(i=>r.has(i)))}function QA(e,t){return t!==void 0&&t>=0?e.slice(0,t):e}function XA(e){return e.toSorted((t,r)=>t.id.localeCompare(r.id))}function yo(e){let t=sw(e.tasks),r=ZJ(e.tasks,e.filters,e.defaultStatuses);r=e8(r,e.filters),r=t8(r,e.filters),e.match&&(r=r.filter(a=>e.match?.(a)??false));let n=r;e.readyOnly&&(n=n.filter(a=>{let s=t.get(a.id);return !s||s.missing.length===0&&s.incomplete.length===0}));let i=(e.limitOrder??"after-sort")==="before-sort"?XA(QA(n,e.filters.limit)):QA(XA(n),e.filters.limit);return {depState:t,filtered:r,items:i}}function Mu(e){let t=[];for(let i of ["id","title","description","status","priority","owner"]){let a=e[i];typeof a=="string"&&a.trim()&&t.push(a.trim());}let r=ve(e.tags);t.push(...r.filter(Boolean));let n=Array.isArray(e.comments)?e.comments:[];for(let i of n)i&&typeof i.author=="string"&&t.push(i.author),i&&typeof i.body=="string"&&t.push(i.body);let o=e.commit??null;return o&&typeof o.hash=="string"&&t.push(o.hash),o&&typeof o.message=="string"&&t.push(o.message),t.join(`
188
+ `)}var ZA=u(()=>{I();G();v();Dr();su();Pa();});var le=u(()=>{Dr();Ca();Pa();su();cu();Ew();Gw();YA();ZA();});async function Kc(e){try{return await readFile(e,"utf8")}catch(t){if(t?.code==="ENOENT")return null;throw t}}function nO(e){return Ye.join(e.resolvedProject.gitRoot,po)}function oO(e){return Ye.join(e.resolvedProject.gitRoot,hu)}function n8(e){let t=e.replaceAll(`\r
189
+ `,`
190
+ `).trimEnd();return t.length>0?`${t}
191
+ `:fn()}async function o8(e,t){let r=nO(e),n=oO(e),o=await Kc(n)!==null,i=n8(t),a=await X(r,i),s=false;if(o){let c=await Kc(r)??i;s=await X(n,c),await Kc(r)!==c&&(a=await X(r,c)||a);}return a||s}async function i8(e){let t=[po],r=oO(e);return await Kc(r)!==null&&t.push(hu),t}function a8(e){return e.replaceAll(`\r
192
+ `,`
193
+ `).split(`
194
+ `).length}async function Fu(e){let t=nO(e),r=await Kc(t)??fn();return {registryPath:t,registryText:r,registry:ei(r)}}async function iO(e,t,r){let n=r??await e.taskBackend.getTask(t);if(!n)throw new m({exitCode:2,code:"E_USAGE",message:`Unknown task: ${t}`});let o=typeof n.doc=="string"?n.doc:"",i=Se(n.doc_version),a=Dt(o,i)?.trim()??"",s=be(o,"Scope")?.trim()??null;return {task:n,findings:a,scope:s,query:va({taskId:n.id,title:n.title,description:n.description,scope:s,tags:n.tags??[]})}}function s8(e,t){let r=t.issues.map(n=>{let o=n.candidate.incidentScope??n.candidate.observation;return `line ${n.candidate.line}: ${o} -> missing ${n.missingFields.join(", ")}`});return [`${e}: reusable external findings need explicit external marking and enough recovery detail before promotion.`,"Required fields:",...r.map(n=>`- ${n}`)].join(`
195
+ `)}async function kt(e){let t=await Vw(e),{loaded:r,registryPath:n,registryPaths:o,registryText:i,registry:a,plan:s}=t;if(s.issues.length>0)throw new m({exitCode:3,code:"E_VALIDATION",message:s8(e.taskId,s)});let c=_a(i,s.promotable.map(l=>l.entry));if(s.promotable.length>0){let l=a8(c);if(l>eO)throw new m({exitCode:3,code:"E_VALIDATION",message:`Incident registry write would exceed policy budget: ${l} lines (limit ${eO}). Compact or promote fewer entries before writing.`})}let d=e.write&&s.promotable.length>0?await o8(e.ctx,c):false;return {loaded:r,registryPath:n,registryPaths:o,registryText:i,registry:a,plan:s,wrote:d}}async function Vw(e){let t=await iO(e.ctx,e.taskId,e.task??null),{registryPath:r,registryText:n,registry:o}=await Fu(e.ctx),i=await i8(e.ctx),a=Zm({task:{id:t.task.id,title:t.task.title,description:t.task.description,scope:t.scope,tags:t.task.tags??[],commitHash:t.task.commit?.hash??null},findings:t.findings,registry:o,now:e.now});return {loaded:t,registryPath:r,registryPaths:i,registryText:n,registry:o,plan:a}}function c8(e){return e>0?`incident registry updated (${e} promoted)`:"incident registry unchanged (no promotable external findings)"}function tO(e,t=3){let r=e.map(n=>n.trim()).filter(n=>n.length>0);return r.length===0?null:r.length<=t?r.join(", "):`${r.slice(0,t).join(", ")}, +${r.length-t} more`}function wr(e,t){let r=Array.isArray(e.candidates)?e.candidates.length:0,n=Array.isArray(e.skipped)?e.skipped.length:0,o=Array.isArray(e.promotable)?e.promotable.length:0,i=Array.isArray(e.duplicates)?e.duplicates.length:0,a=Array.isArray(e.issues)?e.issues.length:0,s=e.findingsTextPresent===true,c=typeof e.structuredFindingCount=="number"?e.structuredFindingCount:0,d=t?.wrote===true,l=t?.context??"generic",p=typeof t?.taskId=="string"&&t.taskId.trim().length>0?t.taskId.trim():null,g=p?` next: agentplane task findings add ${p} --observation "<observation>" --impact "<impact>" --resolution "<resolution>"`:"";if(o>0&&d){let h=[];i>0&&h.push(`${i} duplicate${i===1?"":"s"}`),n>0&&h.push(`${n} skipped structured finding${n===1?"":"s"}`);let f=h.length>0?`incident registry updated (${o} promoted; ${h.join("; ")})`:c8(o),b=[],w=Array.isArray(t?.promotedIds)?t.promotedIds.filter(j=>typeof j=="string"&&j.trim().length>0):[],_=Array.isArray(t?.registryPaths)?t.registryPaths.filter(j=>typeof j=="string"&&j.trim().length>0):[],x=tO(w),C=tO(_);return x&&b.push(`ids=${x}`),C&&b.push(`files=${C}`),b.length>0?`${f} ${b.join(" ")}`:f}if(o>0&&!d)return l==="collect"?`incident registry unchanged (${o} promotable external finding${o===1?"":"s"} validated; rerun without --check to update incidents.md)`:l==="verify"?`incident registry unchanged (${o} promotable external finding${o===1?"":"s"} stayed task-local in the current task worktree; run verify --collect-incidents, agentplane incidents collect <task-id>, or finish on the base branch to update incidents.md)`:`incident registry unchanged (${o} promotable external finding${o===1?"":"s"} pending promotion)`;if(a>0){let b=(Array.isArray(e.issues)?e.issues:[])[0]?.missingFields,w=Array.isArray(b)?b.filter(C=>typeof C=="string"&&C.trim().length>0):[],_=w.length>0?` missing required fields: ${w.join(", ")}`:" missing required promotion fields",x=a>1?`; +${a-1} more candidate${a-1===1?"":"s"}`:"";return `incident registry unchanged (${a} structured finding candidate${a===1?"":"s"} still invalid;${_}${x})`}return n>0?`incident registry unchanged (${n} structured finding${n===1?"":"s"} stayed task-local in the current checkout: mark reusable external findings with Promotion: incident-candidate plus Fixability: external, or use task findings add without --local-only)`:r===0&&c===0&&s?"incident registry unchanged (plain Findings text stays task-local in the current checkout and does not update incidents.md: add a structured Observation/Impact/Resolution block for reusable external incidents, or use task findings add without --local-only)":r===0?l==="verify"?`incident registry unchanged (plain verify note stayed task-local and did not update incidents.md: add --observation, --impact, and --resolution for a reusable incident, then rerun with --collect-incidents or collect later on the base branch.${g})`:l==="finish"?`incident registry unchanged (plain finish body/result stayed task-local and did not update incidents.md: add --observation, --impact, and --resolution for a reusable incident before closeout.${g})`:"incident registry unchanged (no structured incident findings)":i>0&&i===r?`incident registry unchanged (${i} duplicate incident${i===1?"":"s"} already recorded)`:"incident registry unchanged (no promotable external findings)"}async function Bu(e){let t=await iO(e.ctx,e.taskId,e.task??null),{registry:r}=await Fu(e.ctx);return {loaded:t,matches:xa({query:t.query,registry:r,limit:e.limit})}}var eO,xn=u(()=>{v();_e();eu();le();Nc();Nc();eO=100;});var aO={};S(aO,{incidentsAdviseSpec:()=>Lu,makeRunIncidentsAdviseHandler:()=>d8});function d8(e){return async(t,r)=>{let n=await e("incidents advise")??await R({cwd:t.cwd,rootOverride:t.rootOverride??null});if(r.taskId){let s=await Bu({ctx:n,taskId:r.taskId,limit:r.limit});return r.json?($a.json({task_id:r.taskId,matches:s.matches.map(c=>({score:c.score,matched_tags:c.matchedTags,matched_terms:c.matchedTerms,scope_matched:c.scopeMatched,entry:c.entry}))}),0):($a.line(`Incident advice for ${r.taskId}:`),$a.line(ti(s.matches)),0)}let o=await Fu(n),i=va({taskId:"adhoc",title:r.title??r.scope??"",description:r.description??"",scope:r.scope,tags:r.tags}),a=xa({query:i,registry:o.registry,limit:r.limit});return r.json?($a.json({query:i,matches:a.map(s=>({score:s.score,matched_tags:s.matchedTags,matched_terms:s.matchedTerms,scope_matched:s.scopeMatched,entry:s.entry}))}),0):($a.line("Incident advice:"),$a.line(ti(a)),0)}}var $a,Lu,Uw=u(()=>{I();H();eu();N();xn();$a=A(),Lu={id:["incidents","advise"],group:"Policy",summary:"Resolve relevant incident advice for a task or an ad hoc scope/tag query.",args:[{name:"task-id",required:false,valueHint:"<task-id>"}],options:[{kind:"string",name:"scope",valueHint:"<text>",description:"Ad hoc scope text when querying without a task id."},{kind:"string",name:"title",valueHint:"<text>",description:"Optional title text for ad hoc advice lookup."},{kind:"string",name:"description",valueHint:"<text>",description:"Optional description text for ad hoc advice lookup."},{kind:"string",name:"tag",valueHint:"<tag>",repeatable:true,description:"Matching tag for ad hoc advice lookup; repeat as needed."},{kind:"string",name:"limit",valueHint:"<n>",default:"5",coerce:e=>Number.parseInt(e,10),description:"Maximum number of advice entries to show."},{kind:"boolean",name:"json",default:false,description:"Emit machine-readable advice matches."}],validateRaw:e=>{let t=typeof e.args["task-id"]=="string"?e.args["task-id"].trim():"",r=typeof e.opts.scope=="string"?e.opts.scope.trim():"",n=typeof e.opts.title=="string"?e.opts.title.trim():"",o=typeof e.opts.description=="string"?e.opts.description.trim():"",i=Array.isArray(e.opts.tag)?e.opts.tag:[];if(!t&&!r&&!n&&!o&&i.length===0)throw y({spec:Lu,message:"Provide either <task-id> or at least one of --scope/--title/--description/--tag."})},parse:e=>({taskId:typeof e.args["task-id"]=="string"&&String(e.args["task-id"]).trim()?String(e.args["task-id"]).trim():null,scope:typeof e.opts.scope=="string"?String(e.opts.scope).trim():null,title:typeof e.opts.title=="string"?String(e.opts.title).trim():null,description:typeof e.opts.description=="string"?String(e.opts.description).trim():null,tags:Array.isArray(e.opts.tag)?e.opts.tag.map(t=>String(t).trim()).filter(Boolean):[],limit:typeof e.opts.limit=="number"&&Number.isInteger(e.opts.limit)&&e.opts.limit>0?Number(e.opts.limit):5,json:e.opts.json===true})};});var sO={};S(sO,{incidentsCollectSpec:()=>zw,makeRunIncidentsCollectHandler:()=>l8});function l8(e){return async(t,r)=>{let n=await e("incidents collect")??await R({cwd:t.cwd,rootOverride:t.rootOverride??null}),o=await kt({ctx:n,taskId:r.taskId,write:!r.check});return r.json?(Ww.json({task_id:r.taskId,checked_only:r.check,candidates:o.plan.candidates.length,skipped:o.plan.skipped,promotable:o.plan.promotable.map(i=>i.entry),duplicates:o.plan.duplicates.map(i=>i.entry.id),wrote:o.wrote,registry_path:o.registryPath,registry_paths:o.registryPaths}),0):(Ww.success(r.check?"checked":"collected",r.taskId,`candidates=${o.plan.candidates.length} skipped=${o.plan.skipped.length} promoted=${o.plan.promotable.length} duplicates=${o.plan.duplicates.length}`),Ww.info(wr(o.plan,{wrote:o.wrote,context:"collect",promotedIds:o.plan.promotable.map(i=>i.entry.id),registryPaths:o.registryPaths})),0)}}var Ww,zw,Kw=u(()=>{I();N();xn();Ww=A(),zw={id:["incidents","collect"],group:"Policy",summary:"Promote reusable resolved external findings from a task into the incident registry.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"boolean",name:"check",default:false,description:"Validate incident promotion inputs without writing `.agentplane/policy/incidents.md`."},{kind:"boolean",name:"json",default:false,description:"Emit machine-readable collection details."}],examples:[{cmd:"agentplane incidents collect 202604031416-HEJWTM",why:"Promote resolved external incident advice from task Findings into the shared registry."},{cmd:"agentplane incidents collect 202604031416-HEJWTM --check --json",why:"Validate that reusable resolved external findings are complete before finish."}],parse:e=>({taskId:String(e.args["task-id"]??""),check:e.opts.check===true,json:e.opts.json===true})};});var cO={};S(cO,{incidentsSpec:()=>qu,runIncidents:()=>m8});var qu,m8,Jw=u(()=>{Oe();qu={id:["incidents"],group:"Policy",summary:"Promote external incident advice and resolve incident hints for analogous tasks.",synopsis:["agentplane incidents <collect|advise> [args] [options]"],args:[{name:"cmd",required:false,variadic:true,valueHint:"<command>"}],notes:["Use `incidents collect` to promote resolved reusable external findings into `.agentplane/policy/incidents.md`.","Use `incidents advise` to query registry advice by task id or lightweight scope/tags."],parse:e=>ke(e)},m8=async(e,t)=>{oe({spec:qu,cmd:t.cmd,subcommands:await ne(["incidents"]),command:"incidents"});};});var Rn,u8,wo,Hu=u(()=>{H();Rn={id:["release","apply"],group:"Release",summary:"Apply a prepared direct-mode release: bump versions, validate notes, commit, and tag.",description:"Applies a release plan generated by `agentplane release plan` on the direct release route. This command does not author release notes; it expects a DOCS agent to have written docs/releases/vX.Y.Z.md. In branch_pr repositories, use `agentplane release candidate` on a dedicated non-base branch instead.",options:[{kind:"string",name:"plan",valueHint:"<path>",description:"Path to a release plan directory (defaults to the latest under .agentplane/.release/plan/)."},{kind:"boolean",name:"push",default:false,description:"Optional direct-push mode: push the release commit and tag immediately (requires --yes). This is for the direct release route only."},{kind:"string",name:"remote",valueHint:"<name>",description:"Git remote to push to (default: origin)."},{kind:"boolean",name:"yes",default:false,description:"Approve minor/major bumps and allow pushing. Patch bumps can be applied without this flag."}],parse:e=>({plan:e.opts.plan,push:e.opts.push===true,remote:e.opts.remote??"origin",yes:e.opts.yes===true}),validate:e=>{if(e.push&&e.yes!==true)throw y({spec:Rn,command:"release apply",message:"Option --push requires explicit approval. Re-run with --yes."});if(!e.remote.trim())throw y({spec:Rn,command:"release apply",message:"Option --remote must be non-empty."})},examples:[{cmd:"agentplane release apply",why:"Apply the latest release plan locally (expects docs/releases/vX.Y.Z.md to exist)."},{cmd:"agentplane release apply --plan .agentplane/.release/plan/<runId>",why:"Apply a specific release plan directory."},{cmd:"agentplane release apply --push --yes",why:"Apply and push the release commit+tag to the remote."}]},u8=[{kind:"string",name:"plan",valueHint:"<path>",description:"Path to a release plan directory (defaults to the latest under .agentplane/.release/plan/)."},{kind:"boolean",name:"push",default:false,description:"Optional candidate-push mode: push only the release candidate branch for hosted review and merge (requires --yes). The release tag is not created or pushed here."},{kind:"string",name:"remote",valueHint:"<name>",description:"Git remote to push to (default: origin)."},{kind:"boolean",name:"yes",default:false,description:"Approve minor/major bumps and allow pushing. Patch bumps can be applied without this flag."}],wo={id:["release","candidate"],group:"Release",summary:"Prepare a branch_pr release candidate: bump versions, validate notes, commit, and optionally push the candidate branch.",description:"Prepares a release candidate from a generated release plan on a dedicated non-base branch in branch_pr mode. This command creates the candidate commit but intentionally does not create or push the release tag; final publication remains gated on merge to the protected base branch and hosted publish from main.",options:u8,parse:Rn.parse,validate:e=>{if(e.push&&e.yes!==true)throw y({spec:wo,command:"release candidate",message:"Option --push requires explicit approval. Re-run with --yes."});if(!e.remote.trim())throw y({spec:wo,command:"release candidate",message:"Option --remote must be non-empty."})},examples:[{cmd:"agentplane release candidate",why:"Prepare the latest release plan on the current branch_pr candidate branch."},{cmd:"agentplane release candidate --plan .agentplane/.release/plan/<runId>",why:"Prepare a specific release plan on the current candidate branch."},{cmd:"agentplane release candidate --push --yes",why:"Prepare and push only the release candidate branch for hosted review and merge."}]};});var Ma,Yw=u(()=>{H();Ma={id:["release","plan"],group:"Release",summary:"Generate an agent-assisted release plan (changes list + next patch version).",description:"Generates a structured changes list since the last semver tag and writes a plan directory under .agentplane/.release/. This plan is intended for a DOCS agent to author release notes. By default, only patch bumps are allowed without explicit approval.",options:[{kind:"boolean",name:"patch",default:false,description:"Bump patch version (default)."},{kind:"boolean",name:"minor",default:false,description:"Bump minor version (requires --yes)."},{kind:"boolean",name:"major",default:false,description:"Bump major version (requires --yes)."},{kind:"string",name:"since",valueHint:"<tag>",description:"Override the starting tag/ref (defaults to the latest vX.Y.Z tag)."},{kind:"boolean",name:"yes",default:false,description:"Approve minor/major version bumps (required for --minor/--major)."}],validateRaw:e=>{if([e.opts.patch===true,e.opts.minor===true,e.opts.major===true].filter(Boolean).length>1)throw y({spec:Ma,command:"release plan",message:"Options --patch/--minor/--major are mutually exclusive."})},parse:e=>({bump:e.opts.major===true?"major":e.opts.minor===true?"minor":"patch",since:e.opts.since,yes:e.opts.yes===true}),validate:e=>{if((e.bump==="minor"||e.bump==="major")&&e.yes!==true)throw y({spec:Ma,command:"release plan",message:`Bump '${e.bump}' requires explicit approval. Re-run with --yes.`})},examples:[{cmd:"agentplane release plan",why:"Generate a plan for the next patch release and hand it to a DOCS agent to write release notes."},{cmd:"agentplane release plan --minor --yes",why:"Generate a plan for the next minor release (explicit approval required)."}]};});var dO={};S(dO,{releaseSpec:()=>Gu,runRelease:()=>p8});var Gu,p8,Qw=u(()=>{Oe();Gu={id:["release"],group:"Release",summary:"Prepare a release (agent-assisted notes + version bump workflow).",synopsis:["agentplane release <command> [args] [options]"],args:[{name:"cmd",required:false,variadic:true,valueHint:"<command>"}],parse:e=>ke(e)},p8=async(e,t)=>{oe({spec:Gu,cmd:t.cmd,subcommands:await ne(["release"])});};});async function Je(e,t){try{return await t()}catch(r){if(r instanceof m)throw r;let n=e.context??{};throw O(r,{command:e.command,root:e.rootOverride??null,...n})}}var bo=u(()=>{D();v();});var Ba={};S(Ba,{configSetSpec:()=>rb,configShowSpec:()=>eb,makeRunConfigSetHandler:()=>_8,makeRunConfigShowHandler:()=>y8,makeRunModeGetHandler:()=>x8,makeRunModeSetHandler:()=>C8,makeRunProfileSetHandler:()=>S8,modeGetSpec:()=>nb,modeSetSpec:()=>Vu,profileSetSpec:()=>Uu});async function k8(e){return Je({command:"config show",rootOverride:e.rootOverride},async()=>{let t=await e.deps.getLoadedConfig("config show");return Jc.json(t.raw),0})}function y8(e){return t=>k8({cwd:t.cwd,rootOverride:t.rootOverride,deps:e})}function w8(e){let t=e.trim();return t==="workflow_mode"||t.startsWith("agents.approvals.")}async function tb(e){try{if(!(await Rt.readdir(Ye.join(e.agentplaneDir,"agents"),{withFileTypes:!0})).some(n=>n.isFile()&&n.name.endsWith(".json")))return !1}catch{return false}let t=await loadConfig(e.agentplaneDir);return await ka({gitRoot:e.gitRoot,workflowMode:t.config.workflow_mode,approvals:{requirePlanApproval:t.config.agents?.approvals?.require_plan??true,requireVerifyApproval:t.config.agents?.approvals?.require_verify??true,requireNetworkApproval:t.config.agents?.approvals?.require_network??true}}),true}async function b8(e){return Je({command:"config set",rootOverride:e.rootOverride,context:{key:e.key}},async()=>{let t=await e.deps.getResolvedProject("config set"),r=await e.deps.getLoadedConfig("config set");await ce({action:"config_write",config:r.config,yes:!1,reason:`config set ${e.key}`});let n={...r.raw};return setByDottedKey(n,e.key,e.value),await saveConfig(t.agentplaneDir,n),w8(e.key)&&await tb({gitRoot:t.gitRoot,agentplaneDir:t.agentplaneDir}),Jc.line(Ye.relative(t.gitRoot,Ye.join(t.agentplaneDir,"config.json"))),0})}function _8(e){return (t,r)=>b8({cwd:t.cwd,rootOverride:t.rootOverride,key:r.key,value:r.value,deps:e})}async function v8(e){return Je({command:"mode get",rootOverride:e.rootOverride},async()=>{let t=await e.deps.getLoadedConfig("mode get");return Jc.line(t.config.workflow_mode),0})}function x8(e){return t=>v8({cwd:t.cwd,rootOverride:t.rootOverride,deps:e})}async function R8(e){return Je({command:"mode set",rootOverride:e.rootOverride,context:{mode:e.mode}},async()=>{let t=await e.deps.getResolvedProject("mode set"),r=await e.deps.getLoadedConfig("mode set");await ce({action:"config_write",config:r.config,yes:!1,reason:`mode set ${e.mode}`});let n={...r.raw};return setByDottedKey(n,"workflow_mode",e.mode),await saveConfig(t.agentplaneDir,n),await tb({gitRoot:t.gitRoot,agentplaneDir:t.agentplaneDir}),Jc.line(e.mode),0})}function C8(e){return (t,r)=>R8({cwd:t.cwd,rootOverride:t.rootOverride,mode:r.mode,deps:e})}function lO(e){let t=e.trim().toLowerCase();return t==="light"||t==="vibecoder"?"light":t==="normal"||t==="manager"?"normal":t==="full-harness"||t==="developer"||t==="enterprise"?"full-harness":null}async function T8(e){return Je({command:"profile set",rootOverride:e.rootOverride,context:{profile:e.profile}},async()=>{let t=await e.deps.getResolvedProject("profile set"),n={...(await e.deps.getLoadedConfig("profile set")).raw},o=P8[e.profile],i=buildExecutionProfile(o.executionProfile,{strictUnsafeConfirm:o.strictUnsafeConfirm});return setByDottedKey(n,"agents.approvals.require_plan",String(o.requirePlan)),setByDottedKey(n,"agents.approvals.require_network",String(o.requireNetwork)),setByDottedKey(n,"agents.approvals.require_verify",String(o.requireVerify)),setByDottedKey(n,"execution",JSON.stringify(i)),await saveConfig(t.agentplaneDir,n),await tb({gitRoot:t.gitRoot,agentplaneDir:t.agentplaneDir}),Jc.line(e.profile),0})}function S8(e){return (t,r)=>T8({cwd:t.cwd,rootOverride:t.rootOverride,profile:lO(r.profile),deps:e})}var Jc,eb,rb,nb,Vu,P8,Uu,gi=u(()=>{I();H();vc();Be();bo();Jc=A(),eb={id:["config","show"],group:"Config",summary:"Print resolved config JSON.",examples:[{cmd:"agentplane config show",why:"Show the active config."}],parse:()=>({})};rb={id:["config","set"],group:"Config",summary:"Update project config (dotted keys).",args:[{name:"key",required:true,valueHint:"<key>"},{name:"value",required:true,valueHint:"<value>"}],examples:[{cmd:"agentplane config set workflow_mode direct",why:"Set workflow mode."},{cmd:`agentplane config set tasks.verify.required_tags '["code","backend"]'`,why:"Set a JSON list value (pass JSON as a string)."}],parse:e=>({key:String(e.args.key??""),value:String(e.args.value??"")})};nb={id:["mode","get"],group:"Config",summary:"Print workflow mode.",examples:[{cmd:"agentplane mode get",why:"Print workflow_mode (direct|branch_pr)."}],parse:()=>({})};Vu={id:["mode","set"],group:"Config",summary:"Set workflow mode.",args:[{name:"mode",required:true,valueHint:"<direct|branch_pr>"}],examples:[{cmd:"agentplane mode set branch_pr",why:"Switch to branch_pr mode."}],parse:e=>({mode:String(e.args.mode??"")}),validate:e=>{if(e.mode!=="direct"&&e.mode!=="branch_pr")throw y({spec:Vu,command:"mode set",message:`Invalid value for mode: ${e.mode} (expected: direct|branch_pr)`})}};P8={light:{requirePlan:false,requireNetwork:false,requireVerify:false,executionProfile:"aggressive",strictUnsafeConfirm:false},normal:{requirePlan:true,requireNetwork:true,requireVerify:true,executionProfile:"balanced",strictUnsafeConfirm:false},"full-harness":{requirePlan:true,requireNetwork:true,requireVerify:true,executionProfile:"conservative",strictUnsafeConfirm:true}};Uu={id:["profile","set"],group:"Config",summary:"Apply setup profile presets to config.",args:[{name:"profile",required:true,valueHint:"<light|normal|full-harness>"}],examples:[{cmd:"agentplane profile set light",why:"Apply flexible defaults."},{cmd:"agentplane profile set normal",why:"Apply balanced defaults."},{cmd:"agentplane profile set full-harness",why:"Apply strict defaults."}],parse:e=>({profile:String(e.args.profile??"")}),validate:e=>{if(!lO(e.profile))throw y({spec:Uu,command:"profile set",message:`Invalid value for profile: ${e.profile} (expected: light|normal|full-harness)`})}};});function E8(e){return e==null?"":typeof e=="string"?e.trim():typeof e=="number"||typeof e=="boolean"||typeof e=="bigint"?String(e).trim():""}function Q(e){return Array.isArray(e)?e.map(t=>E8(t)).filter(Boolean):[]}var nr=u(()=>{H();});function ob(e,t){let r;try{r=JSON.parse(t);}catch{throw new m({exitCode:3,code:"E_VALIDATION",message:`Invalid agent profile JSON: ${e} (malformed JSON)`})}if(!r||typeof r!="object"||Array.isArray(r))throw new m({exitCode:3,code:"E_VALIDATION",message:`Invalid agent profile JSON: ${e} (expected object)`});return r}function ib(e){return e.trim().toUpperCase()}async function ab(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=Ye.join(t.agentplaneDir,"agents");if(!await P(r))return null;let i=(await readdir(r)).filter(a=>a.endsWith(".json")).toSorted().map(a=>a.replace(/\.json$/i,""));return {agentplaneDir:t.agentplaneDir,ids:i}}catch{return null}}async function uO(e){let t=await ab({cwd:e.cwd,rootOverride:e.rootOverride});if(!t)return null;let n=[ib(e.roleId),e.roleId.trim()].filter(Boolean),o=new Map;for(let d of t.ids)o.set(d.toLowerCase(),d);let i=null;for(let d of n){let l=t.ids.find(g=>g===d);if(l){i=l;break}let p=o.get(d.toLowerCase());if(p){i=p;break}}if(!i)return null;let a=`${i}.json`,s=Ye.join(t.agentplaneDir,"agents",a),c=ob(s,await readFile(s,"utf8"));return {agentplaneDir:t.agentplaneDir,filename:a,profile:c}}function pO(e){let t=(typeof e.profile.id=="string"?e.profile.id:"").trim()||e.roleId,r=(typeof e.profile.role=="string"?e.profile.role:"").trim(),n=(typeof e.profile.description=="string"?e.profile.description:"").trim(),o=Q(e.profile.inputs),i=Q(e.profile.outputs),a=Q(e.profile.permissions),s=Q(e.profile.workflow);return {filename:e.filename,id:t,role:r,description:n,inputs:o,outputs:i,permissions:a,workflow:s}}var sb=u(()=>{ee();nr();v();});var gO={};S(gO,{agentsSpec:()=>cb,makeRunAgentsHandler:()=>M8});function $8(e,t){let r=Math.max(...e.map(o=>o.canonicalId.length),2),n=Math.max(...e.map(o=>o.filename.length),4);if(t){let o=Math.max(...e.map(i=>i.rawId.length),6);return [`${"ID".padEnd(r)} ${"FILE".padEnd(n)} ${"RAW_ID".padEnd(o)} ROLE`,`${"-".repeat(r)} ${"-".repeat(n)} ${"-".repeat(o)} ----`,...e.map(i=>`${i.canonicalId.padEnd(r)} ${i.filename.padEnd(n)} ${i.rawId.padEnd(o)} ${i.role}`)]}return [`${"ID".padEnd(r)} ${"FILE".padEnd(n)} ROLE`,`${"-".repeat(r)} ${"-".repeat(n)} ----`,...e.map(o=>`${o.canonicalId.padEnd(r)} ${o.filename.padEnd(n)} ${o.role}`)]}function M8(e){return async t=>Je({command:"agents",rootOverride:t.rootOverride},async()=>{let r=await e.getResolvedProject("agents"),n=Ye.join(r.agentplaneDir,"agents");if(!await P(n))throw new m({exitCode:2,code:"E_USAGE",message:`Agents directory not found: ${n} (run \`agentplane init\`)`});let i=(await readdir(n)).filter(l=>l.endsWith(".json")).toSorted();if(i.length===0)throw new m({exitCode:2,code:"E_USAGE",message:`No agent definitions found under ${n} (expected *.json)`});let a=[],s=new Set,c=[],d=[];for(let l of i){let p=l.replace(/\.json$/i,""),g=Ye.join(n,l),h=ob(g,await readFile(g,"utf8")),f=typeof h.id=="string"?h.id:"",b=typeof h.role=="string"?h.role:"",w=f.trim(),_=b.trim()||"-";s.has(p)?c.push(p):s.add(p),w.length>0&&w!==p&&d.push({filename:l,canonicalId:p,rawId:w}),a.push({canonicalId:p,role:_,filename:l,rawId:w});}if(j8.lines($8(a,d.length>0)),c.length>0)throw new m({exitCode:2,code:"E_USAGE",message:`Duplicate canonical agent ids: ${ae(c).toSorted().join(", ")}`});if(d.length>0){let l=d.map(p=>`${p.filename}: raw id "${p.rawId}" != canonical "${p.canonicalId}"`).join("; ");throw new m({exitCode:2,code:"E_USAGE",message:`Agent profile id mismatch: ${l}`})}return 0})}var j8,cb,db=u(()=>{Dr();v();I();ee();sb();bo();j8=A(),cb={id:["agents"],group:"Core",summary:"List agent definitions under .agentplane/agents.",examples:[{cmd:"agentplane agents",why:"Print available agent ids and roles."}],parse:()=>({})};});function Ju(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function zu(e){return new m({exitCode:3,code:"E_VALIDATION",message:e})}async function V8(e){try{return await readFile(e,"utf8")}catch(t){if(t?.code==="ENOENT")return null;throw t}}function U8(){return {name:kO,interface:{displayName:yO},plugins:[]}}function W8(e){if(e===null)return U8();let t;try{t=JSON.parse(e);}catch(r){throw zu(`Invalid Codex marketplace JSON: ${r instanceof Error?r.message:"unknown parse error"}`)}if(!Ju(t))throw zu("Invalid Codex marketplace JSON: expected a top-level object.");if("plugins"in t&&!Array.isArray(t.plugins))throw zu("Invalid Codex marketplace JSON: `plugins` must be an array.");if("interface"in t&&t.interface!==void 0&&!Ju(t.interface))throw zu("Invalid Codex marketplace JSON: `interface` must be an object when present.");return t}function z8(){return {name:Yc,source:{source:"local",path:`./plugins/${Yc}`},policy:{installation:"AVAILABLE",authentication:"ON_INSTALL"},category:"Productivity"}}function K8(e){let t=W8(e),r=Ju(t.interface)?{...t.interface}:{};(typeof t.name!="string"||t.name.trim().length===0)&&(t.name=kO),(typeof r.displayName!="string"||r.displayName.trim().length===0)&&(r.displayName=yO);let n=Array.isArray(t.plugins)?t.plugins:[],o=z8(),i=n.findIndex(a=>Ju(a)&&a.name===Yc);return i===-1?n.push(o):n.splice(i,1,o),{...t,interface:r,plugins:n}}function J8(e=gt()){return {name:Yc,version:e,description:"Bundle AgentPlane workflow guidance for the Codex plugins UI.",homepage:"https://github.com/basilisk-labs/agentplane",repository:"https://github.com/basilisk-labs/agentplane",license:"MIT",keywords:["agentplane","codex","workflow","tasks","git"],skills:"./skills/",interface:{displayName:"AgentPlane",shortDescription:"Governed git-native workflow guidance for Codex",longDescription:"Install AgentPlane into Codex through a local marketplace and give Codex explicit task, planning, verification, and branch_pr workflow guidance.",developerName:"basilisk-labs",category:"Productivity",capabilities:["Read","Write"],websiteURL:"https://github.com/basilisk-labs/agentplane",defaultPrompt:["Use AgentPlane to initialize a governed workflow in this repository.","Use AgentPlane to create a task, approve the plan, and start work in branch_pr mode.","Use AgentPlane to verify the active task and record evidence before finish."],brandColor:"#111827",composerIcon:"./assets/icon.svg",logo:"./assets/logo.svg",screenshots:["./assets/header.png"]}}}function lb(e){if(e.scope==="repo"){let n=e.repoRoot?.trim();if(!n)throw new m({exitCode:2,code:"E_USAGE",message:"Repo scope requires a resolved repository root."});return Ye.resolve(n)}let r=(e.env??process.env)[G8]?.trim();return r?Ye.resolve(r):Q$.homedir()}function Y8(e){return Ye.join(e,"plugins",Yc)}function Q8(e){return Ye.join(e,".agents","plugins","marketplace.json")}async function wO(e){let t=Ye.resolve(e.installRoot),r=Y8(t),n=Ye.join(r,".codex-plugin","plugin.json"),o=Q8(t);await mkdir(Ye.dirname(n),{recursive:true}),await mkdir(Ye.dirname(o),{recursive:true}),await ge(n,J8(e.version??gt()));let i=[];for(let s of q8){let c=Ye.join(r,s.relativePath);await mkdir(Ye.dirname(c),{recursive:true});let d=await readFile(s.source,"utf8");await X(c,d),i.push(c);}for(let s of H8){let c=Ye.join(r,s.relativePath);await mkdir(Ye.dirname(c),{recursive:true}),await copyFile(fileURLToPath(s.source),c),i.push(c);}let a=K8(await V8(o));return await ge(o,a),{scope:e.scope,installRoot:t,pluginRoot:r,manifestPath:n,marketplacePath:o,copiedAssets:i}}var Yc,kO,yO,Ku,q8,H8,G8,bO=u(()=>{v();oo();_e();ln();Yc="agentplane",kO="agentplane-local-marketplace",yO="AgentPlane Local Plugins",Ku=xm("codex-plugin"),q8=[{source:new URL("skills/agentplane/SKILL.md",Ku),relativePath:"skills/agentplane/SKILL.md"}],H8=[{source:new URL("assets/icon.svg",Ku),relativePath:"assets/icon.svg"},{source:new URL("assets/logo.svg",Ku),relativePath:"assets/logo.svg"},{source:new URL("assets/header.png",Ku),relativePath:"assets/header.png"}],G8="AGENTPLANE_CODEX_HOME";});var ub={};S(ub,{codexPluginInstallSpec:()=>mb,codexPluginSpec:()=>Qu,codexSpec:()=>Yu,makeRunCodexPluginInstallHandler:()=>e6,runCodex:()=>X8,runCodexPlugin:()=>Z8});function e6(e){return async(t,r)=>Je({command:"codex plugin install",rootOverride:t.rootOverride},async()=>{let n=r.scope==="repo"?await e.getResolvedProject("codex plugin install"):null,o=r.scope==="repo"?lb({scope:"repo",repoRoot:n?.gitRoot}):lb({scope:"user"}),i=await wO({scope:r.scope,installRoot:o});return _O.report([{label:"Scope",value:i.scope},{label:"Install root",value:i.installRoot},{label:"Plugin root",value:i.pluginRoot},{label:"Manifest",value:i.manifestPath},{label:"Marketplace",value:i.marketplacePath}],{header:"Installed Codex plugin"}),_O.line(r.scope==="repo"?"Next: open Codex in this repository and install AgentPlane from the repo marketplace.":"Next: open Codex, open Plugins, and install AgentPlane from the local marketplace."),0})}var _O,Yu,Qu,mb,X8,Z8,Xu=u(()=>{Oe();I();bO();bo();_O=A(),Yu={id:["codex"],group:"Codex",summary:"Codex integration commands.",synopsis:["agentplane codex <subcommand> [options]"],args:[{name:"subcommand",required:false,variadic:true,valueHint:"<subcommand>"}],parse:e=>ke(e,"subcommand")},Qu={id:["codex","plugin"],group:"Codex",summary:"Install and inspect bundled Codex plugin integrations.",synopsis:["agentplane codex plugin <subcommand> [options]"],args:[{name:"subcommand",required:false,variadic:true,valueHint:"<subcommand>"}],parse:e=>ke(e,"subcommand")},mb={id:["codex","plugin","install"],group:"Codex",summary:"Install the bundled AgentPlane plugin into a local Codex marketplace.",options:[{kind:"string",name:"scope",valueHint:"<user|repo>",choices:["user","repo"],default:"user",description:"Install to the user home marketplace or the current repository marketplace."}],examples:[{cmd:"agentplane codex plugin install",why:"Install AgentPlane into the user-local Codex marketplace under ~/.agents/plugins."},{cmd:"agentplane codex plugin install --scope repo",why:"Install AgentPlane into the current repository marketplace for local testing."}],notes:["User scope writes `~/plugins/agentplane` plus `~/.agents/plugins/marketplace.json` by default.","Repo scope writes `<repo>/plugins/agentplane` plus `<repo>/.agents/plugins/marketplace.json`.","OpenAI's public self-serve Plugin Directory is not available yet; local marketplaces are the supported route today."],parse:e=>({scope:e.opts.scope??"user"})},X8=async(e,t)=>{oe({spec:Yu,cmd:t.cmd,subcommands:await ne(["codex"]),command:"codex",missingMessage:"Missing Codex subcommand.",unknownMessage:r=>`Unknown Codex subcommand: ${r}.`});},Z8=async(e,t)=>{oe({spec:Qu,cmd:t.cmd,subcommands:await ne(["codex","plugin"]),command:"codex plugin",missingMessage:"Missing Codex plugin subcommand.",unknownMessage:r=>`Unknown Codex plugin subcommand: ${r}.`});};});function vO(e){return e.join(" ")}function r6(e){return t6.get(vO(e))??null}function He(e){let t=r6(e);if(!t)throw new Error(`Missing canonical invocation for command: ${vO(e)}`);return t}var t6,Qc=u(()=>{t6=new Map([["config show","agentplane config show"],["finish",'agentplane finish <task-id> --author <ROLE> --body "Verified: ..." --commit <git-rev>'],["incidents advise","agentplane incidents advise <task-id>"],["incidents collect","agentplane incidents collect <task-id>"],["init","agentplane init"],["preflight","agentplane preflight"],["quickstart","agentplane quickstart"],["role","agentplane role <ROLE>"],["task list","agentplane task list"],["task new",'agentplane task new --title "..." --description "..." --priority med --owner <ROLE> --tag <tag>'],["task plan approve","agentplane task plan approve <task-id> --by ORCHESTRATOR"],["task plan set",'agentplane task plan set <task-id> --text "..." --updated-by <ROLE>'],["task show","agentplane task show <task-id>"],["task start-ready",'agentplane task start-ready <task-id> --author <ROLE> --body "Start: ..."'],["task verify-show","agentplane task verify-show <task-id>"],["verify",'agentplane verify <task-id> --ok|--rework --by <ROLE> --note "..." [--observation "..." --impact "..." --resolution "..."] [--local-only]']]);});var Pt,re,Xc=u(()=>{Qc();Pt=e=>He(e),re={core:{configShow:Pt(["config","show"]),incidentsAdvise:Pt(["incidents","advise"]),incidentsCollect:Pt(["incidents","collect"]),taskList:Pt(["task","list"]),taskShow:Pt(["task","show"]),taskNew:Pt(["task","new"]),taskPlanSet:Pt(["task","plan","set"]),taskPlanApprove:Pt(["task","plan","approve"]),taskVerifyShow:Pt(["task","verify-show"]),startTask:Pt(["task","start-ready"]),verifyTask:Pt(["verify"]),finishTask:Pt(["finish"]),quickstart:Pt(["quickstart"]),role:Pt(["role"])},sync:{pullConfigured:"agentplane sync --direction pull",pushConfiguredWithYes:"agentplane sync --direction push --yes",pullRedmineExplicit:"agentplane sync redmine --direction pull",pushRedmineExplicitWithYes:"agentplane sync redmine --direction push --yes"},backendSync:{pullLocal:"agentplane backend sync local --direction pull",pullRedmine:"agentplane backend sync redmine --direction pull",pushRedmineWithYes:"agentplane backend sync redmine --direction push --yes"}};});var xO,Zc,RO=u(()=>{Xc();xO=[re.core.configShow,re.core.quickstart,re.core.taskList,"git status --short --untracked-files=no","git rev-parse --abbrev-ref HEAD"],Zc=[re.core.taskNew,re.core.taskPlanSet,re.core.taskPlanApprove],[...Zc,re.core.startTask,re.core.taskVerifyShow,re.core.verifyTask,'agentplane finish <task-id> --author <ROLE> --body "Verified: ..." --result "..." --commit <git-rev>'],[re.core.taskVerifyShow,re.core.verifyTask,re.core.incidentsAdvise,`${re.core.incidentsCollect} --check`,"agentplane doctor","node .agentplane/policy/check-routing.mjs"];});function n6(e){return ["```bash",...e,"```"]}function PO(){return CO.map(e=>e.role)}function pb(e){let t=e.trim();if(!t)return null;let r=t.toUpperCase(),n=CO.find(o=>o.role.toUpperCase()===r);return n?n.lines:null}function Zu(e,t){return t&&t.length>0?["",`${e}:`,...t.map(r=>`- ${r}`)]:[]}function ed(e,t={}){let r=e.trim();if(!r)return null;let n=r.toUpperCase(),o=pb(n),i=t.profile??null;if(!o&&!i)return null;let a=typeof i?.id=="string"&&i.id.trim()||n,s=typeof i?.role=="string"?i.role.trim():"",c=typeof i?.description=="string"?i.description.trim():"";return [`### ${a}`,...s?[`Role: ${s}`]:[],...c?[`Description: ${c}`]:[],...Zu("Inputs",i?.inputs),...Zu("Outputs",i?.outputs),...Zu("Permissions",i?.permissions),...Zu("Workflow",i?.workflow),...o?["","CLI/runtime notes:",...o]:[],...i?.filename?["",`Source: .agentplane/agents/${i.filename} (role-specific content); policy gateway files still have higher priority.`]:[]].join(`
196
+ `).trimEnd()}function ep(){return ["# agentplane quickstart","","The policy gateway file (AGENTS.md or CLAUDE.md) is the source of truth for workflow/process policy.","Keep this first screen short: use it for startup only, then go deeper with `agentplane role <ROLE>` or `agentplane help <command>`.","Do not edit `.agentplane/tasks.json` by hand.","If the repository is not initialized yet, stop and run `agentplane init` first.","",`Canonical installed startup surface: \`${re.core.quickstart}\`.`,"","## First screen","","Run preflight:","",...n6(xO),"","Configured workflow route:","","- `branch_pr`: start from `agentplane help work start`, keep local PR artifacts current with `agentplane pr ...`, wait for hosted required checks with `bun run workflow:wait-remote-checks`, then integrate on base.",`- \`direct\`: task setup is \`${Zc[0]}\` -> \`${Zc[1]}\` -> \`${Zc[2]}\`.`,`- \`direct\`: execution is \`${re.core.startTask}\` -> \`${re.core.taskVerifyShow}\` -> \`${re.core.verifyTask}\` -> \`${re.core.finishTask}\` with \`--result "..." \`.`,"- In `direct`, `finish` creates the deterministic close commit by default; do not assume that route is the repository default when `workflow_mode=branch_pr`.","","## Go deeper","",`- \`${re.core.role}\` to activate ORCHESTRATOR for planning and the task owner role before owner-scoped execution.`,"- `agentplane help <command>` for flags, examples, and exceptional/manual flows.","- Keep installed runtime guidance self-contained; do not depend on repo-only docs files.","- If you need the docs site, treat it as a public reference surface rather than a required local file.","","## Non-default","","- `branch_pr`: use `agentplane help work start`, `agentplane help pr`, `bun run workflow:wait-remote-checks`, and `agentplane help integrate` when the repository is configured that way.","- Recovery/mixed state: use `agentplane doctor`, `agentplane upgrade`, and `agentplane runtime explain`.","- Manual close or allowlist details belong in command-specific help, not on this first screen."].join(`
197
+ `)}var Hr,CO,td=u(()=>{Xc();RO();Hr=`- Shared startup path: \`${re.core.quickstart}\` is the canonical installed bootstrap; use \`${re.core.role}\` to activate the current role before role-scoped planning or execution.`;CO=[{role:"ORCHESTRATOR",lines:[Hr,"- Owns preflight, plan summaries, approvals, and scope checkpoints.","- Hand off implementation, verification, and other owner-scoped execution to the task owner role as soon as the owner is known.","- Does not create non-executable tasks or bypass lifecycle guardrails."]},{role:"PLANNER",lines:[Hr,'- Create executable tasks with `agentplane task new --title "..." --description "..." --priority med --owner <ROLE> --tag <tag>`.','- Fill docs with `agentplane task doc set <task-id> --section <name> --text "..."` and set plan text with `agentplane task plan set <task-id> --text "..." --updated-by <ROLE>`.','- Append reusable incident-ready Findings via `agentplane task findings add <task-id> --observation "..." --impact "..." --resolution "..."`; promotion is the default unless `--local-only` is set.',"- Approve plan only after required sections and Verify Steps are ready."]},{role:"CODER",lines:[Hr,"- direct: stay in the current checkout; branch_pr: start a task branch/worktree first, keep local PR artifacts current, and wait for hosted required checks before handing off to INTEGRATOR.",`- Start deterministically with \`${re.core.startTask}\` after plan approval.`,`- Treat \`${re.core.taskVerifyShow}\` as the verification contract, then record \`${re.core.verifyTask}\`.`,`- Preferred direct close path: \`${re.core.finishTask}\` with \`--result "..." \`; add \`--no-close-commit\` only for explicit manual close handling.`,"- For manual close or allowlist detail, use `agentplane help finish` and `agentplane help commit` on demand."]},{role:"TESTER",lines:[Hr,"- Start only after plan approval and explicit Verify Steps exist.",`- Use \`${re.core.taskVerifyShow}\` before running checks, then record \`${re.core.verifyTask}\`.`,`- In direct mode, close with \`${re.core.finishTask}\` plus \`--result "..." \` when you own final verification.`,"- For mixed-state recovery or runtime ambiguity, use `agentplane doctor` and `agentplane runtime explain` instead of relying on the short quickstart screen."]},{role:"DOCS",lines:[Hr,'- Keep task docs and user docs aligned with runtime behavior via `agentplane task doc set <task-id> --section <name> --text "..."`; use `task findings add` for append-only incident-ready Findings blocks.',"- For implementation tasks, verify generated/help surfaces after changing CLI-facing text.","- The docs site may expand CLI behavior, but installed runtime guidance must stay self-contained and must not depend on repo-only docs paths."]},{role:"REVIEWER",lines:[Hr,"- Review artifacts with `agentplane task show <task-id>` and `agentplane pr check <task-id>` when relevant.","- Focus on regressions, lifecycle drift, and missing verification evidence."]},{role:"INTEGRATOR",lines:[Hr,'- branch_pr: require a green hosted PR gate first (`bun run workflow:wait-remote-checks` on the task branch or PR), then run `agentplane pr check <task-id>` -> `agentplane integrate <task-id> --branch task/<task-id>/<slug> --merge-strategy squash --run-verify` -> `agentplane finish <task-id> --commit <git-rev> --author INTEGRATOR --body "Verified: ..." --result "..." --close-commit` on the base branch.',"- branch_pr hosted shortcut: if GitHub merges the task PR directly, `Task Hosted Close` pushes the deterministic closure branch automatically and opens the follow-up closure PR when organization policy allows Actions PR creation; otherwise it leaves a manual PR link on the merged task PR. Pull the updated base branch after that closure PR merges instead of creating a local finish-only tail commit.",`- direct: the task owner normally closes with \`${re.core.finishTask}\` plus \`--result "..." \`.`,"- For branch-level flags and branch/base diagnostics, use `agentplane help work start`, `agentplane help integrate`, and `agentplane help branch base`."]},{role:"CREATOR",lines:[Hr,`- Use \`${re.core.startTask}\` only when the new-agent creation task is approved and ready.`,"- Keep commits scoped to the created agent artifacts and task docs."]},{role:"REDMINE",lines:[Hr,`- Sync explicitly with \`${re.sync.pullRedmineExplicit}\` / \`${re.sync.pushRedmineExplicitWithYes}\`.`,"- After sync, follow the same task/bootstrap lifecycle as local backends."]},{role:"UPDATER",lines:[Hr,"- Read-only role: inspect state, do not mutate task or workflow artifacts."]}];});var IO={};S(IO,{preflightSpec:()=>fb,runPreflight:()=>u6});function La(e){return e instanceof Error?((e.message??"").split(`
198
+ `,1)[0]??"").trim()||e.name:String(e)}function tp(e){return e.ok?"yes":"no"}function SO(e){return e.ok&&e.value!==void 0?String(e.value):"unknown"}function s6(e){return e&&(e.workflow_mode==="direct"||e.workflow_mode==="branch_pr")?e.workflow_mode:"unknown"}function c6(e){if(!e?.agents?.approvals)return {require_plan:"unknown",require_verify:"unknown",require_network:"unknown"};let t=e.agents.approvals;return {require_plan:t.require_plan,require_verify:t.require_verify,require_network:t.require_network}}function EO(e){return e.replaceAll("\\","/")}function d6(e){let r=`${EO(e.workflowDir).replace(/\/+$/,"")}/`,n=e.changedPaths.map(i=>EO(i)).filter(i=>i.startsWith(r)).toSorted((i,a)=>i.localeCompare(a)),o=new Set;for(let i of n){let a=i.slice(r.length),[s]=a.split("/",1);s&&s!=="."&&s!==".."&&o.add(s);}return {present:n.length>0,task_ids:[...o].toSorted((i,a)=>i.localeCompare(a)),paths:n}}async function l6(e){let t=[],r=[],n=ep(),o={ok:n.trim().length>0,error:n.trim().length>0?void 0:"quickstart renderer returned empty output"},i=null;try{i=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null});}catch(h){t.push({command:"agentplane init",reason:`project not resolved (${La(h)})`});}let a=null,s={ok:false,error:"project not resolved"};if(i)try{a=(await loadConfig(i.agentplaneDir)).config,s={ok:!0};}catch(h){let f=La(h);s={ok:false,error:f},t.push({command:"agentplane config show",reason:`config failed validation (${f})`}),r.push("config_unavailable");}let c={ok:false,error:e.mode==="quick"?"skipped in quick mode":"project not resolved"};if(e.mode==="full"&&i)try{c={ok:!0,count:(await(await ic({cwd:e.cwd,rootOverride:e.rootOverride??null})).backend.listTasks()).length};}catch(h){let f=La(h);c={ok:false,error:f},t.push({command:"agentplane task list",reason:`task backend unavailable (${f})`}),r.push("task_backend_unavailable");}let d={ok:false,error:"project not resolved"};if(i)if(wc())d={ok:true,error:`workflow checks disabled via ${Dm()}`};else try{let h=await Gm(i.gitRoot);d=h.ok?{ok:!0}:{ok:!1,error:h.diagnostics.filter(f=>f.severity==="ERROR").map(f=>`${f.code}:${f.path}`).join(", ")},h.ok||(r.push("workflow_contract_invalid"),t.push({command:"agentplane workflow build --validate --dry-run",reason:"workflow contract is invalid"}));}catch(h){let f=La(h);d={ok:false,error:f},r.push("workflow_contract_unreadable"),t.push({command:"agentplane workflow build --validate --dry-run",reason:`cannot validate workflow (${f})`});}let l={ok:false,error:"project not resolved"},p={present:false,task_ids:[],paths:[]},g={ok:false,error:"project not resolved"};if(i){try{let h=new GitContext({gitRoot:i.gitRoot}),[f,b,w]=await Promise.all([h.statusChangedPaths(),h.statusStagedPaths(),h.statusUnstagedTrackedPaths()]);p=d6({changedPaths:f,workflowDir:a?.paths.workflow_dir??".agentplane/tasks"}),l={ok:!0,value:b.length===0&&w.length===0},l.value||(r.push("working_tree_dirty"),t.push({command:"git status --short --untracked-files=no",reason:"tracked changes detected"})),p.present&&(r.push("task_artifact_drift"),t.push({command:`git status --short --untracked-files=all -- ${a?.paths.workflow_dir??".agentplane/tasks"}`,reason:`task artifact drift detected for ${p.task_ids.join(", ")}`}));}catch(h){let f=La(h);l={ok:false,error:f},r.push("working_tree_unreadable"),t.push({command:"git status --short --untracked-files=no",reason:`cannot inspect git status (${f})`});}try{g={ok:!0,value:await gitCurrentBranch(i.gitRoot)};}catch(h){g={ok:false,error:La(h)};}}return {mode:e.mode,project_detected:i!==null,config_loaded:s,quickstart_loaded:o,workflow_loaded:d,task_list_loaded:c,working_tree_clean_tracked:l,task_artifact_drift:p,current_branch:g,workflow_mode:s6(a),approvals:c6(a),harness_health:{status:r.length===0?"ok":"warn",reasons:ae(r)},outside_repo_needed:false,next_actions:t}}async function m6(e){return Je({command:"preflight",rootOverride:e.rootOverride},async()=>{let t=await l6({cwd:e.cwd,rootOverride:e.rootOverride,mode:e.mode});if(e.json)return TO.json(t),0;let r=["Preflight Summary",`- mode: ${t.mode}`,`- project detected: ${t.project_detected?"yes":"no"}`,`- config loaded: ${tp(t.config_loaded)}`,`- quickstart loaded: ${tp(t.quickstart_loaded)}`,`- workflow loaded: ${tp(t.workflow_loaded)}`,`- task list loaded: ${tp(t.task_list_loaded)}`,`- working tree clean (tracked-only): ${SO(t.working_tree_clean_tracked)}`,`- task artifact drift: ${t.task_artifact_drift.present?t.task_artifact_drift.task_ids.join(", "):"none"}`,`- current git branch: ${SO(t.current_branch)}`,`- workflow_mode: ${t.workflow_mode}`,`- harness engeneering health: ${t.harness_health.status}`];if(t.harness_health.reasons.length>0&&r.push(` - reasons: ${t.harness_health.reasons.join(", ")}`),r.push("- approval gates:",` - require_plan: ${String(t.approvals.require_plan)}`,` - require_verify: ${String(t.approvals.require_verify)}`,` - require_network: ${String(t.approvals.require_network)}`,"- outside-repo: not needed"),t.next_actions.length>0){r.push("Next actions:");for(let n of t.next_actions)r.push(`- ${n.command}: ${n.reason}`);}return TO.lines(r),0})}var TO,fb,u6,gb=u(()=>{zo();Ee();Dr();Zo();td();I();bo();TO=A();fb={id:["preflight"],group:"Core",summary:"Run aggregated preflight checks and print a deterministic readiness report.",options:[{kind:"string",name:"mode",valueHint:"<quick|full>",choices:["quick","full"],default:"quick",description:"Preflight depth. quick skips backend task-list probe; full includes backend readiness."},{kind:"boolean",name:"full",default:false,description:"Shortcut for --mode full."},{kind:"boolean",name:"json",default:false,description:"Emit machine-readable JSON report."}],examples:[{cmd:"agentplane preflight --json",why:"Produce one-shot agent-readable preflight."},{cmd:"agentplane preflight --json --mode full",why:"Run full preflight including backend task-list probe."}],parse:e=>({json:e.opts.json===true,mode:e.opts.full===true?"full":e.opts.mode??"quick"})};u6=(e,t)=>m6({cwd:e.cwd,rootOverride:e.rootOverride,json:t.json,mode:t.mode});});var OO={};S(OO,{quickstartSpec:()=>hb,runQuickstart:()=>f6});async function p6(e){return Je({command:"quickstart",rootOverride:e.rootOverride},()=>{let t=ep();if(e.json){let r=t.split(`
199
+ `).map(n=>n.trim()).filter(n=>n.length>0);return AO.json({source_of_truth:{workflow_policy:"AGENTS.md|CLAUDE.md",cli_syntax:"quickstart/role output"},lines:r}),0}return AO.line(t),0})}var AO,hb,f6,kb=u(()=>{td();I();bo();AO=A(),hb={id:["quickstart"],group:"Core",summary:"Print the canonical agent bootstrap path and startup guidance.",options:[{kind:"boolean",name:"json",default:false,description:"Emit compact machine-readable output for agent runtimes."}],examples:[{cmd:"agentplane quickstart",why:"Show quickstart."}],parse:e=>({json:e.opts.json===true})};f6=(e,t)=>p6({cwd:e.cwd,rootOverride:e.rootOverride,json:t.json});});var DO={};S(DO,{roleSpec:()=>hi,runRole:()=>h6});async function g6(e){return Je({command:"role",rootOverride:e.rootOverride},async()=>{let t=e.role.trim();if(!t)throw y({spec:hi,command:"role",message:"Missing required argument: role"});let r=ib(t),n=await uO({cwd:e.cwd,rootOverride:e.rootOverride,roleId:r}),o=n?pO({filename:n.filename,roleId:r,profile:n.profile}):null,i=ed(r,{profile:o});if(!i&&!n){let s=PO(),c=await ab({cwd:e.cwd,rootOverride:e.rootOverride}),d=c?c.ids:[],l=ae([...s,...d]).toSorted(),p=l.length>0?`
200
+ Available roles: ${l.join(", ")}`:"";throw y({spec:hi,command:"role",message:`Unknown role: ${t}.${p}`})}if(i){if(e.json){let s={role:r,guide:i.split(`
201
+ `).map(d=>d.trim()).filter(d=>d.length>0)},c=pb(r);return c&&(s.builtin_guide=c),n&&(s.agent_profile={filename:n.filename,profile:n.profile}),rp.json(s),0}return rp.line(i),0}if(!n)throw y({spec:hi,command:"role",message:`Unknown role: ${t}.`});let a=ed(r,{profile:o});if(!a)throw y({spec:hi,command:"role",message:`Unknown role: ${t}.`});return e.json?(rp.json({role:r,guide:a.split(`
202
+ `).map(s=>s.trim()).filter(s=>s.length>0),agent_profile:{filename:n.filename,profile:n.profile}}),0):(rp.line(a),0)})}var rp,hi,h6,yb=u(()=>{td();I();H();Dr();sb();bo();rp=A(),hi={id:["role"],group:"Core",summary:"Show role-specific workflow guidance.",args:[{name:"role",required:true,valueHint:"<role>"}],options:[{kind:"boolean",name:"json",default:false,description:"Emit compact machine-readable role payload."}],examples:[{cmd:"agentplane role ORCHESTRATOR",why:"Show ORCHESTRATOR guide."}],parse:e=>({role:String(e.args.role??""),json:e.opts.json===true})};h6=(e,t)=>g6({cwd:e.cwd,rootOverride:e.rootOverride,role:t.role,json:t.json});});var $O={};S($O,{cmdIdeSync:()=>op,ideSyncSpec:()=>wb,makeRunIdeSyncHandler:()=>y6});async function op(e){return Je({command:"ide sync",rootOverride:e.rootOverride},async()=>{let t=await e.deps.getResolvedProject("ide sync"),r=await to({gitRoot:t.gitRoot,fallbackFlavor:"codex"}),n=r.absPath,o=await readFile(n,"utf8"),i=await b6(t.agentplaneDir),a=["<!--"," AUTOGENERATED by agentplane ide sync."," DO NOT EDIT MANUALLY.",` Source: ${r.fileName}`,"-->",""].join(`
203
+ `),s=i.length===0?"":["","## Synced Role Activation","","- Use `agentplane role ORCHESTRATOR` while planning and approvals are active.","- As soon as a task owner is known, switch to that owner role before owner-scoped execution.","- Do not keep implementation or verification inside ORCHESTRATOR once the task owner is established.","",...i].join(`
204
+ `),c=`${a}${o.trimEnd()}${s}
205
+ `,d=e.ide==="cursor"?["cursor"]:e.ide==="windsurf"?["windsurf"]:["cursor","windsurf"];if(d.includes("cursor")){let l=Ye.join(t.gitRoot,".cursor","rules");await mkdir(l,{recursive:!0});let p=Ye.join(l,"agentplane.mdc");await X(p,c),process.stdout.write(`${Ye.relative(t.gitRoot,p)}
206
+ `);}if(d.includes("windsurf")){let l=Ye.join(t.gitRoot,".windsurf","rules");await mkdir(l,{recursive:!0});let p=Ye.join(l,"agentplane.md");await X(p,c),process.stdout.write(`${Ye.relative(t.gitRoot,p)}
207
+ `);}return 0})}function y6(e){return (t,r)=>op({cwd:t.cwd,rootOverride:t.rootOverride,ide:r.ide,deps:e})}function np(e){return Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.trim()).filter(Boolean):[]}function w6(e){return {filename:e.filename,id:(typeof e.profile.id=="string"?e.profile.id:"").trim()||e.roleId,role:(typeof e.profile.role=="string"?e.profile.role:"").trim(),description:(typeof e.profile.description=="string"?e.profile.description:"").trim(),inputs:np(e.profile.inputs),outputs:np(e.profile.outputs),permissions:np(e.profile.permissions),workflow:np(e.profile.workflow)}}async function b6(e){let t=Ye.join(e,"agents"),r=[];try{r=(await readdir(t)).filter(i=>i.endsWith(".json")).toSorted();}catch{return []}let n=[];for(let o of r){let i=o.replace(/\.json$/i,""),a=JSON.parse(await readFile(Ye.join(t,o),"utf8")),s=ed(i,{profile:w6({filename:o,roleId:i,profile:a})});s&&n.push(s);}return n}var wb,ip=u(()=>{_e();dn();td();bo();wb={id:["ide","sync"],group:"IDE",summary:"Generate IDE entrypoints from policy gateway file (AGENTS.md or CLAUDE.md).",options:[{kind:"string",name:"ide",valueHint:"<cursor|windsurf>",choices:["cursor","windsurf"],description:"Only generate rules for a single IDE (default: both)."}],examples:[{cmd:"agentplane ide sync",why:"Generate Cursor + Windsurf rules."},{cmd:"agentplane ide sync --ide cursor",why:"Generate Cursor rules only."}],parse:e=>({ide:e.opts.ide})};});function MO(e){return Qt(e).trim()}function _6(e){return MO(e).split(`
208
+ `).map(t=>t.trim()).filter(Boolean).join(" ")}function v6(e){return /[.!?]$/.test(e)?e:`${e}.`}function x6(e){return `${e.title}
209
+
210
+ ${MO(e.description)}`}function R6(e){return [`- In scope: ${v6(_6(e.description))}`,`- Out of scope: unrelated refactors not required for "${e.title}".`].join(`
211
+ `)}function C6(e){return [`1. Implement the change for "${e.title}".`,"2. Run required checks and capture verification evidence.","3. Finalize task findings and finish with traceable commit metadata."].join(`
212
+ `)}function P6(e){return [`1. Review the requested outcome for "${e.title}". Expected: the visible result matches ## Summary and stays inside approved scope.`,"2. Run the most relevant validation step for this task. Expected: it succeeds without unexpected regressions in touched behavior.","3. Compare the final result against ## Scope and record any residual follow-up in ## Findings. Expected: open edges are explicit rather than implicit."].join(`
213
+ `)}function T6(){return ["<!-- BEGIN VERIFICATION RESULTS -->","<!-- END VERIFICATION RESULTS -->"].join(`
214
+ `)}function S6(){return ["- Revert task-related commit(s).","- Re-run required checks to confirm rollback safety."].join(`
215
+ `)}function Gr(e){let t=["## Summary","","## Scope","","## Plan","","## Verify Steps","","## Verification","","## Rollback Plan","","## Findings",""].join(`
216
+ `);return t=setMarkdownSection(t,"Summary",x6({title:e.title,description:e.description})),t=setMarkdownSection(t,"Scope",R6({title:e.title,description:e.description})),t=setMarkdownSection(t,"Plan",C6({title:e.title})),t=setMarkdownSection(t,"Verify Steps",P6({title:e.title})),t=setMarkdownSection(t,"Verification",T6()),t=setMarkdownSection(t,"Rollback Plan",S6()),t=setMarkdownSection(t,"Findings",""),t}function ap(e){let t=e.verifyCommands.length>0?e.verifyCommands.map((n,o)=>`${o+1}. Run \`${n}\`. Expected: it succeeds and confirms the requested outcome for this task.`):[],r=[`Review the changed artifact or behavior for the \`${e.primary}\` task. Expected: the requested outcome is visible and matches the approved scope.`,"Compare the final result against the task summary and touched scope. Expected: remaining follow-up is either resolved or explicit in ## Findings."];return t.length===0?[`1. Review the changed artifact or behavior for the \`${e.primary}\` task. Expected: the requested outcome is visible and matches the approved scope.`,`2. Run the most relevant validation step for the \`${e.primary}\` task. Expected: it succeeds without unexpected regressions in touched scope.`,"3. Compare the final result against the task summary and scope. Expected: any remaining follow-up is explicit in ## Findings."].join(`
217
+ `):[...t,...r.map((n,o)=>`${t.length+o+1}. ${n}`)].join(`
218
+ `)}var Cn,qa=u(()=>{Ca();Cn=3;});function bb(e){let t=new Set,r=[];for(let n of e){let o=String(n??"").trim();!o||t.has(o)||(t.add(o),r.push(o));}return r}function O6(e){let t=e.title.trim();if(!t)throw new m({exitCode:2,code:"E_USAGE",message:"Invalid value for --title: empty."});let r=e.description.trim();if(!r)throw new m({exitCode:2,code:"E_USAGE",message:"Invalid value for --description: empty."});let n=e.owner.trim();if(!n)throw new m({exitCode:2,code:"E_USAGE",message:"Invalid value for --owner: empty."});let o=bb(e.tags);if(o.length===0)throw new m({exitCode:2,code:"E_USAGE",message:"Invalid value for --tag: provide at least one non-empty tag."});let i=bb(e.dependsOn),a=bb(e.verify);return {...e,title:t,description:r,owner:n,tags:o,dependsOn:i,verify:a}}function FO(e){return e.trim().toLowerCase().replaceAll(/[^a-z0-9]+/g," ").split(/\s+/).map(t=>t.trim()).filter(t=>t.length>0&&(t.length>2||/\d/.test(t))&&!A6.has(t))}function D6(e,t){let r=FO(e),n=FO(t);if(r.length===0||n.length===0)return e.trim().toLowerCase()===t.trim().toLowerCase()?1:0;let o=new Set(r),i=new Set(n),a=[...o].filter(c=>i.has(c)).length,s=new Set([...o,...i]).size;return s===0?0:a/s}function N6(e,t){return e.filter(r=>normalizeTaskStatus(r.status)!=="DONE").map(r=>({task:r,score:D6(r.title??"",t)})).filter(({score:r})=>r>=I6).toSorted((r,n)=>n.score-r.score||r.task.id.localeCompare(n.task.id))}function BO(e,t){return `potential duplicate open task detected: ${e.slice(0,3).map(({task:o,score:i})=>`${o.id} (${Math.round(i*100)}% title overlap, status=${normalizeTaskStatus(o.status)}): ${o.title}`).join("; ")}; ${t?"creating a duplicate because --allow-duplicate was passed":"rerun with --allow-duplicate only when intentional or close the extra task with `agentplane task close-duplicate`"}.`}async function _b(e){let t=O6(e.parsed);try{let r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=N6(await r.taskBackend.listTasks(),t.title);if(n.length>0&&!t.allowDuplicate)throw new m({exitCode:3,code:"E_VALIDATION",message:BO(n,!1)});n.length>0&&t.allowDuplicate&&process.stderr.write(`${ie(BO(n,!0))}
219
+ `);let o=r.config.tasks.id_suffix_length_default;if(!r.taskBackend.generateTaskId)throw new m({exitCode:3,code:"E_VALIDATION",message:tt("generateTaskId()")});let i=await r.taskBackend.generateTaskId({length:o,attempts:1e3}),a=await fr(r),s=Te(),c=Gr({title:t.title,description:t.description}),d=(r.config.tasks.verify.spike_tag??"spike").trim().toLowerCase(),l=Nt(t.tags,r);l.usedFallback&&process.stderr.write(`${ie(`primary tag not found in task tags; using fallback primary=${l.primary}`)}
220
+ `);let p=er(t.tags,r.config);await ni(r,t.owner),await Ec({backend:r.taskBackend,taskId:i,dependsOn:t.dependsOn}),p&&(c=setMarkdownSection(c,"Verify Steps",ap({primary:l.primary,verifyCommands:t.verify})),process.stderr.write(`${ie("task requires Verify Steps by primary tag; seeded a concrete ## Verify Steps section in README (refine it only if the task needs stricter acceptance coverage)")}
221
+ `));let g=t.tags.some(C=>C.trim().toLowerCase()===d),h=er(t.tags,r.config);g&&h&&process.stderr.write(`${ie("spike is combined with a primary tag that requires verify steps; consider splitting spike vs implementation tasks")}
222
+ `);let f=Iy({runtime:a.taskIntake,source:{id:"task_new",detail:"task new"},requested_outcome:t.title,requested_owner:t.owner,requested_tags:t.tags,requested_verify:t.verify,requested_dependencies:t.dependsOn,inputs:[{kind:"text",label:"description",value:t.description,required:!0}]}),b=Ay({context:f}),w=Oy({context:f,clarification:b,summary:t.title,tasks:[{draft_id:"task_1",title:t.title,description:t.description,owner:t.owner,priority:t.priority,origin:{system:"manual"},tags:t.tags,depends_on:t.dependsOn,verify:t.verify,doc:c,doc_version:Cn,id_source:"generated"}]}),x=(await Dy({draft:w,task_ids:{task_1:i},created_at:s})).tasks[0]?.task;if(!x)throw new m({exitCode:3,code:"E_VALIDATION",message:"Task intake materialization unexpectedly produced no tasks."});return await r.taskBackend.writeTask(x),process.stdout.write(`${i}
223
+ `),0}catch(r){throw E(r,{command:"task new",root:e.rootOverride??null})}}var I6,A6,vb=u(()=>{D();I();Ny();ro();v();N();le();qa();I6=.75,A6=new Set(["a","an","and","for","from","in","is","of","on","the","to","when","with"]);});async function sp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=Sc(e.status),n=ae(e.tags),o=ae(e.dependsOn),i=ae(e.verify),a=(e.commentAuthor??"").trim()||e.owner,{tasksToWrite:s}=await ja({ctx:t,build:c=>{let d=new Set(c.map(p=>p.id));for(let p of e.taskIds)if(d.has(p))throw new m({exitCode:2,code:"E_USAGE",message:`Task already exists: ${p}`});return {result:null,tasksToWrite:e.taskIds.map(p=>({id:p,title:e.title,description:e.description,status:r,priority:e.priority,owner:e.owner,origin:{system:"manual"},tags:n,depends_on:o,verify:i,comments:e.commentAuthor&&e.commentBody?[{author:e.commentAuthor,body:e.commentBody}]:[],doc_version:Cn,doc_updated_at:Te(),doc_updated_by:a,id_source:"explicit",doc:Gr({title:e.title,description:e.description})}))}}});for(let c of s)process.stdout.write(`${c.id}
224
+ `);return 0}catch(t){throw E(t,{command:"task add",root:e.rootOverride??null})}}var xb=u(()=>{D();v();N();rr();le();qa();});async function cp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await t.taskBackend.getTask(e.taskId);if(!r)throw new m({exitCode:2,code:"E_USAGE",message:Le("task id",e.taskId)});let n={...r};e.title!==void 0&&(n.title=e.title),e.description!==void 0&&(n.description=e.description),e.priority!==void 0&&(n.priority=e.priority),e.owner!==void 0&&(n.owner=e.owner,await ni(t,e.owner));let o=Nt(ve(n.tags),t).primary,i=e.replaceTags?[]:ae(ve(n.tags)),a=ae([...i,...e.tags]),s=Nt(a,t).primary,c=iu(t);if(o!==s&&c.lockPrimaryOnUpdate===!0&&e.allowPrimaryChange!==!0)throw new m({exitCode:2,code:"E_USAGE",message:`Primary tag change is locked (${o} -> ${s}). Use --allow-primary-change to override explicitly.`});n.tags=a;let d=(t.config.tasks.verify.spike_tag??"spike").trim().toLowerCase(),l=a.some(w=>w.trim().toLowerCase()===d),p=er(a,t.config);l&&p&&un(qO,{kind:"warn",message:"spike is combined with a primary tag that requires verify steps; consider splitting spike vs implementation tasks"});let g=e.replaceDependsOn?[]:ae(ve(n.depends_on)),h=ae([...g,...e.dependsOn]);await Ec({backend:t.taskBackend,taskId:e.taskId,dependsOn:h}),n.depends_on=h;let f=e.replaceVerify?[]:ae(ve(n.verify)),b=ae([...f,...e.verify]);return n.verify=b,await t.taskBackend.writeTask(n),un(qO,{kind:"success",action:"updated",target:e.taskId}),0}catch(t){throw t instanceof m?t:E(t,{command:"task update",root:e.rootOverride??null})}}var qO,Rb=u(()=>{D();I();v();N();le();qO=A();});function Cb(e,t,r){if(typeof e=="string")return e.replaceAll(t,r);if(Array.isArray(e))return e.map(n=>Cb(n,t,r));if(e&&typeof e=="object"){let n=Object.entries(e),o={};for(let[i,a]of n)o[i]=Cb(a,t,r);return o}return e}async function dp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=i=>{let a=[],s=new Set;for(let c of i){let d=JSON.stringify(c),l=Cb(c,e.find,e.replace);if(l&&typeof l=="object"){let p=l;a.push(p);let g=JSON.stringify(p);d!==g&&s.add(p.id);}else a.push(c);}return {updated:a,changedIds:s}},{changedIds:n,updated:o}=r(await t.taskBackend.listTasks());if(e.dryRun){if(!e.quiet){process.stdout.write(`${K(`dry-run: would update ${n.size} task(s)`)}
225
+ `);for(let i of [...n].toSorted())process.stdout.write(`${i}
226
+ `);}return 0}return await ja({ctx:t,build:()=>({result:n,tasksToWrite:o})}),e.quiet||process.stdout.write(`${z("updated tasks",void 0,`count=${n.size}`)}
227
+ `),0}catch(t){throw E(t,{command:"task scrub",root:e.rootOverride??null})}}var Pb=u(()=>{D();I();N();rr();});async function Tb(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await Er(t);fi({backend:t.taskBackend,strictRead:e.filters.strictRead});let{depState:n,items:o}=yo({tasks:r,filters:e.filters});for(let i of o)process.stdout.write(`${co(i,n.get(i.id))}
228
+ `);if(!e.filters.quiet){let i={};for(let c of o){let d=normalizeTaskStatus(c.status);i[d]=(i[d]??0)+1;}let a=o.length,s=Object.keys(i).toSorted().map(c=>`${c}=${i[c]}`).join(", ");process.stdout.write(`Total: ${a}${s?` (${s})`:""}
229
+ `);}return 0}catch(t){throw E(t,{command:"task list",root:e.rootOverride??null})}}async function Sb(e){return await Tb(e)}var Eb=u(()=>{D();N();le();});async function lp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await Er(t);fi({backend:t.taskBackend,strictRead:e.filters.strictRead});let{depState:n,filtered:o,items:i}=yo({tasks:r,filters:e.filters,defaultStatuses:["TODO"],readyOnly:!0});for(let a of i)process.stdout.write(`${co(a,n.get(a.id))}
230
+ `);return e.filters.quiet||process.stdout.write(`Ready: ${i.length} / ${o.length}
231
+ `),0}catch(t){throw E(t,{command:"task next",root:e.rootOverride??null})}}var Ib=u(()=>{D();N();le();});async function mp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await t.taskBackend.getTask(e.taskId),n=[],o=null;if(r){o=await oi(r,t.taskBackend);let a=o.missing,s=o.incomplete;a.length>0&&n.push(`${r.id}: missing deps: ${a.join(", ")}`),s.length>0&&n.push(`${r.id}: incomplete deps: ${s.join(", ")}`);}else n.push(Le("task id",e.taskId));for(let a of n)process.stdout.write(`${ie(a)}
232
+ `);if(r){let a=normalizeTaskStatus(r.status),s=r.title?.trim()||"(untitled task)",c=r.owner?.trim()||"-",d=o?.dependsOn??[];process.stdout.write(`Task: ${r.id} [${a}] ${s}
233
+ `),process.stdout.write(`Owner: ${c}
234
+ `),process.stdout.write(`Depends on: ${d.length>0?d.join(", "):"-"}
235
+ `);let l=o?.missing??[],p=o?.incomplete??[];l.length>0&&process.stdout.write(`${ie(`missing deps: ${l.join(", ")}`)}
236
+ `),p.length>0&&process.stdout.write(`${ie(`incomplete deps: ${p.join(", ")}`)}
237
+ `);}let i=n.length===0;return process.stdout.write(`${i?z("ready"):ie("not ready")}
238
+ `),i?0:2}catch(t){throw E(t,{command:"ready",root:e.rootOverride??null})}}var Ab=u(()=>{D();I();N();le();});async function up(e){let t=e.query.trim();if(!t)throw new m({exitCode:2,code:"E_USAGE",message:"Missing query (expected non-empty text)"});try{let r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=await Er(r);if(fi({backend:r.taskBackend,strictRead:e.filters.strictRead}),e.regex){let s;try{s=new RegExp(t,"i");}catch(l){let p=l instanceof Error?l.message:"Invalid regex";throw new m({exitCode:2,code:"E_USAGE",message:Ot("regex",p,"valid pattern")})}let{depState:c,items:d}=yo({tasks:n,filters:e.filters,match:l=>s.test(Mu(l)),limitOrder:"before-sort"});for(let l of d)process.stdout.write(`${co(l,c.get(l.id))}
239
+ `);return 0}let o=t.toLowerCase(),{depState:i,items:a}=yo({tasks:n,filters:e.filters,match:s=>Mu(s).toLowerCase().includes(o),limitOrder:"before-sort"});for(let s of a)process.stdout.write(`${co(s,i.get(s.id))}
240
+ `);return 0}catch(r){throw r instanceof m?r:E(r,{command:"task search",root:e.rootOverride??null})}}var Ob=u(()=>{D();I();v();N();le();});async function pp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});e.force&&await ce({action:"force_action",config:t.config,yes:e.yes===!0,reason:"task scaffold --force"});let r=t.taskBackend,n=t.resolvedProject,o=t.config,i=await r.getTask(e.taskId);if(!i&&!e.force)throw new m({exitCode:2,code:"E_USAGE",message:Le("task id",e.taskId)});let a=taskReadmePath(Ye.join(n.gitRoot,o.paths.workflow_dir),e.taskId);try{if(await readFile(a,"utf8"),!e.overwrite)throw new m({exitCode:2,code:"E_USAGE",message:`File already exists: ${a}`})}catch(p){if(p?.code!=="ENOENT")throw p instanceof m,p}let s=i??{id:e.taskId,title:e.title??q6,description:"",status:"TODO",priority:"med",owner:H6,depends_on:[],tags:[],verify:[],comments:[],doc_version:Cn,doc_updated_at:Te(),doc_updated_by:"UNKNOWN"};e.title&&(s.title=e.title),(typeof s.doc_updated_by!="string"||s.doc_updated_by.trim().length===0||s.doc_updated_by.trim().toLowerCase()==="agentplane")&&(s.doc_updated_by=s.owner?.trim()?s.owner:"UNKNOWN"),s.doc_version=Cn;let c=Ir(s),d=Gr({title:s.title,description:s.description??""}),l=renderTaskReadme(c,d);return await mkdir(Ye.dirname(a),{recursive:!0}),await X(a,l.endsWith(`
241
+ `)?l:`${l}
242
+ `),e.quiet||process.stdout.write(`${z("wrote",Ye.relative(n.gitRoot,a))}
243
+ `),0}catch(t){throw t instanceof m?t:E(t,{command:"task scaffold",root:e.rootOverride??null})}}var q6,H6,Nb=u(()=>{D();I();v();N();_e();le();Be();qa();q6="(untitled task)",H6="UNKNOWN";});function HO(e){let t=e.mergedPr.mergedAt??new Date().toISOString();return {...e.meta,branch:e.branch,status:"MERGED",base:e.mergedPr.baseRefName??e.meta.base,merge_strategy:e.meta.merge_strategy,merged_at:e.meta.merged_at??t,merge_commit:e.mergedPr.mergeCommit?.oid??e.meta.merge_commit,head_sha:e.mergedPr.headRefOid??e.meta.head_sha,updated_at:t}}function GO(e){let t=e.mergedPr.mergedAt??new Date().toISOString(),r=normalizeTaskStatus(e.task.status),n=`Hosted PR #${e.mergedPr.number} merged on GitHub main; task projection reconciled from hosted PR artifacts.`,o=e.mergedPr.mergeCommit?.oid??"",i=e.mergedPr.title?.trim();return {...e.task,status:"DONE",result_summary:e.task.result_summary??`Merged via PR #${e.mergedPr.number}.`,commit:e.task.commit?.hash?.trim()?e.task.commit:o?{hash:o,message:(i&&i.length>0?i:null)??`Hosted PR #${e.mergedPr.number} merged on GitHub main`}:null,events:jr(e.task,{type:"status",at:t,author:"INTEGRATOR",from:r,to:"DONE",note:n}),doc_version:normalizeTaskDocVersion(e.task.doc_version),doc_updated_at:t,doc_updated_by:"INTEGRATOR"}}function VO(e){return normalizeTaskStatus(e.task.status)!=="DONE"||(e.task.commit?.hash??"")!==e.meta.mergeCommit}function UO(e){let t=e.meta.mergedAt??new Date().toISOString(),r=normalizeTaskStatus(e.task.status);return {...e.task,status:"DONE",result_summary:e.task.result_summary??"Merged and reconciled from local PR metadata.",commit:e.task.commit?.hash?.trim()?e.task.commit:{hash:e.meta.mergeCommit,message:"Merged branch_pr task reconciled from local PR metadata"},events:jr(e.task,{type:"status",at:t,author:"INTEGRATOR",from:r,to:"DONE",note:"Local PR metadata already marks the task branch as MERGED; task projection reconciled without an additional GitHub lookup."}),doc_version:normalizeTaskDocVersion(e.task.doc_version),doc_updated_at:t,doc_updated_by:"INTEGRATOR"}}function WO(e){let t=new Date().toISOString(),r=normalizeTaskStatus(e.task.status),n=`Local branch_pr reconciliation detected task commit ${e.candidate.commitHash.slice(0,12)} on base ${e.candidate.base}; canonical task state normalized after shipment.`;return {...e.task,status:"DONE",result_summary:e.task.result_summary??`Shipped on ${e.candidate.base} and reconciled from local branch_pr state.`,commit:e.task.commit?.hash?.trim()?e.task.commit:{hash:e.candidate.commitHash,message:`Shipped on ${e.candidate.base} before canonical task closure`},events:jr(e.task,{type:"status",at:t,author:"INTEGRATOR",from:r,to:"DONE",note:n}),doc_version:normalizeTaskDocVersion(e.task.doc_version),doc_updated_at:t,doc_updated_by:"INTEGRATOR"}}function zO(e){let t=new Date().toISOString();return {...e.meta,branch:e.candidate.branch,base:e.candidate.base,status:"MERGED",merged_at:e.meta.merged_at??t,merge_commit:e.meta.merge_commit??e.candidate.commitHash,head_sha:e.meta.head_sha??e.candidate.commitHash,updated_at:t}}function KO(e){let t=normalizeTaskStatus(e.task.status),r=e.mergedPr.mergeCommit?.oid??"",n=e.mergedPr.baseRefName??e.meta.base??"",o=e.mergedPr.headRefOid??e.meta.head_sha??"";return t!=="DONE"||(e.task.commit?.hash??"")!==r||e.meta.status!=="MERGED"||(e.meta.merge_commit??"")!==r||(e.meta.branch??"")!==e.branch||(e.meta.base??"")!==n||e.meta.head_sha?.trim()!==o}var JO=u(()=>{le();});function U6(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=typeof t.number=="number"?t.number:null;if(!r||r<=0)return null;let n=t.mergeCommit&&typeof t.mergeCommit=="object"&&!Array.isArray(t.mergeCommit)?{oid:typeof t.mergeCommit.oid=="string"?String(t.mergeCommit.oid):null}:null;return {number:r,title:typeof t.title=="string"?t.title:null,url:typeof t.url=="string"?t.url:null,mergedAt:typeof t.mergedAt=="string"?t.mergedAt:null,baseRefName:typeof t.baseRefName=="string"?t.baseRefName:null,headRefName:typeof t.headRefName=="string"?t.headRefName:null,headRefOid:typeof t.headRefOid=="string"?t.headRefOid:null,mergeCommit:n}}function W6(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;if(t.merged!==true)return null;let r=typeof t.number=="number"?t.number:null,n=typeof t.merge_commit_sha=="string"&&t.merge_commit_sha.trim().length>0?t.merge_commit_sha.trim():null,o=t.head&&typeof t.head=="object"&&!Array.isArray(t.head)?t.head:null,i=t.base&&typeof t.base=="object"&&!Array.isArray(t.base)?t.base:null,a=typeof o?.ref=="string"?o.ref:null,s=typeof o?.sha=="string"?o.sha:null,c=typeof i?.ref=="string"?i.ref:null;return !r||r<=0||!n||!a?null:{number:r,title:typeof t.title=="string"?t.title:null,url:typeof t.html_url=="string"?t.html_url:null,mergedAt:typeof t.merged_at=="string"?t.merged_at:null,baseRefName:c,headRefName:a,headRefOid:s,mergeCommit:{oid:n}}}function z6(e){let t=e.map(r=>U6(r)).filter(r=>!!r&&!!r.mergeCommit?.oid);return t.length===0?null:t.toSorted((r,n)=>{let o=r.mergedAt??"";return (n.mergedAt??"").localeCompare(o)})[0]??null}function $b(e){if(!e.event||typeof e.event!="object"||Array.isArray(e.event))return null;let t=e.event.pull_request,r=W6(t);if(!r?.headRefName||!r.mergeCommit?.oid)return null;let n=parseTaskIdFromBranch(e.branchPrefix,r.headRefName);return n?{taskId:n,branch:r.headRefName,mergedPr:r}:null}async function Mb(e){return await uo(async()=>{let{stdout:t}=await execFileAsync("gh",["pr","list","--state","merged","--head",e.branch,"--json","number,title,url,mergedAt,baseRefName,headRefName,headRefOid,mergeCommit"],{cwd:e.cwd,env:ci(),maxBuffer:10485760}),r=JSON.parse(t);return Array.isArray(r)?z6(r):null},{label:`looking up merged PR metadata for ${e.branch}`})}var Fb=u(()=>{Dc();ho();});function Bb(e){let t=e?.branch?.trim()??"",r=e?.merge_commit?.trim()??"";return e?.status!=="MERGED"||!t||!r?null:{branch:t,base:e.base??null,mergedAt:e.merged_at??null,mergeCommit:r,headSha:e.head_sha??null}}async function Ha(e){let t=Ye.join(e.ctx.resolvedProject.gitRoot,e.ctx.config.paths.workflow_dir,e.taskId,"pr","meta.json");try{let r=await readFile(t,"utf8");return {meta:je(r,e.taskId),metaPath:t}}catch{return null}}var fp=u(()=>{nt();});function X6(e){return e.task.verification?.state==="ok"?"task":e.meta?.verify?.status==="pass"?"pr":null}async function Lb(e){try{return await execFileAsync("git",["rev-parse","--verify","--quiet",e.ref],{cwd:e.cwd,env:process.env}),!0}catch{return false}}async function Z6(e){try{return await execFileAsync("git",["merge-base","--is-ancestor",e.ancestor,e.descendant],{cwd:e.cwd,env:process.env}),!0}catch(t){if(t?.code===1)return false;throw t}}async function QO(e){let t=e.meta?.base?.trim()??"";return t.length>0?t:await resolveBaseBranch({cwd:e.ctx.resolvedProject.gitRoot,rootOverride:e.ctx.resolvedProject.gitRoot,cliBaseOpt:null,mode:e.ctx.config.workflow_mode})}function e3(e){let t=parseTaskIdFromBranch("task",e.branch);if(!t||t===e.task.id)return false;let r=e.task.result_summary?.trim().toLowerCase()??"";return r.includes("stacked branch_pr merge rooted at")?r.includes(t.toLowerCase()):false}async function nd(e){if(!Fe(e.ctx)||e.ctx.config.workflow_mode!=="branch_pr")return [];let t=[];for(let r of e.tasks){let n=normalizeTaskStatus(r.status),o=await Ha({ctx:e.ctx,taskId:r.id}),i=o?.meta??null,a=i?.branch?.trim()??"";if(!a)continue;let s=X6({task:r,meta:i}),c=r.commit?.hash?.trim()??i?.merge_commit?.trim()??i?.head_sha?.trim()??"";if(!c)continue;let d=await QO({ctx:e.ctx,meta:i});if(!d||!await Lb({cwd:e.ctx.resolvedProject.gitRoot,ref:d})||!await Z6({cwd:e.ctx.resolvedProject.gitRoot,ancestor:c,descendant:d}))continue;let l=!!(i&&i.status!=="MERGED"),p=n!=="DONE"&&s!==null;!p&&!l||!p&&n!=="DONE"||t.push({taskId:r.id,branch:a,base:d,commitHash:c,verificationSource:s,metaPath:o?.metaPath??null,meta:i,taskStatus:n});}return t}async function qb(e){if(!Fe(e.ctx)||e.ctx.config.workflow_mode!=="branch_pr")return [];let t=[];for(let r of e.tasks){if(normalizeTaskStatus(r.status)!=="DONE")continue;let i=(await Ha({ctx:e.ctx,taskId:r.id}))?.meta??null;if(!i||i.status==="MERGED")continue;let a=i.branch?.trim()??"";if(!a||!(await Lb({cwd:e.ctx.resolvedProject.gitRoot,ref:a})||await Lb({cwd:e.ctx.resolvedProject.gitRoot,ref:`origin/${a}`}))||e3({task:r,branch:a}))continue;let c=r.commit?.hash?.trim()??"";if(!c)continue;let d=await QO({ctx:e.ctx,meta:i});d&&t.push({taskId:r.id,branch:a,base:d,commitHash:c});}return t}var Hb=u(()=>{N();fp();});async function t3(e){if(!Fe(e.ctx)||e.ctx.config.workflow_mode!=="branch_pr")return {tasks:e.tasks,synced:0};let t=e.tasks.find(o=>o.id===e.target.taskId);if(!t){return {tasks:e.tasks,synced:0}}let r=await Ha({ctx:e.ctx,taskId:e.target.taskId});if(!r){return {tasks:e.tasks,synced:0}}if(!KO({task:t,meta:r.meta,mergedPr:e.target.mergedPr,branch:e.target.branch}))return {tasks:e.tasks,synced:0};let n=HO({meta:r.meta,mergedPr:e.target.mergedPr,branch:e.target.branch});return await ge(r.metaPath,n),{tasks:e.tasks.map(o=>o.id===e.target.taskId?GO({task:o,mergedPr:e.target.mergedPr}):o),synced:1}}async function ZO(e){let t=await nd(e);if(t.length===0)return {tasks:e.tasks,synced:0};for(let n of t)n.meta&&n.metaPath&&n.meta.status!=="MERGED"&&await ge(n.metaPath,zO({meta:n.meta,candidate:n}));let r=new Map(t.map(n=>[n.taskId,n]));return {tasks:e.tasks.map(n=>{let o=r.get(n.id);return o?o.taskStatus==="DONE"?n:WO({task:n,candidate:o}):n}),synced:t.length}}async function eD(e){if(!Fe(e.ctx)||e.ctx.config.workflow_mode!=="branch_pr")return {tasks:e.tasks,synced:0};let t=[],r=0;for(let n of e.tasks){let o=await Ha({ctx:e.ctx,taskId:n.id});if(!o){t.push(n);continue}let i=o.meta.branch?.trim()??"";if(!i){t.push(n);continue}let a=Bb(o.meta);if(a){let d=VO({task:n,meta:a});t.push(d?UO({task:n,meta:a}):n),d&&(r+=1);continue}let s=await Mb({cwd:e.ctx.resolvedProject.gitRoot,branch:i});if(!s?.mergeCommit?.oid){t.push(n);continue}let c=await t3({ctx:e.ctx,tasks:[n],target:{taskId:n.id,branch:i,mergedPr:s}});t.push(c.tasks[0]??n),r+=c.synced;}return {tasks:t,synced:r}}var gp=u(()=>{v();_e();N();JO();Fb();Hb();fp();Hb();Fb();fp();});function n3(e){let t=new Set,r=[];for(let n of e){let o=n.trim();!o||t.has(o)||(t.add(o),r.push(o));}return r}function o3(e,t){if(t.length===0)return e.map(i=>({...i}));let r=new Map(e.map(i=>[i.id,i])),n=[],o=[];for(let i of t){let a=r.get(i);if(!a){n.push(i);continue}o.push({...a});}if(n.length>0)throw new m({exitCode:2,code:"E_USAGE",message:`Unknown task${n.length===1?"":"s"}: ${n.join(", ")}`});return o}function i3(e,t){let r=new Map(e.map(n=>[n.id,JSON.stringify(n)]));return t.filter(n=>r.get(n.id)!==JSON.stringify(n))}async function hp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=n3(e.taskIds??[]);if(e.force&&await ce({action:"force_action",config:t.config,yes:e.yes===!0,reason:"task normalize --force"}),t.taskBackend.normalizeTasks&&e.syncHostedMerges!==!0&&e.syncBranchPrState!==!0){let d=await t.taskBackend.normalizeTasks();return e.quiet||process.stdout.write(`${z("normalized tasks",void 0,`scanned=${d.scanned} changed=${d.changed}`)}
244
+ `),0}let n=0,o=0,i=0,a=e.syncHostedMerges!==!0&&e.syncBranchPrState!==!0,{result:s,tasksToWrite:c}=await ja({ctx:t,build:async d=>{let l=o3(d,r),p=l;if(e.syncHostedMerges===!0){let f=await eD({ctx:t,tasks:p});p=f.tasks,n=f.synced;}if(e.syncBranchPrState===!0){let f=await ZO({ctx:t,tasks:p});p=f.tasks,o=f.synced;}let g=a?p:i3(l,p),h=e.syncHostedMerges===!0||e.syncBranchPrState===!0?g.filter(f=>normalizeTaskStatus(f.status)==="DONE"):[];for(let f of h)await kt({ctx:t,taskId:f.id,task:f,write:!1});return {result:{incidentCandidates:h},tasksToWrite:g}}});for(let d of s.incidentCandidates){let l=await kt({ctx:t,taskId:d.id,task:d,write:!0});i+=l.plan.promotable.length;}return e.quiet||process.stdout.write(`${z("normalized tasks",void 0,`count=${c.length}${e.syncHostedMerges===!0?` synced_hosted_merges=${n}`:""}${e.syncBranchPrState===!0?` synced_branch_pr_state=${o}`:""}${e.syncHostedMerges===!0||e.syncBranchPrState===!0?` promoted_incidents=${i}`:""}`)}
245
+ `),0}catch(t){throw E(t,{command:"task normalize",root:e.rootOverride??null})}}var Gb=u(()=>{D();I();v();Be();N();rr();xn();gp();});async function kp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});e.force&&await ce({action:"force_action",config:t.config,yes:e.yes===!0,reason:"task migrate --force"});let r=t.taskBackend,n=t.resolvedProject,o=t.config,i=e.source??o.paths.tasks_path,a=Ye.join(n.gitRoot,i),s=await readFile(a,"utf8"),c=JSON.parse(s),d=Array.isArray(c.tasks)?c.tasks:[];if(r.writeTasks)await r.writeTasks(d);else for(let l of d)await r.writeTask(l);return e.quiet||process.stdout.write(`${z("migrated tasks into backend",void 0,`count=${d.length}`)}
246
+ `),0}catch(t){throw E(t,{command:"task migrate",root:e.rootOverride??null})}}var Vb=u(()=>{D();I();Be();N();});function od(e){return !!e&&typeof e=="object"&&!Array.isArray(e)}function v3(e){return Number.isInteger(e)&&typeof e=="number"&&e>0?e:null}function x3(e){if(!od(e))return null;let t={};for(let[r,n]of Object.entries(e)){let o=r.trim();!o||typeof n!="string"||(t[o]=n.replaceAll(`\r
247
+ `,`
248
+ `).trimEnd());}return Object.keys(t).length>0?t:null}function id(e){return e.trim().replaceAll(/\s+/g," ").toLowerCase()}function oD(e){let t=e.replaceAll(`\r
249
+ `,`
250
+ `).split(`
251
+ `),r=[],n=null;for(let o of t){let i=/^##\s+(.*)$/.exec(o.trim());if(i){n&&(n.text=n.text.trimEnd(),r.push(n)),n={title:(i[1]??"").trim(),text:""};continue}n&&(n.text=n.text.length>0?`${n.text}
252
+ ${o}`:o);}return n&&(n.text=n.text.trimEnd(),r.push(n)),r}function R3(e){return e.map(t=>{let r=t.text.trimEnd();return r?`## ${t.title}
253
+
254
+ ${r}`:`## ${t.title}
255
+ `}).join(`
256
+
257
+ `).trimEnd()}function sD(e,t){return _3.has(id(e))?Qt(t).trimEnd():t.trimEnd()}function iD(e,t){let r=id(t);return e.find(n=>id(n.title)===r)?.text??null}function C3(e,t){let r=Dt(e,t)?.trim()??"",n=be(e,"Notes")?.trim()??"",o=be(e,"Findings")?.trim()??"",i=[];for(let a of [r,o,n])a&&(i.includes(a)||i.push(a));return i.join(`
258
+
259
+ `).trim()}function P3(e){let t=oD(e.doc),r=oD(Gr({title:e.title,description:e.description})),n=new Set,o=[],i=C3(e.doc,2);for(let a of b3){let s=id(a),c=iD(t,a),d=iD(r,a)??"",l=c??d;a==="Verification"&&(l=Ra(c??d,3)),a==="Findings"&&(l=i||d),l!==null&&(l=sD(a,l),o.push({title:a,text:l.trimEnd()}),n.add(s),a==="Findings"&&n.add("notes"));}for(let a of t){let s=id(a.title);n.has(s)||(o.push({title:a.title,text:a.text.trimEnd()}),n.add(s));}return R3(o)}function T3(e){let t=e.plan_approval;od(t)&&typeof t.state=="string"||(e.plan_approval={state:"pending",updated_at:null,updated_by:null,note:null});}function S3(e){let t=e.verification;od(t)&&typeof t.state=="string"||(e.verification={state:"pending",updated_at:null,updated_by:null,note:null});}function I3(e){if(!e.includes("T")||!e.endsWith("Z"))return false;let t=Date.parse(e);return Number.isFinite(t)}function aD(e){if(!I3(e.updatedAt))return e.note;let t=e.updatedAt.slice(0,10);return e.note.replaceAll(E3,(r,n)=>n!==t?r:`on ${e.updatedAt}`)}function A3(e){let t=e.plan_approval;od(t)&&typeof t.note=="string"&&typeof t.updated_at=="string"&&(t.note=aD({note:t.note,updatedAt:t.updated_at}));let r=e.verification;od(r)&&typeof r.note=="string"&&typeof r.updated_at=="string"&&(r.note=aD({note:r.note,updatedAt:r.updated_at}));}async function O3(e){let t=await readFile(e.readmePath,"utf8"),r=t.endsWith(`
260
+ `)?t:`${t}
261
+ `,n=parseTaskReadme(r),o={...n.frontmatter};T3(o),S3(o),A3(o);let i=x3(o.sections),a=e.config.tasks.doc.required_sections,s=extractTaskDoc(n.body),c=i===null?s||n.body:renderTaskDocFromSections(i),d=normalizeTaskDoc(ensureDocSections(c,a)),l=Se(o.doc_version);if(l===2)o.doc_version=3,d=P3({title:typeof o.title=="string"?o.title:"",description:typeof o.description=="string"?o.description:"",doc:d});else {let f=be(d,"Verification"),b=Ra(f,l);d=setMarkdownSection(d,"Verification",b);for(let w of ["Summary","Context","Scope","Plan","Findings","Notes"]){let _=be(d,w);_!=null&&(d=setMarkdownSection(d,w,sD(w,_)));}}let p=s?mergeTaskDoc(n.body,d):d;o.sections=taskDocToSectionMap(d),o.revision=v3(o.revision)??1;let g=renderTaskReadme(o,p),h=g.endsWith(`
262
+ `)?g:`${g}
263
+ `;return h===r?{changed:false}:(await atomicWriteFile(e.readmePath,h,"utf8"),{changed:true})}async function D3(e){if(!e.params.all)return e.params.taskIds.map(n=>Ye.join(e.tasksDir,n,"README.md"));if(await Zt(e.tasksDir)!=="dir")return [];let t=await readdir(e.tasksDir,{withFileTypes:true}),r=[];for(let n of t){if(!n.isDirectory())continue;let o=Ye.join(e.tasksDir,n.name,"README.md");await P(o)&&r.push(o);}return r}async function N3(e){if(!(e.ctx.taskBackend.exportProjectionSnapshot||e.ctx.taskBackend.exportTasksJson))return [];let t=e.tasksPath.replaceAll("\\","/"),r=Ye.join(e.resolvedGitRoot,t),n=null;try{n=await readFile(r,"utf8");}catch{n=null;}await cm({ctx:e.ctx,outputPath:r});let o=null;try{o=await readFile(r,"utf8");}catch{o=null;}return n===o?[]:await cD(e.resolvedGitRoot,t)?[t]:[]}async function cD(e,t){try{return await execFileAsync("git",["ls-files","--error-unmatch","--",t],{cwd:e,env:gitEnv()}),!0}catch{}try{return await execFileAsync("git",["check-ignore","--quiet","--",t],{cwd:e,env:gitEnv()}),!1}catch{return true}}async function Wb(e){let t=e.resolvedProject??await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=e.config;r||(r=(await loadConfig(t.agentplaneDir)).config);let n=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null,resolvedProject:t,config:r}),o={all:e.all,quiet:false,taskIds:e.taskIds},i=Ye.join(t.gitRoot,r.paths.workflow_dir),a=await D3({tasksDir:i,params:o});if(!e.all){for(let d of a)if(!await P(d)){let l=Ye.basename(Ye.dirname(d));throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Task README not found: ${l}`})}}let s=0,c=[];for(let d of a){if(!(await O3({readmePath:d,config:r})).changed)continue;s+=1;let p=Ye.relative(t.gitRoot,d).replaceAll("\\","/");await cD(t.gitRoot,p)&&c.push(p);}return s>0&&c.push(...await N3({ctx:n,resolvedGitRoot:t.gitRoot,tasksPath:r.paths.tasks_path})),{changed:s,changedPaths:[...new Set(c)]}}async function zb(e){let t={all:e.all,quiet:e.quiet,taskIds:e.taskIds};try{let r=await Wb({cwd:e.cwd,rootOverride:e.rootOverride??null,all:t.all,taskIds:t.taskIds});return t.quiet||process.stdout.write(`${z("migrated task docs",void 0,`changed=${r.changed}`)}
264
+ `),0}catch(r){throw r instanceof m?r:O(r,{command:"task migrate-doc",root:e.rootOverride??null})}}var b3,_3,E3,yp=u(()=>{D();G();ee();I();v();N();Ca();qa();b3=["Summary","Scope","Plan","Verify Steps","Verification","Rollback Plan","Findings"],_3=new Set(["summary","context","scope","plan","findings","notes"]);E3=/\bon (\d{4}-\d{2}-\d{2})(?!T)\b/g;});function $3(e){return {intents:[Uc({author:e.author,body:e.body}),Na({type:"comment",at:e.at,author:e.author,body:e.body}),Ke({updatedBy:e.author,version:Se(e.task.doc_version)})],nextTask:{...e.task,comments:[...Array.isArray(e.task.comments)?e.task.comments.filter(t=>!!t&&typeof t.author=="string"&&typeof t.body=="string"):[],{author:e.author,body:e.body}],events:jr(e.task,{type:"comment",at:e.at,author:e.author,body:e.body}),doc_version:Se(e.task.doc_version),doc_updated_at:e.at,doc_updated_by:e.author}}}async function Kb(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=Te();return await dt({ctx:t,taskId:e.taskId,build:n=>$3({task:n,at:r,author:e.author,body:e.body})}),un(j3,{kind:"success",action:"commented",target:e.taskId}),0}catch(t){throw E(t,{command:"task comment",root:e.rootOverride??null})}}var j3,Jb=u(()=>{D();I();N();rr();qr();le();j3=A();});async function Yb(e){let t=Sc(e.status);if(t==="DONE"&&!e.force)throw new m({exitCode:2,code:"E_USAGE",message:"Use `agentplane finish` to mark DONE (use --force to override)"});if(e.author&&!e.body||e.body&&!e.author)throw new m({exitCode:2,code:"E_USAGE",message:"--author and --body must be provided together"});try{let r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=r.config;e.force&&await ce({action:"force_action",config:n,yes:e.yes,reason:"task set-status --force"});let o=r.resolvedProject,i=e.author&&e.body?_n({body:e.body,enabled:e.commitFromComment,config:n}):null,a=i?.commentBody,s=Te(),c=e.commit?await vn(o.gitRoot,e.commit):null,d=e.commit?{hash:c.hash,message:c.message}:void 0,l=await pi({ctx:r,taskId:e.taskId,quiet:e.quiet,policyAction:"task_set_status",build:p=>{let g=ac(p,e.author);return {at:s,toStatus:t,eventAuthor:g,updatedBy:g,note:a,comment:a&&e.author?{author:e.author,body:a}:void 0,commit:d,force:e.force,dependencyPolicy:t==="DOING"||t==="DONE"?{kind:"require-ready"}:{kind:"none"},commentCommitPolicy:{enabled:e.commitFromComment,action:"task set-status",confirmed:e.confirmStatusCommit,quiet:e.quiet}}}});if(e.commitFromComment){if(!e.body)throw new m({exitCode:2,code:"E_USAGE",message:"--body is required when using --commit-from-comment"});await Mr({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,primaryTag:l.primaryTag,author:e.author,statusFrom:l.execution.currentStatus,statusTo:t,commentBody:e.body,formattedComment:i?.formattedComment??null,emoji:e.commitEmoji??Fr(t),allow:e.commitAllow,autoAllow:e.commitAutoAllow||e.commitAllow.length===0,allowTasks:e.commitAllowTasks,requireClean:e.commitRequireClean,quiet:e.quiet});}return e.quiet||process.stdout.write(`${z("status",e.taskId,`next=${t}`)}
265
+ `),0}catch(r){throw r instanceof m?r:E(r,{command:"task set-status",root:e.rootOverride??null})}}var Qb=u(()=>{D();I();v();Be();N();le();});async function q3(e,t){if(!ua(e))return null;let r=taskReadmePath(Ye.join(e.resolvedProject.gitRoot,e.config.paths.workflow_dir),t);try{let n=await readFile(r,"utf8"),o=parseTaskReadme(n),i={...o.frontmatter,id:typeof o.frontmatter.id=="string"&&o.frontmatter.id.trim().length>0?o.frontmatter.id:t},a=validateTaskDocMetadata(i);return a.length>0?a:null}catch{return null}}async function Xb(e){let t=null;try{t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});let r=await ue({ctx:t,taskId:e.taskId}),n=Ir(r);if(ua(t)){let o=validateTaskDocMetadata(n);if(o.length>0)throw new m({exitCode:3,code:"E_VALIDATION",message:`Invalid task README metadata: ${o.join("; ")}`})}return process.stdout.write(`${JSON.stringify(n,null,2)}
266
+ `),0}catch(r){if(!(r instanceof m)&&t){let n=await q3(t,e.taskId);if(n&&n.length>0)throw new m({exitCode:3,code:"E_VALIDATION",message:`Invalid task README metadata: ${n.join("; ")}`})}throw r instanceof m?r:E(r,{command:"task show",root:e.rootOverride??null,taskId:e.taskId})}}var Zb=u(()=>{D();v();N();});function G3(e,t){let r=e.trim().replaceAll(/\s+/g," ");return r.length<=t?r:`${r.slice(0,Math.max(0,t-3)).trimEnd()}...`}async function e_(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});if(!t.taskBackend.generateTaskId)throw new m({exitCode:3,code:"E_VALIDATION",message:"task backend does not support generateTaskId()"});let r=await t.taskBackend.getTask(e.spikeId);if(!r)throw new m({exitCode:2,code:"E_USAGE",message:Le("task id",e.spikeId)});if(!ve(r.tags).map(w=>w.trim().toLowerCase()).includes("spike"))throw new m({exitCode:3,code:"E_VALIDATION",message:`${e.spikeId}: expected tag spike (use --tag spike on the source task)`});let o=typeof r.doc=="string"?r.doc:"",i=Dt(o,Se(r.doc_version))??"",a=i.trim()?G3(i,180):"",s=t.config.tasks.id_suffix_length_default,c=await t.taskBackend.generateTaskId({length:s,attempts:1e3}),d=e.description.trim();d=`${d} (derived from spike ${e.spikeId})`,a&&(d=`${d} [spike_notes: ${a}]`);let l=Gr({title:e.title,description:d}),p=(t.config.tasks.verify.spike_tag??"spike").trim().toLowerCase(),g=Nt(e.tags,t);g.usedFallback&&process.stderr.write(`${ie(`primary tag not found in task tags; using fallback primary=${g.primary}`)}
267
+ `);let h=er(e.tags,t.config);await ni(t,e.owner),h&&(l=setMarkdownSection(l,"Verify Steps",ap({primary:g.primary,verifyCommands:e.verify})),process.stderr.write(`${ie("task requires Verify Steps by primary tag; seeded a concrete ## Verify Steps section in README (refine it only if the task needs stricter acceptance coverage)")}
268
+ `)),e.tags.some(w=>w.trim().toLowerCase()===p)&&h&&process.stderr.write(`${ie("spike is combined with a primary tag that requires verify steps; consider splitting spike vs implementation tasks")}
269
+ `);let b=_m({doc:l,owner:e.owner,updatedBy:e.owner,version:Cn,updatedAt:Te()});return await t.taskBackend.writeTask({id:c,title:e.title,description:d,status:"TODO",priority:e.priority,owner:e.owner,tags:e.tags,depends_on:[e.spikeId],verify:e.verify,comments:[],doc:b.doc,sections:b.sections,doc_version:b.doc_version,doc_updated_at:b.doc_updated_at,doc_updated_by:b.doc_updated_by,id_source:"generated"}),process.stdout.write(`${c}
270
+ `),0}catch(t){throw E(t,{command:"task derive",root:e.rootOverride??null})}}var t_=u(()=>{D();I();v();Ty();N();qa();le();});async function wp(e){let t=e.ctx.config.tasks.comments.verified;bn(e.body,t.prefix,t.min_chars);let r=Te();await dt({ctx:e.ctx,taskId:e.taskId,policyAction:"task_finish",build:async n=>{if(!e.force&&normalizeTaskStatus(n.status)==="DONE")throw new m({exitCode:2,code:"E_USAGE",message:`Task is already DONE: ${e.taskId} (use --force to override)`});let o=await ui({task:n,backend:e.ctx.taskBackend,config:e.ctx.config,at:r,toStatus:"DONE",eventAuthor:e.author,updatedBy:e.author,note:e.body,comment:{author:e.author,body:e.body},extraFields:{result_summary:e.resultSummary,risk_level:"low",breaking:false},force:true,dependencyPolicy:{kind:"none"}});return {intents:o.intents,nextTask:o.nextTask}}}),e.quiet||process.stdout.write(`${e.successMessage}
271
+ `);}var r_=u(()=>{v();rr();le();});async function J3(e){let t=e.ctx.config.paths.workflow_dir,r=Ye.join(e.ctx.resolvedProject.gitRoot,t,e.taskId,"README.md");if(await P(r))return;let o=(await listWorktrees(e.ctx.resolvedProject.gitRoot).catch(()=>[])).filter(s=>typeof s.branch=="string"&&parseTaskIdFromBranch(e.ctx.config.branch.task_prefix,s.branch)===e.taskId);if(o.length===1){let s=Ye.join(o[0].path,t,e.taskId,"README.md");if(await P(s)){let c=await readFile(s,"utf8");await mkdir(Ye.dirname(r),{recursive:true}),await X(r,c);return}}let i=await ue({ctx:e.ctx,taskId:e.taskId,preferBranchSnapshot:true}),a=renderTaskReadme(Ir(i),i.doc??"");await mkdir(Ye.dirname(r),{recursive:true}),await X(r,a);}async function n_(e){try{let t=e.taskId.trim(),r=e.duplicateOf.trim();if(!t||!r)throw new m({exitCode:2,code:"E_USAGE",message:"Both task id and --of must be non-empty."});if(t===r)throw new m({exitCode:2,code:"E_USAGE",message:`Duplicate target must differ from task id (${t}).`});e.force&&await ce({action:"force_action",config:e.ctx.config,yes:e.yes,reason:"task close-duplicate --force"});let n=await ue({ctx:e.ctx,taskId:r});await J3({ctx:e.ctx,taskId:t});let o=e.note?.trim(),i=n.title?.trim()?` (${n.title.trim()})`:"",a=`Verified: ${t} is a bookkeeping duplicate of ${r}${i}; no code/config changes are expected in this task and closure is recorded as no-op.`,s=o?`${a}
272
+
273
+ Reason: ${o}`:a;return await wp({ctx:e.ctx,taskId:t,author:e.author,body:s,resultSummary:`Closed as duplicate of ${r}.`,quiet:e.quiet,successMessage:`task.done: ${t} (duplicate of ${r})`,force:e.force}),0}catch(t){throw t instanceof m?t:E(t,{command:"task close-duplicate",root:e.rootOverride??null})}}var o_=u(()=>{D();ee();v();_e();Be();N();r_();});function Y3(e,t){if(t.agents?.approvals?.require_plan===true||!(t.tasks.verify.enforce_on_start_when_no_plan!==false))return;let n=ve(e.tags),o=(t.tasks.verify.spike_tag??"spike").trim().toLowerCase(),i=er(n,t),a=n.some(p=>p.trim().toLowerCase()===o),s=typeof e.doc=="string"?e.doc:"";if((i||a)&&hn({taskId:e.id,sectionText:be(s,"Verify Steps"),action:"start work",guidance:"fill it before starting work when plan approval is disabled"}),!a)return;let c=Se(e.doc_version),d=Xt(c),l=Dt(s,c);if(!l||l.trim().length===0)throw new m({exitCode:3,code:"E_VALIDATION",message:`${e.id}: cannot start spike: ## ${d} section is missing or empty (include Findings/Decision/Next Steps)`})}async function Ga(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});e.force&&await ce({action:"force_action",config:t.config,yes:e.yes===!0,reason:"start --force"});let{prefix:r,min_chars:n}=t.config.tasks.comments.start;bn(e.body,r,n);let o=_n({body:e.body,enabled:e.commitFromComment,config:t.config}),i=o.commentBody??e.body,a=Te(),s=await pi({ctx:t,taskId:e.taskId,quiet:e.quiet,policyAction:"task_start",build:d=>(Y3(d,t.config),mi(d,t.config),{at:a,toStatus:"DOING",eventAuthor:e.author,updatedBy:e.author,note:i,comment:{author:e.author,body:i},force:e.force,dependencyPolicy:{kind:"require-ready"},commentCommitPolicy:{enabled:e.commitFromComment,action:"start",confirmed:e.confirmStatusCommit,quiet:e.quiet}})}),c=null;if(e.commitFromComment&&(c=await Mr({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,primaryTag:s.primaryTag,author:e.author,statusFrom:s.execution.currentStatus,statusTo:"DOING",commentBody:e.body,formattedComment:o.formattedComment,emoji:e.commitEmoji??Fr("DOING"),allow:e.commitAllow,autoAllow:e.commitAutoAllow||e.commitAllow.length===0,allowTasks:e.commitAllowTasks,requireClean:e.commitRequireClean,quiet:e.quiet,progressMessage:"task marked DOING; creating commit from start comment",resolveExecutorAgent:!0})),t.config.workflow_mode==="branch_pr"&&await ko({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,author:e.author}),!e.quiet){let d=c?` (commit=${c.hash.slice(0,12)})`:"";process.stdout.write(`${z("started",`${e.taskId}${d}`)}
274
+ `);}return 0}catch(t){throw t instanceof m?t:E(t,{command:"start",root:e.rootOverride??null})}}var _p=u(()=>{D();I();v();Be();N();li();le();});async function i_(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await Ga({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,author:e.author,body:e.body,commitFromComment:!1,commitAllow:[],commitAutoAllow:!1,commitAllowTasks:!0,commitRequireClean:!1,confirmStatusCommit:!1,force:e.force,yes:e.yes,quiet:!0});if(!e.quiet){process.stdout.write(`${z("ready",e.taskId)}
275
+ `);let n=await Bu({ctx:t,taskId:e.taskId,limit:3});n.matches.length>0&&(process.stdout.write(`${K("incident advice for analogous tasks")}
276
+ `),process.stdout.write(`${ti(n.matches)}
277
+ `));}return r}catch(t){throw t instanceof m?t:E(t,{command:"task start-ready",root:e.rootOverride??null})}}var a_=u(()=>{D();I();v();eu();N();xn();_p();});async function s_(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});e.force&&await ce({action:"force_action",config:t.config,yes:e.yes,reason:"task close-noop --force"});let r=e.note?.trim(),n="Verified: no implementation changes were required; closure is recorded as no-op bookkeeping.",o=r?`${n}
278
+
279
+ Note: ${r}`:n;return await wp({ctx:t,taskId:e.taskId,author:e.author,body:o,resultSummary:"No-op closure recorded.",quiet:e.quiet,successMessage:`task.done: ${e.taskId} (no-op)`,force:e.force}),0}catch(t){throw t instanceof m?t:E(t,{command:"task close-noop",root:e.rootOverride??null})}}var c_=u(()=>{D();v();Be();N();r_();});async function ir(e){try{return await realpath(e)}catch{return Ye.resolve(e)}}function yt(e,t){let r=Ye.relative(e,t);return r===""||!r.startsWith("..")&&!Ye.isAbsolute(r)}var Pn=u(()=>{});async function wi(e){let t=await ir(e.gitRoot),n=await findWorktreeForBranch(e.gitRoot,e.branch)??e.worktreePathHint??null,o=n?await ir(n):null;if(o){if(!yt(t,o))return {removedBranch:false,removedWorktree:false,worktreePath:o,skippedReason:"outside_repo"};if(o===t)return {removedBranch:false,removedWorktree:false,worktreePath:o,skippedReason:"current_worktree"};await execFileAsync("git",["worktree","remove","--force",o],{cwd:e.gitRoot,env:gitEnv()});}let i=false;return await gitBranchExists(e.gitRoot,e.branch)&&(await execFileAsync("git",["branch","-D",e.branch],{cwd:e.gitRoot,env:gitEnv()}),i=true),{removedBranch:i,removedWorktree:!!o,worktreePath:o,skippedReason:null}}var vp=u(()=>{Ee();Pn();});async function xp(e){let t=Ye.join(e.gitRoot,e.workflowDir,e.taskId,"README.md"),{stdout:r}=await execFileAsync("git",["log",e.baseBranch,"--format=%s","--",t],{cwd:e.gitRoot,env:gitEnv(),maxBuffer:10*1024*1024}),o=`${extractTaskSuffix(e.taskId)} close:`,i=`(${e.taskId})`;return r.split(`
280
+ `).map(a=>a.trim()).some(a=>a.includes(o)&&a.includes(i))}var l_=u(()=>{});function n5(e){return `\u{1F4DD} ${e} task: close after hosted merge`}function o5(e){return [typeof e.prNumber=="number"&&e.prNumber>0?`Automated closure for merged task PR #${e.prNumber}.`:"Automated closure for merged task PR.","",`- task_id: \`${e.taskId}\``,`- source_branch: \`${e.sourceBranch}\``,`- merge_sha: \`${e.mergeSha}\``,"","This PR contains only tracked task artifacts produced by the hosted branch_pr closure flow."].join(`
281
+ `)}async function i5(e){try{let t=await wi({gitRoot:e.gitRoot,branch:e.branch});if(!t.removedBranch&&!t.removedWorktree)return t.skippedReason==="current_worktree"?[{level:"info",message:`local merged branch cleanup skipped: ${e.branch} is the current checkout`}]:t.skippedReason==="outside_repo"?[{level:"info",message:`local merged branch cleanup skipped: ${e.branch} is attached to a worktree outside the current checkout root`}]:[];let r=[];return t.removedWorktree&&t.worktreePath&&r.push(`removed worktree ${t.worktreePath}`),t.removedBranch&&r.push(`deleted branch ${e.branch}`),[{level:"info",message:`local merged branch cleanup: ${r.join("; ")}`}]}catch(t){let r=t instanceof Error?t.message:String(t);return [{level:"warn",message:`local merged branch cleanup failed for ${e.branch}: ${r}`}]}}async function pD(e){let t=await i5({gitRoot:e.gitRoot,branch:e.sourceBranch});if(await xp({gitRoot:e.gitRoot,workflowDir:e.workflowDir,taskId:e.taskId,baseBranch:e.baseBranch}))return {notices:t,outcome:{kind:"base-already-recorded",taskId:e.taskId,baseBranch:e.baseBranch}};let n=e.repo.split("/")[0]?.trim()??"",o=new URLSearchParams({state:"open",head:`${n}:${e.closeBranch}`}),i=await jt(e.gitRoot,[`repos/${e.repo}/pulls?${o.toString()}`]),a=Array.isArray(i)?i[0]??null:null,s=Number(a?.number??0);if(Number.isInteger(s)&&s>0)return {notices:t,outcome:{kind:"existing-pr",taskId:e.taskId,prNumber:s,prUrl:a?.html_url??null}};let c=await jt(e.gitRoot,[`repos/${e.repo}/pulls`,"-X","POST","-f",`title=${n5(e.taskId)}`,"-f",`body=${o5({taskId:e.taskId,prNumber:e.sourcePrNumber,sourceBranch:e.sourceBranch,mergeSha:e.mergeCommit})}`,"-f",`head=${e.closeBranch}`,"-f",`base=${e.baseBranch}`]);return {notices:t,outcome:{kind:"created-pr",taskId:e.taskId,closeBranch:e.closeBranch,prNumber:Number(c.number??0),prUrl:c.html_url??null}}}var fD=u(()=>{ho();vp();l_();});function gD(e){if(e.outcome.kind==="created-pr"&&(!Number.isInteger(e.outcome.prNumber)||e.outcome.prNumber<=0))throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`GitHub did not return a valid PR number for hosted closure branch ${e.outcome.closeBranch}.`});return e}var hD=u(()=>{G();v();});async function u5(e){let t=e.repoOverride?.trim()??"";return t||await go(e.gitRoot)}function kD(e){let t=e.pulls.filter(r=>{if(typeof r.merged_at!="string"||r.merged_at.trim().length===0)return false;let n=r.head?.ref?.trim()??"";if(e.sourceBranch&&n&&n!==e.sourceBranch)return false;let o=r.base?.ref?.trim()??"";return !(e.baseBranch&&o&&o!==e.baseBranch)});if(t.length===0)return null;if(typeof e.prNumber=="number"&&e.prNumber>0){let r=t.find(n=>Number(n.number??0)===e.prNumber);if(r)return r}return [...t].toSorted((r,n)=>{let o=Date.parse(r.merged_at??""),i=Date.parse(n.merged_at??"");return Number.isNaN(i)||Number.isNaN(o)?0:i-o})[0]??null}async function p5(e){let t=e.repo.split("/")[0]?.trim()??"";if(!t)return null;let r=new URLSearchParams({state:"closed",head:`${t}:${e.sourceBranch}`});e.baseBranch&&r.set("base",e.baseBranch);let n=await jt(e.gitRoot,[`repos/${e.repo}/pulls?${r.toString()}`]);return kD({pulls:Array.isArray(n)?n:[],sourceBranch:e.sourceBranch,baseBranch:e.baseBranch,prNumber:e.prNumber})}async function f5(e){let t=await jt(e.gitRoot,[`repos/${e.repo}/commits/${e.mergeCommit}/pulls`]);return kD({pulls:Array.isArray(t)?t:[],sourceBranch:e.sourceBranch,baseBranch:e.baseBranch,prNumber:e.prNumber})}async function g5(e){let t=await e.ctx.taskBackend.getTask(e.taskId)??await ue({ctx:e.ctx,taskId:e.taskId,preferBranchSnapshot:false}),r=await sc({ctx:e.ctx,taskId:e.taskId}),{metaPath:n,config:o}=await ht({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId});if(o.workflow_mode!=="branch_pr")throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Invalid workflow_mode: ${o.workflow_mode} (expected branch_pr)`});return await P(n)?{meta:je(await readFile(n,"utf8"),e.taskId),task:t,taskBranch:r}:{meta:null,task:t,taskBranch:r}}async function h5(e){let{stdout:t}=await execFileAsync("git",["ls-remote","--heads","origin",`task-close/${e.taskId}/*`],{cwd:e.gitRoot,env:gitEnv(),maxBuffer:10485760});return t.split(`
282
+ `).map(r=>r.trim()).filter(r=>r.length>0).map(r=>r.split(/\s+/,2)[1]??"").map(r=>r.replace(/^refs\/heads\//,"")).filter(r=>r.length>0)}function m_(e){return e.trim().slice(0,12)}function k5(e){return e.startsWith("refs/heads/")?e.slice(11):e}async function y5(e){let t=await h5({gitRoot:e.gitRoot,taskId:e.taskId}),r=k5(e.explicitBranch?.trim()??"");if(r){let n=parseTaskIdFromCloseBranch(r);if(n&&n!==e.taskId)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Branch ${r} does not belong to task ${e.taskId}.`});if(!t.includes(r))throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Remote hosted closure branch not found: ${r}.`});return r}if(e.mergeCommit){let n=`task-close/${e.taskId}/${m_(e.mergeCommit)}`;if(t.includes(n))return n;if(t.length===1)return t[0]??n;throw t.length>1?new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Multiple remote hosted closure branches match ${e.taskId}: ${t.join(", ")} (use --branch).`}):new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Remote hosted closure branch not found for ${e.taskId}: ${n}.`})}if(t.length===1)return t[0]??"";throw t.length>1?new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Multiple remote hosted closure branches match ${e.taskId}: ${t.join(", ")} (use --branch).`}):new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Could not resolve remote hosted closure branch for ${e.taskId}.`})}async function yD(e){let{meta:t,task:r,taskBranch:n}=await g5({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId}),o=e.ctx.resolvedProject.gitRoot,i=await u5({gitRoot:o,repoOverride:e.repo??null}),a=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:null,mode:e.ctx.config.workflow_mode}),s=t?.branch?.trim()??n?.trim()??"",c=t?.base?.trim()??a?.trim()??"",d=t?.merge_commit?.trim()??r.commit?.hash?.trim()??"";if(t?.status==="MERGED"&&s.length>0&&d.length>0&&normalizeTaskStatus(r.status)==="DONE"&&(r.commit?.hash?.trim()??"")===d)return {kind:"skip",outcome:{kind:"canonical-already-present",taskId:e.taskId,baseBranch:c,mergeCommit:d}};let p=typeof t?.pr_number=="number"?t.pr_number:null,g=s.length>0&&(t?.status!=="MERGED"||!d)?await p5({gitRoot:o,repo:i,sourceBranch:s,baseBranch:c||null,prNumber:p}):null;!g&&d&&(g=await f5({gitRoot:o,repo:i,mergeCommit:d,sourceBranch:s||null,baseBranch:c||null,prNumber:p})),s||(s=g?.head?.ref?.trim()??""),c||(c=g?.base?.ref?.trim()??a?.trim()??"");let h=t?.merge_commit?.trim()??r.commit?.hash?.trim()??g?.merge_commit_sha?.trim()??"";if(!s)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Missing hosted close source branch for ${e.taskId}.`});if(!h)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Missing hosted close merge commit for ${e.taskId}.`});if(t?.status!=="MERGED"&&!g?.merged_at)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Task ${e.taskId} is not in MERGED hosted-close state.`});let f=await y5({gitRoot:o,taskId:e.taskId,explicitBranch:e.branch??null,mergeCommit:h});return {kind:"ready",plan:{taskId:e.taskId,gitRoot:o,workflowDir:e.ctx.config.paths.workflow_dir,repo:i,sourceBranch:s,baseBranch:c,mergeCommit:h,closeBranch:f,sourcePrNumber:typeof t?.pr_number=="number"?t.pr_number:typeof g?.number=="number"?g.number:null}}}var u_=u(()=>{G();ee();v();ho();wn();nt();N();});function wD(e,t,r){return t?.trim()?`${r} GitHub PR #${e}: ${t.trim()}`:`${r} GitHub PR #${e}`}function w5(e,t){if(t.level==="warn"){e.warn(t.message);return}e.info(t.message);}function bD(e){p_({notices:[],outcome:e});}function p_(e){let t=A();for(let r of e.notices)w5(t,r);switch(e.outcome.kind){case "canonical-already-present":{t.info(`hosted-close-pr skipped: ${e.outcome.taskId} is already closed on ${e.outcome.baseBranch||"the base branch"} for merge ${m_(e.outcome.mergeCommit)}`);return}case "base-already-recorded":{t.info(`hosted close already recorded on ${e.outcome.baseBranch}; no follow-up PR needed`),t.success("task hosted-close-pr",e.outcome.taskId,`hosted close already recorded on ${e.outcome.baseBranch}; skipped follow-up PR`);return}case "existing-pr":{t.success("task hosted-close-pr",e.outcome.taskId,wD(e.outcome.prNumber,e.outcome.prUrl,"linked to"));return}case "created-pr":{t.success("task hosted-close-pr",e.outcome.taskId,wD(e.outcome.prNumber,e.outcome.prUrl,"created"));return}}}var _D=u(()=>{I();u_();});var xD={};S(xD,{makeRunTaskHostedClosePrHandler:()=>vD,taskHostedClosePrSpec:()=>bi});async function b5(e){let t=await yD(e);if(t.kind==="skip")return bD(t.outcome),0;let r=gD(await pD(t.plan));return p_(r),0}function vD(e){return async(t,r)=>{try{let n=await e("task hosted-close-pr");for(let o of r.taskIds)await b5({ctx:n,cwd:t.cwd,rootOverride:t.rootOverride,taskId:o,branch:r.branch,repo:r.repo});return 0}catch(n){throw n instanceof m?n:E(n,{command:"task hosted-close-pr",root:t.rootOverride??null})}}}var bi,Rp=u(()=>{H();D();v();fD();hD();u_();_D();bi={id:["task","hosted-close-pr"],group:"Task",summary:"Open one or more follow-up hosted closure PRs from remote task-close branches.",args:[{name:"task-id",required:true,variadic:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"branch",valueHint:"<name>",description:"Optional explicit task-close branch name (default: derive from task PR metadata or remote refs)."},{kind:"string",name:"repo",valueHint:"<owner/name>",description:"Optional GitHub owner/repo override (defaults to origin remote)."}],examples:[{cmd:"agentplane task hosted-close-pr 202604091218-JREJ4K",why:"Open the hosted closure PR after the workflow left a manual handoff comment."},{cmd:"agentplane task hosted-close-pr 202604091725-CB0Y6S 202604091725-H21SCP",why:"Open multiple pending hosted closure PRs in one batch after a closure-wave merge."}],validateRaw:e=>{if((Array.isArray(e.args["task-id"])?e.args["task-id"]:typeof e.args["task-id"]=="string"?[e.args["task-id"]]:[]).map(n=>String(n).trim()).filter(Boolean).length===0)throw y({spec:bi,message:"Invalid value for task-id: empty."});if(typeof e.opts.branch=="string"&&e.opts.branch.trim()==="")throw y({spec:bi,message:"Invalid value for --branch: empty."});if(typeof e.opts.repo=="string"&&e.opts.repo.trim()==="")throw y({spec:bi,message:"Invalid value for --repo: empty."})},parse:e=>({taskIds:(Array.isArray(e.args["task-id"])?e.args["task-id"]:typeof e.args["task-id"]=="string"?[e.args["task-id"]]:[]).map(t=>String(t).trim()).filter(Boolean),branch:typeof e.opts.branch=="string"?e.opts.branch:null,repo:typeof e.opts.repo=="string"?e.opts.repo:null})};});async function Cp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=Ye.join(t.resolvedProject.gitRoot,t.config.paths.tasks_path);if(!t.taskBackend.exportProjectionSnapshot&&!t.taskBackend.exportTasksJson)throw new m({exitCode:3,code:"E_VALIDATION",message:tt("exportProjectionSnapshot()")});return await cm({ctx:t,outputPath:r}),process.stdout.write(`${Ye.relative(t.resolvedProject.gitRoot,r)}
283
+ `),0}catch(t){throw E(t,{command:"task export",root:e.rootOverride??null})}}var f_=u(()=>{D();I();v();N();});async function Pp(e){try{let t=await lintTasksFile({cwd:e.cwd,rootOverride:e.rootOverride??null});if(t.errors.length>0)throw new m({exitCode:3,code:"E_VALIDATION",message:t.errors.join(`
284
+ `)});return process.stdout.write(`OK
285
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"task lint",root:e.rootOverride??null})}}var g_=u(()=>{D();v();});async function k_(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=t.taskBackend;if(!r.getTaskDoc||!r.writeTask)throw new m({exitCode:2,code:"E_USAGE",message:tt("task docs")});return {ctx:t,backend:r}}function PD(e){return e.replaceAll(`\r
286
+ `,`
287
+ `).trim()}function R5(e){let t=ensureDocSections(e.currentDocRaw??"",e.requiredSections),r=be(t,"Plan")??"",n=PD(r)!==PD(e.text),o=ensureDocSections(setMarkdownSection(t,"Plan",e.text),e.requiredSections);return {currentPlan:r,nextPlan:be(o,"Plan")??"",planChanged:n,docChanged:o!==t,nextDoc:o}}function h_(e,t,r){let n=be(t,"Plan");if(!n||n.trim().length===0)throw new m({exitCode:3,code:"E_VALIDATION",message:`${e}: cannot ${r} plan: ## Plan section is missing or empty`})}function TD(e){if(h_(e.task.id,e.doc,"approve"),Tc({task:e.task,config:e.config,doc:e.doc,action:"approve plan"}),!(e.config.tasks.verify.enforce_on_plan_approve!==false))return;let r=ve(e.task.tags),n=(e.config.tasks.verify.spike_tag??"spike").trim().toLowerCase(),o=er(r,e.config),i=r.some(c=>c.trim().toLowerCase()===n);if((o||i)&&hn({taskId:e.task.id,sectionText:be(e.doc,"Verify Steps"),action:"approve plan",guidance:"fill it before approving plan"}),!i)return;let a=Xt(Se(e.task.doc_version)),s=Dt(e.doc,Se(e.task.doc_version));if(!s||s.trim().length===0)throw new m({exitCode:3,code:"E_VALIDATION",message:`${e.task.id}: cannot approve plan for spike: ## ${a} section is missing or empty (include Findings/Decision/Next Steps)`})}async function Tp(e){try{let{ctx:t,backend:r}=await k_({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride}),n=t.config,o=t.resolvedProject,i=typeof e.text=="string",a=typeof e.file=="string";if(i===a)throw new m({exitCode:2,code:"E_USAGE",message:"Provide exactly one of --text or --file."});let s;if(typeof e.updatedBy=="string"){let l=e.updatedBy.trim();if(!l)throw new m({exitCode:2,code:"E_USAGE",message:"Invalid value for --updated-by: empty."});s=l;}let c=e.text??"";if(i&&(c=Qt(c)),a)try{c=await readFile(Ye.resolve(e.cwd,e.file??""),"utf8");}catch(l){throw O(l,{command:"task plan set",filePath:e.file??""})}let d=Ye.join(o.gitRoot,n.paths.workflow_dir,e.taskId,"README.md");return await dt({ctx:t,taskId:e.taskId,build:async l=>{let p=(typeof l.doc=="string"?l.doc:"")||await r.getTaskDoc(l.id),{currentPlan:g,nextPlan:h,planChanged:f,docChanged:b}=R5({currentDocRaw:p,text:c,requiredSections:n.tasks.doc.required_sections});return !f&&!b&&!s?null:b?{intents:[tr({section:"Plan",text:h,requiredSections:n.tasks.doc.required_sections,expectedCurrentText:g}),...f?[Br({plan_approval:{state:"pending",updated_at:null,updated_by:null,note:null}})]:[],...s?[Ke({updatedBy:s})]:[]],writeOptions:{expectedCurrentText:g,expectedSection:"Plan"}}:{intents:[...f?[Br({plan_approval:{state:"pending",updated_at:null,updated_by:null,note:null}})]:[],...s?[Ke({updatedBy:s})]:[]]}}}),process.stdout.write(`${d}
288
+ `),0}catch(t){throw t instanceof m?t:E(t,{command:"task plan set",root:e.rootOverride??null})}}async function Sp(e){try{let{ctx:t,backend:r}=await k_({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride}),n=t.config,o=String(e.by??"").trim();if(!o)throw new m({exitCode:2,code:"E_USAGE",message:"Invalid value for --by: empty."});let i=typeof e.note=="string"?e.note.trim():"",a=Te();return await zc({ctx:t,local:async s=>{await s.get(e.taskId),await s.patch(e.taskId,c=>{let d=ensureDocSections(String(c.doc??""),n.tasks.doc.required_sections);return TD({task:c,config:n,doc:d}),{task:{plan_approval:{state:"approved",updated_at:a,updated_by:o,note:i||null}}}});},remote:async()=>{let s=await ue({ctx:t,taskId:e.taskId}),c=(typeof s.doc=="string"?s.doc:"")||await r.getTaskDoc(s.id),d=ensureDocSections(c??"",n.tasks.doc.required_sections);TD({task:s,config:n,doc:d}),await r.writeTask({...s,plan_approval:{state:"approved",updated_at:a,updated_by:o,note:i||null}});}}),0}catch(t){throw t instanceof m?t:E(t,{command:"task plan approve",root:e.rootOverride??null})}}async function Ep(e){try{let{ctx:t,backend:r}=await k_({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride}),n=t.config,o=String(e.by??"").trim();if(!o)throw new m({exitCode:2,code:"E_USAGE",message:"Invalid value for --by: empty."});let i=String(e.note??"").trim();if(!i)throw new m({exitCode:2,code:"E_USAGE",message:"Invalid value for --note: empty."});let a=Te();return await zc({ctx:t,local:async s=>{await s.get(e.taskId),await s.patch(e.taskId,c=>{let d=ensureDocSections(String(c.doc??""),n.tasks.doc.required_sections);return h_(c.id,d,"reject"),{task:{plan_approval:{state:"rejected",updated_at:a,updated_by:o,note:i||null}}}});},remote:async()=>{let s=await ue({ctx:t,taskId:e.taskId}),c=(typeof s.doc=="string"?s.doc:"")||await r.getTaskDoc(s.id),d=ensureDocSections(c??"",n.tasks.doc.required_sections);h_(s.id,d,"reject"),await r.writeTask({...s,plan_approval:{state:"rejected",updated_at:a,updated_by:o,note:i||null}});}}),0}catch(t){throw t instanceof m?t:E(t,{command:"task plan reject",root:e.rootOverride??null})}}var ad=u(()=>{D();I();v();N();rr();qr();le();});async function Ip(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});e.force&&await ce({action:"force_action",config:t.config,yes:e.yes===!0,reason:"block --force"});let{prefix:r,min_chars:n}=t.config.tasks.comments.blocked;bn(e.body,r,n);let o=_n({body:e.body,enabled:e.commitFromComment,config:t.config}),i=o.commentBody??e.body,a=Te(),s=await pi({ctx:t,taskId:e.taskId,quiet:e.quiet,policyAction:"task_block",build:()=>({at:a,toStatus:"BLOCKED",eventAuthor:e.author,updatedBy:e.author,note:i,comment:{author:e.author,body:i},force:e.force,dependencyPolicy:{kind:"none"},commentCommitPolicy:{enabled:e.commitFromComment,action:"block",confirmed:e.confirmStatusCommit,quiet:e.quiet}})}),c=null;if(e.commitFromComment&&(c=await Mr({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,primaryTag:s.primaryTag,author:e.author,statusFrom:s.execution.currentStatus,statusTo:"BLOCKED",commentBody:e.body,formattedComment:o.formattedComment,emoji:e.commitEmoji??Fr("BLOCKED"),allow:e.commitAllow,autoAllow:e.commitAutoAllow||e.commitAllow.length===0,allowTasks:e.commitAllowTasks,requireClean:e.commitRequireClean,quiet:e.quiet,resolveExecutorAgent:!0})),!e.quiet){let d=c?` (commit=${c.hash.slice(0,12)})`:"";un(C5,{kind:"success",action:"blocked",target:`${e.taskId}${d}`});}return 0}catch(t){throw t instanceof m?t:E(t,{command:"block",root:e.rootOverride??null})}}var C5,y_=u(()=>{D();I();v();Be();N();le();C5=A();});function SD(e){if(e instanceof Error){let t=e.message.trim();return t.length>0?t:e.name}return String(e)}function w_(e){let t=e.trim(),r=/^skip:([^:]+):\s*(.+)$/.exec(t);return r?{raw:t,taskId:r[1]?.trim()||null,kind:r[2]?.trim()||null}:{raw:t,taskId:null,kind:null}}function ED(e){let t=e.taskId?`task README for ${e.taskId}`:"a task README";switch(e.kind){case "invalid_readme_frontmatter":return {summary:`${t} has invalid frontmatter and could not be parsed`,likelyCause:`${t} has invalid frontmatter, so reconcile skipped it before the mutating command could run`,hint:"Fix the malformed task README frontmatter, then rerun the mutating command."};case "empty_or_invalid_frontmatter":return {summary:`${t} has empty or invalid frontmatter and could not be parsed`,likelyCause:`${t} is missing required frontmatter fields, so reconcile skipped it before the mutating command could run`,hint:"Restore valid task README frontmatter, then rerun the mutating command."};case "unreadable_readme":case "missing_or_unreadable_readme":return {summary:`${t} could not be read during task scan`,likelyCause:`${t} is missing or unreadable, so reconcile skipped it before the mutating command could run`,hint:"Restore or fix the task README file, then rerun the mutating command."};default:return null}}function T5(e){let t=ED(w_(e[0]??""));if(t){let o=e.length-1;return o<=0?t.summary:`${t.summary}; +${o} more task scan warning${o===1?"":"s"}`}let r=e.slice(0,3).join("; "),n=e.length>3?`; +${e.length-3} more`:"";return `skipped ${e.length} task files during scan (${r}${n})`}function S5(e){let t=ED(w_(e[0]??""));return t?{state:"mutation preflight cannot reconcile task artifacts",likelyCause:t.likelyCause,hint:t.hint,nextAction:{command:"agentplane task list --strict-read",reason:"surface the malformed or unreadable task README before retrying mutating commands",reasonCode:"reconcile_task_scan_incomplete"}}:{state:"mutation preflight found skipped task artifacts",likelyCause:"task scan skipped one or more task artifacts due to parse/read warnings, so the mutating command stopped before touching git state",hint:"Reconcile check failed due to task scan drift or parse/read errors.",nextAction:{command:"agentplane task list --strict-read",reason:"surface task scan/read failures before retrying mutating commands",reasonCode:"reconcile_task_scan_incomplete"}}}async function Tn(e){try{await e.ctx.git.statusChangedPaths();}catch(r){throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`reconcile check failed: cannot inspect git status (${SD(r)})`,context:{command:e.command,reason_code:"reconcile_git_state_unreadable"}})}if(e.strictTaskScan===false)return;try{await Er(e.ctx);}catch(r){throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`reconcile check failed: task scan error (${SD(r)})`,context:{command:e.command,reason_code:"reconcile_task_scan_failed"}})}let t=await E5(e.ctx,e.ctx.taskBackend.getLastListWarnings?.()??[]);if(t.length!==0)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`reconcile check failed: ${T5(t)}`,context:we({command:e.command,reason_code:"reconcile_task_scan_incomplete",warning_count:t.length},S5(t))})}async function E5(e,t){if(t.length===0||!Fe(e))return t;let r=[];for(let n of t){let o=w_(n);if(!o.taskId||o.kind!=="missing_or_unreadable_readme"&&o.kind!=="unreadable_readme"){r.push(n);continue}let i=o.taskId,a=Ye.join(e.resolvedProject.gitRoot,e.config.paths.workflow_dir,i,"README.md");await Yk({ctx:e,taskId:i,readmePath:a})||r.push(n);}return r}var sd=u(()=>{G();Et();v();N();});function ID(e){return e.replaceAll("\\","/").replace(/\/+$/,"")}function A5(e){let t=ID(e.relPath),n=`${ID(e.workflowDir)}/`;if(!t.startsWith(n)||!t.endsWith("/README.md"))return null;let i=t.slice(n.length).split("/");if(i.length!==2||i[1]!=="README.md")return null;let a=i[0]?.trim()??"";return !a||a===e.taskId?null:a}function O5(e){return normalizeTaskStatus(e)!=="DONE"}async function AD(e){if(e.ctx.config.workflow_mode!=="direct")return [];if(e.ctx.config.close_commit.direct_dirty_policy!=="allow_other_task_readmes")return [];let t=await e.ctx.git.statusUnstagedTrackedPaths(),r=new Set;for(let n of t){let o=A5({relPath:n,workflowDir:e.ctx.config.paths.workflow_dir,taskId:e.taskId});if(o)try{let i=await ue({ctx:e.ctx,taskId:o});O5(i.status)&&r.add(n);}catch{}}return [...r].toSorted((n,o)=>n.localeCompare(o))}var OD=u(()=>{N();});function M5(e){let t=e.stderr,r=e instanceof Error?[e.message,typeof t=="string"?t:""].filter(n=>n.trim().length>0).join(`
289
+ `):String(e);return /bad object/i.test(r)||/unknown revision/i.test(r)||/ambiguous argument/i.test(r)}function ND(e){return [...new Set(e)].toSorted((t,r)=>t.localeCompare(r))}function F5(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}function B5(e){let t=e.replaceAll("\\","/");return t.startsWith(".agentplane/tasks/")||t.startsWith("tasks/")}function DD(e){let t=e.trim().replaceAll(/\s+/g," ");return t.length>90?`${t.slice(0,87)}...`:t}function L5(e,t){return e.slice(0,Math.max(0,Math.floor(t)))}async function q5(e,t){let r;try{({stdout:r}=await execFileAsync("git",["show","--numstat","--format=",t],{cwd:e,env:gitEnv(),encoding:"buffer",maxBuffer:10*1024*1024}));}catch(i){if(M5(i))return [];throw i}let n=Buffer.isBuffer(r)?r.toString("utf8"):String(r),o=[];for(let i of n.split(`
290
+ `)){let a=i.trim();if(!a)continue;let s=a.split(" ");if(s.length<3)continue;let[c,d,l]=s,p=String(l??"").trim();if(!p)continue;let g=c==="-"?0:Number(c),h=d==="-"?0:Number(d),f=(Number.isFinite(g)?g:0)+(Number.isFinite(h)?h:0);o.push({file:p,added:Number.isFinite(g)?g:0,deleted:Number.isFinite(h)?h:0,churn:f});}return o}function H5(e){let r=[...e.entries].toSorted((n,o)=>o.churn!==n.churn?o.churn-n.churn:n.file.localeCompare(o.file)).map(n=>n.file).filter(n=>!B5(n));return L5(F5(r),e.limit)}function G5(e){let r=ND(e.map(s=>s.trim()).filter(Boolean)).filter(s=>s!=="spike"),o=r.slice(0,4),i=r.length-o.length;if(o.length===0)return "";let a=o.join(",");return i>0?`[${a},+${i}]`:`[${a}]`}function V5(e){return ND(e.map(r=>r.trim()).filter(Boolean)).join(", ")}function U5(e,t){let r=e.trim().replaceAll(/\s+/g," ");if(!r)return "";let n=Math.max(1,Math.floor(t));return r.length>n?`${r.slice(0,Math.max(1,n-3))}...`:r}function W5(e,t){if(t)return "not required (spike)";let r=e.verification?.state??"pending",n=typeof e.verification?.note=="string"?e.verification.note:"";if(r==="ok"&&n.trim())return U5(n,120);let o=Array.isArray(e.verify)?e.verify.filter(i=>typeof i=="string"&&i.trim()):[];return o.length>0?o.join("; "):r==="ok"?"ok (see task verification note)":String(r)}async function jD(e){let t=e.task,r=Array.isArray(t.tags)?t.tags.filter(_=>typeof _=="string"):[],n=r.includes("spike");if(normalizeTaskStatus(t.status)!=="DONE")throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Task is not DONE: ${t.id}`});let o=t.commit?.hash?.trim()??"";if(!o)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Task is missing recorded commit metadata: ${t.id} (finish with --commit or set commit on the task).`});let i=extractTaskSuffix(t.id),a=typeof t.result_summary=="string"?t.result_summary.trim():"",s=a?DD(a):`${DD(t.title)} (no result_summary)`,c=G5(r),l=`${n?"\u{1F9EA}":"\u2705"} ${i} close: ${s} (${t.id})${c?` ${c}`:""}`,p=W5(t,n),g=await q5(e.gitRoot,o),h=H5({entries:g,limit:e.keyFilesLimit??5}),f=h.length>0?h.join(", "):"(none)",b=[];t.breaking===true&&b.push("breaking"),typeof t.risk_level=="string"&&t.risk_level.trim()&&b.push(`risk=${t.risk_level.trim()}`);let w=[`Scope: ${V5(r)||"(none)"}`,`Verify: ${p}`,`Key files: ${f}`,b.length>0?`Notes: ${b.join("; ")}`:null].filter(_=>typeof _=="string");return {subject:l,body:w.join(`
291
+ `)}}function $D(e){return Ye.join(e.gitRoot,e.workflowDir,e.taskId,"README.md")}var MD=u(()=>{G();v();});function FD(e){if(!e)return "";let t="";for(let r=0;r<e.length;r+=1){if(e.codePointAt(r)===27&&e[r+1]==="["){for(r+=2;r<e.length&&e[r]!=="m";)r+=1;continue}t+=e[r]??"";}return t}var BD=u(()=>{});function LD(e){return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):""}function Q5(e){let t=e.replaceAll(`\r
292
+ `,`
293
+ `).split(`
294
+ `).map(i=>FD(i).trimEnd()).filter(i=>i.trim().length>0).map(i=>i.length>180?`${i.slice(0,180)} [truncated]`:i);if(t.length<=12)return t;let r=new Set;for(let i=0;i<Math.min(6,t.length);i+=1)r.add(i);for(let i=Math.max(t.length-6,0);i<t.length;i+=1)r.add(i);for(let[i,a]of t.entries())!r.has(i)&&K5.some(s=>s.test(a))&&r.add(i);let n=[],o=-1;for(let i of [...r].toSorted((a,s)=>a-s))o>=0&&i-o>1&&n.push(`[${i-o-1} lines omitted]`),n.push(t[i]??""),o=i;return n}function X5(e){return J5.some(t=>t.test(e))?"formatter":Y5.some(t=>t.test(e))?"eslint":null}function Z5(e,t){let r=X5(t);return r==="formatter"?{state:e==="close_commit"?"git rejected the generated close commit":"git rejected the requested task-scoped commit",likelyCause:e==="close_commit"?"a formatting check in the pre-commit path rejected the deterministic close commit after the task README was staged":"a formatting check in the pre-commit path rejected the staged task-scoped commit",nextAction:{command:"bun run format",reason:"apply formatter fixes before retrying the commit flow",reasonCode:"git_pre_commit_format"}}:r==="eslint"?{state:e==="close_commit"?"git rejected the generated close commit":"git rejected the requested task-scoped commit",likelyCause:e==="close_commit"?"a lint check in the pre-commit path rejected the deterministic close commit after the task README was staged":"a lint check in the pre-commit path rejected the staged task-scoped commit",nextAction:{command:"bun run lint:core",reason:"rerun lint and fix the reported error before retrying the commit flow",reasonCode:"git_pre_commit_lint"}}:e==="close_commit"?{state:"git rejected the generated close commit",likelyCause:"a hook or commit policy blocked the deterministic task close commit after the task README was staged",nextAction:{command:"git status --short --untracked-files=no",reason:"inspect the staged close-commit payload before fixing the hook or policy failure",reasonCode:"git_close_commit_blocked"}}:{state:"git rejected the requested task-scoped commit",likelyCause:"a hook or commit policy blocked the staged changes after guard validation passed",nextAction:{command:"git status --short --untracked-files=no",reason:"inspect the staged task-scoped payload before fixing the hook or policy failure",reasonCode:"git_task_commit_blocked"}}}function qD(e,t){if(!(e instanceof Error))return null;let r=e,n=typeof r.shortMessage=="string"?r.shortMessage:"",o=typeof r.message=="string"?r.message:"",a=(typeof r.cmd=="string"?r.cmd:typeof r.escapedCommand=="string"?r.escapedCommand:/^Command failed(?: with exit code \d+)?: ([^\n]+)$/m.exec(n)?.[1]??/^Command failed(?: with exit code \d+)?: ([^\n]+)$/m.exec(o)?.[1]??"").trim();if(!a.startsWith("git commit"))return null;let s=[LD(r.stderr),LD(r.stdout)].filter(p=>p.length>0).join(`
295
+ `),c=Q5(s),d=typeof r.code=="number"?r.code:null,l=["git commit failed (hook or commit policy).",`command: ${a}`];return typeof d=="number"&&l.push(`exit_code: ${d}`),c.length>0&&l.push("output_summary:"),l.push(...c.map(p=>` ${p}`)),new m({exitCode:5,code:"E_GIT",message:l.join(`
296
+ `),context:we({command:"commit"},Z5(t,s))})}var K5,J5,Y5,HD=u(()=>{BD();Et();v();K5=[/Code style issues found/i,/Run Prettier with --write/i,/\bESLint\b/i,/\b[0-9]+\s+problems?\b/i,/\berror\b/i,/\bfailed\b/i,/✖/],J5=[/Code style issues found/i,/Run Prettier with --write/i],Y5=[/\bESLint\b/i,/\b[0-9]+\s+problems?\b/i];});async function oY(e){let t=Ye.resolve(e.resolvedProject.gitRoot),r=Ye.resolve(t,e.config.paths.workflow_dir),n=Ye.resolve(Vl(r)),o=Ye.relative(t,n);if(!(!o||o.startsWith(".."))){try{await execFileAsync("git",["ls-files","--error-unmatch","--",o],{cwd:t,env:gitEnv()});let i=o.split(Ye.sep).join("/"),a=await execFileAsync("git",["show",`HEAD:${i}`],{cwd:t,env:gitEnv()});await mkdir(Ye.dirname(n),{recursive:!0}),await writeFile(n,a.stdout,"utf8"),await execFileAsync("git",["restore","--staged","--",o],{cwd:t,env:gitEnv()});}catch{await rm$1(n,{force:true});}e.git.invalidateStatus();}}async function iY(e){let t=new Set([e.readmeRel]);if(e.allowPolicy){let r=await e.ctx.git.statusChangedPaths();for(let n of r)fa({filePath:n,tasksPath:e.ctx.config.paths.tasks_path,workflowDir:e.ctx.config.paths.workflow_dir,taskId:e.taskId})==="policy"&&t.add(n);}await e.ctx.git.stage([...t].toSorted((r,n)=>r.localeCompare(n)));}async function aY(e){if((await e.ctx.git.statusChangedPaths()).filter(i=>gw({workflowDir:e.ctx.config.paths.workflow_dir,taskId:e.taskId,tasksPath:e.ctx.config.paths.tasks_path,relPath:i})).length===0)return null;await Ta({ctx:e.ctx,allow:[],allowTasks:true,allowPolicy:false,allowConfig:false,allowHooks:false,allowCI:false,tasksPath:e.ctx.config.paths.tasks_path,workflowDir:e.ctx.config.paths.workflow_dir,taskId:e.taskId,allowTaskOnly:true,emptyAllowMessage:"PR artifact refresh produced no task-local files to stage for the follow-up commit.",noMatchMessage:"PR artifact refresh produced changes outside the active task artifact scope; inspect the working tree before retrying the commit flow."});let n=buildTaskArtifactRefreshCommitSubject({taskId:e.taskId,baseSubject:e.sourceMessage});await mo({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,baseBranchOverride:null,taskId:e.taskId,message:n,allow:[],allowBase:false,allowTasks:true,allowPolicy:false,allowConfig:false,allowHooks:false,allowCI:false,requireClean:true});let o=kn({taskId:e.taskId,allowTasks:true,allowBase:false,allowPolicy:false,allowConfig:false,allowHooks:false,allowCI:false,gitIdentity:await lo()});return await e.ctx.git.commit({message:n,env:o}),await e.ctx.git.headHashSubject()}function sY(e){return e.allow.some(t=>t.trim().length>0)||e.allowTasks||e.allowPolicy||e.allowConfig||e.allowHooks||e.allowCI}function GD(e){return e?`${e.hash?.slice(0,12)??""} ${e.subject??""}`.trim():""}async function Dp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});if(e.close)return await cY({...e,ctx:t});if(e.autoAllow)throw new m({exitCode:2,code:"E_USAGE",message:"--auto-allow is disabled; pass explicit --allow <path-prefix>."});await Tn({ctx:t,command:"commit"});let r=[];if((await t.git.statusStagedPaths()).length===0){if(!sY(e))throw new m({exitCode:2,code:"E_USAGE",message:"No staged files and no commit allowlist. Pass --allow <path-prefix>, use --allow-tasks for active task artifacts, or stage files manually."});r=await Ta({ctx:t,allow:e.allow,allowTasks:e.allowTasks,allowPolicy:e.allowPolicy,allowConfig:e.allowConfig,allowHooks:e.allowHooks,allowCI:e.allowCI,tasksPath:t.config.paths.tasks_path,workflowDir:t.config.paths.workflow_dir,taskId:e.taskId,allowTaskOnly:!0,emptyAllowMessage:"No staged files and no commit allowlist. Pass --allow <path-prefix>, use --allow-tasks for active task artifacts, or stage files manually.",noMatchMessage:"No changed files matched the commit allowlist (adjust --allow, protected allow flags, or --allow-tasks; otherwise stage files manually)."}),e.quiet||process.stdout.write(`${K(`commit auto-staged ${r.length} path(s) from allowlist`)}
297
+ `);}await mo({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,baseBranchOverride:e.baseBranchOverride??null,taskId:e.taskId,message:e.message,allow:e.allow,allowBase:e.allowBase,allowTasks:e.allowTasks,allowPolicy:e.allowPolicy,allowConfig:e.allowConfig,allowHooks:e.allowHooks,allowCI:e.allowCI,requireClean:e.requireClean,quiet:e.quiet});let o=kn({taskId:e.taskId,allowTasks:e.allowTasks,allowBase:e.allowBase,allowPolicy:e.allowPolicy,allowConfig:e.allowConfig,allowHooks:e.allowHooks,allowCI:e.allowCI,gitIdentity:await lo()});await t.git.commit({message:e.message,env:o});let i=await t.git.headHashSubject();await Gc({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,quiet:e.quiet}),t.git.invalidateStatus();let a=await aY({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,sourceMessage:e.message,quiet:e.quiet});return e.quiet||process.stdout.write(`${z("committed",GD(i),[r.length>0?`staged=${r.join(", ")}`:null,a?`refresh=${GD(a)}`:null].filter(Boolean).join("; ")||void 0)}
298
+ `),0}catch(t){if(t instanceof m)throw t;let r=qD(t,e.close?"close_commit":"task_commit");throw r||O(t,{command:"commit",root:e.rootOverride??null})}}async function cY(e){e.closeCheckOnly||(await Tn({ctx:e.ctx,command:"commit"}),await oY(e.ctx));let t=await e.ctx.git.statusStagedPaths();if(t.length>0&&e.closeUnstageOthers&&(e.closeCheckOnly||await execFileAsync("git",["restore","--staged","--","."],{cwd:e.ctx.resolvedProject.gitRoot,env:gitEnv()}),t=e.closeCheckOnly?t:await e.ctx.git.statusStagedPaths()),t.length>0&&!e.closeUnstageOthers)throw new m({exitCode:5,code:"E_GIT",message:"Staged files exist (close commit requires an empty index; rerun with --unstage-others to auto-unstage).",context:we({command:"commit"},{state:"close commit cannot run with a non-empty git index",likelyCause:"deterministic close commits only stage the active task artifact scope, but other staged files are already in the index",nextAction:{command:"git restore --staged -- .",reason:"clear the current index before rerunning the close commit flow",reasonCode:"git_close_commit_dirty_index"}})});let r=await ue({ctx:e.ctx,taskId:e.taskId}),n=await jD({gitRoot:e.ctx.resolvedProject.gitRoot,task:r}),o=$D({gitRoot:e.ctx.resolvedProject.gitRoot,workflowDir:e.ctx.config.paths.workflow_dir,taskId:e.taskId}),i=o.startsWith(e.ctx.resolvedProject.gitRoot)?o.slice(e.ctx.resolvedProject.gitRoot.length+1):o;if(e.closeCheckOnly){if(!e.quiet){let c=t.length,d=c>0&&e.closeUnstageOthers?`; would unstage ${c} path(s)`:"";process.stdout.write(`${z("close preflight",e.taskId,`subject=${n.subject}${d}`)}
299
+ `);}return 0}e.closeStageTaskArtifacts===true&&(e.closeRefreshTaskArtifacts!==false&&await Gc({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,quiet:e.quiet}),e.ctx.git.invalidateStatus()),await(e.closeStageTaskArtifacts===true?Ta({ctx:e.ctx,allow:[],allowTasks:true,allowPolicy:e.allowPolicy,tasksPath:e.ctx.config.paths.tasks_path,workflowDir:e.ctx.config.paths.workflow_dir,taskId:e.taskId,allowTaskOnly:true,emptyAllowMessage:"No changed task artifacts to stage for the deterministic close commit.",noMatchMessage:"No changed files matched the active task artifact scope for the deterministic close commit."}):iY({ctx:e.ctx,readmeRel:i,taskId:e.taskId,allowPolicy:e.allowPolicy}));let a=await AD({ctx:e.ctx,taskId:e.taskId});await mo({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,baseBranchOverride:e.baseBranchOverride??null,taskId:e.taskId,message:n.subject,allow:[],allowBase:e.allowBase,allowTasks:true,allowPolicy:e.allowPolicy,allowConfig:false,allowHooks:false,allowCI:false,requireClean:true,ignoredUnstagedTrackedPaths:a,quiet:e.quiet});let s=kn({taskId:e.taskId,allowTasks:true,allowBase:e.allowBase,allowPolicy:e.allowPolicy,allowConfig:false,allowHooks:false,allowCI:false,allowStaleDist:true,gitIdentity:await lo()});if(await e.ctx.git.commit({message:n.subject,body:n.body,env:s}),!e.quiet){let{hash:c,subject:d}=await e.ctx.git.headHashSubject();process.stdout.write(`${z("committed",`${c?.slice(0,12)??""} ${d??""}`.trim())}
300
+ `);}return 0}var b_=u(()=>{Zh();D();I();Et();v();Jo();Tw();$c();N();sd();Oc();OD();MD();HD();Ic();gu();});function Np(e){return typeof e=="string"?e.trim():""}function lY(e,t){if(!t)return true;let r=v_(e);return r?r.hash===t.hash&&r.message===t.message:false}function mY(e){if(normalizeTaskStatus(e.task.status)!=="DONE")return false;let t=e.task.comments?.at(-1)??null,r=e.task.events?.at(-1)??null;return !(t?.author!==e.author||Np(t.body)!==Np(e.body)||r?.type!=="status"||r.author!==e.author||String(r.from??"").toUpperCase()!=="DOING"||String(r.to??"").toUpperCase()!=="DONE"||Np(r.note)!==Np(e.body)||!lY(e.task,e.taskCommitInfo)||e.taskId===e.metaTaskId&&((e.task.result_summary??"")!==e.resultSummary||(e.task.risk_level??void 0)!==e.riskLevel||!!e.task.breaking!==e.breaking))}function v_(e){let t=typeof e.commit?.hash=="string"?e.commit.hash.trim():"";if(!t)return null;let r=typeof e.commit?.message=="string"?e.commit.message.trim():"";return {hash:t,message:r}}function __(e){if(!e.force&&normalizeTaskStatus(e.task.status)==="DONE")throw new m({exitCode:2,code:"E_USAGE",message:`Task is already DONE: ${e.task.id} (use --force to override)`});Vc(e.task,e.config);let t=ensureDocSections(typeof e.task.doc=="string"?e.task.doc:"",e.config.tasks.doc.required_sections);if(Tc({task:e.task,config:e.config,doc:t,action:"finish task"}),!e.isMetaTask)return;if(!(Array.isArray(e.task.tags)?e.task.tags.filter(o=>typeof o=="string"):[]).includes("spike")&&e.taskCount===1&&!e.resultSummary)throw new m({exitCode:2,code:"E_USAGE",message:"Missing required --result for non-spike tasks."});if(e.resultProvided&&!e.resultSummary)throw new m({exitCode:2,code:"E_USAGE",message:"Invalid value for --result: empty."})}async function x_(e){if(e.useStore){let r=null,n=null,o=null;if(await Nu(e.store,e.taskId,i=>(__({task:i,config:e.ctx.config,taskCount:e.taskCount,isMetaTask:e.taskId===e.metaTaskId,resultProvided:e.resultProvided,resultSummary:e.resultSummary,force:e.force}),r=i,e.capturePrimaryLifecycleMeta&&(n=normalizeTaskStatus(i.status),o=Nt(ve(i.tags),e.ctx).primary),[])),!r)throw new m({exitCode:4,code:"E_IO",message:`Task not found: ${e.taskId}`});return {loaded:{taskId:e.taskId,task:r},primaryStatusFrom:n,primaryTag:o}}let t=await ue({ctx:e.ctx,taskId:e.taskId});return __({task:t,config:e.ctx.config,taskCount:e.taskCount,isMetaTask:e.taskId===e.metaTaskId,resultProvided:e.resultProvided,resultSummary:e.resultSummary,force:e.force}),{loaded:{taskId:e.taskId,task:t},primaryStatusFrom:e.capturePrimaryLifecycleMeta?normalizeTaskStatus(t.status):null,primaryTag:e.capturePrimaryLifecycleMeta?Nt(ve(t.tags),e.ctx).primary:null}}async function Wa(e){let t=Fe(e.ctx),r=t?Lr(e.ctx):null,n=e.loadedTasks.length;for(let o of e.loadedTasks){let{taskId:i,task:a}=o,s=Te(),c=async d=>(__({task:d,config:e.ctx.config,taskCount:n,isMetaTask:i===e.metaTaskId,resultProvided:e.resultProvided,resultSummary:e.resultSummary,force:e.force}),e.force&&mY({task:d,author:e.author,body:e.body,resultSummary:e.resultSummary,metaTaskId:e.metaTaskId,taskId:i,riskLevel:e.riskLevel,breaking:e.breaking,taskCommitInfo:e.taskCommitInfo})?{intents:[],nextTask:d}:await ui({task:d,backend:e.ctx.taskBackend,config:e.ctx.config,at:s,toStatus:"DONE",eventAuthor:e.author,updatedBy:e.author,note:e.body,comment:{author:e.author,body:e.body},commit:e.taskCommitInfo?{hash:e.taskCommitInfo.hash,message:e.taskCommitInfo.message}:void 0,extraFields:{...i===e.metaTaskId&&e.resultSummary?{result_summary:e.resultSummary}:{},...i===e.metaTaskId&&e.riskLevel?{risk_level:e.riskLevel}:{},...i===e.metaTaskId&&e.breaking?{breaking:true}:{}},force:true,dependencyPolicy:{kind:"none"}}));if(t){let d=await Nu(r,i,async l=>(await c(l)).intents);o.task=d.task;}else {let d=await c(a);await e.ctx.taskBackend.writeTask(d.nextTask),o.task=d.nextTask;}}}async function Sn(e){await Dp({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,baseBranchOverride:e.baseBranchOverride??null,taskId:e.taskId,message:"",close:true,allow:[],autoAllow:false,allowTasks:true,allowBase:e.ctx.config.workflow_mode==="branch_pr",allowPolicy:e.allowPolicy===true,allowConfig:false,allowHooks:false,allowCI:false,requireClean:true,quiet:e.quiet,closeUnstageOthers:e.closeUnstageOthers===true,closeCheckOnly:false,closeStageTaskArtifacts:e.ctx.config.workflow_mode==="branch_pr",closeRefreshTaskArtifacts:e.closeRefreshTaskArtifacts});}var cd=u(()=>{v();b_();N();qr();le();});async function VD(e){let t=Ye.join(e.agentplaneDir,"cache","direct-work.json");try{let r=await readFile(t,"utf8"),n=JSON.parse(r),o=n&&typeof n.task_id=="string"?n.task_id:null;if(!o||!e.taskIds.includes(o))return;await rm$1(t,{force:!0});}catch{}}async function UD(e){if(e.ctx.config.workflow_mode!=="branch_pr")return;let t=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:e.baseBranchOverride??null,mode:e.ctx.config.workflow_mode});if(!t)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Base branch could not be resolved (use `agentplane branch base set` or --base)."});let r=await gitCurrentBranch(e.ctx.resolvedProject.gitRoot);if(r!==t)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`finish must run on base branch ${t} in branch_pr mode (current: ${r}); integrate first or reconcile from the base checkout.`})}async function hY(e){let{stdout:t}=await execFileAsync("git",["rev-parse","HEAD"],{cwd:e,env:gitEnv()}),r=t.trim();if(!r)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:"Failed to resolve HEAD while preparing a branch_pr close tail."});return r}function kY(e,t){return `task-close/${e}/${t.slice(0,12)}`}async function WD(e){let t=e.ctx.resolvedProject.gitRoot,r=await gitCurrentBranch(t);if(await xp({gitRoot:t,workflowDir:e.ctx.config.paths.workflow_dir,taskId:e.taskId,baseBranch:r}))return null;let o=await hY(t),i=kY(e.taskId,o),a=await gitBranchExists(t,i);await execFileAsync("git",a?["checkout",i]:["checkout","-b",i],{cwd:t,env:gitEnv()});let s=null;try{await Sn({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,baseBranchOverride:e.baseBranchOverride,quiet:e.quiet,closeUnstageOthers:e.closeUnstageOthers,allowPolicy:e.allowPolicy});}finally{try{await execFileAsync("git",["checkout",r],{cwd:t,env:gitEnv()});}catch(c){s=c;}}if(s)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`Created ${i} but failed to return to ${r}; inspect the local checkout before continuing.`});return i}var P_=u(()=>{G();v();Ee();l_();cd();});function $p(e,t){let r=t.trim();if(!r)throw new m({exitCode:2,code:"E_USAGE",message:`Invalid value for --${e}: empty.`});return r}function KD(e){let t=new Set,r=[];for(let n of e){let o=n.trim();if(!o)continue;let i=o.toLowerCase();t.has(i)||(t.add(i),r.push(o));}return r}function bY(e){let t=e.fixability??(e.external?"external":null),r=[`- Observation: ${$p("observation",e.observation)}`,` Impact: ${$p("impact",e.impact)}`,` Resolution: ${$p("resolution",e.resolution)}`];e.promote&&r.push(" Promotion: incident-candidate"),t==="external"&&r.push(" Fixability: external"),t==="repo-fixable"&&r.push(" Fixability: repo-fixable"),e.incidentScope?.trim()&&r.push(` IncidentScope: ${e.incidentScope.trim()}`);let n=KD(e.incidentTags);n.length>0&&r.push(` IncidentTags: ${n.join(", ")}`);let o=KD(e.incidentMatch);return o.length>0&&r.push(` IncidentMatch: ${o.join(", ")}`),e.incidentAdvice?.trim()&&r.push(` IncidentAdvice: ${e.incidentAdvice.trim()}`),e.incidentRule?.trim()&&r.push(` IncidentRule: ${e.incidentRule.trim()}`),r.join(`
301
+ `)}function _Y(e,t){let r=(e??"").trim();return r?`${r}
302
+
303
+ ${t}`:t}function dd(e){let t=typeof e.current.doc=="string"?e.current.doc:"",r=Se(e.current.doc_version),n=Xt(r),o=so({allowedSections:e.config.tasks.doc.sections,requiredSections:e.config.tasks.doc.required_sections,targetSection:n}),i=Dt(t,r),a=bY({observation:e.observation,impact:e.impact,resolution:e.resolution,promote:e.promote,external:e.external,fixability:e.fixability??null,incidentScope:e.incidentScope,incidentTags:e.incidentTags,incidentMatch:e.incidentMatch,incidentAdvice:e.incidentAdvice,incidentRule:e.incidentRule}),s=_Y(i,a),c=ensureDocSections(setMarkdownSection(t,n,s),o);if(normalizeTaskDoc(t)===normalizeTaskDoc(c)&&!e.updatedBy)return null;let d=be(t,n),l=[tr({section:n,text:s,requiredSections:o,expectedCurrentText:d}),...e.updatedBy?[Ke({updatedBy:e.updatedBy})]:[]];return {targetSection:n,expectedCurrentText:d,intents:l}}function vY(e){return e.promote&&e.external?e.branchPr?`incident candidate recorded for ${e.taskId}; incidents.md updates later during finish, \`verify --collect-incidents\`, or \`agentplane incidents collect <task-id>\`; task-local until base-branch promotion in the current task worktree`:`incident candidate recorded for ${e.taskId}; incidents.md updates later during finish, \`verify --collect-incidents\`, or \`agentplane incidents collect <task-id>\`; task-local in the current checkout until promotion`:`task-local finding recorded for ${e.taskId}; incidents.md unchanged in the current checkout`}async function JD(e){let t;e.updatedBy!==void 0&&(t=$p("updated-by",e.updatedBy));try{let r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=r.taskBackend,o=r.config,i=r.resolvedProject;if(!n.getTaskDoc||!n.writeTask)throw new m({exitCode:2,code:"E_USAGE",message:"Configured task backend does not support task docs."});let a="Findings";await dt({ctx:r,taskId:e.taskId,build:c=>{let d=dd({current:c,config:o,observation:e.observation,impact:e.impact,resolution:e.resolution,promote:e.promote,external:e.external,fixability:e.fixability??null,incidentScope:e.incidentScope,incidentTags:e.incidentTags,incidentMatch:e.incidentMatch,incidentAdvice:e.incidentAdvice,incidentRule:e.incidentRule,updatedBy:t});return d?(a=d.targetSection,{intents:d.intents,writeOptions:{expectedCurrentText:d.expectedCurrentText,expectedSection:a}}):null}});let s=`${i.gitRoot}/${o.paths.workflow_dir}`;return process.stdout.write(`${s}/${e.taskId}/README.md
304
+ `),process.stderr.write(`${K(`task findings add outcome=entry-appended section=${a}`)}
305
+ `),process.stderr.write(`${K(vY({promote:e.promote,external:e.external,taskId:e.taskId,branchPr:o.workflow_mode==="branch_pr"}))}
306
+ `),0}catch(r){throw r instanceof m?r:E(r,{command:"task findings add",root:e.rootOverride??null})}}var Mp=u(()=>{D();I();v();N();rr();qr();le();Ca();});async function YD(e){await dt({ctx:e.ctx,taskId:e.taskId,build:t=>{let r=dd({current:t,config:e.ctx.config,observation:e.finding.observation,impact:e.finding.impact,resolution:e.finding.resolution,promote:!e.finding.localOnly,external:!e.finding.localOnly,fixability:e.finding.repoFixable?"repo-fixable":null,incidentScope:e.finding.incidentScope,incidentTags:e.finding.incidentTags,incidentMatch:e.finding.incidentMatch,incidentAdvice:e.finding.incidentAdvice,incidentRule:e.finding.incidentRule,updatedBy:e.author});return r?{intents:r.intents}:null}});}var QD=u(()=>{rr();Mp();});async function ZD(e){let{ctx:t,options:r,plan:n}=e;await xY({ctx:t,options:r,plan:n});let o=await RY({ctx:t,options:r,plan:n});await XD({ctx:t,taskIds:r.taskIds,loadedTasks:o.loadedTasks,write:false});let i=o.loadedTasks.filter(({task:d})=>!v_(d)).map(({taskId:d})=>d);if(!r.commitFromComment&&!r.commit&&i.length>0)throw new m({exitCode:2,code:"E_USAGE",message:"finish requires --commit <hash> or existing task commit metadata on every task; implicit HEAD fallback was removed."});(r.commitFromComment||n.statusCommitRequested)&&Sw({policy:t.config.status_commit_policy,action:"finish",confirmed:r.confirmStatusCommit,quiet:r.quiet,statusFrom:o.primaryStatusFrom??"UNKNOWN",statusTo:"DONE"});let a=await CY({ctx:t,options:r,plan:n,primaryStatusFrom:o.primaryStatusFrom,primaryTag:o.primaryTag});await Wa({ctx:t,loadedTasks:o.loadedTasks,metaTaskId:n.metaTaskId,author:r.author,body:r.body,force:r.force,resultProvided:n.resultProvided,resultSummary:n.resultSummary,riskLevel:n.riskLevel,breaking:n.breaking,taskCommitInfo:a});let s=await XD({ctx:t,taskIds:r.taskIds,loadedTasks:o.loadedTasks,write:true}),c=s.plans.reduce((d,l)=>d+l.promotable.length,0);if(await PY({ctx:t,options:r,plan:n,primaryTaskId:n.primaryTaskId,promotedIncidents:c}),t.config.workflow_mode==="direct"&&await VD({agentplaneDir:t.resolvedProject.agentplaneDir,taskIds:r.taskIds}),!r.quiet){let d=s.plans[0]??{candidates:[],skipped:[],promotable:[],duplicates:[]};process.stdout.write(`${wr(d,{wrote:c>0,context:"finish",promotedIds:d.promotable.map(l=>l.entry.id),registryPaths:s.registryPaths[0]??[],taskId:r.taskIds[0]??null})}
307
+ `),process.stdout.write(`finished
308
+ `);}return 0}async function xY(e){let{ctx:t,options:r,plan:n}=e;!n.finishFinding||!n.primaryTaskId||(await x_({ctx:t,store:n.store,useStore:n.useStore,taskId:n.primaryTaskId,taskCount:r.taskIds.length,metaTaskId:n.metaTaskId,resultProvided:n.resultProvided,resultSummary:n.resultSummary,force:r.force,capturePrimaryLifecycleMeta:false}),await YD({ctx:t,taskId:n.primaryTaskId,author:r.author,finding:n.finishFinding}));}async function RY(e){let{ctx:t,options:r,plan:n}=e,o=null,i=null,a=[];for(let s of r.taskIds){let c=await x_({ctx:t,store:n.store,useStore:n.useStore,taskId:s,taskCount:r.taskIds.length,metaTaskId:n.metaTaskId,resultProvided:n.resultProvided,resultSummary:n.resultSummary,force:r.force,capturePrimaryLifecycleMeta:s===n.primaryTaskId});a.push(c.loaded),s===n.primaryTaskId&&(o=c.primaryStatusFrom,i=c.primaryTag);}return {loadedTasks:a,primaryStatusFrom:o,primaryTag:i}}async function XD(e){let t=[],r=[];for(let n of e.taskIds){let o=e.loadedTasks.find(a=>a.taskId===n)??null,i=await kt({ctx:e.ctx,taskId:n,task:o?.task??null,write:e.write});t.push(i.plan),r.push(i.registryPaths);}return {plans:t,registryPaths:r}}async function CY(e){let{ctx:t,options:r,plan:n,primaryStatusFrom:o,primaryTag:i}=e,a=r.commit?await vn(t.resolvedProject.gitRoot,r.commit):null,s=r.commitFromComment||n.statusCommitRequested?_n({body:r.body,enabled:true,config:t.config}):null;if(r.commitFromComment){if(typeof r.commitEmoji=="string"&&r.commitEmoji.trim()!=="\u2705")throw new m({exitCode:2,code:"E_USAGE",message:Ot("--commit-emoji",r.commitEmoji,"\u2705 (finish commits must use a checkmark)")});a=await Mr({ctx:t,cwd:r.cwd,rootOverride:r.rootOverride,taskId:n.primaryTaskId,primaryTag:i??"meta",author:r.author,statusFrom:o??void 0,statusTo:"DONE",commentBody:r.body,formattedComment:s?.formattedComment??null,emoji:r.commitEmoji??Fr("DONE"),allow:r.commitAllow,autoAllow:false,allowTasks:r.commitAllowTasks,requireClean:r.commitRequireClean,quiet:r.quiet,progressMessage:"creating commit from verification comment",resolveExecutorAgent:true});}if(n.statusCommitRequested){if(typeof r.statusCommitEmoji=="string"&&r.statusCommitEmoji.trim()!=="\u2705")throw new m({exitCode:2,code:"E_USAGE",message:Ot("--status-commit-emoji",r.statusCommitEmoji,"\u2705 (finish commits must use a checkmark)")});await Mr({ctx:t,cwd:r.cwd,rootOverride:r.rootOverride,taskId:n.primaryTaskId,primaryTag:i??"meta",author:r.author,statusFrom:o??void 0,statusTo:"DONE",commentBody:r.body,formattedComment:s?.formattedComment??null,emoji:r.statusCommitEmoji??Fr("DONE"),allow:r.statusCommitAllow,autoAllow:false,allowTasks:true,requireClean:r.statusCommitRequireClean,quiet:r.quiet,progressMessage:"creating status commit",resolveExecutorAgent:true});}return a}async function PY(e){let{ctx:t,options:r,plan:n,primaryTaskId:o,promotedIncidents:i}=e;if(!n.shouldCloseCommit||!o)return;r.quiet||process.stdout.write(`task marked DONE; creating deterministic close commit
309
+ `);let a=r.closeCommit===true&&r.closeUnstageOthers===true;if(t.config.workflow_mode==="branch_pr"){let s=await WD({ctx:t,cwd:r.cwd,rootOverride:r.rootOverride,taskId:o,baseBranchOverride:r.baseBranchOverride,quiet:r.quiet,closeUnstageOthers:a,allowPolicy:i>0});if(r.quiet)return;if(s){process.stdout.write(`branch_pr close tail ready on ${s}; push that branch and open it with task hosted-close-pr if hosted automation does not create the closure PR for you.
310
+ `);return}process.stdout.write(`branch_pr close tail already exists on base; skipping local task-close branch materialization.
311
+ `);return}await Sn({ctx:t,cwd:r.cwd,rootOverride:r.rootOverride,taskId:o,baseBranchOverride:r.baseBranchOverride,quiet:r.quiet,closeUnstageOthers:a,allowPolicy:i>0});}var eN=u(()=>{I();v();xn();cd();P_();QD();le();});function tN(e){let{ctx:t,options:r}=e,{prefix:n,min_chars:o}=t.config.tasks.comments.verified;bn(r.body,n,o);let i=r.statusCommit;if((r.commitFromComment||i)&&r.taskIds.length!==1)throw new m({exitCode:2,code:"E_USAGE",message:"--commit-from-comment/--status-commit requires exactly one task id"});if(r.commitFromComment&&i)throw new m({exitCode:2,code:"E_USAGE",message:"--commit-from-comment cannot be combined with --status-commit in finish; use one deterministic commit path."});if((r.closeCommit||r.noCloseCommit)&&r.taskIds.length!==1)throw new m({exitCode:2,code:"E_USAGE",message:"--close-commit/--no-close-commit requires exactly one task id"});if(r.closeCommit&&r.noCloseCommit)throw new m({exitCode:2,code:"E_USAGE",message:"--close-commit and --no-close-commit are mutually exclusive"});if((r.closeCommit||r.noCloseCommit)&&(r.commitFromComment||r.statusCommit))throw new m({exitCode:2,code:"E_USAGE",message:"--close-commit/--no-close-commit cannot be combined with --commit-from-comment/--status-commit"});let a=r.taskIds[0]??"";if((r.commitFromComment||i)&&!a)throw new m({exitCode:2,code:"E_USAGE",message:"--commit-from-comment/--status-commit requires exactly one task id"});if(r.commitAutoAllow)throw new m({exitCode:2,code:"E_USAGE",message:"--commit-auto-allow is disabled; pass explicit --commit-allow <path-prefix>."});if(r.statusCommitAutoAllow)throw new m({exitCode:2,code:"E_USAGE",message:"--status-commit-auto-allow is disabled; pass explicit --status-commit-allow <path-prefix>."});if(r.commitFromComment&&r.commitAllow.length===0)throw new m({exitCode:2,code:"E_USAGE",message:"--commit-from-comment requires --commit-allow <path-prefix>"});if(i&&r.statusCommitAllow.length===0)throw new m({exitCode:2,code:"E_USAGE",message:"--status-commit requires --status-commit-allow <path-prefix>"});let s=Fe(t),c=s?Lr(t):null,d=t.taskBackend.capabilities.writes_task_readmes===true,l=t.config.workflow_mode==="direct"&&d&&r.taskIds.length===1&&!r.commitFromComment&&!i,p=t.config.workflow_mode==="branch_pr"&&d&&r.taskIds.length===1&&!r.commitFromComment&&!i,g=d&&r.taskIds.length===1&&(r.commitFromComment||i),h=r.closeCommit===true||g||l&&r.noCloseCommit!==true||p&&r.noCloseCommit!==true,f=r.taskIds.length===1?r.taskIds[0]??"":"",b=typeof r.result=="string"||typeof r.risk=="string"||r.breaking===true,w=typeof r.result=="string";if(b&&r.taskIds.length!==1)throw new m({exitCode:2,code:"E_USAGE",message:"--result/--risk/--breaking requires exactly one task id"});let _=typeof r.result=="string"?r.result.trim():"",x=r.risk,C=r.breaking===true,j=TY(r);if(j&&r.taskIds.length!==1)throw new m({exitCode:2,code:"E_USAGE",message:"--observation/--impact/--resolution and incident finding options require exactly one task id"});return {useStore:s,store:c,statusCommitRequested:i,primaryTaskId:a,metaTaskId:f,resultProvided:w,resultSummary:_,riskLevel:x,breaking:C,finishFinding:j,shouldCloseCommit:h}}function TY(e){return typeof e.observation!="string"||typeof e.impact!="string"||typeof e.resolution!="string"?null:{observation:e.observation,impact:e.impact,resolution:e.resolution,localOnly:e.localOnly===true,repoFixable:e.repoFixable===true,incidentScope:e.incidentScope,incidentTags:e.incidentTags??[],incidentMatch:e.incidentMatch??[],incidentAdvice:e.incidentAdvice,incidentRule:e.incidentRule}}var rN=u(()=>{v();N();qr();le();});async function Fp(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});Me({component:"task-finish",event:"finish_started",details:{task_count:e.taskIds.length,backend:t.backendId}}),await Tn({ctx:t,command:"finish"}),await UD({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,baseBranchOverride:e.baseBranchOverride}),e.force&&await ce({action:"force_action",config:t.config,yes:e.yes===!0,reason:"finish --force"});let r=tN({ctx:t,options:e}),n=await ZD({ctx:t,options:e,plan:r});return Me({component:"task-finish",event:"finish_completed",details:{task_count:e.taskIds.length,exit_code:n}}),n}catch(t){throw Me({component:"task-finish",event:"finish_failed",details:{task_count:e.taskIds.length,error:t instanceof Error?t.name:"UnknownError"}}),t instanceof m?t:E(t,{command:"finish",root:e.rootOverride??null})}}var T_=u(()=>{D();v();la();Be();sd();N();P_();eN();rN();});function SY(e){return Qt(e).replaceAll(/\s+/gu," ").trim()}async function EY(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});await Tn({ctx:t,command:"verify"});let r=t.taskBackend,n=t.config,o=t.resolvedProject;if(!r.getTaskDoc||!r.writeTask)throw new m({exitCode:2,code:"E_USAGE",message:tt("task docs")});let i=Te();if(await dt({ctx:t,taskId:e.taskId,build:async s=>{let c=(typeof s.doc=="string"?s.doc:"")||await r.getTaskDoc(s.id);hn({taskId:s.id,sectionText:be(c,"Verify Steps"),action:"record verification",guidance:"fill it before running `agentplane verify ...`"});let l=[...Hw({task:s,at:i,by:e.by,note:e.note,state:e.state,details:e.details??null,doc:c,requiredSections:n.tasks.doc.required_sections}).intents];if(e.finding){let p=dd({current:s,config:n,observation:e.finding.observation,impact:e.finding.impact,resolution:e.finding.resolution,promote:!e.finding.localOnly,external:!e.finding.localOnly,fixability:e.finding.repoFixable?"repo-fixable":null,incidentScope:e.finding.incidentScope,incidentTags:e.finding.incidentTags??[],incidentMatch:e.finding.incidentMatch??[],incidentAdvice:e.finding.incidentAdvice,incidentRule:e.finding.incidentRule});p&&l.push(...p.intents);}return {intents:l}}}),n.workflow_mode==="branch_pr"&&await ko({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,author:e.by})){let{metaPath:c}=await ht({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId}),d=je(await readFile(c,"utf8"),e.taskId);await ge(c,mA({meta:d,at:i,state:e.state==="ok"?"pass":"fail"}));}let a=null;if(e.collectIncidents===true){let s=await kt({ctx:t,taskId:e.taskId,write:true});a=wr(s.plan,{wrote:s.wrote,context:"collect",promotedIds:s.plan.promotable.map(c=>c.entry.id),registryPaths:s.registryPaths,taskId:e.taskId});}else if(n.workflow_mode==="branch_pr"){let s=await Vw({ctx:t,taskId:e.taskId});a=wr(s.plan,{wrote:false,context:"verify",taskId:e.taskId});}if(!e.quiet){let s=e.finding?e.finding.localOnly?"task-local":"incident-candidate":null,c=Ye.join(o.gitRoot,n.paths.workflow_dir,e.taskId,"README.md"),d=Ye.relative(o.gitRoot,c),l=s?` finding=${s}`:"";process.stdout.write(`${z("verified",e.taskId,`state=${e.state} readme=${d}${l}`)}
312
+ `),a&&n.workflow_mode==="branch_pr"&&process.stdout.write(`${K(a)}
313
+ `);}}async function IY(e){let t=String(e.by??"").trim(),r=String(e.note??"").trim(),n=typeof e.noteFile=="string"?e.noteFile.trim():"";if(!t)throw new m({exitCode:2,code:"E_USAGE",message:"Missing required input: --by."});if(!r&&!n)throw new m({exitCode:2,code:"E_USAGE",message:"Provide exactly one of --note or --note-file."});if(r&&n)throw new m({exitCode:2,code:"E_USAGE",message:"Options --note and --note-file are mutually exclusive."});if(typeof e.details=="string"&&typeof e.file=="string")throw new m({exitCode:2,code:"E_USAGE",message:"Options --details and --file are mutually exclusive."});let o=r;if(n)try{o=SY(await readFile(Ye.resolve(e.cwd,n),"utf8"));}catch(a){throw O(a,{command:e.command,filePath:n})}if(!o)throw new m({exitCode:2,code:"E_USAGE",message:"Verification note cannot be empty after normalization."});let i=typeof e.details=="string"?e.details:null;if(typeof e.file=="string")try{i=await readFile(Ye.resolve(e.cwd,e.file),"utf8");}catch(a){throw O(a,{command:e.command,filePath:e.file})}return typeof i=="string"&&(i=Qt(i)),{by:t,note:o,details:i}}async function E_(e){let t=await IY(e);try{return await EY({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,state:e.state,by:t.by,note:t.note,details:t.details,finding:e.finding,collectIncidents:e.collectIncidents,quiet:e.quiet}),0}catch(r){throw r instanceof m?r:E(r,{command:e.command,root:e.rootOverride??null})}}async function Lp(e){return await E_({...e,state:"ok",command:"task verify ok",finding:typeof e.observation=="string"&&typeof e.impact=="string"&&typeof e.resolution=="string"?{observation:e.observation,impact:e.impact,resolution:e.resolution,localOnly:e.localOnly===true,repoFixable:e.repoFixable===true,incidentScope:e.incidentScope,incidentTags:e.incidentTags??[],incidentMatch:e.incidentMatch??[],incidentAdvice:e.incidentAdvice,incidentRule:e.incidentRule}:null})}async function qp(e){return await E_({...e,state:"needs_rework",command:"task verify rework",finding:typeof e.observation=="string"&&typeof e.impact=="string"&&typeof e.resolution=="string"?{observation:e.observation,impact:e.impact,resolution:e.resolution,localOnly:e.localOnly===true,repoFixable:e.repoFixable===true,incidentScope:e.incidentScope,incidentTags:e.incidentTags??[],incidentMatch:e.incidentMatch??[],incidentAdvice:e.incidentAdvice,incidentRule:e.incidentRule}:null})}async function nN(e){return await E_({...e,command:"verify",finding:typeof e.observation=="string"&&typeof e.impact=="string"&&typeof e.resolution=="string"?{observation:e.observation,impact:e.impact,resolution:e.resolution,localOnly:e.localOnly===true,repoFixable:e.repoFixable===true,incidentScope:e.incidentScope,incidentTags:e.incidentTags??[],incidentMatch:e.incidentMatch??[],incidentAdvice:e.incidentAdvice,incidentRule:e.incidentRule}:null})}var ld=u(()=>{D();I();v();_e();xn();sd();N();rr();li();wn();nt();Mp();le();});function iN(e,t){let{sections:r}=parseDocSections(e),n=r.get(normalizeDocSectionName(t));return n?n.lines.join(`
314
+ `).trimEnd():null}function $Y(e){let t=ensureDocSections(e.baseDocRaw,e.sectionOrder);if(e.requestMode==="full-doc")return ensureDocSections(e.text,e.sectionOrder);let r=e.text;if(e.headingKeys.size>0&&e.headingKeys.has(e.targetKey)){let n=r.replaceAll(`\r
315
+ `,`
316
+ `).split(`
317
+ `),o=0;for(;o<n.length&&n[o]?.trim()==="";)o++;(n[o]?.trim()??"")===`## ${e.section}`&&(n.splice(o,1),n[o]?.trim()===""&&n.splice(o,1),r=n.join(`
318
+ `));}return ensureDocSections(setMarkdownSection(t,e.section??"",r),e.sectionOrder)}async function Hp(e){let t;if(e.updatedBy!==void 0){let i=e.updatedBy.trim();if(i.length===0)throw new m({exitCode:2,code:"E_USAGE",message:"--updated-by must be non-empty"});t=i;}let r=e.text!==void 0,n=e.file!==void 0;if(r===n)throw new m({exitCode:2,code:"E_USAGE",message:"Exactly one of --text or --file must be provided"});let o=e.text??"";if(r&&(o=Qt(o)),n)try{o=await readFile(Ye.resolve(e.cwd,e.file??""),"utf8");}catch(i){throw O(i,{command:"task doc set",filePath:e.file??""})}try{let i=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),a=i.taskBackend,s=i.resolvedProject,c=i.config;if(a.capabilities?.writes_task_readmes===!1||!a.getTaskDoc||!a.writeTask)throw new m({exitCode:2,code:"E_USAGE",message:tt("task docs")});let d=c.tasks.doc.sections;if(!e.fullDoc&&!e.section)throw new m({exitCode:2,code:"E_USAGE",message:"Missing required option: --section (or pass --full-doc)"});if(e.fullDoc&&e.section)throw new m({exitCode:2,code:"E_USAGE",message:"Use either --section or --full-doc (not both)"});if(!e.fullDoc&&!d.includes(e.section??""))throw new m({exitCode:2,code:"E_USAGE",message:Le("doc section",e.section??"")});let l=new Set(d.map(T=>normalizeDocSectionName(T))),p=normalizeDocSectionName(e.section??""),g=new Set;for(let T of o.replaceAll(`\r
319
+ `,`
320
+ `).split(`
321
+ `)){let M=/^##\s+(.*)$/.exec(T.trim());if(!M)continue;let $=normalizeDocSectionName(M[1]??"");$&&l.has($)&&g.add($);}let h=e.fullDoc||g.size>0&&(g.size>1||!g.has(p))?"full-doc":"section",f=h==="full-doc"?[...c.tasks.doc.required_sections]:so({allowedSections:d,requiredSections:c.tasks.doc.required_sections,targetSection:e.section??""}),b=!1;b=(await dt({ctx:i,taskId:e.taskId,build:async T=>{let M=typeof T.doc=="string"?T.doc:await a.getTaskDoc(e.taskId)??"",$=$Y({baseDocRaw:M,section:e.section,text:o,requestMode:h,sectionOrder:f,headingKeys:g,targetKey:p}),W=normalizeTaskDoc(M)!==normalizeTaskDoc($);if(!(W||t!==void 0))return null;if(!W)return {intents:[Ke({updatedBy:t})]};if(h==="full-doc")return {intents:[Du({doc:$,expectedCurrentDoc:M}),...t?[Ke({updatedBy:t})]:[]],writeOptions:{expectedCurrentDoc:M}};let U=iN(M,e.section??"");return {intents:[tr({section:e.section??"",text:iN($,e.section??"")??"",requiredSections:f,expectedCurrentText:U}),...t?[Ke({updatedBy:t})]:[]],writeOptions:{expectedCurrentText:U,expectedSection:e.section??""}}}})).changed;let _=b?h==="full-doc"?"full-doc-updated":"section-updated":"no-change",x=Ye.join(s.gitRoot,c.paths.workflow_dir);process.stdout.write(`${Ye.join(x,e.taskId,"README.md")}
322
+ `);let C=e.fullDoc?"<full-doc>":e.section??"",j=`task doc set outcome=${_} section=${C}`;return process.stderr.write(`${_==="no-change"?ie(j):K(j)}
323
+ `),0}catch(i){throw i instanceof m?i:E(i,{command:"task doc set",root:e.rootOverride??null})}}async function Ka(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});if(!t.taskBackend.getTaskDoc)throw new m({exitCode:2,code:"E_USAGE",message:tt("task docs")});let n=await zc({ctx:t,local:async i=>{let a=await i.get(e.taskId);return a?.sections&&Object.keys(a.sections).length>0?renderTaskDocFromSections(a.sections):String(a?.doc??"")},remote:async i=>await i.getTaskDoc(e.taskId)??""}),o=new Map;for(let[i,a]of Object.entries(taskDocToSectionMap(n)))o.set(normalizeDocSectionName(i),{title:i,lines:String(a??"").split(`
324
+ `)});if(e.section){let i=normalizeDocSectionName(e.section),s=o.get(i)?.lines??[];return s.some(c=>c.trim().length>0)?(process.stdout.write(`${s.join(`
325
+ `).trimEnd()}
326
+ `),0):(e.quiet||process.stdout.write(`${K(`section has no content: ${e.section}`)}
327
+ `),0)}return n.trim()?(process.stdout.write(`${n.trimEnd()}
328
+ `),0):(e.quiet||process.stdout.write(`${K("task doc metadata missing")}
329
+ `),0)}catch(t){throw t instanceof m?t:E(t,{command:"task doc show",root:e.rootOverride??null})}}var md=u(()=>{D();I();v();N();rr();qr();le();});var aN=u(()=>{vb();xb();Rb();Pb();Eb();Ib();Ab();Ob();Nb();Gb();Vb();yp();Jb();Qb();Zb();t_();o_();a_();c_();Rp();f_();g_();ad();_p();y_();T_();ld();md();le();});async function O_(e){try{let t=await getPinnedBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null});if(!t)throw new m({exitCode:2,code:"E_USAGE",message:"Base branch is not pinned (use `agentplane branch base set`)."});return ud.line(t),0}catch(t){throw t instanceof m?t:O(t,{command:"branch base get",root:e.rootOverride??null})}}async function D_(e){let t=(e.value??"").trim();if(t.length===0&&!e.useCurrent)throw new m({exitCode:2,code:"E_USAGE",message:"Missing base branch value (pass <name> or --current)."});try{let r=t;if(e.useCurrent){let o=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null});r=await gitCurrentBranch(o.gitRoot);}let n=await setPinnedBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,value:r});return ud.line(n),0}catch(r){throw O(r,{command:"branch base set",root:e.rootOverride??null})}}async function N_(e){try{let t=await clearPinnedBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null});return ud.line(t?"cleared":"no-op"),0}catch(t){throw O(t,{command:"branch base clear",root:e.rootOverride??null})}}async function j_(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await loadConfig(t.agentplaneDir),n=null;try{n=await gitCurrentBranch(t.gitRoot);}catch{n=null;}let o=await getPinnedBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null}),i=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:null,mode:r.config.workflow_mode}),a=[];if(o&&!await gitBranchExists(t.gitRoot,o)&&a.push(`Pinned base branch not found: ${o}`),i&&!await gitBranchExists(t.gitRoot,i)&&a.push(`Effective base branch not found: ${i}`),ud.lines([`current_branch=${n??"-"}`,`pinned_base=${o??"-"}`,`effective_base=${i??"-"}`]),a.length>0)for(let s of a)ud.line(`warning=${s}`);return 0}catch(t){throw O(t,{command:"branch base explain",root:e.rootOverride??null})}}var ud,dN=u(()=>{D();I();v();Ee();ud=A();});async function M_(e){let t=(e.branch??"").trim(),r=(e.worktree??"").trim(),n=A();if(!t&&!r)throw new m({exitCode:2,code:"E_USAGE",message:"Missing required option: --branch or --worktree."});try{let o=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),i=await loadConfig(o.agentplaneDir);if(e.force&&await ce({action:"force_action",config:i.config,yes:e.yes===!0,reason:"branch remove --force"}),r){let a=Ye.isAbsolute(r)?await ir(r):await ir(Ye.join(o.gitRoot,r)),s=Ye.resolve(o.gitRoot,i.config.paths.worktrees_dir);if(!yt(s,a))throw new m({exitCode:2,code:"E_USAGE",message:`Refusing to remove worktree outside ${s}: ${a}`});await execFileAsync("git",["worktree","remove",...e.force?["--force"]:[],a],{cwd:o.gitRoot,env:gitEnv()}),e.quiet||n.success("removed worktree",a);}if(t){if(!await gitBranchExists(o.gitRoot,t))throw new m({exitCode:2,code:"E_USAGE",message:Le("branch",t)});await execFileAsync("git",["branch",e.force?"-D":"-d",t],{cwd:o.gitRoot,env:gitEnv()}),e.quiet||n.success("removed branch",t);}return 0}catch(o){throw o instanceof m?o:O(o,{command:"branch remove",root:e.rootOverride??null})}}var uN=u(()=>{D();I();v();Be();Ee();Pn();});async function F_(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await loadConfig(t.agentplaneDir),n=(e.branch??await gitCurrentBranch(t.gitRoot)).trim(),o=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:e.base??null,mode:r.config.workflow_mode});if(!n)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Invalid value for --branch."});if(!o)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Base branch could not be resolved (use `agentplane branch base set` or --base)."});if(!await gitBranchExists(t.gitRoot,n))throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:Le("branch",n)});if(!await gitBranchExists(t.gitRoot,o))throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:Le("base branch",o)});let i=parseTaskIdFromBranch(r.config.branch.task_prefix,n),a=await findWorktreeForBranch(t.gitRoot,n),{ahead:s,behind:c}=await gitAheadBehind(t.gitRoot,o,n);return pN.line(`branch=${n} base=${o} ahead=${s} behind=${c} task_id=${i??"-"}`),a&&pN.line(`worktree=${a}`),0}catch(t){throw t instanceof m?t:O(t,{command:"branch status",root:e.rootOverride??null})}}var pN,fN=u(()=>{D();G();I();v();Ee();pN=A();});async function Gp(e){try{if((await(await R({cwd:e.cwd,rootOverride:e.rootOverride??null})).git.statusStagedPaths()).length>0)throw new m({exitCode:5,code:"E_GIT",message:"Staged files exist"});return e.quiet||process.stdout.write(`${z("index clean",void 0,"no staged files")}
330
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"guard clean",root:e.rootOverride??null})}}var gN=u(()=>{D();I();v();N();});async function B_(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});return await Tn({ctx:t,command:"guard commit"}),await mo({...e,ctx:t}),e.quiet||process.stdout.write(`OK
331
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"guard commit",root:e.rootOverride??null})}}var hN=u(()=>{D();v();N();sd();gu();});async function Vp(e){try{let r=await(await R({cwd:e.cwd,rootOverride:e.rootOverride??null})).git.statusStagedPaths();if(r.length===0)throw new m({exitCode:2,code:"E_USAGE",message:"No staged files (git index empty)"});let n=lu(r);if(e.format==="args"){let o=n.map(i=>`--allow ${i}`).join(" ");process.stdout.write(`${o}
332
+ `);}else for(let o of n)process.stdout.write(`${o}
333
+ `);return 0}catch(t){throw O(t,{command:"guard suggest-allow",root:e.rootOverride??null})}}var kN=u(()=>{D();v();N();Oc();});var _i=u(()=>{Ic();Oc();gN();hN();kN();});async function yN(e){let t=Ye.join(e,"pr");if(!await P(t))return null;let r=Ye.join(e,"pr-archive");await mkdir(r,{recursive:true});let n=new Date().toISOString().replaceAll(/[:.]/g,""),o=Ye.join(r,n);return await P(o)&&(o=Ye.join(r,`${n}-${Math.random().toString(36).slice(2,8)}`)),await rename(t,o),o}var wN=u(()=>{ee();});function i4(e){let t=parseTaskIdFromBranch(e.prefix,e.branch);if(t)return {taskId:t,kind:"task"};let r=parseTaskIdFromCloseBranch(e.branch);return r?{taskId:r,kind:"task-close"}:null}async function a4(e){let t=Ye.join(e.gitRoot,e.workflowDir,e.taskId,"pr","meta.json");try{let r=await readFile(t,"utf8");return je(r,e.taskId)}catch{return null}}async function s4(e){let t=e.task.commit?.hash?.trim()??"";if(t&&await gitIsAncestor(e.gitRoot,t,e.baseBranch))return true;let r=await a4({gitRoot:e.gitRoot,workflowDir:e.workflowDir,taskId:e.taskId}),n=r?.status==="MERGED"?r.merge_commit?.trim()??"":"";return n.length>0&&await gitIsAncestor(e.gitRoot,n,e.baseBranch)}async function c4(e){let t=e.ctx.config.branch.task_prefix,r=await gitListBranchesByPrefixes(e.gitRoot,[t,"task-close"]),n=new Map,o=[];for(let i of r){if(i===e.baseBranch)continue;let a=i4({branch:i,prefix:t});if(!a)continue;let s=n.get(a.taskId)??null;if(!n.has(a.taskId)){try{s=await ue({ctx:e.ctx,taskId:a.taskId});}catch{s=null;}n.set(a.taskId,s);}if(!s||normalizeTaskStatus(s.status)!=="DONE")continue;let d=await gitDiffNames(e.gitRoot,e.baseBranch,i),l=await s4({gitRoot:e.gitRoot,workflowDir:e.workflowDir,baseBranch:e.baseBranch,task:s,taskId:a.taskId});if(d.length>0&&!l)continue;let p=await findWorktreeForBranch(e.gitRoot,i);o.push({taskId:a.taskId,branch:i,worktreePath:p});}return o}function d4(e){let t=String(e?.stdout??""),r=String(e?.stderr??""),n=`${t}
334
+ ${r}`;return n.includes("remote ref does not exist")||n.includes("unable to delete")||n.includes("remote reference is not a full refname")}async function l4(e,t){try{return await execFileAsync("git",["push","origin","--delete",t],{cwd:e,env:gitEnv()}),!0}catch(r){if(d4(r))return false;throw r}}async function fd(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=t.resolvedProject,n=t.config;if(n.workflow_mode!=="branch_pr")throw new m({exitCode:2,code:"E_USAGE",message:Jt(n.workflow_mode,"branch_pr")});await Ac({cwd:e.cwd,rootOverride:e.rootOverride}),e.fetch&&await execFileAsync("git",["fetch","--prune","origin"],{cwd:r.gitRoot,env:gitEnv()});let o=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:e.base??null,mode:n.workflow_mode});if(!o)throw new m({exitCode:2,code:"E_USAGE",message:"Base branch could not be resolved (use `agentplane branch base set` or --base)."});if(!await gitBranchExists(r.gitRoot,o))throw new m({exitCode:5,code:"E_GIT",message:Le("base branch",o)});let i=await gitCurrentBranch(r.gitRoot);if(i!==o)throw new m({exitCode:5,code:"E_GIT",message:`cleanup merged must run on base branch ${o} (current: ${i})`});let a=await ir(r.gitRoot),s=await c4({ctx:t,gitRoot:r.gitRoot,workflowDir:n.paths.workflow_dir,baseBranch:o}),c=s.toSorted((g,h)=>g.taskId.localeCompare(h.taskId));if(!e.quiet){let g=e.archive?" archive=on":"",h=e.fetch?" fetch=on":"",f=e.deleteRemoteBranches?" remote=delete":"";if(pd.line(`cleanup merged (base=${o}${g}${h}${f})`),c.length===0)return pd.line("no candidates"),0;for(let b of c)pd.line(`- ${b.taskId}: branch=${b.branch} worktree=${b.worktreePath??"-"}`);}if(!e.yes)return e.quiet||pd.line("Re-run with --yes to delete these branches/worktrees."),0;let d=e.skipUnsafeWorktrees===!0,l=0,p=0;for(let g of c){let h=g.worktreePath?await ir(g.worktreePath):null;if(h){let f=!yt(a,h);if(f||h===a){if(d){p+=1;continue}throw f?new m({exitCode:5,code:"E_GIT",message:`Refusing to remove worktree outside repo: ${h}`}):new m({exitCode:5,code:"E_GIT",message:"Refusing to remove the current worktree"})}}if(e.archive){let f=Ye.join(r.gitRoot,n.paths.workflow_dir,g.taskId);await yN(f);}await wi({gitRoot:r.gitRoot,branch:g.branch,worktreePathHint:h}),e.deleteRemoteBranches&&(l+=await l4(r.gitRoot,g.branch)?1:0);}if(e.deleteRemoteBranches&&await execFileAsync("git",["fetch","--prune","origin"],{cwd:r.gitRoot,env:gitEnv()}),!e.quiet){let g=e.deleteRemoteBranches?` remote_deleted=${l}`:"",h=d?` skipped_unsafe=${p}`:"";pd.success("cleanup merged",void 0,`deleted=${s.length-p}${g}${h}`);}return 0}catch(t){throw t instanceof m?t:E(t,{command:"cleanup merged",root:e.rootOverride??null})}}var pd,_N=u(()=>{D();I();v();_i();Ee();vp();Pn();nt();N();wN();pd=A();});function vN(e){let t=e.trim();if(!t)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Invalid value for --slug."});if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(t))throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Slug must be lowercase kebab-case (a-z, 0-9, hyphen)."})}function xN(e){let t=e.trim();if(!t)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Invalid value for --agent."});if(!/^[A-Z0-9_]+$/.test(t))throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Agent id must be uppercase letters, numbers, or underscores."})}var RN=u(()=>{v();G();});function gd(e){return Ye.join(e,"cache","direct-work.json")}async function PN(e){try{let t=await readFile(gd(e),"utf8"),r=JSON.parse(t);return !r||typeof r!="object"||typeof r.task_id!="string"||typeof r.agent!="string"||typeof r.slug!="string"||typeof r.branch!="string"||typeof r.started_at!="string"?null:r}catch{return null}}async function TN(e,t){let r=Ye.dirname(gd(e));await mkdir(r,{recursive:true}),await writeFile(gd(e),JSON.stringify(t,null,2)+`
335
+ `,"utf8");}async function SN(e){let{stdout:t}=await execFileAsync("git",["status","--porcelain"],{cwd:e,env:gitEnv()}),r=t.split(`
336
+ `).map(a=>a.trimEnd()).filter(a=>a.trim().length>0);if(r.length===0)return;let n=[".agentplane/tasks/",".agentplane/tasks.json",".agentplane/cache/",".agentplane/.upgrade/",".agentplane/upgrade/"],o=a=>n.some(s=>a.startsWith(s));if(r.map(a=>{let s=a.slice(2).trim();if(!s)return "";let c=s.lastIndexOf(" -> ");return c===-1?s:s.slice(c+4).trim()}).filter(a=>a.length>0&&!o(a)).length!==0)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:"Working tree has non-task changes. In workflow_mode=direct, agentplane runs tasks in a single stream on the current branch; commit/stash your changes before starting a different task."})}var EN=u(()=>{G();v();});async function IN(e,t){let r=await gitBranchUpstream(e,t);if(!r)return;let{behind:n}=await gitAheadBehind(e,r,t);if(n!==0)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`Base branch ${t} is behind its upstream ${r} by ${n} commit(s). Refresh the base branch before \`agentplane work start\` to avoid DIRTY hosted PRs.`})}var ON=u(()=>{G();v();Ee();});function _4(){return ["#!/usr/bin/env sh",`# ${b4} (do not edit)`,"set -e",'SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"','REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"','LOCAL_BIN="$REPO_ROOT/packages/agentplane/bin/agentplane.js"','if command -v node >/dev/null 2>&1 && [ -f "$LOCAL_BIN" ]; then',' exec node "$LOCAL_BIN" "$@"',"fi",'ENV_BIN="${AGENTPLANE_HOOK_RUNNER:-}"','if [ -n "$ENV_BIN" ] && command -v node >/dev/null 2>&1 && [ -f "$ENV_BIN" ]; then',' exec node "$ENV_BIN" "$@"',"fi","if command -v agentplane >/dev/null 2>&1; then",' exec agentplane "$@"',"fi","if command -v npx >/dev/null 2>&1; then",' exec npx --yes agentplane "$@"',"fi",'echo "agentplane shim: runner not found (need env runner, repo-local source, agentplane in PATH, or node+npx)." >&2'," exit 127",""].join(`
337
+ `)}async function NN(e){let t=Ye.join(e,".agentplane","bin","agentplane");await P(t)||(await mkdir(Ye.dirname(t),{recursive:true}),await writeFile(t,_4(),"utf8"),await chmod(t,493));}var b4,jN=u(()=>{ee();b4="agentplane-hook-shim";});function $N(e){return existsSync(e)}function x4(e){let t=Ye.resolve(e);for(;;){let r=Ye.join(t,"packages","agentplane"),n=Ye.join(r,"bin","agentplane.js"),o=Ye.join(r,"src","cli.ts");if($N(n)&&$N(o))return {repoRoot:t,packageRoot:r,repoBin:n,repoCli:o};let i=Ye.dirname(t);if(i===t)return null;t=i;}}function R4(e,t){let r=Ye.relative(Ye.resolve(e),Ye.resolve(t));return r===""||!r.startsWith("..")&&!Ye.isAbsolute(r)}function MN(e){let t=Ye.resolve(e.cwd),r=Ye.resolve(e.thisBin),n=x4(t);return n?{inFrameworkCheckout:true,isRepoLocalBinary:Ye.resolve(n.repoBin)===r,isRepoLocalRuntime:R4(n.packageRoot,r),checkout:n,thisBin:r}:{inFrameworkCheckout:false,isRepoLocalBinary:false,isRepoLocalRuntime:false,checkout:null,thisBin:r}}var FN=u(()=>{});function HN(e){try{return KE.accessSync(e),!0}catch{return false}}function GN(e){try{return JSON.parse(KE.readFileSync(e,"utf8"))}catch{return null}}function Wp(e){if(!e)return {name:"unknown",version:null,packageRoot:null,packageJsonPath:null};let t=GN(e);return {name:typeof t?.name=="string"?t.name:Ye.basename(Ye.dirname(e)),version:typeof t?.version=="string"?t.version:null,packageRoot:Ye.dirname(e),packageJsonPath:e}}function H_(e,t){let r=Ye.resolve(e);for(Ye.extname(r)&&(r=Ye.dirname(r));;){let n=Ye.join(r,"package.json");if(HN(n)&&(!t||GN(n)?.name===t))return r;let o=Ye.dirname(r);if(o===r)return null;r=o;}}function E4(e){let t=e.agentplanePackageRoot?Ye.resolve(e.agentplanePackageRoot):null,r=e.entryModuleUrl??import.meta.url,n=t??H_(fileURLToPath(r),"agentplane")??H_(fileURLToPath(r));return n?Wp(Ye.join(n,"package.json")):{name:"agentplane",version:null,packageRoot:null,packageJsonPath:null}}function I4(e,t){if(e.corePackageJsonPath)return Wp(Ye.resolve(e.corePackageJsonPath));if(t)return Wp(Ye.join(t,"package.json"));try{let n=createRequire(e.entryModuleUrl??import.meta.url).resolve("@agentplaneorg/core"),o=H_(n,"@agentplaneorg/core");return Wp(o?Ye.join(o,"package.json"):null)}catch{return {name:"@agentplaneorg/core",version:null,packageRoot:null,packageJsonPath:null}}}function Ja(e){let t=String(e??"").trim();return t.length>0?Ye.resolve(t):null}function A4(e,t){let r=(t[T4]??"").trim()==="1",n=Ja(t[qN]);return r&&n&&e.inFrameworkCheckout&&e.isRepoLocalRuntime?"repo-local-handoff":e.inFrameworkCheckout&&e.isRepoLocalRuntime?"repo-local":e.inFrameworkCheckout&&(t[S4]??"").trim()==="1"?"global-forced-in-framework":e.inFrameworkCheckout?"global-in-framework":"global-installed"}function O4(e){if(!e)return null;let t=Ye.join(e,"packages","core");return HN(Ye.join(t,"package.json"))?t:null}function zp(e){return {"repo-local-handoff":"repo-local binary reached via handoff from a global install","repo-local":"repo-local framework binary","global-forced-in-framework":"global installed binary forced inside a framework checkout","global-in-framework":"global installed binary running inside a framework checkout","global-installed":"global installed binary"}[e]}function Ya(e={}){let t=Ye.resolve(e.cwd??process.cwd()),r=e.env??process.env,n=E4(e),o=n.packageRoot===null?null:Ye.join(n.packageRoot,"bin","agentplane.js"),i=Ja(e.activeBinaryPath)??Ja(r[P4])??Ja(process.argv[1])??Ja(o),a=MN({cwd:t,thisBin:i??o??t}),s=O4(a.checkout?.repoRoot??null),c=a.inFrameworkCheckout&&a.isRepoLocalRuntime?s:null,d=I4(e,c);return {cwd:t,activeBinaryPath:i,handoffFromBinaryPath:Ja(r[qN]),mode:A4(a,r),framework:a,frameworkSources:{repoRoot:a.checkout?.repoRoot??null,agentplaneRoot:a.checkout?.packageRoot??n.packageRoot,coreRoot:s},agentplane:n,core:d}}var P4,qN,T4,S4,Kp=u(()=>{FN();P4="AGENTPLANE_RUNTIME_ACTIVE_BIN",qN="AGENTPLANE_RUNTIME_HANDOFF_FROM",T4="AGENTPLANE_REPO_LOCAL_HANDOFF",S4="AGENTPLANE_USE_GLOBAL_IN_FRAMEWORK";});function $4(e){return e!==null}async function WN(e){if(!(e.backend instanceof Yn))return;let t=Ye.resolve(e.backend.root);if(!yt(e.repoRoot,t))return;let r=Ye.relative(e.repoRoot,t),n=Ye.join(e.worktreePath,r),o=await readdir(t,{withFileTypes:true}).catch(()=>[]);for(let i of o){if(!i.isDirectory())continue;let a=Ye.join(t,i.name),s=Ye.join(t,i.name,"README.md");if(!await P(s))continue;let c=Ye.join(n,i.name,"README.md");if(await mkdir(Ye.dirname(c),{recursive:true}),await copyFile(s,c),i.name!==e.taskId)continue;await rm$1(s,{force:true}),(await readdir(a).catch(()=>[])).length===0&&await rm$1(a,{recursive:true,force:true});}}async function zN(e){let t=JN(e.repoRoot),r=[["packages/core/package.json","packages/core/package.json"],["packages/core/dist","packages/core/dist"],["packages/agentplane/package.json","packages/agentplane/package.json"],["packages/agentplane/dist","packages/agentplane/dist"],["packages/agentplane/bin","packages/agentplane/bin"]];for(let[n,o]of r){let i="";for(let s of t){let c=Ye.join(s,n);if(await P(c)){i=c;break}}if(!i)continue;let a=Ye.join(e.worktreePath,o);await P(a)||(await mkdir(Ye.dirname(a),{recursive:true}),await cp$1(i,a,{recursive:true}));}}async function M4(e){let t="";for(let n of e.sourceRoots){let o=Ye.join(n,e.relativePath);if(await P(o)){t=o;break}}if(!t)return false;let r=Ye.join(e.worktreePath,e.relativePath);return await P(r)?false:(await mkdir(Ye.dirname(r),{recursive:true}),await symlink(t,r,process.platform==="win32"?"junction":"dir"),true)}async function KN(e){let t=JN(e.repoRoot),r=["node_modules",Ye.join("packages","core","node_modules"),Ye.join("packages","agentplane","node_modules"),"agentplane-recipes"];for(let n of r)await M4({sourceRoots:t,worktreePath:e.worktreePath,relativePath:n});}function JN(e){let t=Ya({cwd:process.cwd()});return [...new Set([Ye.resolve(e),Ye.resolve(process.cwd()),t.agentplane.packageRoot?Ye.resolve(t.agentplane.packageRoot,"..",".."):null].filter(r=>$4(r)))]}var YN=u(()=>{zo();ee();Kp();Pn();});async function W_(e){try{let t=A();xN(e.agent),vN(e.slug);let r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=r.resolvedProject,o=r.config,i=o.workflow_mode;if(i!=="branch_pr"&&e.worktree)throw new m({exitCode:2,code:"E_USAGE",message:`--worktree is only supported in workflow_mode=branch_pr (current: ${i}).`});if(i==="branch_pr"&&!e.worktree)throw new m({exitCode:2,code:"E_USAGE",message:"--worktree is required when workflow_mode=branch_pr."});let{task:a}=await Kt({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId});mi(a,o);let s=await gitCurrentBranch(n.gitRoot);if(i==="direct"){await SN(n.gitRoot);let h=await PN(n.agentplaneDir);if(h&&h.task_id!==e.taskId)throw new m({exitCode:2,code:"E_USAGE",message:`Another task is already active in this workspace (workflow_mode=direct): ${h.task_id}. Finish it first, or delete ${Ye.relative(n.gitRoot,gd(n.agentplaneDir))} to override.`});return await TN(n.agentplaneDir,{task_id:e.taskId,agent:e.agent,slug:e.slug.trim(),branch:s,started_at:new Date().toISOString()}),t.success("work start",e.taskId,`mode=direct branch=${s}`),0}let c=s;if(i==="branch_pr"){let h=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:null,mode:i});if(!h)throw new m({exitCode:2,code:"E_USAGE",message:"Base branch could not be resolved (use `agentplane branch base set`)."});if(s!==h)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`work start must be run on base branch ${h} (current: ${s})`});await IN(n.gitRoot,h),c=h;}let l=`${o.branch.task_prefix}/${e.taskId}/${e.slug.trim()}`,p=await gitBranchExists(n.gitRoot,l),g="";if(e.worktree){let h=Ye.resolve(n.gitRoot,o.paths.worktrees_dir);if(!yt(n.gitRoot,h))throw new m({exitCode:5,code:"E_GIT",message:`worktrees_dir must be inside the repo: ${h}`});if(g=Ye.join(h,`${e.taskId}-${e.slug.trim()}`),await P(g))throw new m({exitCode:5,code:"E_GIT",message:`Worktree path already exists: ${g}`});await mkdir(h,{recursive:!0}),await execFileAsync("git",p?["worktree","add",g,l]:["worktree","add","-b",l,g,c],{cwd:n.gitRoot,env:gitEnv()}),await WN({backend:r.taskBackend,repoRoot:n.gitRoot,worktreePath:g,taskId:e.taskId}),await zN({repoRoot:n.gitRoot,worktreePath:g}),await KN({repoRoot:n.gitRoot,worktreePath:g}),await NN(g);}else p?s!==l&&await execFileAsync("git",["checkout","-q",l],{cwd:n.gitRoot,env:gitEnv()}):await execFileAsync("git",["checkout","-q","-b",l,c],{cwd:n.gitRoot,env:gitEnv()});return t.success("work start",l,e.worktree?`worktree=${Ye.relative(n.gitRoot,g)}`:""),0}catch(t){throw t instanceof m?t:E(t,{command:"work start",root:e.rootOverride??null})}}var QN=u(()=>{D();ee();G();I();v();Ee();Pn();N();le();RN();EN();ON();jN();YN();});var vo=u(()=>{Ee();dN();uN();fN();_N();QN();});async function K_(e){let t=await gitRevParse(e,["--show-toplevel"]),r=await gitRevParse(e,["--git-common-dir"]),n=await gitRevParse(e,["--git-path","hooks"]),o=Ye.resolve(Ye.isAbsolute(r)?r:Ye.join(t,r)),i=Ye.resolve(Ye.isAbsolute(n)?n:Ye.join(t,n)),a=Ye.resolve(t);if(!yt(a,i)&&!yt(o,i))throw new m({exitCode:5,code:"E_GIT",message:["Refusing to manage git hooks outside the repository.",`hooks_path=${i}`,`repo_root=${a}`,`common_dir=${o}`,"Fix:"," 1) Use a repo-relative core.hooksPath (e.g., .git/hooks)"," 2) Re-run `agentplane hooks install`"].join(`
338
+ `)});return i}async function Qp(e,t){try{return (await readFile(e,"utf8")).includes(t)}catch{return false}}var Yp,z_,xi,J_=u(()=>{Ee();Pn();v();Yp="agentplane-hook",z_="agentplane-hook-shim",xi=["commit-msg","pre-commit","pre-push","post-merge"];});function q4(e){return ["#!/usr/bin/env sh",`# ${Yp} (do not edit)`,"set -e",'REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"','SHIM="$REPO_ROOT/.agentplane/bin/agentplane"','if [ -x "$SHIM" ]; then',' exec "$SHIM" hooks run '+e+' "$@"',"fi","if ! command -v agentplane >/dev/null 2>&1; then",' echo "agentplane hooks: runner not found (PATH missing and shim unavailable)." >&2'," exit 127","fi","exec agentplane hooks run "+e+' "$@"',""].join(`
339
+ `)}function H4(){return ["#!/usr/bin/env sh",`# ${z_} (do not edit)`,"set -e",'SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"','REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"','LOCAL_BIN="$REPO_ROOT/packages/agentplane/bin/agentplane.js"','if command -v node >/dev/null 2>&1 && [ -f "$LOCAL_BIN" ]; then',' exec node "$LOCAL_BIN" "$@"',"fi",'ENV_BIN="${AGENTPLANE_HOOK_RUNNER:-}"','if [ -n "$ENV_BIN" ] && command -v node >/dev/null 2>&1 && [ -f "$ENV_BIN" ]; then',' exec node "$ENV_BIN" "$@"',"fi","if command -v agentplane >/dev/null 2>&1; then",' exec agentplane "$@"',"fi","if command -v npx >/dev/null 2>&1; then",' exec npx --yes agentplane "$@"',"fi",'echo "agentplane shim: runner not found (need env runner, repo-local source, agentplane in PATH, or node+npx)." >&2'," exit 127",""].join(`
340
+ `)}async function G4(e,t){let r=Ye.join(e,"bin"),n=Ye.join(r,"agentplane");if(await mkdir(r,{recursive:true}),await P(n)&&!await Qp(n,z_))throw new m({exitCode:5,code:"E_GIT",message:`Refusing to overwrite existing shim: ${Ye.relative(t,n)}`});await writeFile(n,H4(),"utf8"),await chmod(n,493);}async function xo(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await K_(t.gitRoot);await mkdir(r,{recursive:!0}),await mkdir(t.agentplaneDir,{recursive:!0}),await G4(t.agentplaneDir,t.gitRoot);for(let n of xi){let o=Ye.join(r,n);if(await P(o)&&!await Qp(o,Yp))throw new m({exitCode:5,code:"E_GIT",message:`Refusing to overwrite existing hook: ${Ye.relative(t.gitRoot,o)}`});await writeFile(o,q4(n),"utf8"),await chmod(o,493);}return e.quiet||process.stdout.write(`${Ye.relative(t.gitRoot,r)}
341
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"hooks install",root:e.rootOverride??null})}}async function Xp(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await K_(t.gitRoot),n=0;for(let o of xi){let i=Ye.join(r,o);!await P(i)||!await Qp(i,Yp)||(await rm$1(i,{force:!0}),n++);}return e.quiet||process.stdout.write(n>0?`${z("removed hooks",void 0,`count=${n}`)}
342
+ `:`${K("no agentplane hooks found")}
343
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"hooks uninstall",root:e.rootOverride??null})}}var tj=u(()=>{D();ee();I();v();J_();});async function J4(e){try{let t=await gitCurrentBranch(e.gitRoot);return parseTaskIdFromBranch(e.taskPrefix,t)??parseTaskIdFromCloseBranch(t)??""}catch{return ""}}function Y4(e){for(let t of e.split(`
344
+ `)){let r=t.trim();if(!(!r||r.startsWith("#")))return r}return ""}async function rj(e){let t=e.args[0];if(!t)throw new m({exitCode:2,code:"E_USAGE",message:"Missing commit message file path"});let r=await readFile(t,"utf8"),n=Y4(r),o=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),i=await loadConfig(o.agentplaneDir),a=(process.env.AGENTPLANE_TASK_ID??"").trim()||await J4({gitRoot:o.gitRoot,taskPrefix:i.config.branch.task_prefix}),s=(process.env.AGENTPLANE_STATUS_TO??"").trim().toUpperCase(),c=n.split(/\s+/).find(Boolean)??"";if(a&&s==="DONE"&&c!=="\u2705")throw new m({exitCode:5,code:"E_GIT",message:`Finish commits must use a checkmark emoji.
345
+ Expected:
346
+ \u2705 <TASK_SUFFIX> <scope>: <summary>`});let d=Zn({action:"hook_commit_msg",config:i.config,taskId:a,git:{stagedPaths:[]},commit:{subject:n}});return Ia(d),0}var nj=u(()=>{cc();v();fu();Ee();});async function oj(e){try{let t=await R({cwd:e.cwd,rootOverride:e.rootOverride??null});if(t.config.workflow_mode!=="branch_pr")return 0;let r=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:null,mode:t.config.workflow_mode});return !r||await gitCurrentBranch(t.resolvedProject.gitRoot)!==r?0:await fd({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,base:r,yes:!0,archive:!1,deleteRemoteBranches:!1,fetch:!1,quiet:!0,skipUnsafeWorktrees:!0})}catch(t){let r=t instanceof Error&&t.message.trim().length>0?t.message.trim():String(t);return process.stderr.write(`warning: post-merge cleanup skipped: ${r}
347
+ `),0}}var ij=u(()=>{vo();Ee();N();});function Qa(e){return (process.env[e]??"").trim()==="1"}async function aj(e){let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await new GitContext({gitRoot:t.gitRoot}).statusStagedPaths();if(r.length===0)return 0;let n=await loadConfig(t.agentplaneDir),o=n.config.workflow_mode==="branch_pr",i=o?await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:null,mode:n.config.workflow_mode}):null,a=o?await gitCurrentBranch(t.gitRoot):void 0,s=Zn({action:"hook_pre_commit",config:n.config,taskId:(process.env.AGENTPLANE_TASK_ID??"").trim(),git:{stagedPaths:r,currentBranch:a,baseBranch:i},allow:{allowTasks:Qa("AGENTPLANE_ALLOW_TASKS"),allowBase:Qa("AGENTPLANE_ALLOW_BASE"),allowPolicy:Qa("AGENTPLANE_ALLOW_POLICY"),allowConfig:Qa("AGENTPLANE_ALLOW_CONFIG"),allowHooks:Qa("AGENTPLANE_ALLOW_HOOKS"),allowCI:Qa("AGENTPLANE_ALLOW_CI")}});return Ia(s),0}var sj=u(()=>{cc();Ee();fu();});function iQ(){return ZE("run-pre-push-hook.mjs")}async function cj(e,t={}){let r=Ye.join(e,"scripts","run-pre-push-hook.mjs");if(await P(r))return r;let n=t.bundledScriptPath??iQ();return await P(n)?n:null}async function aQ(e=25){if(process.stdin.isTTY)return "";let t=[],r=()=>{let n=process.stdin.read();for(;n!==null;)t.push(Buffer.isBuffer(n)?n:Buffer.from(String(n))),n=process.stdin.read();};return r(),t.length>0||process.stdin.readableEnded||(await new Promise(n=>{let o=()=>{clearTimeout(s),process.stdin.off("readable",i),process.stdin.off("end",a),n();},i=()=>{r(),o();},a=()=>{r(),o();},s=setTimeout(o,e);process.stdin.on("readable",i),process.stdin.on("end",a),process.stdin.resume();}),r()),Buffer.concat(t).toString("utf8")}async function dj(e){let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await cj(t.gitRoot);if(!r)throw new m({exitCode:2,code:"E_USAGE",message:["Missing pre-push hook script: scripts/run-pre-push-hook.mjs","The pre-push hook needs a repository-local script or an installed CLI bundle that ships the fallback.","Fix:"," 1) Restore scripts/run-pre-push-hook.mjs in this repository, or"," 2) Run `agentplane hooks uninstall` if this repository should not use the agentplane pre-push gate."].join(`
348
+ `)});let n=runProcessSync({command:"node",args:[r],cwd:t.gitRoot,env:process.env,encoding:"utf8",input:await aQ(),stdin:"pipe",stdout:"inherit",stderr:"inherit",reject:false});return n.exitCode??(n.signal?1:0)}var Q_=u(()=>{ee();v();ln();});async function sQ(e){switch(e.hook){case "commit-msg":return await rj(e);case "pre-commit":return await aj(e);case "pre-push":return await dj(e);case "post-merge":return await oj(e)}}async function Zp(e){try{return await sQ(e)}catch(t){let r=t?.status,n=t?.stdout,o=t?.stderr;if(typeof n=="string"&&n.length>0&&process.stdout.write(n),typeof o=="string"&&o.length>0&&process.stderr.write(o),typeof r=="number"&&Number.isInteger(r)&&r>=0)return r;throw t instanceof m?t:E(t,{command:`hooks run ${e.hook}`,root:e.rootOverride??null})}}var lj=u(()=>{D();v();nj();ij();sj();Q_();});var hd=u(()=>{J_();tj();lj();Q_();});var kd=u(()=>{aN();vo();_i();hd();});async function ef(e){let t=await resolveInitBaseBranch(e.gitRoot,e.baseBranchFallback);return e.isInteractive&&e.workflow==="branch_pr"&&e.gitRootExisted&&(t=await mu({gitRoot:e.gitRoot,fallback:t})),t}var X_=u(()=>{kd();});async function tf(e){let t=[];for(let r of e.initDirs){let n=await Zt(r);n&&n!=="dir"&&t.push(r);}for(let r of e.initFiles)await P(r)&&t.push(r);return t}async function rf(e){if(e.conflicts.length===0)return;if(e.backup){for(let r of e.conflicts)await nu(r);return}if(e.force){for(let r of e.conflicts)await rm$1(r,{recursive:true,force:true});return}let t=e.conflicts.map(r=>`- ${Ye.relative(e.gitRoot,r)}`).join(`
349
+ `);throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Init conflicts detected:
350
+ ${t}
351
+ Re-run with --force to overwrite or --backup to preserve existing files.`})}var Z_=u(()=>{ee();G();v();});async function nf(e){let t=Ye.join(e.initRoot,".git"),n=await Zt(t)==="dir";return n||await gitInitRepo(e.initRoot,e.baseBranchFallback),{gitRoot:e.initRoot,gitRootExisted:n}}var ev=u(()=>{kd();ee();});async function of(e){if(e.ide==="codex")return {installPaths:[]};let t={getCtx:i=>Promise.reject(new Error("getCtx is not available during init")),getResolvedProject:i=>Promise.resolve({gitRoot:e.gitRoot,agentplaneDir:Ye.join(e.gitRoot,".agentplane")}),getLoadedConfig:i=>Promise.reject(new Error("getLoadedConfig is not available during init")),getHelpJsonForDocs:()=>[]};await op({cwd:e.cwd,rootOverride:e.rootOverride,ide:e.ide,deps:t});let r=[],n=Ye.join(e.gitRoot,".cursor","rules","agentplane.mdc"),o=Ye.join(e.gitRoot,".windsurf","rules","agentplane.md");return e.ide==="cursor"&&await P(n)&&r.push(Ye.relative(e.gitRoot,n)),e.ide==="windsurf"&&await P(o)&&r.push(Ye.relative(e.gitRoot,o)),{installPaths:r}}var tv=u(()=>{ee();ip();});async function pQ(e){try{return await lstat(e),!0}catch(t){if(t?.code==="ENOENT")return false;throw t}}function fQ(e){return `${e}.agentplane-backup-${process.pid}-${Date.now()}-${uQ++}`}async function Ro(e){let r=await pQ(e.targetDir)&&(e.mode==="replace"||e.mode==="remove")?fQ(e.targetDir):null;r&&await rename(e.targetDir,r);try{if(e.mode!=="remove"){if(!e.materialize)throw new Error("materialize callback is required for create/replace");await e.materialize(e.targetDir);}let n=await e.commit();return r&&await rm$1(r,{recursive:!0,force:!0}),n}catch(n){throw e.mode!=="remove"&&await rm$1(e.targetDir,{recursive:true,force:true}).catch(o=>null),r&&await rename(r,e.targetDir).catch(o=>null),n}}var uQ,wd=u(()=>{uQ=0;});var Ci=u(()=>{});function sf(){let e=process.env[AGENTPLANE_HOME_ENV]?.trim();return e||Ye.join(Q$.homedir(),".agentplane")}function bd(){return Ye.join(sf(),GLOBAL_RECIPES_DIR_NAME)}function Ge(){return Ye.join(sf(),INSTALLED_RECIPES_NAME)}function Za(){return Ye.join(sf(),RECIPES_REMOTE_INDEX_NAME)}function xj(){return Ye.join(sf(),RECIPES_REMOTE_INDEX_SIG_NAME)}function Pi(e){return Ye.join(bd(),e.id,e.version)}function br(e){return Ye.join(e.agentplaneDir,RECIPES_DIR_NAME)}function cf(e){return Ye.join(br(e),PROJECT_RECIPES_PACKAGES_DIR_NAME)}function _d(e){return Ye.join(br(e),PROJECT_RECIPES_REGISTRY_NAME)}function Vr(e,t){return Ye.join(cf(e),t)}function En(e,t){return Vr(e,t)}function Rj(e){return Ye.join(e.agentplaneDir,"generated")}function df(e){return Ye.join(Rj(e),"overlay-bundle.json")}function nv(e){return Ye.join(Rj(e),"recipe-assets.json")}var Ve=u(()=>{Ci();});function _Q(e){if(e==="copy"||e==="link")return e;throw new Error(he("recipes registry materialization",'"copy" | "link"'))}function vQ(e){if(!F(e))throw new Error(he("recipes registry entry","object"));let t=normalizeRecipeId(typeof e.id=="string"?e.id.trim():""),r=typeof e.version=="string"?e.version.trim():"",n=typeof e.path=="string"?e.path.trim():"",o=typeof e.source_ref=="string"?e.source_ref.trim():"",i=typeof e.source_sha256=="string"?e.source_sha256.trim():"",a=typeof e.vendored_sha256=="string"?e.vendored_sha256.trim():"",s=typeof e.installed_at=="string"?e.installed_at.trim():"";if(!t||!r||!n||!o||!i||!a||!s)throw new Error(he("recipes registry entry","id, version, path, source_ref, source_sha256, vendored_sha256, installed_at"));return {id:t,version:r,path:n,active:e.active===true,materialization:_Q(e.materialization),source_ref:o,source_sha256:i,vendored_sha256:a,installed_at:s,tags:normalizeRecipeTags(e.tags??[])}}function vd(e){return {schema_version:1,updated_at:e.updated_at,recipes:[...e.recipes].toSorted((t,r)=>t.id.localeCompare(r.id))}}function Cj(e,t=new Date().toISOString()){return vd({updated_at:t,recipes:e.recipes})}function es(e,t){let r=e.recipes.filter(n=>n.id!==t.id);return r.push(t),vd({updated_at:e.updated_at,recipes:r})}function Pj(e,t){return vd({updated_at:e.updated_at,recipes:e.recipes.filter(r=>r.id!==t)})}function xd(e,t,r){return vd({updated_at:e.updated_at,recipes:e.recipes.map(n=>n.id===t?{...n,active:r}:n)})}async function ot(e){try{let t=JSON.parse(await readFile(_d(e),"utf8"));if(!F(t))throw new Error(he("recipes registry","object"));if(t.schema_version!==1)throw new Error(he("recipes registry.schema_version","1"));if(!Array.isArray(t.recipes))throw new Error(he("recipes registry.recipes","array"));return vd({schema_version:1,updated_at:typeof t.updated_at=="string"?t.updated_at:"",recipes:t.recipes.map(r=>vQ(r))})}catch(t){if(t?.code==="ENOENT")return {schema_version:1,updated_at:"",recipes:[]};throw t}}var Ur=u(()=>{I();De();_e();Ve();});function PQ(e){return [...e].toSorted((t,r)=>t.id.localeCompare(r.id))}async function Sj(e,t){try{let r=await stat(e);return t==="dir"?r.isDirectory():r.isFile()}catch{return false}}async function ov(e,t){if(t.recipes.length===0)return {schema_version:1,updated_at:"",recipes:[]};let r=[];for(let n of t.recipes){let o=Ye.join(br(e),n.path);if(!await Sj(o,"dir"))throw new Error(hr("vendored recipe directory",o));let i=Ye.join(o,"manifest.json");if(!await Sj(i,"file"))throw new Error(hr("installed recipe manifest",i));let a=await readRecipeManifest(i);if(a.id!==n.id||a.version!==n.version)throw new Error(he(`installed recipe directory ${n.id}`,`manifest.id=${n.id} and manifest.version=${n.version}`));r.push({id:a.id,version:a.version,source:n.source_ref,source_ref:n.source_ref,source_sha256:n.source_sha256,vendored_sha256:n.vendored_sha256,materialization:n.materialization,installed_at:n.installed_at,project_path:n.path,tags:normalizeRecipeTags(n.tags??a.tags??[]),manifest:a});}return {schema_version:1,updated_at:t.updated_at,recipes:PQ(r)}}async function sr(e){let t=await ot(e);return await ov(e,t)}var In=u(()=>{I();Ur();Ve();});function Oj(e){return e.endsWith(`
352
+ `)?e:`${e}
353
+ `}function $Q(e){if(!e.startsWith(`---
354
+ `))return e;let t=e.indexOf(`
355
+ ---
356
+ `,4);return t===-1?e:e.slice(t+5)}function MQ(e){return Oj($Q(e).trim())}function Aj(e){return Oj(e.trimEnd())}function iv(e){let t=new Set,r=[];for(let n of e)t.has(n.id)||(t.add(n.id),r.push(n));return r}function FQ(e){return `${JSON.stringify(canonicalizeJson(e),null,2)}
357
+ `}async function BQ(e){try{return await lstat(e),!0}catch(t){if(t?.code==="ENOENT")return false;throw t}}async function LQ(e){let t=[];try{for(let r of e){if(!await BQ(r.path))continue;let n=`${r.path}.bak-${process.pid}-${Date.now()}-${jQ++}`;await rename(r.path,n),t.push({path:r.path,backup:n});}for(let r of e)await mkdir(Ye.dirname(r.path),{recursive:!0}),await atomicWriteFile(r.path,FQ(r.value),"utf8");for(let r of t)await rm$1(r.backup,{recursive:!0,force:!0});}catch(r){for(let n of e)await rm$1(n.path,{recursive:true,force:true}).catch(o=>null);for(let n of t.toReversed())await rename(n.backup,n.path).catch(o=>null);throw r}}function Rd(e,t,r){return `recipe:${e}/${t}:${r}`}function Cd(e,t){return Ye.relative(e.agentplaneDir,t).replaceAll("\\","/")}async function qQ(e){let t=[];for(let r of e.installed.recipes){let n=r.project_path?Ye.join(br(e.project),r.project_path):En(e.project,r.id),o=r.manifest;for(let i of o.agents??[]){let a=Ye.join(n,i.file);t.push({id:Rd(r.id,"agent",i.id),kind:"agent",recipe_id:r.id,recipe_version:r.version,recipe_name:o.name,asset_id:i.id,source:Cd(e.project,a),summary:i.summary,definition:i,content:Aj(await readFile(a,"utf8"))});}for(let i of o.skills??[]){let a=Ye.join(n,i.file);t.push({id:Rd(r.id,"skill",i.id),kind:"skill",recipe_id:r.id,recipe_version:r.version,recipe_name:o.name,asset_id:i.id,source:Cd(e.project,a),summary:i.summary,definition:i,content:Aj(await readFile(a,"utf8"))});}for(let i of o.tools??[])t.push({id:Rd(r.id,"tool",i.id),kind:"tool",recipe_id:r.id,recipe_version:r.version,recipe_name:o.name,asset_id:i.id,source:Cd(e.project,Ye.join(n,i.entrypoint)),summary:i.summary,definition:i});for(let i of o.scenarios??[])t.push({id:Rd(r.id,"scenario",i.id),kind:"scenario",recipe_id:r.id,recipe_version:r.version,recipe_name:o.name,asset_id:i.id,source:Cd(e.project,Ye.join(n,i.file)),summary:i.summary,definition:i});for(let[i,a]of Object.entries(o.templates??{}))t.push({id:Rd(r.id,"template",i),kind:"template",recipe_id:r.id,recipe_version:r.version,recipe_name:o.name,asset_id:i,source:Cd(e.project,Ye.join(n,"manifest.json")),content:a});}return {schema_version:1,kind:"recipe_asset_registry",entries:iv(t).toSorted((r,n)=>r.id.localeCompare(n.id))}}async function Pd(e){let t=await ot(e);return Dj(t)}function Dj(e){return e.recipes.filter(t=>t.active).map(t=>t.id).toSorted()}async function HQ(e,t){let r=Dj(t),n=await ov(e,t),o=createEmptyOverlayBundle();for(let i of r){let a=n.recipes.find(l=>l.id===i);if(!a)throw new Error(`Active overlay is not installed: ${i}`);if(a.manifest.kind!=="project_overlay")throw new Error(`Active recipe ${i} is not a project overlay`);let s=a.manifest,c=a.project_path?Ye.join(br(e),a.project_path):En(e,a.id),d=[];if(s.requires){for(let l of s.requires)if(!r.includes(l))throw new Error(`Overlay ${s.id} requires active overlay ${l}`)}if(s.conflicts){for(let l of s.conflicts)if(r.includes(l.recipe_id))throw new Error(`Overlay ${s.id} conflicts with ${l.recipe_id}: ${l.reason}`)}for(let l of s.prompts??[]){let p=Ye.join(c,l.file),g=MQ(await readFile(p,"utf8"));d.push({id:l.id,content:g}),o.surfaces[l.surface].push({...l,recipe_id:s.id,recipe_version:s.version,recipe_name:s.name,summary:s.summary,source:Ye.relative(e.agentplaneDir,p).replaceAll("\\","/"),content:g}),o.trace.push({recipe_id:s.id,recipe_version:s.version,accepted:true,reason:"compiled prompt fragment",source:l.file,surface:l.surface,fragment_id:l.id});}for(let l of s.validators??[])o.validators.push({...l,recipe_id:s.id,recipe_version:s.version}),o.trace.push({recipe_id:s.id,recipe_version:s.version,accepted:true,reason:"compiled validator",validator_id:l.id});o.active.push({id:s.id,version:s.version,name:s.name,summary:s.summary}),o.agents.push(...s.agents??[]),o.tools.push(...s.tools??[]),Object.assign(o.templates,s.templates??{}),hashOverlayInputs({manifest:s,prompts:d});}o.agents=iv(o.agents),o.tools=iv(o.tools);for(let i of Object.keys(o.surfaces))o.surfaces[i]=o.surfaces[i].toSorted((a,s)=>(a.order??0)-(s.order??0)||a.recipe_id.localeCompare(s.recipe_id)||a.id.localeCompare(s.id));return {bundle:o,assets:await qQ({project:e,installed:n})}}async function cr(e){let t=Cj(e.registry),r=await HQ(e.project,t);return await LQ([{path:df(e.project),value:r.bundle},{path:nv(e.project),value:r.assets},{path:_d(e.project),value:t}]),{registry:t,...r}}async function Td(e){try{return validateCompiledOverlayBundle(JSON.parse(await readFile(df(e),"utf8")))}catch(t){if(t?.code==="ENOENT")return null;throw t}}var jQ,vr=u(()=>{_e();In();Ur();Ve();jQ=0;});function KQ(e){if(!F(e))throw new Error(he("recipes.json","object"));if(e.schema_version!==1)throw new Error(he("recipes.json.schema_version","1"));if(!Array.isArray(e.recipes))throw new Error(he("recipes.json.recipes","array"));let t=typeof e.updated_at=="string"?e.updated_at:"",r=e.recipes.filter(n=>F(n)).map(n=>{let o=validateRecipeManifest(n.manifest),i=typeof n.id=="string"?n.id.trim():o.id,a=typeof n.version=="string"?n.version.trim():o.version,s=typeof n.source=="string"?n.source.trim():"",c=typeof n.installed_at=="string"?n.installed_at.trim():"";if(!i||!a||!s||!c)throw new Error(he("recipes.json.recipes[]","id, version, source, installed_at"));if(i!==o.id||a!==o.version)throw new Error(he("recipes.json.recipes[]","id/version match manifest"));let d=normalizeRecipeTags(n.tags??o.tags??[]);return {id:i,version:a,source:s,installed_at:c,tags:d,manifest:o}});return {schema_version:1,updated_at:t,recipes:r}}function Nj(e){let t=[...e.recipes].toSorted((r,n)=>r.id.localeCompare(n.id));return {schema_version:1,updated_at:e.updated_at,recipes:t}}async function it(e){try{let t=JSON.parse(await readFile(e,"utf8"));return Nj(KQ(t))}catch(t){if(t?.code==="ENOENT")return {schema_version:1,updated_at:"",recipes:[]};throw t}}async function mf(e,t){let r=Nj({...t,updated_at:new Date().toISOString()});await mkdir(Ye.dirname(e),{recursive:true}),await ge(e,r);}var Wr=u(()=>{I();De();_e();});async function $j(e,t,r){let n=t?Ye.join(e,t):e,i=(await readdir(n,{withFileTypes:true})).toSorted((a,s)=>a.name.localeCompare(s.name));for(let a of i){let s=t?Ye.posix.join(t,a.name):a.name,c=Ye.join(e,s);if(a.isDirectory()){r.update(`dir:${s}
358
+ `),await $j(e,s,r);continue}if(a.isSymbolicLink()){r.update(`symlink:${s}
359
+ `);continue}let d=await readFile(c);r.update(`file:${s}
360
+ `),r.update(d),r.update(`
361
+ `);}}async function zr(e){let t=createHash("sha256");return await $j(e,"",t),t.digest("hex")}function XQ(e){if(e.entry.materialization==="link"&&!e.vendoredPathIsSymlink)return "modified";let t=e.currentVendoredSha256!==e.entry.vendored_sha256,r=e.cachePresent&&e.currentSourceSha256!==void 0?e.currentSourceSha256!==e.entry.source_sha256:false;return e.entry.materialization==="link"?r?"diverged_from_cache":t?"modified":"clean":t?"modified":r?"diverged_from_cache":"clean"}async function Ti(e){let r=(await sr(e.project)).recipes.find(l=>l.id===e.recipeId);if(!r)throw new Error(`Recipe not installed: ${e.recipeId}`);let n=Vr(e.project,r.id),o=Pi({id:r.id,version:r.version}),a=(await lstat(n)).isSymbolicLink(),s=await zr(n),c=false,d;try{let l=await lstat(o);(l.isDirectory()||l.isSymbolicLink())&&(c=!0,d=await zr(o));}catch(l){if(l?.code!=="ENOENT")throw l}return {entry:r,recipe_dir:n,source_dir:o,cache_present:c,current_source_sha256:d,current_vendored_sha256:s,state:XQ({entry:r,cachePresent:c,currentSourceSha256:d,currentVendoredSha256:s,vendoredPathIsSymlink:a})}}var ts=u(()=>{In();Ve();});function Mj(e){let t=e.trim().replace(/^v/i,"").split("+")[0]??"",[r,n]=t.split("-",2);return {main:(r??"").split(".").filter(i=>i.length>0).map(i=>{let a=Number.parseInt(i,10);return Number.isFinite(a)?a:0}),prerelease:n?n.trim():null}}function An(e,t){let r=Mj(e),n=Mj(t),o=Math.max(r.main.length,n.main.length);for(let i=0;i<o;i++){let a=r.main[i]??0,s=n.main[i]??0;if(a!==s)return a>s?1:-1}return r.prerelease===n.prerelease?0:r.prerelease===null?1:n.prerelease===null?-1:r.prerelease.localeCompare(n.prerelease)}var Sd=u(()=>{});function ZQ(e,t){return An(e,t)}function rs(e){return [...e].toSorted((t,r)=>ZQ(t.version,r.version)).at(-1)}var uf=u(()=>{Sd();});function sX(e){let t=e.trim();if(!t)throw new m({exitCode:3,code:"E_VALIDATION",message:"Recipe id must not be empty"});let r=t.lastIndexOf("@");return r<=0?{id:t}:{id:t.slice(0,r),version:t.slice(r+1)||void 0}}async function ns(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await loadConfig(t.agentplaneDir),n=sX(e.recipeRef),i=(await it(Ge())).recipes.filter(b=>b.id===n.id),a=n.version?i.find(b=>b.version===n.version):rs(i);if(!a)throw new m({exitCode:k("E_IO"),code:"E_IO",message:n.version?`Recipe not found in global cache: ${n.id}@${n.version}. Run agentplane recipes install ${n.id}@${n.version}`:`Recipe not found in global cache: ${n.id}. Run agentplane recipes install ${n.id}`});let s=e.mode??(r.config.recipes?.storage_default==="link"?"link":"copy"),c=Pi({id:a.id,version:a.version}),d=Vr(t,a.id),l=await ot(t),p=l.recipes.find(b=>b.id===a.id);if(p)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:p.version===a.version?`Recipe already vendored: ${a.id}@${a.version}. Use agentplane recipes update ${a.id} to resync it from cache.`:`Recipe already vendored: ${a.id}@${p.version}. Remove it first or use a dedicated update flow instead of overwriting it with recipes add.`});let g=new Date().toISOString(),h=normalizeRecipeTags(a.tags??a.manifest.tags??[]),f=await zr(c);return await mkdir(cf(t),{recursive:!0}),await Ro({targetDir:d,mode:"create",materialize:async b=>{await rm$1(b,{recursive:!0,force:!0}),await(s==="link"?symlink(c,b,"dir"):cp$1(c,b,{recursive:!0}));},commit:async()=>{let b=await zr(d),w=es(l,{id:a.id,version:a.version,path:`packages/${a.id}`,active:e.activate===!0,materialization:s,source_ref:`${a.id}@${a.version}`,source_sha256:f,vendored_sha256:b,installed_at:g,tags:h});await cr({project:t,registry:w});}}),process.stdout.write(`Vendored recipe ${a.id}@${a.version} into project (${s})
362
+ `),s==="link"&&process.stdout.write("Warning: link mode is not portable; use `agentplane recipes detach` before sharing the repo.\n"),0}catch(t){throw t instanceof m?t:O(t,{command:"recipes add",root:e.rootOverride??null})}}var pf=u(()=>{D();G();v();wd();vr();Wr();ts();Ur();uf();Ve();});async function Ed(){return (await it(Ge())).recipes.map(t=>({id:t.id,summary:t.manifest.summary,version:t.version}))}function sv(e){return e.length===0?"Cached recipes: none. Use `agentplane recipes install <id>` before selecting recipes during init.":`Cached recipes: ${e.map(t=>t.id).join(", ")}`}async function ff(e){if(e.length===0)return;let t=await Ed(),r=new Set(t.map(o=>o.id)),n=e.filter(o=>!r.has(o));if(n.length!==0)throw new m({exitCode:2,code:"E_USAGE",message:`Unknown cached recipe id(s): ${n.join(", ")}. ${sv(t)}`})}async function gf(e){if(e.recipes.length!==0)for(let t of e.recipes)await ns({cwd:e.cwd,rootOverride:e.rootOverride,recipeRef:t,activate:true});}var cv=u(()=>{pf();Wr();Ve();v();});function Fj(e){if(!e)return;let t=e.trim().toLowerCase();if(t==="developer"||t==="enterprise")return "full-harness";if(t==="manager")return "normal";if(t==="vibecoder")return "light";if(t==="light"||t==="normal"||t==="full-harness")return t}var xe,lt,xr=u(()=>{xe={policyGateway:"codex",ide:"codex",workflow:"direct",directCloseDirtyPolicy:"allow_other_task_readmes",backend:"local",hooks:true,recipes:[],requirePlanApproval:true,requireNetworkApproval:true,requireVerifyApproval:true,executionProfile:"balanced",strictUnsafeConfirm:false},lt={light:{mode:"compact",description:"Light profile (maximum flexibility, minimal enforcement, hooks disabled).",defaultHooks:false,defaultStrictUnsafeConfirm:false,defaultRequirePlanApproval:false,defaultRequireNetworkApproval:false,defaultRequireVerifyApproval:false,defaultExecutionProfile:"aggressive",defaultRecipes:[]},normal:{mode:"compact",description:"Normal profile (balanced defaults and approvals enabled for standard team workflows; hooks enabled).",defaultHooks:true,defaultStrictUnsafeConfirm:false,defaultRequirePlanApproval:true,defaultRequireNetworkApproval:true,defaultRequireVerifyApproval:true,defaultExecutionProfile:"balanced",defaultRecipes:[]},"full-harness":{mode:"full",description:"Full Harness profile (strict guardrails, explicit confirmations, conservative execution; hooks enabled).",defaultHooks:true,defaultStrictUnsafeConfirm:true,defaultRequirePlanApproval:true,defaultRequireNetworkApproval:true,defaultRequireVerifyApproval:true,defaultExecutionProfile:"conservative",defaultRecipes:[]}};});function hf(e){return e.endsWith(`
363
+ `)?e:`${e}
364
+ `}function uX(e){let t=[];for(let[r,n]of e.entries()){let o=mX.exec(n);o&&t.push({index:r,level:o[1].length,title:o[2].trim()});}return t}function pX(e,t){let r=uX(e),n=r.find(i=>i.title===t);if(!n)return null;let o=r.filter(i=>i.index>n.index).find(i=>i.level<=n.level);return [n.index,o?o.index:e.length]}function fX(e,t){let r=t.map(o=>pX(e,o)).filter(o=>o!==null);if(r.length===0)return e;let n=new Set;for(let[o,i]of r)for(let a=o;a<i;a+=1)n.add(a);return e.filter((o,i)=>!n.has(i))}async function Hj(){return mv("codex")}async function gX(){let e=dX,r=(await readdir(e)).filter(o=>o.endsWith(".json")),n=[];for(let o of r){let i=Ye.join(e,o),a=await readFile(i,"utf8");n.push({fileName:o,contents:hf(a.trimEnd())});}return n}async function kf(){return Bj??=gX(),Bj}async function Gj(e,t=""){let n=(await readdir(e,{withFileTypes:true})).toSorted((i,a)=>i.name.localeCompare(a.name)),o=[];for(let i of n){if(i.name.startsWith("."))continue;let a=Ye.join(e,i.name),s=t?`${t}/${i.name}`:i.name;if(i.isDirectory()){o.push(...await Gj(a,s));continue}i.isFile()&&o.push(s);}return o}async function Vj(){let e=lX,t=await Gj(e),r=[];for(let n of t){let o=Ye.join(e,n),i=await readFile(o,"utf8");r.push({relativePath:n.replaceAll("\\","/"),contents:hf(i.trimEnd())});}return r}function Uj(e,t){let r=e.replaceAll(`\r
365
+ `,`
366
+ `).split(`
367
+ `),o=fX(r,t==="direct"?["B) branch_pr mode (parallel work)","INTEGRATION & CLOSURE (branch_pr)"]:["A) direct mode (single checkout)"]);return hf(o.join(`
368
+ `).trimEnd())}async function hX(e){let t=await readFile(cX,"utf8"),r=bm(t,cn(e));return hf(r.trimEnd())}async function mv(e){let t=Lj.get(e);if(t)return t;let r=hX(e);return Lj.set(e,r),r}var cX,dX,lX,mX,Bj,Lj,uv=u(()=>{dn();ln();cX=no("AGENTS.md"),dX=no("agents"),lX=no("policy"),mX=/^(#+)\s+(.*)$/,Bj=null,Lj=new Map;});function yX(e){return e==="AGENTS.md"?"AGENTS.md":e==="CLAUDE.md"?"CLAUDE.md":e.startsWith(".agentplane/")?e.slice(12):null}async function wX(e){let t=Ye.join(e.agentplaneDir,".upgrade","baseline");for(let r of e.repoRelativePaths){let n=r.replaceAll("\\","/"),o=yX(n);if(!o)continue;let i=Ye.join(e.gitRoot,n),a=await readFile(i),s=Ye.join(t,o);await mkdir(Ye.dirname(s),{recursive:true}),await atomicWriteFile(s,a);}}async function os(e){let t=cn(e.policyGateway),r=d=>bm(d,t),n=Ye.join(e.gitRoot,t),o=[Ye.relative(e.gitRoot,e.configPathAbs),Ye.relative(e.gitRoot,e.backendPathAbs)],i=[],a=false;if(!await P(n)){let d=await Hj(),l=Uj(r(d),e.workflow);await atomicWriteFile(n,l,"utf8"),a=true;}a&&(o.push(Ye.relative(e.gitRoot,n)),i.push(t));let s=await kf();for(let d of s){let l=Ye.join(e.agentplaneDir,"agents",d.fileName);if(await P(l))continue;await atomicWriteFile(l,r(d.contents),"utf8");let p=Ye.relative(e.gitRoot,l);o.push(p),i.push(p);}let c=await Vj();for(let d of c){let l=Ye.join(e.agentplaneDir,"policy",d.relativePath);if(await P(l))continue;let p=d.relativePath.endsWith(".md")?r(d.contents):d.contents;await mkdir(Ye.dirname(l),{recursive:true}),await atomicWriteFile(l,p,"utf8");let g=Ye.relative(e.gitRoot,l);o.push(g),i.push(g);}return await wX({gitRoot:e.gitRoot,agentplaneDir:e.agentplaneDir,repoRelativePaths:i}),{installPaths:o}}var pv=u(()=>{uv();ee();dn();});async function ss(e,t){await mkdir(e,{recursive:true}),await mkdir(Ye.join(e,"tasks"),{recursive:true}),await mkdir(Ye.join(e,"agents"),{recursive:true}),await mkdir(Ye.join(e,"cache"),{recursive:true}),await mkdir(Ye.join(e,"backends"),{recursive:true}),await mkdir(Ye.join(e,"backends",t),{recursive:true});}async function wf(e){let t=defaultConfig();setByDottedKey(t,"workflow_mode",e.workflow),setByDottedKey(t,"status_commit_policy",e.workflow==="branch_pr"?"confirm":"warn"),setByDottedKey(t,"commit_automation","finish_only"),setByDottedKey(t,"finish_auto_status_commit","false"),setByDottedKey(t,"close_commit.direct_dirty_policy",e.directCloseDirtyPolicy),setByDottedKey(t,"tasks_backend.config_path",Ye.relative(e.gitRoot,e.backendConfigPathAbs)),setByDottedKey(t,"agents.approvals.require_plan",String(e.requirePlanApproval)),setByDottedKey(t,"agents.approvals.require_network",String(e.requireNetworkApproval)),setByDottedKey(t,"agents.approvals.require_verify",String(e.requireVerifyApproval)),setByDottedKey(t,"framework.cli.expected_version",gt()),setByDottedKey(t,"execution",JSON.stringify(e.execution)),await saveConfig(e.agentplaneDir,t);}async function bf(e){let t={id:"local",version:1,settings:{dir:".agentplane/tasks"}},r={id:"redmine",version:1,settings:{owner_agent:"REDMINE",custom_fields:{task_id:1}}},n=e.backend==="redmine"?r:t;await ge(e.backendPath,n);}var fv=u(()=>{_e();oo();});async function Kj(e){try{return await readFile(e,"utf8")}catch(t){if(t?.code==="ENOENT")return null;throw t}}function RX(e){let t=new Set;for(let r of e.split(/\r?\n/u)){let n=r.trim();if(!n||n.startsWith("#"))continue;let o=/^([A-Za-z_][A-Za-z0-9_]*)\s*=/u.exec(n);o?.[1]&&t.add(o[1]);}return t}function CX(e){let t=RX(e),r=xX.filter(l=>!t.has(l.key));if(r.length===0)return e;let n=r.filter(l=>l.required),o=r.filter(l=>!l.required),i=n.flatMap(l=>[`# ${l.comment}`,`${l.key}=${l.value}`]),a=o.length===0?[]:["","# Optional values:",...o.flatMap(l=>[`# ${l.comment}`,`${l.key}=${l.value}`])],c=`${["# agentplane: redmine backend configuration","# Required values:",...i,...a].join(`
369
+ `)}
370
+ `,d=e.length>0&&!e.endsWith(`
371
+ `)?`
372
+
373
+ `:e.length>0?`
374
+ `:"";return `${e}${d}${c}`}async function _f(e){let t=Ye.join(e.gitRoot,".env.example"),r=await Kj(t)??"",n=CX(r);await X(t,n);let o=Ye.join(e.gitRoot,".env");await Kj(o)===null&&await X(o,n);}var xX,gv=u(()=>{_e();xX=[{key:"AGENTPLANE_REDMINE_URL",value:"https://redmine.example",comment:"Redmine base URL.",required:true},{key:"AGENTPLANE_REDMINE_API_KEY",value:"replace-me",comment:"Redmine API key.",required:true},{key:"AGENTPLANE_REDMINE_PROJECT_ID",value:"replace-me",comment:"Project identifier (numeric ID or project slug).",required:true},{key:"AGENTPLANE_REDMINE_CUSTOM_FIELDS_TASK_ID",value:"1",comment:"Required Redmine custom field ID that stores the agentplane task id.",required:true},{key:"AGENTPLANE_REDMINE_OWNER_AGENT",value:"REDMINE",comment:"Optional default owner agent.",required:false},{key:"AGENTPLANE_REDMINE_ASSIGNEE_ID",value:"",comment:"Optional assignee numeric ID.",required:false},{key:"AGENTPLANE_REDMINE_CUSTOM_FIELDS_CANONICAL_STATE",value:"",comment:"Optional Redmine custom field ID for structured canonical task state JSON.",required:false}];});var Id,Jj,hv=u(()=>{Id=["# agentplane: ignore runtime/transient workspace artifacts",".env",".agentplane/worktrees",".agentplane/cache",".agentplane/recipes-cache",".agentplane/.upgrade",".agentplane/.release",".agentplane/upgrade",".agentplane/tasks.json","AGENTS.md.bak-*","CLAUDE.md.bak-*",".agentplane/agents/*.bak-*",".agentplane/policy/**/*.bak-*"],Jj=["# agentplane: ignore local agent prompts/templates","AGENTS.md","CLAUDE.md",".agentplane/agents/",".agentplane/policy/"];});async function SX(e){try{return await readFile(e,"utf8")}catch(t){if(t?.code==="ENOENT")return null;throw t}}async function vf(e){let t=Ye.join(e.gitRoot,".gitignore"),r=await SX(t)??"",n=e.includeAgentPromptFiles?[...Id,...Jj]:[...Id],o=r.split(/\r?\n/),i=new Set(o.map(d=>d.trimEnd())),a=n.filter(d=>!i.has(d));if(a.length===0)return;let s=[...o];s.length>0&&s.at(-1)!==""&&s.push(""),s.push(...a,"");let c=`${s.join(`
375
+ `)}`.replaceAll(/\n{2,}$/g,`
376
+ `);await X(t,c);}var kv=u(()=>{hv();_e();});async function xf(e){return {installPaths:(await ka({gitRoot:e.gitRoot,workflowMode:e.workflowMode,approvals:e.approvals})).installPaths}}var yv=u(()=>{vc();});function EX(){return process.env.AGENTPLANE_PROMPTS!=="plain"&&process.stdin.isTTY===true&&process.stdout.isTTY===true}function Qj(){return EX()?(Yj??=import('@clack/prompts'),Yj):Promise.resolve(null)}function Rf(e,t,r="Init cancelled."){if(e.isCancel(t))throw e.cancel(r),new On(r);return t}var On,Yj,Cf=u(()=>{On=class extends Error{code="INIT_ABORTED";constructor(t="Init cancelled."){super(t),this.name="InitAborted";}},Yj=null;});async function wt(e,t){let r=await e.select({message:t.message,options:t.options,initialValue:t.initialValue});return Rf(e,r,t.cancelMessage)}async function wv(e,t){let r=await e.confirm({message:t.message,initialValue:t.initialValue});return Rf(e,r,t.cancelMessage)}async function Xj(e,t){let r=await e.text({message:t.message,defaultValue:t.defaultValue,placeholder:t.placeholder,validate:t.validate});return Rf(e,r,t.cancelMessage)}function bv(e,t){let r=e.trim().toLowerCase();return r===""?[...t]:r==="none"?[]:e.split(",").map(n=>n.trim()).filter(Boolean)}var Dn=u(()=>{Cf();});async function _v(e){let t=lt[e.setupProfilePreset],r=e.flags.hooks??t.defaultHooks,n=e.flags.requirePlanApproval??t.defaultRequirePlanApproval,o=e.flags.requireVerifyApproval??t.defaultRequireVerifyApproval,i=e.flags.requireNetworkApproval??t.defaultRequireNetworkApproval,a=e.flags.executionProfile??t.defaultExecutionProfile,s=e.flags.strictUnsafeConfirm??t.defaultStrictUnsafeConfirm;return e.setupProfileMode==="full"&&(e.flags.executionProfile||(a=await wt(e.clack,{message:"Execution profile",options:IX,initialValue:a,cancelMessage:"Execution profile selection cancelled."})),e.flags.strictUnsafeConfirm===void 0&&(s=await wv(e.clack,{message:"Require strict explicit confirmation for extra unsafe actions?",initialValue:s,cancelMessage:"Strict unsafe confirmation selection cancelled."})),e.flags.requireNetworkApproval===void 0&&(i=await wv(e.clack,{message:"Require explicit approval for network actions?",initialValue:i,cancelMessage:"Network approval selection cancelled."}))),{hooks:r,requirePlanApproval:n,requireNetworkApproval:i,requireVerifyApproval:o,executionProfile:a,strictUnsafeConfirm:s}}var IX,Zj=u(()=>{xr();Dn();IX=[{value:"conservative",label:"Conservative",hint:"Lower autonomy and stricter budgets."},{value:"balanced",label:"Balanced",hint:"Default autonomy and verification posture."},{value:"aggressive",label:"Aggressive",hint:"Higher autonomy and lighter guardrails."}];});function Ad(e){return e?[...e]:[]}async function Co(e){let t=e.clack?e.clack.spinner():null;t?.start(e.start);let r=n=>{t?.message?.(n);};try{let n=await e.run(r);return t?.stop(e.success??e.start),n}catch(n){throw t?.stop(e.failure??e.start),n}}async function vv(e){let t=[];await Co({clack:e.clack,start:"Writing init config",success:"Wrote init config",failure:"Failed to write init config",run:async()=>{await e.plan.config();}});let r=await Co({clack:e.clack,start:"Writing agents",success:"Wrote agents",failure:"Failed to write agents",run:async()=>Ad(await e.plan.agents())});t.push(...r);let n=await Co({clack:e.clack,start:"Writing workflow files",success:"Wrote workflow files",failure:"Failed to write workflow files",run:async()=>Ad(await e.plan.workflow())});t.push(...n);let o=await Co({clack:e.clack,start:"Updating .gitignore",success:"Updated .gitignore",failure:"Failed to update .gitignore",run:async()=>Ad(await e.plan.gitignore())});if(t.push(...o),e.plan.hooks){let a=await Co({clack:e.clack,start:"Installing hooks",success:"Installed hooks",failure:"Failed to install hooks",run:async()=>Ad(await e.plan.hooks?.())});t.push(...a);}let i=await Co({clack:e.clack,start:"Syncing IDE rules",success:"Synced IDE rules",failure:"Failed to sync IDE rules",run:async()=>Ad(await e.plan.ideSync())});return t.push(...i),await Co({clack:e.clack,start:"Materializing recipes",success:"Materialized recipes",failure:"Failed to materialize recipes",run:async()=>{await e.plan.recipes();}}),e.includeInstallCommit&&e.plan.installCommit&&await Co({clack:e.clack,start:"Creating install commit",success:"Created install commit",failure:"Failed to create install commit",run:async()=>{await e.plan.installCommit?.(t);}}),{installPaths:t}}var e$=u(()=>{});async function xv(e){let t=e.defaults??xe;return {backend:e.flags.backend??await wt(e.clack,{message:"Task backend",options:AX,initialValue:t.backend,cancelMessage:"Task backend selection cancelled."})}}var AX,t$=u(()=>{xr();Dn();AX=[{value:"local",label:"Local",hint:"Store task data in .agentplane."},{value:"redmine",label:"Redmine",hint:"Prepare Redmine backend stubs."}];});function DX(e){return e===true?"yes":e===false?"no":e==null||e===""?"(none)":String(e)}function NX(e){let t=Math.max(...e.map(r=>r.label.length),0);return e.map(r=>`${r.label.padEnd(t)} ${DX(r.value)}`).join(`
377
+ `)}function r$(e,t,r){e.log.step(t),r?.trim()&&e.note(r.trim());}function n$(e,t){e.note(NX(t),"Install preview");}function jX(e,t){return t.map(r=>`- ${Ye.relative(e,r)}`).join(`
378
+ `)}function o$(e,t){e.note(jX(t.gitRoot,t.conflicts),"Init conflicts detected");}function i$(e,t){e.outro(`AgentPlane initialized in ${t}.`);}function a$(e,t){let r=t instanceof Error?t.message:String(t);e.log.error(r),e.outro("AgentPlane init did not complete.");}var Rv=u(()=>{});async function Cv(e){if(e.conflicts.length===0)return null;o$(e.clack,{gitRoot:e.gitRoot,conflicts:e.conflicts});let t=await wt(e.clack,{message:"How should init resolve existing conflicts?",options:$X,initialValue:"backup",cancelMessage:"Init cancelled during conflict resolution."});if(t==="cancel"){let r="Init cancelled during conflict resolution.";throw e.clack.cancel(r),new On(r)}return t}var $X,s$=u(()=>{Cf();Rv();Dn();$X=[{value:"overwrite",label:"Overwrite",hint:"Delete conflicting paths before continuing init."},{value:"backup",label:"Backup",hint:"Create timestamped backups before writing new files."},{value:"cancel",label:"Cancel",hint:"Abort init now and keep the workspace unchanged."}];});async function Pv(e){let t=e.defaults??xe;return {ide:e.flags.ide??await wt(e.clack,{message:"IDE integration",options:MX,initialValue:t.ide,cancelMessage:"IDE integration selection cancelled."})}}var MX,c$=u(()=>{xr();Dn();MX=[{value:"codex",label:"Codex",hint:"Use Codex-oriented local rules."},{value:"cursor",label:"Cursor",hint:"Sync Cursor rules."},{value:"windsurf",label:"Windsurf",hint:"Sync Windsurf rules."}];});async function Tv(e){let t=e.defaults??xe;return {policyGateway:e.flags.policyGateway??await wt(e.clack,{message:"Policy gateway",options:FX,initialValue:t.policyGateway,cancelMessage:"Policy gateway selection cancelled."})}}var FX,d$=u(()=>{xr();Dn();FX=[{value:"codex",label:"Codex",hint:"Install AGENTS.md."},{value:"claude",label:"Claude",hint:"Install CLAUDE.md."}];});function BX(e){return e.map(t=>typeof t=="string"?t:t.id)}async function Sv(e){if(e.flags.recipes)return {recipes:[...e.flags.recipes]};let t=lt[e.setupProfilePreset].defaultRecipes;if(e.setupProfileMode!=="full")return {recipes:[...t]};let r=BX(e.cachedRecipes);if(r.length===0)return {recipes:[]};let n=t.length>0?t.join(", "):"none",o=await Xj(e.clack,{message:"Materialize cached recipes",defaultValue:n,placeholder:r.join(", "),validate:i=>{let a=bv(i,t),s=new Set(r),c=a.filter(d=>!s.has(d));if(c.length>0)return `Unknown cached recipe: ${c.join(", ")}`},cancelMessage:"Recipe selection cancelled."});return {recipes:bv(o,t)}}var l$=u(()=>{xr();Dn();});async function Ev(e){let t=e.flags.setupProfile??await wt(e.clack,{message:"Setup profile",options:LX,initialValue:e.defaultProfile??"normal",cancelMessage:"Setup profile selection cancelled."});return {setupProfilePreset:t,setupProfileMode:lt[t].mode}}var LX,m$=u(()=>{xr();Dn();LX=[{value:"light",label:"Light",hint:lt.light.description},{value:"normal",label:"Normal",hint:lt.normal.description},{value:"full-harness",label:"Full Harness",hint:lt["full-harness"].description}];});function GX(e){return e==="strict"?"strict":"allow-other-task-readmes"}function VX(e){return e==="strict"?"strict":"allow_other_task_readmes"}async function Iv(e){let t=e.defaults??xe,r=e.flags.workflow??(e.setupProfileMode==="full"?await wt(e.clack,{message:"Workflow mode",options:qX,initialValue:t.workflow,cancelMessage:"Workflow selection cancelled."}):t.workflow);if(r!=="direct")return {workflow:r,directCloseDirtyPolicy:e.flags.directCloseDirtyPolicy??t.directCloseDirtyPolicy};let n=e.flags.directCloseDirtyPolicy??(e.setupProfileMode==="full"?VX(await wt(e.clack,{message:"Direct close dirt policy",options:HX,initialValue:GX(t.directCloseDirtyPolicy),cancelMessage:"Direct close dirt policy selection cancelled."})):t.directCloseDirtyPolicy);return {workflow:r,directCloseDirtyPolicy:n}}var qX,HX,u$=u(()=>{xr();Dn();qX=[{value:"direct",label:"Direct",hint:"One checkout; task lifecycle runs in place."},{value:"branch_pr",label:"Branch PR",hint:"Worktree and PR-first task lifecycle."}],HX=[{value:"allow-other-task-readmes",label:"Allow other task READMEs",hint:"Ignore only README updates for other active tasks."},{value:"strict",label:"Strict",hint:"Block on any unrelated tracked change."}];});var p$=u(()=>{Zj();e$();t$();s$();c$();d$();l$();m$();u$();});function zX(e){if(e.flags.yes)throw y({spec:e.spec,command:"init",message:"Interactive init UI cannot be combined with --yes."})}function KX(e,t){if(e)return e;throw y({spec:t,command:"init",message:"Interactive init UI requires an interactive TTY. Unset AGENTPLANE_INIT_UI or omit --interactive-ui for the non-interactive route."})}function JX(e,t){if(e.isCancel(t))throw e.cancel("Init cancelled before apply."),new On("Init cancelled before apply.");return t}async function f$(e){zX({flags:e.flags,spec:e.spec});let t=KX(await Qj(),e.spec);try{let r=t;t.intro("AgentPlane init"),r$(t,"Setup","Choose the project defaults before AgentPlane writes files.");let n=await Ev({clack:r,flags:e.flags,defaultProfile:"normal"}),o=lt[n.setupProfilePreset],i=await Tv({clack:r,flags:e.flags}),a=await Pv({clack:r,flags:e.flags}),s=await Iv({clack:r,flags:e.flags,setupProfileMode:n.setupProfileMode}),c=await xv({clack:r,flags:e.flags}),d=await _v({clack:r,flags:e.flags,setupProfilePreset:n.setupProfilePreset,setupProfileMode:n.setupProfileMode}),l=await Ed(),p=await Sv({clack:r,flags:e.flags,setupProfilePreset:n.setupProfilePreset,setupProfileMode:n.setupProfileMode,cachedRecipes:l});await ff(p.recipes);let g=Ye.resolve(e.rootOverride??e.cwd),h="main",{gitRoot:f,gitRootExisted:b}=await nf({initRoot:g,baseBranchFallback:h}),w={gitRoot:f,agentplaneDir:Ye.join(f,".agentplane")},_=await ef({gitRoot:w.gitRoot,baseBranchFallback:h,isInteractive:!1,workflow:s.workflow,gitRootExisted:b}),x=Ye.join(w.agentplaneDir,"config.json"),C=Ye.join(w.agentplaneDir,"backends","local","backend.json"),j=Ye.join(w.agentplaneDir,"backends","redmine","backend.json"),T=c.backend==="redmine"?j:C,M=[w.agentplaneDir,Ye.join(w.agentplaneDir,"tasks"),Ye.join(w.agentplaneDir,"agents"),Ye.join(w.agentplaneDir,"cache"),Ye.join(w.agentplaneDir,"backends"),Ye.join(w.agentplaneDir,"backends",c.backend)],W=await tf({initDirs:M,initFiles:[x,T]}),Z=Ye.join(w.gitRoot,cn(i.policyGateway)),U=!await P(Z);W.length>0&&U&&(await ss(w.agentplaneDir,c.backend),await os({gitRoot:w.gitRoot,agentplaneDir:w.agentplaneDir,workflow:s.workflow,policyGateway:i.policyGateway,configPathAbs:x,backendPathAbs:T}));let J=e.flags.force||e.flags.backup?null:await Cv({clack:r,gitRoot:w.gitRoot,conflicts:W});if(await rf({gitRoot:w.gitRoot,conflicts:W,backup:e.flags.backup===!0||J==="backup",force:e.flags.force===!0||J==="overwrite"}),n$(t,[{label:"Profile",value:o.description},{label:"Gateway",value:i.policyGateway},{label:"Workflow",value:s.workflow},{label:"Backend",value:c.backend},{label:"Hooks",value:d.hooks},{label:"IDE",value:a.ide},{label:"Recipes",value:p.recipes.join(", ")||"none"},{label:"Install commit",value:!e.flags.gitignoreAgents}]),!JX(t,await t.confirm({message:"Apply this init plan?",initialValue:!0})))throw t.cancel("Init cancelled before apply."),new On("Init cancelled before apply.");let ye=buildExecutionProfile(d.executionProfile,{strictUnsafeConfirm:d.strictUnsafeConfirm});return await vv({clack:t,includeInstallCommit:!e.flags.gitignoreAgents,plan:{config:async()=>{await ss(w.agentplaneDir,c.backend),await wf({agentplaneDir:w.agentplaneDir,gitRoot:w.gitRoot,workflow:s.workflow,directCloseDirtyPolicy:s.directCloseDirtyPolicy,backendConfigPathAbs:T,requirePlanApproval:d.requirePlanApproval,requireNetworkApproval:d.requireNetworkApproval,requireVerifyApproval:d.requireVerifyApproval,execution:ye}),await bf({backend:c.backend,backendPath:T}),e.flags.gitignoreAgents&&await setPinnedBaseBranch({cwd:w.gitRoot,rootOverride:w.gitRoot,value:_});},agents:async()=>{let{installPaths:Y}=await os({gitRoot:w.gitRoot,agentplaneDir:w.agentplaneDir,workflow:s.workflow,policyGateway:i.policyGateway,configPathAbs:x,backendPathAbs:T});return c.backend==="redmine"&&(await _f({gitRoot:w.gitRoot}),Y.push(".env.example")),Y},workflow:async()=>(await xf({gitRoot:w.gitRoot,workflowMode:s.workflow,approvals:{requirePlanApproval:d.requirePlanApproval,requireVerifyApproval:d.requireVerifyApproval,requireNetworkApproval:d.requireNetworkApproval}})).installPaths.map(Re=>Ye.relative(w.gitRoot,Re)),gitignore:async()=>(await vf({gitRoot:w.gitRoot,includeAgentPromptFiles:e.flags.gitignoreAgents===!0}),[".gitignore"]),hooks:d.hooks?async()=>(await xo({cwd:e.cwd,rootOverride:e.rootOverride,quiet:!0}),[".agentplane/bin/agentplane"]):void 0,ideSync:async()=>(await of({cwd:e.cwd,rootOverride:e.rootOverride,ide:a.ide,gitRoot:w.gitRoot})).installPaths,recipes:async()=>{await gf({recipes:p.recipes,cwd:e.cwd,rootOverride:e.rootOverride});},installCommit:async Y=>{await Sa({gitRoot:w.gitRoot,baseBranch:_,installPaths:[...Y],version:gt(),skipHooks:!0});}}}),i$(t,w.gitRoot),process.stdout.write(`${Ye.relative(w.gitRoot,w.agentplaneDir)}
379
+ `),0}catch(r){throw r instanceof On?y({spec:e.spec,command:"init",message:r.message}):(a$(t,r),r instanceof m?r:O(r,{command:"init",root:e.rootOverride??null}))}}var g$=u(()=>{kd();oo();v();dn();H();D();ee();X_();Z_();ev();tv();Cf();cv();xr();p$();Rv();pv();fv();gv();kv();yv();});function XX(e){return e.interactiveUi===true||process.env.AGENTPLANE_INIT_UI==="interactive"||process.env.AGENTPLANE_INIT_UI==="v2"?true:e.yes||process.env.AGENTPLANE_PROMPTS==="plain"?false:process.stdin.isTTY===true&&process.stdout.isTTY===true}async function cs(e,t,r){let n=await pm(`
380
+ ${e}`,t,r);return process.stdout.write(`
381
+ `),n}async function h$(e,t){let r=await fm(`
382
+ ${e}`,t);return process.stdout.write(`
383
+ `),r}async function ZX(e){let t=await gm(`
384
+ ${e}`);return process.stdout.write(`
385
+ `),t}async function k$(e){let t=e.flags;if(XX(t))return f$(e);let r=t.ide??xe.ide,n=t.policyGateway??xe.policyGateway,o=t.workflow??xe.workflow,i=t.directCloseDirtyPolicy??xe.directCloseDirtyPolicy,a=t.backend??xe.backend,s=t.hooks??xe.hooks,c=t.recipes??xe.recipes,d=t.requirePlanApproval??xe.requirePlanApproval,l=t.requireNetworkApproval??xe.requireNetworkApproval,p=t.requireVerifyApproval??xe.requireVerifyApproval,g=t.executionProfile??xe.executionProfile,h=t.strictUnsafeConfirm??xe.strictUnsafeConfirm,f=t.setupProfile?lt[t.setupProfile].mode:"compact",b=t.setupProfile??"normal",w=process.stdin.isTTY&&!t.yes;if(!process.stdin.isTTY&&!t.yes&&(!t.workflow||t.requireNetworkApproval===void 0))throw y({spec:e.spec,command:"init",message:"Non-interactive init requires --yes or explicit values for: --workflow, --require-network-approval."});if(w){let _=Object.entries(lt).map(([T,M])=>`- ${T}: ${M.description}`);process.stdout.write(`${_.join(`
386
+ `)}
387
+
388
+ `),b=t.setupProfile??await cs("Setup profile",["light","normal","full-harness"],"normal");let x=lt[b];f=x.mode,s=t.hooks??x.defaultHooks,n=t.policyGateway??await cs("Policy gateway",["codex","claude"],n),t.strictUnsafeConfirm===void 0&&(h=x.defaultStrictUnsafeConfirm),t.requirePlanApproval===void 0&&(d=x.defaultRequirePlanApproval),t.requireNetworkApproval===void 0&&(l=x.defaultRequireNetworkApproval),t.requireVerifyApproval===void 0&&(p=x.defaultRequireVerifyApproval),t.executionProfile||(g=x.defaultExecutionProfile);let C=!t.workflow&&f==="full",j=!t.backend;if(r=t.ide??xe.ide,C&&(o=await cs("Workflow mode",["direct","branch_pr"],o)==="branch_pr"?"branch_pr":"direct"),o==="direct"&&f==="full"&&!t.directCloseDirtyPolicy&&(i=await cs("Direct close dirt policy",["allow-other-task-readmes","strict"],i==="strict"?"strict":"allow-other-task-readmes")==="strict"?"strict":"allow_other_task_readmes"),j&&(a=await cs("Task backend",["local","redmine"],a)==="redmine"?"redmine":"local"),f==="full"){if(t.executionProfile||(g=await cs("Execution profile",["conservative","balanced","aggressive"],g)),t.strictUnsafeConfirm===void 0&&(h=await h$("Require strict explicit confirmation for extra unsafe actions?",h)),t.requireNetworkApproval===void 0&&(l=await h$("Require explicit approval for network actions?",l)),!t.recipes){let T=await Ed();if(process.stdout.write(`${sv(T)}
389
+ `),T.length===0)c=[];else {let M=x.defaultRecipes.length>0?x.defaultRecipes.join(", "):"none",$=await ZX(`Materialize cached recipes (comma separated, or none) [default: ${M}]: `),W=$.trim().toLowerCase();W===""?c=[...x.defaultRecipes]:W==="none"?c=[]:c=$.split(",").map(Z=>Z.trim()).filter(Boolean);}}}else c=t.recipes??x.defaultRecipes,d=t.requirePlanApproval??x.defaultRequirePlanApproval,l=t.requireNetworkApproval??x.defaultRequireNetworkApproval,p=t.requireVerifyApproval??x.defaultRequireVerifyApproval,g=t.executionProfile??x.defaultExecutionProfile,h=t.strictUnsafeConfirm??x.defaultStrictUnsafeConfirm;}if(t.yes){let _=lt[b];r=t.ide??xe.ide,n=t.policyGateway??xe.policyGateway,o=t.workflow??xe.workflow,i=t.directCloseDirtyPolicy??xe.directCloseDirtyPolicy,a=t.backend??xe.backend,s=t.hooks??_.defaultHooks,c=t.recipes??_.defaultRecipes,d=t.requirePlanApproval??_.defaultRequirePlanApproval,l=t.requireNetworkApproval??_.defaultRequireNetworkApproval,p=t.requireVerifyApproval??_.defaultRequireVerifyApproval,g=t.executionProfile??_.defaultExecutionProfile,h=t.strictUnsafeConfirm??_.defaultStrictUnsafeConfirm;}await ff(c);try{let _=Ye.resolve(e.rootOverride??e.cwd),x="main",{gitRoot:C,gitRootExisted:j}=await nf({initRoot:_,baseBranchFallback:x}),T={gitRoot:C,agentplaneDir:Ye.join(C,".agentplane")},M=await ef({gitRoot:T.gitRoot,baseBranchFallback:x,isInteractive:w,workflow:o,gitRootExisted:j}),$=Ye.join(T.agentplaneDir,"config.json"),W=Ye.join(T.agentplaneDir,"backends","local","backend.json"),Z=Ye.join(T.agentplaneDir,"backends","redmine","backend.json"),U=a==="redmine"?Z:W,J=[T.agentplaneDir,Ye.join(T.agentplaneDir,"tasks"),Ye.join(T.agentplaneDir,"agents"),Ye.join(T.agentplaneDir,"cache"),Ye.join(T.agentplaneDir,"backends"),Ye.join(T.agentplaneDir,"backends",a)],ye=await tf({initDirs:J,initFiles:[$,U]}),Y=Ye.join(T.gitRoot,cn(n)),Re=!await P(Y);ye.length>0&&Re&&(await ss(T.agentplaneDir,a),await os({gitRoot:T.gitRoot,agentplaneDir:T.agentplaneDir,workflow:o,policyGateway:n,configPathAbs:$,backendPathAbs:U})),await rf({gitRoot:T.gitRoot,conflicts:ye,backup:t.backup===!0,force:t.force===!0}),await ss(T.agentplaneDir,a);let Ue=buildExecutionProfile(g,{strictUnsafeConfirm:h});await wf({agentplaneDir:T.agentplaneDir,gitRoot:T.gitRoot,workflow:o,directCloseDirtyPolicy:i,backendConfigPathAbs:U,requirePlanApproval:d,requireNetworkApproval:l,requireVerifyApproval:p,execution:Ue}),await bf({backend:a,backendPath:U}),a==="redmine"&&await _f({gitRoot:T.gitRoot});let{installPaths:V}=await os({gitRoot:T.gitRoot,agentplaneDir:T.agentplaneDir,workflow:o,policyGateway:n,configPathAbs:$,backendPathAbs:U});a==="redmine"&&V.push(".env.example"),await vf({gitRoot:T.gitRoot,includeAgentPromptFiles:t.gitignoreAgents===!0}),V.push(".gitignore");let se=await xf({gitRoot:T.gitRoot,workflowMode:o,approvals:{requirePlanApproval:d,requireVerifyApproval:p,requireNetworkApproval:l}});for(let Bo of se.installPaths)V.push(Ye.relative(T.gitRoot,Bo));t.gitignoreAgents&&await setPinnedBaseBranch({cwd:T.gitRoot,rootOverride:T.gitRoot,value:M}),s&&(await xo({cwd:e.cwd,rootOverride:e.rootOverride,quiet:!0}),V.push(".agentplane/bin/agentplane"));let Xe=await of({cwd:e.cwd,rootOverride:e.rootOverride,ide:r,gitRoot:T.gitRoot});return V.push(...Xe.installPaths),await gf({recipes:c,cwd:e.cwd,rootOverride:e.rootOverride}),t.gitignoreAgents||await Sa({gitRoot:T.gitRoot,baseBranch:M,installPaths:V,version:gt(),skipHooks:!0}),process.stdout.write(`${Ye.relative(T.gitRoot,T.agentplaneDir)}
390
+ `),0}catch(_){throw _ instanceof m?_:O(_,{command:"init",root:e.rootOverride??null})}}var y$=u(()=>{kd();oo();v();dn();D();ee();hm();H();X_();Z_();ev();tv();cv();xr();pv();fv();gv();kv();yv();g$();});function ds(e,t,r){let n=r.trim().toLowerCase();if(["1","true","yes","y","on"].includes(n))return true;if(["0","false","no","n","off"].includes(n))return false;throw y({spec:e,command:"init",message:Pm(t,r,"true|false")})}function w$(e){let t=e.trim().toLowerCase();return t==="none"||t===""?[]:e.split(",").map(r=>r.trim()).filter(Boolean)}function b$(e,t,r){let n=r.trim().toLowerCase();if(n==="strict")return "strict";if(n==="allow-other-task-readmes"||n==="allow_other_task_readmes")return "allow_other_task_readmes";throw y({spec:e,command:"init",message:Pm(t,r,"strict|allow-other-task-readmes")})}var _$=u(()=>{I();H();});var v$={};S(v$,{initSpec:()=>dr,runInit:()=>eZ});var dr,eZ,Av=u(()=>{H();y$();xr();_$();dr={id:["init"],group:"Setup",summary:"Initialize agentplane project files under .agentplane/.",description:"Creates .agentplane/ config, backend stubs, and agent templates in the target directory. If the target directory is not a git repository, it initializes one and (by default) writes an initial install commit. Use --gitignore-agents to keep agent templates local (gitignored) and skip the install commit. In interactive mode it prompts for missing inputs; use --yes for non-interactive mode.",options:[{kind:"string",name:"setup-profile",valueHint:"<light|normal|full-harness>",choices:["light","normal","full-harness","developer","vibecoder","manager","enterprise"],description:"Setup profile preset. Preferred values: light, normal, full-harness."},{kind:"string",name:"policy-gateway",valueHint:"<codex|claude>",choices:["codex","claude"],coerce:e=>e.trim().toLowerCase(),description:"Policy gateway file to install (codex -> AGENTS.md, claude -> CLAUDE.md)."},{kind:"string",name:"ide",valueHint:"<codex|cursor|windsurf>",choices:["codex","cursor","windsurf"],coerce:e=>e.trim().toLowerCase(),description:"IDE rules integration target (default: codex)."},{kind:"string",name:"workflow",valueHint:"<direct|branch_pr>",choices:["direct","branch_pr"],description:"Workflow mode (default: direct)."},{kind:"string",name:"direct-close-dirty-policy",valueHint:"<allow-other-task-readmes|strict>",choices:["allow-other-task-readmes","strict"],description:"Direct-mode close behavior when tracked dirt exists outside the active task: allow only other active task READMEs, or block on any unrelated tracked change."},{kind:"string",name:"backend",valueHint:"<local|redmine>",choices:["local","redmine"],coerce:e=>e.trim().toLowerCase(),description:"Task backend (default: local)."},{kind:"string",name:"hooks",valueHint:"<true|false>",description:"Install managed git hooks (default by setup profile: light=false, normal/full-harness=true)."},{kind:"string",name:"require-plan-approval",valueHint:"<true|false>",description:"Require explicit plan approval before starting work."},{kind:"string",name:"require-network-approval",valueHint:"<true|false>",description:"Require explicit approval before any network operation."},{kind:"string",name:"require-verify-approval",valueHint:"<true|false>",description:"Require explicit approval before recording verification."},{kind:"string",name:"execution-profile",valueHint:"<conservative|balanced|aggressive>",choices:["conservative","balanced","aggressive"],description:"Execution profile preset controlling autonomy, reasoning, and tool budgets."},{kind:"string",name:"strict-unsafe-confirm",valueHint:"<true|false>",description:"Require strict explicit confirmations for additional unsafe actions."},{kind:"string",name:"recipes",valueHint:"<none|id1,id2,...>",description:"Optional cached recipes to vendor during init (comma-separated), or 'none'."},{kind:"boolean",name:"force",default:false,description:"Overwrite init conflicts by deleting existing paths."},{kind:"boolean",name:"backup",default:false,description:"Backup init conflicts before overwriting."},{kind:"boolean",name:"yes",default:false,description:"Non-interactive mode (do not prompt; use defaults for missing flags)."},{kind:"boolean",name:"interactive-ui",default:false,description:"Use the interactive Clack-powered init UI."},{kind:"boolean",name:"experimental-ui",default:false,hidden:true,description:"Compatibility alias for --interactive-ui."},{kind:"boolean",name:"gitignore-agents",default:false,description:"Add gateway/agent files (AGENTS.md or CLAUDE.md and .agentplane/agents/) to .gitignore and skip the initial install commit."}],examples:[{cmd:"agentplane init",why:"Interactive setup (prompts for missing values)."},{cmd:"agentplane init --setup-profile light --yes",why:"Non-interactive setup with flexible defaults."},{cmd:"agentplane init --workflow direct --direct-close-dirty-policy allow-other-task-readmes --backend local --hooks true --require-network-approval true --yes",why:"Non-interactive setup with the tolerant direct close policy plus an explicit network-approval override."},{cmd:"agentplane init --workflow direct --direct-close-dirty-policy strict --yes",why:"Initialize direct mode with strict close-tail blocking on any unrelated tracked dirt."},{cmd:"agentplane init --force --yes",why:"Re-initialize, overwriting conflicts (non-interactive)."},{cmd:"agentplane init --yes --gitignore-agents",why:"Initialize without committing and keep agent prompts/templates local (gitignored)."}],validateRaw:e=>{if(e.extra.length>0)throw y({spec:dr,command:"init",message:`Unexpected argument: ${e.extra[0]}`})},parse:e=>{let t=e.opts.hooks,r=e.opts["require-plan-approval"],n=e.opts["require-network-approval"],o=e.opts["require-verify-approval"],i=e.opts.recipes;return {setupProfile:Fj(e.opts["setup-profile"]),policyGateway:e.opts["policy-gateway"],ide:e.opts.ide,workflow:e.opts.workflow,directCloseDirtyPolicy:e.opts["direct-close-dirty-policy"]===void 0?void 0:b$(dr,"--direct-close-dirty-policy",String(e.opts["direct-close-dirty-policy"])),backend:e.opts.backend,hooks:t===void 0?void 0:ds(dr,"--hooks",t),requirePlanApproval:r===void 0?void 0:ds(dr,"--require-plan-approval",r),requireNetworkApproval:n===void 0?void 0:ds(dr,"--require-network-approval",n),requireVerifyApproval:o===void 0?void 0:ds(dr,"--require-verify-approval",o),executionProfile:e.opts["execution-profile"],strictUnsafeConfirm:e.opts["strict-unsafe-confirm"]===void 0?void 0:ds(dr,"--strict-unsafe-confirm",String(e.opts["strict-unsafe-confirm"])),recipes:i===void 0?void 0:w$(i),force:e.opts.force===true,backup:e.opts.backup===true,interactiveUi:e.opts["interactive-ui"]===true||e.opts["experimental-ui"]===true,yes:e.opts.yes===true,gitignoreAgents:e.opts["gitignore-agents"]===true}},validate:e=>{if(e.force&&e.backup)throw y({spec:dr,command:"init",message:"Use either --force or --backup (not both)."})}},eZ=(e,t)=>k$({cwd:e.cwd,rootOverride:e.rootOverride,flags:t,spec:dr});});function tZ(e){switch(e){case "none":return {project:false,loadedConfig:false,taskContext:false};case "project":return {project:true,loadedConfig:false,taskContext:false};case "project+config":return {project:true,loadedConfig:true,taskContext:false};case "project+config+task":return {project:true,loadedConfig:true,taskContext:true}}}function B(e,t){let r=t.needs??"project+config+task";return {spec:e,load:n=>rZ(t,n),needs:r,dispatch:tZ(r),invocation:t.invocation}}function L(e){return function(r,n,o){return B(r,{module:e,runExport:n,...o})}}async function rZ(e,t){if(typeof e.load=="function")return e.load(t);let n=(await e.module())[e.runExport];if(typeof n!="function")throw new Error(`Command module does not export handler "${e.runExport}"`);return n}var Nn=u(()=>{});async function Pf(e){try{return await Rt.access(e),!0}catch{return false}}async function aZ(e){try{return (await Rt.stat(e)).isDirectory()}catch{return false}}async function sZ(e){let t=no("framework.manifest.json"),r={};try{r=JSON.parse(await Rt.readFile(t,"utf8"));}catch{return []}let n=Array.isArray(r.files)?r.files.filter(i=>i?.required===true&&typeof i.path=="string").map(i=>String(i.path).replaceAll("\\","/").trim()).filter(i=>i.startsWith(".agentplane/policy/")):[],o=[];for(let i of n)await Pf(Ye.join(e,i))||o.push(i);return o.toSorted()}function cZ(e){return {id:e.id,status:e.status,doc_version:e.doc_version}}async function R$(e){let t=Ye.join(e,".agentplane","tasks.json"),r="";try{r=await Rt.readFile(t,"utf8");}catch{return []}let n;try{n=JSON.parse(r);}catch{return []}return Array.isArray(n.tasks)?n.tasks:[]}async function C$(e){if(!e)return null;try{let t=await cE(e);return t===null?null:t.map(r=>cZ(r))}catch{return null}}function dZ(e){if(e.length===0)return [];let t=e.filter(a=>a.doc_version!==3);if(t.length===0)return [];let r=t.filter(a=>normalizeTaskStatus(a.status)!=="DONE"),n=e.length-t.length,o=t.map(a=>typeof a.id=="string"?a.id:"").filter(Boolean).slice(0,5).join(", "),i=n>0;return r.length>0?[ur({severity:"WARN",state:i?"task README migration is incomplete (active v2/v3 mixed state)":"task README format is still on legacy v2",likelyCause:"the workspace still contains active task READMEs that were never migrated to the README v3 contract",nextAction:{command:"agentplane task migrate-doc --all",reason:"upgrade all task READMEs to doc_version=3 before continuing active work"},details:[`Legacy tasks: ${t.length}; active legacy tasks: ${r.length}; README v3 tasks: ${n}`,o?`Examples: ${o}`:"Examples unavailable in tasks snapshot."]})]:[ur({severity:"INFO",state:i?"historical task archive still mixes README v2 and v3":"historical task archive still uses README v2",likelyCause:"older DONE tasks were never backfilled to README v3 after the task-document contract changed",nextAction:{command:"agentplane task migrate-doc --all",reason:"normalize archived task READMEs to the README v3 contract when convenient"},details:[`Legacy tasks: ${t.length}; active legacy tasks: 0; README v3 tasks: ${n}`,o?`Examples: ${o}`:"Examples unavailable in tasks snapshot."]})]}async function Dv(e,t){let r=await C$(t),n=r&&r.length>0?r:await R$(e);return dZ(n)}async function lZ(e,t){try{let r=t?.git??new GitContext({gitRoot:e});return new Set(await r.statusUntrackedPaths())}catch{return new Set}}async function mZ(e,t){let r=await C$(t),n=r&&r.length>0?r:await R$(e);if(n.length===0)return [];let o=(t?.config.paths.workflow_dir??".agentplane/tasks").replaceAll("\\","/"),i=await lZ(e,t);if(i.size===0)return [];let a=n.filter(d=>{let l=normalizeTaskStatus(d.status),p=typeof d.id=="string"?d.id.trim():"";return l!=="DONE"||!p?false:i.has(`${o}/${p}/README.md`)}).map(d=>String(d.id)).toSorted();if(a.length===0)return [];let s=a.slice(0,5).join(", "),c=`git add ${a.map(d=>`${o}/${d}/README.md`).join(" ")}`;return [ur({severity:"WARN",state:"DONE task archive README files exist on disk but are missing from the git index",likelyCause:"task metadata reached DONE state, but the human-readable task README archive never landed in a tracked close commit",nextAction:{command:c,reason:"stage the missing archived task README files and commit them before continuing"},details:[`Affected DONE tasks: ${a.length}`,s?`Examples: ${s}`:"Examples unavailable."]})]}function x$(e){return e.replaceAll(`\r
391
+ `,`
392
+ `).trim()}function uZ(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t={};for(let[r,n]of Object.entries(e)){let o=r.trim();!o||typeof n!="string"||(t[o]=n);}return Object.keys(t).length>0?t:null}async function pZ(e,t){let r=Ye.join(e,t?.config.paths.workflow_dir??".agentplane/tasks"),n;try{n=await Rt.readdir(r,{withFileTypes:!0});}catch{return []}let o=[];for(let s of n){if(!s.isDirectory())continue;let c=Ye.join(r,s.name,"README.md"),d="";try{d=await Rt.readFile(c,"utf8");}catch{continue}let l;try{l=parseTaskReadme(d);}catch{continue}let p=uZ(l.frontmatter.sections);if(!p)continue;let g=renderTaskDocFromSections(p);if(x$(l.body)===x$(g))continue;let h=typeof l.frontmatter.id=="string"&&l.frontmatter.id.trim()?l.frontmatter.id.trim():s.name,f=normalizeTaskStatus(l.frontmatter.status);o.push({id:h,status:f});}if(o.length===0)return [];let i=o.filter(s=>s.status!=="DONE").length,a=o.slice(0,5).map(s=>`${s.id}[${s.status}]`).join(", ");return [ur({severity:"WARN",state:"task README projection drift detected",likelyCause:"canonical frontmatter.sections no longer match the rendered task body on disk",nextAction:{command:"agentplane task normalize",reason:"re-render task README bodies from canonical one-file task state"},details:[`Drifted task READMEs: ${o.length}; active drifted tasks: ${i}`,a?`Examples: ${a}`:"Examples unavailable."]})]}function fZ(e){if(e?.backendId!=="redmine")return [];let{supports_task_revisions:t,supports_revision_guarded_writes:r}=e.taskBackend.capabilities;return t===r&&t===true?[]:t===false&&r===false?[ur({severity:"WARN",state:"Redmine backend is running in partial compatibility mode without canonical_state support",likelyCause:"AGENTPLANE_REDMINE_CUSTOM_FIELDS_CANONICAL_STATE is not configured, so Redmine cannot round-trip the full canonical task state or guard writes by remote revision",nextAction:{command:"agentplane backend inspect redmine --yes",reason:"inspect visible Redmine custom fields first, then wire AGENTPLANE_REDMINE_CUSTOM_FIELDS_CANONICAL_STATE to the correct field id"},details:[`Backend config: ${e.backendConfigPath}`,"Current capability flags: supports_task_revisions=false; supports_revision_guarded_writes=false","Legacy doc field syncing can still work, but the backend remains partial-compatibility only."]})]:[ur({severity:"WARN",state:"Redmine backend capability contract is internally inconsistent",likelyCause:"backend capability flags diverged, so doctor cannot rely on a single revision-guard readiness state",nextAction:{command:"inspect Redmine backend capability wiring and rerun agentplane doctor",reason:"restore a coherent readiness contract before relying on guarded remote writes"},details:[`Backend config: ${e.backendConfigPath}`,`Current capability flags: supports_task_revisions=${String(t)}; supports_revision_guarded_writes=${String(r)}`]})]}async function P$(e,t){let r=[],n=[Ye.join(e,".agentplane","config.json")];for(let c of n)await Pf(c)||r.push(`Missing required file: ${Ye.relative(e,c)}`);let o=await to({gitRoot:e,fallbackFlavor:"codex"});if(await Pf(o.absPath)||r.push("Missing required policy gateway file: AGENTS.md or CLAUDE.md"),await Pf(o.absPath)){let c=await sZ(e);if(c.length>0){let d=c.slice(0,8).join(", "),l=c.length>8?` (+${c.length-8} more)`:"";r.push(ur({severity:"ERROR",state:"framework-managed policy tree is incomplete",likelyCause:"the active AGENTS.md/CLAUDE.md gateway expects required policy files that are not installed in this workspace",nextAction:{command:"agentplane upgrade --yes",reason:"reinstall the managed policy tree from the currently active framework bundle"},details:[`Missing required files: ${d}${l}`,"If the installed CLI is older than the gateway, update or reinstall agentplane first and then rerun `agentplane upgrade --yes` (or `agentplane upgrade --remote --yes`).","Recovery guide: docs/help/legacy-upgrade-recovery.mdx"]}));}}let i=Ye.join(e,".agentplane","agents");return await aZ(i)?((await Rt.readdir(i)).some(c=>c.endsWith(".json"))||r.push("No agent profiles found in .agentplane/agents (*.json expected)."),r.push(...fZ(t?.ctx),...await Dv(e,t?.ctx),...await mZ(e,t?.ctx),...await pZ(e,t?.ctx)),r):(r.push("Missing required directory: .agentplane/agents"),r)}var Nv=u(()=>{Et();dn();N();ln();});async function Tf(e){let t=await e.init(),r=null;try{return await e.preflight?.(t),await e.materialize?.(t),r=await e.execute(t),e.finalize?await e.finalize(t,r):r}finally{await e.cleanup?.(t,r);}}var jv=u(()=>{});async function Kr(e){await ce({action:e.action??"network_access",config:e.config,yes:e.yes,reason:e.reason,interactive:e.interactive});}var ls=u(()=>{Be();});async function S$(e){try{await rm$1(e,{recursive:!0,force:!0});}catch{}}async function E$(e){for(let t of e.createdBackups)await S$(t);await S$(Ye.join(e.upgradeStateDir,"agent"));}async function I$(e){let{stdout:t}=await execFileAsync("git",["status","--short","--untracked-files=no"],{cwd:e,env:gitEnv(),maxBuffer:10485760}),r=String(t??"").split(/\r?\n/u).map(n=>n.trimEnd()).filter(n=>n.length>0);if(r.length!==0)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`Upgrade --auto requires a clean tracked working tree.
393
+ Found tracked changes:
394
+ ${r.map(n=>` ${n}`).join(`
395
+ `)}`,context:we({command:"upgrade"},{state:"managed upgrade cannot apply over tracked local edits",likelyCause:"auto-apply upgrade is about to replace framework-managed files, but the repository already has tracked modifications",nextAction:{command:"git status --short --untracked-files=no",reason:"inspect or clear tracked changes before rerunning `agentplane upgrade --yes`",reasonCode:"upgrade_dirty_tree"}})})}async function A$(e){let t=[...new Set(e.paths.filter(Boolean))];if(t.length===0)return null;await execFileAsync("git",["add","--",...t],{cwd:e.gitRoot,env:gitEnv(),maxBuffer:10*1024*1024});let{stdout:r}=await execFileAsync("git",["diff","--cached","--name-only","-z"],{cwd:e.gitRoot,env:gitEnv(),encoding:"buffer",maxBuffer:10*1024*1024});if(!(Buffer.isBuffer(r)?r.toString("utf8"):String(r??"")).split("\0").map(c=>c.trim()).some(Boolean))return null;let o=`\u2B06\uFE0F upgrade: apply framework ${e.versionLabel}`,i=`Upgrade-Version: ${e.versionLabel}
396
+ Source: ${e.source}
397
+ Managed-Changes: add=${e.additions}, update=${e.updates}, unchanged=${e.unchanged}
398
+ Incidents-Appended: ${e.incidentsAppendedCount}
399
+ `,a={allowTasks:false,allowPolicy:false,allowConfig:false,allowHooks:false,allowCI:false};for(let c of t){let d=fa({filePath:c,tasksPath:e.tasksPath,workflowDir:e.workflowDir});d==="tasks"&&(a.allowTasks=true),d==="policy"&&(a.allowPolicy=true),d==="config"&&(a.allowConfig=true),d==="hooks"&&(a.allowHooks=true),d==="ci"&&(a.allowCI=true);}try{await execFileAsync("git",["commit","-m",o,"-m",i],{cwd:e.gitRoot,env:{...gitEnv(),AGENTPLANE_ALLOW_TASKS:a.allowTasks?"1":"0",AGENTPLANE_ALLOW_POLICY:a.allowPolicy?"1":"0",AGENTPLANE_ALLOW_CONFIG:a.allowConfig?"1":"0",AGENTPLANE_ALLOW_HOOKS:a.allowHooks?"1":"0",AGENTPLANE_ALLOW_CI:a.allowCI?"1":"0"},maxBuffer:10*1024*1024});}catch(c){let d=c?.stderr??"";throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`Upgrade applied but failed to create the upgrade commit.
400
+ Fix commit policy/hook issues and commit the staged upgrade files as a dedicated upgrade commit.
401
+ `+(String(d).trim()?`Details:
402
+ ${String(d).trim()}`:""),context:we({command:"upgrade"},{state:"managed files were updated, but the upgrade commit was blocked",likelyCause:"the generated upgrade commit hit a git hook or commit policy failure after the framework files were already staged",nextAction:{command:`git commit -m "\u2B06\uFE0F upgrade: apply framework ${e.versionLabel}"`,reason:"record the already-staged framework changes as one dedicated upgrade commit after fixing the blocking hook or policy",reasonCode:"upgrade_commit_blocked"}})})}let{stdout:s}=await execFileAsync("git",["rev-parse","HEAD"],{cwd:e.gitRoot,env:gitEnv()});return {hash:String(s??"").trim(),subject:o}}async function O$(e){for(let t of [...e.additions,...e.updates]){let r=Ye.join(e.gitRoot,t);if(e.backup&&await P(r)){let i=await nu(r);e.createdBackups.push(i);}await mkdir(Ye.dirname(r),{recursive:true});let n=e.fileContents.get(t);if(n){if(t==="AGENTS.md"||t==="CLAUDE.md")try{if((await lstat(r)).isSymbolicLink()){let a=await readlink(r),s=Ye.resolve(Ye.dirname(r),a),c=Ye.relative(e.gitRoot,s);if(c.startsWith("..")||Ye.isAbsolute(c))throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Refusing to overwrite symlinked ${t} target outside repo: ${a}. Replace the symlink with a regular file and retry.`})}}catch(i){if(i?.code!=="ENOENT")throw i}await writeFile(r,n);}let o=e.toBaselineKey(t);if(o&&n){let i=Ye.join(e.baselineDir,o);await mkdir(Ye.dirname(i),{recursive:true}),await writeFile(i,n);}}}async function D$(e){let t=e.normalizedSourceToPersist!==null,r=e.hasManagedMutations||t;if(r){let n={...e.rawConfig};e.normalizedSourceToPersist&&setByDottedKey(n,"framework.source",e.normalizedSourceToPersist),setByDottedKey(n,"framework.last_update",new Date().toISOString()),e.expectedCliVersionToPersist&&setByDottedKey(n,"framework.cli.expected_version",e.expectedCliVersionToPersist),await saveConfig(e.agentplaneDir,n);}return await writeFile(e.statePath,JSON.stringify({applied_at:new Date().toISOString(),source:e.source,updated:{add:e.additions,update:e.updates,unchanged:e.skipped}},null,2)+`
403
+ `,"utf8"),await writeFile(Ye.join(e.upgradeStateDir,"last-review.json"),JSON.stringify({generated_at:new Date().toISOString(),counts:{total:e.reviewRecords.length,needsSemanticReview:e.reviewRecords.filter(n=>n.needsSemanticReview).length},files:e.reviewRecords},null,2)+`
404
+ `,"utf8"),r}var N$=u(()=>{ee();G();Et();v();Jo();});function CZ(e){return new Promise(t=>{setTimeout(t,e);})}async function PZ(e,t){let r=new AbortController,n=setTimeout(()=>r.abort(),t);try{return await fetch(e,{headers:{"User-Agent":"agentplane"},signal:r.signal})}finally{clearTimeout(n);}}async function M$(e,t){let r;for(let n=1;n<=j$;n+=1)try{return await PZ(e,t)}catch(o){r=o,n<j$&&await CZ(RZ*n);}throw r}async function Ef(e,t=$$){try{let r=await M$(e,t);if(!r.ok)throw new m({exitCode:k("E_NETWORK"),code:"E_NETWORK",message:`Failed to fetch ${e} (${r.status} ${r.statusText})`});return await r.json()}catch(r){throw r instanceof m?r:new m({exitCode:k("E_NETWORK"),code:"E_NETWORK",message:`Failed to fetch ${e}`})}}async function F$(e,t=$$){try{let r=await M$(e,t);if(!r.ok)throw new m({exitCode:k("E_NETWORK"),code:"E_NETWORK",message:`Failed to fetch ${e} (${r.status} ${r.statusText})`});return await r.text()}catch(r){throw r instanceof m?r:new m({exitCode:k("E_NETWORK"),code:"E_NETWORK",message:`Failed to fetch ${e}`})}}async function jn(e,t,r=xZ){let n=new AbortController,o=setTimeout(()=>n.abort(),r);try{let i=await fetch(e,{headers:{"User-Agent":"agentplane"},signal:n.signal});if(!i.ok)throw new m({exitCode:k("E_NETWORK"),code:"E_NETWORK",message:`Failed to download ${e} (${i.status} ${i.statusText})`});if(i.body){let a=Readable.fromWeb(i.body);await pipeline(a,createWriteStream(t));}else {let a=Buffer.from(await i.arrayBuffer());await writeFile(t,a);}}catch(i){throw i instanceof m?i:new m({exitCode:k("E_NETWORK"),code:"E_NETWORK",message:`Failed to download ${e}`})}finally{clearTimeout(o);}}var $$,xZ,j$,RZ,If=u(()=>{G();v();$$=5e3,xZ=3e4,j$=2,RZ=100;});async function Af(e){let t=await readFile(e);return createHash("sha256").update(t).digest("hex")}function B$(e){let t=e.trim();return t?t.split(/\s+/)[0]:""}var Mv=u(()=>{});async function DZ(e,t){if(t==="zip"){let o=await FZ(e),i=o.map(s=>s.name),a=o.filter(s=>s.isSymlink).map(s=>s.name);return q$(i,a)}let{entries:r,symlinks:n}=await MZ(e);return q$(r,n)}function NZ(e){let t=e.toLowerCase();return t.endsWith(".tar.gz")||t.endsWith(".tgz")?"tar":t.endsWith(".zip")?"zip":null}async function Of(e){let t=NZ(e.archivePath);if(!t)throw new m({exitCode:2,code:"E_USAGE",message:`Unsupported archive type: ${e.archivePath} (expected .tar.gz, .tgz, or .zip)`});let r=await DZ(e.archivePath,t);if(r.length>0){let n=r[0],o=r.length>1?` (+${r.length-1} more)`:"";throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Unsafe archive entry: ${n.entry} (${n.reason})${o}`})}if(t==="tar"){await runProcess({command:"tar",args:["-xzf",e.archivePath,"-C",e.destDir]});return}await runProcess({command:"unzip",args:["-q",e.archivePath,"-d",e.destDir]});}function q$(e,t){let r=[],n=new Set(t);for(let o of e){let i=o.replaceAll("\\","/");if(i.includes("\0")){r.push({entry:o,reason:"null byte"});continue}if(i.startsWith("/")||i.startsWith("\\")){r.push({entry:o,reason:"absolute path"});continue}if(/^[A-Za-z]:/.test(i)){r.push({entry:o,reason:"drive letter path"});continue}let a=Ye.posix.normalize(i);if(a===".."||a.startsWith("../")){r.push({entry:o,reason:"path traversal"});continue}(n.has(o)||n.has(i)||n.has(a))&&r.push({entry:o,reason:"symlink entry"});}return r}function jZ(e){let t=e.toString("utf8").replace(/\0.*$/u,"").trim();if(!t)return 0;let r=Number.parseInt(t,8);return Number.isFinite(r)&&r>=0?r:0}function $Z(e){for(let t of e)if(t!==0)return false;return true}async function MZ(e){let t;try{t=await readFile(e);}catch(a){let s=a;throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Failed to read archive: ${e}${s?.message?`
405
+ ${s.message}`:""}`})}let r;try{r=gunzipSync(t);}catch(a){let s=a;throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Failed to gunzip tar archive: ${e}`+(s?.message?`
406
+ ${s.message}`:"")})}let n=[],o=[],i=0;for(;i+512<=r.length;){let a=r.subarray(i,i+512);if(i+=512,$Z(a))break;let s=a.subarray(0,100).toString("utf8").replace(/\0.*$/u,""),c=a.subarray(345,500).toString("utf8").replace(/\0.*$/u,""),d=c?`${c}/${s}`:s,l=jZ(a.subarray(124,136)),p=a.subarray(156,157).toString("utf8");d&&(n.push(d),p==="2"&&o.push(d));let g=Math.ceil(l/512);i+=g*512;}return {entries:n,symlinks:o}}function FZ(e){return new Promise((t,r)=>{OZ.open(e,{lazyEntries:true},(n,o)=>{if(n||!o){r(n??new Error("Failed to open zip archive"));return}let i=[];o.readEntry(),o.on("entry",a=>{i.push({name:a.fileName,isSymlink:BZ(a)}),o.readEntry();}),o.on("end",()=>{o.close(),t(i);}),o.on("error",a=>{o.close(),r(a);});});})}function BZ(e){return (e.externalFileAttributes>>>16&61440)===40960}var Fv=u(()=>{v();G();});function G$(e){return !!(e===Hv||e===".agentplane/tasks.json"||e.startsWith(".agentplane/backends/")||e.startsWith(".agentplane/worktrees/")||e.startsWith(".agentplane/recipes/")||e.startsWith(".agentplane/tasks/")||e.startsWith(".agentplane/.upgrade/")||e===".git"||e.startsWith(".git/"))}function V$(e){return !!(e==="AGENTS.md"||e==="CLAUDE.md"||e.startsWith(".agentplane/agents/")&&e.endsWith(".json")||e.startsWith(".agentplane/policy/")&&(e.endsWith(".md")||e.endsWith(".ts")||e.endsWith(".js")||e.endsWith(".mjs")))}function qZ(e){return !!e&&typeof e=="object"&&!Array.isArray(e)}function Df(e){if(Array.isArray(e))return e.map(t=>Df(t));if(qZ(e)){let t={};for(let r of Object.keys(e).toSorted())t[r]=Df(e[r]);return t}return e}function HZ(e,t){let r=JSON.stringify(Df(e))??"__undefined__",n=JSON.stringify(Df(t))??"__undefined__";return r===n}function Nd(e){if(e.aText===null&&e.bText===null)return false;if(e.aText===null||e.bText===null)return true;if(e.type==="json")try{let t=JSON.parse(e.aText),r=JSON.parse(e.bText);return !HZ(t,r)}catch{return e.aText.trim()!==e.bText.trim()}return e.aText.trimEnd()!==e.bText.trimEnd()}function Bv(e){let t=e.replaceAll(`\r
407
+ `,`
408
+ `).split(`
409
+ `),r=[];for(let[o,i]of t.entries())/^\s*-\s*id:\s+/i.test(i??"")&&r.push(o);let n=[];for(let[o,i]of r.entries()){let a=r.at(o+1)??t.length,s=t.slice(i,a);for(;s.length>0&&!(s[0]??"").trim();)s.shift();for(;s.length>0&&!(s.at(-1)??"").trim();)s.pop();let c=s.join(`
410
+ `).trim();c&&n.push(c);}return n}function Lv(e){return e.replaceAll(`\r
411
+ `,`
412
+ `).split(`
413
+ `).map(t=>t.trimEnd()).join(`
414
+ `).trim()}function qv(e){let t=e.replaceAll(`\r
415
+ `,`
416
+ `).split(`
417
+ `),r=t.findIndex(o=>/^\s*##\s+Entries\s*$/i.test(o));if(r===-1)return null;let n=t.length;for(let o=r+1;o<t.length;o++)if(/^\s*##\s+/.test(t[o]??"")){n=o;break}return {before:t.slice(0,r+1).join(`
418
+ `),entriesBody:t.slice(r+1,n).join(`
419
+ `),after:t.slice(n).join(`
420
+ `)}}function U$(e){if(!e.incomingText.trim())return {nextText:e.currentText,appended:false,appendedCount:0};let r=qv(e.incomingText),n=qv(e.currentText);if(!r||!n)return {nextText:e.incomingText,appended:false,appendedCount:0};let o=Bv(r.entriesBody).map(w=>Lv(w)),i=Bv(n.entriesBody).map(w=>Lv(w));if(i.length===0)return {nextText:e.incomingText,appended:false,appendedCount:0};let a=e.baselineText?qv(e.baselineText):null,s=a?Bv(a.entriesBody).map(w=>Lv(w)):[],c=new Set(s),d=new Set(o),p=i.filter(w=>!(c.size>0&&c.has(w))).filter(w=>!d.has(w));if(p.length===0)return {nextText:e.incomingText,appended:false,appendedCount:0};let g=[...o,...p],h=g.length>0?`
421
+
422
+ ${g.join(`
423
+
424
+ `)}
425
+ `:`
426
+
427
+ - None yet.
428
+ `,f=r.after?`
429
+ ${r.after.trimStart()}`:"";return {nextText:`${r.before.trimEnd()}${h}${LZ}
430
+ ${f}
431
+ `,appended:true,appendedCount:p.length}}function Gv(e){let t=e.trim();return t?/^v\d/i.test(t)?t:`v${t}`:"unknown"}function W$(e){let t=e.trim().replace(/^v/i,"");return t.length>0?t:null}function Nf(e){return e==="AGENTS.md"?"AGENTS.md":e==="CLAUDE.md"?"CLAUDE.md":e.startsWith(".agentplane/")?e.slice(12):null}var H$,LZ,Hv,jf=u(()=>{H$=".agentplane/policy/incidents.md",LZ="<!-- AGENTPLANE:UPGRADE-APPEND incidents.md -->",Hv=".agentplane/config.json";});function z$(e){return e.bundleLayout==="local_assets"?"local installed agentplane CLI assets":e.bundleLayout==="repo_tarball"?"GitHub repo tarball fallback":e.hasExplicitBundle?"explicit upgrade bundle":e.useRemote?"GitHub release bundle":"upgrade bundle"}async function K$(e){let t=await readFile(e,"utf8"),r=JSON.parse(t);if(r?.schema_version!==1||!Array.isArray(r?.files))throw new m({exitCode:3,code:"E_VALIDATION",message:"Invalid framework.manifest.json (expected schema_version=1 and files array)."});return r}function WZ(e){let t=e.trim();if(!t)throw new Error(sI("config.framework.source"));if(!t.includes("github.com"))throw new Error(he("config.framework.source","GitHub URL"));try{let n=new URL(t).pathname.replaceAll(".git","").split("/").filter(Boolean);if(n.length<2)throw new Error(Ot("GitHub repo URL",t,"owner/repo"));return {owner:n[0],repo:n[1]}}catch{throw new Error(Ot("GitHub repo URL",t,"owner/repo"))}}function Vv(e){let{owner:t,repo:r}=WZ(e);return {source:`https://github.com/${t}/${r}`,owner:t,repo:r}}function Uv(e){let t=Array.isArray(e.release.assets)?e.release.assets:[],r=t.find(i=>i?.name===e.assetName),n=t.find(i=>i?.name===e.checksumName);if(r?.browser_download_url&&n?.browser_download_url)return {kind:"assets",bundleUrl:r.browser_download_url,checksumUrl:n.browser_download_url};let o=typeof e.release.tarball_url=="string"?e.release.tarball_url:"";if(!o)throw new m({exitCode:k("E_NETWORK"),code:"E_NETWORK",message:`Upgrade assets not found in ${e.owner}/${e.repo} release`});return {kind:"tarball",tarballUrl:o}}function zZ(e){let t=e.tag.trim();if(!t)throw new Error("tag is required");return `https://codeload.github.com/${e.owner}/${e.repo}/tar.gz/${encodeURIComponent(t)}`}function Wv(e){let t=typeof e.explicitTag=="string"&&e.explicitTag.trim()||typeof e.release.tag_name=="string"&&e.release.tag_name.trim()||"";if(t)return zZ({owner:e.owner,repo:e.repo,tag:t});let r=typeof e.release.tarball_url=="string"?e.release.tarball_url:"";if(r)return r;throw new m({exitCode:k("E_NETWORK"),code:"E_NETWORK",message:"GitHub release did not provide tag_name or tarball_url; cannot fall back to repo tarball."})}async function J$(e){let t=await readdir(e,{withFileTypes:true}),r=t.filter(o=>o.isDirectory()).map(o=>o.name);return t.filter(o=>o.isFile()).map(o=>o.name).length===0&&r.length===1?Ye.join(e,r[0]):e}var $f=u(()=>{I();G();v();});async function Z$(e){let{flags:t}=e,r=!!t.bundle,n=!!t.source||!!t.tag||!!t.asset||!!t.checksumAsset,o=t.remote===true||n,i=await mkdtemp(Ye.join(Q$.tmpdir(),"agentplane-upgrade-")),a=null,s="upgrade_bundle",c="",d=null,l=Gv(gt()),p="";if(!r&&!o)s="local_assets",c=fileURLToPath(e.assetsDirUrl),p=fileURLToPath(new URL("framework.manifest.json",e.assetsDirUrl));else {let h="",f="";if(t.bundle){let w=t.bundle.startsWith("http://")||t.bundle.startsWith("https://");h=w?Ye.join(i,"bundle.tar.gz"):Ye.resolve(t.bundle),w&&(await e.ensureApproved("upgrade downloads the bundle/checksum from the network"),await jn(t.bundle,h,jd));let _=t.checksum??"",x=_.startsWith("http://")||_.startsWith("https://");f=x?Ye.join(i,"bundle.tar.gz.sha256"):Ye.resolve(_),x&&(await e.ensureApproved("upgrade downloads the bundle/checksum from the network"),await jn(_,f,jd));}else {let w=t.source??e.frameworkSource,_=Vv(w),x=t.tag?`https://api.github.com/repos/${_.owner}/${_.repo}/releases/tags/${t.tag}`:`https://api.github.com/repos/${_.owner}/${_.repo}/releases/latest`;await e.ensureApproved("upgrade fetches release metadata and downloads assets from the network");let C=await Ef(x,JZ),j=typeof C.tag_name=="string"&&C.tag_name.trim()||typeof t.tag=="string"&&t.tag.trim()||"";j&&(l=Gv(j));let T=Uv({release:C,owner:_.owner,repo:_.repo,assetName:t.asset??Mf,checksumName:t.checksumAsset??Ff});if(T.kind==="assets")h=Ye.join(i,t.asset??Mf),f=Ye.join(i,t.checksumAsset??Ff),await jn(T.bundleUrl,h,jd),await jn(T.checksumUrl,f,jd);else {if(!t.allowTarball)throw new m({exitCode:k("E_NETWORK"),code:"E_NETWORK",message:`Upgrade assets ${t.asset??Mf}/${t.checksumAsset??Ff} not found in ${_.owner}/${_.repo} release. Publish the upgrade bundle assets, or re-run with --allow-tarball to download a repo tarball (no checksum verification).`});process.stderr.write(`${ie(`upgrade release does not include ${t.asset??Mf}/${t.checksumAsset??Ff}; falling back to repo tarball without checksum verification`)}
432
+ `),s="repo_tarball",h=Ye.join(i,"source.tar.gz");let M=Wv({release:C,owner:_.owner,repo:_.repo,explicitTag:t.tag});await jn(M,h,jd),f="";}}if(f){let w=B$(await readFile(f,"utf8"));if(!w)throw new m({exitCode:3,code:"E_VALIDATION",message:"Upgrade checksum file is empty or invalid"});let _=await Af(h);if(_!==w)throw new m({exitCode:3,code:"E_VALIDATION",message:`Upgrade checksum mismatch (expected ${w}, got ${_})`})}a=await mkdtemp(Ye.join(Q$.tmpdir(),"agentplane-upgrade-extract-")),await Of({archivePath:h,destDir:a});let b=await J$(a);c=s==="repo_tarball"?Ye.join(b,"packages","agentplane","assets"):b,p=Ye.join(c,"framework.manifest.json");}let g=await K$(p);return {tempRoot:i,extractRoot:a,bundleLayout:s,bundleRoot:c,manifest:g,normalizedSourceToPersist:d,upgradeVersionLabel:l}}var Mf,Ff,jd,JZ,eM=u(()=>{If();Mv();Fv();G();I();oo();v();jf();$f();Mf="agentplane-upgrade.tar.gz",Ff="agentplane-upgrade.tar.gz.sha256",jd=6e4,JZ=15e3;});async function YZ(e){try{return await readFile(Ye.join(e.baselineDirNew,e.baselineKey),"utf8")}catch{try{return await readFile(Ye.join(e.baselineDirLegacy,e.baselineKey),"utf8")}catch{return null}}}async function QZ(e){return await P(Ye.join(e,"AGENTS.md"))?"AGENTS.md":await P(Ye.join(e,"CLAUDE.md"))?"CLAUDE.md":"AGENTS.md"}async function tM(e){let t=[],r=[],n=[],o=[],i=new Map,a=[],s=[],c=0,d=await QZ(e.gitRoot),l=p=>p==="AGENTS.md"&&d==="CLAUDE.md"?"CLAUDE.md":p;for(let p of e.manifest.files){let g=p.path.replaceAll("\\","/").trim();if(!g||g.startsWith("..")||Ye.isAbsolute(g))throw new m({exitCode:3,code:"E_VALIDATION",message:`Invalid manifest path: ${p.path}`});if(G$(g))throw new m({exitCode:3,code:"E_VALIDATION",message:`Manifest includes a denied path: ${g}`});if(!V$(g))throw new m({exitCode:3,code:"E_VALIDATION",message:`Manifest path not allowed: ${g}`});let h=l(g),f=Ye.join(e.gitRoot,h),b=await Zt(f);if(b==="dir")throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Upgrade target is a directory: ${h}`});let w=(p.source_path??p.path).replaceAll("\\","/").trim(),_=h==="CLAUDE.md"&&w==="AGENTS.md"?"CLAUDE.md":w,x=[...new Set([_,w])],C=null;for(let V of x)try{C=await readFile(Ye.join(e.bundleRoot,V));break}catch{}if(!C){p.required&&a.push(h);continue}let j=null;b!==null&&(j=await readFile(f));let T=C.toString("utf8"),M=j?j.toString("utf8"):null,$=Nf(h),W=$?await YZ({baselineDirNew:e.baselineDirNew,baselineDirLegacy:e.baselineDirLegacy,baselineKey:$}):null,Z=W!==null,U=Z&&M!==null?Nd({type:p.type,aText:M,bText:W}):null,J=Z?Nd({type:p.type,aText:T,bText:W}):null,pe=M===null?false:Nd({type:p.type,aText:M,bText:T})===false;if(M!==null&&pe){n.push(h),s.push({relPath:h,mergeStrategy:p.merge_strategy,hasBaseline:Z,changedCurrentVsBaseline:U,changedIncomingVsBaseline:J,currentDiffersFromIncoming:false,needsSemanticReview:false,mergeApplied:false,mergePath:"none"});continue}if(M!==null&&U===false){r.push(h),i.set(h,C),s.push({relPath:h,mergeStrategy:p.merge_strategy,hasBaseline:Z,changedCurrentVsBaseline:U,changedIncomingVsBaseline:J,currentDiffersFromIncoming:true,needsSemanticReview:false,mergeApplied:false,mergePath:"none"});continue}let ye=false,Y="none",Re=C;if(j&&h===H$){let V=U$({incomingText:C.toString("utf8"),currentText:j.toString("utf8"),baselineText:W});Re=Buffer.from(V.nextText,"utf8"),V.appended&&(o.push(h),ye=true,Y="incidentsAppend",c+=V.appendedCount);}let Ue=M===null?false:Nd({type:p.type,aText:M,bText:T});s.push({relPath:h,mergeStrategy:p.merge_strategy,hasBaseline:Z,changedCurrentVsBaseline:U,changedIncomingVsBaseline:J,currentDiffersFromIncoming:Ue,needsSemanticReview:false,mergeApplied:ye,mergePath:Y}),i.set(h,Re),b===null?t.push(h):j&&Buffer.compare(j,Re)===0?n.push(h):r.push(h);}if(a.length>0)throw new m({exitCode:3,code:"E_VALIDATION",message:`Upgrade bundle is missing required managed files: ${a.join(", ")}`});return {additions:t,updates:r,skipped:n,merged:o,fileContents:i,reviewRecords:s,incidentsAppendedCount:c}}var rM=u(()=>{ee();G();v();jf();});function nM(e){Md.line(`Upgrade dry-run: ${e.additions.length} add, ${e.updates.length} update, ${e.skipped.length} unchanged`);for(let t of e.additions)Md.line(`ADD ${t}`);for(let t of e.updates)Md.line(`UPDATE ${t}`);for(let t of e.skipped)Md.line(`SKIP ${t}`);for(let t of e.merged)Md.line(`MERGE ${t}`);}async function oM(e){let t=new Date().toISOString().replaceAll(":","-").replaceAll(".","-"),r=Ye.join(e.runRoot,t);await mkdir(r,{recursive:true});let n=e.manifest.files.map(c=>c.path.replaceAll("\\","/").trim()),o=e.reviewRecords.filter(c=>c.needsSemanticReview).length,i=`# agentplane upgrade plan (${t})
433
+
434
+ Mode: agent-assisted review (no files modified)
435
+
436
+ ## Summary
437
+
438
+ - additions: ${e.additions.length}
439
+ - updates: ${e.updates.length}
440
+ - unchanged: ${e.skipped.length}
441
+ - merged (auto-safe transforms already applied to incoming): ${e.merged.length}
442
+
443
+ ## Managed files (manifest)
444
+
445
+ `+n.map(c=>`- ${c}`).join(`
446
+ `)+`
447
+
448
+ ## Proposed changes
449
+
450
+ `+e.additions.map(c=>`- ADD ${c}`).join(`
451
+ `)+(e.additions.length>0?`
452
+ `:"")+e.updates.map(c=>`- UPDATE ${c}`).join(`
453
+ `)+(e.updates.length>0?`
454
+ `:"")+e.merged.map(c=>`- MERGE ${c}`).join(`
455
+ `)+(e.merged.length>0?`
456
+ `:"")+e.skipped.map(c=>`- SKIP ${c}`).join(`
457
+ `)+(e.skipped.length>0?`
458
+ `:"")+"\n## Next steps\n\n1. Review the proposed changes list.\n2. Apply changes manually or re-run without `--agent` to apply managed files.\n3. Run `agentplane doctor` (or `agentplane doctor --fix`) and ensure checks pass.\n",a=`# Upgrade constraints
459
+
460
+ This upgrade is restricted to framework-managed files only.
461
+
462
+ ## Must not touch
463
+
464
+ - .agentplane/tasks/** (task data)
465
+ - .agentplane/tasks.json (export snapshot)
466
+ - .agentplane/backends/** (backend configuration)
467
+ - .agentplane/config.json (project config)
468
+ - .git/**
469
+
470
+ ## Notes
471
+
472
+ - The upgrade bundle is validated against framework.manifest.json.
473
+ - The policy gateway file at workspace root is AGENTS.md or CLAUDE.md.
474
+ `,s=`# Upgrade report (${t})
475
+
476
+ ## Actions taken
477
+
478
+ - [ ] Reviewed plan.md
479
+ - [ ] Applied changes (manual or --auto)
480
+ - [ ] Ran doctor
481
+ - [ ] Ran tests / lint
482
+
483
+ ## Notes
484
+
485
+ -
486
+ `;return await writeFile(Ye.join(r,"plan.md"),i,"utf8"),await writeFile(Ye.join(r,"constraints.md"),a,"utf8"),await writeFile(Ye.join(r,"report.md"),s,"utf8"),await writeFile(Ye.join(r,"files.json"),JSON.stringify({additions:e.additions,updates:e.updates,skipped:e.skipped,merged:e.merged},null,2)+`
487
+ `,"utf8"),await writeFile(Ye.join(r,"review.json"),JSON.stringify({generated_at:new Date().toISOString(),counts:{total:e.reviewRecords.length,needsSemanticReview:o},files:e.reviewRecords},null,2)+`
488
+ `,"utf8"),{relRunDir:Ye.relative(e.gitRoot,r),needsReviewCount:o}}var Md,iM=u(()=>{I();Md=A();});async function aM(e){let t=e.flags;if(t.bundle&&!t.checksum||!t.bundle&&t.checksum)throw new m({exitCode:2,code:"E_USAGE",message:"Options --bundle and --checksum must be provided together (or omitted together)."});let r=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=await loadConfig(r.agentplaneDir),o=await R({cwd:e.cwd,rootOverride:e.rootOverride??null,resolvedProject:r,config:n.config});t.mode==="auto"&&!t.dryRun&&await I$(r.gitRoot);let i=Ye.join(r.agentplaneDir,".upgrade"),a=Ye.join(i,"lock.json"),s=Ye.join(i,"state.json"),c=Ye.join(i,"baseline"),d=Ye.join(r.agentplaneDir,"upgrade","baseline");if(await mkdir(i,{recursive:true}),await P(a))throw new m({exitCode:2,code:"E_USAGE",message:`Upgrade is locked (found ${Ye.relative(r.gitRoot,a)})`});await writeFile(a,JSON.stringify({pid:process.pid,started_at:new Date().toISOString()},null,2)+`
489
+ `,"utf8");let l=true,p=false,g=async x=>{p||(await Kr({action:"upgrade_apply",config:n.config,yes:t.yes,reason:x}),p=true);},h=!!t.bundle,f=!!t.source||!!t.tag||!!t.asset||!!t.checksumAsset,b=t.remote===true||f,w=[],_=null;return await Tf({init:()=>null,materialize:async()=>{_=await Z$({flags:t,frameworkSource:n.config.framework.source,assetsDirUrl:n9,ensureApproved:g});let x=t.dryRun?"dry-run":t.mode==="agent"?"review":"apply";process.stdout.write(`Upgrade source: ${z$({bundleLayout:_.bundleLayout,hasExplicitBundle:h,useRemote:b})}
490
+ Upgrade version: ${_.upgradeVersionLabel}
491
+ Upgrade mode: ${x}
492
+ `);},execute:async()=>{if(!_)throw new m({exitCode:k("E_IO"),code:"E_IO",message:"Upgrade bundle did not materialize correctly"});let{additions:x,updates:C,skipped:j,merged:T,fileContents:M,reviewRecords:$,incidentsAppendedCount:W}=await tM({gitRoot:r.gitRoot,manifest:_.manifest,bundleRoot:_.bundleRoot,baselineDirNew:c,baselineDirLegacy:d});if(t.dryRun)return nM({additions:x,updates:C,skipped:j,merged:T}),0;let Z=$.filter(se=>se.needsSemanticReview);if(t.mode==="agent"){if(x.length===0&&C.length===0&&Z.length===0)return process.stdout.write(`Upgrade plan: no managed changes detected
493
+ `),0;let{relRunDir:se,needsReviewCount:Xe}=await oM({gitRoot:r.gitRoot,runRoot:Ye.join(i,"agent"),manifest:_.manifest,additions:x,updates:C,skipped:j,merged:T,reviewRecords:$});return process.stdout.write(`Upgrade plan written: ${se}
494
+ `),process.stdout.write(`Review-required files: ${Xe}
495
+ `),0}await O$({gitRoot:r.gitRoot,additions:x,updates:C,backup:t.backup,fileContents:M,baselineDir:c,createdBackups:w,toBaselineKey:Nf});let U=t.migrateTaskDocs?await Wb({cwd:e.cwd,rootOverride:e.rootOverride??null,all:true,taskIds:[],resolvedProject:r,config:n.config,ctx:o}):{changed:0,changedPaths:[]};if(t.migrateTaskDocs){let se=U.changed>0?`changed=${U.changed}`:"already current";process.stdout.write(`Task README migration: ${se}
496
+ `);}let J=x.length>0||C.length>0,pe=await D$({agentplaneDir:r.agentplaneDir,rawConfig:n.raw,normalizedSourceToPersist:_.normalizedSourceToPersist,expectedCliVersionToPersist:W$(_.upgradeVersionLabel),hasManagedMutations:J,statePath:s,upgradeStateDir:i,source:_.bundleLayout,reviewRecords:$,additions:x.length,updates:C.length,skipped:j.length}),ye=Ye.join(r.agentplaneDir,"agents","ORCHESTRATOR.json"),Y=await P(ye)?await ka({gitRoot:r.gitRoot,workflowMode:n.config.workflow_mode,approvals:{requirePlanApproval:n.config.agents?.approvals?.require_plan??true,requireVerifyApproval:n.config.agents?.approvals?.require_verify??true,requireNetworkApproval:n.config.agents?.approvals?.require_network??true}}):{commitPaths:[],changedPaths:[]},Re=[...new Set([...x,...C,...U.changedPaths,...Y.commitPaths,...pe?[Hv]:[]])],Ue=await A$({gitRoot:r.gitRoot,paths:Re,tasksPath:n.config.paths.tasks_path,workflowDir:n.config.paths.workflow_dir,versionLabel:_.upgradeVersionLabel,source:_.bundleLayout,additions:x.length,updates:C.length,unchanged:j.length,incidentsAppendedCount:W});await E$({upgradeStateDir:i,createdBackups:w}),process.stdout.write(`Upgrade applied: ${x.length} add, ${C.length} update, ${j.length} unchanged
497
+ `),Y.changedPaths.length>0&&process.stdout.write(`Workflow artifacts refreshed: ${Y.commitPaths.join(", ")}
498
+ `),Ue&&process.stdout.write(`Upgrade commit: ${Ue.hash.slice(0,12)} ${Ue.subject}
499
+ `);let V=await Dv(r.gitRoot,o);if(V.length>0){process.stderr.write(`${ie("upgrade post-check: task README migration follow-up detected")}
500
+ `);for(let se of V)process.stderr.write(`- ${se}
501
+ `);}return 0},cleanup:async()=>{if(_?.extractRoot&&await rm$1(_.extractRoot,{recursive:true,force:true}),_?.tempRoot&&await rm$1(_.tempRoot,{recursive:true,force:true}),l)try{await rm$1(a,{force:!0});}catch{}}})}var n9,sM=u(()=>{ee();G();I();v();vc();Nv();jv();N();ls();yp();N$();eM();rM();jf();iM();$f();ln();$f();n9=xm();});var cM={};S(cM,{runUpgrade:()=>o9,upgradeSpec:()=>pn});var o9,dM=u(()=>{sM();Ly();o9=(e,t)=>aM({cwd:e.cwd,rootOverride:e.rootOverride,flags:t});});var fM={};S(fM,{releasePlanSpec:()=>Ma,runReleasePlan:()=>y9});function Fd(e){let t=/^(\d+)\.(\d+)\.(\d+)$/u.exec(e.trim());if(!t)return null;let r=Number(t[1]),n=Number(t[2]),o=Number(t[3]);return [r,n,o].every(i=>Number.isInteger(i)&&i>=0)?{major:r,minor:n,patch:o}:null}function c9(e,t){let r=Fd(e),n=Fd(t);if(!r||!n)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Invalid semver comparison: ${e} vs ${t}`});return r.major!==n.major?r.major-n.major:r.minor!==n.minor?r.minor-n.minor:r.patch-n.patch}function d9(e){return e?e.startsWith("v")?e.slice(1):e:null}function l9(e,t){let r=Fd(e),n=Fd(t);if(!r||!n)return [];if(r.major!==n.major||r.minor!==n.minor||n.patch<=r.patch)return [];let o=[];for(let i=r.patch+1;i<=n.patch;i+=1)o.push(`v${r.major}.${r.minor}.${i}`);return o}function m9(e,t){let r=Fd(e);if(!r)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Invalid version (expected X.Y.Z): ${e}`});return t==="patch"?`${r.major}.${r.minor}.${r.patch+1}`:t==="minor"?`${r.major}.${r.minor+1}.0`:`${r.major+1}.0.0`}async function lM(e){let t=JSON.parse(await readFile(e,"utf8")),r=typeof t.version=="string"?t.version.trim():"";if(!r)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Missing package.json version: ${e}`});return r}async function u9(e){let r=JSON.parse(await readFile(e,"utf8")).dependencies?.["@agentplaneorg/core"],n=typeof r=="string"?r.trim():"";if(!n)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Missing dependency @agentplaneorg/core in ${e}. Release planning requires packages/agentplane to pin @agentplaneorg/core to the same version.`});return n}async function p9(e){try{let{stdout:t}=await execFileAsync("git",["describe","--tags","--abbrev=0","--match","v[0-9]*.[0-9]*.[0-9]*"],{cwd:e,env:gitEnv()});return String(t??"").trim()||null}catch{return null}}async function f9(e,t){let r=t?`${t}..HEAD`:"HEAD",{stdout:n}=await execFileAsync("git",["log","--no-merges","--pretty=format:%H%x00%aI%x00%s",r],{cwd:e,env:gitEnv(),maxBuffer:10*1024*1024}),i=String(n??"").split(`
502
+ `).filter(s=>s.length>0),a=[];for(let s of i){let c=s.split("\0"),d=(c[0]??"").trim(),l=(c[1]??"").trim(),p=(c[2]??"").trim();!d||!l||!p||a.push({hash:d,authorDateIso:l,subject:p});}return a}function g9(e){return e.length===0?`_No commits found in the selected range._
503
+ `:e.map(t=>`- ${t.subject} (${t.hash.slice(0,7)})`).join(`
504
+ `).trim()+`
505
+ `}function h9(e){return Math.max(1,e)}function k9(e){return `# Release plan
506
+
507
+ ## Target
508
+
509
+ - Tag: \`${e.nextTag}\`
510
+ `+(e.prevTag?`- Since: \`${e.prevTag}\`
511
+ `:`- Since: (no previous semver tag found)
512
+ `)+`- Bump: \`${e.bump}\`
513
+
514
+ ## Agent task: write release notes
515
+
516
+ Write English release notes as \`docs/releases/${e.nextTag}.md\`.
517
+
518
+ Rules:
519
+ - Use detailed, human-readable bullets focused on outcomes and user-facing improvements.
520
+ - Cover all listed differences from \`changes.md\`; do not omit commits.
521
+ - Keep one concrete bullet per listed change in plain language.
522
+ - Write at least ${e.minBullets} bullet points.
523
+ - Do not include Cyrillic.
524
+ - Use \`docs/releases/TEMPLATE.md\` as the structure.
525
+
526
+ Inputs:
527
+ - \`changes.md\` and \`changes.json\` in this directory.
528
+ `}var s9,y9,gM=u(()=>{I();G();v();Yw();s9=A();y9=async(e,t)=>{let n=(await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null})).gitRoot,o=Ye.join(n,"packages","core","package.json"),i=Ye.join(n,"packages","agentplane","package.json"),[a,s,c]=await Promise.all([lM(o),lM(i),u9(i)]);if(a!==s)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Package versions must match before release planning. packages/core=${a} packages/agentplane=${s}`});if(c!==a)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Release dependency parity check failed before planning. packages/agentplane dependency @agentplaneorg/core=${c} must match packages/core version ${a}.`});let d=t.since??await p9(n),l=d9(d);if(l&&c9(a,l)>0){let _=l9(l,a),x=_.length>0?_.join(", "):a;throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Release planning blocked: workspace version is already ${a} while the latest published/tagged release is ${d}. Publish or recover the missing release sequence first: ${x}.`})}let p=m9(a,t.bump),g=`v${p}`,h=await f9(n,d),f=h9(h.length),b=new Date().toISOString().replaceAll(":","-").replaceAll(".","-"),w=Ye.join(n,".agentplane",".release","plan",b);return await mkdir(w,{recursive:true}),await writeFile(Ye.join(w,"version.json"),JSON.stringify({prevTag:d,prevVersion:a,nextTag:g,nextVersion:p,bump:t.bump},null,2)+`
529
+ `,"utf8"),await writeFile(Ye.join(w,"changes.json"),JSON.stringify(h,null,2)+`
530
+ `,"utf8"),await writeFile(Ye.join(w,"changes.md"),g9(h),"utf8"),await writeFile(Ye.join(w,"instructions.md"),k9({nextTag:g,prevTag:d,bump:t.bump,minBullets:f}),"utf8"),s9.lines([`Release plan written: ${Ye.relative(n,w)}`,`Next tag: ${g}`,`Hint: Create a DOCS task to write docs/releases/${g}.md based on this plan.`]),0};});async function kM(e,t,r){for(let n of r)await execFileAsync("git",["push","--no-verify",t,n],{cwd:e,env:gitEnv()});}async function yM(e,t){let r=new Date().toISOString().replaceAll(":","-").replaceAll(".","-"),n=Ye.join(e,".agentplane",".release","apply");await mkdir(n,{recursive:true});let o=Ye.join(n,`${r}.json`),i=Ye.join(n,"latest.json"),a=`${JSON.stringify(t,null,2)}
531
+ `;return await writeFile(o,a,"utf8"),await writeFile(i,a,"utf8"),o}async function Bd(e,t,r){await kM(e,t,["HEAD",r]);}async function Ld(e,t){await kM(e,t,["HEAD"]);}var Jv=u(()=>{});function Yr(e){un(v9,{kind:"line",text:e});}var v9,Yv=u(()=>{I();v9=A();});async function C9(e){let t=e.route.kind==="direct_release",r=[];t?(await execFileAsync("git",["tag",e.plan.nextTag],{cwd:e.gitRoot,env:gitEnv()}),Yr(`Release tag created: ${e.plan.nextTag}`)):Yr(`Release candidate prepared on ${e.route.current_branch}; skipped local tag creation for ${e.plan.nextTag} because final publication is deferred until merge to ${e.route.base_branch}.`),e.push?e.route.kind==="release_candidate"?(await Ld(e.gitRoot,e.remote),r.push("HEAD"),Yr(`Pushed: ${e.remote} ${e.route.current_branch} (release candidate branch only; no tag pushed)`)):(await Bd(e.gitRoot,e.remote,e.plan.nextTag),r.push("HEAD",e.plan.nextTag),Yr(`Pushed: ${e.remote} HEAD + ${e.plan.nextTag}`)):e.route.kind==="release_candidate"?Yr(`Next: git push <remote> HEAD # merge ${e.route.current_branch} into ${e.route.base_branch} before publishing ${e.plan.nextTag}`):Yr(`Next: git push <remote> HEAD && git push <remote> ${e.plan.nextTag}`);let n=await yM(e.gitRoot,{applied_at:new Date().toISOString(),plan_dir:Ye.relative(e.gitRoot,e.planDir),notes_path:Ye.relative(e.gitRoot,e.notesPath),prev_version:e.plan.prevVersion,next_version:e.plan.nextVersion,prev_tag:e.plan.prevTag,next_tag:e.plan.nextTag,bump:e.plan.bump,checks:{clean_tracked_tree:true,tag_absent:true,notes_validated:true,npm_version_available_checked:e.npmVersionChecked},commit:e.releaseCommit,route:e.route,tag:{name:e.plan.nextTag,created:t,pushed:t&&e.push},push:{requested:e.push,remote:e.remote,performed:r.length>0,refs:r}});return Yr(`Release report: ${Ye.relative(e.gitRoot,n)}`),0}async function wM(e){return await C9({gitRoot:e.state.gitRoot,planDir:e.state.planDir,notesPath:e.state.notesPath,plan:e.state.plan,npmVersionChecked:e.state.npmVersionChecked,releaseCommit:e.mutation.releaseCommit,route:e.state.route,push:e.flags.push,remote:e.flags.remote})}var bM=u(()=>{Jv();Yv();});async function Zv(e,t){let r=await readFile(e,"utf8"),n=r.replace(/"version"\s*:\s*"[^"]*"/u,`"version": "${t}"`);if(n===r)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Failed to update version in ${e} (missing "version" field).`});await writeFile(e,n,"utf8");}async function vM(e,t){let r=await readFile(e,"utf8"),n=r.replace(/"version"\s*:\s*"[^"]*"/u,`"version": "${t}"`);if(n===r)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Failed to update version in ${e} (missing "version" field).`});let o=n.replace(/("@agentplaneorg[/]core"\s*:\s*")[^"]*(")/u,`$1${t}$2`);if(o===n)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Failed to update @agentplaneorg/core dependency in ${e}. Ensure packages/agentplane/package.json declares this dependency.`});let i=o.replace(/("@agentplaneorg\/recipes"\s*:\s*")[^"]*(")/u,`$1${t}$2`);if(i===o)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Failed to update @agentplaneorg/recipes dependency in ${e}. Ensure packages/agentplane/package.json declares this dependency.`});await writeFile(e,i,"utf8");}async function xM(e,t,r){let n=await readFile(e,"utf8"),o=new RegExp(String.raw`("${t.replace("/",String.raw`\/`)}"\s*:\s*")[^"]*(")`,"u"),i=n.replace(o,`$1${r}$2`);if(i===n)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Failed to update ${t} dependency in ${e}. Ensure the package.json declares this dependency.`});await writeFile(e,i,"utf8");}async function RM(e,t){return typeof JSON.parse(await readFile(e,"utf8")).dependencies?.[t]=="string"}async function CM(e,t){let r=Ye.join(e,"bun.lock"),n=Ye.join(e,"package.json");if(await t(r)&&await t(n))try{await execFileAsync("bun",["install","--ignore-scripts"],{cwd:e,env:process.env,maxBuffer:50*1024*1024});}catch(o){let i=o;throw new m({exitCode:k("E_IO"),code:"E_IO",message:"Failed to update bun.lock via `bun install --ignore-scripts`.\nFix:\n 1) Run `bun install --ignore-scripts` manually\n 2) Re-run `agentplane release apply`\n"+(i?.message?`
532
+ Details:
533
+ ${i.message}`:"")})}}async function PM(e,t){let r=Ye.join(e,"scripts","generate-website-docs.mjs");if(!await t(r))return false;try{await execFileAsync("node",[r],{cwd:e,env:process.env,maxBuffer:20*1024*1024});}catch(n){let o=n;throw new m({exitCode:k("E_IO"),code:"E_IO",message:"Failed to refresh docs/reference/generated-reference.mdx after bumping release versions.\nFix:\n 1) Run `node scripts/generate-website-docs.mjs`\n 2) Re-run `agentplane release apply`\n"+(o?.message?`
534
+ Details:
535
+ ${o.message}`:"")})}return await t(Ye.join(e,"docs","reference","generated-reference.mdx"))}async function TM(e,t){let r=await loadConfig(e);if(!r.exists)return false;let n={...r.raw};return setByDottedKey(n,"framework.cli.expected_version",t),await saveConfig(e,n),true}function SM(){let e={...gitEnv()};return delete e.AGENTPLANE_TASK_ID,delete e.AGENTPLANE_STATUS_TO,delete e.AGENTPLANE_AGENT_ID,e.AGENTPLANE_ALLOW_CONFIG="1",e}var EM=u(()=>{G();v();});async function Qr(e){try{return await readFile(e,"utf8"),!0}catch{return false}}async function IM(e){return JSON.parse(await readFile(e,"utf8"))}function Gf(e,t){if(typeof e!="string"||!e.trim())throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Invalid ${t} (expected non-empty string).`});return e.trim()}function A9(e){if(!e||typeof e!="object")throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:"Invalid version.json (expected object)."});let t=e,r=Gf(t.bump,"bump");if(r!=="patch"&&r!=="minor"&&r!=="major")throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Invalid bump in version.json: ${r}`});let n=t.prevTag,o=n===null?null:typeof n=="string"?n:null,i=Gf(t.prevVersion,"prevVersion"),a=Gf(t.nextTag,"nextTag"),s=Gf(t.nextVersion,"nextVersion");return {prevTag:o,prevVersion:i,nextTag:a,nextVersion:s,bump:r}}async function O9(e){let t=Ye.join(e,".agentplane",".release","plan"),o=(await readdir(t)).map(i=>i.trim()).filter(Boolean).toSorted().at(-1);if(!o)throw new m({exitCode:k("E_IO"),code:"E_IO",message:"No release plan runs found under .agentplane/.release/plan/. Run `agentplane release plan` first."});return Ye.join(t,o)}async function Uf(e){let t=JSON.parse(await readFile(e,"utf8")),r=typeof t.version=="string"?t.version.trim():"";if(!r)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Missing package.json version: ${e}`});return r}async function OM(e,t){let n=JSON.parse(await readFile(e,"utf8")).dependencies?.[t],o=typeof n=="string"?n.trim():"";if(!o)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Missing dependency ${t} in ${e}. Release parity requires packages/agentplane to pin ${t} to the same version.`});return o}async function DM(e){return await OM(e,"@agentplaneorg/core")}async function NM(e){return await OM(e,"@agentplaneorg/recipes")}async function jM(e){let r=JSON.parse(await readFile(e,"utf8")).dependencies?.agentplane;return (typeof r=="string"?r.trim():"")||null}async function $M(e,t){let r=await readFile(e,"utf8");if(!/release\s+notes/i.test(r))throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Release notes must include a "Release Notes" heading in ${e}.`});if(r.split(/\r?\n/u).filter(o=>/^\s*[-*]\s+\S+/u.test(o)).length<t)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Release notes must include at least ${t} bullet points in ${e}.`});if(/[\u0400-\u04FF]/u.test(r))throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Release notes must be written in English (no Cyrillic) in ${e}.`})}function AM(e){return e==="release candidate"?"preparing or pushing the release candidate branch":"pushing the release tag"}async function MM(e,t="release apply"){let{stdout:r}=await execFileAsync("git",["status","--short","--untracked-files=no"],{cwd:e,env:gitEnv(),maxBuffer:10485760}),n=String(r??"").split(/\r?\n/u).map(o=>o.trimEnd()).filter(o=>o.length>0);if(n.length!==0)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`${t} requires a clean tracked working tree.
536
+ Found tracked changes:
537
+ ${n.map(o=>` ${o}`).join(`
538
+ `)}`,context:we({command:t},{state:`${t} cannot start from a dirty tracked tree`,likelyCause:"the release flow needs to create one deterministic version-bump commit and tag, but tracked edits already exist in the workspace",nextAction:{command:"git status --short --untracked-files=no",reason:`inspect or clear tracked changes before rerunning \`agentplane ${t}\``,reasonCode:"release_dirty_tree"}})})}async function FM(e,t,r="release apply"){try{throw await execFileAsync("git",["rev-parse","-q","--verify",`refs/tags/${t}`],{cwd:e,env:gitEnv()}),new m({exitCode:k("E_GIT"),code:"E_GIT",message:`Tag already exists: ${t}`,context:we({command:r},{state:"the target release tag already exists locally",likelyCause:"the release version was already applied earlier, or a previous release attempt created the tag before failing later in the flow",nextAction:{command:`git show --stat --oneline ${t}`,reason:"inspect the existing tag before deciding whether to reuse it or plan a new version",reasonCode:"release_tag_exists"}})})}catch(n){if(n?.code!==1)throw n}}async function BM(e,t,r="release apply"){try{await execFileAsync("git",["remote","get-url",t],{cwd:e,env:gitEnv()});}catch(n){let o=String(n?.stderr??n?.message??"").trim();throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`Git remote is not configured: ${t}`+(o?`
539
+
540
+ ${o}`:""),context:we({command:r},{state:"the configured release remote does not exist locally",likelyCause:"release apply was asked to push, but the selected git remote is missing or misconfigured in this checkout",nextAction:{command:"git remote -v",reason:`inspect configured remotes before rerunning ${r} with --push`,reasonCode:"release_remote_missing"}})})}}async function LM(e,t,r,n="release apply"){let o="";try{let i=await execFileAsync("git",["ls-remote","--tags",t,`refs/tags/${r}`],{cwd:e,env:gitEnv()});o=String(i.stdout??"").trim();}catch(i){let a=String(i?.stderr??i?.message??"").trim();throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`Failed to inspect remote tag state for ${t}/${r}.`+(a?`
541
+
542
+ ${a}`:""),context:we({command:n},{state:`${n} could not verify the remote tag state`,likelyCause:"the remote is configured, but git could not query it for the target release tag before the release started",nextAction:{command:`git ls-remote --tags ${t} refs/tags/${r}`,reason:"inspect remote tag visibility before retrying the release push path",reasonCode:"release_remote_tag_check_failed"}})})}if(o)throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`Remote tag already exists: ${t}/${r}`,context:we({command:n},{state:"the target release tag already exists on the remote",likelyCause:"a previous release or partial push already published this tag upstream, so pushing the same version again would drift the local release state",nextAction:{command:`git ls-remote --tags ${t} refs/tags/${r}`,reason:"inspect the existing remote tag before deciding whether to recover or bump to a new version",reasonCode:"release_remote_tag_exists"}})})}async function qM(e,t,r="release apply"){let n=Ye.join(e,"scripts","check-npm-version-availability.mjs");try{await execFileAsync("node",[n,"--version",t],{cwd:e,env:process.env,maxBuffer:10*1024*1024});}catch(o){let i=String(o?.stderr??"").trim();throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Pre-publish npm check failed for version ${t}. Ensure this version is not already published for @agentplaneorg/core and agentplane.`+(i?`
543
+
544
+ ${i}`:""),context:we({command:r},{state:"the target npm version is not publishable",likelyCause:"that version is already burned in npm history for one of the published packages, even if it is no longer the current dist-tag",nextAction:{command:`node scripts/check-npm-version-availability.mjs --version ${t}`,reason:"inspect which package already consumed the target version before choosing a new release number",reasonCode:"release_npm_version_burned"}})})}}async function D9(e,t){await execFileAsync("bun",["run",`release:prepublish:${t}`],{cwd:e,env:{...process.env,GIT_AUTHOR_NAME:process.env.GIT_AUTHOR_NAME??"agentplane-release",GIT_AUTHOR_EMAIL:process.env.GIT_AUTHOR_EMAIL??"agentplane-release@example.com",GIT_COMMITTER_NAME:process.env.GIT_COMMITTER_NAME??"agentplane-release",GIT_COMMITTER_EMAIL:process.env.GIT_COMMITTER_EMAIL??"agentplane-release@example.com"},maxBuffer:200*1024*1024});}async function HM(e,t="release apply"){for(let r of ["fast","heavy"])try{await D9(e,r);}catch(n){let o=String(n?.stderr??n?.stdout??n?.message??"").trim();throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Release prepublish ${r} phase failed. \`agentplane ${t} --push\` requires a successful local \`bun run release:prepublish:${r}\` run before ${AM(t)}.`+(o?`
545
+
546
+ ${o}`:""),context:we({command:t},{state:`release prepublish ${r} validation failed before ${AM(t)}`,likelyCause:r==="fast"?"a lightweight publish-readiness check rejected the current release payload before the expensive validation route started":"the expensive release validation route rejected the current repository state after the fast publish-readiness checks passed",nextAction:{command:`bun run release:prepublish:${r}`,reason:r==="fast"?`rerun the fast prepublish phase to fix the exact payload or packaging problem before retrying ${t}`:`rerun the heavy prepublish phase to inspect and fix the expensive validation failure before retrying ${t}`,reasonCode:`release_prepublish_${r}_failed`}})})}}async function GM(e){let t=e.planOverride?Ye.resolve(e.gitRoot,e.planOverride):await O9(e.gitRoot),r=Ye.join(t,"version.json");if(!await Qr(r))throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Missing version.json in plan dir: ${Ye.relative(e.gitRoot,r)}`});let n=A9(await IM(r)),o=Ye.join(t,"changes.json"),i=await Qr(o)?await IM(o):[];return {planDir:t,versionJsonPath:r,plan:n,changes:i,minBullets:Math.max(1,Array.isArray(i)?i.length:0)}}var Wf=u(()=>{G();Et();v();});async function B9(e){let t=null;await Promise.all([Zv(e.corePkgPath,e.nextVersion),Zv(e.recipesPkgPath,e.nextVersion),vM(e.agentplanePkgPath,e.nextVersion)]);let r=await Qr(e.testkitPkgPath)&&await RM(e.testkitPkgPath,"agentplane");r&&await xM(e.testkitPkgPath,"agentplane",e.nextVersion);let n=await TM(e.agentplaneDir,e.nextVersion);await CM(e.gitRoot,Qr);let o=await PM(e.gitRoot,Qr),i=["packages/core/package.json","packages/agentplane/package.json","packages/recipes/package.json",Ye.relative(e.gitRoot,e.notesPath)];if(r&&i.push("packages/testkit/package.json"),n&&i.push(".agentplane/config.json"),o&&i.push("docs/reference/generated-reference.mdx"),await Qr(Ye.join(e.gitRoot,"bun.lock"))&&i.push("bun.lock"),await e.git.stage(i),(await e.git.statusStagedPaths()).length===0)return Yr("No changes to commit."),{releaseCommit:t};let s=e.route.kind==="release_candidate"?parseTaskIdFromBranch(e.taskBranchPrefix,e.route.current_branch):null,c=s?`\u2728 ${extractTaskSuffix(s)} release: publish ${e.nextTag}`:`\u2728 release: publish ${e.nextTag}`;await e.git.commit({message:c,env:SM()});let{stdout:d}=await execFileAsync("git",["rev-parse","HEAD"],{cwd:e.gitRoot,env:gitEnv()});return t={hash:String(d??"").trim(),subject:c},{releaseCommit:t}}async function UM(e){let t=new GitContext({gitRoot:e.gitRoot});return await B9({agentplaneDir:e.resolved.agentplaneDir,gitRoot:e.gitRoot,git:t,notesPath:e.notesPath,corePkgPath:e.corePkgPath,agentplanePkgPath:e.agentplanePkgPath,recipesPkgPath:e.recipesPkgPath,testkitPkgPath:e.testkitPkgPath,nextTag:e.plan.nextTag,nextVersion:e.plan.nextVersion,route:e.route,taskBranchPrefix:e.taskBranchPrefix})}var WM=u(()=>{EM();Wf();Yv();});async function H9(e){let{planDir:t,plan:r,minBullets:n}=await GM({gitRoot:e.gitRoot,planOverride:e.planOverride});if(!/^v\d+\.\d+\.\d+$/u.test(r.nextTag))throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Invalid nextTag in version.json (expected vX.Y.Z): ${r.nextTag}`});let o=Ye.join(e.gitRoot,"docs","releases",`${r.nextTag}.md`);if(!await Qr(o))throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Missing release notes: ${Ye.relative(e.gitRoot,o)}
547
+ Write this file using a DOCS agent before applying the release.`});return await $M(o,n),{planDir:t,plan:r,notesPath:o}}async function zM(e){let[t,r,n,o,i]=await Promise.all([Uf(e.corePkgPath),Uf(e.agentplanePkgPath),Uf(e.recipesPkgPath),DM(e.agentplanePkgPath),NM(e.agentplanePkgPath)]);if(t!==r||t!==n)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Package versions must match before applying a release. packages/core=${t} packages/agentplane=${r} packages/recipes=${n}`});if(o!==t)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Release dependency parity check failed before apply. packages/agentplane dependency @agentplaneorg/core=${o} must match packages/core version ${t}.`});if(i!==t)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Release dependency parity check failed before apply. packages/agentplane dependency @agentplaneorg/recipes=${i} must match packages/recipes version ${t}.`});if(await Qr(e.testkitPkgPath)){let a=await jM(e.testkitPkgPath);if(a&&a!==r)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Release dependency parity check failed before apply. packages/testkit dependency agentplane=${a} must match packages/agentplane version ${r}.`})}if(await MM(e.gitRoot,e.commandLabel),await FM(e.gitRoot,e.plan.nextTag,e.commandLabel),t!==e.plan.prevVersion)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Current version does not match the release-plan baseline. current=${t} expected_prev=${e.plan.prevVersion} expected_next=${e.plan.nextVersion}
548
+ Re-run \`agentplane release plan\` to generate a fresh plan for this repo state.`,context:we({command:e.commandLabel},{state:"the repository version no longer matches the prepared release-plan baseline",likelyCause:"package versions changed after the plan was generated, so continuing would apply the release over a partially drifted local state",nextAction:{command:"agentplane release plan",reason:"generate a fresh release plan from the current repository state before applying the release",reasonCode:"release_plan_drifted"}})})}async function KM(e){let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=t.gitRoot,{planDir:n,plan:o,notesPath:i}=await H9({gitRoot:r,planOverride:e.planOverride}),a=await loadConfig(t.agentplaneDir);return {resolved:t,gitRoot:r,planDir:n,plan:o,notesPath:i,taskBranchPrefix:a.config.branch.task_prefix,route:await e.routeResolver({cwd:e.cwd,rootOverride:e.rootOverride??null,gitRoot:r,agentplaneDir:t.agentplaneDir}),corePkgPath:Ye.join(r,"packages","core","package.json"),agentplanePkgPath:Ye.join(r,"packages","agentplane","package.json"),recipesPkgPath:Ye.join(r,"packages","recipes","package.json"),testkitPkgPath:Ye.join(r,"packages","testkit","package.json"),npmVersionChecked:false}}var ex=u(()=>{G();v();Et();Wf();});async function V9(e){let t=await loadConfig(e.agentplaneDir),r=e.route.kind==="release_candidate"?`${e.commandLabel} will push current branch ${e.route.current_branch} to ${e.remote} as a release candidate for ${e.nextTag}; final publication remains gated on merge to ${e.route.base_branch}`:`${e.commandLabel} will push HEAD and ${e.nextTag} to ${e.remote}`;return await Kr({action:e.route.kind==="release_candidate"?"release_candidate":"release_apply",config:t.config,yes:e.yes,reason:`${e.commandLabel} validates npm version availability and pushes over network`,interactive:!!process.stdin.isTTY}),await ce({action:"git_push",config:t.config,yes:e.yes,reason:r,interactive:!!process.stdin.isTTY}),await BM(e.gitRoot,e.remote,e.commandLabel),await LM(e.gitRoot,e.remote,e.nextTag,e.commandLabel),await qM(e.gitRoot,e.nextVersion,e.commandLabel),await HM(e.gitRoot,e.commandLabel),true}function U9(e){if((e.plan.bump==="minor"||e.plan.bump==="major")&&e.flags.yes!==true)throw y({spec:e.spec,command:e.commandLabel,message:`Bump '${e.plan.bump}' requires explicit approval. Re-run with --yes.`})}async function JM(e){U9({flags:e.flags,plan:e.state.plan,spec:e.spec,commandLabel:e.commandLabel}),await zM({gitRoot:e.state.gitRoot,plan:e.state.plan,corePkgPath:e.state.corePkgPath,agentplanePkgPath:e.state.agentplanePkgPath,recipesPkgPath:e.state.recipesPkgPath,testkitPkgPath:e.state.testkitPkgPath,commandLabel:e.commandLabel}),e.flags.push&&(e.state.npmVersionChecked=await V9({agentplaneDir:e.state.resolved.agentplaneDir,gitRoot:e.state.gitRoot,remote:e.flags.remote,nextTag:e.state.plan.nextTag,nextVersion:e.state.plan.nextVersion,route:e.state.route,yes:e.flags.yes,commandLabel:`${e.commandLabel} --push`}));}var YM=u(()=>{H();Be();ls();Wf();ex();});async function tx(e){return await Tf({init:async()=>await KM({cwd:e.ctx.cwd,rootOverride:e.ctx.rootOverride??null,planOverride:e.flags.plan,routeResolver:e.routeResolver}),preflight:async t=>await JM({state:t,flags:e.flags,spec:e.spec,commandLabel:e.commandLabel}),execute:async t=>await UM(t),finalize:async(t,r)=>await wM({state:t,mutation:r,flags:e.flags})})}var rx=u(()=>{jv();bM();WM();YM();ex();Jv();});var ZM={};S(ZM,{pushReleaseCandidateBranch:()=>Ld,pushReleaseRefs:()=>Bd,releaseApplySpec:()=>Rn,releaseCandidateSpec:()=>wo,runReleaseApply:()=>K9,runReleaseCandidate:()=>J9});async function W9(e){let r=(await loadConfig(e.agentplaneDir)).config.workflow_mode,n=await gitCurrentBranch(e.gitRoot);if(r!=="branch_pr")return {kind:"direct_release",workflow_mode:r,current_branch:n,base_branch:null};let o=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,mode:r});throw o?n!==o?new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:"release apply is not available on branch_pr task branches.\nUse `agentplane release candidate` to prepare and optionally push the release candidate branch.",context:we({command:"release apply"},{state:"release apply was invoked from a branch_pr candidate branch",likelyCause:"branch_pr repositories must prepare release candidates on dedicated non-base branches and publish only after merge into the protected base branch",nextAction:{command:"agentplane release candidate",reason:"prepare the release candidate on the current branch instead of treating it as a direct publish route",reasonCode:"release_apply_branch_pr_candidate_requires_explicit_route"}})}):new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`release apply is not available in branch_pr mode.
549
+ Prepare the release candidate on a dedicated branch, merge it into the protected base branch, then let hosted publish run from main.`,context:we({command:"release apply"},{state:"release apply was invoked from a branch_pr base checkout",likelyCause:"branch_pr repositories publish from the merged base branch, so local direct release apply should not act as the publication route",nextAction:{command:"agentplane release candidate",reason:"run the explicit release-candidate route from a dedicated non-base branch/worktree before merging to the protected base branch",reasonCode:"release_apply_branch_pr_base_requires_candidate_route"}})}):new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:"Release apply in branch_pr mode requires a resolved base branch.\nPin it with `agentplane branch base set <branch>` or configure origin/HEAD before rerunning.",context:we({command:"release apply"},{state:"branch_pr release routing could not resolve the protected base branch",likelyCause:"the release flow needs to know whether this checkout is the protected base branch or a task branch before deciding if it should create or push a release tag",nextAction:{command:"agentplane branch base set <branch>",reason:"pin the protected base branch so release commands can choose between the direct route and the release-candidate route",reasonCode:"release_branch_pr_base_unresolved"}})})}async function z9(e){let r=(await loadConfig(e.agentplaneDir)).config.workflow_mode,n=await gitCurrentBranch(e.gitRoot);if(r!=="branch_pr")throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:"release candidate is only available when workflow_mode=branch_pr.\nUse `agentplane release apply` for direct-mode releases.",context:we({command:"release candidate"},{state:"release candidate was invoked outside branch_pr mode",likelyCause:"direct-mode repositories have no protected-base candidate route, so release preparation and publication stay on the direct release path",nextAction:{command:"agentplane release apply",reason:"use the direct release route when the repository workflow mode is not branch_pr",reasonCode:"release_candidate_requires_branch_pr_mode"}})});let o=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,mode:r});if(!o)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:"Release candidate routing in branch_pr mode requires a resolved base branch.\nPin it with `agentplane branch base set <branch>` or configure origin/HEAD before rerunning.",context:we({command:"release candidate"},{state:"branch_pr release-candidate routing could not resolve the protected base branch",likelyCause:"the candidate route must know which protected branch will eventually receive and publish the release candidate",nextAction:{command:"agentplane branch base set <branch>",reason:"pin the protected base branch so release candidate routing can target the correct merge branch",reasonCode:"release_candidate_base_unresolved"}})});if(n===o)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`release candidate must run from a dedicated non-base branch/worktree in branch_pr mode.
550
+ Current branch ${n} is the protected base branch ${o}.`,context:we({command:"release candidate"},{state:"release candidate was invoked from the protected base branch",likelyCause:"branch_pr release candidates must be prepared on a dedicated branch so the hosted PR becomes the promotion boundary into the protected base branch",nextAction:{command:"agentplane work start <task-id> --agent CODER --slug <slug> --worktree",reason:"create or switch to a dedicated release-candidate branch/worktree before preparing the candidate",reasonCode:"release_candidate_requires_non_base_branch"}})});return {kind:"release_candidate",workflow_mode:r,current_branch:n,base_branch:o}}var K9,J9,eF=u(()=>{G();Et();v();Ee();rx();Hu();Hu();rx();K9=async(e,t)=>await tx({ctx:e,flags:t,spec:Rn,commandLabel:"release apply",routeResolver:W9}),J9=async(e,t)=>await tx({ctx:e,flags:t,spec:wo,commandLabel:"release candidate",routeResolver:z9});});var qd,nx,fs,gs,Hd,ox,ix=u(()=>{qd="bun run framework:dev:bootstrap",nx=["bun install","git submodule update --init --recursive agentplane-recipes","bun run --filter=@agentplaneorg/core build","bun run --filter=agentplane build","bun run --filter=@agentplane/testkit build"],fs="node packages/agentplane/bin/agentplane.js runtime explain",gs="agentplane runtime explain",Hd="scripts/reinstall-global-agentplane.sh",ox="AGENTPLANE_USE_GLOBAL_IN_FRAMEWORK=1 agentplane <command>";});function Y9(e){let t=e.framework.cli.expected_version;if(typeof t!="string")return null;let r=t.trim();return r.length>0?r:null}function tF(e,t){switch(e.mode){case "global-installed":return `Run: npm i -g agentplane@${t}. Then verify: ${gs}`;case "global-in-framework":case "global-forced-in-framework":return `${e.mode==="global-forced-in-framework"?"Unset AGENTPLANE_USE_GLOBAL_IN_FRAMEWORK=1 if forced global mode is not intentional. ":""}Run: ${qd}. If the global PATH command should resolve this checkout, then run: ${Hd}. Repo-local verify: ${fs}. Then verify: ${gs}`;case "repo-local":case "repo-local-handoff":return `Sync this framework checkout to agentplane ${t} or lower framework.cli.expected_version if the repository intentionally targets an older CLI. Then verify: ${fs}`}}function zf(e,t){let r=Y9(e),n=t.agentplane.version?.trim()??null;if(!r)return {expectedVersion:null,activeVersion:n,state:"unconfigured",summary:null,recovery:null};if(!n)return {expectedVersion:r,activeVersion:null,state:"active_version_unresolved",summary:`Repository expects agentplane ${r}, but the active runtime version could not be resolved.`,recovery:tF(t,r)};if(An(n,r)<0)return {expectedVersion:r,activeVersion:n,state:"older_than_expected",summary:`Repository expects agentplane ${r}, but the active runtime resolves ${n}.`,recovery:tF(t,r)};let o=An(n,r)===0?"matches":"is newer than";return {expectedVersion:r,activeVersion:n,state:"satisfied",summary:`Active runtime ${n} ${o} the repository expectation ${r}.`,recovery:null}}var ax=u(()=>{ix();Sd();});var oF={};S(oF,{buildFrameworkDevWorkflow:()=>sx,renderRuntimeExplainText:()=>nF,runRuntime:()=>t7,runRuntimeExplain:()=>r7,runtimeExplainSpec:()=>Im,runtimeSpec:()=>ha});function hs(e){return e??"unresolved"}function sx(e){let t=e.framework.inFrameworkCheckout;if(!t)return {available:t,bootstrapCommand:qd,manualRepairCommands:[...nx],repoLocalVerifyCommand:fs,reinstallScript:Hd,globalVerifyCommand:gs,forceGlobalExample:ox,recommendation:null};let r=e.mode==="repo-local"||e.mode==="repo-local-handoff"?"Run the framework bootstrap after fresh clones or dependency drift; use the reinstall helper only when the global PATH command itself should resolve this checkout.":e.mode==="global-in-framework"?"Bootstrap the framework checkout first so the installed wrapper can hand off cleanly to the repo-local runtime.":e.mode==="global-forced-in-framework"?"Unset AGENTPLANE_USE_GLOBAL_IN_FRAMEWORK=1 unless you intentionally need the global installed CLI inside the framework checkout.":"Use the framework bootstrap command first, then verify the repo-local runtime and global wrapper explicitly.";return {available:t,bootstrapCommand:qd,manualRepairCommands:[...nx],repoLocalVerifyCommand:fs,reinstallScript:Hd,globalVerifyCommand:gs,forceGlobalExample:ox,recommendation:r}}function Z9(e){return {...e,frameworkDev:sx(e),repoCliExpectation:{expectedVersion:null,activeVersion:e.agentplane.version,state:"unconfigured",summary:null,recovery:null}}}function nF(e,t){let r=sx(e),n=[`Mode: ${e.mode} (${zp(e.mode)})`,`Active binary: ${hs(e.activeBinaryPath)}`,`Current cwd: ${e.cwd}`,`Framework checkout: ${e.framework.inFrameworkCheckout?"yes":"no"}`,`Framework repo root: ${hs(e.frameworkSources.repoRoot)}`,`Framework agentplane root: ${hs(e.frameworkSources.agentplaneRoot)}`,`Framework core root: ${hs(e.frameworkSources.coreRoot)}`,`Resolved agentplane: ${e.agentplane.version??"unknown"} @ ${hs(e.agentplane.packageRoot)}`,`Resolved @agentplaneorg/core: ${e.core.version??"unknown"} @ ${hs(e.core.packageRoot)}`];return t.expectedVersion&&(n.push(`Repository expected agentplane CLI: ${t.expectedVersion}`),t.summary&&n.push(`Repository CLI status: ${t.summary}`),t.recovery&&n.push(`Recovery: ${t.recovery}`)),e.handoffFromBinaryPath&&n.push(`Handoff from: ${e.handoffFromBinaryPath}`),r.available&&(n.push("","Framework dev workflow:","1. Canonical bootstrap:",` - ${r.bootstrapCommand}`,"2. Manual fallback:",...r.manualRepairCommands.map(o=>` - ${o}`),"3. Verify the repo-local runtime directly:",` - ${r.repoLocalVerifyCommand}`,"4. If the global PATH install should resolve this checkout:",` - ${r.reinstallScript}`,"5. Re-verify the global wrapper:",` - ${r.globalVerifyCommand}`,"6. Optional: force the global installed CLI inside this checkout:",` - ${r.forceGlobalExample}`),r.recommendation&&n.push(`Recommendation: ${r.recommendation}`)),n.join(`
551
+ `)}async function e7(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await loadConfig(t.agentplaneDir);return zf(r.config,e.report)}catch{return {expectedVersion:null,activeVersion:e.report.agentplane.version,state:"unconfigured",summary:null,recovery:null}}}var rF,t7,r7,iF=u(()=>{I();Oe();ax();ix();Kp();Am();Am();rF=A();t7=async(e,t)=>{oe({spec:ha,cmd:t.cmd,subcommands:await ne(["runtime"]),command:"runtime",contextCommand:"runtime"});},r7=(e,t)=>{let r=Ya({cwd:e.cwd,entryModuleUrl:import.meta.url});return e7({cwd:e.cwd,rootOverride:e.rootOverride??null,report:r}).then(n=>{let o={...Z9(r),repoCliExpectation:n};return t.json?(rF.json(o),0):(rF.line(nF(r,n)),0)})};});function c7(e,t,r=`${t}s`){return e===1?t:r}function d7(e,t=3){let r=e.slice(0,t),n=e.length-r.length;return n>0?`${r.join(", ")}; +${n} more`:r.join(", ")}function l7(e){return (e.split("-").at(-1)??e).trim().toUpperCase()}function Gd(e){return typeof e=="string"?e.trim():""}function m7(e){return [Gd(e.title),Gd(e.result_summary),Gd(e.verification?.note),Gd(e.commit?.message),...Array.isArray(e.comments)?e.comments.map(r=>Gd(r?.body)).filter(Boolean):[],...Array.isArray(e.tags)?e.tags.filter(r=>typeof r=="string"):[]].filter(Boolean).join(`
552
+ `)}function u7(e){return "INFO"}function p7(e,t){if(/\bclose:\s*record task doc\b/iu.test(t))return "INFO";let r=m7(e);if(/(no-op|already implemented|already fixed|already present|without changes|task deemed not актуальна|obsolete|no changes)/iu.test(r))return "INFO";let n=/^\s*✅\s+([A-Z0-9]{6})\s+close:/u.exec(t)?.[1]??"",o=typeof e.id=="string"?l7(e.id):"";return n&&o&&n!==o||/\b(epic|roadmap|spike|meta)\b/iu.test(r)?"INFO":"WARN"}function cx(e,t){if(e.length===0)return [];let r=`[${t.severity}]`;if(e.length===1){let[c]=e,d=t.includeSubject&&c.subject?` (${c.subject})`:"";return [`${r} ${t.singlePrefix}: ${c.id} -> ${c.hash}${d}`]}let n=new Map;for(let c of e){let d=n.get(c.hash);if(d){d.ids.push(c.id),!d.subject&&c.subject&&(d.subject=c.subject);continue}n.set(c.hash,{hash:c.hash,ids:[c.id],subject:c.subject});}let o=[...n.values()].toSorted((c,d)=>{let l=d.ids.length-c.ids.length;return l!==0?l:c.hash.localeCompare(d.hash)}),i=o.slice(0,3).map(c=>{let d=t.includeSubject&&c.subject?`; subject: ${c.subject}`:"";return `${c.hash} (${c.ids.length} ${c7(c.ids.length,"task")}: ${d7(c.ids)}${d})`}),a=o.length-i.length,s=a>0?`; +${a} more hash groups`:"";return [`${r} Historical task archive contains ${e.length} DONE tasks with ${t.summaryLabel} across ${o.length} distinct commit ${t.groupLabel}. Examples: ${i.join("; ")}${s}`]}async function sF(e,t={}){let r=Ye.join(e,".agentplane","tasks.json"),n="";try{n=await Rt.readFile(r,"utf8");}catch{return []}let o;try{o=JSON.parse(n);}catch{return [`Invalid JSON snapshot: ${Ye.relative(e,r)}`]}let a=(Array.isArray(o.tasks)?o.tasks:[]).filter(f=>normalizeTaskStatus(f.status)==="DONE"),s=t.fullArchive?a:a.slice(-s7);if(s.length===0)return [];let c=[],d=[],l=[],p=[],g=new Set;for(let f of s){let b=typeof f.id=="string"?f.id:"<unknown>",w=typeof f.commit?.hash=="string"?f.commit.hash.trim():"";if(!w){c.push(`DONE task is missing implementation commit hash: ${b} (finish with --commit <hash>).`);continue}g.add(w);}if(g.size===0)return c;let h=await f7(e,[...g]);for(let f of s){let b=typeof f.id=="string"?f.id:"<unknown>",w=typeof f.commit?.hash=="string"?f.commit.hash.trim():"";if(!w)continue;let _=h.get(w)??"";if(!_){d.push({id:b,hash:w,severity:u7()});continue}if(/\bclose:/iu.test(_)){let x=p7(f,_),C={id:b,hash:w,subject:_,severity:x};x==="WARN"?l.push(C):p.push(C);}}return c.push(...cx(d,{singlePrefix:"DONE task references unknown historical commit hash",groupLabel:"hashes",summaryLabel:"unknown implementation commit hashes",includeSubject:false,severity:"INFO"}),...cx(p,{singlePrefix:"DONE task implementation commit resolves to a historical close commit reference",groupLabel:"hashes",summaryLabel:"historical close-commit references that were classified as non-actionable archive records",includeSubject:true,severity:"INFO"}),...cx(l,{singlePrefix:"DONE task implementation commit points to a close commit",groupLabel:"hashes",summaryLabel:"implementation commits that point to close commits",includeSubject:true,severity:"WARN"})),c}async function f7(e,t){let r=new Map;if(t.length===0)return r;for(let n of g7(t,200))try{let{stdout:o}=await execFileAsync("git",["show","-s","--no-patch","--format=%H%x00%s%x00","--ignore-missing",...n],{cwd:e,env:gitEnv()}),i=String(o??"").split("\0");for(let a=0;a+1<i.length;a+=2){let s=i[a]?.trim()??"",c=i[a+1]?.trim()??"";s&&r.set(s,c);}}catch{}return r}function g7(e,t){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}var s7,cF=u(()=>{s7=200;});async function dF(e){if(!e||!Fe(e)||e.config.workflow_mode!=="branch_pr")return [];let t=[];try{t=await e.taskBackend.listTasks();}catch{return []}if(t.length===0)return [];let r=await nd({ctx:e,tasks:t});if(r.length===0)return [];let n=r.slice(0,5).map(o=>`${o.taskId}@${o.base}:${o.commitHash.slice(0,12)} verified_via=${o.verificationSource}`).join(", ");return [ur({severity:"WARN",state:"branch_pr tasks appear shipped on the base branch but remain open",likelyCause:"the verified task commit already landed on the base branch, but canonical task closure artifacts were never reconciled",nextAction:{command:"agentplane task normalize --sync-branch-pr-state",reason:"mark locally shipped branch_pr tasks as DONE in the task projection before committing the reconciled task artifacts on the base branch"},details:[`Affected tasks: ${r.length}`,n?`Examples: ${n}`:"Examples unavailable."]})]}async function lF(e){if(!e||!Fe(e)||e.config.workflow_mode!=="branch_pr")return [];let t=await y7(e);if(t.length===0)return [];let r=await qb({ctx:e,tasks:t});if(r.length===0)return [];let n=r.slice(0,5).map(o=>`${o.taskId}@${o.base}:${o.commitHash.slice(0,12)} branch=${o.branch}`).join(", ");return [ur({severity:"WARN",state:"DONE branch_pr tasks still have open or unmerged PR artifacts",likelyCause:"the task was marked DONE, but its branch_pr PR artifacts were never reconciled to MERGED and the task branch still exists",nextAction:{command:"agentplane task normalize --sync-branch-pr-state --task-id <task-id>",reason:"reconcile the shipped task's local branch_pr state and PR artifacts to MERGED without scanning unrelated task history"},details:[`Affected tasks: ${r.length}`,n?`Examples: ${n}`:"Examples unavailable."]})]}async function y7(e){try{let r=await e.taskBackend.listTasks();if(r.length>0)return r}catch{}let t=Ye.join(e.resolvedProject.agentplaneDir,"tasks.json");try{let r=await readFile(t,"utf8"),n=JSON.parse(r);return Array.isArray(n.tasks)?n.tasks.filter(o=>w7(o)):[]}catch{return []}}function w7(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=e;return typeof t.id=="string"&&typeof t.status=="string"}var mF=u(()=>{Et();N();gp();});async function pF(e){let t=Ye.join(e,".gitignore"),r="";try{r=await Rt.readFile(t,"utf8");}catch{return {changed:false,note:"Skip: .gitignore not found."}}let n=r.split(/\r?\n/),o=new Set(n.map(c=>c.trimEnd())),i=Id.filter(c=>!o.has(c));if(i.length===0)return {changed:false,note:"OK: .gitignore already contains agentplane runtime ignores."};let a=[...n];a.length>0&&a.at(-1)!==""&&a.push(""),a.push(...i,"");let s=`${a.join(`
553
+ `)}`.replaceAll(/\n{2,}$/g,`
554
+ `);return await Rt.writeFile(t,s,"utf8"),{changed:true,note:`Fixed: added agentplane runtime ignores to .gitignore (${i.length} lines).`}}async function fF(e){try{return await(await R({cwd:e,rootOverride:null})).taskBackend.listTasks(),{changed:!0,note:"OK: rebuilt tasks index cache (best-effort)."}}catch{return {changed:false,note:"Skip: could not rebuild tasks index cache."}}}var gF=u(()=>{hv();N();});async function hF(e){let t=[];async function r(n){let o=await Rt.readdir(n,{withFileTypes:true});for(let i of o){if(i.name.startsWith(".")||i.name==="__snapshots__"||i.name==="node_modules")continue;let a=Ye.join(n,i.name);if(i.isDirectory()){await r(a);continue}i.isFile()&&i.name.endsWith(".ts")&&t.push({absPath:a,relPath:Ye.relative(e,a)});}}return await r(e),t}function kF(e){let t=[],r=/^\s*import\s+(?:type\s+)?(?:[^"']*?\s+from\s+)?["']([^"']+)["']\s*;?/gm;for(let n of e.matchAll(r))t.push(n[1]??"");return t.filter(Boolean)}async function _7(e){try{return (await Rt.stat(e)).isDirectory()}catch{return false}}async function yF(e){let t=[],r=Ye.join(e,"packages","agentplane","src");if(!await _7(r))return t.push("Dev source checks requested but packages/agentplane/src was not found in this workspace."),t;let n=Ye.join(r,"cli"),o=await hF(n);for(let s of o){let c=await Rt.readFile(s.absPath,"utf8"),l=kF(c).filter(p=>p.includes("/adapters/")||p.includes("../adapters")||p.includes("../../adapters")||p.includes("../../../adapters"));l.length>0&&t.push(`${s.relPath} imports adapters directly: ${l.join(", ")}`);}let i=[Ye.join(r,"usecases"),Ye.join(r,"ports")],a=["node:fs","node:fs/promises","fs","fs/promises","node:path","path","simple-git","isomorphic-git"];for(let s of i){let c=await hF(s);for(let d of c){let l=await Rt.readFile(d.absPath,"utf8"),g=kF(l).filter(h=>a.some(f=>h===f||h.startsWith(`${f}/`)));g.length>0&&t.push(`${d.relPath} imports banned modules: ${g.join(", ")}`);}}return t}var wF=u(()=>{});function v7(e){return e.expectedVersion?e.state==="older_than_expected"||e.state==="active_version_unresolved"?[`[WARN] ${e.summary}`,...e.recovery?[`[WARN] Recovery: ${e.recovery}`]:[]]:[]:[]}function bF(e,t){let r=Ya({cwd:e,entryModuleUrl:import.meta.url}),n=t?v7(zf(t,r)):[];if(!r.framework.inFrameworkCheckout)return n;let o=r.mode==="global-in-framework"?"[WARN] Framework checkout detected but the active runtime is still a global installed binary. Run bun run framework:dev:bootstrap first so the wrapper can hand off to a built repo-local runtime.":r.mode==="global-forced-in-framework"?"[WARN] Framework checkout is forcing the global installed binary via AGENTPLANE_USE_GLOBAL_IN_FRAMEWORK=1. Unset it unless that override is intentional.":null;return [...o?[o]:[],...n,`[INFO] Runtime mode: ${r.mode} (${zp(r.mode)})`,`[INFO] Active binary: ${r.activeBinaryPath??"unresolved"}`,...r.handoffFromBinaryPath?[`[INFO] Handoff source binary: ${r.handoffFromBinaryPath}`]:[],`[INFO] Resolved agentplane: ${r.agentplane.version??"unknown"} @ ${r.agentplane.packageRoot??"unresolved"}`,`[INFO] Resolved @agentplaneorg/core: ${r.core.version??"unknown"} @ ${r.core.packageRoot??"unresolved"}`,`[INFO] Framework repo root: ${r.frameworkSources.repoRoot??"unresolved"}`,`[INFO] Framework agentplane root: ${r.frameworkSources.agentplaneRoot??"unresolved"}`,`[INFO] Framework core root: ${r.frameworkSources.coreRoot??"unresolved"}`]}function Jf(e){let t=e.trimStart();return t.startsWith("[WARN]")?"WARN":t.startsWith("[INFO]")?"INFO":(t.startsWith("[ERROR]"),"ERROR")}var _F=u(()=>{ax();Kp();});async function xF(e){let t=await Gm(e),r=t.diagnostics.map(n=>`[${n.severity}] ${n.code} ${n.path}: ${n.message}`);return xt({event:"workflow_doctor_check",details:{ok:t.ok,findings:t.diagnostics.length}}),r}async function RF(e){let t=Yt(e),r="";try{r=await Rt.readFile(t.workflowPath,"utf8");}catch{return {changed:false,note:"Skip: workflow contract file not found."}}let n=await loadConfig(Ye.join(e,".agentplane")),o=xI(r,{mode:n.config.workflow_mode,approvals:{require_plan:n.config.agents?.approvals?.require_plan??true,require_verify:n.config.agents?.approvals?.require_verify??true,require_network:n.config.agents?.approvals?.require_network??true}});return o.diagnostics.some(i=>i.code==="WF_FIX_SKIPPED_UNSAFE")?{changed:false,note:`Skip: unsafe workflow autofix required (unknown keys). Proposed manual review: ${o.diagnostics.map(a=>`${a.path}`).join(", ")}`}:o.changed?(await Rt.mkdir(Ye.dirname(t.workflowPath),{recursive:true}),await Rt.writeFile(t.workflowPath,o.text,"utf8"),await Rt.mkdir(t.workflowDir,{recursive:true}),await Rt.copyFile(t.workflowPath,t.lastKnownGoodPath),{changed:true,note:"Fixed: normalized workflow contract and refreshed last-known-good."}):{changed:false,note:"OK: workflow contract already normalized."}}var CF=u(()=>{Zo();});var PF={};S(PF,{runDoctor:()=>P7});var P7,TF=u(()=>{I();N();cF();mF();gF();wF();_F();Nv();CF();Zo();P7=async(e,t)=>{let r=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=r.gitRoot,o=await loadConfig(r.agentplaneDir),i=await R({cwd:e.cwd,rootOverride:e.rootOverride??null,resolvedProject:r,config:o.config}),a=async()=>{let d=[...await P$(n,{ctx:i}),...await dF(i),...await lF(i),...bF(e.cwd,o.config),...await sF(n,{fullArchive:t.archiveFull})];return wc()||(d=[...d,...await xF(n)]),t.dev&&(d=[...d,...await yF(n)]),d};if(wc()&&console.log(z("doctor",void 0,`workflow contract checks disabled via ${Dm()}.`)),t.fix){let d=await pF(n);console.log(z("doctor fix",void 0,d.note));let l=await fF(n);console.log(z("doctor fix",void 0,l.note));let p=await RF(n);console.log(z("doctor fix",void 0,p.note));}let s=await a(),c=s.filter(d=>Jf(d)==="ERROR");if(s.length>0){let d=s.filter(p=>Jf(p)==="WARN").length,l=s.filter(p=>Jf(p)==="INFO").length;console.error(ie(`doctor findings: errors=${c.length} warnings=${d} info=${l}`));for(let p of s)console.error(`- ${p}`);if(c.length>0)return 1}return console.log(z("doctor",void 0,"OK")),0};});var EF={};S(EF,{runWorkflowDebug:()=>$7,runWorkflowLand:()=>F7,runWorkflowSync:()=>M7,workflowDebugSpec:()=>zm,workflowLandSpec:()=>Jm,workflowSyncSpec:()=>Km});function SF(e){if(e.length<=dx)return e;let t=e.length-dx;return `${e.slice(0,dx)}
555
+ ...[truncated ${t} chars]`}function O7(e){return e.replaceAll(/[^a-zA-Z0-9._-]/g,"_")}function D7(e,t,r){let n=O7(r);return Ye.join(e,".agentplane","workflows","evidence",`${t}-${n}.json`)}function N7(e){let t=(...r)=>({kind:"agentplane",args:[...r,"--root",e.repoRoot]});return e.mode==="debug"?[t("preflight","--json","--mode","quick"),t("doctor"),{kind:"git",args:["status","--short","--untracked-files=no"]}]:e.mode==="sync"?[t("task","list"),t("task","export"),{kind:"git",args:["status","--short","--untracked-files=no"]}]:[t("preflight","--json","--mode","full"),t("doctor"),{kind:"git",args:["status","--short","--untracked-files=no"]}]}async function j7(e){let t=Date.now(),r=new Date(t).toISOString(),n="",o=[];e.command.kind==="agentplane"?(n=process.execPath,o=[A7,...e.command.args]):(n="git",o=[...e.command.args]);let i=0,a="",s="";try{let d=await runProcess({command:n,args:o,cwd:e.repoRoot,env:{...process.env,AGENTPLANE_NO_UPDATE_CHECK:process.env.AGENTPLANE_NO_UPDATE_CHECK??"1"},encoding:"utf8",maxBuffer:10485760,reject:!1});i=d.exitCode,a=String(d.stdout),s=String(d.stderr);}catch(d){let l=d;i=typeof l.code=="number"?l.code:1,a=typeof l.stdout=="string"?l.stdout:"",s=typeof l.stderr=="string"?l.stderr:"",!s&&typeof l.code=="string"&&(s=l.code);}let c=Date.now();return {display:`${n} ${o.join(" ")}`.trim(),started_at:r,ended_at:new Date(c).toISOString(),duration_ms:Math.max(0,c-t),exit_code:i,stdout_tail:SF(a),stderr_tail:SF(s)}}async function mx(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=new Date().toISOString(),n=D7(t.gitRoot,e.mode,r),o=N7({mode:e.mode,repoRoot:t.gitRoot}),i=[],a=!1;for(let c of o){let d=await j7({command:c,repoRoot:t.gitRoot});i.push(d),d.stdout_tail&&process.stdout.write(`${d.stdout_tail}
556
+ `),d.stderr_tail&&process.stderr.write(`${d.stderr_tail}
557
+ `),d.exit_code!==0&&(a=!0);}await mkdir(Ye.dirname(n),{recursive:!0});let s={schema_version:1,mode:e.mode,status:a?"failed":"success",started_at:r,ended_at:new Date().toISOString(),repo_root:t.gitRoot,evidence_path:n,commands:i};return await atomicWriteFile(n,`${JSON.stringify(s,null,2)}
558
+ `),process.stdout.write(`Evidence: ${Ye.relative(t.gitRoot,n)}
559
+ `),a?1:0}catch(t){throw O(t,{command:`workflow ${e.mode}`,root:e.rootOverride??null})}}var A7,dx,$7,M7,F7,IF=u(()=>{D();ln();Xy();A7=XE(),dx=8e3;$7=async e=>await mx({cwd:e.cwd,rootOverride:e.rootOverride,mode:"debug"}),M7=async e=>await mx({cwd:e.cwd,rootOverride:e.rootOverride,mode:"sync"}),F7=async e=>await mx({cwd:e.cwd,rootOverride:e.rootOverride,mode:"land"});});var AF,OF,DF,NF,ux,jF,$F,px,fx,MF,FF,BF,LF,qF,HF,Yf,GF,VF,UF,WF,zF,KF,JF,YF,QF,XF,ZF=u(()=>{Nn();AF=L(()=>Promise.resolve().then(()=>(Av(),v$))),OF=L(()=>Promise.resolve().then(()=>(dM(),cM))),DF=L(()=>Promise.resolve().then(()=>(Qw(),dO))),NF=L(()=>Promise.resolve().then(()=>(gM(),fM))),ux=L(()=>Promise.resolve().then(()=>(eF(),ZM))),jF=L(()=>Promise.resolve().then(()=>(kb(),OO))),$F=L(()=>Promise.resolve().then(()=>(gb(),IO))),px=L(()=>Promise.resolve().then(()=>(Xu(),ub))),fx=L(()=>Promise.resolve().then(()=>(iF(),oF))),MF=L(()=>Promise.resolve().then(()=>(Jw(),cO))),FF=L(()=>Promise.resolve().then(()=>(yb(),DO))),BF=L(()=>Promise.resolve().then(()=>(TF(),PF))),LF=L(()=>Promise.resolve().then(()=>(Qy(),EI))),qF=L(()=>Promise.resolve().then(()=>(Yy(),SI))),HF=L(()=>Promise.resolve().then(()=>(ew(),II))),Yf=L(()=>Promise.resolve().then(()=>(IF(),EF))),GF=e=>Promise.resolve().then(()=>(Xu(),ub)).then(t=>t.makeRunCodexPluginInstallHandler(e)),VF=e=>Promise.resolve().then(()=>(Kw(),sO)).then(t=>t.makeRunIncidentsCollectHandler(e.getCtx)),UF=e=>Promise.resolve().then(()=>(Uw(),aO)).then(t=>t.makeRunIncidentsAdviseHandler(e.getCtx)),WF=e=>Promise.resolve().then(()=>(db(),gO)).then(t=>t.makeRunAgentsHandler(e)),zF=e=>Promise.resolve().then(()=>(gi(),Ba)).then(t=>t.makeRunConfigShowHandler(e)),KF=e=>Promise.resolve().then(()=>(gi(),Ba)).then(t=>t.makeRunConfigSetHandler(e)),JF=e=>Promise.resolve().then(()=>(gi(),Ba)).then(t=>t.makeRunModeGetHandler(e)),YF=e=>Promise.resolve().then(()=>(gi(),Ba)).then(t=>t.makeRunModeSetHandler(e)),QF=e=>Promise.resolve().then(()=>(gi(),Ba)).then(t=>t.makeRunProfileSetHandler(e)),XF=e=>Promise.resolve().then(()=>(ip(),$O)).then(t=>t.makeRunIdeSyncHandler(e));});var eB,tB=u(()=>{uI();Am();Ly();Yy();Qy();Xy();ew();Uw();Kw();Jw();Hu();Yw();Qw();gi();db();Xu();gb();kb();yb();ip();Av();Qc();Nn();ZF();eB=[AF(dr,"runInit",{needs:"none",invocation:He(["init"])}),OF(pn,"runUpgrade",{needs:"none"}),DF(Gu,"runRelease",{needs:"none"}),NF(Ma,"runReleasePlan",{needs:"project"}),ux(Rn,"runReleaseApply",{needs:"project"}),ux(wo,"runReleaseCandidate",{needs:"project"}),jF(hb,"runQuickstart",{needs:"none",invocation:He(["quickstart"])}),$F(fb,"runPreflight",{needs:"none",invocation:He(["preflight"])}),px(Yu,"runCodex",{needs:"none"}),px(Qu,"runCodexPlugin",{needs:"none"}),B(mb,{load:GF,needs:"none"}),fx(ha,"runRuntime",{needs:"none"}),fx(Im,"runRuntimeExplain",{needs:"none"}),MF(qu,"runIncidents",{needs:"none"}),B(zw,{load:VF}),B(Lu,{load:UF}),FF(hi,"runRole",{needs:"none",invocation:He(["role"])}),B(cb,{load:WF,needs:"project"}),B(eb,{load:zF,needs:"project+config",invocation:He(["config","show"])}),B(rb,{load:KF,needs:"project+config"}),B(nb,{load:JF,needs:"project+config"}),B(Vu,{load:YF,needs:"project+config"}),B(Uu,{load:QF,needs:"project+config"}),B(wb,{load:XF,needs:"project"}),BF(mI,"runDoctor",{needs:"project"}),LF(Wm,"runWorkflow",{needs:"none"}),qF(Jy,"runWorkflowBuild",{needs:"project"}),HF(Zy,"runWorkflowRestore",{needs:"project"}),Yf(zm,"runWorkflowDebug",{needs:"project"}),Yf(Km,"runWorkflowSync",{needs:"project"}),Yf(Jm,"runWorkflowLand",{needs:"project"})];});function Lt(e){return e.filter(t=>ft(t)===".")}function qt(e){return `${e} cannot be repo-wide ('.'). Choose minimal path prefixes; tip: \`agentplane guard suggest-allow --format args\`.`}var Di=u(()=>{pa();});var Ni,rB=u(()=>{H();Di();nr();Ni={id:["block"],group:"Lifecycle",summary:"Transition a task to BLOCKED and record a structured Blocked comment.",args:[{name:"task-id",required:true,valueHint:"<task-id>",description:"Existing task id."}],options:[{kind:"string",name:"author",valueHint:"<id>",required:true,description:"Comment author id (e.g. CODER)."},{kind:"string",name:"body",valueHint:"<text>",required:true,description:"Structured comment body (must match the configured Blocked: prefix)."},{kind:"boolean",name:"commit-from-comment",default:false,description:"Create a status commit using the comment body."},{kind:"string",name:"commit-emoji",valueHint:"<emoji>",description:"Override the status commit emoji (used with --commit-from-comment)."},{kind:"string",name:"commit-allow",valueHint:"<path-prefix>",repeatable:true,description:"Repeatable. Allowlist path prefixes to stage for the status commit (used with --commit-from-comment). Use minimal prefixes; '.' is rejected."},{kind:"boolean",name:"commit-auto-allow",default:false,description:"Deprecated. Disabled for safety; pass explicit --commit-allow prefixes.",deprecated:"disabled"},{kind:"boolean",name:"commit-allow-tasks",default:true,hidden:true,description:"Deprecated. Tasks are always allowed for status commits.",deprecated:"no-op"},{kind:"boolean",name:"commit-require-clean",default:false,description:"Require a clean working tree for the status commit (used with --commit-from-comment)."},{kind:"boolean",name:"confirm-status-commit",default:false,description:"Confirm status commit creation when status_commit_policy=confirm (used with --commit-from-comment)."},{kind:"boolean",name:"force",default:false,description:"Override status transition restrictions."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action approval checks when required."},{kind:"boolean",name:"quiet",default:false,description:"Suppress output."}],examples:[{cmd:'agentplane block 202602030608-F1Q8AB --author CODER --body "Blocked: waiting for review"',why:"Block work on a task."},{cmd:'agentplane block 202602030608-F1Q8AB --author CODER --body "Blocked: waiting for review" --commit-from-comment --commit-allow packages/agentplane/src',why:"Block work and create a status commit from the comment."}],validateRaw:e=>{let t=typeof e.opts.author=="string"?e.opts.author.trim():"",r=typeof e.opts.body=="string"?e.opts.body.trim():"",n=Q(e.opts["commit-allow"]);if(!t)throw y({spec:Ni,message:"Invalid value for --author: empty."});if(!r)throw y({spec:Ni,message:"Invalid value for --body: empty."});if(Lt(n).length>0)throw y({spec:Ni,message:qt("--commit-allow")});if(e.opts["commit-auto-allow"]===true)throw y({spec:Ni,message:"--commit-auto-allow is disabled; pass explicit --commit-allow <path-prefix>."});if(e.opts["commit-from-comment"]===true&&n.length===0)throw y({spec:Ni,message:"--commit-from-comment requires --commit-allow <path-prefix> (tip: `agentplane guard suggest-allow --format args`)."})},parse:e=>({taskId:typeof e.args["task-id"]=="string"?e.args["task-id"]:"",author:e.opts.author,body:e.opts.body,commitFromComment:e.opts["commit-from-comment"]===true,commitEmoji:e.opts["commit-emoji"],commitAllow:Q(e.opts["commit-allow"]),commitAutoAllow:e.opts["commit-auto-allow"]===true,commitAllowTasks:e.opts["commit-allow-tasks"]!==false,commitRequireClean:e.opts["commit-require-clean"]===true,confirmStatusCommit:e.opts["confirm-status-commit"]===true,force:e.opts.force===true,yes:e.opts.yes===true,quiet:e.opts.quiet===true})};});var lr,gx=u(()=>{H();Di();lr={id:["commit"],group:"Guard",summary:"Create a git commit after validating policy and allowlist; if the index is empty, stage matching allowlist paths first.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"message",short:"m",valueHint:"<message>",description:"Commit subject (must follow policy). Required unless --close is used."},{kind:"boolean",name:"close",default:false,description:"Generate a deterministic close commit message from task snapshot + verification + recorded implementation commit; stages only the task README."},{kind:"boolean",name:"unstage-others",default:false,description:"With --close: unstage any currently staged paths before staging the task README."},{kind:"boolean",name:"check-only",default:false,description:"With --close: run preflight checks and print the planned close commit subject without creating a commit."},{kind:"string",name:"allow",valueHint:"<path-prefix>",repeatable:true,description:"Repeatable. Allowed path prefix (git-path). Use minimal prefixes; repo-wide '.' is rejected (tip: `agentplane guard suggest-allow --format args`)."},{kind:"boolean",name:"auto-allow",default:false,description:"Deprecated. Disabled for safety; pass explicit --allow prefixes.",deprecated:"disabled"},{kind:"boolean",name:"allow-tasks",default:false,description:"Allow the tasks export snapshot plus artifacts under the active task subtree; standalone path scope."},{kind:"boolean",name:"allow-base",default:false,description:"Allow base branch edits; branch override only, not a path allowlist."},{kind:"boolean",name:"allow-policy",default:false,description:"Allow policy edits (e.g. AGENTS.md); standalone path scope."},{kind:"boolean",name:"allow-config",default:false,description:"Allow config edits; standalone path scope."},{kind:"boolean",name:"allow-hooks",default:false,description:"Allow hooks edits; standalone path scope."},{kind:"boolean",name:"allow-ci",default:false,description:"Allow CI workflow edits; standalone path scope."},{kind:"boolean",name:"require-clean",default:false,description:"Fail if tracked files have unstaged changes (untracked is ignored)."},{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:'agentplane commit 202602030608-F1Q8AB -m "\u2728 F1Q8AB task: implement allowlist guard" --allow packages/agentplane',why:"Create a commit after validating allowlist and subject policy."},{cmd:'agentplane commit 202602030608-F1Q8AB -m "\u2728 F1Q8AB task: update publish workflow" --allow-ci',why:"Commit CI-only changes without a redundant explicit workflow path prefix."},{cmd:"agentplane commit 202602030608-F1Q8AB --close",why:"Create a close commit for the task README using a deterministic message builder."}],notes:["Repository-managed task commits use the canonical subject format `<emoji> <suffix> <scope>: <summary>`; non-task commits use `<emoji> <scope>: <summary>`.","Repository-managed commit paths resolve author/committer identity from global git `user.name` and `user.email` before falling back to ambient git env.","Protected path-scoped overrides can stand alone without a duplicate explicit prefix: `--allow-tasks`, `--allow-policy`, `--allow-config`, `--allow-hooks`, and `--allow-ci` each admit their own path family.","Top-level `agentplane commit` can auto-stage those protected path scopes when the git index starts empty.","`--allow-base` is different: it only overrides base-branch protection and never selects file paths by itself."],validateRaw:e=>{let t=e.opts.close===true,r=typeof e.opts.message=="string"?e.opts.message.trim():"";if(!t&&!r)throw y({spec:lr,message:"Missing required --message (or use --close)."});if(e.opts.message!==void 0&&!r)throw y({spec:lr,message:"Invalid value for --message: empty."});if(t&&e.opts.message!==void 0)throw y({spec:lr,message:"Use either --message or --close (not both)."});if(!t&&e.opts["unstage-others"]===true)throw y({spec:lr,message:"--unstage-others requires --close."});if(!t&&e.opts["check-only"]===true)throw y({spec:lr,message:"--check-only requires --close."});let n=e.opts.allow;if(Array.isArray(n)&&n.some(i=>typeof i=="string"&&i.trim()===""))throw y({spec:lr,message:"Invalid value for --allow: empty."});let o=Array.isArray(n)?n:typeof n=="string"?[n]:[];if(Lt(o).length>0)throw y({spec:lr,message:qt("--allow")});if(e.opts["auto-allow"]===true)throw y({spec:lr,message:"--auto-allow is disabled; pass explicit --allow <path-prefix>."})},parse:e=>({taskId:String(e.args["task-id"]),message:typeof e.opts.message=="string"?String(e.opts.message):void 0,close:e.opts.close===true,allow:Array.isArray(e.opts.allow)?e.opts.allow:typeof e.opts.allow=="string"?[e.opts.allow]:[],autoAllow:e.opts["auto-allow"]===true,allowTasks:e.opts["allow-tasks"]===true,allowBase:e.opts["allow-base"]===true,allowPolicy:e.opts["allow-policy"]===true,allowConfig:e.opts["allow-config"]===true,allowHooks:e.opts["allow-hooks"]===true,allowCI:e.opts["allow-ci"]===true,requireClean:e.opts["require-clean"]===true,quiet:e.opts.quiet===true,closeUnstageOthers:e.opts["unstage-others"]===true,closeCheckOnly:e.opts["check-only"]===true})};});var hx={};S(hx,{cleanupMergedSpec:()=>Xf,cleanupSpec:()=>Qf,makeRunCleanupMergedHandler:()=>L7,runCleanup:()=>B7});function L7(e){return async(t,r)=>await fd({ctx:await e("cleanup merged"),cwd:t.cwd,rootOverride:t.rootOverride,base:r.base??void 0,yes:r.yes,archive:r.archive,deleteRemoteBranches:r.deleteRemoteBranches,fetch:r.fetch,quiet:r.quiet})}var Qf,Xf,B7,Zf=u(()=>{Oe();H();vo();Qf={id:["cleanup"],group:"Branch",summary:"Clean up local branches/worktrees.",synopsis:["agentplane cleanup <merged> [options]"],args:[{name:"cmd",required:false,variadic:true,valueHint:"<cmd>"}],examples:[{cmd:"agentplane cleanup merged --yes",why:"Delete merged task branches/worktrees."}],parse:e=>ke(e)},Xf={id:["cleanup","merged"],group:"Branch",summary:"Delete merged task branches/worktrees (branch_pr workflow).",options:[{kind:"string",name:"base",valueHint:"<name>",description:"Base branch override."},{kind:"boolean",name:"yes",default:false,description:"Confirm deletions."},{kind:"boolean",name:"archive",default:false,description:"Archive PR artifacts before deletion."},{kind:"boolean",name:"delete-remote-branches",default:false,description:"Also delete matching remote task branches on origin."},{kind:"boolean",name:"fetch",default:false,description:"Fetch and prune origin before candidate resolution."},{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:"agentplane cleanup merged",why:"List candidates without deleting."},{cmd:"agentplane cleanup merged --yes --archive",why:"Delete candidates and archive PR artifacts."},{cmd:"agentplane cleanup merged --yes --delete-remote-branches",why:"Delete candidates and matching remote task branches on origin."},{cmd:"agentplane cleanup merged --fetch",why:"Refresh origin before evaluating cleanup candidates."}],validateRaw:e=>{let t=typeof e.opts.base=="string"?e.opts.base.trim():"";if(e.opts.base!==void 0&&!t)throw y({spec:Xf,message:"Invalid value for --base: empty."})},parse:e=>({base:typeof e.opts.base=="string"?e.opts.base:null,yes:e.opts.yes===true,archive:e.opts.archive===true,deleteRemoteBranches:e.opts["delete-remote-branches"]===true,fetch:e.opts.fetch===true,quiet:e.opts.quiet===true})},B7=async(e,t)=>{oe({spec:Qf,cmd:t.cmd,subcommands:await ne(["cleanup"]),command:"cleanup",contextCommand:"cleanup"});};});function q7(e){return e.replaceAll("`","\\`")}function ji(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll("*",String.raw`\*`).replaceAll("`","\\`")}function H7(e){return e.toLowerCase().replaceAll(/[^a-z0-9]+/g,"-").replaceAll(/(^-|-$)/g,"")}function G7(e){if(e===void 0)return "";if(e===null)return "null";if(typeof e=="string")return e;if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"true":"false";if(typeof e=="bigint")return e.toString();try{return JSON.stringify(e)}catch{return "[unserializable]"}}function V7(e){let t=e;for(;;){let r=t.replaceAll(/\n{3,}/g,`
560
+
561
+ `).replaceAll("```\n- ","```\n\n- ").replaceAll(/\n(- [^\n]+)\n```/g,"\n$1\n\n```");if(r===t)return t;t=r;}}function nB(e){let t=new Map;for(let s of e){let c=s.group||"Other";t.set(c,[...t.get(c)??[],s]);}let n=[...t.keys()].toSorted((s,c)=>s.localeCompare(c)).map(s=>({group:s,specs:(t.get(s)??[]).toSorted((c,d)=>c.id.join(" ").localeCompare(d.id.join(" ")))})),o=n.flatMap(({group:s,specs:c})=>[`- ${s}`,...c.map(d=>{let l=d.id.join(" ");return ` - [${l}](#${H7(l)})`})]),i=n.flatMap(({group:s,specs:c})=>{let d=["",`## ${s}`],l=c.flatMap(p=>{let g=p.description?["",ji(p.summary),"",ji(p.description)]:["",ji(p.summary)],h=["","Usage:","","```text",...p.usage??[],"```"],f=(p.options??[]).filter(x=>!x.hidden),b=f.length===0?[]:["","Options:","",...f.map(x=>{let C=x.short?`-${x.short}, `:"",j=x.kind==="string"?`${C}--${x.name} ${x.valueHint??"<value>"}`:`${C}--${x.name}`,T=[x.required?"required":null,x.repeatable?"repeatable":null,x.choices&&x.choices.length>0?`choices=${x.choices.join("|")}`:null,x.patternHint?`format=${x.patternHint}`:null,x.default===void 0?null:`default=${G7(x.default)}`,x.deprecated?`deprecated=${x.deprecated}`:null].filter($=>$!==null),M=T.length>0?` (${T.join(", ")})`:"";return `- \`${q7(j)}\`: ${ji(x.description)}${ji(M)}`})],w=p.notes&&p.notes.length>0?["","Notes:","",...p.notes.map(x=>`- ${ji(x)}`)]:[],_=p.examples&&p.examples.length>0?["","Examples:","",...p.examples.flatMap(x=>{let C=x.why?[`- ${ji(x.why)}`]:[];return ["```sh",x.cmd,"```",...C]})]:[];return ["",`### ${p.id.join(" ")}`,"",...g,...h,...b,...w,..._]});return [...d,...l]}),a=["# CLI Reference (Generated)","","This page is generated from the CLI command specs. Do not edit it by hand; edit the specs instead.","","## Index","",...o,...i,""];return V7(a.join(`
562
+ `))}var oB=u(()=>{});var aB={};S(aB,{docsCliSpec:()=>eg,makeHelpJsonFromSpecs:()=>kx,makeRunDocsCliHandler:()=>W7});function W7(e){return async(t,r)=>{let n;try{n=e();}catch(a){throw y({spec:eg,command:"docs cli",message:`Failed to read command specs for docs generation: ${a instanceof Error?a.message:String(a)}`})}let o=nB(n),i=Ye.resolve(t.cwd,r.out);return await mkdir(Ye.dirname(i),{recursive:true}),await X(i,o),process.stdout.write(`${i}
563
+ `),0}}function kx(e){return e.map(t=>gc(t))}var eg,tg=u(()=>{H();oB();Rm();_e();eg={id:["docs","cli"],group:"Docs",summary:"Generate an MDX CLI reference from the current command spec catalog.",options:[{kind:"string",name:"out",valueHint:"<path>",required:true,description:"Output path. If relative, it is resolved against the current working directory."}],examples:[{cmd:"agentplane docs cli --out docs/user/cli-reference.generated.mdx",why:"Generate docs."}],parse:e=>({out:e.opts.out})};});function ys(e,t,r){if(typeof e.opts.details=="string"&&typeof e.opts.file=="string")throw y({spec:t,command:r?.command,message:r?.message??"Options --details and --file are mutually exclusive."})}function ws(e,t,r){let n=e.opts[r];if(typeof n=="string"&&n.trim().length===0)throw y({spec:t,message:`Invalid value for --${r}: empty.`})}function bs(e,t,r){let n=e.opts.note,o=e.opts["note-file"];if(typeof n=="string"&&typeof o=="string")throw y({spec:t,command:r?.command,message:"Options --note and --note-file are mutually exclusive."});if(typeof o=="string"&&o.trim().length===0)throw y({spec:t,command:r?.command,message:"Invalid value for --note-file: empty."});if(typeof n=="string"&&n.trim().length===0)throw y({spec:t,command:r?.command,message:"Invalid value for --note: empty."});if(typeof n!="string"&&typeof o!="string")throw y({spec:t,command:r?.command,message:"Provide exactly one of --note or --note-file."})}function So(e,t,r){let n=[e.opts.observation,e.opts.impact,e.opts.resolution,e.opts["incident-scope"],e.opts["incident-advice"],e.opts["incident-rule"]].some(d=>typeof d=="string"&&d.trim().length>0),o=Array.isArray(e.opts["incident-tag"])&&e.opts["incident-tag"].length>0?true:Array.isArray(e.opts["incident-match"])&&e.opts["incident-match"].length>0,i=e.opts["local-only"]===true||e.opts["repo-fixable"]===true;if(!n&&!o&&!i)return;let a=e.opts.observation,s=e.opts.impact,c=e.opts.resolution;if(typeof a!="string"||a.trim().length===0||typeof s!="string"||s.trim().length===0||typeof c!="string"||c.trim().length===0)throw y({spec:t,command:r?.command,message:"Provide --observation, --impact, and --resolution together when appending a structured finding."})}function _s(e){return {by:typeof e.opts.by=="string"?e.opts.by:"",note:typeof e.opts.note=="string"?e.opts.note:"",noteFile:typeof e.opts["note-file"]=="string"?e.opts["note-file"]:void 0,details:typeof e.opts.details=="string"?e.opts.details:void 0,file:typeof e.opts.file=="string"?e.opts.file:void 0,quiet:e.opts.quiet===true,collectIncidents:e.opts["collect-incidents"]===true,observation:typeof e.opts.observation=="string"?e.opts.observation:void 0,impact:typeof e.opts.impact=="string"?e.opts.impact:void 0,resolution:typeof e.opts.resolution=="string"?e.opts.resolution:void 0,localOnly:e.opts["local-only"]===true,repoFixable:e.opts["repo-fixable"]===true,incidentScope:typeof e.opts["incident-scope"]=="string"?e.opts["incident-scope"]:void 0,incidentTags:e.opts["incident-tag"]??[],incidentMatch:e.opts["incident-match"]??[],incidentAdvice:typeof e.opts["incident-advice"]=="string"?e.opts["incident-advice"]:void 0,incidentRule:typeof e.opts["incident-rule"]=="string"?e.opts["incident-rule"]:void 0}}var Ud,rg,Wd=u(()=>{H();Ud=[{kind:"string",name:"observation",valueHint:"<text>",description:"Structured finding observation to append with the verification."},{kind:"string",name:"impact",valueHint:"<text>",description:"Structured finding impact to append with the verification."},{kind:"string",name:"resolution",valueHint:"<text>",description:"Structured finding resolution to append with the verification."},{kind:"boolean",name:"local-only",default:false,description:"Keep the finding task-local; omit incident-candidate promotion."},{kind:"boolean",name:"repo-fixable",default:false,description:"Mark the structured finding as repo-fixable so incidents collect can promote it."},{kind:"string",name:"incident-scope",valueHint:"<text>",description:"Optional incident scope for the appended finding."},{kind:"string",name:"incident-tag",valueHint:"<tag>",repeatable:true,description:"Repeatable incident tag for the appended finding."},{kind:"string",name:"incident-match",valueHint:"<term>",repeatable:true,description:"Repeatable incident match term for the appended finding."},{kind:"string",name:"incident-advice",valueHint:"<text>",description:"Optional operator advice for the appended finding."},{kind:"string",name:"incident-rule",valueHint:"<text>",description:"Optional incident rule for the appended finding."}],rg=[{kind:"string",name:"by",valueHint:"<id>",required:true,description:"Verifier id."},{kind:"string",name:"note",valueHint:"<text>",description:"Short verification note."},{kind:"string",name:"note-file",valueHint:"<path>",description:"Read the verification note from a file path (mutually exclusive with --note)."},{kind:"string",name:"details",valueHint:"<text>",description:"Optional details text (mutually exclusive with --file)."},{kind:"string",name:"file",valueHint:"<path>",description:"Optional details file path (mutually exclusive with --details)."},{kind:"boolean",name:"quiet",default:false,description:"Suppress normal output (still prints errors)."},{kind:"boolean",name:"collect-incidents",default:false,description:"After recording verification, collect promotable findings into incidents.md immediately."},...Ud];});var $e,yx=u(()=>{H();Wd();nr();Di();$e={id:["finish"],group:"Lifecycle",summary:"Mark task(s) as DONE and record a structured Verified comment.",args:[{name:"task-id",required:true,variadic:true,valueHint:"<task-id>",description:"One or more existing task ids."}],options:[{kind:"string",name:"author",valueHint:"<id>",required:true,description:"Comment author id (e.g. INTEGRATOR)."},{kind:"string",name:"body",valueHint:"<text>",required:true,description:"Structured comment body (must match the configured Verified: prefix)."},{kind:"string",name:"result",valueHint:"<one-line>",description:"One-line result summary stored in task metadata (required for non-spike tasks when finishing a single task)."},{kind:"string",name:"risk",valueHint:"<low|med|high>",choices:["low","med","high"],description:"Optional. Risk level stored in task metadata."},{kind:"boolean",name:"breaking",default:false,description:"Optional. Mark the change as breaking in task metadata."},{kind:"string",name:"commit",valueHint:"<hash>",description:"Commit hash to record on the task (optional)."},{kind:"boolean",name:"force",default:false,description:"Force finish despite gates."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action approval checks when required."},{kind:"boolean",name:"commit-from-comment",default:false,description:"Create a commit using the comment body (requires exactly one task id)."},{kind:"string",name:"commit-emoji",valueHint:"<emoji>",description:"Override the commit emoji (used with --commit-from-comment)."},{kind:"string",name:"commit-allow",valueHint:"<path-prefix>",repeatable:true,description:"Repeatable. Allowlist path prefixes to stage for the commit (used with --commit-from-comment). Use minimal prefixes; '.' is rejected."},{kind:"boolean",name:"commit-auto-allow",default:false,description:"Deprecated. Disabled for safety; pass explicit --commit-allow prefixes.",deprecated:"disabled"},{kind:"boolean",name:"commit-allow-tasks",default:true,hidden:true,description:"Deprecated. Tasks are always allowed for status commits.",deprecated:"no-op"},{kind:"boolean",name:"commit-require-clean",default:false,description:"Require a clean working tree for the commit (used with --commit-from-comment)."},{kind:"boolean",name:"status-commit",default:false,description:"Create a separate status commit (requires exactly one task id)."},{kind:"string",name:"status-commit-emoji",valueHint:"<emoji>",description:"Override the status commit emoji (used with --status-commit)."},{kind:"string",name:"status-commit-allow",valueHint:"<path-prefix>",repeatable:true,description:"Repeatable. Allowlist path prefixes to stage for the status commit (used with --status-commit). Use minimal prefixes; '.' is rejected."},{kind:"boolean",name:"status-commit-auto-allow",default:false,description:"Deprecated. Disabled for safety; pass explicit --status-commit-allow prefixes.",deprecated:"disabled"},{kind:"boolean",name:"status-commit-require-clean",default:false,description:"Require a clean working tree for the status commit (used with --status-commit)."},{kind:"boolean",name:"confirm-status-commit",default:false,description:"Confirm status commit creation when status_commit_policy=confirm (used with --commit-from-comment or --status-commit)."},{kind:"boolean",name:"close-commit",default:false,description:"After finishing, run a deterministic close commit for the task README (single-task only)."},{kind:"boolean",name:"no-close-commit",default:false,description:"Disable the default deterministic close commit in direct mode (single-task only)."},{kind:"boolean",name:"close-unstage-others",default:false,description:"With --close-commit: unstage any currently staged paths before staging the task README."},{kind:"string",name:"base",valueHint:"<branch>",description:"Optional explicit base branch override for branch_pr finish validation and close-commit reconciliation."},...Ud,{kind:"boolean",name:"quiet",default:false,description:"Suppress output."}],examples:[{cmd:'agentplane finish 202602030608-F1Q8AB --author INTEGRATOR --body "Verified: all checks passed" --commit abcdef123456',why:"Finish a task and record commit metadata."},{cmd:'agentplane finish 202602030608-F1Q8AB --author INTEGRATOR --body "Verified: all checks passed" --commit-from-comment --commit-allow packages/agentplane/src',why:"Finish and create a commit from the comment (single-task only)."},{cmd:'agentplane finish 202602030608-F1Q8AB --author INTEGRATOR --body "Verified: all checks passed" --commit abcdef123456 --observation "Recurring manual recovery remained easy to miss." --impact "incidents.md stayed stale until a second command." --resolution "Capture the closeout finding during finish itself."',why:"Finish a task while appending a structured finding that can promote into incidents.md."}],validateRaw:e=>{let t=e.args["task-id"],r=Array.isArray(t)?t:[],n=e.opts["commit-from-comment"]===true,o=e.opts["status-commit"]===true,i=Q(e.opts["commit-allow"]),a=Q(e.opts["status-commit-allow"]),s=e.opts["commit-auto-allow"]===true,c=e.opts["status-commit-auto-allow"]===true;if(Lt(i).length>0)throw y({spec:$e,command:"finish",message:qt("--commit-allow")});if(Lt(a).length>0)throw y({spec:$e,command:"finish",message:qt("--status-commit-allow")});if(s)throw y({spec:$e,command:"finish",message:"--commit-auto-allow is disabled; pass explicit --commit-allow <path-prefix>."});if(c)throw y({spec:$e,command:"finish",message:"--status-commit-auto-allow is disabled; pass explicit --status-commit-allow <path-prefix>."});if((n||o)&&r.length!==1)throw y({spec:$e,command:"finish",message:"--commit-from-comment/--status-commit requires exactly one task id"});if(n&&o)throw y({spec:$e,command:"finish",message:"--commit-from-comment cannot be combined with --status-commit in finish; use one deterministic commit path."});if(n&&i.length===0)throw y({spec:$e,command:"finish",message:"--commit-from-comment requires --commit-allow <path-prefix> (tip: `agentplane guard suggest-allow --format args`)."});if(o&&a.length===0)throw y({spec:$e,command:"finish",message:"--status-commit requires --status-commit-allow <path-prefix> (tip: `agentplane guard suggest-allow --format args`)."});if(e.opts["close-commit"]===true&&r.length!==1)throw y({spec:$e,command:"finish",message:"--close-commit requires exactly one task id"});if(e.opts["no-close-commit"]===true&&r.length!==1)throw y({spec:$e,command:"finish",message:"--no-close-commit requires exactly one task id"});if(e.opts["close-commit"]===true&&e.opts["no-close-commit"]===true)throw y({spec:$e,command:"finish",message:"--close-commit and --no-close-commit are mutually exclusive"});if((e.opts["close-commit"]===true||e.opts["no-close-commit"]===true)&&(e.opts["commit-from-comment"]===true||e.opts["status-commit"]===true))throw y({spec:$e,command:"finish",message:"--close-commit/--no-close-commit cannot be combined with --commit-from-comment/--status-commit"});if(e.opts["close-unstage-others"]===true&&e.opts["close-commit"]!==true)throw y({spec:$e,command:"finish",message:"--close-unstage-others requires --close-commit"});if(typeof e.opts.base=="string"&&e.opts.base.trim().length===0)throw y({spec:$e,command:"finish",message:"Invalid value for --base: empty."});let d=typeof e.opts.result=="string"||typeof e.opts.risk=="string"||e.opts.breaking===true,l=[e.opts.observation,e.opts.impact,e.opts.resolution,e.opts["incident-scope"],e.opts["incident-advice"],e.opts["incident-rule"]].some(p=>typeof p=="string"&&p.trim().length>0)?true:Array.isArray(e.opts["incident-tag"])&&e.opts["incident-tag"].length>0||Array.isArray(e.opts["incident-match"])&&e.opts["incident-match"].length>0||e.opts["local-only"]===true||e.opts["repo-fixable"]===true;if(d&&r.length!==1)throw y({spec:$e,command:"finish",message:"--result/--risk/--breaking requires exactly one task id"});if(l&&r.length!==1)throw y({spec:$e,command:"finish",message:"--observation/--impact/--resolution and incident finding options require exactly one task id"});So(e,$e,{command:"finish"});},parse:e=>({taskIds:Array.isArray(e.args["task-id"])?e.args["task-id"].filter(t=>typeof t=="string"):[],author:e.opts.author,body:e.opts.body,result:e.opts.result,risk:e.opts.risk,breaking:e.opts.breaking===true,commit:e.opts.commit,force:e.opts.force===true,yes:e.opts.yes===true,commitFromComment:e.opts["commit-from-comment"]===true,commitEmoji:e.opts["commit-emoji"],commitAllow:Q(e.opts["commit-allow"]),commitAutoAllow:e.opts["commit-auto-allow"]===true,commitAllowTasks:e.opts["commit-allow-tasks"]!==false,commitRequireClean:e.opts["commit-require-clean"]===true,statusCommit:e.opts["status-commit"]===true,statusCommitEmoji:e.opts["status-commit-emoji"],statusCommitAllow:Q(e.opts["status-commit-allow"]),statusCommitAutoAllow:e.opts["status-commit-auto-allow"]===true,statusCommitRequireClean:e.opts["status-commit-require-clean"]===true,confirmStatusCommit:e.opts["confirm-status-commit"]===true,closeCommit:e.opts["close-commit"]===true,noCloseCommit:e.opts["no-close-commit"]===true,closeUnstageOthers:e.opts["close-unstage-others"]===true,baseBranchOverride:typeof e.opts.base=="string"?e.opts.base:void 0,observation:typeof e.opts.observation=="string"?e.opts.observation:void 0,impact:typeof e.opts.impact=="string"?e.opts.impact:void 0,resolution:typeof e.opts.resolution=="string"?e.opts.resolution:void 0,localOnly:e.opts["local-only"]===true,repoFixable:e.opts["repo-fixable"]===true,incidentScope:typeof e.opts["incident-scope"]=="string"?e.opts["incident-scope"]:void 0,incidentTags:Q(e.opts["incident-tag"]),incidentMatch:Q(e.opts["incident-match"]),incidentAdvice:typeof e.opts["incident-advice"]=="string"?e.opts["incident-advice"]:void 0,incidentRule:typeof e.opts["incident-rule"]=="string"?e.opts["incident-rule"]:void 0,quiet:e.opts.quiet===true})};});var sB={};S(sB,{guardCleanSpec:()=>wx,runGuardClean:()=>z7});var wx,z7,bx=u(()=>{_i();wx={id:["guard","clean"],group:"Guard",summary:"Ensure the git index has no staged files.",options:[{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:"agentplane guard clean",why:"Fail if staged files exist."}],parse:e=>({quiet:e.opts.quiet===true})},z7=async(e,t)=>await Gp({cwd:e.cwd,rootOverride:e.rootOverride,quiet:t.quiet});});var Eo,_x=u(()=>{H();Di();Eo={id:["guard","commit"],group:"Guard",summary:"Validate commit policy and allowlist for staged changes (no commit is created).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"message",short:"m",valueHint:"<message>",required:true,description:"Commit subject (must follow policy)."},{kind:"string",name:"allow",valueHint:"<path-prefix>",repeatable:true,description:"Repeatable. Allowed path prefix (git-path). Use minimal prefixes; repo-wide '.' is rejected (tip: `agentplane guard suggest-allow --format args`)."},{kind:"boolean",name:"auto-allow",default:false,description:"Deprecated. Disabled for safety; pass explicit --allow prefixes.",deprecated:"disabled"},{kind:"boolean",name:"allow-tasks",default:false,description:"Allow the tasks export snapshot plus artifacts under the active task subtree; standalone path scope."},{kind:"boolean",name:"allow-base",default:false,description:"Allow base branch edits; branch override only, not a path allowlist."},{kind:"boolean",name:"allow-policy",default:false,description:"Allow policy edits (e.g. AGENTS.md); standalone path scope."},{kind:"boolean",name:"allow-config",default:false,description:"Allow config edits; standalone path scope."},{kind:"boolean",name:"allow-hooks",default:false,description:"Allow hooks edits; standalone path scope."},{kind:"boolean",name:"allow-ci",default:false,description:"Allow CI workflow edits; standalone path scope."},{kind:"boolean",name:"require-clean",default:false,description:"Fail if tracked files have unstaged changes (untracked is ignored)."},{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:'agentplane guard commit 202602030608-F1Q8AB -m "\u2728 F1Q8AB task: implement allowlist guard" --allow packages/agentplane',why:"Validate staged changes are covered by allowlist and policy."},{cmd:'agentplane guard commit 202602030608-F1Q8AB -m "\u2728 F1Q8AB task: update publish workflow" --allow-ci',why:"Validate already staged CI-only changes without a redundant explicit workflow path prefix."}],notes:["Protected path-scoped overrides can stand alone without a duplicate explicit prefix: `--allow-tasks`, `--allow-policy`, `--allow-config`, `--allow-hooks`, and `--allow-ci` each admit their own path family.","`agentplane guard commit` remains staged-only: it validates the current index and never auto-stages files for you.","`--allow-base` is different: it only overrides base-branch protection and never selects file paths by itself."],validateRaw:e=>{let t=typeof e.opts.message=="string"?e.opts.message.trim():"";if(e.opts.message!==void 0&&!t)throw y({spec:Eo,message:"Invalid value for --message: empty."});let r=e.opts.allow;if(Array.isArray(r)&&r.some(o=>typeof o=="string"&&o.trim()===""))throw y({spec:Eo,message:"Invalid value for --allow: empty."});let n=Array.isArray(r)?r:typeof r=="string"?[r]:[];if(Lt(n).length>0)throw y({spec:Eo,message:qt("--allow")});if(e.opts["auto-allow"]===true)throw y({spec:Eo,message:"--auto-allow is disabled; pass explicit --allow <path-prefix>."})},parse:e=>({taskId:String(e.args["task-id"]),message:String(e.opts.message),allow:Array.isArray(e.opts.allow)?e.opts.allow:typeof e.opts.allow=="string"?[e.opts.allow]:[],autoAllow:e.opts["auto-allow"]===true,allowTasks:e.opts["allow-tasks"]===true,allowBase:e.opts["allow-base"]===true,allowPolicy:e.opts["allow-policy"]===true,allowConfig:e.opts["allow-config"]===true,allowHooks:e.opts["allow-hooks"]===true,allowCI:e.opts["allow-ci"]===true,requireClean:e.opts["require-clean"]===true,quiet:e.opts.quiet===true})};});var cB={};S(cB,{guardSpec:()=>ng,runGuard:()=>K7});var ng,K7,vx=u(()=>{Oe();ng={id:["guard"],group:"Guard",summary:"Guard commands (commit checks, git hygiene, and allowlist helpers).",synopsis:["agentplane guard <command> [args] [options]"],args:[{name:"cmd",required:false,variadic:true,valueHint:"<command>"}],parse:e=>ke(e)},K7=async(e,t)=>{oe({spec:ng,cmd:t.cmd,subcommands:await ne(["guard"])});};});var dB={};S(dB,{guardSuggestAllowSpec:()=>xx,runGuardSuggestAllow:()=>J7});var xx,J7,Rx=u(()=>{_i();xx={id:["guard","suggest-allow"],group:"Guard",summary:"Suggest minimal --allow prefixes based on staged files.",options:[{kind:"string",name:"format",valueHint:"<lines|args>",choices:["lines","args"],default:"lines",description:"Output format (default: lines)."}],examples:[{cmd:"agentplane guard suggest-allow",why:"Print prefixes, one per line."},{cmd:"agentplane guard suggest-allow --format args",why:"Print as --allow ... args."}],parse:e=>({format:e.opts.format??"lines"})},J7=async(e,t)=>await Vp({cwd:e.cwd,rootOverride:e.rootOverride,format:t.format});});var lB={};S(lB,{hooksInstallSpec:()=>Cx,runHooksInstall:()=>Y7});var Cx,Y7,Px=u(()=>{hd();Cx={id:["hooks","install"],group:"Hooks",summary:"Install managed git hooks and the agentplane shim.",options:[{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:"agentplane hooks install",why:"Install hooks into .git/hooks/."}],parse:e=>({quiet:e.opts.quiet===true})},Y7=async(e,t)=>await xo({cwd:e.cwd,rootOverride:e.rootOverride,quiet:t.quiet});});var mB={};S(mB,{hooksSpec:()=>og,runHooks:()=>Q7});var og,Q7,Tx=u(()=>{Oe();og={id:["hooks"],group:"Hooks",summary:"Manage and run git hooks installed by agentplane.",synopsis:["agentplane hooks <command> [args] [options]"],args:[{name:"cmd",required:false,variadic:true,valueHint:"<command>"}],parse:e=>ke(e)},Q7=async(e,t)=>{oe({spec:og,cmd:t.cmd,subcommands:await ne(["hooks"])});};});var uB={};S(uB,{hooksRunSpec:()=>ig,runHooksRun:()=>X7});var ig,X7,Sx=u(()=>{H();hd();ig={id:["hooks","run"],group:"Hooks",summary:"Run a managed hook (use `--` to pass through additional arguments).",args:[{name:"hook",required:true,valueHint:"<hook>"},{name:"args",required:false,variadic:true,valueHint:"<args...>"}],examples:[{cmd:"agentplane hooks run pre-commit",why:"Run the pre-commit checks."},{cmd:"agentplane hooks run commit-msg -- .git/COMMIT_EDITMSG",why:"Run commit-msg with a message file argument."}],validateRaw:e=>{let t=String(e.args.hook);if(!xi.includes(t))throw y({spec:ig,message:`Unknown hook: ${t} (expected one of: ${xi.join(", ")})`})},parse:e=>({hook:String(e.args.hook),args:Array.isArray(e.args.args)?e.args.args.map(String):[]})},X7=async(e,t)=>await Zp({cwd:e.cwd,rootOverride:e.rootOverride,hook:t.hook,args:t.args});});var pB={};S(pB,{hooksUninstallSpec:()=>Ex,runHooksUninstall:()=>Z7});var Ex,Z7,Ix=u(()=>{hd();Ex={id:["hooks","uninstall"],group:"Hooks",summary:"Uninstall managed git hooks installed by agentplane.",options:[{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:"agentplane hooks uninstall",why:"Remove agentplane hooks from .git/hooks/."}],parse:e=>({quiet:e.opts.quiet===true})},Z7=async(e,t)=>await Xp({cwd:e.cwd,rootOverride:e.rootOverride,quiet:t.quiet});});var fB={};S(fB,{makeRunReadyHandler:()=>eee,readySpec:()=>Ax});function eee(e){return async(t,r)=>await mp({ctx:await e("ready"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId})}var Ax,Ox=u(()=>{Ab();Ax={id:["ready"],group:"Task",summary:"Report dependency readiness details for a task.",args:[{name:"task-id",required:true,valueHint:"<task-id>",description:"Existing task id."}],examples:[{cmd:"agentplane ready 202602030608-F1Q8AB",why:"Print readiness details."}],parse:e=>({taskId:typeof e.args["task-id"]=="string"?e.args["task-id"]:""})};});var $i,gB=u(()=>{H();Di();nr();$i={id:["start"],group:"Lifecycle",summary:"Transition a task to DOING and record a structured Start comment.",args:[{name:"task-id",required:true,valueHint:"<task-id>",description:"Existing task id."}],options:[{kind:"string",name:"author",valueHint:"<id>",required:true,description:"Comment author id (e.g. CODER)."},{kind:"string",name:"body",valueHint:"<text>",required:true,description:"Structured comment body (must match the configured Start: prefix)."},{kind:"boolean",name:"commit-from-comment",default:false,description:"Create a status commit using the comment body."},{kind:"string",name:"commit-emoji",valueHint:"<emoji>",description:"Override the status commit emoji (used with --commit-from-comment)."},{kind:"string",name:"commit-allow",valueHint:"<path-prefix>",repeatable:true,description:"Repeatable. Allowlist path prefixes to stage for the status commit (used with --commit-from-comment). Use minimal prefixes; '.' is rejected."},{kind:"boolean",name:"commit-auto-allow",default:false,description:"Deprecated. Disabled for safety; pass explicit --commit-allow prefixes.",deprecated:"disabled"},{kind:"boolean",name:"commit-allow-tasks",default:true,hidden:true,description:"Deprecated. Tasks are always allowed for status commits.",deprecated:"no-op"},{kind:"boolean",name:"commit-require-clean",default:false,description:"Require a clean working tree for the status commit (used with --commit-from-comment)."},{kind:"boolean",name:"confirm-status-commit",default:false,description:"Confirm status commit creation when status_commit_policy=confirm (used with --commit-from-comment)."},{kind:"boolean",name:"force",default:false,description:"Override readiness checks and status transition restrictions."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action approval checks when required."},{kind:"boolean",name:"quiet",default:false,description:"Suppress output."}],examples:[{cmd:'agentplane start 202602030608-F1Q8AB --author CODER --body "Start: implement spec-driven CLI"',why:"Start work on a task."},{cmd:'agentplane start 202602030608-F1Q8AB --author CODER --body "Start: implement spec-driven CLI" --commit-from-comment --commit-allow packages/agentplane/src',why:"Start work and create a status commit from the comment."}],validateRaw:e=>{let t=typeof e.opts.author=="string"?e.opts.author.trim():"",r=typeof e.opts.body=="string"?e.opts.body.trim():"",n=Q(e.opts["commit-allow"]);if(!t)throw y({spec:$i,message:"Invalid value for --author: empty."});if(!r)throw y({spec:$i,message:"Invalid value for --body: empty."});if(Lt(n).length>0)throw y({spec:$i,message:qt("--commit-allow")});if(e.opts["commit-auto-allow"]===true)throw y({spec:$i,message:"--commit-auto-allow is disabled; pass explicit --commit-allow <path-prefix>."});if(e.opts["commit-from-comment"]===true&&n.length===0)throw y({spec:$i,message:"--commit-from-comment requires --commit-allow <path-prefix> (tip: `agentplane guard suggest-allow --format args`)."})},parse:e=>({taskId:typeof e.args["task-id"]=="string"?e.args["task-id"]:"",author:e.opts.author,body:e.opts.body,commitFromComment:e.opts["commit-from-comment"]===true,commitEmoji:e.opts["commit-emoji"],commitAllow:Q(e.opts["commit-allow"]),commitAutoAllow:e.opts["commit-auto-allow"]===true,commitAllowTasks:e.opts["commit-allow-tasks"]!==false,commitRequireClean:e.opts["commit-require-clean"]===true,confirmStatusCommit:e.opts["confirm-status-commit"]===true,force:e.opts.force===true,yes:e.opts.yes===true,quiet:e.opts.quiet===true})};});var Mi,hB=u(()=>{H();Wd();Mi={id:["verify"],group:"Lifecycle",summary:"Record a verification outcome for a task; incident candidates stay task-local unless collected explicitly.",args:[{name:"task-id",required:true,valueHint:"<task-id>",description:"Existing task id."}],options:[{kind:"boolean",name:"ok",default:false,description:"Record an OK verification outcome."},{kind:"boolean",name:"rework",default:false,description:"Record a needs-rework verification outcome."},{kind:"string",name:"by",valueHint:"<id>",required:true,description:"Verifier id (e.g. REVIEWER)."},{kind:"string",name:"note",valueHint:"<text>",description:"Short note describing the verification outcome."},{kind:"string",name:"note-file",valueHint:"<path>",description:"Read the verification note from a file path (mutually exclusive with --note)."},{kind:"string",name:"details",valueHint:"<text>",description:"Optional free-form details (mutually exclusive with --file)."},{kind:"string",name:"file",valueHint:"<path>",description:"Read details from a file path (mutually exclusive with --details)."},{kind:"boolean",name:"collect-incidents",default:false,description:"After recording verification, collect promotable findings into incidents.md immediately."},{kind:"boolean",name:"quiet",default:false,description:"Suppress output."},...Ud],examples:[{cmd:'agentplane verify 202602030608-F1Q8AB --ok --by REVIEWER --note "Looks good" --quiet',why:"Record an OK verification outcome."},{cmd:"agentplane verify 202602030608-F1Q8AB --ok --by REVIEWER --note-file ./verify-note.txt",why:"Record an OK verification outcome using a file-backed note."},{cmd:'agentplane verify 202602030608-F1Q8AB --rework --by REVIEWER --note "Needs changes" --details "Missing tests"',why:"Record a needs-rework outcome with details."},{cmd:'agentplane verify 202602030608-F1Q8AB --ok --by REVIEWER --note "Looks good" --observation "Repeated recovery was manual." --impact "Operators needed a second command." --resolution "Append structured findings during verify."',why:"Record verification and append a promotable structured finding in one command."},{cmd:'agentplane verify 202602030608-F1Q8AB --ok --by REVIEWER --note "Looks good" --collect-incidents',why:"Record verification and collect promotable findings into incidents.md immediately."}],validateRaw:e=>{let t=e.opts.ok===true,r=e.opts.rework===true;if(t===r)throw y({spec:Mi,command:"verify",message:"Exactly one of --ok or --rework must be provided."});ys(e,Mi,{command:"verify"}),ws(e,Mi,"by"),bs(e,Mi,{command:"verify"}),So(e,Mi,{command:"verify"});},parse:e=>{let r=e.opts.ok===true?"ok":"needs_rework";return {taskId:typeof e.args["task-id"]=="string"?e.args["task-id"]:"",state:r,..._s(e)}}};});var kB={};S(kB,{commitSpec:()=>lr,makeRunCommitHandler:()=>tee});function tee(e){return async(t,r)=>await Dp({ctx:await e("commit"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,message:r.message??"",close:r.close,allow:r.allow,autoAllow:r.autoAllow,allowTasks:r.allowTasks,allowBase:r.allowBase,allowPolicy:r.allowPolicy,allowConfig:r.allowConfig,allowHooks:r.allowHooks,allowCI:r.allowCI,requireClean:r.requireClean,quiet:r.quiet,closeUnstageOthers:r.closeUnstageOthers,closeCheckOnly:r.closeCheckOnly})}var yB=u(()=>{b_();gx();});var wB={};S(wB,{makeRunStartHandler:()=>ree});function ree(e){return async(t,r)=>await Ga({ctx:await e("start"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,author:r.author,body:r.body,commitFromComment:r.commitFromComment,commitEmoji:r.commitEmoji,commitAllow:r.commitAllow,commitAutoAllow:r.commitAutoAllow,commitAllowTasks:r.commitAllowTasks,commitRequireClean:r.commitRequireClean,confirmStatusCommit:r.confirmStatusCommit,force:r.force,yes:r.yes,quiet:r.quiet})}var bB=u(()=>{_p();});var _B={};S(_B,{makeRunBlockHandler:()=>nee});function nee(e){return async(t,r)=>await Ip({ctx:await e("block"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,author:r.author,body:r.body,commitFromComment:r.commitFromComment,commitEmoji:r.commitEmoji,commitAllow:r.commitAllow,commitAutoAllow:r.commitAutoAllow,commitAllowTasks:r.commitAllowTasks,commitRequireClean:r.commitRequireClean,confirmStatusCommit:r.confirmStatusCommit,force:r.force,yes:r.yes,quiet:r.quiet})}var vB=u(()=>{y_();});var xB={};S(xB,{makeRunVerifyHandler:()=>oee});function oee(e){return async(t,r)=>await nN({ctx:await e("verify"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,state:r.state,by:r.by,note:r.note,noteFile:r.noteFile,details:r.details,file:r.file,collectIncidents:r.collectIncidents,observation:r.observation,impact:r.impact,resolution:r.resolution,localOnly:r.localOnly,repoFixable:r.repoFixable,incidentScope:r.incidentScope,incidentTags:r.incidentTags,incidentMatch:r.incidentMatch,incidentAdvice:r.incidentAdvice,incidentRule:r.incidentRule,quiet:r.quiet})}var RB=u(()=>{ld();});var CB={};S(CB,{makeRunFinishHandler:()=>iee});function iee(e){return async(t,r)=>{if(r.taskIds.length===0)throw y({spec:$e,command:"finish",message:"Missing required argument: task-id"});return await Fp({ctx:await e("finish"),cwd:t.cwd,rootOverride:t.rootOverride,taskIds:r.taskIds,author:r.author,body:r.body,result:r.result,risk:r.risk,breaking:r.breaking,commit:r.commit,force:r.force,yes:r.yes,commitFromComment:r.commitFromComment,commitEmoji:r.commitEmoji,commitAllow:r.commitAllow,commitAutoAllow:r.commitAutoAllow,commitAllowTasks:r.commitAllowTasks,commitRequireClean:r.commitRequireClean,statusCommit:r.statusCommit,statusCommitEmoji:r.statusCommitEmoji,statusCommitAllow:r.statusCommitAllow,statusCommitAutoAllow:r.statusCommitAutoAllow,statusCommitRequireClean:r.statusCommitRequireClean,confirmStatusCommit:r.confirmStatusCommit,closeCommit:r.closeCommit,noCloseCommit:r.noCloseCommit,closeUnstageOthers:r.closeUnstageOthers,baseBranchOverride:r.baseBranchOverride,observation:r.observation,impact:r.impact,resolution:r.resolution,localOnly:r.localOnly,repoFixable:r.repoFixable,incidentScope:r.incidentScope,incidentTags:r.incidentTags,incidentMatch:r.incidentMatch,incidentAdvice:r.incidentAdvice,incidentRule:r.incidentRule,quiet:r.quiet})}}var PB=u(()=>{H();T_();yx();});var TB={};S(TB,{guardCommitSpec:()=>Eo,makeRunGuardCommitHandler:()=>aee});function aee(e){return async(t,r)=>{let n=await e("guard commit");if(r.autoAllow)throw new m({exitCode:2,code:"E_USAGE",message:"--auto-allow is disabled; pass explicit --allow <path-prefix>."});return await B_({ctx:n,cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,message:r.message,allow:r.allow,allowBase:r.allowBase,allowTasks:r.allowTasks,allowPolicy:r.allowPolicy,allowConfig:r.allowConfig,allowHooks:r.allowHooks,allowCI:r.allowCI,requireClean:r.requireClean,quiet:r.quiet})}}var SB=u(()=>{v();_i();_x();});var EB,IB,AB,OB,DB,NB,jB,$B,MB,FB,BB,LB,qB,HB,GB,VB,UB,WB=u(()=>{Nn();EB=L(()=>Promise.resolve().then(()=>(Tx(),mB))),IB=L(()=>Promise.resolve().then(()=>(Px(),lB))),AB=L(()=>Promise.resolve().then(()=>(Sx(),uB))),OB=L(()=>Promise.resolve().then(()=>(vx(),cB))),DB=L(()=>Promise.resolve().then(()=>(bx(),sB))),NB=e=>Promise.resolve().then(()=>(yB(),kB)).then(t=>t.makeRunCommitHandler(e.getCtx)),jB=e=>Promise.resolve().then(()=>(bB(),wB)).then(t=>t.makeRunStartHandler(e.getCtx)),$B=e=>Promise.resolve().then(()=>(vB(),_B)).then(t=>t.makeRunBlockHandler(e.getCtx)),MB=e=>Promise.resolve().then(()=>(RB(),xB)).then(t=>t.makeRunVerifyHandler(e.getCtx)),FB=e=>Promise.resolve().then(()=>(PB(),CB)).then(t=>t.makeRunFinishHandler(e.getCtx)),BB=e=>Promise.resolve().then(()=>(Ox(),fB)).then(t=>t.makeRunReadyHandler(e.getCtx)),LB=e=>Promise.resolve().then(()=>(tg(),aB)).then(t=>t.makeRunDocsCliHandler(e.getHelpJsonForDocs)),qB=L(()=>Promise.resolve().then(()=>(Ix(),pB))),HB=L(()=>Promise.resolve().then(()=>(Zf(),hx))),GB=e=>Promise.resolve().then(()=>(Zf(),hx)).then(t=>t.makeRunCleanupMergedHandler(e.getCtx)),VB=L(()=>Promise.resolve().then(()=>(Rx(),dB))),UB=e=>Promise.resolve().then(()=>(SB(),TB)).then(t=>t.makeRunGuardCommitHandler(e.getCtx));});var zB,KB=u(()=>{rB();gx();Zf();tg();yx();bx();_x();vx();Rx();Px();Tx();Sx();Ix();Ox();gB();hB();Qc();Nn();WB();zB=[B(lr,{load:NB}),B($i,{load:jB}),B(Ni,{load:$B}),B(Mi,{load:MB,invocation:He(["verify"])}),B($e,{load:FB,invocation:He(["finish"])}),B(Ax,{load:BB}),B(eg,{load:LB,needs:"none"}),EB(og,"runHooks",{needs:"none"}),IB(Cx,"runHooksInstall",{}),qB(Ex,"runHooksUninstall"),AB(ig,"runHooksRun",{}),HB(Qf,"runCleanup",{needs:"none"}),B(Xf,{load:GB}),OB(ng,"runGuard",{needs:"none"}),DB(wx,"runGuardClean",{}),VB(xx,"runGuardSuggestAllow"),B(Eo,{load:UB})];});async function ag(e,t){let r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=r.taskBackend,o=r.backendId;if(t.flags.backendId&&o&&t.flags.backendId!==o)throw new m({exitCode:2,code:"E_USAGE",message:`Configured backend is "${o}", not "${t.flags.backendId}"`,context:{command:t.command,reason_code:t.mismatchReasonCode}});if(!n[t.operation])throw new m({exitCode:2,code:"E_USAGE",message:tt(t.unsupportedLabel)});return o!=="local"&&await Kr({action:t.networkAction,config:r.config,yes:t.flags.yes,reason:t.networkReason(o)}),{ctx:r,backend:n,backendId:o}}async function JB(e){try{let{backend:t}=await ag(e,{command:"backend sync",operation:"sync",unsupportedLabel:"sync()",mismatchReasonCode:"sync_backend_mismatch",networkAction:"backend_sync",networkReason:r=>`backend sync may access the network (backend: ${r})`,flags:e.flags});return await t.sync({direction:e.flags.direction,conflict:e.flags.conflict,quiet:e.flags.quiet,confirm:e.flags.yes}),0}catch(t){throw t instanceof m?t:E(t,{command:"backend sync",root:e.rootOverride??null})}}async function YB(e){try{let{backend:t}=await ag(e,{command:"sync",operation:"sync",unsupportedLabel:"sync()",mismatchReasonCode:"sync_backend_mismatch",networkAction:"backend_sync",networkReason:r=>`sync may access the network (backend: ${r})`,flags:e.flags});return await t.sync({direction:e.flags.direction,conflict:e.flags.conflict,quiet:e.flags.quiet,confirm:e.flags.yes}),0}catch(t){throw t instanceof m?t:E(t,{command:"sync",root:e.rootOverride??null})}}async function QB(e){try{let{backend:t}=await ag(e,{command:"backend migrate-canonical-state",operation:"migrateCanonicalState",unsupportedLabel:"migrateCanonicalState()",mismatchReasonCode:"sync_backend_mismatch",networkAction:"backend_migrate_canonical_state",networkReason:n=>`backend migrate-canonical-state may access the network (backend: ${n})`,flags:e.flags}),r=await t.migrateCanonicalState();if(e.flags.quiet||vs.success("backend migrate-canonical-state",void 0,`scanned=${r.scanned} migrated=${r.migrated.length} skipped-structured=${r.skippedStructured.length} skipped-no-doc=${r.skippedNoDoc.length} failed=${r.failed.length}`),r.failed.length>0){for(let n of r.failed.slice(0,20))vs.warn(`backend migrate-canonical-state failed for ${n.taskId}: ${n.reason}`);return 1}return 0}catch(t){throw t instanceof m?t:E(t,{command:"backend migrate-canonical-state",root:e.rootOverride??null})}}async function XB(e){try{let{backend:t}=await ag(e,{command:"backend inspect",operation:"inspectConfiguration",unsupportedLabel:"inspectConfiguration()",mismatchReasonCode:"inspect_backend_mismatch",networkAction:"backend_inspect",networkReason:o=>`backend inspect may access the network (backend: ${o})`,flags:e.flags}),r=await t.inspectConfiguration();if(e.flags.quiet)return 0;let n=r.canonicalState.configuredFieldId===null?r.canonicalState.visibleFieldId===null?"missing":`visible-unconfigured:${r.canonicalState.visibleFieldId}`:`configured:${r.canonicalState.configuredFieldId}`;vs.success("backend inspect",void 0,`visible-fields=${r.visibleCustomFields.length} canonical-state=${n} drift=${r.configuredFieldNameDrift.length}`),vs.line(`canonical_state configured=${r.canonicalState.configuredFieldId??"unset"} visible=${r.canonicalState.visibleFieldId??"absent"}`);for(let o of r.configuredFieldNameDrift)vs.line(`drift key=${o.key} configured-id=${o.configuredId} visible-name=${JSON.stringify(o.visibleName)}`);for(let o of r.visibleCustomFields)vs.line(`field id=${o.id} name=${JSON.stringify(o.name)} non-empty=${o.nonEmptyCount}`);return 0}catch(t){throw t instanceof m?t:E(t,{command:"backend inspect",root:e.rootOverride??null})}}var vs,Dx=u(()=>{I();D();v();N();ls();vs=A();});var ZB={};S(ZB,{makeRunSyncHandler:()=>see,syncSpec:()=>Nx});function see(e){return async(t,r)=>{let n=await e("sync");return await YB({ctx:n,cwd:t.cwd,rootOverride:t.rootOverride,flags:r})}}var Nx,jx=u(()=>{Xc();Dx();Nx={id:["sync"],group:"Backend",summary:"Sync the configured backend (alias).",description:"Alias for backend sync using the configured backend id. Optionally pass an explicit backend id.",args:[{name:"id",required:false,valueHint:"<id>",description:"Optional backend id (must match configured backend id)."}],options:[{kind:"string",name:"direction",valueHint:"<push|pull>",choices:["push","pull"],default:"push",description:"Sync direction (default: push)."},{kind:"string",name:"conflict",valueHint:"<diff|prefer-local|prefer-remote|fail>",choices:["diff","prefer-local","prefer-remote","fail"],default:"diff",description:"Conflict handling policy (default: diff)."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve network access."},{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:re.sync.pullConfigured,why:"Pull from backend (configured backend id)."},{cmd:re.sync.pushRedmineExplicitWithYes,why:"Push to redmine backend."}],parse:e=>({backendId:e.args.id?String(e.args.id):null,direction:e.opts.direction??"push",conflict:e.opts.conflict??"diff",yes:e.opts.yes===true,quiet:e.opts.quiet===true})};});var zd={};S(zd,{backendInspectSpec:()=>Fx,backendMigrateCanonicalStateSpec:()=>Mx,backendSpec:()=>sg,backendSyncSpec:()=>$x,makeRunBackendHandler:()=>dee,makeRunBackendInspectHandler:()=>mee,makeRunBackendMigrateCanonicalStateHandler:()=>uee,makeRunBackendSyncHandler:()=>lee});async function cee(e,t){oe({spec:sg,cmd:t.cmd,subcommands:await ne(["backend"]),command:"backend",contextCommand:"backend"});}function dee(e){return cee}function lee(e){return async(t,r)=>{let n=await e("backend sync");return await JB({ctx:n,cwd:t.cwd,rootOverride:t.rootOverride,flags:r})}}function mee(e){return async(t,r)=>{let n=await e("backend inspect");return await XB({ctx:n,cwd:t.cwd,rootOverride:t.rootOverride,flags:r})}}function uee(e){return async(t,r)=>{let n=await e("backend migrate-canonical-state");return await QB({ctx:n,cwd:t.cwd,rootOverride:t.rootOverride,flags:r})}}var sg,$x,Mx,Fx,xs=u(()=>{Xc();Oe();Dx();sg={id:["backend"],group:"Backend",summary:"Backend-related operations.",description:"This is a command group. Use a subcommand such as `agentplane backend sync ...`, `agentplane backend inspect ...`, or `agentplane backend migrate-canonical-state ...`.",args:[{name:"cmd",required:false,variadic:true,valueHint:"<cmd>"}],examples:[{cmd:re.backendSync.pullLocal,why:"Sync the backend."}],parse:e=>ke(e)},$x={id:["backend","sync"],group:"Backend",summary:"Sync the configured backend (push or pull).",args:[{name:"id",required:true,valueHint:"<id>",description:"Configured backend id."}],options:[{kind:"string",name:"direction",valueHint:"<push|pull>",choices:["push","pull"],default:"push",description:"Sync direction (default: push)."},{kind:"string",name:"conflict",valueHint:"<diff|prefer-local|prefer-remote|fail>",choices:["diff","prefer-local","prefer-remote","fail"],default:"diff",description:"Conflict handling policy (default: diff)."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve network access."},{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:re.backendSync.pullLocal,why:"Pull from backend."},{cmd:re.backendSync.pushRedmineWithYes,why:"Push to a networked backend with explicit approval."}],parse:e=>({backendId:String(e.args.id),direction:e.opts.direction??"push",conflict:e.opts.conflict??"diff",yes:e.opts.yes===true,quiet:e.opts.quiet===true})},Mx={id:["backend","migrate-canonical-state"],group:"Backend",summary:"Backfill canonical_state for issues in the configured backend.",args:[{name:"id",required:true,valueHint:"<id>",description:"Configured backend id."}],options:[{kind:"boolean",name:"yes",default:false,description:"Auto-approve network access."},{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:"agentplane backend migrate-canonical-state redmine --yes",why:"Backfill structured canonical_state into legacy Redmine issues."}],parse:e=>({backendId:String(e.args.id),yes:e.opts.yes===true,quiet:e.opts.quiet===true})},Fx={id:["backend","inspect"],group:"Backend",summary:"Inspect visible backend readiness facts without mutating remote state.",args:[{name:"id",required:true,valueHint:"<id>",description:"Configured backend id."}],options:[{kind:"boolean",name:"yes",default:false,description:"Auto-approve network access."},{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:"agentplane backend inspect redmine --yes",why:"Inspect visible Redmine custom fields and canonical_state readiness without remote writes."}],parse:e=>({backendId:String(e.args.id),yes:e.opts.yes===true,quiet:e.opts.quiet===true})};});var dg={};S(dg,{branchBaseClearSpec:()=>Lx,branchBaseExplainSpec:()=>qx,branchBaseGetSpec:()=>Bx,branchBaseSetSpec:()=>Kd,branchBaseSpec:()=>cg,runBranchBase:()=>pee,runBranchBaseClear:()=>gee,runBranchBaseExplain:()=>hee,runBranchBaseGet:()=>fee,runBranchBaseSet:()=>kee});var cg,Bx,Lx,qx,Kd,pee,fee,gee,hee,kee,Jd=u(()=>{Oe();H();vo();cg={id:["branch","base"],group:"Branch",summary:"Manage the pinned base branch used in branch_pr workflow.",synopsis:["agentplane branch base <get|set|clear|explain> [args] [options]"],args:[{name:"cmd",required:false,variadic:true,valueHint:"<cmd>"}],examples:[{cmd:"agentplane branch base get",why:"Print the pinned base branch."},{cmd:"agentplane branch base set --current",why:"Pin the current branch as base."},{cmd:"agentplane branch base clear",why:"Clear the pinned base branch."},{cmd:"agentplane branch base explain",why:"Show current/pinned/effective base details."}],parse:e=>ke(e)},Bx={id:["branch","base","get"],group:"Branch",summary:"Print the pinned base branch.",parse:()=>({})},Lx={id:["branch","base","clear"],group:"Branch",summary:"Clear the pinned base branch.",parse:()=>({})},qx={id:["branch","base","explain"],group:"Branch",summary:"Explain current, pinned, and effective base branch resolution.",parse:()=>({})},Kd={id:["branch","base","set"],group:"Branch",summary:"Pin a base branch by name, or pin the current branch.",args:[{name:"name",required:false,valueHint:"<name>",description:"Branch name to pin as base (conflicts with --current)."}],options:[{kind:"boolean",name:"current",description:"Pin the current branch as base (conflicts with <name>).",default:false}],examples:[{cmd:"agentplane branch base set main",why:"Pin main as the base branch."},{cmd:"agentplane branch base set --current",why:"Pin the current branch as base."}],validateRaw:e=>{let t=e.args.name?String(e.args.name).trim():"",r=e.opts.current===true;if(r&&t)throw y({spec:Kd,message:"Invalid usage: <name> conflicts with --current."});if(!r&&!t)throw y({spec:Kd,message:"Missing required argument: <name> (or pass --current)."})},parse:e=>({value:e.args.name?String(e.args.name).trim():null,useCurrent:e.opts.current===true})},pee=async(e,t)=>{oe({spec:cg,cmd:t.cmd,subcommands:await ne(["branch","base"]),command:"branch base",contextCommand:"branch base"});},fee=async e=>await O_({cwd:e.cwd,rootOverride:e.rootOverride}),gee=async e=>await N_({cwd:e.cwd,rootOverride:e.rootOverride}),hee=async e=>await j_({cwd:e.cwd,rootOverride:e.rootOverride}),kee=async(e,t)=>await D_({cwd:e.cwd,rootOverride:e.rootOverride,value:t.value??void 0,useCurrent:t.useCurrent});});var e0={};S(e0,{branchRemoveSpec:()=>lg,runBranchRemove:()=>yee});var lg,yee,Hx=u(()=>{H();vo();lg={id:["branch","remove"],group:"Branch",summary:"Remove a task branch and/or its worktree.",options:[{kind:"string",name:"branch",valueHint:"<name>",description:"Branch name to delete."},{kind:"string",name:"worktree",valueHint:"<path>",description:"Worktree path to remove (relative to repo root or absolute)."},{kind:"boolean",name:"force",default:false,description:"Force deletion."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action approval checks when required."},{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:"agentplane branch remove --branch task/202602030608-F1Q8AB/cli",why:"Delete a branch."},{cmd:"agentplane branch remove --worktree .agentplane/worktrees/202602030608-F1Q8AB-cli",why:"Remove a worktree."},{cmd:"agentplane branch remove --branch task/202602030608-F1Q8AB/cli --worktree .agentplane/worktrees/202602030608-F1Q8AB-cli --force",why:"Force-remove both worktree and branch."}],validateRaw:e=>{let t=typeof e.opts.branch=="string"?e.opts.branch.trim():"",r=typeof e.opts.worktree=="string"?e.opts.worktree.trim():"";if(!t&&!r)throw y({spec:lg,message:"Missing required option: provide --branch and/or --worktree."})},parse:e=>({branch:typeof e.opts.branch=="string"?e.opts.branch:null,worktree:typeof e.opts.worktree=="string"?e.opts.worktree:null,force:e.opts.force===true,yes:e.opts.yes===true,quiet:e.opts.quiet===true})},yee=async(e,t)=>await M_({cwd:e.cwd,rootOverride:e.rootOverride,branch:t.branch??void 0,worktree:t.worktree??void 0,force:t.force,yes:t.yes,quiet:t.quiet});});var t0={};S(t0,{branchStatusSpec:()=>Gx,runBranchStatus:()=>wee});var Gx,wee,Vx=u(()=>{vo();Gx={id:["branch","status"],group:"Branch",summary:"Show ahead/behind status for a branch relative to a base branch.",options:[{kind:"string",name:"branch",valueHint:"<name>",description:"Branch name (default: current branch)."},{kind:"string",name:"base",valueHint:"<name>",description:"Base branch name (default: auto-resolved base)."}],examples:[{cmd:"agentplane branch status",why:"Check current branch against effective base."},{cmd:"agentplane branch status --base main",why:"Check against an explicit base."}],parse:e=>({branch:typeof e.opts.branch=="string"?e.opts.branch:null,base:typeof e.opts.base=="string"?e.opts.base:null})},wee=async(e,t)=>await F_({cwd:e.cwd,rootOverride:e.rootOverride,branch:t.branch??void 0,base:t.base??void 0});});var r0={};S(r0,{makeRunWorkStartHandler:()=>bee,workStartSpec:()=>Yd});function bee(e){return async(t,r)=>{let n=await e("work start"),o=n.config.workflow_mode;if(o==="branch_pr"&&!r.worktree)throw y({spec:Yd,message:"--worktree is required when workflow_mode=branch_pr",command:"work start"});if(o!=="branch_pr"&&r.worktree)throw y({spec:Yd,message:`--worktree is only supported when workflow_mode=branch_pr (current: ${o})`,command:"work start"});return await W_({ctx:n,cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,agent:r.agent,slug:r.slug,worktree:r.worktree})}}var Yd,Ux=u(()=>{H();vo();Yd={id:["work","start"],group:"Work",summary:"Prepare the workspace for a task (direct: single-stream on current branch; branch_pr: task branch/worktree).",args:[{name:"task-id",required:true,valueHint:"<task-id>",description:"Existing task id."}],options:[{kind:"string",name:"agent",valueHint:"<ID>",required:true,pattern:/^[A-Z0-9_]+$/,patternHint:"A\u2013Z, 0\u20139, underscore",description:"Agent id (uppercase letters, numbers, underscore)."},{kind:"string",name:"slug",valueHint:"<slug>",required:true,pattern:/^[a-z0-9]+(?:-[a-z0-9]+)*$/,patternHint:"lowercase kebab-case",description:"Branch slug (lowercase kebab-case)."},{kind:"boolean",name:"worktree",default:false,description:"Use git worktree for the task branch. Required when workflow_mode=branch_pr."}],examples:[{cmd:"agentplane work start 202602030608-F1Q8AB --agent CODER --slug cli",why:"Start work (direct mode records the active task; branch_pr uses a dedicated task branch/worktree)."}],notes:["When workflow_mode=direct, agentplane does not create task branches; it records a single active task for the workspace.","When workflow_mode=branch_pr, --worktree is required and the command must be run on the base branch.","After branch_pr work starts, run owner-scoped task commands from the created worktree so task README/PR artifacts stay attached to one checkout."],parse:e=>({taskId:e.args["task-id"],agent:e.opts.agent,slug:e.opts.slug,worktree:!!(e.opts.worktree??false)})};});var mg,n0=u(()=>{H();mg={id:["integrate"],group:"PR",summary:"Integrate a task branch into the base branch (branch_pr workflow).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"branch",valueHint:"<name>",description:"Branch name override."},{kind:"string",name:"base",valueHint:"<name>",description:"Base branch override."},{kind:"string",name:"merge-strategy",valueHint:"<squash|merge|rebase>",choices:["squash","merge","rebase"],default:"squash",description:"Merge strategy (default: squash)."},{kind:"boolean",name:"run-verify",default:false,description:"Run verify commands."},{kind:"boolean",name:"dry-run",default:false,description:"Do not modify git state."},{kind:"boolean",name:"quiet",default:false,description:"Reduce output noise."}],examples:[{cmd:"agentplane integrate 202602030608-F1Q8AB --run-verify",why:"Integrate with verify."}],validateRaw:e=>{let t=typeof e.opts.base=="string"?e.opts.base.trim():"";if(e.opts.base!==void 0&&!t)throw y({spec:mg,message:"Invalid value for --base: empty."});let r=typeof e.opts.branch=="string"?e.opts.branch.trim():"";if(e.opts.branch!==void 0&&!r)throw y({spec:mg,message:"Invalid value for --branch: empty."})},parse:e=>({taskId:String(e.args["task-id"]),branch:typeof e.opts.branch=="string"?e.opts.branch:null,base:typeof e.opts.base=="string"?e.opts.base:null,mergeStrategy:e.opts["merge-strategy"]??"squash",runVerify:e.opts["run-verify"]===true,dryRun:e.opts["dry-run"]===true,quiet:e.opts.quiet===true})};});var Cs,Qd,ug,pg,Rs,Fi,fg,gg=u(()=>{Oe();H();Cs={id:["pr"],group:"PR",summary:"Manage local PR review and GitHub publication artifacts for a task (branch_pr workflow).",synopsis:["agentplane pr <open|update|check|note|close|close-superseded> <task-id|pr-number> [options]"],args:[{name:"cmd",required:false,variadic:true,valueHint:"<cmd>"}],examples:[{cmd:"agentplane pr open 202602030608-F1Q8AB --author CODER",why:"Create PR artifacts."},{cmd:"agentplane pr update 202602030608-F1Q8AB",why:"Refresh review.md plus github-title/body projections."},{cmd:"agentplane pr check 202602030608-F1Q8AB",why:"Validate PR artifacts."},{cmd:'agentplane pr note 202602030608-F1Q8AB --author REVIEWER --body "Looks good"',why:"Append a handoff note."},{cmd:'agentplane pr close 123 --comment "Superseded by #456" --delete-remote-branch',why:"Close a stale GitHub PR through REST and optionally delete its remote head branch."},{cmd:"agentplane pr close-superseded 202604072308-A1XE27 --delete-remote-branch",why:"Close a superseded task PR from task artifacts after protected-main closure."}],parse:e=>ke(e)},Qd={id:["pr","open"],group:"PR",summary:"Create PR artifacts for a task and, unless --sync-only is set, publish/link the remote GitHub PR.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"author",valueHint:"<id>",required:true,description:"Author id (e.g. CODER)."},{kind:"string",name:"branch",valueHint:"<name>",description:"Branch name (default: current branch)."},{kind:"boolean",name:"sync-only",default:false,description:"Only write local PR artifacts; do not create a remote GitHub PR."}],examples:[{cmd:"agentplane pr open 202602030608-F1Q8AB --author CODER",why:"Sync local artifacts, publish the task branch to origin if needed, and create/link the GitHub PR."}],validateRaw:e=>{if(!(typeof e.opts.author=="string"?e.opts.author.trim():""))throw y({spec:Qd,message:"Invalid value for --author: empty."})},parse:e=>({taskId:String(e.args["task-id"]),author:String(e.opts.author),branch:typeof e.opts.branch=="string"?e.opts.branch:null,syncOnly:!!e.opts["sync-only"]})},ug={id:["pr","update"],group:"PR",summary:"Update PR artifacts (review packet, diffstat, and GitHub projections).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],examples:[{cmd:"agentplane pr update 202602030608-F1Q8AB",why:"Update artifacts."}],parse:e=>({taskId:String(e.args["task-id"])})},pg={id:["pr","check"],group:"PR",summary:"Check that PR artifacts are present and valid.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],examples:[{cmd:"agentplane pr check 202602030608-F1Q8AB",why:"Check artifacts."}],parse:e=>({taskId:String(e.args["task-id"])})},Rs={id:["pr","note"],group:"PR",summary:"Append a handoff note into PR review.md.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"author",valueHint:"<id>",required:true,description:"Author id (e.g. REVIEWER)."},{kind:"string",name:"body",valueHint:"<text>",required:true,description:"Note body text."}],examples:[{cmd:'agentplane pr note 202602030608-F1Q8AB --author REVIEWER --body "LGTM"',why:"Add note."}],validateRaw:e=>{let t=typeof e.opts.author=="string"?e.opts.author.trim():"",r=typeof e.opts.body=="string"?e.opts.body.trim():"";if(!t)throw y({spec:Rs,message:"Invalid value for --author: empty."});if(!r)throw y({spec:Rs,message:"Invalid value for --body: empty."})},parse:e=>({taskId:String(e.args["task-id"]),author:String(e.opts.author),body:String(e.opts.body)})},Fi={id:["pr","close"],group:"PR",summary:"Close a GitHub PR through REST with optional remote head-branch deletion.",args:[{name:"pr-number",required:true,valueHint:"<pr-number>"}],options:[{kind:"string",name:"repo",valueHint:"<owner/name>",description:"Optional. GitHub owner/repo override (defaults to origin remote)."},{kind:"string",name:"comment",valueHint:"<text>",description:"Optional. Add a close comment before closing the PR."},{kind:"boolean",name:"delete-remote-branch",default:false,description:"Delete the remote head branch after a successful close when it belongs to the target repo."}],examples:[{cmd:'agentplane pr close 123 --comment "Superseded by #456" --delete-remote-branch',why:"Close a stale PR and remove its remote head branch when it belongs to the same repo."}],validateRaw:e=>{let t=Number.parseInt(String(e.args["pr-number"]??""),10);if(!Number.isInteger(t)||t<=0)throw y({spec:Fi,message:"Invalid value for <pr-number>."});if(typeof e.opts.repo=="string"&&e.opts.repo.trim()==="")throw y({spec:Fi,message:"Invalid value for --repo: empty."});if(typeof e.opts.comment=="string"&&e.opts.comment.trim()==="")throw y({spec:Fi,message:"Invalid value for --comment: empty."})},parse:e=>({prNumber:Number.parseInt(String(e.args["pr-number"]),10),repo:typeof e.opts.repo=="string"?e.opts.repo:void 0,comment:typeof e.opts.comment=="string"?e.opts.comment:void 0,deleteRemoteBranch:e.opts["delete-remote-branch"]===true})},fg={id:["pr","close-superseded"],group:"PR",summary:"Close a superseded task PR using task artifacts.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"boolean",name:"delete-remote-branch",default:false,description:"Delete the remote head branch after a successful close when it belongs to the task repo."}],examples:[{cmd:"agentplane pr close-superseded 202604072308-A1XE27 --delete-remote-branch",why:"Repair a stale task PR after the task has already been merged to main."}],parse:e=>({taskId:String(e.args["task-id"]),deleteRemoteBranch:e.opts["delete-remote-branch"]===true})};});var o0={};S(o0,{recipesAddSpec:()=>Wx,runRecipesAdd:()=>_ee});var Wx,_ee,zx=u(()=>{pf();Wx={id:["recipes","add"],group:"Recipes",summary:"Vendor a cached recipe into the current project.",args:[{name:"recipe",required:true,valueHint:"<id|id@version>"}],options:[{kind:"string",name:"mode",valueHint:"<copy|link>",choices:["copy","link"],description:"Materialization mode for the project-local package."}],examples:[{cmd:"agentplane recipes add tdd",why:"Vendor the latest cached recipe into the project."},{cmd:"agentplane recipes add tdd@1.2.0 --mode link",why:"Link a cached recipe into the project for local recipe development."}],parse:e=>({recipeRef:String(e.args.recipe??"").trim(),mode:e.opts.mode==="copy"||e.opts.mode==="link"?e.opts.mode:void 0})},_ee=(e,t)=>ns({cwd:e.cwd,rootOverride:e.rootOverride,recipeRef:t.recipeRef,mode:t.mode});});async function hg(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),[r,n]=await Promise.all([Pd(t),sr(t)]),o=r.map(i=>n.recipes.find(a=>a.id===i)).filter(Boolean);if(o.length===0)return Kx.line(hc("active overlays")),0;if(e.full)return Kx.json({schema_version:1,active:o.map(i=>({id:i.id,version:i.version,kind:i.manifest.kind,summary:i.manifest.summary}))}),0;for(let i of o)Kx.line(`${i.id}@${i.version} [${i.manifest.kind}]`);return 0}catch(t){throw t instanceof m?t:O(t,{command:"recipes active",root:e.rootOverride??null})}}var Kx,Jx=u(()=>{D();I();v();vr();In();Kx=A();});var i0={};S(i0,{recipesActiveSpec:()=>Yx,runRecipesActive:()=>xee});var Yx,xee,Qx=u(()=>{Jx();Yx={id:["recipes","active"],group:"Recipes",summary:"List active project overlays.",options:[{kind:"boolean",name:"full",default:false,description:"Print full JSON payload."}],examples:[{cmd:"agentplane recipes active",why:"Show overlays active for the project."}],parse:e=>({full:e.opts.full===true})},xee=(e,t)=>hg({cwd:e.cwd,rootOverride:e.rootOverride,full:t.full});});async function Ree(e){let t=[],r=await readdir(e,{withFileTypes:true});for(let n of r){if(!n.isDirectory())continue;let o=n.name,i=Ye.join(e,o),a=await readdir(i,{withFileTypes:true});for(let s of a){if(!s.isDirectory())continue;let c=s.name;t.push({id:o,version:c,path:Ye.join(i,c)});}}return t}async function kg(e){let t=e.flags;try{let r=bd();if(!await P(r))return process.stdout.write(`${K(`recipe cache directory not found: ${r}`)}
564
+ `),0;let n=await Ree(r);if(n.length===0)return process.stdout.write(`${K("recipe cache is empty")}
565
+ `),0;if(t.all){if(t.dryRun){for(let c of n)process.stdout.write(`${K(`dry-run: would remove ${c.id}@${c.version}`)}
566
+ `);return process.stdout.write(`${K(`dry-run: would remove ${n.length} cached recipes`)}
567
+ `),0}return await ce({action:"dangerous_fs",config:defaultConfig(),yes:!1,reason:`recipes cache prune --all (${n.length} cached recipes)`}),await rm$1(r,{recursive:!0,force:!0}),await mf(Ge(),{schema_version:1,updated_at:"",recipes:[]}),process.stdout.write(`${z("removed cached recipes",void 0,`count=${n.length}`)}
568
+ `),0}let o=await it(Ge()),i=new Set(o.recipes.map(c=>`${c.id}@${c.version}`)),a=n.filter(c=>!i.has(`${c.id}@${c.version}`));if(a.length===0)return process.stdout.write(`${K("recipe cache already clean (no uninstalled entries)")}
569
+ `),0;if(t.dryRun){for(let c of a)process.stdout.write(`${K(`dry-run: would remove ${c.id}@${c.version}`)}
570
+ `);return process.stdout.write(`${K(`dry-run: would remove ${a.length} cached recipes`)}
571
+ `),0}await ce({action:"dangerous_fs",config:defaultConfig(),yes:!1,reason:`recipes cache prune (${a.length} cached recipes)`});let s=new Set;for(let c of a)s.add(Ye.dirname(c.path)),await rm$1(c.path,{recursive:!0,force:!0});for(let c of s)(await readdir(c)).length===0&&await rm$1(c,{recursive:!0,force:!0});return process.stdout.write(`${z("removed cached recipes",void 0,`count=${a.length}`)}
572
+ `),0}catch(r){throw r instanceof m?r:O(r,{command:"recipes cache prune",root:e.rootOverride??null})}}var tR=u(()=>{D();ee();I();v();Be();Wr();Ve();});var s0={};S(s0,{recipesCachePruneSpec:()=>rR,runRecipesCachePrune:()=>Cee});var rR,Cee,nR=u(()=>{tR();rR={id:["recipes","cache","prune"],group:"Recipes",summary:"Prune global recipe cache entries.",options:[{kind:"boolean",name:"dry-run",default:false,description:"Report removals without modifying files."},{kind:"boolean",name:"all",default:false,description:"Remove all cached recipes (also clears installed recipes file)."}],examples:[{cmd:"agentplane recipes cache prune --dry-run",why:"Preview removals."},{cmd:"agentplane recipes cache prune",why:"Prune unused cached recipes."},{cmd:"agentplane recipes cache prune --all",why:"Remove everything."}],parse:e=>({dryRun:e.opts["dry-run"]===true,all:e.opts.all===true})},Cee=(e,t)=>kg({cwd:e.cwd,rootOverride:e.rootOverride,flags:t});});var c0={};S(c0,{recipesCacheSpec:()=>yg,runRecipesCache:()=>Pee});var yg,Pee,oR=u(()=>{Oe();yg={id:["recipes","cache"],group:"Recipes",summary:"Manage recipes cache.",synopsis:["agentplane recipes cache <subcommand> [options]"],args:[{name:"subcommand",required:false,variadic:true,valueHint:"<subcommand>"}],parse:e=>ke(e,"subcommand")},Pee=async(e,t)=>{oe({spec:yg,cmd:t.cmd,subcommands:await ne(["recipes","cache"]),command:"recipes cache",missingMessage:"Missing recipes cache subcommand.",unknownMessage:r=>`Unknown recipes cache subcommand: ${r}.`});};});async function wg(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await loadConfig(t.agentplaneDir),n=await Ti({project:t,recipeId:e.id});if(n.entry.materialization!=="link")throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Recipe ${n.entry.id} is already materialized as copy.`});if(!n.cache_present||!n.current_source_sha256)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Cached source is missing for ${n.entry.id}@${n.entry.version}. Re-install it before detaching.`});let o=n.current_source_sha256;if(!o)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Cached source hash is missing for ${n.entry.id}@${n.entry.version}`});if(n.state==="modified")throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Recipe ${n.entry.id} is no longer a clean project link. Restore it with agentplane recipes update ${n.entry.id} --force before detaching.`});let i=await it(Ge()),a=await ot(t),s=i.recipes.find(d=>d.id===n.entry.id&&d.version===n.entry.version);if(!s)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Recipe not found in global cache: ${n.entry.id}@${n.entry.version}`});await ce({action:"dangerous_fs",config:r.config,yes:!1,reason:`recipes detach ${n.entry.id}@${n.entry.version}`});let c=Vr(t,n.entry.id);return await Ro({targetDir:c,mode:"replace",materialize:async d=>{await cp$1(n.source_dir,d,{recursive:!0});},commit:async()=>{let d=await zr(c),l=es(a,{id:n.entry.id,version:n.entry.version,path:n.entry.project_path,active:a.recipes.find(p=>p.id===n.entry.id)?.active===!0,materialization:"copy",source_ref:n.entry.source_ref,source_sha256:o,vendored_sha256:d,installed_at:n.entry.installed_at,tags:normalizeRecipeTags(s.tags??s.manifest.tags??[])});await cr({project:t,registry:l});}}),process.stdout.write(`Detached recipe ${n.entry.id}@${n.entry.version} into a project-local copy.
573
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"recipes detach",root:e.rootOverride??null})}}var iR=u(()=>{D();G();v();Be();Wr();wd();vr();ts();Ur();Ve();});var d0={};S(d0,{recipesDetachSpec:()=>aR,runRecipesDetach:()=>Aee});var aR,Aee,sR=u(()=>{iR();aR={id:["recipes","detach"],group:"Recipes",summary:"Convert a linked vendored recipe into a project-local copy.",args:[{name:"id",required:true,valueHint:"<id>"}],examples:[{cmd:"agentplane recipes detach tdd",why:"Freeze a linked recipe into a portable project copy before sharing the repo."}],parse:e=>({id:String(e.args.id??"").trim()})},Aee=(e,t)=>wg({cwd:e.cwd,rootOverride:e.rootOverride,id:t.id});});async function bg(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await ot(t),n=xd(r,e.id,!1),{bundle:o}=await cr({project:t,registry:n});return process.stdout.write(`Disabled overlay ${e.id} (${o.active.length} active)
574
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"recipes disable",root:e.rootOverride??null})}}var cR=u(()=>{D();v();vr();Ur();});var l0={};S(l0,{recipesDisableSpec:()=>dR,runRecipesDisable:()=>Dee});var dR,Dee,lR=u(()=>{cR();dR={id:["recipes","disable"],group:"Recipes",summary:"Disable an active project overlay for the current project.",args:[{name:"id",required:true,valueHint:"<recipe-id>"}],examples:[{cmd:"agentplane recipes disable tdd",why:"Deactivate an overlay."}],parse:e=>({id:String(e.args.id??"").trim()})},Dee=(e,t)=>bg({cwd:e.cwd,rootOverride:e.rootOverride,id:t.id});});function mt(e,t){let r=JSON.stringify(e,null,2);return r?r.split(`
575
+ `).map(n=>`${t}${n}`).join(`
576
+ `):""}var mR=u(()=>{});async function _g(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),[r,n]=await Promise.all([sr(t),Pd(t)]),o=r.recipes.find(f=>f.id===e.id);if(!o)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Recipe not installed: ${e.id}`});let i=await Ti({project:t,recipeId:e.id}),a=o.manifest,s=o.project_path?Ye.join(br(t),o.project_path):En(t,o.id),c=await collectRecipeScenarioDetails(s,a);fe.lines([`Recipe: ${a.id}@${a.version}`,`Kind: ${a.kind}`,`Schema: ${a.schema_version}`,`Active: ${n.includes(o.id)?"yes":"no"}`,`Materialization: ${o.materialization}`,`State: ${i.state}`,`Source ref: ${o.source_ref}`,`Cache source: ${i.cache_present?"present":"missing"}`,`Source sha256: ${o.source_sha256}`,`Vendored sha256: ${i.current_vendored_sha256}`,`Name: ${a.name}`,`Summary: ${a.summary}`,`Description: ${a.description}`]),a.tags&&a.tags.length>0&&fe.line(`Tags: ${a.tags.join(", ")}`),a.compatibility&&mt(a.compatibility," ")&&fe.jsonSection("Compatibility",a.compatibility);let d=a.skills??[],l=a.agents??[],p=a.tools??[];if(d.length>0){fe.line("Skills:");for(let f of d)fe.line(` - ${f.id} - ${f.summary}`);}if(l.length>0){fe.line("Agents:");for(let f of l)fe.line(` - ${f.display_name} (${f.id}) - ${f.summary} [role=${f.role}]`);}if(p.length>0){fe.line("Tools:");for(let f of p)fe.line(` - ${f.id} - ${f.summary}`);}let g=a.prompts??[],h=a.validators??[];if(g.length>0){fe.line("Overlay prompts:");for(let f of g)fe.line(` - ${f.id} [surface=${f.surface}, strength=${f.strength??"default"}, file=${f.file}]`);}if(h.length>0){fe.line("Overlay validators:");for(let f of h)fe.line(` - ${f.id} [kind=${f.kind}, phase=${f.phase}]`);}if(a.templates&&Object.keys(a.templates).length>0&&mt(a.templates," ")&&fe.jsonSection("Templates",a.templates),c.length>0){fe.line("Scenarios:");for(let f of c){let b=f.name?`${f.name} (${f.id})`:f.id,w=f.summary?` - ${f.summary}`:"";if(fe.line(` - ${b}${w}`),f.description&&fe.line(` Description: ${f.description}`),f.goal&&fe.line(` Goal: ${f.goal}`),f.use_when&&f.use_when.length>0&&mt(f.use_when," ")&&fe.jsonSection(" Use when",f.use_when,{indent:" "}),f.avoid_when&&f.avoid_when.length>0&&mt(f.avoid_when," ")&&fe.jsonSection(" Avoid when",f.avoid_when,{indent:" "}),f.required_inputs&&f.required_inputs.length>0&&mt(f.required_inputs," ")&&fe.jsonSection(" Required inputs",f.required_inputs,{indent:" "}),f.inputs!==void 0&&mt(f.inputs," ")&&fe.jsonSection(" Inputs",f.inputs,{indent:" "}),f.outputs!==void 0&&mt(f.outputs," ")&&fe.jsonSection(" Outputs",f.outputs,{indent:" "}),f.permissions&&f.permissions.length>0&&mt(f.permissions," ")&&fe.jsonSection(" Permissions",f.permissions,{indent:" "}),f.artifacts&&f.artifacts.length>0&&mt(f.artifacts," ")&&fe.jsonSection(" Artifacts",f.artifacts,{indent:" "}),f.agents_involved&&f.agents_involved.length>0&&mt(f.agents_involved," ")&&fe.jsonSection(" Agents involved",f.agents_involved,{indent:" "}),f.skills_used&&f.skills_used.length>0&&mt(f.skills_used," ")&&fe.jsonSection(" Skills used",f.skills_used,{indent:" "}),f.tools_used&&f.tools_used.length>0&&mt(f.tools_used," ")&&fe.jsonSection(" Tools used",f.tools_used,{indent:" "}),f.run_profile&&mt(f.run_profile," ")&&fe.jsonSection(" Run profile",f.run_profile,{indent:" "}),f.steps&&f.steps.length>0){fe.line(" Steps:");let _=1;for(let x of f.steps)fe.line(` ${_}. ${JSON.stringify(x)}`),_+=1;continue}f.source!=="definition"&&fe.line(" Details: Scenario definition not found in recipe.");}}return 0}catch(t){throw t instanceof m?t:O(t,{command:"recipes explain",root:e.rootOverride??null})}}var fe,uR=u(()=>{D();I();G();v();mR();vr();In();ts();Ve();fe=A();});var m0={};S(m0,{recipesExplainSpec:()=>pR,runRecipesExplain:()=>Mee});var pR,Mee,fR=u(()=>{uR();pR={id:["recipes","explain"],group:"Recipes",summary:"Show detailed info for a vendored recipe.",args:[{name:"id",required:true,valueHint:"<id>"}],examples:[{cmd:"agentplane recipes explain viewer",why:"Show detailed project-local recipe info."}],parse:e=>({id:String(e.args.id??"")})},Mee=(e,t)=>_g({cwd:e.cwd,rootOverride:e.rootOverride,id:t.id});});async function vg(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await Td(t);return process.stdout.write(`${JSON.stringify(r??null,null,2)}
577
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"recipes explain-active",root:e.rootOverride??null})}}var gR=u(()=>{D();v();vr();});var u0={};S(u0,{recipesExplainActiveSpec:()=>hR,runRecipesExplainActive:()=>Bee});var hR,Bee,kR=u(()=>{gR();hR={id:["recipes","explain-active"],group:"Recipes",summary:"Print the compiled active overlay bundle.",examples:[{cmd:"agentplane recipes explain-active",why:"Inspect compiled overlay runtime data."}],parse:()=>({})},Bee=e=>vg({cwd:e.cwd,rootOverride:e.rootOverride});});async function xg(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=(await sr(t)).recipes.find(s=>s.id===e.id);if(!n)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Recipe not installed: ${e.id}`});if(n.manifest.kind!=="project_overlay")throw new m({exitCode:3,code:"E_VALIDATION",message:`Recipe ${e.id} is not a project overlay`});let o=await ot(t),i=xd(o,e.id,!0),{bundle:a}=await cr({project:t,registry:i});return process.stdout.write(`Enabled overlay ${e.id} (${a.active.length} active)
578
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"recipes enable",root:e.rootOverride??null})}}var yR=u(()=>{D();G();v();vr();In();Ur();});var p0={};S(p0,{recipesEnableSpec:()=>wR,runRecipesEnable:()=>qee});var wR,qee,bR=u(()=>{yR();wR={id:["recipes","enable"],group:"Recipes",summary:"Enable an installed project overlay for the current project.",args:[{name:"id",required:true,valueHint:"<recipe-id>"}],examples:[{cmd:"agentplane recipes enable tdd",why:"Activate an installed overlay."}],parse:e=>({id:String(e.args.id??"").trim()})},qee=(e,t)=>xg({cwd:e.cwd,rootOverride:e.rootOverride,id:t.id});});async function Rg(e){try{let r=(await it(Ge())).recipes.find(l=>l.id===e.id);if(!r)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Recipe not cached: ${e.id}`});let n=r.manifest;bt.lines([`Recipe: ${n.id}@${n.version}`,`Kind: ${n.kind}`,`Schema: ${n.schema_version}`,"Cached: yes",`Name: ${n.name}`,`Summary: ${n.summary}`,`Description: ${n.description}`]),n.tags&&n.tags.length>0&&bt.line(`Tags: ${n.tags.join(", ")}`),n.compatibility&&mt(n.compatibility," ")&&bt.jsonSection("Compatibility",n.compatibility);let o=n.skills??[],i=n.agents??[],a=n.tools??[],s=n.scenarios??[],c=n.prompts??[],d=n.validators??[];if(o.length>0){bt.line("Skills:");for(let l of o)bt.line(` - ${l.id} - ${l.summary}`);}if(i.length>0){bt.line("Agents:");for(let l of i){let p=`${l.display_name} (${l.id})`;bt.line(` - ${p} - ${l.summary}`);}}if(a.length>0){bt.line("Tools:");for(let l of a)bt.line(` - ${l.id} - ${l.summary}`);}if(c.length>0){bt.line("Prompts:");for(let l of c)bt.line(` - ${l.id} [surface=${l.surface}, strength=${l.strength??"default"}]`);}if(d.length>0){bt.line("Validators:");for(let l of d)bt.line(` - ${l.id} [kind=${l.kind}, phase=${l.phase}]`);}if(s.length>0){bt.line("Scenarios:");for(let l of s)bt.line(` - ${l.name} (${l.id}) - ${l.summary} [mode=${l.run_profile.mode}]`);}return 0}catch(t){throw t instanceof m?t:O(t,{command:"recipes info",root:e.rootOverride??null})}}var bt,_R=u(()=>{D();I();G();v();mR();Wr();Ve();bt=A();});var f0={};S(f0,{recipesInfoSpec:()=>vR,runRecipesInfo:()=>Hee});var vR,Hee,xR=u(()=>{_R();vR={id:["recipes","info"],group:"Recipes",summary:"Show cached recipe metadata.",args:[{name:"id",required:true,valueHint:"<id>"}],examples:[{cmd:"agentplane recipes info viewer",why:"Show cached recipe metadata."}],parse:e=>({id:String(e.args.id??"")})},Hee=(e,t)=>Rg({cwd:e.cwd,rootOverride:e.rootOverride,id:t.id});});var Ps,RR=u(()=>{H();Ps={id:["recipes","install"],group:"Recipes",summary:"Install a recipe into the global cache from remote index, local archive, or URL.",synopsis:["agentplane recipes install <id|path|url> [--index <path|url>] [--refresh] [--yes] [--on-conflict <fail|rename|overwrite>]","agentplane recipes install --name <id> [--index <path|url>] [--refresh] [--yes] [--on-conflict <fail|rename|overwrite>]","agentplane recipes install --path <path> [--yes] [--on-conflict <fail|rename|overwrite>]","agentplane recipes install --url <url> [--yes] [--on-conflict <fail|rename|overwrite>]"],args:[{name:"source",required:false,valueHint:"<id|path|url>",description:"Auto mode: URL if http(s); else PATH if file exists; else NAME (remote index id)."}],options:[{kind:"string",name:"name",valueHint:"<id>",description:"Cache from remote index by recipe id."},{kind:"string",name:"path",valueHint:"<path>",description:"Cache from local recipe archive path."},{kind:"string",name:"url",valueHint:"<url>",description:"Cache from recipe archive URL."},{kind:"string",name:"index",valueHint:"<path|url>",description:"Override recipes index location (used when installing by name / auto-name)."},{kind:"boolean",name:"refresh",default:false,description:"Refresh remote index cache before installing."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve network prompts when allowed by config."},{kind:"string",name:"on-conflict",valueHint:"<fail|rename|overwrite>",choices:["fail","rename","overwrite"],default:"fail",description:"Deprecated compatibility no-op; recipe installs stay self-contained."}],validateRaw:e=>{let t=[e.opts.name,e.opts.path,e.opts.url].filter(Boolean).length,r=!!e.args.source;if(t+(r?1:0)!==1)throw y({spec:Ps,message:"Exactly one source is required: <source> OR --name OR --path OR --url",command:"recipes install"})},parse:e=>{let t=e.opts["on-conflict"]??"fail",r=e.opts.refresh===true,n=e.opts.yes===true,o=typeof e.opts.index=="string"?e.opts.index:void 0;if(e.opts.name)return {source:{type:"name",value:e.opts.name},index:o,refresh:r,yes:n,onConflict:t};if(e.opts.path)return {source:{type:"path",value:e.opts.path},index:o,refresh:r,yes:n,onConflict:t};if(e.opts.url)return {source:{type:"url",value:e.opts.url},index:o,refresh:r,yes:n,onConflict:t};let i=e.args.source;if(typeof i!="string")throw y({spec:Ps,command:"recipes install",message:"Missing source argument"});return {source:{type:"auto",value:i},index:o,refresh:r,yes:n,onConflict:t}},examples:[{cmd:"agentplane recipes install viewer",why:"Auto: install by id from remote index."},{cmd:"agentplane recipes install --name viewer --refresh",why:"Install by id, forcing index refresh."},{cmd:"agentplane recipes install viewer --on-conflict overwrite",why:"Compatibility-only flag; ignored by self-contained recipe installs."}],notes:["Auto mode resolution matches v0.1.9: URL if http(s); else PATH if file exists; else NAME (remote index).","Network operations may require approval; use --yes to auto-approve when allowed by config.","--on-conflict is accepted for backward compatibility but does not change install behavior."]};});function zee(){let e=process.env[RECIPES_INDEX_PUBLIC_KEYS_ENV];if(!e)return {...RECIPES_INDEX_PUBLIC_KEYS};try{let t=JSON.parse(e),r={...RECIPES_INDEX_PUBLIC_KEYS};for(let[n,o]of Object.entries(t))typeof o=="string"&&o.trim()&&(r[n]=o.trim());return r}catch{return {...RECIPES_INDEX_PUBLIC_KEYS}}}function CR(e){if(!F(e))throw new Error(he("recipes index signature","object"));if(e.schema_version!==1)throw new Error(he("recipes index signature.schema_version","1"));let t=typeof e.key_id=="string"?e.key_id.trim():"",r=typeof e.signature=="string"?e.signature.trim():"";if(!t||!r)throw new Error(he("recipes index signature","key_id, signature"));let n=typeof e.algorithm=="string"&&e.algorithm.trim()?e.algorithm.trim():void 0;return {schema_version:1,key_id:t,signature:r,algorithm:n}}function h0(e,t){let r=t.algorithm??Wee,n=g0[r];if(!n){let o=Object.keys(g0).toSorted().join(", ");throw new Error(`Unsupported recipes index signature algorithm "${r}". Supported algorithms: ${o}`)}n(e,t);}function Kee(e,t){let n=zee()[t.key_id];if(!n)throw new Error(he("recipes index signature.key_id","known key id"));let o=createPublicKey(n);if(!verify(null,Buffer.from(e),o,Buffer.from(t.signature,"base64")))throw new Error("Invalid signature for recipes index")}function Jee(e){if(!F(e))throw new Error(he("recipes index","object"));if(e.schema_version!==1)throw new Error(he("recipes index.schema_version","1"));if(!Array.isArray(e.recipes))throw new Error(he("recipes index.recipes","array"));return {schema_version:1,recipes:e.recipes.filter(r=>F(r)).map(r=>{let n=typeof r.id=="string"?r.id:"",o=typeof r.summary=="string"?r.summary:"",i=typeof r.description=="string"?r.description:void 0,a=Array.isArray(r.versions)?r.versions:[];if(!n||!o||a.length===0)throw new Error(he("recipes index.recipes[]","id, summary, versions"));let s=a.filter(c=>F(c)).map(c=>{let d=typeof c.version=="string"?c.version:"",l=typeof c.url=="string"?c.url:"",p=typeof c.sha256=="string"?c.sha256:"";if(!d||!l||!p)throw new Error(he("recipes index.recipes[].versions[]","version, url, sha256"));return {version:d,url:l,sha256:p,min_agentplane_version:typeof c.min_agentplane_version=="string"?c.min_agentplane_version:void 0,tags:Array.isArray(c.tags)?c.tags.filter(g=>typeof g=="string"):void 0}});return {id:n,summary:o,description:i,versions:s}})}}function TR(e){return e.startsWith("http://")||e.startsWith("https://")}async function Yee(e,t){return TR(e)?await F$(e):await readFile(Ye.resolve(t,e),"utf8")}function Qee(e){return `${e}.sig`}async function Xee(e,t){let r=Qee(e);if(TR(r)){let o=await Ef(r);return CR(o)}let n=await readFile(Ye.resolve(t,r),"utf8");return CR(JSON.parse(n))}async function Pg(e){let t=Za(),r=xj(),n=Ye.dirname(t),o;if(e.refresh||!await P(t)){let i=e.source??DEFAULT_RECIPES_INDEX_URL,a=await Yee(i,e.cwd),s=await Xee(i,e.cwd);h0(a,s),o=JSON.parse(a),await mkdir(n,{recursive:true}),await X(t,a),await ge(r,s);}else {let[i,a]=await Promise.all([readFile(t,"utf8"),readFile(r,"utf8")]),s=CR(JSON.parse(a));h0(i,s),o=JSON.parse(i);}return Jee(o)}function Tg(e){return TR(e.source)?e.refresh||!e.cachePathExists:false}var Wee,g0,SR=u(()=>{If();ee();I();De();_e();Ci();Ve();Wee="ed25519",g0={ed25519:Kee};});function ete(e){return e instanceof Error?e.message.startsWith("Not an agentplane project")||e.message.startsWith("Not a git repository")||e.message.startsWith("Agentplane project root is not a git repository"):false}async function k0(e){try{return await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null})}catch(t){if(ete(t)){if(e.rootOverride)throw t;return null}throw t}}var y0=u(()=>{});async function Sg(e){let t=e.flags;try{let r=await k0({cwd:e.cwd,rootOverride:e.rootOverride}),n=defaultConfig();r&&(n=(await loadConfig(r.agentplaneDir)).config);let o=t.index??DEFAULT_RECIPES_INDEX_URL,i=Za();Tg({source:o,refresh:t.refresh,cachePathExists:await P(i)})&&await Kr({action:"recipe_list_remote",config:n,yes:t.yes,reason:"recipes list-remote fetches the remote recipes index"});let s=await Pg({cwd:e.cwd,source:t.index,refresh:t.refresh});for(let c of s.recipes){let d=rs(c.versions);d&&process.stdout.write(`${c.id}@${d.version} - ${c.summary}
579
+ `);}return 0}catch(r){throw r instanceof m?r:O(r,{command:"recipes list-remote",root:e.rootOverride??null})}}var ER=u(()=>{D();ee();v();ls();Ci();SR();y0();Ve();uf();});var w0={};S(w0,{recipesListRemoteSpec:()=>IR,runRecipesListRemote:()=>nte});var IR,nte,AR=u(()=>{ER();IR={id:["recipes","list-remote"],group:"Recipes",summary:"List recipes from the remote index (or cache).",options:[{kind:"boolean",name:"refresh",default:false,description:"Refresh remote index cache before listing."},{kind:"string",name:"index",valueHint:"<path|url>",description:"Override recipes index location (path or http(s) URL)."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve network access prompts (subject to config approvals)."}],examples:[{cmd:"agentplane recipes list-remote",why:"List remote recipes using cached index when available."},{cmd:"agentplane recipes list-remote --refresh",why:"Force refresh of the remote index cache."},{cmd:"agentplane recipes list-remote --index ./index.json --refresh",why:"Refresh from a local index file."}],parse:e=>({refresh:e.opts.refresh===true,index:e.opts.index,yes:e.opts.yes===true})},nte=(e,t)=>Sg({cwd:e.cwd,rootOverride:e.rootOverride,flags:t});});async function Ig(e){let t=e.flags;try{let r=await it(Ge()),n=r.recipes;if(t.tag){let o=t.tag.toLowerCase();n=n.filter(i=>i.tags.some(a=>a.toLowerCase()===o));}if(n.length===0)return t.tag?(Eg.line(hc(`cached recipes for tag ${t.tag}`)),0):(Eg.line(hc("cached recipes","Use `agentplane recipes list-remote` or `agentplane recipes install <id>`.")),0);if(t.full)return Eg.json({schema_version:1,updated_at:r.updated_at,recipes:n}),0;for(let o of n)Eg.line(`${o.id}@${o.version} [${o.manifest.kind}] - ${o.manifest.summary||"No summary"}`);return 0}catch(r){throw r instanceof m?r:O(r,{command:"recipes list",root:e.rootOverride??null})}}var Eg,OR=u(()=>{D();I();v();Wr();Ve();Eg=A();});var b0={};S(b0,{recipesListSpec:()=>Ag,runRecipesList:()=>ote});var Ag,ote,DR=u(()=>{H();OR();Ag={id:["recipes","list"],group:"Recipes",summary:"List cached recipes.",options:[{kind:"boolean",name:"full",default:false,description:"Print full JSON payload."},{kind:"string",name:"tag",valueHint:"<tag>",description:"Filter cached recipes by tag."}],examples:[{cmd:"agentplane recipes list",why:"List cached recipes."},{cmd:"agentplane recipes list --tag cli",why:"List cached recipes with a tag."},{cmd:"agentplane recipes list --full",why:"Print full JSON payload."}],parse:e=>({full:e.opts.full===true,tag:(()=>{let t=e.opts.tag;if(t===void 0)return;let r=t.trim();if(!r)throw y({spec:Ag,command:"recipes list",message:"Option --tag must not be empty."});return r})()})},ote=(e,t)=>Ig({cwd:e.cwd,rootOverride:e.rootOverride,flags:t});});async function Og(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await loadConfig(t.agentplaneDir),n=await sr(t),o=await ot(t),i=n.recipes.find(s=>s.id===e.id);if(!i)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Recipe not installed: ${e.id}`});let a=En(t,i.id);return await ce({action:"dangerous_fs",config:r.config,yes:!1,reason:`recipes remove ${i.id}@${i.version}`}),await Ro({targetDir:a,mode:"remove",commit:async()=>{let s=Pj(o,i.id);await cr({project:t,registry:s});}}),process.stdout.write(`${z("removed recipe",`${i.id}@${i.version}`)}
580
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"recipes remove",root:e.rootOverride??null})}}var NR=u(()=>{D();G();I();v();Be();wd();vr();In();Ur();Ve();});var _0={};S(_0,{recipesRemoveSpec:()=>jR,runRecipesRemove:()=>ste});var jR,ste,$R=u(()=>{NR();jR={id:["recipes","remove"],group:"Recipes",summary:"Remove a vendored recipe from the current project.",args:[{name:"id",required:true,valueHint:"<id>"}],examples:[{cmd:"agentplane recipes remove viewer",why:"Remove a vendored recipe by id."}],parse:e=>({id:String(e.args.id??"")})},ste=(e,t)=>Og({cwd:e.cwd,rootOverride:e.rootOverride,id:t.id});});var v0={};S(v0,{recipesSpec:()=>Dg,runRecipes:()=>cte});var Dg,cte,MR=u(()=>{Oe();Dg={id:["recipes"],group:"Recipes",summary:"Recipe management commands.",synopsis:["agentplane recipes <subcommand> [options]"],args:[{name:"subcommand",required:false,variadic:true,valueHint:"<subcommand>"}],parse:e=>ke(e,"subcommand")},cte=async(e,t)=>{oe({spec:Dg,cmd:t.cmd,subcommands:await ne(["recipes"]),command:"recipes",missingMessage:"Missing recipes subcommand.",unknownMessage:r=>`Unknown recipes subcommand: ${r}.`});};});function fte(e){return new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Recipe ${e} has local project edits. Re-run with --force to overwrite the vendored copy from cache.`})}async function Ng(e){try{let t=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await loadConfig(t.agentplaneDir),n=await Ti({project:t,recipeId:e.id});if(!n.cache_present||!n.current_source_sha256)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Cached source is missing for ${n.entry.id}@${n.entry.version}. Run agentplane recipes install ${n.entry.id}@${n.entry.version}`});if(n.state==="modified"&&!e.force)throw fte(n.entry.id);let o=n.current_source_sha256;if(!o)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Cached source hash is missing for ${n.entry.id}@${n.entry.version}`});let a=(await it(Ge())).recipes.find(l=>l.id===n.entry.id&&l.version===n.entry.version);if(!a)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Recipe not found in global cache: ${n.entry.id}@${n.entry.version}`});let s=await ot(t);if(n.entry.materialization==="copy"&&n.state==="clean"&&n.current_source_sha256===n.entry.source_sha256)return process.stdout.write(`Recipe ${n.entry.id}@${n.entry.version} is already up to date.
581
+ `),0;await ce({action:"dangerous_fs",config:r.config,yes:!1,reason:`recipes update ${n.entry.id}@${n.entry.version}`});let c=Vr(t,n.entry.id);await Ro({targetDir:c,mode:"replace",materialize:async l=>{await(n.entry.materialization==="link"?symlink(n.source_dir,l,"dir"):cp$1(n.source_dir,l,{recursive:!0}));},commit:async()=>{let l=await zr(c),p=s.recipes.find(h=>h.id===n.entry.id),g=es(s,{id:n.entry.id,version:n.entry.version,path:n.entry.project_path,active:p?.active===!0,materialization:n.entry.materialization,source_ref:n.entry.source_ref,source_sha256:o,vendored_sha256:l,installed_at:n.entry.installed_at,tags:normalizeRecipeTags(a.tags??a.manifest.tags??[])});await cr({project:t,registry:g});}});let d=n.entry.materialization==="link"?"Refreshed linked recipe":"Updated vendored recipe";return process.stdout.write(`${d} ${n.entry.id}@${n.entry.version} from cache.
582
+ `),0}catch(t){throw t instanceof m?t:O(t,{command:"recipes update",root:e.rootOverride??null})}}var FR=u(()=>{D();G();v();Be();Wr();wd();vr();ts();Ur();Ve();});var x0={};S(x0,{recipesUpdateSpec:()=>BR,runRecipesUpdate:()=>gte});var BR,gte,LR=u(()=>{FR();BR={id:["recipes","update"],group:"Recipes",summary:"Refresh a vendored recipe from the cached source.",args:[{name:"id",required:true,valueHint:"<id>"}],options:[{kind:"boolean",name:"force",default:false,description:"Overwrite local project edits in the vendored recipe."}],examples:[{cmd:"agentplane recipes update tdd",why:"Sync a clean vendored recipe to the current cached source."},{cmd:"agentplane recipes update tdd --force",why:"Overwrite local vendored edits with the cached source."}],parse:e=>({id:String(e.args.id??"").trim(),force:e.opts.force===true})},gte=(e,t)=>Ng({cwd:e.cwd,rootOverride:e.rootOverride,id:t.id,force:t.force});});async function C0(e){await mkdir(Ye.dirname(e.to),{recursive:true});try{await rename(e.from,e.to);}catch(t){if(t?.code==="EXDEV"){await cp$1(e.from,e.to,{recursive:true}),await rm$1(e.from,{recursive:true,force:true});return}throw t}}function vte(e){let t=e.trim().toLowerCase();return t.endsWith(".md")||t.endsWith(".markdown")}async function R0(e,t,r){let n=Ye.join(e,t);if(!await P(n))throw new Error(hr(r,t));if(!vte(t))throw new Error(he(r,"markdown file (*.md)",t));if(!(await readFile(n,"utf8")).trim())throw new Error(he(r,"non-empty markdown document",t))}async function P0(e){for(let t of e.manifest.skills??[])await R0(e.recipeDir,t.file,"recipe skill file");for(let t of e.manifest.agents??[])await R0(e.recipeDir,t.file,"recipe agent file");for(let t of e.manifest.tools??[]){let r=Ye.join(e.recipeDir,t.entrypoint);if(!await P(r))throw new Error(hr("recipe tool entrypoint",t.entrypoint))}for(let t of e.manifest.prompts??[]){let r=Ye.join(e.recipeDir,t.file);if(!await P(r))throw new Error(hr("overlay prompt file",t.file))}for(let t of e.manifest.scenarios??[]){let r=Ye.join(e.recipeDir,t.file);if(!await P(r))throw new Error(hr("recipe scenario file",t.file));if((await readScenarioDefinition(r)).id!==t.id)throw new Error(he("recipe scenario file",`scenario.id=${t.id}`,t.file))}}var T0=u(()=>{G();ee();I();v();De();_e();Ci();});async function S0(e){let t=Ye.join(e,"manifest.json");if(await P(t))return e;let n=(await readdir(e,{withFileTypes:true})).filter(i=>i.isDirectory()).map(i=>i.name);if(n.length!==1)throw new Error(hr("manifest.json","archive root"));let o=Ye.join(e,n[0]);if(!await P(Ye.join(o,"manifest.json")))throw new Error(hr("manifest.json","archive root"));return o}var E0=u(()=>{ee();I();});function O0(e){return e.startsWith("http://")||e.startsWith("https://")}async function jg(e){try{let t=defaultConfig();try{let i=await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null});t=(await loadConfig(i.agentplaneDir)).config;}catch{t=defaultConfig();}let r=!1,n=async i=>{r||(await Kr({action:"recipe_install",config:t,yes:e.yes,reason:i}),r=!0);},o=await mkdtemp(Ye.join(Q$.tmpdir(),"agentplane-recipe-"));try{let i="",a="",s=[],c=async C=>{let j=e.index??DEFAULT_RECIPES_INDEX_URL,T=Za();Tg({source:j,refresh:e.refresh,cachePathExists:await P(T)})&&await n("recipes install fetches the remote recipes index");let W=(await Pg({cwd:e.cwd,source:e.index,refresh:e.refresh})).recipes.find(J=>J.id===C);if(!W)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Recipe not found in remote index: ${C}`});let Z=rs(W.versions);if(!Z)throw new m({exitCode:3,code:"E_VALIDATION",message:`Recipe ${W.id} has no versions in the remote index`});if(a=Z.sha256,i=`${W.id}@${Z.version}`,s=normalizeRecipeTags(Z.tags??[]),O0(Z.url)){await n("recipes install downloads a recipe archive");let J=new URL(Z.url),pe=Ye.basename(J.pathname)||"recipe.tar.gz",ye=Ye.join(o,pe);return await jn(Z.url,ye),{kind:"archive",path:ye}}let U=Ye.resolve(e.cwd,Z.url);if(!await P(U))throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Recipe archive not found: ${Z.url}`});return {kind:"archive",path:U}},d=async C=>{if(C.type==="name")return await c(C.value);if(C.type==="url"){await n("recipes install downloads a recipe archive");let T=new URL(C.value),M=Ye.basename(T.pathname)||"recipe.tar.gz",$=Ye.join(o,M);return i=C.value,await jn(C.value,$),{kind:"archive",path:$}}if(C.type==="path"){let T=await ir(C.value);if(!await P(T))throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Recipe archive not found: ${C.value}`});return await Zt(T)==="dir"?(i=T,{kind:"directory",path:T}):(i=T,{kind:"archive",path:T})}if(O0(C.value))return await d({type:"url",value:C.value});let j=await ir(C.value);return await P(j)?await d({type:"path",value:C.value}):await d({type:"name",value:C.value})},l=await d(e.source),p=l.path;i||(i=e.source.value);let g=a&&l.kind==="archive"?await Af(p):"";if(a&&g!==a)throw new m({exitCode:3,code:"E_VALIDATION",message:`Recipe checksum mismatch for ${i}`});let h;if(l.kind==="archive")await Of({archivePath:p,destDir:o}),h=await S0(o);else {let C=Ye.join(o,"recipe");await cp$1(p,C,{recursive:!0}),h=C;}let f=await readRecipeManifest(Ye.join(h,"manifest.json")),b=f.tags&&f.tags.length>0?f.tags:normalizeRecipeTags(s),w=b.length>0?{...f,tags:b}:f;await P0({manifest:w,recipeDir:h});let _=Pi({id:w.id,version:w.version}),x=await Zt(_);if(x&&x!=="dir")throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Recipe install path is not a directory: ${_}`});x&&await rm$1(_,{recursive:!0,force:!0}),await mkdir(bd(),{recursive:!0}),await C0({from:h,to:_});try{let C=await it(Ge()),j={id:w.id,version:w.version,source:i,installed_at:new Date().toISOString(),tags:b,manifest:w};await mf(Ge(),{schema_version:1,updated_at:C.updated_at,recipes:[...C.recipes.filter(T=>!(T.id===j.id&&T.version===j.version)),j]});}catch(C){throw await rm$1(_,{recursive:!0,force:!0}),C}return process.stdout.write(`Installed recipe ${w.id}@${w.version} to global cache
583
+ `),0}finally{await rm$1(o,{recursive:!0,force:!0});}}catch(t){throw t instanceof m?t:O(t,{command:"recipes install",root:e.rootOverride??null})}}var GR=u(()=>{Fv();Mv();D();G();ee();If();v();ls();Pn();T0();E0();Ci();SR();Wr();Ve();uf();});var D0={};S(D0,{runRecipesInstall:()=>Ate});var Ate,N0=u(()=>{H();v();GR();RR();Ate=(e,t)=>(async()=>{try{return await jg({cwd:e.cwd,rootOverride:e.rootOverride,...t})}catch(r){throw r instanceof m&&r.code==="E_USAGE"?y({spec:Ps,command:"recipes install",message:r.message}):r}})();});function VR(e){if(typeof e!="string")return null;let t=e.trim();return t.length>0?t:null}async function Bi(e){let t=VR(e.metaHeadSha),r=VR(e.metaLastVerifiedSha),n=VR(yu(e.verifyLogText??"")),o=e.metaVerifyStatus==="pass",i=t===e.branchHeadSha||await ii({gitRoot:e.gitRoot,workflowDir:e.workflowDir,tasksPath:e.tasksPath,taskId:e.taskId,fromRef:t,toRef:e.branchHeadSha});if(!e.requiresVerify)return {reviewFresh:i,verifyFresh:true,verifySatisfied:true,verifyLogSha:n,effectiveVerifiedSha:null};let a=o&&(r===e.branchHeadSha||await ii({gitRoot:e.gitRoot,workflowDir:e.workflowDir,tasksPath:e.tasksPath,taskId:e.taskId,fromRef:r,toRef:e.branchHeadSha})),s=n===e.branchHeadSha,c=e.taskVerificationState==="ok"&&i&&r===null,d=a||s||c;return {reviewFresh:i,verifyFresh:d,verifySatisfied:d,verifyLogSha:n,effectiveVerifiedSha:d?e.branchHeadSha:r}}var $g=u(()=>{nt();$c();});function $te(e){let t=e instanceof Error?e.message:String(e);return /unknown revision or path not in the working tree/i.test(t)}async function Mte(e){let t=e.ctx.config.branch.task_prefix,n=(await gitListTaskBranches(e.resolved.gitRoot,t)).filter(o=>parseTaskIdFromBranch(t,o)===e.taskId);if(n.length===1)return n[0]??null;if(n.length>1)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Multiple task branches match ${e.taskId}: ${n.join(", ")}`});return null}async function Ts(e,t){let r=Ye.join(e,t);return await P(r)?await readFile(r,"utf8"):null}function j0(e){let t=[],r=null;if(e.texts.metaText)try{r=je(e.texts.metaText,e.taskId);}catch(n){let o=n instanceof Error?n.message:String(n);t.push(o);}else t.push(`Missing PR directory: ${e.relPrDir}`,`Missing ${e.relMetaPath}`);return e.texts.diffstatText===null&&t.push(`Missing ${e.relDiffstatPath}`),e.texts.verifyLogText===null&&t.push(`Missing ${e.relVerifyLogPath}`),e.texts.reviewText?Lc(e.texts.reviewText,t):t.push(`Missing ${e.relReviewPath}`),e.texts.githubTitleText?.trim()||t.push(`Missing ${e.relGithubTitlePath}`),e.texts.githubBodyText?vA(e.texts.githubBodyText,t):t.push(`Missing ${e.relGithubBodyPath}`),{meta:r,errors:t}}async function $0(e){if(!e.snapshot.meta||!e.branchHeadSha)return;let t=await Bi({gitRoot:e.gitRoot,workflowDir:e.workflowDir,tasksPath:e.tasksPath,taskId:e.taskId,branchHeadSha:e.branchHeadSha,metaHeadSha:e.snapshot.meta.head_sha??null,metaLastVerifiedSha:e.snapshot.meta.last_verified_sha??null,metaVerifyStatus:e.snapshot.meta.verify?.status??null,taskVerificationState:e.taskVerificationState,verifyLogText:e.snapshot.texts.verifyLogText,requiresVerify:e.requiresVerify});e.snapshot.freshnessEvaluated=true,e.snapshot.freshnessReviewFresh=t.reviewFresh,e.snapshot.freshnessVerifySatisfied=t.verifySatisfied,e.snapshot.freshnessVerifyFresh=t.verifyFresh,e.snapshot.freshnessVerifyLogSha=t.verifyLogSha;}function Fte(e){let t=[...e.snapshot.errors],r=e.snapshot.meta;return r?e.branchHeadSha&&e.snapshot.freshnessEvaluated?(e.snapshot.freshnessReviewFresh||t.push(`PR artifacts stale: head_sha=${r.head_sha??"<missing>"} current_head=${e.branchHeadSha}`),e.requiresVerify&&!e.snapshot.freshnessVerifySatisfied&&(r.verify?.status!=="pass"&&t.push("Verify requirements not satisfied (meta.verify.status != pass)"),(!r.last_verified_sha||!r.last_verified_at)&&!e.snapshot.freshnessVerifyLogSha&&t.push("Verify metadata missing (last_verified_sha/last_verified_at)")),e.requiresVerify&&r.last_verified_sha&&!e.snapshot.freshnessVerifyFresh&&t.push(`Verify state stale: last_verified_sha=${r.last_verified_sha} current_head=${e.branchHeadSha}`),t):(e.requiresVerify&&(r.verify?.status!=="pass"&&t.push("Verify requirements not satisfied (meta.verify.status != pass)"),(!r.last_verified_sha||!r.last_verified_at)&&t.push("Verify metadata missing (last_verified_sha/last_verified_at)")),t):t}async function M0(e){try{let t=A(),r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),{task:n}=await Kt({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId}),{resolved:o,config:i,prDir:a,metaPath:s,diffstatPath:c,verifyLogPath:d,reviewPath:l,githubTitlePath:p,githubBodyPath:g}=await ht({...e,ctx:r});if(i.workflow_mode!=="branch_pr")throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:Jt(i.workflow_mode,"branch_pr")});let h=[],f=Ye.relative(o.gitRoot,a),b=Ye.relative(o.gitRoot,s),w=Ye.relative(o.gitRoot,c),_=Ye.relative(o.gitRoot,d),x=Ye.relative(o.gitRoot,l),C=Ye.relative(o.gitRoot,p),j=Ye.relative(o.gitRoot,g),T={},M=!!(n.verify&&n.verify.length>0),$={metaText:await Ts(a,"meta.json"),diffstatText:await Ts(a,"diffstat.txt"),verifyLogText:await Ts(a,"verify.log"),reviewText:await Ts(a,"review.md"),githubTitleText:await Ts(a,"github-title.txt"),githubBodyText:await Ts(a,"github-body.md")},W=j0({texts:$,relPrDir:f,relMetaPath:b,relDiffstatPath:w,relVerifyLogPath:_,relReviewPath:x,relGithubTitlePath:C,relGithubBodyPath:j,taskId:n.id}),Z={source:"local",texts:$,meta:W.meta,errors:W.errors,freshnessEvaluated:!1,freshnessReviewFresh:!1,freshnessVerifySatisfied:!1,freshnessVerifyFresh:!1,freshnessVerifyLogSha:null},U=Z.meta?.branch?.trim()??"";U?T.value=U:T.value===void 0&&(T.value=await Mte({ctx:r,resolved:o,taskId:n.id}));let J=T.value??null,pe=null;if(J)try{pe=await gitRevParse(o.gitRoot,[J]);}catch(Y){if(!$te(Y))throw Y}await $0({snapshot:Z,gitRoot:o.gitRoot,workflowDir:i.paths.workflow_dir,tasksPath:i.paths.tasks_path,taskId:n.id,branchHeadSha:pe,taskVerificationState:n.verification?.state??null,requiresVerify:M});let ye=Z;if(J&&pe&&(!Z.meta||!Z.freshnessReviewFresh||M&&!Z.freshnessVerifySatisfied)){let Y=await findWorktreeForBranch(o.gitRoot,J),Re={metaText:await $r({resolved:o,prDir:a,fileName:"meta.json",branch:J,worktreePath:Y}),diffstatText:await $r({resolved:o,prDir:a,fileName:"diffstat.txt",branch:J,worktreePath:Y}),verifyLogText:await $r({resolved:o,prDir:a,fileName:"verify.log",branch:J,worktreePath:Y}),reviewText:await $r({resolved:o,prDir:a,fileName:"review.md",branch:J,worktreePath:Y}),githubTitleText:await $r({resolved:o,prDir:a,fileName:"github-title.txt",branch:J,worktreePath:Y}),githubBodyText:await $r({resolved:o,prDir:a,fileName:"github-body.md",branch:J,worktreePath:Y})},Ue=j0({texts:Re,relPrDir:f,relMetaPath:b,relDiffstatPath:w,relVerifyLogPath:_,relReviewPath:x,relGithubTitlePath:C,relGithubBodyPath:j,taskId:n.id}),V={source:"branch",texts:Re,meta:Ue.meta,errors:Ue.errors,freshnessEvaluated:!1,freshnessReviewFresh:!1,freshnessVerifySatisfied:!1,freshnessVerifyFresh:!1,freshnessVerifyLogSha:null};await $0({snapshot:V,gitRoot:o.gitRoot,workflowDir:i.paths.workflow_dir,tasksPath:i.paths.tasks_path,taskId:n.id,branchHeadSha:pe,taskVerificationState:n.verification?.state??null,requiresVerify:M}),V.errors.length===0&&V.meta&&V.freshnessReviewFresh&&(!M||V.freshnessVerifySatisfied)&&(ye=V);}if(h.push(...Fte({snapshot:ye,branchHeadSha:pe,requiresVerify:M})),h.length>0)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:h.join(`
584
+ `)});return t.success("pr check",Ye.relative(o.gitRoot,a)),0}catch(t){throw t instanceof m?t:E(t,{command:"pr check",root:e.rootOverride??null})}}var F0=u(()=>{D();G();ee();I();v();nt();Ee();N();wn();si();$g();});function B0(e,t){let r=t.trim();if(!r)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Invalid value for --${e}.`});return r}async function Mg(e){try{if(!Number.isInteger(e.prNumber)||e.prNumber<=0)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Invalid PR number."});let t=A(),n=(e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null})).resolvedProject.gitRoot,o=e.repo?B0("repo",e.repo):await go(n),i=e.comment?.trim()?B0("comment",e.comment):null,a=await jt(n,[`repos/${o}/pulls/${e.prNumber}`]);if(!a.number)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`GitHub pull request #${e.prNumber} was not found in ${o}.`});i&&await qc(n,[`repos/${o}/issues/${e.prNumber}/comments`,"-X","POST","-f",`body=${i}`]);let s=await jt(n,[`repos/${o}/pulls/${e.prNumber}`,"-X","PATCH","-f","state=closed"]),c=s.head?.repo?.full_name?.trim()??a.head?.repo?.full_name?.trim()??null,d=s.head?.ref?.trim()??a.head?.ref?.trim()??null,l="skipped";if(e.deleteRemoteBranch)if(!d)l="skipped-missing-head";else if(c&&c!==o)l="skipped-fork";else try{await qc(n,[`repos/${o}/git/refs/heads/${encodeURIComponent(d)}`,"-X","DELETE"]),l="deleted";}catch(g){if(Su(g))l="already-absent";else throw g}let p={repo:o,prNumber:e.prNumber,url:s.html_url?.trim()??a.html_url?.trim()??null,state:s.state?.trim()??a.state?.trim()??"closed",comment:i?"added":"skipped",remoteBranch:d,remoteBranchAction:l};return t.report([{label:"repo",value:p.repo},{label:"state",value:p.state},{label:"url",value:p.url??"unknown"},{label:"comment",value:p.comment},{label:"remote_branch",value:p.remoteBranch??"unknown"},{label:"remote_branch_action",value:p.remoteBranchAction}],{header:z("pr close",`#${p.prNumber}`)}),0}catch(t){throw t instanceof m?t:O(t,{command:"pr close",root:e.rootOverride??null})}}var UR=u(()=>{D();G();I();v();N();ho();});async function Lte(e){let t=`repos/${e.repo}/git/refs/heads/${encodeURIComponent(e.branch)}`;try{return await qc(e.cwd,[t,"-X","DELETE"]),"deleted"}catch(r){if(Su(r))return "already-absent";throw r}}async function L0(e){try{let t=A(),r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),{task:n}=await Kt({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId});if(String(n.status??"").trim().toUpperCase()!=="DONE")throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Task ${e.taskId} must be DONE before closing superseded PRs.`});let{config:o,metaPath:i,resolved:a}=await ht({...e,ctx:r});if(o.workflow_mode!=="branch_pr")throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:Jt(o.workflow_mode,"branch_pr")});if(!await P(i))throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Missing PR metadata: ${i}`});let c=Aa(await readFile(i,"utf8"),e.taskId).branch?.trim()??"";if(!c)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Missing PR branch for ${e.taskId}`});let d=await go(a.gitRoot),l=d.split("/",1)[0]?.trim()??"";if(!l)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:"Could not derive GitHub owner from remote origin."});let p=await jt(a.gitRoot,[`repos/${d}/pulls?head=${encodeURIComponent(`${l}:${c}`)}&state=open&per_page=100`]);if(p.length===0){let h=e.deleteRemoteBranch?await Lte({cwd:a.gitRoot,repo:d,branch:c}):"skipped";return t.report([{label:"task",value:e.taskId},{label:"branch",value:c},{label:"state",value:"skipped"},{label:"reason",value:"no open task PR found"},{label:"remote_branch_action",value:h}],{header:K(`pr close-superseded ${e.taskId}`)}),0}if(p.length>1)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Multiple open PRs match task ${e.taskId} branch ${c}: ${p.map(h=>h.number).filter(h=>typeof h=="number"&&Number.isInteger(h)&&h>0).map(h=>`#${h}`).join(", ")}`});let g=Number(p[0]?.number??0);if(!Number.isInteger(g)||g<=0)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Could not determine open PR number for task ${e.taskId}.`});return await Mg({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride,prNumber:g,comment:`Superseded by protected-main closure of task ${e.taskId}.`,deleteRemoteBranch:e.deleteRemoteBranch})}catch(t){throw t instanceof m?t:O(t,{command:"pr close-superseded",root:e.rootOverride??null})}}var q0=u(()=>{D();G();I();ee();v();N();nt();UR();ho();wn();});async function G0(e){try{let t=A(),r=e.author.trim(),n=e.body.trim();if(!r)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Invalid value for --author."});if(!n)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Invalid value for --body."});let o=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),{task:i}=await Kt({ctx:o,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId}),{config:a,reviewPath:s,notesPath:c,githubTitlePath:d,githubBodyPath:l,metaPath:p,resolved:g}=await ht({...e,ctx:o});if(a.workflow_mode!=="branch_pr")throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:Jt(a.workflow_mode,"branch_pr")});if(!await P(s)){let j=Ye.relative(g.gitRoot,s);throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Missing ${j} (run \`agentplane pr open\`)`})}let h=await readFile(s,"utf8"),f=je(await readFile(p,"utf8"),e.taskId);await hA({notesPath:c,note:gA({createdAt:new Date().toISOString(),author:r,body:n})});let b=await wu(c),w=bA(h)??"",_=Da({task:i,createdAt:f.created_at??"",branch:f.branch??"",handoffNotes:b,autoSummary:w}),x=fo(i),C=ai({task:i,handoffNotes:b,autoSummary:w});return await atomicWriteFile(s,_,"utf8"),await atomicWriteFile(d,`${x}
585
+ `,"utf8"),await atomicWriteFile(l,C,"utf8"),t.success("pr note",e.taskId),0}catch(t){throw t instanceof m?t:O(t,{command:"pr note",root:e.rootOverride??null})}}var V0=u(()=>{D();G();ee();I();v();N();wn();kw();si();nt();});function Ute(e,t){return `${toGitPath(Ye.join(e,t,"pr"))}/`}function Wte(e,t){return toGitPath(Ye.join(e,t,"README.md"))}function U0(e){let t=toGitPath(e.relPath);return t===Wte(e.workflowDir,e.taskId)||t.startsWith(Ute(e.workflowDir,e.taskId))}async function zte(e){let{stdout:t}=await execFileAsync("git",["diff","--cached","--name-only","--relative"],{cwd:e,env:gitEnv()});return t.split(`
586
+ `).map(r=>r.trim()).filter(r=>r.length>0)}async function Fg(e){if(e.ctx.config.workflow_mode!=="branch_pr")return false;let r=(await gitCurrentBranch(e.ctx.resolvedProject.gitRoot)).trim();if(!r||r!==e.branch.trim())return false;let o=(await e.ctx.git.statusChangedPaths()).filter(a=>U0({workflowDir:e.ctx.config.paths.workflow_dir,taskId:e.taskId,relPath:a}));return o.length===0||(await zte(e.ctx.resolvedProject.gitRoot)).some(a=>!U0({workflowDir:e.ctx.config.paths.workflow_dir,taskId:e.taskId,relPath:a}))?false:(await e.ctx.git.stage(o),await e.ctx.git.commit({message:buildTaskArtifactRefreshCommitSubject({taskId:e.taskId}),env:kn({taskId:e.taskId,allowTasks:true,allowBase:false,allowPolicy:false,allowConfig:false,allowHooks:false,allowCI:false,gitIdentity:await lo()})}),e.ctx.git.invalidateStatus(),true)}var KR=u(()=>{Ic();Ee();});function Jte(e,t){return t?t.message:typeof e.pr_number=="number"&&e.pr_number>0?e.pr_url?.trim()?`linked to GitHub PR #${e.pr_number}: ${e.pr_url.trim()}`:`linked to GitHub PR #${e.pr_number}`:"local PR artifacts synced; remote PR creation staged"}async function Yte(e,t){try{let{stdout:r}=await execFileAsync("git",["rev-parse",`refs/heads/${t}`],{cwd:e,env:gitEnv()}),n=r.trim();return n.length>0?n:null}catch{return null}}async function Qte(e,t,r){try{let{stdout:n}=await execFileAsync("git",["ls-remote","--heads",t,`refs/heads/${r}`],{cwd:e,env:gitEnv()}),o=n.trim();if(!o)return null;let[i]=o.split(/\s+/,1);return i?.trim()||null}catch{return null}}async function Xte(e,t){try{let{stdout:r}=await execFileAsync("git",["remote","get-url","--push",t],{cwd:e,env:gitEnv()}),n=r.trim();return n.length>0?n:t}catch{return t}}async function Zte(e){await execFileAsync("git",["config",`branch.${e.branch}.remote`,e.remote],{cwd:e.gitRoot,env:gitEnv()}),await execFileAsync("git",["config",`branch.${e.branch}.merge`,`refs/heads/${e.remoteBranch}`],{cwd:e.gitRoot,env:gitEnv()});}async function z0(e){let t=await Xte(e.gitRoot,e.remote),[r,n]=await Promise.all([Yte(e.gitRoot,e.branch),Qte(e.gitRoot,t,e.remoteBranch)]);return !!(r&&n&&r===n)}async function ere(e){let r=(await gitBranchUpstream(e.gitRoot,e.branch))?.trim()??"";if(!r){if((await gitCurrentBranch(e.gitRoot).catch(()=>"")).trim()!==e.branch.trim())return false;try{await execFileAsync("git",["remote","get-url","origin"],{cwd:e.gitRoot,env:gitEnv()});}catch{return false}try{await execFileAsync("git",["push","--no-verify","-u","origin",`HEAD:${e.branch}`],{cwd:e.gitRoot,env:gitEnv()});}catch(s){if(!await z0({gitRoot:e.gitRoot,branch:e.branch,remote:"origin",remoteBranch:e.branch}))throw s;await Zte({gitRoot:e.gitRoot,branch:e.branch,remote:"origin",remoteBranch:e.branch});}return true}let n=r.indexOf("/");if(n<=0||n===r.length-1)return false;let o=r.slice(0,n),i=r.slice(n+1);if(!o||!i)return false;try{await execFileAsync("git",["push","--no-verify",o,`HEAD:${i}`],{cwd:e.gitRoot,env:gitEnv()});}catch(a){if(!await z0({gitRoot:e.gitRoot,branch:e.branch,remote:o,remoteBranch:i}))throw a}return true}async function K0(e){try{let t=A(),r=e.author.trim();if(!r)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Invalid value for --author."});let n=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),o=await di({ctx:n,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,mode:"open",author:r,branch:e.branch,remoteMode:"sync-only"});o.meta.branch&&await Fg({ctx:n,taskId:e.taskId,branch:o.meta.branch}),!e.syncOnly&&o.meta.branch&&await ere({gitRoot:n.resolvedProject.gitRoot,branch:o.meta.branch});let{meta:i,prDir:a,resolved:s,openOutcome:c}=e.syncOnly?o:await di({ctx:n,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,mode:"open",author:r,branch:e.branch,remoteMode:"auto"});return t.success("pr open",Ye.relative(s.gitRoot,a),Jte(i,c??null)),0}catch(t){throw t instanceof m?t:E(t,{command:"pr open",root:e.rootOverride??null})}}var J0=u(()=>{D();G();I();v();Ee();N();KR();li();});async function rre(e){try{return await readFile(e,"utf8")}catch(t){if(t?.code==="ENOENT")return null;throw t}}async function nre(e){let t=e.meta.branch?.trim()??"";if(!t)return;let r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),{config:n,task:o}=await Kt({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId}),i=!!(o.verify&&o.verify.length>0);if(!i)return;let a=await gitRevParse(e.resolved.gitRoot,[`${t}^{commit}`]),s=await rre(Ye.join(e.prDir,"verify.log")),c=await Bi({gitRoot:e.resolved.gitRoot,workflowDir:Ye.join(e.resolved.gitRoot,n.paths.workflow_dir),tasksPath:n.paths.tasks_path,taskId:e.taskId,branchHeadSha:a,metaHeadSha:e.meta.head_sha??null,metaLastVerifiedSha:e.meta.last_verified_sha??null,metaVerifyStatus:e.meta.verify?.status??null,taskVerificationState:o.verification?.state??null,verifyLogText:s,requiresVerify:i});e.meta.last_verified_sha&&!c.verifyFresh&&e.output.warn(`Verify state stale: last_verified_sha=${e.meta.last_verified_sha} current_head=${a}; run \`agentplane verify ${e.taskId} --ok --by <ROLE> --note "Verified: ..."\` before integrating`);}async function Y0(e){try{let t=A(),r=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),{meta:n,prDir:o,resolved:i}=await di({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,mode:"update"});return n.branch&&await Fg({ctx:r,taskId:e.taskId,branch:n.branch}),await nre({output:t,ctx:r,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,prDir:o,resolved:i,meta:n}),t.success("pr update",Ye.relative(i.gitRoot,o)),0}catch(t){throw t instanceof m?t:E(t,{command:"pr update",root:e.rootOverride??null})}}var Q0=u(()=>{D();I();v();Ee();N();KR();$g();li();});var Do={};S(Do,{makeRunPrCheckHandler:()=>cre,makeRunPrCloseHandler:()=>lre,makeRunPrCloseSupersededHandler:()=>mre,makeRunPrHandler:()=>ire,makeRunPrNoteHandler:()=>dre,makeRunPrOpenHandler:()=>are,makeRunPrUpdateHandler:()=>sre,prCheckSpec:()=>pg,prCloseSpec:()=>Fi,prCloseSupersededSpec:()=>fg,prNoteSpec:()=>Rs,prOpenSpec:()=>Qd,prSpec:()=>Cs,prUpdateSpec:()=>ug});async function ore(e,t){oe({spec:Cs,cmd:t.cmd,subcommands:await ne(["pr"]),command:"pr"});}function ire(e){return ore}function are(e){return async(t,r)=>await K0({ctx:await e("pr open"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,author:r.author,branch:r.branch??void 0,syncOnly:r.syncOnly})}function sre(e){return async(t,r)=>await Y0({ctx:await e("pr update"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId})}function cre(e){return async(t,r)=>await M0({ctx:await e("pr check"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId})}function dre(e){return async(t,r)=>await G0({ctx:await e("pr note"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,author:r.author,body:r.body})}function lre(e){return async(t,r)=>await Mg({ctx:await e("pr close"),cwd:t.cwd,rootOverride:t.rootOverride,prNumber:r.prNumber,repo:r.repo,comment:r.comment,deleteRemoteBranch:r.deleteRemoteBranch})}function mre(e){return async(t,r)=>await L0({ctx:await e("pr close-superseded"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,deleteRemoteBranch:r.deleteRemoteBranch})}var No=u(()=>{Oe();gg();F0();q0();UR();V0();J0();Q0();gg();});var X0=u(()=>{vp();});function ure(e){return e.split(Ye.sep).join("/")}function eL(e){let t=ure(e);if(!(t.startsWith("src/")||t.includes("/src/")))return true;if(t.includes("/__snapshots__/"))return false;let n=Ye.posix.basename(t);return n.startsWith(".")?false:!/\.(?:test)\.[cm]?[jt]sx?$/u.test(n)}var tL=u(()=>{});function fre(e){return e.replaceAll("\\","/")}function gre(e){let t=fre(e);for(let r of pre)for(let n of r.watchedPaths){if(n==="src"){let o=`${r.packageRoot}/src/`;if(!t.startsWith(o))continue;let i=t.slice(r.packageRoot.length+1);return eL(i)}if(t===`${r.packageRoot}/${n}`)return true}return false}function XR(e){return e.some(t=>gre(t))}function Bg(e){return XR(e.changedPaths)?existsSync(Ye.join(e.gitRoot,"package.json"))&&existsSync(Ye.join(e.gitRoot,"packages","agentplane","package.json"))&&existsSync(Ye.join(e.gitRoot,"scripts","bootstrap-framework-dev.mjs")):false}function rL(){return "This merge changed watched runtime sources. Run `bun run framework:dev:bootstrap` before the next command so the repo-local build stays current."}function nL(e){return `This merge changed watched runtime sources and the automatic repo-local runtime refresh failed (${e}). Run \`bun run framework:dev:bootstrap\` manually before the next command.`}var pre,Lg=u(()=>{tL();pre=[{packageRoot:"packages/agentplane",watchedPaths:["src","bin/agentplane.js","bin/dist-guard.js","bin/runtime-context.js","bin/stale-dist-policy.js"]},{packageRoot:"packages/core",watchedPaths:["src"]}];});function Ht(e){let t=e?.trim()??"";return t.length>0?t:null}function qg(e){if(!e?.length)return;let t=e.map(r=>r.trim()).filter(r=>r.length>0);return t.length>0?t:void 0}function bre(e){if(e)return {kind:e.kind,status:e.status??void 0,local_mutation:e.local_mutation??void 0,finalize_via:e.finalize_via??void 0,pr_number:typeof e.pr_number=="number"&&e.pr_number>0?e.pr_number:null,pr_url:Ht(e.pr_url)??void 0,handoff_show_command:Ht(e.handoff_show_command)??void 0,base_pull_command:Ht(e.base_pull_command)??void 0}}function Xr(e){let t=Ye.join(e.git_root,e.workflow_dir,e.task_id,"handoff");return {handoff_dir:t,latest_path:Ye.join(t,"latest.json"),history_path:Ye.join(t,"history.jsonl")}}async function ZR(e){try{let t=await readFile(e.latest_path,"utf8");return validateTaskHandoff(JSON.parse(t))}catch(t){if(t?.code==="ENOENT")return null;throw t}}async function aL(e){let t=await ZR(e.paths);if(t)return t;throw new m({exitCode:4,code:"E_IO",message:`Task handoff artifact not found for ${e.task_id} (${e.paths.latest_path})`})}async function Ss(e){await mkdir(e.paths.handoff_dir,{recursive:true}),await ge(e.paths.latest_path,e.handoff),await appendFile(e.paths.history_path,`${JSON.stringify(e.handoff)}
587
+ `,"utf8");}async function sL(e){try{let{stdout:t}=await execFileAsync("git",["branch","--show-current"],{cwd:e,env:gitEnv()});return Ht(t)}catch{return null}}async function cL(e){let t=Ye.join(e.ctx.resolvedProject.gitRoot,e.ctx.config.paths.workflow_dir,e.task_id,"pr","meta.json");try{let r=JSON.parse(await readFile(t,"utf8"));return {branch:Ht(r.branch),base:Ht(r.base)}}catch(r){if(r?.code==="ENOENT")return {branch:null,base:null};throw r}}function Gg(e){return validateTaskHandoff({schema_version:1,task_id:e.task_id,created_at:e.created_at,from_role:e.from_role.trim(),to_role:Ht(e.to_role),reason:e.reason.trim(),note:Ht(e.note)??void 0,branch:Ht(e.branch),base_branch:Ht(e.base_branch),head_sha:Ht(e.head_sha),workspace_root:Ht(e.workspace_root),pr_branch:Ht(e.pr_branch),runner:e.runner,route:bre(e.route),next_actions:qg(e.next_actions),risks:qg(e.risks),open_questions:qg(e.open_questions),evidence_paths:qg(e.evidence_paths)})}function eC(e){let t=`agentplane task run ${e.task_id}`,r=e.run_id?`agentplane task run resume ${e.task_id} ${e.run_id}`:null,n=e.run_id?`agentplane task run retry ${e.task_id} ${e.run_id}`:null;return !e.run_id||!e.status?{next_action:"run",next_command:t,resume_command:null,retry_command:null}:e.status==="prepared"?{next_action:"resume",next_command:r,resume_command:r,retry_command:n}:e.status==="failed"||e.status==="cancelled"?{next_action:"retry",next_command:n,resume_command:r,retry_command:n}:e.status==="success"?{next_action:"none",next_command:null,resume_command:r,retry_command:n}:{next_action:"wait",next_command:null,resume_command:r,retry_command:n}}var Es=u(()=>{v();_e();});function Rre(){return new Date().toISOString()}async function lL(e){let t=A(),r=normalizeTaskStatus(e.task.status)==="DONE";if(!await P(e.prDir))throw new m({exitCode:3,code:"E_VALIDATION",message:`Missing PR artifact dir after merge: ${Ye.relative(e.gitRoot,e.prDir)}`});if(e.verifyEntries.length>0)for(let g of e.verifyEntries)await uA(e.verifyLogPath,g.header,g.content);let n=await readFile(e.metaPath,"utf8"),o=je(n,e.taskId),i=Rre(),a=ku({meta:o,branch:e.branch,base:e.base,mergeStrategy:e.mergeStrategy,mergeHash:e.mergeHash,branchHeadSha:e.branchHeadSha,at:i,verifyCommands:e.verifyCommands,shouldRunVerify:e.shouldRunVerify,alreadyVerifiedSha:e.alreadyVerifiedSha});await ge(e.metaPath,a);let s=await gitDiffStat(e.gitRoot,e.baseShaBeforeMerge,e.branch);await X(e.diffstatPath,s?`${s}
588
+ `:"");let c=e.verifyCommands.length===0?"skipped(no commands)":e.shouldRunVerify?"ran":e.alreadyVerifiedSha?`skipped(already verified_sha=${e.alreadyVerifiedSha})`:"skipped",d=`Verified: Integrated via ${e.mergeStrategy}; verify=${c}; pr=${Ye.relative(e.gitRoot,e.prDir)}.`,l=`integrate: ${e.mergeStrategy} ${e.branch}`;if(await kt({ctx:e.ctx,taskId:e.taskId,task:e.task,write:false}),!r){let g=await vn(e.gitRoot,e.mergeHash);await Wa({ctx:e.ctx,loadedTasks:[{taskId:e.taskId,task:e.task}],metaTaskId:e.taskId,author:"INTEGRATOR",body:d,force:false,resultProvided:true,resultSummary:l,riskLevel:void 0,breaking:false,taskCommitInfo:g});}let p=await kt({ctx:e.ctx,taskId:e.taskId,task:e.task,write:true});e.quiet||(t.info(wr(p.plan,{wrote:p.wrote,context:"finish",promotedIds:p.plan.promotable.map(g=>g.entry.id),registryPaths:p.registryPaths})),r&&t.info("task already DONE; integrating only missing PR metadata and close artifacts")),await Sn({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,baseBranchOverride:e.base,quiet:e.quiet,allowPolicy:p.wrote,closeRefreshTaskArtifacts:false}),e.quiet||t.success("integrate",e.taskId,`merge=${e.mergeHash.slice(0,12)}`);}var mL=u(()=>{ee();I();v();_e();nt();le();cd();xn();});function Cre(e){return Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.trim()).filter(Boolean):[]}function Vg(e){let t=Cre(e.rawVerify),r=null;if(t.length>0){let o=typeof e.metaLastVerifiedSha=="string"?e.metaLastVerifiedSha:null;if(o&&o===e.branchHeadSha)r=e.branchHeadSha;else if(e.verifyLogText){let i=yu(e.verifyLogText);i&&i===e.branchHeadSha&&(r=i);}}let n=e.runVerify||t.length>0&&r===null;return {verifyCommands:t,alreadyVerifiedSha:r,shouldRunVerify:n}}async function Ug(e){let t=[];for(let r of e.commands){e.quiet||uL.line(`$ ${r}`);let n=new Date().toISOString(),o=await pA(r,e.worktreePath),i=e.branchHeadSha?`sha=${e.branchHeadSha} `:"";if(t.push({header:`[${n}] ${i}$ ${r}`.trimEnd(),content:o.output}),o.code!==0)throw new m({exitCode:k("E_IO"),code:"E_IO",message:`Verify command failed: ${r}`,context:{commandExitCode:o.code||1}})}return e.branchHeadSha&&t.push({header:`[${new Date().toISOString()}] \u2705 verified_sha=${e.branchHeadSha}`,content:""}),e.quiet||uL.success("verify passed",e.taskId),t}var uL,Wg=u(()=>{nt();I();G();v();uL=A();});function gL(e){return {...gitEnv(),AGENTPLANE_TASK_ID:e,AGENTPLANE_ALLOW_BASE:"1",AGENTPLANE_ALLOW_TASKS:"1",AGENTPLANE_ALLOW_CONFIG:"1",AGENTPLANE_DEV_ALLOW_STALE_DIST:"1"}}function Tre(e){let t=e.replaceAll("\\","/");return t.startsWith(".agentplane/tasks/")||t.startsWith("tasks/")}function hL(e){let t=extractTaskSuffix(e.taskId);return fo({id:e.taskId,title:e.taskTitle,tags:e.taskTags}).replace(new RegExp(String.raw` \(${t}\)$`,"u"),"")}async function Sre(e){let{stdout:t}=await execFileAsync("git",["status","--short","--untracked-files=all","--",e.taskPrefix],{cwd:e.gitRoot,env:gitEnv()});return t.split(`
589
+ `).map(r=>r.trim()).filter(r=>r.startsWith("?? ")).map(r=>r.slice(3).trim()).filter(Boolean)}async function Ere(e){let{stdout:t}=await execFileAsync("git",["show","--name-only","--format=",e.revision],{cwd:e.gitRoot,env:gitEnv()});return t.split(`
590
+ `).map(r=>r.trim()).filter(Boolean)}async function rC(e){let t=`${e.workflowDir.replaceAll("\\","/")}/${e.taskId}`,r=e.changedPaths.filter(d=>d===t||d.startsWith(`${t}/`));if(r.length===0)return {moved:[],restore:zg,cleanup:zg};let o=(await Sre({gitRoot:e.gitRoot,taskPrefix:t})).filter(d=>r.includes(d));if(o.length===0)return {moved:[],restore:zg,cleanup:zg};let i=Ye.join(e.gitRoot,".agentplane","tmp","integrate-backups",`${e.taskId}-${Date.now()}`),a=Ye.dirname(i),s=Ye.dirname(a),c=[];for(let d of o){let l=Ye.join(e.gitRoot,d),p=Ye.join(i,d);await mkdir(Ye.dirname(p),{recursive:true}),await rename(l,p),c.push({relativePath:d,backupPath:p});}return {moved:c,restore:async()=>{for(let d of c.toReversed())await mkdir(Ye.dirname(Ye.join(e.gitRoot,d.relativePath)),{recursive:true}),await rename(d.backupPath,Ye.join(e.gitRoot,d.relativePath));await rm$1(i,{recursive:true,force:true}).catch(()=>null),await rm$1(a).catch(()=>null),await rm$1(s).catch(()=>null);},cleanup:async()=>{await rm$1(i,{recursive:true,force:true}).catch(()=>null),await rm$1(a).catch(()=>null),await rm$1(s).catch(()=>null);}}}async function kL(e){let t=await rC({gitRoot:e.gitRoot,workflowDir:e.workflowDir,taskId:e.taskId,changedPaths:e.changedPaths});try{await execFileAsync("git",["merge","--squash",e.branch],{cwd:e.gitRoot,env:gitEnv()});}catch(c){await execFileAsync("git",["reset","--hard",e.headBeforeMerge],{cwd:e.gitRoot,env:gitEnv()}),await t.restore();let d=c instanceof Error?c.message:"git merge --squash failed";throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:d})}let{stdout:r}=await execFileAsync("git",["diff","--cached","--name-only"],{cwd:e.gitRoot,env:gitEnv()});if(!r.trim())throw await execFileAsync("git",["reset","--hard",e.headBeforeMerge],{cwd:e.gitRoot,env:gitEnv()}),await t.restore(),new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:`Nothing to integrate: ${e.branch} is already merged into ${e.base}`});let{stdout:n}=await execFileAsync("git",["log","-1","--pretty=format:%s",e.branch],{cwd:e.gitRoot,env:gitEnv()}),o=n.trim(),a=!validateCommitSubject({subject:o,taskId:e.taskId,genericTokens:e.genericTokens}).ok;if(!a){let c=await Ere({gitRoot:e.gitRoot,revision:e.branch});a=c.length>0&&c.every(d=>Tre(d));}a&&(o=`\u{1F9E9} ${extractTaskSuffix(e.taskId)} integrate: ${hL(e)}`);let s=gL(e.taskId);try{await execFileAsync("git",["commit","-m",o],{cwd:e.gitRoot,env:s});}catch(c){await execFileAsync("git",["reset","--hard",e.headBeforeMerge],{cwd:e.gitRoot,env:gitEnv()}),await t.restore();let d=c instanceof Error?c.message:"git commit failed";throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:d})}return await t.cleanup(),await gitRevParse(e.gitRoot,["HEAD"])}async function yL(e){let t=extractTaskSuffix(e.taskId),r=await rC({gitRoot:e.gitRoot,workflowDir:e.workflowDir,taskId:e.taskId,changedPaths:e.changedPaths}),n=gL(e.taskId);try{await execFileAsync("git",["merge","--no-ff",e.branch,"-m",`\u{1F500} ${t} integrate: ${hL(e)}`],{cwd:e.gitRoot,env:n});}catch(o){await execFileAsync("git",["merge","--abort"],{cwd:e.gitRoot,env:gitEnv()}),await r.restore();let i=o instanceof Error?o.message:"git merge failed";throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:i})}return await r.cleanup(),await gitRevParse(e.gitRoot,["HEAD"])}async function wL(e){try{await execFileAsync("git",["rebase",e.base],{cwd:e.worktreePath,env:gitEnv()});}catch(s){await execFileAsync("git",["rebase","--abort"],{cwd:e.worktreePath,env:gitEnv()});let c=s instanceof Error?s.message:"git rebase failed";throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:c})}let t=await gitRevParse(e.gitRoot,[e.branch]),r=e.alreadyVerifiedSha,n=e.shouldRunVerify;!e.runVerify&&e.verifyCommands.length>0&&({alreadyVerifiedSha:r,shouldRunVerify:n}=Vg({rawVerify:e.rawVerify,metaLastVerifiedSha:e.metaSource?.last_verified_sha??null,verifyLogText:e.verifyLogText,branchHeadSha:t,runVerify:false}));let o=[];n&&e.verifyCommands.length>0&&o.push(...await Ug({commands:e.verifyCommands,worktreePath:e.worktreePath,branchHeadSha:t,quiet:e.quiet,taskId:e.taskId}));let i=await rC({gitRoot:e.gitRoot,workflowDir:e.workflowDir,taskId:e.taskId,changedPaths:e.changedPaths});try{await execFileAsync("git",["merge","--ff-only",e.branch],{cwd:e.gitRoot,env:gitEnv()});}catch(s){await execFileAsync("git",["reset","--hard",e.headBeforeMerge],{cwd:e.gitRoot,env:gitEnv()}).catch(()=>null),await i.restore();let c=s instanceof Error?s.message:"git merge --ff-only failed";throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:c})}let a=await gitRevParse(e.gitRoot,["HEAD"]);return t=await gitRevParse(e.gitRoot,[e.branch]),await i.cleanup(),{mergeHash:a,branchHeadSha:t,verifyEntries:o,alreadyVerifiedSha:r,shouldRunVerify:n}}var zg,bL=u(()=>{G();v();Ee();si();Wg();zg=()=>Promise.resolve();});function Are(e){if(e instanceof Error){let t=e.message.trim();return t.length>0?t:e.name}return String(e)}function Ore(e){return existsSync(Ye.join(e,"node_modules"))&&existsSync(Ye.join(e,"packages","agentplane","node_modules"))&&existsSync(Ye.join(e,"packages","agentplane","dist","cli.js"))}async function _L(e){if(Ore(e.gitRoot))return {status:"not-needed"};if(!Bg(e))return {status:"skipped"};try{return await execFileAsync("bun",["run","framework:dev:bootstrap"],{cwd:e.gitRoot,env:{...process.env},maxBuffer:50*1024*1024}),{status:"ran"}}catch(t){return {status:"failed",error:Are(t)}}}var vL=u(()=>{Lg();});function Nre(e){if(e instanceof Error){let t=e.message.trim();return t.length>0?t:e.name}return String(e)}async function xL(e){if(!Bg(e))return {status:"skipped"};try{return await execFileAsync("bun",["run","framework:dev:bootstrap"],{cwd:e.gitRoot,env:{...process.env},maxBuffer:50*1024*1024}),{status:"ran"}}catch(t){return {status:"failed",error:Nre(t)}}}var RL=u(()=>{Lg();});async function iC(e){let t=Mc,{prDir:r}=e,n=Ye.join(r,"diffstat.txt"),o=Ye.join(r,"verify.log"),i=Ye.join(r,"review.md"),a=await findWorktreeForBranch(e.resolved.gitRoot,e.branch),s=[],c=Ye.relative(e.resolved.gitRoot,n),d=Ye.relative(e.resolved.gitRoot,o),l=Ye.relative(e.resolved.gitRoot,i);await t({resolved:e.resolved,prDir:r,fileName:"diffstat.txt",branch:e.branch,worktreePath:a})===null&&s.push(`Missing ${c}`);let g=await t({resolved:e.resolved,prDir:r,fileName:"verify.log",branch:e.branch,worktreePath:a});g===null&&s.push(`Missing ${d}`);let h=await t({resolved:e.resolved,prDir:r,fileName:"review.md",branch:e.branch,worktreePath:a});if(h===null&&s.push(`Missing ${l}`),h&&Lc(h,s),s.length>0)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:s.join(`
591
+ `)});return {verifyLogText:g}}async function CL(e){let t=$r,{prDir:r}=e,n=Ye.join(r,"diffstat.txt"),o=Ye.join(r,"verify.log"),i=Ye.join(r,"review.md"),a=Ye.join(r,"meta.json"),s=[],c=Ye.relative(e.resolved.gitRoot,a),d=Ye.relative(e.resolved.gitRoot,n),l=Ye.relative(e.resolved.gitRoot,o),p=Ye.relative(e.resolved.gitRoot,i);await t({resolved:e.resolved,prDir:r,fileName:"meta.json",branch:e.branch})===null&&s.push(`Missing committed ${c} on branch ${e.branch}`),await t({resolved:e.resolved,prDir:r,fileName:"diffstat.txt",branch:e.branch})===null&&s.push(`Missing committed ${d} on branch ${e.branch}`),await t({resolved:e.resolved,prDir:r,fileName:"verify.log",branch:e.branch})===null&&s.push(`Missing committed ${l} on branch ${e.branch}`);let b=await t({resolved:e.resolved,prDir:r,fileName:"review.md",branch:e.branch});if(b===null?s.push(`Missing committed ${p} on branch ${e.branch}`):Lc(b,s),s.length>0)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`Task branch ${e.branch} is missing committed PR artifacts required for integrate.
592
+ ${s.join(`
593
+ `)}
594
+ Commit the task README/PR artifacts on the task branch (for example via \`agentplane pr open\` + git add/commit) before rerunning integrate.`})}var PL=u(()=>{G();v();wn();si();});async function TL(e){try{let t=await go(e.gitRoot);return (await jt(e.gitRoot,[`repos/${t}/branches/${e.baseBranch}/protection`])).required_pull_request_reviews!==void 0}catch{return false}}var SL=u(()=>{ho();});async function IL(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=t.resolvedProject,n=t.config;if(n.workflow_mode!=="branch_pr")throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:Jt(n.workflow_mode,"branch_pr")});if(await Ac({cwd:e.cwd,rootOverride:e.rootOverride}),e.base?.trim().length===0)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Invalid value for --base."});let o=await resolveBaseBranch({cwd:e.cwd,rootOverride:e.rootOverride??null,cliBaseOpt:e.base??null,mode:n.workflow_mode});if(!o)throw new m({exitCode:k("E_USAGE"),code:"E_USAGE",message:"Base branch could not be resolved (use `agentplane branch base set` or --base)."});let i=await gitCurrentBranch(r.gitRoot),{prDir:a,metaPath:s,diffstatPath:c,verifyLogPath:d}=await ht({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId}),l=null,p=(e.branch??"").trim();if(await P(s)&&(l=Aa(await readFile(s,"utf8"),e.taskId),p||(p=(l.branch??"").trim())),!p){let U=await sc({ctx:t,taskId:e.taskId});U&&(p=U);}if(!p)throw new m({exitCode:2,code:"E_USAGE",message:"Branch could not be resolved (use --branch or run `agentplane pr open`)."});if(!await gitBranchExists(r.gitRoot,p))throw new m({exitCode:2,code:"E_USAGE",message:Le("branch",p)});if(i!==o){if(i===p){let U=await findWorktreeForBranch(r.gitRoot,o),J=U&&U.trim().length>0?`agentplane integrate ${e.taskId} --branch ${p} --root ${U}`:`git checkout ${o} && agentplane integrate ${e.taskId} --branch ${p}`;throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`integrate must run from the ${o} base checkout, not from task branch ${p}. Rerun it against the base checkout after leaving this task worktree.`,context:we({command:"integrate",task_id:e.taskId,branch:p,base_branch:o,current_branch:i,...U?{base_worktree_path:U}:{},reason_code:"integrate_base_checkout_required"},{state:`integrate was invoked from task branch ${p} instead of base branch ${o}`,likelyCause:"the operator is inside the task worktree, but branch_pr integrate is only valid from the registered base checkout",hint:"Use the base checkout/worktree for the resolved base branch, not the task branch worktree, when running integrate.",nextAction:{command:J,reason:"rerun integrate against the base checkout route",reasonCode:"integrate_base_checkout_required"}})})}throw new m({exitCode:k("E_GIT"),code:"E_GIT",message:`integrate must run on base branch ${o} (current: ${i})`})}await CL({resolved:r,prDir:a,branch:p});let g=await findWorktreeForBranch(r.gitRoot,p),h=await Mc({resolved:r,prDir:a,fileName:"meta.json",branch:p,worktreePath:g});if(!h)throw new m({exitCode:4,code:"E_IO",message:`PR artifacts missing: ${Ye.relative(r.gitRoot,s)} (run \`agentplane pr open\`)`});let f=Aa(h,e.taskId),b=e.base??f.base??o,w=typeof b=="string"&&b.trim().length>0?b.trim():o,{verifyLogText:_}=await iC({resolved:r,prDir:a,branch:p,taskId:e.taskId}),x=_,C=await ue({ctx:t,taskId:e.taskId,preferBranchSnapshot:true,branchSnapshotBranch:p}),j=await TL({gitRoot:r.gitRoot,baseBranch:w}),T=await gitDiffNames(r.gitRoot,w,p),M=n.paths.tasks_path;if(T.includes(M))throw new m({exitCode:5,code:"E_GIT",message:`Branch ${p} modifies ${M} (single-writer violation)`});let $=await gitRevParse(r.gitRoot,[p]),W=await Bi({gitRoot:r.gitRoot,workflowDir:n.paths.workflow_dir,tasksPath:n.paths.tasks_path,taskId:e.taskId,branchHeadSha:$,metaHeadSha:f.head_sha??null,metaLastVerifiedSha:f.last_verified_sha??null,metaVerifyStatus:f.verify?.status??null,taskVerificationState:C.verification?.state??null,verifyLogText:x,requiresVerify:!!(C.verify&&C.verify.length>0)});if(!W.reviewFresh&&g){await ko({cwd:g,taskId:e.taskId,branch:p});let U=await Mc({resolved:r,prDir:a,fileName:"meta.json",branch:p,worktreePath:g});if(U){let J=Aa(U,e.taskId);x=(await iC({resolved:r,prDir:a,branch:p,taskId:e.taskId})).verifyLogText??x,W=await Bi({gitRoot:r.gitRoot,workflowDir:n.paths.workflow_dir,tasksPath:n.paths.tasks_path,taskId:e.taskId,branchHeadSha:$,metaHeadSha:J.head_sha??null,metaLastVerifiedSha:J.last_verified_sha??null,metaVerifyStatus:J.verify?.status??null,taskVerificationState:C.verification?.state??null,verifyLogText:x,requiresVerify:!!(C.verify&&C.verify.length>0)}),l=J,f=J;}}if(!W.reviewFresh)throw new m({exitCode:k("E_VALIDATION"),code:"E_VALIDATION",message:`PR artifacts stale for ${e.taskId}: meta.head_sha=${f.head_sha??"<missing>"} current_head=${$} (refresh the task branch artifacts before integrate)`});mi(C,n),Vc(C,n);let Z=Vg({rawVerify:C.verify,metaLastVerifiedSha:W.effectiveVerifiedSha,verifyLogText:x,branchHeadSha:$,runVerify:e.runVerify});return {ctx:t,resolved:r,loadedConfig:n,task:C,baseBranch:o,currentBranch:i,protectedBaseRequiresPrMerge:j,prDir:a,metaPath:s,diffstatPath:c,verifyLogPath:d,meta:l,metaSource:f,branch:p,base:w,verifyLogText:x,branchHeadSha:$,changedPaths:T,verifyCommands:Z.verifyCommands,alreadyVerifiedSha:Z.alreadyVerifiedSha,shouldRunVerify:Z.shouldRunVerify}}var AL=u(()=>{ee();G();I();Et();v();_i();Ee();N();le();wn();li();PL();Wg();nt();$g();SL();});async function NL(e){let t=null,r=false,n=await findWorktreeForBranch(e.gitRoot,e.branch);if(e.mergeStrategy==="rebase"&&!n)throw new m({exitCode:2,code:"E_USAGE",message:"rebase strategy requires an existing worktree for the task branch"});if(e.shouldRunVerify&&!n){let o=Ye.resolve(e.gitRoot,e.worktreesDirRel);if(!yt(e.gitRoot,o))throw new m({exitCode:5,code:"E_GIT",message:`worktrees_dir must be inside the repo: ${o}`});if(t=Ye.join(o,`_integrate_tmp_${e.taskId}`),await P(t)){if(!await findWorktreeForBranch(e.gitRoot,e.branch))throw new m({exitCode:5,code:"E_GIT",message:`Temp worktree path exists but is not registered: ${t}`})}else await mkdir(o,{recursive:true}),await execFileAsync("git",["worktree","add",t,e.branch],{cwd:e.gitRoot,env:gitEnv()}),r=true;n=t;}return {worktreePath:n,tempWorktreePath:t,createdTempWorktree:r}}var jL=u(()=>{ee();v();Pn();});async function Ure(e){let t=Xr({git_root:e.ctx.resolvedProject.gitRoot,workflow_dir:e.ctx.config.paths.workflow_dir,task_id:e.taskId}),r=`agentplane task handoff show ${e.taskId}`,n=typeof e.prNumber=="number"&&e.prNumber>0?`GitHub PR #${e.prNumber}`:`the GitHub PR for branch ${e.branch}`,o=e.prUrl?.trim()??"",i=Ye.join(e.ctx.config.paths.workflow_dir,e.taskId,"pr","meta.json"),a=Ye.join(e.ctx.config.paths.workflow_dir,e.taskId,"README.md");await Ss({paths:t,handoff:Gg({task_id:e.taskId,created_at:new Date().toISOString(),from_role:"INTEGRATOR",reason:`Protected base ${e.base} requires GitHub pull-request merges.`,note:o.length>0?`Merge ${n}: ${o}. After GitHub merge, wait for Task Hosted Close, then pull ${e.base}.`:`Merge ${n} on GitHub. After GitHub merge, wait for Task Hosted Close, then pull ${e.base}.`,branch:e.branch,base_branch:e.base,head_sha:e.branchHeadSha,workspace_root:e.ctx.resolvedProject.gitRoot,pr_branch:e.branch,route:{kind:"protected_base_integrate",status:"awaiting_github_merge",local_mutation:"not_performed",finalize_via:"github_pr_merge_then_hosted_close",pr_number:e.prNumber,pr_url:o.length>0?o:null,handoff_show_command:r,base_pull_command:"git pull --ff-only"},next_actions:[r,o.length>0?`Merge ${n}: ${o}`:`Merge ${n} on GitHub`,"Wait for Task Hosted Close to finish","git pull --ff-only"],evidence_paths:[a,i]})});}async function $L(e){let t=null,r=false,n=A();try{let o=await IL({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:e.taskId,branch:e.branch,base:e.base,runVerify:e.runVerify}),{resolved:i,loadedConfig:a,task:s,prDir:c,metaPath:d,diffstatPath:l,verifyLogPath:p,metaSource:g,branch:h,base:f,verifyLogText:b,protectedBaseRequiresPrMerge:w}=o,_=o.verifyCommands,x=o.alreadyVerifiedSha,C=o.shouldRunVerify,j=o.branchHeadSha,T=o.changedPaths;if(e.dryRun)return e.quiet||n.success("integrate dry-run",s.id,`base=${f} branch=${h} verify=${C?"yes":"no"} route=${w?"github-pr":"local"}`),0;if(w){let Y=typeof g.pr_number=="number"&&g.pr_number>0?g.pr_number:null,Re=typeof g.pr_url=="string"?g.pr_url:null,Ue=Y===null?`the GitHub PR for branch ${h}`:`GitHub PR #${Y}`;throw await Ure({ctx:o.ctx,taskId:s.id,branch:h,base:f,branchHeadSha:j,prNumber:Y,prUrl:Re}),new m({exitCode:k("E_HANDOFF"),code:"E_HANDOFF",message:`Base branch ${f} requires GitHub pull-request merges; integrate will not mutate it locally. Merge ${Ue} on GitHub, let Task Hosted Close finish the closure tail, then pull ${f}.`,context:we({task_id:s.id,branch:h,base_branch:f,reason_code:"protected_base_integrate_handoff"},{state:`protected-base integrate routed to GitHub merge handoff for ${s.id}`,likelyCause:`base branch ${f} is protected by a GitHub pull-request merge policy, so local integrate must stop before mutating ${f}`,hint:"Inspect the persisted handoff artifact for the canonical finalize route, then merge the PR on GitHub and let Task Hosted Close finish the close tail.",nextAction:{command:`agentplane task handoff show ${s.id}`,reason:"inspect the persisted protected-base finalize route before continuing",reasonCode:"protected_base_integrate_handoff"}})})}let M=await NL({gitRoot:i.gitRoot,worktreesDirRel:a.paths.worktrees_dir,branch:h,taskId:s.id,mergeStrategy:e.mergeStrategy,shouldRunVerify:C}),$=M.worktreePath;t=M.tempWorktreePath,r=M.createdTempWorktree;let W=[];if(e.mergeStrategy!=="rebase"&&C&&_.length>0){if(!$)throw new m({exitCode:2,code:"E_USAGE",message:"Unable to locate or create a worktree for verify execution"});W.push(...await Ug({commands:_,worktreePath:$,branchHeadSha:j,quiet:e.quiet,taskId:s.id}));}let Z=await _L({gitRoot:i.gitRoot,changedPaths:T});if(Z.status==="failed")throw new m({exitCode:8,code:"E_RUNTIME",message:`Unable to prepare the base worktree for integrate: automatic repo-local runtime refresh failed (${Z.error}). Run \`bun run framework:dev:bootstrap\` in ${i.gitRoot} and retry integrate.`});let U=await gitRevParse(i.gitRoot,[f]),J=await gitRevParse(i.gitRoot,["HEAD"]),pe="";if(e.mergeStrategy==="squash")pe=await kL({gitRoot:i.gitRoot,base:f,branch:h,headBeforeMerge:J,taskId:s.id,taskTitle:s.title,taskTags:s.tags,workflowDir:a.paths.workflow_dir,changedPaths:T,genericTokens:a.commit.generic_tokens});else if(e.mergeStrategy==="merge")pe=await yL({gitRoot:i.gitRoot,branch:h,taskId:s.id,taskTitle:s.title,taskTags:s.tags,workflowDir:a.paths.workflow_dir,changedPaths:T});else {if(!$)throw new m({exitCode:2,code:"E_USAGE",message:"rebase strategy requires an existing worktree for the task branch"});let Y=await wL({gitRoot:i.gitRoot,worktreePath:$,base:f,branch:h,headBeforeMerge:J,rawVerify:s.verify,metaSource:g??null,verifyLogText:b,runVerify:e.runVerify,verifyCommands:_,alreadyVerifiedSha:x,shouldRunVerify:C,quiet:e.quiet,taskId:s.id,workflowDir:a.paths.workflow_dir,changedPaths:T});pe=Y.mergeHash,j=Y.branchHeadSha,x=Y.alreadyVerifiedSha,C=Y.shouldRunVerify,W.push(...Y.verifyEntries);}await lL({ctx:o.ctx,task:s,cwd:e.cwd,rootOverride:e.rootOverride,gitRoot:i.gitRoot,prDir:c,metaPath:d,diffstatPath:l,verifyLogPath:p,taskId:s.id,branch:h,base:f,mergeStrategy:e.mergeStrategy,mergeHash:pe,branchHeadSha:j,baseShaBeforeMerge:U,verifyEntries:W,verifyCommands:_,alreadyVerifiedSha:x,shouldRunVerify:C,quiet:e.quiet});let ye=await wi({gitRoot:i.gitRoot,branch:h,worktreePathHint:$});if(ye.removedWorktree&&ye.worktreePath&&t&&Ye.resolve(ye.worktreePath)===Ye.resolve(t)&&(t=null,r=!1),XR(T)){let Y=await xL({gitRoot:i.gitRoot,changedPaths:T});e.quiet||(Y.status==="skipped"?n.warn(rL()):Y.status==="failed"&&n.warn(nL(Y.error)));}return 0}catch(o){throw o instanceof m?o:E(o,{command:"integrate",root:e.rootOverride??null})}finally{if(r&&t)try{await execFileAsync("git",["worktree","remove","--force",t],{cwd:e.cwd,env:gitEnv()});}catch{}}}var ML=u(()=>{D();G();I();Et();v();X0();Lg();Ee();Es();mL();bL();vL();RL();AL();jL();Wg();});var FL={};S(FL,{makeRunIntegrateHandler:()=>Wre});function Wre(e){return async(t,r)=>await $L({ctx:await e("integrate"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,branch:r.branch??void 0,base:r.base??void 0,mergeStrategy:r.mergeStrategy,runVerify:r.runVerify,dryRun:r.dryRun,quiet:r.quiet})}var BL=u(()=>{ML();});var LL,qL,HL,GL,VL,UL,WL,zL,KL,JL,Jg,YL,QL,XL,ZL,eq,tq,rq,nq,oq,iq,aq,sq,cq,dq,lq,mq,uq,pq,fq,gq,hq,kq,yq,wq,bq=u(()=>{Nn();LL=L(()=>Promise.resolve().then(()=>(MR(),v0))),qL=L(()=>Promise.resolve().then(()=>(oR(),c0))),HL=L(()=>Promise.resolve().then(()=>(zx(),o0))),GL=L(()=>Promise.resolve().then(()=>(DR(),b0))),VL=L(()=>Promise.resolve().then(()=>(AR(),w0))),UL=L(()=>Promise.resolve().then(()=>(fR(),m0))),WL=L(()=>Promise.resolve().then(()=>(bR(),p0))),zL=L(()=>Promise.resolve().then(()=>($R(),_0))),KL=L(()=>Promise.resolve().then(()=>(sR(),d0))),JL=L(()=>Promise.resolve().then(()=>(N0(),D0))),Jg=L(()=>Promise.resolve().then(()=>(Jd(),dg))),YL=L(()=>Promise.resolve().then(()=>(Vx(),t0))),QL=e=>Promise.resolve().then(()=>(Ux(),r0)).then(t=>t.makeRunWorkStartHandler(e.getCtx)),XL=L(()=>Promise.resolve().then(()=>(Qx(),i0))),ZL=L(()=>Promise.resolve().then(()=>(xR(),f0))),eq=()=>Promise.resolve().then(()=>(kR(),u0)).then(e=>e.runRecipesExplainActive),tq=L(()=>Promise.resolve().then(()=>(lR(),l0))),rq=L(()=>Promise.resolve().then(()=>(LR(),x0))),nq=L(()=>Promise.resolve().then(()=>(nR(),s0))),oq=L(()=>Promise.resolve().then(()=>(Jd(),dg))),iq=L(()=>Promise.resolve().then(()=>(Jd(),dg))),aq=L(()=>Promise.resolve().then(()=>(Hx(),e0))),sq=e=>Promise.resolve().then(()=>(xs(),zd)).then(t=>t.makeRunBackendHandler(e.getCtx)),cq=e=>Promise.resolve().then(()=>(xs(),zd)).then(t=>t.makeRunBackendSyncHandler(e.getCtx)),dq=e=>Promise.resolve().then(()=>(xs(),zd)).then(t=>t.makeRunBackendInspectHandler(e.getCtx)),lq=e=>Promise.resolve().then(()=>(xs(),zd)).then(t=>t.makeRunBackendMigrateCanonicalStateHandler(e.getCtx)),mq=e=>Promise.resolve().then(()=>(jx(),ZB)).then(t=>t.makeRunSyncHandler(e.getCtx)),uq=e=>Promise.resolve().then(()=>(No(),Do)).then(t=>t.makeRunPrHandler(e.getCtx)),pq=e=>Promise.resolve().then(()=>(No(),Do)).then(t=>t.makeRunPrOpenHandler(e.getCtx)),fq=e=>Promise.resolve().then(()=>(No(),Do)).then(t=>t.makeRunPrUpdateHandler(e.getCtx)),gq=e=>Promise.resolve().then(()=>(No(),Do)).then(t=>t.makeRunPrCheckHandler(e.getCtx)),hq=e=>Promise.resolve().then(()=>(No(),Do)).then(t=>t.makeRunPrCloseHandler(e.getCtx)),kq=e=>Promise.resolve().then(()=>(No(),Do)).then(t=>t.makeRunPrCloseSupersededHandler(e.getCtx)),yq=e=>Promise.resolve().then(()=>(No(),Do)).then(t=>t.makeRunPrNoteHandler(e.getCtx)),wq=e=>Promise.resolve().then(()=>(BL(),FL)).then(t=>t.makeRunIntegrateHandler(e.getCtx));});var _q,vq=u(()=>{jx();xs();Jd();Hx();Vx();Ux();n0();gg();zx();Qx();nR();oR();sR();lR();fR();kR();bR();xR();RR();AR();DR();$R();MR();LR();Nn();bq();_q=[B(Yd,{load:QL}),LL(Dg,"runRecipes",{needs:"none"}),qL(yg,"runRecipesCache",{needs:"none"}),HL(Wx,"runRecipesAdd",{}),XL(Yx,"runRecipesActive"),GL(Ag,"runRecipesList",{needs:"none"}),VL(IR,"runRecipesListRemote",{}),ZL(vR,"runRecipesInfo",{needs:"none"}),UL(pR,"runRecipesExplain",{}),B(hR,{load:eq}),WL(wR,"runRecipesEnable",{}),tq(dR,"runRecipesDisable"),zL(jR,"runRecipesRemove",{}),rq(BR,"runRecipesUpdate"),KL(aR,"runRecipesDetach",{}),nq(rR,"runRecipesCachePrune"),JL(Ps,"runRecipesInstall",{needs:"none"}),Jg(cg,"runBranchBase",{needs:"none"}),Jg(Bx,"runBranchBaseGet",{}),oq(Kd,"runBranchBaseSet"),Jg(Lx,"runBranchBaseClear",{}),iq(qx,"runBranchBaseExplain"),YL(Gx,"runBranchStatus",{}),aq(lg,"runBranchRemove"),B(sg,{load:sq,needs:"none"}),B($x,{load:cq}),B(Fx,{load:dq}),B(Mx,{load:lq}),B(Nx,{load:mq}),B(Cs,{load:uq,needs:"none"}),B(Qd,{load:pq}),B(ug,{load:fq}),B(pg,{load:gq}),B(Fi,{load:hq}),B(fg,{load:kq}),B(Rs,{load:yq}),B(mg,{load:wq})];});var xq={};S(xq,{makeRunTaskAddHandler:()=>Kre,taskAddSpec:()=>As});function Kre(e){return async(t,r)=>await sp({ctx:await e("task add"),cwd:t.cwd,rootOverride:t.rootOverride,taskIds:r.taskIds,title:r.title,description:r.description,status:r.status,priority:r.priority,owner:r.owner,tags:r.tags,dependsOn:r.dependsOn,verify:r.verify,commentAuthor:r.commentAuthor,commentBody:r.commentBody})}var As,aC=u(()=>{H();nr();xb();le();As={id:["task","add"],group:"Task",summary:"Create one or more tasks with explicit ids (prints the created task ids).",args:[{name:"task-id",required:true,variadic:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"title",valueHint:"<text>",required:true,description:"Title."},{kind:"string",name:"description",valueHint:"<text>",required:true,description:"Description."},{kind:"string",name:"status",valueHint:"<TODO|DOING|DONE|BLOCKED>",choices:[...TASK_STATUS_VALUES],default:"TODO",description:"Initial status (default: TODO)."},{kind:"string",name:"priority",valueHint:"<low|normal|med|high>",choices:["low","normal","med","high"],required:true,description:"Task priority."},{kind:"string",name:"owner",valueHint:"<id>",required:true,description:"Owner id (e.g. CODER)."},{kind:"string",name:"tag",valueHint:"<tag>",repeatable:true,minCount:1,description:"Repeatable. Adds a tag (must provide at least one)."},{kind:"string",name:"depends-on",valueHint:"<task-id>",repeatable:true,coerce:e=>ri(e),description:"Repeatable. Adds a dependency. Special-case: '[]' is treated as empty."},{kind:"string",name:"verify",valueHint:"<command>",repeatable:true,description:"Repeatable. Verification commands/checks to run for this task."},{kind:"string",name:"comment-author",valueHint:"<id>",description:"Optional. Adds a comment author (requires --comment-body)."},{kind:"string",name:"comment-body",valueHint:"<text>",description:"Optional. Adds a comment body (requires --comment-author)."}],examples:[{cmd:'agentplane task add 202602030608-F1Q8AB --title "Refactor CLI" --description "Spec-driven CLI" --priority med --owner CODER --tag cli',why:"Create a task with an explicit id."},{cmd:'agentplane task add 202602030608-F1Q8AB 202602030608-ZZZZZZ --title "Refactor CLI" --description "Spec-driven CLI" --priority med --owner CODER --tag cli',why:"Create multiple tasks with shared metadata."}],validateRaw:e=>{for(let a of ["title","description","owner"]){let s=e.opts[a];if(typeof s=="string"&&s.trim()==="")throw y({spec:As,message:`Invalid value for --${a}: empty.`})}if(Q(e.opts.tag).some(a=>a.trim()===""))throw y({spec:As,message:"Invalid value for --tag: empty."});let r=e.opts["comment-author"],n=e.opts["comment-body"],o=typeof r=="string"&&r.trim()!=="",i=typeof n=="string"&&n.trim()!=="";if(o!==i)throw y({spec:As,message:"Both --comment-author and --comment-body must be provided together."})},parse:e=>{let t=Array.isArray(e.args["task-id"])?e.args["task-id"].map(String):[],r=Q(e.opts.tag),n=Q(e.opts["depends-on"]),o=Q(e.opts.verify),i=typeof e.opts["comment-author"]=="string"?e.opts["comment-author"]:null,a=typeof e.opts["comment-body"]=="string"?e.opts["comment-body"]:null;return {taskIds:t,title:String(e.opts.title),description:String(e.opts.description),status:e.opts.status??"TODO",priority:e.opts.priority,owner:String(e.opts.owner),tags:r,dependsOn:n,verify:o,commentAuthor:i,commentBody:a}}};});var Rq={};S(Rq,{makeRunTaskCloseDuplicateHandler:()=>Jre,taskCloseDuplicateSpec:()=>jo});function Jre(e){return async(t,r)=>await n_({ctx:await e("task close-duplicate"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,duplicateOf:r.duplicateOf,author:r.author,note:r.note,force:r.force,yes:r.yes,quiet:r.quiet})}var jo,sC=u(()=>{H();o_();jo={id:["task","close-duplicate"],group:"Task",summary:"Close a task as a duplicate of another task with no-op bookkeeping metadata.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"of",valueHint:"<task-id>",required:true,description:"Canonical task id that this task duplicates."},{kind:"string",name:"author",valueHint:"<id>",required:true,description:"Comment author id (e.g. ORCHESTRATOR)."},{kind:"string",name:"note",valueHint:"<text>",description:"Optional short reason appended to the closure comment."},{kind:"boolean",name:"force",default:false,description:"Force closure despite gates."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action approval checks when required."},{kind:"boolean",name:"quiet",default:false,description:"Suppress output."}],examples:[{cmd:"agentplane task close-duplicate 202602120845-VKGC27 --of 202602120845-RWJ8K3 --author ORCHESTRATOR",why:"Close accidental duplicate task in one command."}],validateRaw:e=>{let t=typeof e.args["task-id"]=="string"?e.args["task-id"].trim():"",r=typeof e.opts.of=="string"?e.opts.of.trim():"",n=typeof e.opts.author=="string"?e.opts.author.trim():"",o=e.opts.note;if(!t)throw y({spec:jo,message:"Invalid value for task-id: empty."});if(!r)throw y({spec:jo,message:"Invalid value for --of: empty."});if(!n)throw y({spec:jo,message:"Invalid value for --author: empty."});if(typeof o=="string"&&o.trim().length===0)throw y({spec:jo,message:"Invalid value for --note: empty."});if(t===r)throw y({spec:jo,message:"Duplicate target must differ from task-id."})},parse:e=>({taskId:String(e.args["task-id"]),duplicateOf:String(e.opts.of),author:String(e.opts.author),note:typeof e.opts.note=="string"?e.opts.note:void 0,force:e.opts.force===true,yes:e.opts.yes===true,quiet:e.opts.quiet===true})};});var Cq={};S(Cq,{makeRunTaskCloseNoopHandler:()=>Yre,taskCloseNoopSpec:()=>Os});function Yre(e){return async(t,r)=>await s_({ctx:await e("task close-noop"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,author:r.author,note:r.note,force:r.force,yes:r.yes,quiet:r.quiet})}var Os,cC=u(()=>{H();c_();Os={id:["task","close-noop"],group:"Task",summary:"Close a task as a verified no-op in one command.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"author",valueHint:"<id>",required:true,description:"Comment author id (e.g. ORCHESTRATOR)."},{kind:"string",name:"note",valueHint:"<text>",description:"Optional closure note."},{kind:"boolean",name:"force",default:false,description:"Override status/verification gates."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action checks when required."},{kind:"boolean",name:"quiet",default:false,description:"Suppress output."}],examples:[{cmd:'agentplane task close-noop 202602030608-F1Q8AB --author ORCHESTRATOR --note "Duplicate tracking artifact"',why:"Close bookkeeping-only tasks without manual verify+finish choreography."}],validateRaw:e=>{let t=typeof e.args["task-id"]=="string"?e.args["task-id"].trim():"",r=typeof e.opts.author=="string"?e.opts.author.trim():"",n=e.opts.note;if(!t)throw y({spec:Os,message:"Invalid value for task-id: empty."});if(!r)throw y({spec:Os,message:"Invalid value for --author: empty."});if(typeof n=="string"&&n.trim().length===0)throw y({spec:Os,message:"Invalid value for --note: empty."})},parse:e=>({taskId:String(e.args["task-id"]),author:String(e.opts.author),note:typeof e.opts.note=="string"?e.opts.note:void 0,force:e.opts.force===true,yes:e.opts.yes===true,quiet:e.opts.quiet===true})};});var Pq={};S(Pq,{makeRunTaskCommentHandler:()=>Qre,taskCommentSpec:()=>Yg});function Qre(e){return async(t,r)=>await Kb({ctx:await e("task comment"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,author:r.author,body:r.body})}var Yg,dC=u(()=>{H();Jb();Yg={id:["task","comment"],group:"Task",summary:"Append a comment to a task.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"author",valueHint:"<id>",required:true,description:"Comment author id (e.g. CODER)."},{kind:"string",name:"body",valueHint:"<text>",required:true,description:"Comment body text."}],examples:[{cmd:'agentplane task comment 202602030608-F1Q8AB --author CODER --body "Investigated root cause."',why:"Add a comment and bump doc metadata."}],validateRaw:e=>{for(let t of ["author","body"]){let r=e.opts[t];if(typeof r=="string"&&r.trim()==="")throw y({spec:Yg,message:`Invalid value for --${t}: empty.`})}},parse:e=>({taskId:String(e.args["task-id"]),author:String(e.opts.author),body:String(e.opts.body)})};});var Tq={};S(Tq,{makeRunTaskDeriveHandler:()=>Xre,taskDeriveSpec:()=>Qg});function Xre(e){return async(t,r)=>await e_({ctx:await e("task derive"),cwd:t.cwd,rootOverride:t.rootOverride,spikeId:r.spikeId,title:r.title,description:r.description,owner:r.owner,priority:r.priority,tags:r.tags,verify:r.verify})}var Qg,lC=u(()=>{H();nr();t_();Qg={id:["task","derive"],group:"Task",summary:"Derive an implementation task from a spike task (adds depends_on on the spike).",args:[{name:"spike-id",required:true,valueHint:"<task-id>",description:"Spike task id (must have tag spike)."}],options:[{kind:"string",name:"title",valueHint:"<text>",required:true,description:"Task title."},{kind:"string",name:"description",valueHint:"<text>",required:true,description:"Task description (will be annotated with spike provenance)."},{kind:"string",name:"owner",valueHint:"<id>",required:true,description:"Owner id."},{kind:"string",name:"priority",valueHint:"<low|normal|med|high>",choices:["low","normal","med","high"],default:"med",description:"Task priority (default: med)."},{kind:"string",name:"tag",valueHint:"<tag>",repeatable:true,minCount:1,description:"Repeatable. Adds a tag (must provide at least one)."},{kind:"string",name:"verify",valueHint:"<command>",repeatable:true,description:"Repeatable. Verification commands/checks to run for this task."}],examples:[{cmd:'agentplane task derive 202602070101-ABCD --title "Implement X" --description "Do the thing" --owner CODER --tag code --verify "bun test"',why:"Create an implementation task derived from a spike with seeded verify steps."}],notes:["Derived tasks default to doc_version=3 and seed the README v3 section contract automatically.","For verify-required primary tags, this command seeds a default ## Verify Steps acceptance contract in README."],validateRaw:e=>{if(Q(e.opts.tag).some(r=>r.trim()===""))throw y({spec:Qg,command:"task derive",message:"Invalid value for --tag: empty."})},parse:e=>({spikeId:typeof e.args["spike-id"]=="string"?e.args["spike-id"]:"",title:e.opts.title,description:e.opts.description,owner:e.opts.owner,priority:e.opts.priority??"med",tags:Q(e.opts.tag),verify:e.opts.verify??[]})};});var Sq={};S(Sq,{makeRunTaskFindingsAddHandler:()=>Zre,taskFindingsAddSpec:()=>Li});function Zre(e){return async(t,r)=>await JD({ctx:await e("task findings add"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,observation:r.observation,impact:r.impact,resolution:r.resolution,promote:r.promote,external:r.external,fixability:r.fixability==="repo-fixable"?"repo-fixable":null,incidentScope:r.incidentScope,incidentTags:r.incidentTags,incidentMatch:r.incidentMatch,incidentAdvice:r.incidentAdvice,incidentRule:r.incidentRule,updatedBy:r.updatedBy})}var Li,mC=u(()=>{H();Mp();Li={id:["task","findings","add"],group:"Task",summary:"Append a structured Findings/Notes block; incident promotion is default unless --local-only.",synopsis:["agentplane task findings add <task-id> --observation <text> --impact <text> --resolution <text> [--local-only] [--repo-fixable] [--incident-scope <text>] [--incident-tag <tag>] [--incident-match <term>] [--incident-advice <text>] [--incident-rule <text>] [--updated-by <id>]"],args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"observation",valueHint:"<text>",description:"Required. Observation field."},{kind:"string",name:"impact",valueHint:"<text>",description:"Required. Impact field."},{kind:"string",name:"resolution",valueHint:"<text>",description:"Required. Resolution field."},{kind:"boolean",name:"promote",description:"Compatibility flag. Promotion is the default unless `--local-only` is set."},{kind:"boolean",name:"external",description:"Compatibility flag. External incident metadata is the default unless `--local-only` is set."},{kind:"boolean",name:"repo-fixable",description:"Mark the structured finding as repo-fixable so it can promote into incidents.md."},{kind:"boolean",name:"local-only",default:false,description:"Keep the entry task-local only; omit `Promotion: incident-candidate` and any explicit fixability marker."},{kind:"string",name:"incident-scope",valueHint:"<text>",description:"Optional. IncidentScope override."},{kind:"string",name:"incident-tag",valueHint:"<tag>",repeatable:true,description:"Repeatable. IncidentTags entry."},{kind:"string",name:"incident-match",valueHint:"<term>",repeatable:true,description:"Repeatable. IncidentMatch entry."},{kind:"string",name:"incident-advice",valueHint:"<text>",description:"Optional. IncidentAdvice field."},{kind:"string",name:"incident-rule",valueHint:"<text>",description:"Optional. IncidentRule field."},{kind:"string",name:"updated-by",valueHint:"<id>",description:"Optional. Override doc_updated_by metadata (must be non-empty)."}],examples:[{cmd:'agentplane task findings add 202602030608-F1Q8AB --observation "GitHub API EOF retries were manual." --impact "Operators repeated the reconcile loop." --resolution "Switch the retry path to REST polling." --incident-scope "GitHub PR reconciliation" --incident-tag workflow --incident-tag github',why:"Append a promotable external incident candidate without hand-editing the README or remembering hidden flags."},{cmd:'agentplane task findings add 202602030608-F1Q8AB --observation "One manual follow-up remains." --impact "Task notes should stay local." --resolution "Track it in Findings only." --local-only',why:"Keep an observation task-local when it should not feed incidents collection."}],validateRaw:e=>{for(let r of ["observation","impact","resolution"]){let n=e.opts[r];if(typeof n!="string"||n.trim()==="")throw y({spec:Li,message:`Missing required option: --${r}.`})}let t=e.opts["updated-by"];if(typeof t=="string"&&t.trim()==="")throw y({spec:Li,message:"--updated-by must be non-empty."});if(e.opts["local-only"]===true&&(e.opts.promote===true||e.opts.external===true||e.opts["repo-fixable"]===true))throw y({spec:Li,message:"--local-only cannot be combined with --promote, --external, or --repo-fixable."});if(e.opts.external===true&&e.opts["repo-fixable"]===true)throw y({spec:Li,message:"--external and --repo-fixable are mutually exclusive."})},parse:e=>{let t=e.opts["local-only"]===true,r=e.opts["repo-fixable"]===true,n=t?null:r?"repo-fixable":"external";return {taskId:String(e.args["task-id"]),observation:String(e.opts.observation),impact:String(e.opts.impact),resolution:String(e.opts.resolution),promote:!t,external:!t,fixability:n,incidentScope:typeof e.opts["incident-scope"]=="string"?e.opts["incident-scope"]:void 0,incidentTags:e.opts["incident-tag"]??[],incidentMatch:e.opts["incident-match"]??[],incidentAdvice:typeof e.opts["incident-advice"]=="string"?e.opts["incident-advice"]:void 0,incidentRule:typeof e.opts["incident-rule"]=="string"?e.opts["incident-rule"]:void 0,updatedBy:typeof e.opts["updated-by"]=="string"?e.opts["updated-by"]:void 0}}};});var Eq={};S(Eq,{runTaskFindings:()=>ene,taskFindingsSpec:()=>Xg});async function ene(e,t){oe({spec:Xg,cmd:t.subcommand?[t.subcommand]:[],subcommands:await ne(["task","findings"])});}var Xg,uC=u(()=>{Oe();Xg={id:["task","findings"],group:"Task",summary:"Structured Findings/Notes commands (incident promotion is default unless --local-only).",synopsis:["agentplane task findings add <task-id> --observation <text> --impact <text> --resolution <text> [--local-only] [--incident-scope <text>] [--incident-tag <tag>] [--incident-match <term>] [--incident-advice <text>] [--incident-rule <text>] [--updated-by <id>]"],args:[{name:"subcommand",required:false,valueHint:"<add>"}],parse:e=>({subcommand:typeof e.args.subcommand=="string"?e.args.subcommand:void 0})};});var Iq={};S(Iq,{makeRunTaskDocSetHandler:()=>tne,taskDocSetSpec:()=>$o});function tne(e){return async(t,r)=>await Hp({ctx:await e("task doc set"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,section:r.section,text:r.text,file:r.file,updatedBy:r.updatedBy,fullDoc:r.fullDoc})}var $o,pC=u(()=>{H();md();$o={id:["task","doc","set"],group:"Task",summary:"Update a task README section.",synopsis:["agentplane task doc set <task-id> --section <name> (--text <text> | --file <path>) [--updated-by <id>]","agentplane task doc set <task-id> --full-doc (--text <text> | --file <path>) [--updated-by <id>]"],args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"section",valueHint:"<name>",description:"Target section heading (must be one of config.tasks.doc.sections). Required unless --full-doc is set."},{kind:"boolean",name:"full-doc",default:false,description:"Treat the provided text/file as the full task README payload."},{kind:"string",name:"text",valueHint:"<text>",description:String.raw`Section content (mutually exclusive with --file). Literal escaped newlines (\n) are normalized for inline text.`},{kind:"string",name:"file",valueHint:"<path>",description:"Read section content from a file (mutually exclusive with --text)."},{kind:"string",name:"updated-by",valueHint:"<id>",description:"Optional. Override doc_updated_by metadata (must be non-empty)."}],examples:[{cmd:'agentplane task doc set 202602030608-F1Q8AB --section Summary --text "New summary."',why:"Update one section using inline text."},{cmd:"agentplane task doc set 202602030608-F1Q8AB --section Plan --file ./plan.md",why:"Update one section using a file."},{cmd:"agentplane task doc set 202602030608-F1Q8AB --full-doc --file ./task-readme.md",why:"Replace the full task README payload explicitly."}],validateRaw:e=>{let t=e.opts["full-doc"]===true,r=typeof e.opts.section=="string"?e.opts.section.trim():"";if(t&&r)throw y({spec:$o,message:"Use either --section or --full-doc (not both)."});if(!t&&!r)throw y({spec:$o,message:"Missing required option: --section (or pass --full-doc)."});if(typeof e.opts.section=="string"&&r==="")throw y({spec:$o,message:"Invalid value for --section: empty."});let n=typeof e.opts.text=="string",o=typeof e.opts.file=="string";if(n===o)throw y({spec:$o,message:"Exactly one of --text or --file is required."});let i=e.opts["updated-by"];if(typeof i=="string"&&i.trim()==="")throw y({spec:$o,message:"--updated-by must be non-empty."})},parse:e=>({taskId:String(e.args["task-id"]),section:typeof e.opts.section=="string"?e.opts.section:void 0,text:typeof e.opts.text=="string"?e.opts.text:void 0,file:typeof e.opts.file=="string"?e.opts.file:void 0,updatedBy:typeof e.opts["updated-by"]=="string"?e.opts["updated-by"]:void 0,fullDoc:e.opts["full-doc"]===true})};});var Aq={};S(Aq,{makeRunTaskDocShowHandler:()=>rne,taskDocShowSpec:()=>Zg});function rne(e){return async(t,r)=>await Ka({ctx:await e("task doc show"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,section:r.section,quiet:r.quiet})}var Zg,fC=u(()=>{H();md();Zg={id:["task","doc","show"],group:"Task",summary:"Print task README content (entire doc or one section).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"section",valueHint:"<name>",description:"Optional. Print a single section."},{kind:"boolean",name:"quiet",default:false,description:"Suppress informational output when doc/section content is missing."}],examples:[{cmd:"agentplane task doc show 202602030608-F1Q8AB",why:"Print the full doc."},{cmd:"agentplane task doc show 202602030608-F1Q8AB --section Summary",why:"Print a single section."}],validateRaw:e=>{let t=e.opts.section;if(typeof t=="string"&&t.trim()==="")throw y({spec:Zg,message:"Invalid value for --section: empty."})},parse:e=>({taskId:String(e.args["task-id"]),section:typeof e.opts.section=="string"?e.opts.section:void 0,quiet:e.opts.quiet===true})};});var Oq={};S(Oq,{runTaskDoc:()=>nne,taskDocSpec:()=>eh});async function nne(e,t){oe({spec:eh,cmd:t.subcommand?[t.subcommand]:[],subcommands:await ne(["task","doc"])});}var eh,gC=u(()=>{Oe();eh={id:["task","doc"],group:"Task",summary:"Task doc commands (show/set).",synopsis:["agentplane task doc show <task-id> [--section <name>] [--quiet]","agentplane task doc set <task-id> --section <name> (--text <text> | --file <path>) [--updated-by <id>]","agentplane task doc set <task-id> --full-doc (--text <text> | --file <path>) [--updated-by <id>]"],args:[{name:"subcommand",required:false,valueHint:"<show|set>"}],parse:e=>({subcommand:typeof e.args.subcommand=="string"?e.args.subcommand:void 0})};});var Dq={};S(Dq,{makeRunTaskExportHandler:()=>one,taskExportSpec:()=>hC});function one(e){return async t=>await Cp({ctx:await e("task export"),cwd:t.cwd,rootOverride:t.rootOverride})}var hC,kC=u(()=>{f_();hC={id:["task","export"],group:"Task",summary:"Export tasks to the configured tasks export path (typically .agentplane/tasks.json).",examples:[{cmd:"agentplane task export",why:"Write tasks export JSON and print the path."}],parse:()=>({})};});function Nq(e){return e&&ane.has(e)?e:null}function Ds(e){return e==="SIGINT"?130:e==="SIGTERM"?143:e==="SIGKILL"?137:e==="SIGHUP"?129:e==="SIGQUIT"?131:null}function Gt(e){try{return process.kill(e,0),!0}catch(t){let r=t?.code;if(r==="ESRCH")return false;if(r==="EPERM")return true;throw t}}async function jq(e){try{let{stdout:t}=await runProcess({command:"ps",args:["-o","lstart=,command=","-p",String(e)],encoding:"utf8"}),r=String(t).split(`
595
+ `).map(s=>s.trim()).find(s=>s.length>0);if(!r)return null;let n=/^([A-Z][a-z]{2}\s+[A-Z][a-z]{2}\s+\d{1,2}\s+\d\d:\d\d:\d\d\s+\d{4})\s+(.*)$/u.exec(r),o=n?.[1]?.trim()??null,i=n?.[2]?.trim()??null,a=o&&!Number.isNaN(Date.parse(o))?new Date(o).toISOString():null;return {pid:e,command:i,started_at:a}}catch(t){let r=t?.code,n=t?.code;if(r==="ESRCH"||n===1)return null;throw t}}async function yC(e){let t=Date.now(),r=e.poll_ms??100;for(;Date.now()-t<e.timeout_ms;){if(!Gt(e.pid))return true;await new Promise(n=>setTimeout(n,r));}return !Gt(e.pid)}var ane,qi=u(()=>{ane=new Set(["SIGHUP","SIGINT","SIGQUIT","SIGTERM","SIGKILL"]);});function $q(e){return createHash("sha256").update(e).digest("hex")}function Mq(e){return Buffer.byteLength(e,"utf8")}function lne(e){return {executable:e?.argv[0]??null,argv:[...e?.argv??[]],argv_count:e?.argv.length??0,env_keys:Object.keys(e?.env??{}).toSorted(),cwd:e?.run_dir??null,run_dir:e?.run_dir??null,bundle_path:e?.bundle_path??null,state_path:e?.state_path??null,events_path:e?.events_path??null,result_path:e?.result_path??null,trace_path:e?.trace_path??null,stderr_path:e?.stderr_path??null,bootstrap_path:e?.bootstrap_path??null,output_last_message_path:e?.output_last_message_path??null,dry_run:e?.dry_run??false,has_result_path:typeof e?.result_path=="string"&&e.result_path.length>0,has_output_last_message_path:typeof e?.output_last_message_path=="string"&&e.output_last_message_path.trim().length>0}}function mne(e){return {prompt_count:e.bundle.base_prompts.length,bundle_bytes:Mq(e.bundle_text),bootstrap_bytes:Mq(e.bootstrap_text),bundle_sha256:$q(e.bundle_text),bootstrap_sha256:$q(e.bootstrap_text),has_task_context:!!e.bundle.task,has_recipe_context:!!e.bundle.recipe,trace_policy:e.bundle.execution.trace_policy,timeout_policy:e.bundle.execution.timeout_policy,adapter_capabilities:e.bundle.execution.adapter_capabilities,adapter_capability_registry:e.bundle.execution.adapter_capability_registry,policy_decision:e.bundle.execution.policy_decision,invocation:lne(e.invocation)}}function une(e){let t=e.created_at??new Date().toISOString();return {schema_version:e.bundle.schema_version,runner_api_version:e.bundle.runner_api_version,run_id:e.bundle.execution.run_id,adapter_id:e.bundle.execution.adapter_id,target:e.bundle.target,status:e.status??"prepared",mode:e.bundle.execution.mode,bundle_path:e.bundle.execution.artifact_paths.bundle_path,result_path:e.bundle.execution.artifact_paths.result_path,bootstrap_path:e.bundle.execution.artifact_paths.bootstrap_path,events_path:e.bundle.execution.artifact_paths.events_path,trace_path:e.bundle.execution.artifact_paths.trace_path,stderr_path:e.bundle.execution.artifact_paths.stderr_path,trace_policy:e.bundle.execution.trace_policy,timeout_policy:e.bundle.execution.timeout_policy,policy_decision:e.bundle.execution.policy_decision,created_at:t,updated_at:t,prepared_metadata:e.prepared_metadata}}async function Bq(e){let t=e.bundle.execution.artifact_paths;await mkdir(t.run_dir,{recursive:true});let r=`${JSON.stringify(e.bundle,null,2)}
596
+ `,n=e.bootstrap_markdown?pne(e.bootstrap_markdown):"",o=mne({bundle:e.bundle,invocation:e.invocation,bundle_text:r,bootstrap_text:n}),i=une({bundle:e.bundle,created_at:e.created_at,prepared_metadata:o});return await atomicWriteFile(t.bundle_path,r,"utf8"),await atomicWriteFile(t.state_path,`${JSON.stringify(i,null,2)}
597
+ `,"utf8"),await atomicWriteFile(t.bootstrap_path,n,"utf8"),await atomicWriteFile(t.events_path,"","utf8"),await atomicWriteFile(t.trace_path,"","utf8"),await atomicWriteFile(t.stderr_path,"","utf8"),await Gi({events_path:t.events_path,event:{at:i.created_at,type:"runner_prepared",message:`runner prepared with adapter=${e.bundle.execution.adapter_id} mode=${e.bundle.execution.mode}`,data:{prompt_count:o.prompt_count,bundle_bytes:o.bundle_bytes,bootstrap_bytes:o.bootstrap_bytes,bundle_sha256:o.bundle_sha256,bootstrap_sha256:o.bootstrap_sha256,has_task_context:o.has_task_context,has_recipe_context:o.has_recipe_context,trace_policy:o.trace_policy,timeout_policy:o.timeout_policy,adapter_capabilities:o.adapter_capabilities,adapter_capability_registry:o.adapter_capability_registry,policy_decision:o.policy_decision,invocation:o.invocation}}}),i}async function Gi(e){await mkdir(Ye.dirname(e.events_path),{recursive:true}),await appendFile(e.events_path,`${JSON.stringify(e.event)}
598
+ `,"utf8");}async function Fn(e){try{let t=await readFile(e,"utf8");return JSON.parse(t)}catch(t){if(t?.code==="ENOENT")return null;throw t}}function at(e){let t=e.updated_at??new Date().toISOString();return {...e.state,status:e.status,updated_at:t,supervision:e.supervision??e.state.supervision,result:e.result}}async function Zd(e){await mkdir(Ye.dirname(e.state_path),{recursive:true}),await atomicWriteFile(e.state_path,`${JSON.stringify(e.state,null,2)}
599
+ `,"utf8");}function pne(e){return e.endsWith(`
600
+ `)?e:`${e}
601
+ `}var Bn=u(()=>{});function Mo(e){let t=Ye.join(e.git_root,e.workflow_dir,e.task_id),r=Ye.join(t,"runs"),n=Ye.join(r,e.run_id);return {task_dir:t,runs_dir:r,run_dir:n,bundle_path:Ye.join(n,fne),bootstrap_path:Ye.join(n,gne),state_path:Ye.join(n,hne),events_path:Ye.join(n,kne),result_path:Ye.join(n,yne),trace_path:Ye.join(n,wne),stderr_path:Ye.join(n,bne)}}var fne,gne,hne,kne,yne,wne,bne,el=u(()=>{fne="bundle.json",gne="bootstrap.md",hne="run-state.json",kne="events.jsonl",yne="result.json",wne="agent-trace.jsonl",bne="stderr.log";});function Ine(e){return e.retention==="remove_always"||e.retention==="remove_on_success"&&e.run_status==="success"}function qq(e){return `${e}.gz`}function _C(e,t){let r=e;for(let n of t??[]){let o=n.trim();o&&(r=r.split(o).join(Ene));}return r}async function vC(e){let t;try{t=await readFile(e.file_path);}catch(n){if(n?.code==="ENOENT")return {artifact_path:null,archive_path:null};throw n}let r=null;return e.policy.compression==="gzip"&&(r=qq(e.file_path),await mkdir(Ye.dirname(r),{recursive:true}),await atomicWriteFile(r,await Tne(t))),Ine({retention:e.policy.retention,run_status:e.run_status})?(await rm$1(e.file_path,{force:true}),{artifact_path:r,archive_path:null}):{artifact_path:e.file_path,archive_path:r}}async function Hq(e){try{return await readFile(e,"utf8")}catch(r){if(r?.code!=="ENOENT")throw r}let t=qq(e);try{let r=await readFile(t);return (await Sne(r)).toString("utf8")}catch(r){throw r?.code==="ENOENT",r}}var Tne,Sne,Ene,xC=u(()=>{Tne=promisify(gzip),Sne=promisify(gunzip),Ene="[REDACTED]";});function Gq(e){let t=typeof e=="string"?Date.parse(e):Number.NaN;return Number.isNaN(t)?Number.NEGATIVE_INFINITY:t}function Dne(e){return e.split(/\r?\n/u).map(t=>t.trim()).filter(t=>t.length>0).flatMap(t=>{try{return [JSON.parse(t)]}catch{return []}})}async function Nne(e){try{return JSON.parse(await readFile(e,"utf8"))}catch(t){if(t?.code==="ENOENT")return null;throw t}}async function jne(e){try{return await readFile(e.file_path,"utf8")}catch(t){throw t?.code==="ENOENT"?new m({exitCode:4,code:"E_IO",message:`Runner artifact not found for ${e.task_id}:${e.run_id} (${e.artifact_label} at ${e.file_path})`}):t}}function RC(e,t,r){let n=e.task?.task_id??(e.target.kind==="task"?e.target.task_id:e.target.task_id??null);if(e.execution.run_id!==r)throw new m({exitCode:4,code:"E_IO",message:`Runner bundle/run mismatch for ${t}:${r} (bundle.run_id=${e.execution.run_id})`});if(!n||n!==t)throw new m({exitCode:4,code:"E_IO",message:`Runner bundle/task mismatch for ${t}:${r}`})}async function Uq(e){let t=Ye.join(e.git_root,e.workflow_dir,e.task_id,"runs"),r=[];try{r=(await readdir(t,{withFileTypes:!0})).filter(a=>a.isDirectory()).map(a=>a.name);}catch(i){throw i?.code==="ENOENT"?new m({exitCode:4,code:"E_IO",message:`No runner runs found for task ${e.task_id}`}):i}let o=(await Promise.all(r.map(async i=>{let s=await st.forTaskRun({git_root:e.git_root,workflow_dir:e.workflow_dir,task_id:e.task_id,run_id:i}).readState();return s?{run_id:i,updated_at:Gq(s.updated_at),created_at:Gq(s.created_at)}:null}))).filter(i=>i!==null).toSorted((i,a)=>a.updated_at-i.updated_at||a.created_at-i.created_at||a.run_id.localeCompare(i.run_id))[0];if(!o)throw new m({exitCode:4,code:"E_IO",message:`No runner runs found for task ${e.task_id}`});return o.run_id}var st,Ns=u(()=>{v();Bn();el();xC();st=class e{constructor(t){this.paths=t;}static forTaskRun(t){return new e(Mo({git_root:t.git_root,workflow_dir:t.workflow_dir,task_id:t.task_id,run_id:t.run_id}))}static fromBundle(t){return new e(t.execution.artifact_paths)}static fromInvocation(t){return new e({run_dir:t.run_dir,bundle_path:t.bundle_path,bootstrap_path:t.bootstrap_path??"",state_path:t.state_path,events_path:t.events_path,result_path:t.result_path,trace_path:t.trace_path,stderr_path:t.stderr_path})}async writePrepared(t){return await Bq(t)}async readBundle(){return await Nne(this.paths.bundle_path)}async readState(){return await Fn(this.paths.state_path)}async readRecord(){let[t,r]=await Promise.all([this.readBundle(),this.readState()]);return !t||!r?null:{bundle:t,state:r,result:r.result??null}}async readRequiredRecord(t){let r=await this.readRecord();if(!r)throw new m({exitCode:4,code:"E_IO",message:`Runner artifact not found for ${t.task_id}:${t.run_id}`});return RC(r.bundle,t.task_id,t.run_id),r}async writeState(t){await Zd({state_path:this.paths.state_path,state:t});}async appendEvent(t){await Gi({events_path:this.paths.events_path,event:t});}async readEventsTextRequired(t){return await jne({file_path:this.paths.events_path,task_id:t.task_id,run_id:t.run_id,artifact_label:"events"})}async readEventsRequired(t){let r=await this.readEventsTextRequired(t);return {events_text:r,events:Dne(r)}}async readTraceTextRequired(t){try{return await Hq(this.paths.trace_path)}catch(r){throw r?.code==="ENOENT"?new m({exitCode:4,code:"E_IO",message:`Runner artifact not found for ${t.task_id}:${t.run_id} (trace at ${this.paths.trace_path} or ${this.paths.trace_path}.gz)`}):r}}};});async function tl(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await fr(t);if(!await r.backend.task_backend.getTask(e.task_id))throw new m({exitCode:4,code:"E_IO",message:`Task not found: ${e.task_id}`});let o=typeof e.run_id=="string"&&e.run_id.trim().length>0?e.run_id:await Uq({git_root:r.repo.git_root,workflow_dir:r.repo.workflow_dir,task_id:e.task_id}),i=Mo({git_root:r.repo.git_root,workflow_dir:r.repo.workflow_dir,task_id:e.task_id,run_id:o}),a=new st(i),[s,c]=await Promise.all([a.readRequiredRecord({task_id:e.task_id,run_id:o}),a.readEventsRequired({task_id:e.task_id,run_id:o})]);return {ctx:r.command,task_id:e.task_id,run_id:o,selection:e.run_id?"explicit":"latest",paths:i,bundle:s.bundle,state:s.state,events:c.events,events_text:c.events_text}}async function CC(e){let t=await tl(e),r=await new st(t.paths).readTraceTextRequired({task_id:t.task_id,run_id:t.run_id});return {...t,trace_text:r}}async function Wq(e){let t=await CC(e),r=t.trace_text.split(/\r?\n/u);r.at(-1)===""&&r.pop();let n=r.slice(-e.lines);return {...t,tail_text:n.length>0?`${n.join(`
602
+ `)}
603
+ `:""}}var rl=u(()=>{N();v();ro();Ns();el();});function Fne(e){return normalizeTaskStatus(e.status)}function Bne(e){if(e instanceof m&&e.code==="E_IO")return null;throw e}async function nl(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await ue({ctx:t,taskId:e.task_id}),n=Xr({git_root:t.resolvedProject.gitRoot,workflow_dir:t.config.paths.workflow_dir,task_id:e.task_id}),[o,i,a]=await Promise.all([sL(t.resolvedProject.gitRoot),ZR(n),cL({ctx:t,task_id:e.task_id})]),s=await t.git.headCommit().catch(()=>null),c=a.base??await resolveBaseBranch({cwd:t.resolvedProject.gitRoot,rootOverride:t.resolvedProject.gitRoot,mode:t.config.workflow_mode}).catch(()=>null),d;try{let l=await tl({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:e.task_id,run_id:e.run_id}),p=eC({task_id:e.task_id,run_id:l.run_id,status:l.state.status});if(d={run_id:l.run_id,status:l.state.status,heartbeat_at:l.state.supervision?.heartbeat_at??null,state_path:l.paths.state_path,trace_path:l.paths.trace_path,...p},l.state.status==="running"){let g=l.state.supervision?.pid;if(typeof g=="number"){let h=Gt(g);d.next_action=h?"wait":"cancel_then_resume",d.next_command=h?null:`agentplane task run cancel ${e.task_id} ${l.run_id} && agentplane task run resume ${e.task_id} ${l.run_id}`;}else d.next_action="cancel_then_resume",d.next_command=`agentplane task run cancel ${e.task_id} ${l.run_id} && agentplane task run resume ${e.task_id} ${l.run_id}`;}}catch(l){let p=Bne(l);d={run_id:null,status:null,heartbeat_at:null,state_path:null,trace_path:null,...eC({task_id:e.task_id,run_id:p,status:null})};}return {task_id:e.task_id,task_status:Fne(r),branch:o,base_branch:c,head_sha:s,workspace_root:t.resolvedProject.gitRoot,pr_branch:a.branch,latest_handoff:i,runner:d}}async function th(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null});await ue({ctx:t,taskId:e.task_id});let r=await nl({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:e.task_id,run_id:e.run_id});return {ctx:t,handoff:Gg({task_id:e.task_id,created_at:new Date().toISOString(),from_role:e.from_role,to_role:e.to_role,reason:e.reason,note:e.note,branch:r.branch,base_branch:r.base_branch,head_sha:r.head_sha,workspace_root:r.workspace_root,pr_branch:r.pr_branch,runner:r.runner,next_actions:e.next_actions,risks:e.risks,open_questions:e.open_questions,evidence_paths:e.evidence_paths})}}var rh=u(()=>{N();Es();qi();rl();v();});var Kq={};S(Kq,{runTaskHandoffRecord:()=>Lne,taskHandoffRecordSpec:()=>nh});var nh,zq,Lne,PC=u(()=>{H();I();rh();Es();nh={id:["task","handoff","record"],group:"Task",summary:"Record a task handoff snapshot with runner recovery hints.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"from",valueHint:"<role>",description:"Role handing off the task."},{kind:"string",name:"to",valueHint:"<role>",description:"Optional. Intended receiving role."},{kind:"string",name:"reason",valueHint:"<text>",description:"Why the handoff is happening."},{kind:"string",name:"note",valueHint:"<text>",description:"Optional. Free-form handoff note."},{kind:"string",name:"run-id",valueHint:"<run-id>",description:"Optional. Pin handoff hints to a specific runner run."},{kind:"string",name:"next-action",valueHint:"<text>",repeatable:true,description:"Repeatable. Human next actions for the receiving agent."},{kind:"string",name:"risk",valueHint:"<text>",repeatable:true,description:"Repeatable. Risks or watch-outs that remain open."},{kind:"string",name:"question",valueHint:"<text>",repeatable:true,description:"Repeatable. Open questions for the next agent."},{kind:"string",name:"evidence-path",valueHint:"<path>",repeatable:true,description:"Repeatable. Relevant evidence or artifact paths."},{kind:"boolean",name:"json",default:false,description:"Emit the persisted handoff snapshot as JSON."}],validateRaw:e=>{for(let t of ["from","reason"]){let r=e.opts[t];if(typeof r!="string"||r.trim()==="")throw y({spec:nh,message:`Missing required option: --${t}.`})}},parse:e=>({taskId:String(e.args["task-id"]),fromRole:String(e.opts.from),toRole:typeof e.opts.to=="string"?e.opts.to:void 0,reason:String(e.opts.reason),note:typeof e.opts.note=="string"?e.opts.note:void 0,runId:typeof e.opts["run-id"]=="string"?e.opts["run-id"]:void 0,nextActions:e.opts["next-action"]??[],risks:e.opts.risk??[],openQuestions:e.opts.question??[],evidencePaths:e.opts["evidence-path"]??[],json:e.opts.json===true})},zq=A(),Lne=async(e,t)=>{let r=await th({cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId,from_role:t.fromRole,to_role:t.toRole,reason:t.reason,note:t.note,run_id:t.runId,next_actions:t.nextActions,risks:t.risks,open_questions:t.openQuestions,evidence_paths:t.evidencePaths}),n=Xr({git_root:r.ctx.resolvedProject.gitRoot,workflow_dir:r.ctx.config.paths.workflow_dir,task_id:t.taskId});if(await Ss({paths:n,handoff:r.handoff}),t.json)return zq.json(r.handoff),0;let o=[{label:"from",value:r.handoff.from_role},{label:"to",value:r.handoff.to_role??"unassigned"},{label:"reason",value:r.handoff.reason}];return r.handoff.runner?.run_id&&o.push({label:"run_id",value:r.handoff.runner.run_id},{label:"runner_status",value:r.handoff.runner.status??"unknown"},{label:"runner_next_action",value:r.handoff.runner.next_action??"none"}),o.push({label:"latest",value:n.latest_path}),zq.report(o,{header:K(`task handoff recorded: ${t.taskId}`)}),0};});var Yq={};S(Yq,{runTaskHandoffShow:()=>qne,taskHandoffShowSpec:()=>TC});var TC,Jq,qne,SC=u(()=>{I();N();Es();TC={id:["task","handoff","show"],group:"Task",summary:"Show the latest persisted task handoff snapshot.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"boolean",name:"json",default:false,description:"Emit machine-readable handoff JSON."}],parse:e=>({taskId:String(e.args["task-id"]),json:e.opts.json===true})},Jq=A(),qne=async(e,t)=>{let r=await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=Xr({git_root:r.resolvedProject.gitRoot,workflow_dir:r.config.paths.workflow_dir,task_id:t.taskId}),o=await aL({task_id:t.taskId,paths:n});if(t.json)return Jq.json(o),0;let i=[{label:"from",value:o.from_role},{label:"to",value:o.to_role??"unassigned"},{label:"created_at",value:o.created_at},{label:"reason",value:o.reason}];o.branch&&i.push({label:"branch",value:o.branch}),o.base_branch&&i.push({label:"base_branch",value:o.base_branch}),o.head_sha&&i.push({label:"head_sha",value:o.head_sha}),o.pr_branch&&i.push({label:"pr_branch",value:o.pr_branch}),o.route?.kind&&i.push({label:"route_kind",value:o.route.kind}),o.route?.status&&i.push({label:"route_status",value:o.route.status}),o.route?.local_mutation&&i.push({label:"route_local_mutation",value:o.route.local_mutation}),o.route?.finalize_via&&i.push({label:"route_finalize_via",value:o.route.finalize_via}),typeof o.route?.pr_number=="number"&&i.push({label:"route_pr_number",value:String(o.route.pr_number)}),o.route?.pr_url&&i.push({label:"route_pr_url",value:o.route.pr_url}),o.route?.handoff_show_command&&i.push({label:"route_handoff_show_command",value:o.route.handoff_show_command}),o.route?.base_pull_command&&i.push({label:"route_base_pull_command",value:o.route.base_pull_command}),o.runner?.run_id&&(i.push({label:"run_id",value:o.runner.run_id},{label:"runner_status",value:o.runner.status??"unknown"},{label:"runner_next_action",value:o.runner.next_action??"none"}),o.runner.next_command&&i.push({label:"runner_next_command",value:o.runner.next_command}));for(let a of o.next_actions??[])i.push({label:"next_action",value:a});for(let a of o.risks??[])i.push({label:"risk",value:a});for(let a of o.open_questions??[])i.push({label:"open_question",value:a});for(let a of o.evidence_paths??[])i.push({label:"evidence_path",value:a});return Jq.report(i,{header:K(`task handoff show: ${t.taskId}`)}),0};});var Qq={};S(Qq,{runTaskHandoff:()=>Hne,taskHandoffSpec:()=>oh});async function Hne(e,t){oe({spec:oh,cmd:t.subcommand?[t.subcommand]:[],subcommands:await ne(["task","handoff"])});}var oh,EC=u(()=>{Oe();oh={id:["task","handoff"],group:"Task",summary:"Task handoff commands (record/show).",synopsis:["agentplane task handoff record <task-id> --from <role> --reason <text> [--to <role>] [--run-id <id>]","agentplane task handoff show <task-id> [--json]"],args:[{name:"subcommand",required:false,valueHint:"<record|show>"}],parse:e=>({subcommand:typeof e.args.subcommand=="string"?e.args.subcommand:void 0})};});var ol,IC=u(()=>{H();ol={id:["task","hosted-close"],group:"Task",summary:"Close a branch_pr task on the current branch from a merged hosted PR event payload.",options:[{kind:"string",name:"event-json",valueHint:"<path>",description:"Path to the GitHub pull_request closed event payload."},{kind:"boolean",name:"quiet",default:false,description:"Suppress normal output (still prints errors)."}],validateRaw:e=>{let t=e.opts["event-json"];if(typeof t!="string"||t.trim()==="")throw y({spec:ol,message:"Missing required option: --event-json."})},examples:[{cmd:'agentplane task hosted-close --event-json "$GITHUB_EVENT_PATH"',why:"Apply the canonical branch_pr closure payload on an automation branch after a hosted PR merge."}],parse:e=>({eventJson:String(e.opts["event-json"]),quiet:e.opts.quiet===true})};});var Xq={};S(Xq,{runTaskLint:()=>Gne,taskLintSpec:()=>AC});async function Gne(e){return await Pp({cwd:e.cwd,rootOverride:e.rootOverride})}var AC,OC=u(()=>{g_();AC={id:["task","lint"],group:"Task",summary:"Lint the exported tasks JSON file (schema + invariants).",examples:[{cmd:"agentplane task lint",why:"Validate the tasks export file."}],parse:()=>({})};});var DC,Zq=u(()=>{H();nr();DC={id:["task","list"],group:"Task",summary:"List tasks (optionally filtered by status/owner/tag).",options:[{kind:"string",name:"status",valueHint:"<status>",repeatable:true,description:"Repeatable. Filter by status."},{kind:"string",name:"owner",valueHint:"<owner>",repeatable:true,description:"Repeatable. Filter by owner id."},{kind:"string",name:"tag",valueHint:"<tag>",repeatable:true,description:"Repeatable. Filter by tag."},{kind:"boolean",name:"strict-read",default:false,description:"Fail if task scan skips malformed/unreadable task files."},{kind:"boolean",name:"quiet",default:false,description:"Suppress summary output."}],examples:[{cmd:"agentplane task list",why:"List all tasks."},{cmd:"agentplane task list --status TODO --owner CODER",why:"List filtered tasks."}],validateRaw:e=>{for(let t of ["status","owner","tag"])if(Q(e.opts[t]).some(n=>n.trim()===""))throw y({spec:DC,message:`Invalid value for --${t}: empty.`})},parse:e=>({filters:{status:Q(e.opts.status),owner:Q(e.opts.owner),tag:Q(e.opts.tag),quiet:e.opts.quiet===true,strictRead:e.opts["strict-read"]===true}})};});var tH={};S(tH,{runTaskMigrateDoc:()=>Vne,taskMigrateDocSpec:()=>il});function eH(e){let t=e.args["task-id"];return Array.isArray(t)?t.filter(r=>typeof r=="string"&&r.trim().length>0):typeof t=="string"&&t.trim().length>0?[t]:[]}async function Vne(e,t){return await zb({cwd:e.cwd,rootOverride:e.rootOverride,all:t.all,quiet:t.quiet,taskIds:t.taskIds})}var il,NC=u(()=>{H();yp();il={id:["task","migrate-doc"],group:"Task",summary:"Migrate legacy task README docs to the current README v3 template/metadata format.",args:[{name:"task-id",required:false,variadic:true,valueHint:"<task-id>"}],options:[{kind:"boolean",name:"all",default:false,description:"Migrate all task READMEs."},{kind:"boolean",name:"quiet",default:false,description:"Suppress normal output (still prints errors)."}],examples:[{cmd:"agentplane task migrate-doc --all",why:"Migrate all task READMEs."},{cmd:"agentplane task migrate-doc 202602030608-F1Q8AB 202602030609-ABCDEF",why:"Migrate specific task READMEs."}],notes:["Use this after framework upgrade when doctor reports active legacy README v2 tasks or an active v2/v3 mixed state.","This command upgrades task-local docs; it does not replace framework-managed files such as AGENTS.md or .agentplane/policy/**."],validateRaw:e=>{let t=e.opts.all===true,n=eH(e).length>0;if(t&&n)throw y({spec:il,message:"Invalid arguments: use either --all or <task-id>..., not both."});if(!t&&!n)throw y({spec:il,message:"Missing task ids (provide <task-id>... or use --all)."})},parse:e=>({all:e.opts.all===true,quiet:e.opts.quiet===true,taskIds:eH(e)})};});var rH={};S(rH,{makeRunTaskMigrateHandler:()=>Une,taskMigrateSpec:()=>jC});function Une(e){return async(t,r)=>await kp({ctx:await e("task migrate"),cwd:t.cwd,rootOverride:t.rootOverride,source:r.source,quiet:r.quiet,force:r.force,yes:r.yes})}var jC,$C=u(()=>{Vb();jC={id:["task","migrate"],group:"Task",summary:"Import tasks from an exported JSON file into the configured backend.",options:[{kind:"string",name:"source",valueHint:"<path>",description:"Path to a tasks export JSON file (defaults to config.paths.tasks_path)."},{kind:"boolean",name:"quiet",default:false,description:"Suppress normal output (still prints errors)."},{kind:"boolean",name:"force",default:false,description:"Accepted for parity; currently has no additional checks in the node CLI."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action approval checks when required."}],examples:[{cmd:"agentplane task migrate",why:"Import from the default export path."},{cmd:"agentplane task migrate --source tasks-export.json",why:"Import from a custom file."}],parse:e=>({source:typeof e.opts.source=="string"?e.opts.source:void 0,quiet:e.opts.quiet===true,force:e.opts.force===true,yes:e.opts.yes===true})};});var ih,MC=u(()=>{le();ih={id:["task","new"],group:"Task",summary:"Create a new task (prints the generated task id).",description:"Creates a TODO task with doc_version=3, seeds the README v3 section layout, and writes it via the configured task backend.",options:[{kind:"string",name:"title",valueHint:"<text>",required:true,description:"Task title."},{kind:"string",name:"description",valueHint:"<text>",required:true,description:"Task description."},{kind:"string",name:"owner",valueHint:"<id>",required:true,description:"Owner id (e.g. CODER)."},{kind:"string",name:"priority",valueHint:"<low|normal|med|high>",choices:["low","normal","med","high"],default:"med",description:"Task priority (default: med)."},{kind:"string",name:"tag",valueHint:"<tag>",repeatable:true,minCount:1,description:"Repeatable. Adds a tag (must provide at least one)."},{kind:"string",name:"depends-on",valueHint:"<task-id>",repeatable:true,coerce:e=>ri(e),description:"Repeatable. Adds a dependency. Special-case: '[]' is treated as empty."},{kind:"string",name:"verify",valueHint:"<command>",repeatable:true,description:"Repeatable. Verification commands/checks to run for this task."},{kind:"boolean",name:"allow-duplicate",default:false,description:"Allow creating a task even when an open task with a highly similar title already exists."}],examples:[{cmd:'agentplane task new --title "Refactor CLI" --description "Improve CLI output" --owner CODER --tag cli',why:"Create a new task with one tag."}],notes:["Task creation defaults to doc_version=3 and seeds the README v3 section contract automatically.","For verify-required primary tags, this command seeds a default ## Verify Steps acceptance contract in README."],parse:e=>({title:e.opts.title,description:e.opts.description,owner:e.opts.owner,priority:e.opts.priority??"med",tags:e.opts.tag??[],dependsOn:e.opts["depends-on"]??[],verify:e.opts.verify??[],allowDuplicate:e.opts["allow-duplicate"]===true})};});var al,nH=u(()=>{H();nr();al={id:["task","next"],group:"Task",summary:"List ready tasks (default status=TODO) with optional filters.",options:[{kind:"string",name:"status",valueHint:"<status>",repeatable:true,description:"Repeatable. Filter by status (default: TODO)."},{kind:"string",name:"owner",valueHint:"<owner>",repeatable:true,description:"Repeatable. Filter by owner id."},{kind:"string",name:"tag",valueHint:"<tag>",repeatable:true,description:"Repeatable. Filter by tag."},{kind:"boolean",name:"strict-read",default:false,description:"Fail if task scan skips malformed/unreadable task files."},{kind:"string",name:"limit",valueHint:"<n>",description:"Max rows to print."},{kind:"boolean",name:"quiet",default:false,description:"Suppress summary output."}],examples:[{cmd:"agentplane task next",why:"List ready TODO tasks."},{cmd:"agentplane task next --limit 3",why:"Limit output."}],validateRaw:e=>{for(let t of ["status","owner","tag"])if(Q(e.opts[t]).some(n=>n.trim()===""))throw y({spec:al,message:`Invalid value for --${t}: empty.`});if(e.opts.limit!==void 0){let t=e.opts.limit;if(typeof t!="string")throw y({spec:al,message:`Invalid value for --limit: ${JSON.stringify(t)} (expected integer)`});let r=Number.parseInt(t,10);if(!Number.isFinite(r))throw y({spec:al,message:`Invalid value for --limit: ${t} (expected integer)`})}},parse:e=>({filters:{status:Q(e.opts.status),owner:Q(e.opts.owner),tag:Q(e.opts.tag),limit:typeof e.opts.limit=="string"?Number.parseInt(e.opts.limit,10):void 0,quiet:e.opts.quiet===true,strictRead:e.opts["strict-read"]===true}})};});var oH={};S(oH,{makeRunTaskNormalizeHandler:()=>Wne,taskNormalizeSpec:()=>sl});function Wne(e){return async(t,r)=>await hp({ctx:await e("task normalize"),cwd:t.cwd,rootOverride:t.rootOverride,quiet:r.quiet,force:r.force,yes:r.yes,syncHostedMerges:r.syncHostedMerges,syncBranchPrState:r.syncBranchPrState,taskIds:r.taskIds})}var sl,FC=u(()=>{H();Gb();sl={id:["task","normalize"],group:"Task",summary:"Normalize tasks in the configured backend (stable ordering and formatting).",options:[{kind:"boolean",name:"quiet",default:false,description:"Suppress normal output (still prints errors)."},{kind:"boolean",name:"force",default:false,description:"Accepted for parity; currently has no additional checks in the node CLI."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action approval checks when required."},{kind:"boolean",name:"sync-hosted-merges",default:false,description:"Query GitHub for merged hosted PRs referenced by local PR artifacts and reconcile stale branch_pr task state before normalization."},{kind:"boolean",name:"sync-branch-pr-state",default:false,description:"Reconcile stale local branch_pr task state when verified task commits already landed on the base branch."},{kind:"string",name:"task-id",valueHint:"<task-id>",repeatable:true,description:"Repeatable. Limit reconcile modes to explicit task ids instead of scanning every task."}],examples:[{cmd:"agentplane task normalize",why:"Normalize tasks and print a short summary."},{cmd:"agentplane task normalize --quiet",why:"Normalize tasks without printing output."},{cmd:"agentplane task normalize --sync-hosted-merges",why:"Reconcile stale branch_pr task state from hosted PR merges, then normalize the local projection."},{cmd:"agentplane task normalize --sync-branch-pr-state",why:"Reconcile locally shipped branch_pr task state when task commits already reached the base branch."},{cmd:"agentplane task normalize --sync-hosted-merges --task-id 202604071853-XGX2YJ",why:"Reconcile only known stale tasks instead of scanning unrelated historical PR metadata."}],validateRaw:e=>{let t=e.opts["task-id"]??[];if(t.length>0&&e.opts["sync-hosted-merges"]!==true&&e.opts["sync-branch-pr-state"]!==true)throw y({spec:sl,message:"--task-id requires --sync-hosted-merges and/or --sync-branch-pr-state."});for(let r of t)if(typeof r!="string"||r.trim().length===0)throw y({spec:sl,message:"Invalid value for --task-id: empty."})},parse:e=>({quiet:e.opts.quiet===true,force:e.opts.force===true,yes:e.opts.yes===true,syncHostedMerges:e.opts["sync-hosted-merges"]===true,syncBranchPrState:e.opts["sync-branch-pr-state"]===true,taskIds:(e.opts["task-id"]??[]).map(t=>t.trim())})};});var iH={};S(iH,{makeRunTaskPlanApproveHandler:()=>zne,taskPlanApproveSpec:()=>ah});function zne(e){return async(t,r)=>await Sp({ctx:await e("task plan approve"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,by:r.by,note:r.note})}var ah,BC=u(()=>{H();ad();ah={id:["task","plan","approve"],group:"Task",summary:"Approve the current task plan (enforces Verify Steps gating when configured).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"by",valueHint:"<id>",required:true,description:"Approver id."},{kind:"string",name:"note",valueHint:"<text>",description:"Optional note (stored in plan_approval.note)."}],examples:[{cmd:'agentplane task plan approve 202602030608-F1Q8AB --by USER --note "OK"',why:"Approve a plan with a note."}],validateRaw:e=>{let t=e.opts.by;if(typeof t=="string"&&t.trim().length===0)throw y({spec:ah,message:"Invalid value for --by: empty."})},parse:e=>({taskId:String(e.args["task-id"]),by:String(e.opts.by),note:typeof e.opts.note=="string"?e.opts.note:void 0})};});var aH={};S(aH,{makeRunTaskPlanRejectHandler:()=>Kne,taskPlanRejectSpec:()=>cl});function Kne(e){return async(t,r)=>await Ep({ctx:await e("task plan reject"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,by:r.by,note:r.note})}var cl,LC=u(()=>{H();ad();cl={id:["task","plan","reject"],group:"Task",summary:"Reject the current task plan (requires a note).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"by",valueHint:"<id>",required:true,description:"Reviewer id."},{kind:"string",name:"note",valueHint:"<text>",required:true,description:"Required note explaining what needs to change."}],examples:[{cmd:'agentplane task plan reject 202602030608-F1Q8AB --by USER --note "Need clarification"',why:"Reject a plan with a note."}],validateRaw:e=>{let t=e.opts.by;if(typeof t=="string"&&t.trim().length===0)throw y({spec:cl,message:"Invalid value for --by: empty."});let r=e.opts.note;if(typeof r=="string"&&r.trim().length===0)throw y({spec:cl,message:"Invalid value for --note: empty."})},parse:e=>({taskId:String(e.args["task-id"]),by:String(e.opts.by),note:String(e.opts.note)})};});var sH={};S(sH,{makeRunTaskPlanSetHandler:()=>Jne,taskPlanSetSpec:()=>dl});function Jne(e){return async(t,r)=>await Tp({ctx:await e("task plan set"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,text:r.text,file:r.file,updatedBy:r.updatedBy})}var dl,qC=u(()=>{H();ad();dl={id:["task","plan","set"],group:"Task",summary:"Set a task plan (writes the Plan section and resets plan approval to pending).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"text",valueHint:"<text>",description:String.raw`Plan text to write into the task README Plan section. Literal escaped newlines (\n) are normalized for inline text.`},{kind:"string",name:"file",valueHint:"<path>",description:"Read plan text from a file path (relative to cwd)."},{kind:"string",name:"updated-by",valueHint:"<id>",description:"Optional. Sets doc_updated_by when writing the plan."}],examples:[{cmd:String.raw`agentplane task plan set 202602030608-F1Q8AB --text "1) Do X\n2) Verify Y" --updated-by ORCHESTRATOR`,why:"Write plan from text and set doc_updated_by."},{cmd:"agentplane task plan set 202602030608-F1Q8AB --file plan.md",why:"Write plan from a file."}],validateRaw:e=>{let t=typeof e.opts.text=="string",r=typeof e.opts.file=="string";if(t===r)throw y({spec:dl,message:"Provide exactly one of --text or --file."});let n=e.opts["updated-by"];if(typeof n=="string"&&n.trim().length===0)throw y({spec:dl,message:"Invalid value for --updated-by: empty."})},parse:e=>({taskId:String(e.args["task-id"]),text:typeof e.opts.text=="string"?e.opts.text:void 0,file:typeof e.opts.file=="string"?e.opts.file:void 0,updatedBy:typeof e.opts["updated-by"]=="string"?e.opts["updated-by"]:void 0})};});var cH={};S(cH,{runTaskPlan:()=>Yne,taskPlanSpec:()=>sh});var sh,Yne,HC=u(()=>{Oe();sh={id:["task","plan"],group:"Task",summary:"Task plan commands (set/approve/reject).",synopsis:["agentplane task plan <set|approve|reject> [args] [options]"],args:[{name:"cmd",required:false,variadic:true,valueHint:"<subcommand>"}],examples:[{cmd:'agentplane task plan set <task-id> --text "..." --updated-by ORCHESTRATOR',why:"Write or replace the task plan."},{cmd:"agentplane task plan approve <task-id> --by ORCHESTRATOR",why:"Approve the current task plan."},{cmd:'agentplane task plan reject <task-id> --by ORCHESTRATOR --note "..."',why:"Reject the current task plan with a note."}],parse:e=>ke(e)},Yne=async(e,t)=>{oe({spec:sh,cmd:t.cmd,subcommands:await ne(["task","plan"]),command:"task plan"});};});var dH={};S(dH,{makeRunTaskRebuildIndexHandler:()=>Qne,taskRebuildIndexSpec:()=>GC});function Qne(e){return async(t,r)=>(await(await e("task rebuild-index")).taskBackend.listTasks(),console.log(z("rebuild-index",void 0,"OK")),0)}var GC,VC=u(()=>{I();GC={id:["task","rebuild-index"],group:"Task",summary:"Rebuild the task index cache for the configured backend (best-effort).",examples:[{cmd:"agentplane task rebuild-index",why:"Rebuild tasks index cache."}],parse:()=>({})};});var mH={};S(mH,{runTaskReclaim:()=>Xne,taskReclaimSpec:()=>ll});var ll,lH,Xne,UC=u(()=>{H();I();rh();Es();ll={id:["task","reclaim"],group:"Task",summary:"Claim an interrupted task and persist a recovery handoff snapshot.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"author",valueHint:"<role>",description:"Role reclaiming the task."},{kind:"string",name:"reason",valueHint:"<text>",description:"Why the task is being reclaimed."},{kind:"boolean",name:"force",default:false,description:"Allow reclaim even when the latest run still appears alive."},{kind:"boolean",name:"json",default:false,description:"Emit the persisted reclaim handoff as JSON."}],validateRaw:e=>{for(let t of ["author","reason"]){let r=e.opts[t];if(typeof r!="string"||r.trim()==="")throw y({spec:ll,message:`Missing required option: --${t}.`})}},parse:e=>({taskId:String(e.args["task-id"]),author:String(e.opts.author),reason:String(e.opts.reason),force:e.opts.force===true,json:e.opts.json===true})},lH=A(),Xne=async(e,t)=>{let r=await nl({cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId});if(r.runner.next_action==="wait"&&!t.force)throw y({spec:ll,message:`Refusing to reclaim ${t.taskId}: the latest runner still appears alive. Use --force only if the handoff really is orphaned.`});let n=await th({cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId,from_role:r.latest_handoff?.to_role??r.latest_handoff?.from_role??"UNASSIGNED",to_role:t.author,reason:t.reason,next_actions:[`Reclaim by ${t.author}: follow runner_next_action=${r.runner.next_action??"none"}.`]}),o=Xr({git_root:n.ctx.resolvedProject.gitRoot,workflow_dir:n.ctx.config.paths.workflow_dir,task_id:t.taskId});if(await Ss({paths:o,handoff:n.handoff}),t.json)return lH.json(n.handoff),0;let i=[{label:"author",value:t.author},{label:"runner_next_action",value:n.handoff.runner?.next_action??"none"}];return n.handoff.runner?.next_command&&i.push({label:"runner_next_command",value:n.handoff.runner.next_command}),i.push({label:"latest",value:o.latest_path}),lH.report(i,{header:K(`task reclaimed: ${t.taskId}`)}),0};});var uH={};S(uH,{runTaskResumeContext:()=>Zne,taskResumeContextSpec:()=>WC});var WC,Zne,zC=u(()=>{I();rh();WC={id:["task","resume-context"],group:"Task",summary:"Print deterministic recovery context for continuing a task after interruption.",args:[{name:"task-id",required:true,valueHint:"<task-id>"},{name:"run-id",required:false,valueHint:"[run-id]"}],options:[{kind:"boolean",name:"json",default:false,description:"Emit machine-readable resume context JSON."}],parse:e=>({taskId:String(e.args["task-id"]),runId:typeof e.args["run-id"]=="string"?e.args["run-id"]:void 0,json:e.opts.json===true})},Zne=async(e,t)=>{let r=await nl({cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId,run_id:t.runId});return t.json?(process.stdout.write(`${JSON.stringify(r,null,2)}
604
+ `),0):(process.stdout.write(`${K(`task resume-context: ${t.taskId}`)}
605
+ `),process.stdout.write(`task_status: ${r.task_status}
606
+ `),process.stdout.write(`branch: ${r.branch??"<unknown>"}
607
+ `),process.stdout.write(`base_branch: ${r.base_branch??"<unknown>"}
608
+ `),process.stdout.write(`head_sha: ${r.head_sha??"<unknown>"}
609
+ `),r.pr_branch&&process.stdout.write(`pr_branch: ${r.pr_branch}
610
+ `),process.stdout.write(`runner_status: ${r.runner.status??"none"}
611
+ `),process.stdout.write(`runner_next_action: ${r.runner.next_action??"none"}
612
+ `),r.runner.next_command&&process.stdout.write(`runner_next_command: ${r.runner.next_command}
613
+ `),r.runner.resume_command&&process.stdout.write(`runner_resume_command: ${r.runner.resume_command}
614
+ `),r.runner.retry_command&&process.stdout.write(`runner_retry_command: ${r.runner.retry_command}
615
+ `),r.latest_handoff?(process.stdout.write(`handoff_from: ${r.latest_handoff.from_role}
616
+ `),process.stdout.write(`handoff_to: ${r.latest_handoff.to_role??"unassigned"}
617
+ `),process.stdout.write(`handoff_reason: ${r.latest_handoff.reason}
618
+ `)):process.stdout.write(`handoff: none
619
+ `),0)};});var ch,KC=u(()=>{ch={id:["task","run"],group:"Task",summary:"Prepare or run a task through the shared runner contract.",description:"Materializes runner bundle artifacts for a task and can execute the configured runner adapter against that prepared bundle.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"boolean",name:"dry-run",default:false,description:"Prepare runner artifacts and print invocation metadata without executing a runner."}],examples:[{cmd:"agentplane task run 202602030608-F1Q8AB --dry-run",why:"Materialize bundle/run artifacts and inspect the prepared runner invocation."},{cmd:"agentplane task run 202602030608-F1Q8AB",why:"Prepare bundle artifacts and execute the configured runner adapter for the task."}],parse:e=>({taskId:String(e.args["task-id"]),dryRun:e.opts["dry-run"]===true})};});var dh,JC=u(()=>{dh={id:["task","run","cancel"],group:"Task",summary:"Cancel an existing runner run and stop the supervised process when present.",description:"Loads an existing runner run from its artifacts, sends a termination signal to a live supervised process when one is recorded, and persists the resulting cancelled state for later resume or retry decisions.",args:[{name:"task-id",required:true,valueHint:"<task-id>"},{name:"run-id",required:true,valueHint:"<run-id>"}],examples:[{cmd:"agentplane task run cancel 202602030608-F1Q8AB run_20260323_abc123",why:"Cancel a prepared run or send a termination signal to a live supervised run."}],parse:e=>({taskId:String(e.args["task-id"]),runId:String(e.args["run-id"])})};});var lh,YC=u(()=>{lh={id:["task","run","resume"],group:"Task",summary:"Resume an existing execute-mode runner run in place.",description:"Loads an existing execute-mode runner run from its artifacts and re-executes the configured adapter against the same bundle and run directory.",args:[{name:"task-id",required:true,valueHint:"<task-id>"},{name:"run-id",required:true,valueHint:"<run-id>"}],examples:[{cmd:"agentplane task run resume 202602030608-F1Q8AB run_20260323_abc123",why:"Resume or re-execute a prepared/failed/cancelled run in place."}],parse:e=>({taskId:String(e.args["task-id"]),runId:String(e.args["run-id"])})};});var mh,QC=u(()=>{mh={id:["task","run","retry"],group:"Task",summary:"Retry an existing execute-mode runner run into a new run id.",description:"Loads an existing runner run, snapshots its bundle into a new run id, and executes the configured adapter against the new run directory while retaining the source run for traceability.",args:[{name:"task-id",required:true,valueHint:"<task-id>"},{name:"run-id",required:true,valueHint:"<run-id>"}],examples:[{cmd:"agentplane task run retry 202602030608-F1Q8AB run_20260323_abc123",why:"Create a new run from a failed/cancelled run snapshot and execute it."}],parse:e=>({taskId:String(e.args["task-id"]),runId:String(e.args["run-id"])})};});var ml,XC=u(()=>{H();ml={id:["task","run","show"],group:"Task",summary:"Inspect persisted runner state and result artifacts for an existing run.",description:"Loads an existing runner run from its artifacts and prints a structured summary of run-state, result metadata, and event counters. When run-id is omitted, the latest run for the task is selected.",args:[{name:"task-id",required:true,valueHint:"<task-id>"},{name:"run-id",required:false,valueHint:"[run-id]"}],options:[{kind:"boolean",name:"json",default:false,description:"Emit machine-readable runner inspection JSON."}],examples:[{cmd:"agentplane task run show 202602030608-F1Q8AB",why:"Inspect the latest persisted runner run for a task."},{cmd:"agentplane task run show 202602030608-F1Q8AB run_20260323_abc123",why:"Inspect a specific run by run id."},{cmd:"agentplane task run show 202602030608-F1Q8AB --json",why:"Inspect the latest run in machine-readable JSON form."}],validateRaw:e=>{let t=e.args["run-id"];if(typeof t=="string"&&t.trim()==="")throw y({spec:ml,message:"Invalid run-id: empty."})},parse:e=>({taskId:String(e.args["task-id"]),runId:typeof e.args["run-id"]=="string"?e.args["run-id"]:void 0,json:e.opts.json===true})};});var js,ZC=u(()=>{H();js={id:["task","run","tail"],group:"Task",summary:"Print the last N lines from the raw agent trace artifact for an existing runner run.",description:"Reads agent-trace.jsonl for an existing runner run and prints the last N lines. When run-id is omitted, the latest run for the task is selected.",args:[{name:"task-id",required:true,valueHint:"<task-id>"},{name:"run-id",required:false,valueHint:"[run-id]"}],options:[{kind:"string",name:"lines",valueHint:"<n>",description:"Optional. Number of trace lines to print from the end (default: 40)."}],examples:[{cmd:"agentplane task run tail 202602030608-F1Q8AB",why:"Print the last 40 trace lines for the latest task run."},{cmd:"agentplane task run tail 202602030608-F1Q8AB run_20260323_abc123 --lines 10",why:"Print the last 10 trace lines for a specific run."}],validateRaw:e=>{let t=e.args["run-id"];if(typeof t=="string"&&t.trim()==="")throw y({spec:js,message:"Invalid run-id: empty."});let r=typeof e.opts.lines=="string"?e.opts.lines.trim():"";if(r&&!/^[1-9]\d*$/u.test(r))throw y({spec:js,message:`Invalid value for --lines: ${JSON.stringify(e.opts.lines)}`})},parse:e=>({taskId:String(e.args["task-id"]),runId:typeof e.args["run-id"]=="string"?e.args["run-id"]:void 0,lines:typeof e.opts.lines=="string"&&e.opts.lines.trim().length>0?Number(e.opts.lines):40})};});var ul,eP=u(()=>{H();ul={id:["task","run","trace"],group:"Task",summary:"Print the raw agent trace artifact for an existing runner run.",description:"Reads agent-trace.jsonl for an existing runner run and writes it to stdout unchanged. When run-id is omitted, the latest run for the task is selected.",args:[{name:"task-id",required:true,valueHint:"<task-id>"},{name:"run-id",required:false,valueHint:"[run-id]"}],examples:[{cmd:"agentplane task run trace 202602030608-F1Q8AB",why:"Print the raw trace for the latest run of a task."},{cmd:"agentplane task run trace 202602030608-F1Q8AB run_20260323_abc123",why:"Print the raw trace for a specific run."}],validateRaw:e=>{let t=e.args["run-id"];if(typeof t=="string"&&t.trim()==="")throw y({spec:ul,message:"Invalid run-id: empty."})},parse:e=>({taskId:String(e.args["task-id"]),runId:typeof e.args["run-id"]=="string"?e.args["run-id"]:void 0})};});var pH={};S(pH,{makeRunTaskScaffoldHandler:()=>eoe,taskScaffoldSpec:()=>uh});function eoe(e){return async(t,r)=>await pp({ctx:await e("task scaffold"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,title:r.title,overwrite:r.overwrite,force:r.force,yes:r.yes,quiet:r.quiet})}var uh,tP=u(()=>{H();Nb();uh={id:["task","scaffold"],group:"Task",summary:"Write a task README file scaffold (for the current doc template).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"title",valueHint:"<text>",description:"Optional. Title used when scaffolding a missing task with --force."},{kind:"boolean",name:"overwrite",default:false,description:"Overwrite an existing README.md if it already exists."},{kind:"boolean",name:"force",default:false,description:"Allow scaffolding even if the task is missing from the backend."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action approval checks when required."},{kind:"boolean",name:"quiet",default:false,description:"Suppress normal output (still prints errors)."}],examples:[{cmd:"agentplane task scaffold 202602030608-F1Q8AB",why:"Write README.md from the existing task data."},{cmd:'agentplane task scaffold 202602030608-F1Q8AB --overwrite --title "My task" --force',why:"Overwrite README.md and allow missing task (uses --title)."}],validateRaw:e=>{let t=e.opts.title;if(typeof t=="string"&&t.trim()==="")throw y({spec:uh,message:"Invalid value for --title: empty."})},parse:e=>({taskId:String(e.args["task-id"]),title:typeof e.opts.title=="string"?e.opts.title:void 0,overwrite:e.opts.overwrite===true,force:e.opts.force===true,yes:e.opts.yes===true,quiet:e.opts.quiet===true})};});var fH={};S(fH,{makeRunTaskScrubHandler:()=>toe,taskScrubSpec:()=>pl});function toe(e){return async(t,r)=>await dp({ctx:await e("task scrub"),cwd:t.cwd,rootOverride:t.rootOverride,find:r.find,replace:r.replace,dryRun:r.dryRun,quiet:r.quiet})}var pl,rP=u(()=>{H();Pb();pl={id:["task","scrub"],group:"Task",summary:"Replace a string across all tasks (frontmatter + docs).",options:[{kind:"string",name:"find",valueHint:"<text>",required:true,description:"The string to search for."},{kind:"string",name:"replace",valueHint:"<text>",required:true,description:"The replacement string."},{kind:"boolean",name:"dry-run",default:false,description:"Print affected task ids without writing changes."},{kind:"boolean",name:"quiet",default:false,description:"Suppress normal output (still prints errors)."}],examples:[{cmd:'agentplane task scrub --find "agentctl" --replace "agentplane" --dry-run',why:"Preview which tasks would change."}],validateRaw:e=>{let t=e.opts.find,r=e.opts.replace;if(typeof t=="string"&&t.trim()==="")throw y({spec:pl,message:"Invalid value for --find: empty."});if(typeof r=="string"&&r.trim()==="")throw y({spec:pl,message:"Invalid value for --replace: empty."})},parse:e=>({find:String(e.opts.find),replace:String(e.opts.replace),dryRun:e.opts["dry-run"]===true,quiet:e.opts.quiet===true})};});var $s,gH=u(()=>{H();nr();$s={id:["task","search"],group:"Task",summary:"Search tasks by text or regex with optional filters.",args:[{name:"query",required:true,valueHint:"<query>"}],options:[{kind:"boolean",name:"regex",default:false,description:"Treat query as a regex."},{kind:"string",name:"status",valueHint:"<status>",repeatable:true,description:"Repeatable. Filter by status."},{kind:"string",name:"owner",valueHint:"<owner>",repeatable:true,description:"Repeatable. Filter by owner id."},{kind:"string",name:"tag",valueHint:"<tag>",repeatable:true,description:"Repeatable. Filter by tag."},{kind:"boolean",name:"strict-read",default:false,description:"Fail if task scan skips malformed/unreadable task files."},{kind:"string",name:"limit",valueHint:"<n>",description:"Max rows to print."}],examples:[{cmd:"agentplane task search cli",why:"Search tasks by substring."},{cmd:"agentplane task search 'CLI.*' --regex",why:"Search tasks by regex."}],validateRaw:e=>{if(!String(e.args.query??"").trim())throw y({spec:$s,message:"Missing query (expected non-empty text)"});for(let r of ["status","owner","tag"])if(Q(e.opts[r]).some(o=>o.trim()===""))throw y({spec:$s,message:`Invalid value for --${r}: empty.`});if(e.opts.limit!==void 0){let r=e.opts.limit;if(typeof r!="string")throw y({spec:$s,message:`Invalid value for --limit: ${JSON.stringify(r)} (expected integer)`});let n=Number.parseInt(r,10);if(!Number.isFinite(n))throw y({spec:$s,message:`Invalid value for --limit: ${r} (expected integer)`})}},parse:e=>({query:String(e.args.query),regex:e.opts.regex===true,filters:{status:Q(e.opts.status),owner:Q(e.opts.owner),tag:Q(e.opts.tag),limit:typeof e.opts.limit=="string"?Number.parseInt(e.opts.limit,10):void 0,quiet:true,strictRead:e.opts["strict-read"]===true}})};});var hH={};S(hH,{makeRunTaskSetStatusHandler:()=>roe,taskSetStatusSpec:()=>Ln});function roe(e){return async(t,r)=>await Yb({ctx:await e("task set-status"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,status:r.status,author:r.author,body:r.body,commit:r.commit,force:r.force,yes:r.yes,commitFromComment:r.commitFromComment,commitEmoji:r.commitEmoji,commitAllow:r.commitAllow,commitAutoAllow:r.commitAutoAllow,commitAllowTasks:r.commitAllowTasks,commitRequireClean:r.commitRequireClean,confirmStatusCommit:r.confirmStatusCommit,quiet:r.quiet})}var Ln,nP=u(()=>{H();nr();Di();Qb();Ln={id:["task","set-status"],group:"Task",summary:"Change a task status (optionally committing from the comment body).",args:[{name:"task-id",required:true,valueHint:"<task-id>"},{name:"status",required:true,valueHint:"<TODO|DOING|DONE|BLOCKED>"}],options:[{kind:"string",name:"author",valueHint:"<id>",description:"Optional. Comment/event author (requires --body)."},{kind:"string",name:"body",valueHint:"<text>",description:"Optional. Comment/event body (requires --author)."},{kind:"string",name:"commit",valueHint:"<hash>",description:"Optional. Record an existing commit hash/message into task metadata."},{kind:"boolean",name:"force",default:false,description:"Allow unsafe transitions (and DONE without using agentplane finish)."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action approval checks when required."},{kind:"boolean",name:"commit-from-comment",default:false,description:"Create a git commit from the provided comment body (requires --body)."},{kind:"string",name:"commit-emoji",valueHint:"<emoji>",description:"Optional. Emoji prefix used for commit-from-comment."},{kind:"string",name:"commit-allow",valueHint:"<path-prefix>",repeatable:true,description:"Repeatable. Allowlist prefix for commit-from-comment staging. Use minimal prefixes; '.' is rejected."},{kind:"boolean",name:"commit-auto-allow",default:false,description:"Deprecated. Disabled for safety; pass explicit --commit-allow prefixes.",deprecated:"disabled"},{kind:"boolean",name:"commit-allow-tasks",default:true,description:"Allow the tasks export snapshot plus artifacts under the active task subtree when commit-from-comment is used."},{kind:"boolean",name:"commit-require-clean",default:false,description:"Require a clean working tree before commit-from-comment."},{kind:"boolean",name:"confirm-status-commit",default:false,description:"Confirm status-commit when status_commit_policy requires confirmation."},{kind:"boolean",name:"quiet",default:false,description:"Suppress normal output (still prints errors)."}],examples:[{cmd:"agentplane task set-status 202602030608-F1Q8AB DOING",why:"Mark task as DOING."},{cmd:'agentplane task set-status 202602030608-F1Q8AB BLOCKED --author CODER --body "Waiting on upstream fix."',why:"Add a status change note."},{cmd:'agentplane task set-status 202602030608-F1Q8AB DOING --commit-from-comment --author CODER --body "Start: working on it" --commit-allow packages/agentplane',why:"Create a commit from the comment body (subject to policy and allowlist)."}],validateRaw:e=>{let t=e.opts.author,r=e.opts.body,n=typeof t=="string"&&t.trim()!=="",o=typeof r=="string"&&r.trim()!=="";if(n!==o)throw y({spec:Ln,message:"Both --author and --body must be provided together."});if(e.opts["commit-from-comment"]===true&&!o)throw y({spec:Ln,message:"--body is required when using --commit-from-comment."});let i=Q(e.opts["commit-allow"]);if(i.some(a=>a.trim()===""))throw y({spec:Ln,message:"Invalid value for --commit-allow: empty."});if(Lt(i).length>0)throw y({spec:Ln,message:qt("--commit-allow")});if(e.opts["commit-auto-allow"]===true)throw y({spec:Ln,message:"--commit-auto-allow is disabled; pass explicit --commit-allow <path-prefix>."});if(e.opts["commit-from-comment"]===true&&i.length===0)throw y({spec:Ln,message:"--commit-from-comment requires --commit-allow <path-prefix> (tip: `agentplane guard suggest-allow --format args`)."})},parse:e=>{let t=Q(e.opts["commit-allow"]);return {taskId:String(e.args["task-id"]),status:String(e.args.status),author:typeof e.opts.author=="string"?e.opts.author:void 0,body:typeof e.opts.body=="string"?e.opts.body:void 0,commit:typeof e.opts.commit=="string"?e.opts.commit:void 0,force:e.opts.force===true,yes:e.opts.yes===true,commitFromComment:e.opts["commit-from-comment"]===true,commitEmoji:typeof e.opts["commit-emoji"]=="string"?e.opts["commit-emoji"]:void 0,commitAllow:t,commitAutoAllow:e.opts["commit-auto-allow"]===true,commitAllowTasks:e.opts["commit-allow-tasks"]!==false,commitRequireClean:e.opts["commit-require-clean"]===true,confirmStatusCommit:e.opts["confirm-status-commit"]===true,quiet:e.opts.quiet===true}}};});var kH,yH=u(()=>{kH={id:["task","show"],group:"Task",summary:"Print task metadata as JSON (frontmatter shape).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],examples:[{cmd:"agentplane task show 202602030608-F1Q8AB",why:"Show task metadata."}],parse:e=>({taskId:String(e.args["task-id"])})};});var wH={};S(wH,{runTask:()=>noe,taskSpec:()=>ph});var ph,noe,oP=u(()=>{Oe();ph={id:["task"],group:"Task",summary:"Task lifecycle and task-store commands.",synopsis:["agentplane task <subcommand> [args] [options]"],args:[{name:"cmd",required:false,variadic:true,valueHint:"<subcommand>"}],notes:["Direct task route: task new -> task plan set -> task plan approve -> task start-ready -> task verify-show -> verify -> finish.","Use `agentplane help task plan`, `agentplane help task doc`, and `agentplane help task verify` to inspect task sub-areas.","Verification recording and closure stay top-level lifecycle commands: `agentplane verify ...` and `agentplane finish ...`."],examples:[{cmd:'agentplane task new --title "..." --description "..." --owner CODER --tag code',why:"Create a task."},{cmd:'agentplane task plan set <task-id> --text "..." --updated-by ORCHESTRATOR',why:"Write the execution plan."},{cmd:'agentplane task start-ready <task-id> --author CODER --body "Start: ..."',why:"Start the task after approval."},{cmd:"agentplane task verify-show <task-id>",why:"Show Verify Steps before running checks."},{cmd:"agentplane task run <task-id>",why:"Run an existing task through the shared runner flow."},{cmd:'agentplane task handoff record <task-id> --from CODER --reason "Paused for handoff"',why:"Persist a first-class handoff snapshot."},{cmd:'agentplane task hosted-close --event-json "$GITHUB_EVENT_PATH"',why:"Apply deterministic task closure from a merged hosted PR event on an automation branch."},{cmd:"agentplane task hosted-close-pr 202604091218-JREJ4K",why:"Open the hosted closure PR after a manual handoff comment leaves only the remote task-close branch."},{cmd:"agentplane task resume-context <task-id>",why:"Inspect deterministic recovery context before resuming or retrying a run."}],parse:e=>ke(e)},noe=async(e,t)=>{oe({spec:ph,cmd:t.cmd,subcommands:await ne(["task"]),command:"task"});};});var bH={};S(bH,{makeRunTaskStartReadyHandler:()=>ooe,taskStartReadySpec:()=>Ms});function ooe(e){return async(t,r)=>await i_({ctx:await e("task start-ready"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,author:r.author,body:r.body,force:r.force,yes:r.yes,quiet:r.quiet})}var Ms,iP=u(()=>{H();a_();Ms={id:["task","start-ready"],group:"Task",summary:"Run readiness checks and start a task in one deterministic command.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"author",valueHint:"<id>",required:true,description:"Comment author id (e.g. CODER)."},{kind:"string",name:"body",valueHint:"<text>",required:true,description:"Structured Start comment body."},{kind:"boolean",name:"force",default:false,description:"Override readiness and transition checks."},{kind:"boolean",name:"yes",default:false,description:"Auto-approve force-action checks when required."},{kind:"boolean",name:"quiet",default:false,description:"Suppress output."}],examples:[{cmd:'agentplane task start-ready 202602030608-F1Q8AB --author CODER --body "Start: implement parser hardening"',why:"Check readiness and transition to DOING without command chaining."}],validateRaw:e=>{let t=typeof e.args["task-id"]=="string"?e.args["task-id"].trim():"",r=typeof e.opts.author=="string"?e.opts.author.trim():"",n=typeof e.opts.body=="string"?e.opts.body.trim():"";if(!t)throw y({spec:Ms,message:"Invalid value for task-id: empty."});if(!r)throw y({spec:Ms,message:"Invalid value for --author: empty."});if(!n)throw y({spec:Ms,message:"Invalid value for --body: empty."})},parse:e=>({taskId:String(e.args["task-id"]),author:String(e.opts.author),body:String(e.opts.body),force:e.opts.force===true,yes:e.opts.yes===true,quiet:e.opts.quiet===true})};});var _H={};S(_H,{makeRunTaskUpdateHandler:()=>ioe,taskUpdateSpec:()=>Fs});function ioe(e){return async(t,r)=>await cp({ctx:await e("task update"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,title:r.title,description:r.description,priority:r.priority,owner:r.owner,tags:r.tags,replaceTags:r.replaceTags,dependsOn:r.dependsOn,replaceDependsOn:r.replaceDependsOn,verify:r.verify,replaceVerify:r.replaceVerify,allowPrimaryChange:r.allowPrimaryChange})}var Fs,aP=u(()=>{H();nr();Rb();le();Fs={id:["task","update"],group:"Task",summary:"Update an existing task.",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"string",name:"title",valueHint:"<text>",description:"Optional. New title."},{kind:"string",name:"description",valueHint:"<text>",description:"Optional. New description."},{kind:"string",name:"priority",valueHint:"<low|normal|med|high>",choices:["low","normal","med","high"],description:"Optional. New priority."},{kind:"string",name:"owner",valueHint:"<id>",description:"Optional. New owner id."},{kind:"string",name:"tag",valueHint:"<tag>",repeatable:true,description:"Repeatable. Adds a tag (use --replace-tags to replace)."},{kind:"boolean",name:"replace-tags",default:false,description:"Replace existing tags (instead of merging)."},{kind:"string",name:"depends-on",valueHint:"<task-id>",repeatable:true,coerce:e=>ri(e),description:"Repeatable. Adds a dependency (use --replace-depends-on to replace)."},{kind:"boolean",name:"replace-depends-on",default:false,description:"Replace existing dependencies (instead of merging)."},{kind:"string",name:"verify",valueHint:"<command>",repeatable:true,description:"Repeatable. Adds verification command(s) (use --replace-verify to replace)."},{kind:"boolean",name:"replace-verify",default:false,description:"Replace existing verify commands (instead of merging)."},{kind:"boolean",name:"allow-primary-change",default:false,description:"Explicitly allow changing the task primary tag during update."}],examples:[{cmd:'agentplane task update 202602030608-F1Q8AB --title "Refactor CLI" --owner CODER',why:"Update title and owner."},{cmd:"agentplane task update 202602030608-F1Q8AB --replace-tags --tag cli --tag code",why:"Replace tags."},{cmd:"agentplane task update 202602030608-F1Q8AB --replace-depends-on --depends-on 202602030608-AAAAAA",why:"Replace dependencies."}],validateRaw:e=>{for(let n of ["title","description","owner"]){let o=e.opts[n];if(typeof o=="string"&&o.trim()==="")throw y({spec:Fs,message:`Invalid value for --${n}: empty.`})}if(Q(e.opts.tag).some(n=>n.trim()===""))throw y({spec:Fs,message:"Invalid value for --tag: empty."});if(Q(e.opts.verify).some(n=>n.trim()===""))throw y({spec:Fs,message:"Invalid value for --verify: empty."})},parse:e=>{let t=Q(e.opts.tag),r=Q(e.opts["depends-on"]),n=Q(e.opts.verify);return {taskId:String(e.args["task-id"]),title:typeof e.opts.title=="string"?e.opts.title:void 0,description:typeof e.opts.description=="string"?e.opts.description:void 0,priority:e.opts.priority,owner:typeof e.opts.owner=="string"?e.opts.owner:void 0,tags:t,replaceTags:e.opts["replace-tags"]===true,dependsOn:r,replaceDependsOn:e.opts["replace-depends-on"]===true,verify:n,replaceVerify:e.opts["replace-verify"]===true,allowPrimaryChange:e.opts["allow-primary-change"]===true}}};});var vH={};S(vH,{makeRunTaskVerifyOkHandler:()=>aoe,taskVerifyOkSpec:()=>Vi});function aoe(e){return async(t,r)=>await Lp({ctx:await e("task verify ok"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,by:r.by,note:r.note,noteFile:r.noteFile,details:r.details,file:r.file,collectIncidents:r.collectIncidents,quiet:r.quiet,observation:r.observation,impact:r.impact,resolution:r.resolution,localOnly:r.localOnly,repoFixable:r.repoFixable,incidentScope:r.incidentScope,incidentTags:r.incidentTags,incidentMatch:r.incidentMatch,incidentAdvice:r.incidentAdvice,incidentRule:r.incidentRule})}var Vi,sP=u(()=>{ld();Wd();Vi={id:["task","verify","ok"],group:"Task",summary:"Record verification as OK (updates Verification section and verification frontmatter).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:rg,examples:[{cmd:'agentplane task verify ok 202602030608-F1Q8AB --by REVIEWER --note "Looks good"',why:"Record an OK verification."}],validateRaw:e=>{ys(e,Vi,{message:"Provide at most one of --details or --file."}),ws(e,Vi,"by"),bs(e,Vi),So(e,Vi);},parse:e=>({taskId:String(e.args["task-id"]),..._s(e)})};});var xH={};S(xH,{makeRunTaskVerifyReworkHandler:()=>soe,taskVerifyReworkSpec:()=>Ui});function soe(e){return async(t,r)=>await qp({ctx:await e("task verify rework"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,by:r.by,note:r.note,noteFile:r.noteFile,details:r.details,file:r.file,collectIncidents:r.collectIncidents,quiet:r.quiet,observation:r.observation,impact:r.impact,resolution:r.resolution,localOnly:r.localOnly,repoFixable:r.repoFixable,incidentScope:r.incidentScope,incidentTags:r.incidentTags,incidentMatch:r.incidentMatch,incidentAdvice:r.incidentAdvice,incidentRule:r.incidentRule})}var Ui,cP=u(()=>{ld();Wd();Ui={id:["task","verify","rework"],group:"Task",summary:"Record verification as needs rework (resets commit, sets status to DOING, updates Verification).",args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:rg,examples:[{cmd:'agentplane task verify rework 202602030608-F1Q8AB --by REVIEWER --note "Needs changes"',why:"Record a needs-rework verification."}],validateRaw:e=>{ys(e,Ui,{message:"Provide at most one of --details or --file."}),ws(e,Ui,"by"),bs(e,Ui),So(e,Ui);},parse:e=>({taskId:String(e.args["task-id"]),..._s(e)})};});var RH={};S(RH,{makeRunTaskVerifyShowHandler:()=>coe,taskVerifyShowSpec:()=>dP});function coe(e){return async(t,r)=>{let n=await e("task verify-show"),o=n.taskBackend;if(!o.getTaskDoc)throw new m({exitCode:2,code:"E_USAGE",message:tt("task docs")});let i=await ue({ctx:n,taskId:r.taskId}),a=typeof i.doc=="string"?i.doc:await o.getTaskDoc(r.taskId)??"",s=be(a,"Verify Steps");if(!r.quiet)hn({taskId:r.taskId,sectionText:s,action:"show Verify Steps",guidance:"fill it before verification"});else if(!ru(s))return 0;return await Ka({ctx:n,cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId,section:"Verify Steps",quiet:r.quiet})}}var dP,lP=u(()=>{I();v();N();md();le();dP={id:["task","verify-show"],group:"Task",summary:'Print the task Verify Steps acceptance contract (alias for task doc show --section "Verify Steps").',args:[{name:"task-id",required:true,valueHint:"<task-id>"}],options:[{kind:"boolean",name:"quiet",default:false,description:"Suppress errors when the section is missing."}],examples:[{cmd:"agentplane task verify-show 202602030608-F1Q8AB",why:"Print Verify Steps."},{cmd:"agentplane task verify-show 202602030608-F1Q8AB --quiet",why:"Print Verify Steps without erroring when missing."}],notes:["`## Verify Steps` is the ex-ante acceptance contract for the verifier.","Verification results are recorded later in `## Verification` via `agentplane verify ...`."],parse:e=>({taskId:String(e.args["task-id"]),quiet:e.opts.quiet===true})};});var CH={};S(CH,{runTaskVerify:()=>doe,taskVerifySpec:()=>fh});async function doe(e,t){oe({spec:fh,cmd:t.subcommand?[t.subcommand]:[],subcommands:await ne(["task","verify"])});}var fh,mP=u(()=>{Oe();fh={id:["task","verify"],group:"Task",summary:"Record verification results (ok/rework).",synopsis:["agentplane task verify ok <task-id> --by <id> --note <text> [--details <text> | --file <path>] [--quiet]","agentplane task verify rework <task-id> --by <id> --note <text> [--details <text> | --file <path>] [--quiet]"],args:[{name:"subcommand",required:false,valueHint:"<ok|rework>"}],parse:e=>({subcommand:typeof e.args.subcommand=="string"?e.args.subcommand:void 0})};});function Bs(e,t,r){r&&e.push(`${t}=${r}`);}function PH(e){return e===void 0?null:JSON.stringify(e)}function gh(e){return e?Object.entries(e.fields).map(([t,r])=>{let n=[`capability[${t}]:`,`level=${r.level}`,`channel=${r.channel}`];return Bs(n,"supported",r.supported_values?.length?r.supported_values.join(","):null),Bs(n,"note",r.note??null),n.join(" ")}):[]}function hh(e){return e?Object.entries(e.fields).map(([t,r])=>{let n=[`policy_field[${t}]:`,`status=${r.status}`,`capability=${r.capability_level}`,`channel=${r.channel}`];return Bs(n,"requested",PH(r.requested)),Bs(n,"effective",PH(r.effective)),Bs(n,"supported",r.supported_values?.length?r.supported_values.join(","):null),Bs(n,"note",r.note??null),n.join(" ")}):[]}var uP=u(()=>{});var SH={};S(SH,{runTaskRunShow:()=>foe,taskRunShowSpec:()=>ml});function loe(e){return e.kind==="task"?`task ${e.task_id??"<unknown>"}`:`recipe ${e.recipe_id??"<unknown>"}:${e.scenario_id??"<unknown>"}`+(e.task_id?` -> task ${e.task_id}`:"")}function moe(e){return e?.length?e.map(t=>t.label?`${t.label}=${t.path}`:t.path).join(", "):null}function uoe(e){if(!e)return null;let t=[];return typeof e.duration_ms=="number"&&t.push(`duration_ms=${e.duration_ms}`),typeof e.stdout_bytes=="number"&&t.push(`stdout_bytes=${e.stdout_bytes}`),typeof e.stderr_bytes=="number"&&t.push(`stderr_bytes=${e.stderr_bytes}`),(e.output_last_message_bytes===null||typeof e.output_last_message_bytes=="number")&&t.push(`output_last_message_bytes=${e.output_last_message_bytes??"null"}`),t.length>0?t.join(", "):null}function poe(e){return {task_id:e.task_id,run_id:e.run_id,selection:e.selection,paths:e.paths,bundle:e.bundle,state:e.state,events:e.events,events_count:e.events.length,last_event:e.events.at(-1)??null}}var TH,foe,EH=u(()=>{D();I();v();uP();rl();XC();TH=A();foe=async(e,t)=>{try{let r=await tl({cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId,run_id:t.runId});if(t.json)return TH.json(poe(r)),0;let n=[{label:"selection",value:r.selection},{label:"run_id",value:r.run_id},{label:"status",value:r.state.status},{label:"adapter",value:r.state.adapter_id},{label:"mode",value:r.state.mode},{label:"target",value:loe(r.state.target)},{label:"created_at",value:r.state.created_at},{label:"updated_at",value:r.state.updated_at},{label:"bundle",value:r.paths.bundle_path},{label:"result",value:r.paths.result_path},{label:"state",value:r.paths.state_path},{label:"events",value:r.paths.events_path},{label:"trace",value:r.paths.trace_path},{label:"stderr",value:r.paths.stderr_path},{label:"events_count",value:r.events.length}];if(r.events.length>0){let s=r.events.at(-1);n.push({label:"last_event",value:s?.type??"unknown"});}let o=r.bundle.execution.adapter_capabilities??r.state.prepared_metadata?.adapter_capabilities??null;n.push({label:"capabilities",value:JSON.stringify(o)},...gh(o??void 0),{label:"policy_requested",value:JSON.stringify(r.state.policy_decision?.requested??{})},{label:"policy_effective",value:JSON.stringify(r.state.policy_decision?.effective??{})},{label:"policy_fields",value:JSON.stringify(r.state.policy_decision?.fields??{})},{label:"policy_refusal",value:JSON.stringify(r.state.policy_decision?.refusal_reason??null)},...hh(r.state.policy_decision)),r.state.result?.summary&&n.push({label:"summary",value:r.state.result.summary}),r.state.result?.stdout_summary&&n.push({label:"stdout_summary",value:r.state.result.stdout_summary}),r.state.result?.stderr_summary&&n.push({label:"stderr_summary",value:r.state.result.stderr_summary}),r.state.result?.timeout_reason&&n.push({label:"timeout_reason",value:r.state.result.timeout_reason});let i=uoe(r.state.result?.metrics);i&&n.push({label:"metrics",value:i});let a=moe(r.state.result?.artifacts);return a&&n.push({label:"artifacts",value:a}),TH.report(n,{header:K(`task run show: ${t.taskId}`)}),0}catch(r){throw r instanceof m?r:E(r,{command:"task run show",task_id:t.taskId,run_id:t.runId??null})}};});var IH={};S(IH,{runTaskRunTail:()=>goe,taskRunTailSpec:()=>js});var goe,AH=u(()=>{D();v();rl();ZC();goe=async(e,t)=>{try{let r=await Wq({cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId,run_id:t.runId,lines:t.lines});return process.stdout.write(r.tail_text),0}catch(r){throw r instanceof m?r:E(r,{command:"task run tail",task_id:t.taskId,run_id:t.runId??null})}};});function OH(e){let t=e.argv.map(r=>r.trim()).filter(r=>r.length>0).join(" ");return t.length>0?t:null}function pP(e,t){return {...e,...Object.fromEntries(Object.entries(t).filter(([,r])=>r!==void 0))}}function DH(e,t){return {executable:e.argv[0]??null,argv_count:e.argv.length,cwd:e.run_dir,env_keys:Object.keys(e.env).toSorted(),has_bootstrap_path:typeof e.bootstrap_path=="string"&&e.bootstrap_path.trim().length>0,has_output_last_message_path:typeof e.output_last_message_path=="string"&&e.output_last_message_path.trim().length>0,has_trace_path:typeof e.trace_path=="string"&&e.trace_path.trim().length>0,has_stderr_path:typeof e.stderr_path=="string"&&e.stderr_path.trim().length>0,trace_policy:e.trace_policy,timeout_policy:e.timeout_policy,pid:t}}async function NH(e){let t=Date.now(),r=e.poll_ms??100;for(;Date.now()-t<e.timeout_ms;){let o=await Fn(e.state_path);if(o&&o.status!=="running")return o;await new Promise(i=>setTimeout(i,r));}let n=await Fn(e.state_path);return n&&n.status!=="running"?n:null}var fP=u(()=>{Bn();});function yoe(e){if(e.kind==="task")return `task ${e.task_id}`;let t=`recipe ${e.recipe_id}:${e.scenario_id}`;return e.task_id?`${t} -> task ${e.task_id}`:t}function woe(e){let t=(e??"").replaceAll(`\r
620
+ `,`
621
+ `).trimEnd();if(!t)return [fl,Ls].join(`
622
+ `);let r=t.includes(fl),n=t.includes(Ls);return r&&n?t:[t,"",fl,Ls].join(`
623
+ `)}function jH(e,t){let r=woe(e),n=r.indexOf(fl),o=r.indexOf(Ls);if(n===-1||o===-1||o<=n)throw new Error("Runner outcome markers are malformed");let i=r.slice(0,n).trimEnd(),a=r.slice(o+Ls.length).trimStart(),s=[];return i&&s.push(i,""),s.push(fl),t.trim()&&s.push("",t.trimEnd()),s.push("",Ls),a&&s.push("",a),s.join(`
624
+ `).trimEnd()}function boe(e,t){return `.agentplane/tasks/${e}/runs/${t}`}function _oe(e){let t=e.trim();return t?t.slice(0,1).toUpperCase()+t.slice(1):"Runner"}function LH(e){let t=_oe(e.adapter_id);return e.status==="prepared"?`${t} runner is prepared.`:e.status==="running"?`${t} runner is running.`:e.status==="success"?`${t} runner completed successfully.`:e.status==="cancelled"?`${t} runner was cancelled.`:`${t} runner failed; inspect run artifacts for details.`}function kh(e){return {run_id:e.run_id,status:e.status,adapter_id:e.adapter_id,mode:e.mode,updated_at:e.updated_at,...e.started_at?{started_at:e.started_at}:{},...e.ended_at?{ended_at:e.ended_at}:{},exit_code:e.exit_code,target:{...e.target},...e.summary?{summary:e.summary}:{},...e.output_paths?.length?{output_paths:[...e.output_paths]}:{},...e.metrics?{metrics:{...e.metrics}}:{},...e.evidence?{evidence:{...e.evidence}}:{}}}function voe(e){return e?e.history?.length?e.history.map(t=>kh(t)):[kh(e)]:[]}function xoe(e){if(!e)return null;let t=[];return typeof e.duration_ms=="number"&&t.push(`duration_ms=${e.duration_ms}`),typeof e.stdout_bytes=="number"&&t.push(`stdout_bytes=${e.stdout_bytes}`),typeof e.stderr_bytes=="number"&&t.push(`stderr_bytes=${e.stderr_bytes}`),(e.output_last_message_bytes===null||typeof e.output_last_message_bytes=="number")&&t.push(`output_last_message_bytes=${e.output_last_message_bytes??"null"}`),t.length>0?t.join(", "):null}function Roe(e){return e==="success"?"runner completed successfully; human verification and closure remain explicit lifecycle steps.":e==="failed"?"runner failed; inspect artifacts before retrying or recording verification evidence.":e==="cancelled"?"runner was cancelled; verification evidence is incomplete until a later run succeeds.":e==="running"?"runner is still executing; verification evidence is not complete yet.":"runner is prepared but has not produced verification-relevant output yet."}function Coe(e){if(!e)return [];let t=[];return e.evidence_paths?.length&&t.push(`EvidencePaths: ${e.evidence_paths.join(", ")}`),e.changed_paths?.length&&t.push(`ChangedPaths: ${e.changed_paths.join(", ")}`),typeof e.files_changed_count=="number"&&t.push(`FilesChangedCount: ${e.files_changed_count}`),e.tests_run?.length&&t.push(`TestsRun: ${e.tests_run.join(" | ")}`),e.verification_candidates?.length&&t.push(`VerificationCandidates: ${e.verification_candidates.join(" | ")}`),t}function $H(e){let t=e.entry.summary??LH({adapter_id:e.entry.adapter_id,status:e.entry.status}),r=e.projection?.result?.capabilities_used,n=e.entry.output_paths,o=e.entry.metrics,i=e.entry.evidence,a=[`#### ${e.entry.updated_at} \u2014 RUNNER \u2014 ${e.entry.status}`,"",`RunId: ${e.entry.run_id}`,"",`Adapter: ${e.entry.adapter_id}`,"",`Mode: ${e.entry.mode}`,"",`Target: ${yoe(e.entry.target)}`,"",`UpdatedAt: ${e.entry.updated_at}`,"",`RunArtifacts: ${boe(e.task_id,e.entry.run_id)}`,"",`ExitCode: ${e.entry.exit_code??"null"}`];e.entry.started_at&&a.push("",`StartedAt: ${e.entry.started_at}`),e.entry.ended_at&&a.push("",`EndedAt: ${e.entry.ended_at}`),t&&a.push("",`Summary: ${t}`),e.projection?.result?.artifacts?.length&&a.push("",`Artifacts: ${e.projection.result.artifacts.map(d=>d.label?`${d.label}=${d.path}`:d.path).join(", ")}`),!e.projection?.result?.artifacts?.length&&n?.length&&a.push("",`Outputs: ${n.join(", ")}`),r?.length&&a.push("",`Capabilities: ${r.join(", ")}`);let s=xoe(o);s&&a.push("",`Metrics: ${s}`);let c=Coe(i);return c.length>0&&a.push("",...c),a.push("",`VerificationHint: ${Roe(e.entry.status)}`),`${a.join(`
625
+ `).trimEnd()}
626
+ `}function Poe(e){let{state:t,result:r}=e,n={run_id:t.run_id,status:t.status,adapter_id:t.adapter_id,mode:t.mode,updated_at:t.updated_at,exit_code:t.result?.exit_code??null,target:{...t.target}};return r?.started_at&&(n.started_at=r.started_at),r?.ended_at&&(n.ended_at=r.ended_at),n.summary=LH({adapter_id:t.adapter_id,status:t.status}),r?.output_paths?.length&&(n.output_paths=[...r.output_paths]),r?.metrics&&(n.metrics={...r.metrics}),r?.evidence&&(n.evidence={...r.evidence}),n}function Toe(e){let t=[],r=new Set;for(let n of [e.latest,...voe(e.previous)])if(!r.has(n.run_id)&&(r.add(n.run_id),t.push(kh(n)),t.length>=koe))break;return t}function MH(e){let t=Poe(e.projection),r=Toe({latest:t,previous:e.previous});return r.length>1?{...t,history:r}:t}function FH(e){let t=e.outcome.history?.length?e.outcome.history:[kh(e.outcome)],[r,...n]=t;return [$H({task_id:e.task_id,entry:r,projection:e.projection}),...n.map(o=>$H({task_id:e.task_id,entry:o}))].join(`
627
+ `).trimEnd()}function BH(e){let t=typeof e.owner=="string"?e.owner.trim():"";if(t)return t;let r=typeof e.doc_updated_by=="string"?e.doc_updated_by.trim():"";return r||"agentplane"}async function qn(e){if(e.bundle?.execution.mode==="dry_run"||e.state.mode==="dry_run")return;let t=e.ctx.taskBackend;if(!t.writeTask)throw new m({exitCode:2,code:"E_USAGE",message:tt("task writes")});if(Lw(e.ctx)){await Lr(e.ctx).mutate(e.task_id,f=>{let b={state:e.state,result:e.state.result??null},w=MH({projection:b,previous:f.runner??null}),_=Se(f.doc_version),x=Xt(_),C=so({allowedSections:e.ctx.config.tasks.doc.sections,requiredSections:e.ctx.config.tasks.doc.required_sections,targetSection:x}),j=ensureDocSections(String(f.doc??""),C),T=be(j,x),M=jH(T,FH({task_id:e.task_id,outcome:w,projection:b}));return [Br({runner:w}),tr({section:x,text:M,requiredSections:C}),Ke({updatedBy:BH(f),version:_})]});return}let n=await ue({ctx:e.ctx,taskId:e.task_id}),o={state:e.state,result:e.state.result??null},i=MH({projection:o,previous:n.runner??null}),a=so({allowedSections:e.ctx.config.tasks.doc.sections,requiredSections:e.ctx.config.tasks.doc.required_sections,targetSection:Xt(Se(n.doc_version))}),s=ensureDocSections(String(n.doc??""),a),c=Se(n.doc_version),d=Xt(c),l=be(s,d),p=jH(l,FH({task_id:e.task_id,outcome:i,projection:o})),g=ensureDocSections(setMarkdownSection(s,d,p),a);await t.writeTask({...n,runner:i,doc:g,doc_updated_at:e.state.updated_at,doc_updated_by:BH(n)});}var fl,Ls,koe,yh=u(()=>{I();N();qr();le();v();fl="<!-- BEGIN RUNNER OUTCOME -->",Ls="<!-- END RUNNER OUTCOME -->",koe=5;});function qs(){return new Date().toISOString()}function gl(e){let t=e.started_at??qs(),r=e.ended_at??qs();return {status:"success",exit_code:e.exit_code??0,started_at:t,ended_at:r,summary:e.summary,stdout_summary:e.stdout_summary,output_paths:e.output_paths,metrics:e.metrics,timeout_reason:e.timeout_reason}}function Hn(e){let t=e.started_at??qs(),r=e.ended_at??qs(),n=e.stderr_summary??(e.err instanceof Error?e.err.message:String(e.err));return {status:"failed",exit_code:e.exit_code??1,started_at:t,ended_at:r,summary:e.summary,stderr_summary:n,output_paths:e.output_paths,metrics:e.metrics,timeout_reason:e.timeout_reason}}function Hs(e){let t=e.started_at??qs(),r=e.ended_at??qs();return {status:"cancelled",exit_code:e.exit_code??null,started_at:t,ended_at:r,summary:e.summary,stderr_summary:e.stderr_summary??e.reason,output_paths:e.output_paths,metrics:e.metrics,timeout_reason:e.timeout_reason}}function qH(e){let t=e.filter(r=>typeof r.path=="string"&&r.path.trim().length>0).map(r=>({path:r.path,...r.label?{label:r.label}:{}}));return t.length>0?t:void 0}var Wi=u(()=>{});function wh(e,t){let r=Date.parse(e),n=Date.parse(t);if(!(Number.isNaN(r)||Number.isNaN(n)))return Math.max(0,n-r)}function hP(e,t={}){return {executable:e.argv[0]??null,argv_count:e.argv.length,cwd:e.run_dir,env_keys:Object.keys(e.env).toSorted(),trace_policy:e.trace_policy,timeout_policy:e.timeout_policy,has_bootstrap_path:typeof e.bootstrap_path=="string"&&e.bootstrap_path.trim().length>0,...t}}function bh(e){return qH([{path:e.invocation.bundle_path,label:"bundle"},{path:e.invocation.bootstrap_path,label:"bootstrap"},{path:e.trace_artifact_path,label:"raw-trace"},{path:e.trace_archive_path,label:"raw-trace-gzip"},{path:e.stderr_artifact_path,label:"stderr-log"},{path:e.stderr_archive_path,label:"stderr-log-gzip"},{path:e.source_manifest_path,label:"source-result-manifest"},...e.include_output_last_message?[{path:e.invocation.output_last_message_path,label:"assistant-last-message"}]:[],{path:e.invalid_manifest_path,label:"invalid-result-manifest"},{path:e.invocation.result_path,label:"result-manifest"}])??[]}var _h=u(()=>{Wi();});function en(e,t,r){throw new hl({result_path:e,reason:t,raw_content:r})}function wP(e){return !!e&&typeof e=="object"&&!Array.isArray(e)}function Gs(e){if(!Array.isArray(e))return;let t=e.map(r=>{if(typeof r!="string")throw new Error("entries must be strings");let n=r.trim();if(!n)throw new Error("entries must be non-empty strings");return n});return t.length>0?t:void 0}function UH(e,t){if(typeof e!="string")throw new Error(`${t} must be a non-empty string`);let r=e.trim();if(!r)throw new Error(`${t} must be a non-empty string`);if(r.length>GH)throw new Error(`${t} must be at most ${String(GH)} characters`);if(!HH.test(r))throw new Error(`${t} must match ${String(HH)} and contain only lower-case machine-safe identifier tokens`);return r}function Ioe(e,t){if(!Array.isArray(e))return;let r=e.map((n,o)=>UH(n,`${t}[${String(o)}]`));return r.length>0?r:void 0}function Aoe(e){if(!Array.isArray(e))return;let t=e.map(r=>{if(!wP(r))throw new Error("artifacts entries must be objects");let n=typeof r.path=="string"?r.path.trim():"";if(!n)throw new Error("artifacts[].path must be a non-empty string");return r.label===void 0?{path:n}:{path:n,label:UH(r.label,"artifacts[].label")}});return t.length>0?t:void 0}function Ooe(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,r={};if(t.duration_ms!==void 0){let n=t.duration_ms;if(typeof n!="number"||!Number.isInteger(n)||n<0)throw new Error("metrics.duration_ms must be a non-negative integer");r.duration_ms=n;}if(t.stdout_bytes!==void 0){let n=t.stdout_bytes;if(typeof n!="number"||!Number.isInteger(n)||n<0)throw new Error("metrics.stdout_bytes must be a non-negative integer");r.stdout_bytes=n;}if(t.stderr_bytes!==void 0){let n=t.stderr_bytes;if(typeof n!="number"||!Number.isInteger(n)||n<0)throw new Error("metrics.stderr_bytes must be a non-negative integer");r.stderr_bytes=n;}if(t.output_last_message_bytes!==void 0){let n=t.output_last_message_bytes;if(n!==null&&(typeof n!="number"||!Number.isInteger(n)||n<0))throw new Error("metrics.output_last_message_bytes must be null or a non-negative integer");r.output_last_message_bytes=n;}return Object.keys(r).length>0?r:void 0}function Doe(e){if(!wP(e))return;let t={},r=Gs(e.evidence_paths);r&&(t.evidence_paths=r);let n=Gs(e.changed_paths);n&&(t.changed_paths=n);let o=Gs(e.tests_run);o&&(t.tests_run=o);let i=Gs(e.verification_candidates);if(i&&(t.verification_candidates=i),e.files_changed_count!==void 0){if(typeof e.files_changed_count!="number"||!Number.isInteger(e.files_changed_count)||e.files_changed_count<0)throw new Error("evidence.files_changed_count must be a non-negative integer");t.files_changed_count=e.files_changed_count;}return Object.keys(t).length>0?t:void 0}function Noe(e){return e==="success"||e==="failed"||e==="cancelled"?e:void 0}function joe(e){return e==="idle"||e==="wall_clock"?e:void 0}async function WH(e){try{let t=await readFile(e,"utf8"),r;try{r=JSON.parse(t);}catch(i){let a=i instanceof Error?i.message:String(i);en(e,`result.json must contain valid JSON (${a})`,t);}wP(r)||en(e,"result.json must contain a JSON object",t);let n=r;n.schema_version!==vh&&en(e,`schema_version must be ${vh}`,t);let o={schema_version:vh};if(n.status!==void 0){let i=Noe(n.status);i||en(e,"status must be success, failed, or cancelled",t),o.status=i;}if(n.exit_code!==void 0){let i=n.exit_code;i!==null&&(typeof i!="number"||!Number.isInteger(i)||i<0)&&en(e,"exit_code must be null or a non-negative integer",t),o.exit_code=i;}if(n.summary!==void 0&&((typeof n.summary!="string"||!n.summary.trim())&&en(e,"summary must be a non-empty string when present",t),o.summary=n.summary.trim()),n.stdout_summary!==void 0&&((typeof n.stdout_summary!="string"||!n.stdout_summary.trim())&&en(e,"stdout_summary must be a non-empty string when present",t),o.stdout_summary=n.stdout_summary.trim()),n.stderr_summary!==void 0&&((typeof n.stderr_summary!="string"||!n.stderr_summary.trim())&&en(e,"stderr_summary must be a non-empty string when present",t),o.stderr_summary=n.stderr_summary.trim()),n.timeout_reason!==void 0){let i=joe(n.timeout_reason);i||en(e,"timeout_reason must be idle or wall_clock when present",t),o.timeout_reason=i;}try{o.artifacts=Aoe(n.artifacts),o.findings=Gs(n.findings),o.verification_hints=Gs(n.verification_hints),o.capabilities_used=Ioe(n.capabilities_used,"capabilities_used"),o.metrics=Ooe(n.metrics),o.evidence=Doe(n.evidence);}catch(i){let a=i instanceof Error?i.message:String(i);en(e,a,t);}return o}catch(t){if(t?.code==="ENOENT")return null;throw t}}function $oe(e){let t=Ye.dirname(e),r=Ye.basename(e,".json");return Ye.join(t,`${r}${Soe}`)}function Moe(e){let t=Ye.dirname(e),r=Ye.basename(e,".json");return Ye.join(t,`${r}${Eoe}`)}async function zH(e){let t=$oe(e.result_path);return await mkdir(Ye.dirname(t),{recursive:true}),await atomicWriteFile(t,e.error.raw_content,"utf8"),t}async function bP(e){try{let t=await readFile(e,"utf8"),r=Moe(e);return await mkdir(Ye.dirname(r),{recursive:!0}),await atomicWriteFile(r,t,"utf8"),r}catch(t){if(t?.code==="ENOENT")return null;throw t}}async function _P(e){await mkdir(Ye.dirname(e.result_path),{recursive:true}),await atomicWriteFile(e.result_path,`${JSON.stringify(e.manifest,null,2)}
628
+ `,"utf8");}function KH(e){if(!e.manifest)return e.base;let t={...e.base,status:e.base.status==="cancelled"?"cancelled":e.manifest.status??e.base.status,exit_code:e.base.status==="cancelled"?e.base.exit_code:e.manifest.exit_code??e.base.exit_code,summary:e.manifest.summary??e.base.summary,stdout_summary:e.manifest.stdout_summary??e.base.stdout_summary,stderr_summary:e.manifest.stderr_summary??e.base.stderr_summary,timeout_reason:e.manifest.timeout_reason??e.base.timeout_reason,artifacts:e.manifest.artifacts??e.base.artifacts,findings:e.manifest.findings??e.base.findings,verification_hints:e.manifest.verification_hints??e.base.verification_hints,capabilities_used:e.manifest.capabilities_used??e.base.capabilities_used,metrics:{...e.base.metrics,...e.manifest.metrics},evidence:e.manifest.evidence??e.base.evidence};return t.artifacts&&t.artifacts.length>0&&(t.output_paths=t.artifacts.map(r=>r.path)),t}function vP(e){return {schema_version:vh,status:e.status,exit_code:e.exit_code,summary:e.summary,stdout_summary:e.stdout_summary,stderr_summary:e.stderr_summary,timeout_reason:e.timeout_reason,artifacts:e.artifacts??e.output_paths?.map(t=>({path:t})),findings:e.findings,verification_hints:e.verification_hints,capabilities_used:e.capabilities_used,metrics:e.metrics,evidence:e.evidence}}var vh,Soe,Eoe,hl,HH,GH,xP=u(()=>{vh=1,Soe=".invalid.json",Eoe=".source.json",hl=class extends Error{result_path;reason;raw_content;constructor(t){super(`Invalid runner result manifest at ${t.result_path}: ${t.reason}`),this.name="InvalidRunnerResultManifestError",this.result_path=t.result_path,this.reason=t.reason,this.raw_content=t.raw_content;}};HH=/^[a-z0-9]+(?:[._:-][a-z0-9]+)*$/,GH=64;});function xh(e){if(e.bundle.execution.adapter_id!==e.adapterId)throw new Error(`${e.label} adapter cannot prepare bundle for adapter_id=${JSON.stringify(e.bundle.execution.adapter_id)}`);if(!e.bundle.execution.artifact_paths.bundle_path.trim())throw new Error(`${e.label} adapter requires a non-empty bundle path`);if(!e.bundle.execution.artifact_paths.run_dir.trim())throw new Error(`${e.label} adapter requires a non-empty run dir`)}function Rh(e){let{invocation:t}=e;if(t.adapter_id!==e.adapterId)throw new Error(`${e.label} adapter cannot execute invocation for adapter_id=${JSON.stringify(t.adapter_id)}`);let r=[["bundle_path",t.bundle_path],["run_dir",t.run_dir],["state_path",t.state_path],["events_path",t.events_path],["result_path",t.result_path],["trace_path",t.trace_path],["stderr_path",t.stderr_path]];e.requireBootstrap&&r.push(["bootstrap_path",t.bootstrap_path]);for(let[n,o]of r)if(!o?.trim())throw new Error(`${e.label} adapter invocation is missing ${n}`);if(e.minArgvLength!==void 0&&t.argv.length<e.minArgvLength)throw new Error(`${e.label} adapter invocation is missing normalized argv metadata`)}async function JH(e){let t=await e.repository.readState();t&&await e.repository.writeState(at({state:t,status:e.result.status,result:e.result,supervision:{...t.supervision,pid:e.processResult.pid,command:e.command,started_at:e.processResult.started_at,heartbeat_at:e.processResult.heartbeat_at,exit_signal:e.processResult.exit_signal,timeout_reason:e.processResult.timeout_reason,timeout_requested_at:e.processResult.timeout_requested_at,terminate_sent_at:e.processResult.terminate_sent_at,kill_sent_at:e.processResult.kill_sent_at,force_killed:e.processResult.force_killed}}));}async function YH(e){let t=await e.repository.readState();t&&await e.repository.writeState(at({state:t,status:e.result.status,result:e.result}));}async function QH(e){await e.repository.appendEvent({at:e.result.ended_at,type:"runner_execute_finish",message:e.message,data:{...hP(e.invocation),pid:e.processResult.pid,exit_signal:e.processResult.exit_signal,cancel_requested_at:e.processResult.cancel_requested_at,cancel_signal:e.processResult.cancel_signal,timeout_reason:e.processResult.timeout_reason,timeout_requested_at:e.processResult.timeout_requested_at,terminate_sent_at:e.processResult.terminate_sent_at,kill_sent_at:e.processResult.kill_sent_at,force_killed:e.processResult.force_killed,exit_code:e.result.exit_code,output_paths:e.outputPaths,metrics:e.result.metrics}});}async function XH(e){await e.repository.appendEvent({at:e.result.ended_at,type:e.type,message:e.message,data:{...hP(e.invocation),exit_code:e.result.exit_code,output_paths:e.outputPaths,metrics:e.result.metrics}});}var Ch=u(()=>{Bn();_h();});function eG(e){let t=e.trim();if(t.length===0)return null;let r=t.replaceAll("\\","/");if(r.startsWith("/")||/^[A-Za-z]:\//u.test(r))return null;let n=Ye.posix.normalize(r);return !n||n==="."||n===".."||n.startsWith("../")?null:n.replace(/\/+$/u,"")}function Vs(e){let t=[],r=(e??[]).map(n=>{let o=eG(n);return o||t.push(n),o}).filter(Boolean);if(t.length>0)throw new m({exitCode:k("E_RUNTIME"),code:"E_RUNTIME",message:`Recipe writes_artifacts_to contains invalid relative prefixes: ${t.join(", ")}.`,context:{policy_field:"writes_artifacts_to",invalid_declared_prefixes:t}});return r}function ZH(e,t){let r=eG(e);return r?t.some(n=>r===n||r.startsWith(`${n}/`)):false}function tG(e){let t=e?.AGENTPLANE_RECIPE_WRITES_ARTIFACTS_TO;if(!t)return;let r;try{r=JSON.parse(t);}catch{return}if(Array.isArray(r))return Vs(r.filter(n=>typeof n=="string"))}function rG(e){if(!e.manifest)return;let t=Vs(e.allowed_prefixes);if(t.length===0)return;let r=(e.manifest.artifacts??[]).map(i=>i.path).filter(i=>!ZH(i,t)),n=(e.manifest.evidence?.evidence_paths??[]).filter(i=>!ZH(i,t));if(r.length===0&&n.length===0)return;let o=[];throw r.length>0&&o.push(`artifacts=${r.join(", ")}`),n.length>0&&o.push(`evidence_paths=${n.join(", ")}`),new m({exitCode:k("E_RUNTIME"),code:"E_RUNTIME",message:`Runner result manifest reported paths outside recipe writes_artifacts_to prefixes (${t.join(", ")}): ${o.join("; ")}.`,context:{adapter_id:e.adapter_id,policy_field:"writes_artifacts_to",declared_value:t,invalid_artifact_paths:r,invalid_evidence_paths:n}})}var Ph=u(()=>{G();v();});function RP(e){let t=typeof e=="string"?e.trim():"";return t.length>0?t:void 0}function Boe(e){if(Array.isArray(e))return e.filter(t=>typeof t=="string").map(t=>t.trim()).filter(t=>t.length>0)}function Loe(e,t,r){r&&(e[t]=r);}function nG(e,t,r){r!==void 0&&(e[t]=JSON.stringify(r));}function Vn(e){let t=e?.run_profile;if(!t||typeof t!="object")return null;let r=t;return {sandbox:RP(r.sandbox),writes_artifacts_to:Boe(r.writes_artifacts_to)}}function Th(e){let t={},r=RP(e?.recipe_id),n=RP(e?.scenario_id);r&&(t.AGENTPLANE_RECIPE_ID=r),n&&(t.AGENTPLANE_SCENARIO_ID=n);let o=Vn(e);if(!o)return t;Loe(t,"AGENTPLANE_RECIPE_SANDBOX",o.sandbox);let i=Vs(o.writes_artifacts_to),a={...o,writes_artifacts_to:i};return nG(t,"AGENTPLANE_RECIPE_WRITES_ARTIFACTS_TO",i),nG(t,"AGENTPLANE_RECIPE_RUN_PROFILE",a),t}var kl=u(()=>{Ph();});function Goe(e){let t=typeof e=="string"?e.trim():"";if(!t)return "danger-full-access";if(oG.has(t))return t;throw new m({exitCode:k("E_RUNTIME"),code:"E_RUNTIME",message:`Codex runner does not support recipe sandbox ${JSON.stringify(t)}; supported values: ${CP.join(", ")}.`,context:{adapter_id:"codex",requested_sandbox:t,supported_sandboxes:CP}})}function aG(e){let{execution:t}=e.bundle,r=Vn(e.bundle.recipe),n=Goe(r?.sandbox),o=Th(e.bundle.recipe),i=Ye.join(t.artifact_paths.run_dir,Hoe);return {adapter_id:e.adapterId,run_id:t.run_id,run_dir:t.artifact_paths.run_dir,bundle_path:t.artifact_paths.bundle_path,state_path:t.artifact_paths.state_path,events_path:t.artifact_paths.events_path,result_path:t.artifact_paths.result_path,trace_path:t.artifact_paths.trace_path,stderr_path:t.artifact_paths.stderr_path,trace_policy:t.trace_policy,timeout_policy:t.timeout_policy,bootstrap_path:t.artifact_paths.bootstrap_path,output_last_message_path:i,argv:["codex","-a","never","exec","--json","--output-last-message",i,"-C",e.bundle.repository.git_root,"-s",n,"-"],env:{AGENTPLANE_RUNNER_ADAPTER:e.adapterId,AGENTPLANE_RUNNER_MODE:t.mode,AGENTPLANE_RUNNER_API_VERSION:e.bundle.runner_api_version,AGENTPLANE_RUNNER_TARGET:e.bundle.target.kind,AGENTPLANE_RUNNER_RESULT_PATH:t.artifact_paths.result_path,...o},dry_run:t.mode==="dry_run"}}var Hoe,oG,CP,iG,sG=u(()=>{G();v();kl();Hoe="codex-last-message.md",oG=new Set(["read-only","workspace-write","danger-full-access"]),CP=[...oG],iG={adapter_id:"codex",fields:{sandbox:{level:"native",channel:"argv",supported_values:CP,note:"Recipe sandbox is enforced through codex --sandbox argv mapping."},writes_artifacts_to:{level:"advisory",channel:"env",note:"Recipe artifact prefixes are exported through env and enforced post-run against external manifest artifacts and evidence paths."}}};});var PP=u(()=>{});function Uoe(e){let t=e.replaceAll(`\r
629
+ `,`
630
+ `);return t.endsWith(`
631
+ `)?t.slice(0,-1):t}function Woe(e){let t=e.trim();if(t)try{let r=JSON.parse(t);if(r&&typeof r=="object"&&!Array.isArray(r))return r}catch{}}function cG(e){let t=Uoe(e.raw),r=Woe(t);return {schema_version:1,ts:e.ts??new Date().toISOString(),seq:e.seq,stream:e.stream,adapter_id:e.adapter_id,kind:r?"json_event":"text",raw:t,...r?{parsed:r}:{}}}function dG(e){return `${JSON.stringify(e)}
632
+ `}var lG=u(()=>{PP();});function Koe(e){return e instanceof Error?e:new Error(String(e))}var yl,mG=u(()=>{yl=class{#i;#o;#t="";#r=false;#e=null;#n=[];constructor(t){this.#i=t.file_path,this.#o=t.on_error;}append(t){if(t){if(this.#e){this.#o(this.#e);return}this.#t+=t,this.#r||(this.#r=true,this.#a());}}async flush(){if(this.#e)throw this.#e;!this.#r&&!this.#t||await new Promise((t,r)=>{this.#n.push({resolve:t,reject:r});});}async#a(){try{for(;this.#t;){let t=this.#t;this.#t="",await appendFile(this.#i,t,"utf8");}this.#r=!1,this.#s();}catch(t){this.#e=Koe(t),this.#t="",this.#r=false,this.#c(this.#e),this.#o(this.#e);}}#s(){let t=this.#n;this.#n=[];for(let r of t)r.resolve();}#c(t){let r=this.#n;this.#n=[];for(let n of r)n.reject(t);}};});function TP(e,t,r){let n=Buffer.from(`${e}${t}`,"utf8");return n.length<=r?n.toString("utf8"):n.subarray(n.length-r).toString("utf8")}function uG(e){let t=[],r=0;for(;r<e.length;){let n=e.indexOf(`
633
+ `,r);if(n===-1)return {lines:t,remainder:e.slice(r)};let o=e.slice(r,n);o.endsWith("\r")&&(o=o.slice(0,-1)),t.push(o),r=n+1;}return {lines:t,remainder:""}}var pG=u(()=>{});async function fG(e){return await new Promise((t,r)=>{let[n,...o]=e.invocation.argv;if(!n){r(new Error("Runner invocation is missing the executable command"));return}let i=startProcess({command:n,args:o,cwd:e.invocation.run_dir,env:{...process.env,...e.invocation.env},stdin:"pipe",stdout:"pipe",stderr:"pipe"}),a=typeof i.pid=="number"?i.pid:null,s=new Date().toISOString(),c=s,d="",l="",p=0,g=0,h="",f="",b=0,w=false,_=e.invocation.trace_policy,x=e.invocation.timeout_policy,C=_.mode,j=_.capture_stderr,T=_.max_tail_bytes,M=_.redact_patterns??[],$=null,W=null,Z=null,U=null,J=null,pe=null,ye=null,Y=async()=>{await Promise.all([Ji.flush(),Vh.flush()]);},Re=(me,Ae)=>{if(me==="trace"&&C!=="raw"||me==="stderr"&&!j)return;(me==="trace"?Ji:Vh).append(Ae);},Ue=(me,Ae)=>{b+=1,Re("trace",dG(cG({ts:new Date().toISOString(),seq:b,stream:me,adapter_id:e.invocation.adapter_id,raw:Ae})));},V=(me,Ae)=>{let{lines:Ne,remainder:Yi}=uG(me);for(let iT of Ne)Ue(Ae,iT);return Yi},se=()=>{J&&clearTimeout(J),pe&&clearTimeout(pe),ye&&clearTimeout(ye),J=null,pe=null,ye=null;},Xe=async me=>{let Ae=await Fn(e.invocation.state_path);Ae&&await Zd({state_path:e.invocation.state_path,state:at({state:Ae,status:Ae.status,updated_at:new Date().toISOString(),supervision:pP(Ae.supervision,me)})});},Bo=me=>{if(w||$)return;if($=me,W=new Date().toISOString(),Z=W,Xe({timeout_reason:me,timeout_requested_at:W,terminate_sent_at:Z,heartbeat_at:W}).catch(We),Gi({events_path:e.invocation.events_path,event:{at:W,type:"runner_timeout_requested",message:`runner timeout requested (${me})`,data:{reason:me,pid:a,timeout_policy:x}}}).catch(We),a&&Gt(a))try{process.kill(a,"SIGTERM");}catch(Ne){if(Ne?.code!=="ESRCH"){We(Ne);return}}let Ae=x.terminate_grace_ms;if(Ae<=0){if(U=new Date().toISOString(),Xe({timeout_reason:me,timeout_requested_at:W,terminate_sent_at:Z,kill_sent_at:U,force_killed:true,heartbeat_at:U}).catch(We),a&&Gt(a))try{process.kill(a,"SIGKILL");}catch(Ne){Ne?.code!=="ESRCH"&&We(Ne);}return}ye=setTimeout(()=>{if(!(w||!$)&&(U=new Date().toISOString(),Xe({timeout_reason:$,timeout_requested_at:W,terminate_sent_at:Z,kill_sent_at:U,force_killed:true,heartbeat_at:U}).catch(We),Gi({events_path:e.invocation.events_path,event:{at:U,type:"runner_timeout_force_kill",message:`runner force-killed after timeout (${$})`,data:{reason:$,pid:a,timeout_policy:x}}}).catch(We),a&&Gt(a)))try{process.kill(a,"SIGKILL");}catch(Ne){Ne?.code!=="ESRCH"&&We(Ne);}},Ae);},Us=()=>{x.idle_ms<=0||w||$||(J&&clearTimeout(J),J=setTimeout(()=>{Bo("idle");},x.idle_ms));},Tr=async()=>{let me=await Fn(e.invocation.state_path);if(!me)return;let Ae=pP(me.supervision,{pid:a,command:OH(e.invocation),started_at:s,heartbeat_at:c,exit_signal:null,timeout_reason:null});await Zd({state_path:e.invocation.state_path,state:at({state:me,status:"running",updated_at:s,supervision:Ae})}),await Gi({events_path:e.invocation.events_path,event:{at:s,type:"runner_execute_start",message:e.start_message,data:DH(e.invocation,a)}});},We=me=>{w||(se(),w=true,Cl(me));},Cl=async me=>{await Promise.allSettled([Ji.flush(),Vh.flush()]),r(me instanceof Error?me:new Error(String(me)));},Ji=new yl({file_path:e.invocation.trace_path,on_error:We}),Vh=new yl({file_path:e.invocation.stderr_path,on_error:We});Tr().catch(me=>{if(a&&Gt(a))try{process.kill(a,"SIGKILL");}catch{}We(me);}),i.stdout?.on("data",me=>{let Ae=me.toString(),Ne=_C(Ae,M);c=new Date().toISOString(),Us(),p+=Buffer.byteLength(Ae,"utf8"),d=TP(d,Ne,T),h=V(`${h}${Ne}`,"stdout");}),i.stderr?.on("data",me=>{let Ae=me.toString(),Ne=_C(Ae,M);c=new Date().toISOString(),Us(),g+=Buffer.byteLength(Ae,"utf8"),l=TP(l,Ne,T),f=V(`${f}${Ne}`,"stderr"),Re("stderr",Ne);}),i.on("error",We),i.on("close",(me,Ae)=>{(async()=>{if(w)return;se();let Ne=new Date().toISOString();if(h&&Ue("stdout",h),f&&Ue("stderr",f),await Y(),w)return;let Yi=Nq(Ae),zn=(await Fn(e.invocation.state_path))?.supervision,aT=zn?.cancel_requested_at?"cancelled":$?"failed":me===0?"success":"failed",[sT,cT]=await Promise.all([vC({file_path:e.invocation.trace_path,policy:_,run_status:aT}),vC({file_path:e.invocation.stderr_path,policy:_,run_status:aT})]);w=true,t({exit_code:me,exit_signal:Yi,stdout_tail:d,stderr_tail:l,stdout_bytes:p,stderr_bytes:g,pid:a,started_at:s,ended_at:Ne,cancel_requested_at:zn?.cancel_requested_at??null,cancel_signal:zn?.cancel_signal??null,timeout_reason:zn?.timeout_reason??$,timeout_requested_at:zn?.timeout_requested_at??W,terminate_sent_at:zn?.terminate_sent_at??Z,kill_sent_at:zn?.kill_sent_at??U,force_killed:zn?.force_killed===true||U!==null,heartbeat_at:c||Ne,trace_artifact_path:sT.artifact_path,trace_archive_path:sT.archive_path,stderr_artifact_path:cT.artifact_path,stderr_archive_path:cT.archive_path});})().catch(We);}),x.wall_clock_ms>0&&(pe=setTimeout(()=>{Bo("wall_clock");},x.wall_clock_ms)),Us(),i.stdin?.end(e.stdin_text);})}var gG=u(()=>{Bn();xC();lG();qi();mG();fP();pG();});async function Sh(e){let{invocation:t}=e,r=new Date().toISOString(),n=null;try{e.assertInvocation(t);let o=st.fromInvocation(t),i=await e.readStdinText(t);n=await fG({invocation:t,stdin_text:i,start_message:e.startMessage});let a=await WH(t.result_path),s=e.preserveSourceManifestOnSuccess?.(a)===!0?await bP(t.result_path):null;rG({adapter_id:t.adapter_id,allowed_prefixes:tG(t.env),manifest:a}),e.assertManifest?.({invocation:t,processResult:n,manifest:a});let c=e.buildArtifacts({invocation:t,processResult:n,source_manifest_path:s}),d=c.map(g=>g.path),l=await e.buildBaseResult({invocation:t,processResult:n,artifacts:c,output_paths:d}),p=e.applyManifest({base:l,manifest:a});return await _P({result_path:t.result_path,manifest:vP(p)}),await JH({repository:o,result:p,processResult:n,command:t.argv.join(" ")}),await QH({repository:o,invocation:t,result:p,processResult:n,message:e.successEventMessage(p),outputPaths:d}),p}catch(o){let i=new Date().toISOString(),a=await bP(t.result_path),s=o instanceof hl?await zH({result_path:t.result_path,error:o}):null,c=e.buildArtifacts({invocation:t,processResult:n,source_manifest_path:a,invalid_manifest_path:s}),d=c.map(g=>g.path),l=Hn({err:o,summary:e.failureSummary,started_at:r,ended_at:i,exit_code:o instanceof m?o.exitCode:void 0,output_paths:d});await _P({result_path:t.result_path,manifest:vP({...l,artifacts:c,capabilities_used:e.capabilitiesUsed(t)})});let p=st.fromInvocation(t);return await YH({repository:p,result:l}),await XH({repository:p,invocation:t,result:l,type:e.failureEventType,message:e.failureEventMessage(l),outputPaths:d}),l}}var SP=u(()=>{v();gG();xP();Ph();Ns();Ch();Wi();});function Yoe(e){return Buffer.byteLength(e??"","utf8")}async function Qoe(e){if(!e?.trim())return null;try{return await readFile(e,"utf8")}catch{return null}}function Xoe(e){return bh({invocation:e.invocation,trace_artifact_path:e.processResult?.trace_artifact_path,trace_archive_path:e.processResult?.trace_archive_path,stderr_artifact_path:e.processResult?.stderr_artifact_path,stderr_archive_path:e.processResult?.stderr_archive_path,source_manifest_path:e.source_manifest_path,invalid_manifest_path:e.invalid_manifest_path,include_output_last_message:true})}function Zoe(e){xh({adapterId:"codex",label:"Codex",bundle:e});}function eie(e){Rh({adapterId:"codex",label:"Codex",invocation:e,requireBootstrap:true,minArgvLength:5});}function tie(e){if(!e.invocation.dry_run&&e.processResult.exit_code===0&&e.processResult.timeout_reason===null&&!e.processResult.cancel_requested_at&&e.manifest===null)throw new m({exitCode:k("E_RUNTIME"),code:"E_RUNTIME",message:`Codex exited successfully but did not write a valid runner result manifest to ${JSON.stringify(e.invocation.result_path)}.`,context:{adapter_id:"codex",result_path:e.invocation.result_path,exit_code:e.processResult.exit_code}})}var wl,EP=u(()=>{G();v();Wi();_h();qi();xP();Ch();sG();SP();wl=class{id="codex";describeCapabilities(t){return structuredClone(iG)}prepare(t){return Zoe(t),Promise.resolve(aG({adapterId:this.id,bundle:t}))}execute(t){return Sh({invocation:t,assertInvocation:eie,readStdinText:async r=>await readFile(r.bootstrap_path,"utf8"),startMessage:"codex exec started",buildArtifacts:Xoe,capabilitiesUsed:()=>["codex.exec"],assertManifest:tie,applyManifest:({base:r,manifest:n})=>KH({base:r,manifest:n}),successEventMessage:r=>`codex exec finished with status=${r.status}`,failureSummary:"Codex execution failed before producing a valid result manifest.",failureEventType:"runner_execute_error",failureEventMessage:r=>r.stderr_summary??"codex exec failed",buildBaseResult:async({processResult:r,artifacts:n,output_paths:o})=>{let i=await Qoe(t.output_last_message_path),a=r.exit_code===0,s=r.ended_at,c=r.timeout_reason!==null,d={duration_ms:wh(r.started_at,s),stdout_bytes:r.stdout_bytes,stderr_bytes:r.stderr_bytes,output_last_message_bytes:i===null?null:Yoe(i)};return {...c?Hn({err:new Error(`Codex execution timed out (${r.timeout_reason}).`),summary:`Codex execution timed out (${r.timeout_reason}).`,stderr_summary:"Timeout details were captured in stderr.log and agent-trace.jsonl.",started_at:r.started_at,ended_at:s,exit_code:124,output_paths:o,metrics:d,timeout_reason:r.timeout_reason}):r.cancel_requested_at?Hs({reason:r.cancel_signal?`Codex runner cancelled via ${r.cancel_signal}.`:"Codex runner cancelled.",summary:"Codex execution was cancelled.",stderr_summary:"Cancellation details were recorded in stderr.log and agent-trace.jsonl.",started_at:r.started_at,ended_at:s,exit_code:r.exit_code??Ds(r.exit_signal)??null,output_paths:o,metrics:d}):a?gl({summary:"Codex execution completed successfully.",started_at:r.started_at,ended_at:s,exit_code:r.exit_code??0,stdout_summary:i?.trim()?"Assistant output was captured in codex-last-message.md; raw execution trace is in agent-trace.jsonl.":"Raw execution trace was captured in agent-trace.jsonl.",output_paths:o,metrics:d}):Hn({err:new Error(`Codex exited with code ${r.exit_code??"unknown"}`),summary:"Codex execution failed.",stderr_summary:"Failure details were captured in stderr.log and agent-trace.jsonl.",started_at:r.started_at,ended_at:s,exit_code:r.exit_code??Ds(r.exit_signal)??1,output_paths:o,metrics:d,timeout_reason:r.timeout_reason}),artifacts:n,capabilities_used:["codex.exec"]}}})}};});function IP(e){return {mode:e?.enforcement?.mode??"none",platform:e?.enforcement?.platform??"auto"}}function kG(e){let t=IP(e),r=`Configured via runner.custom.enforcement.mode=${JSON.stringify(t.mode)} (platform=${JSON.stringify(t.platform)}).`;return {adapter_id:"custom",fields:{sandbox:t.mode==="codex_sandbox_full_auto"?{level:"wrapper",channel:"argv",supported_values:[...Eh],note:`${r} Custom runner sandbox is enforced through \`codex sandbox <platform> --full-auto\` and currently supports workspace-write only, because the shared runner contract requires writable result and trace artifacts inside run_dir.`}:{level:"advisory",channel:"env",note:`${r} Custom runner receives sandbox intent through env only; the adapter does not enforce it.`},writes_artifacts_to:{level:"advisory",channel:"env",note:"Recipe artifact prefixes are exported through env and enforced post-run against external manifest artifacts and evidence paths."}}}}function rie(e){let t=(()=>{switch(process.platform){case "darwin":return "macos";case "linux":return "linux";case "win32":return "windows";default:return null}})();if(!t)throw new m({exitCode:k("E_RUNTIME"),code:"E_RUNTIME",message:`Custom runner codex sandbox wrapper does not support current platform ${JSON.stringify(process.platform)}.`,context:{adapter_id:"custom",wrapper_mode:"codex_sandbox_full_auto",platform:process.platform,policy_field:"sandbox"}});if(e&&e!=="auto"){if(e!==t)throw new m({exitCode:k("E_RUNTIME"),code:"E_RUNTIME",message:`Custom runner codex sandbox wrapper is configured for ${JSON.stringify(e)} but current platform is ${JSON.stringify(t)}.`,context:{adapter_id:"custom",wrapper_mode:"codex_sandbox_full_auto",configured_platform:e,platform:t,policy_field:"sandbox"}});return e}return t}function nie(e){let t={adapter_id:"custom",wrapper_mode:e.enforcementMode,policy_field:"sandbox",declared_value:e.requestedSandbox,supported_values:Eh};return e.requestedSandbox==="read-only"?new m({exitCode:k("E_RUNTIME"),code:"E_RUNTIME",message:`Custom runner wrapper mode ${JSON.stringify(e.enforcementMode)} cannot support recipe sandbox ${JSON.stringify(e.requestedSandbox)} because the shared runner contract requires write access to result.json and trace artifacts inside run_dir, while the default codex sandbox blocks writes to cwd and TMPDIR. Supported values: workspace-write.`,context:t}):new m({exitCode:k("E_RUNTIME"),code:"E_RUNTIME",message:`Custom runner wrapper mode ${JSON.stringify(e.enforcementMode)} does not support recipe sandbox ${JSON.stringify(e.requestedSandbox)}; supported values: ${Eh.join(", ")}.`,context:t})}function oie(e){let t=IP(e.config);if(t.mode!=="codex_sandbox_full_auto")return e.command;let r=Vn(e.bundle.recipe),n=typeof r?.sandbox=="string"?r.sandbox.trim():"";if(!n)return e.command;if(!Eh.includes(n))throw nie({enforcementMode:t.mode,requestedSandbox:n});return ["codex","sandbox",rie(t.platform),"--full-auto",...e.command]}function iie(e){return Array.isArray(e)?e.map(t=>t.trim()).filter(t=>t.length>0):[]}function yG(e){let t=iie(e.config?.command);if(t.length===0)throw new Error("Custom runner adapter requires config.runner.custom.command to contain at least one argv element");let{execution:r}=e.bundle,n=Th(e.bundle.recipe),o=IP(e.config),i=oie({config:e.config,bundle:e.bundle,command:t});return {adapter_id:e.adapterId,run_id:r.run_id,run_dir:r.artifact_paths.run_dir,bundle_path:r.artifact_paths.bundle_path,state_path:r.artifact_paths.state_path,events_path:r.artifact_paths.events_path,result_path:r.artifact_paths.result_path,trace_path:r.artifact_paths.trace_path,stderr_path:r.artifact_paths.stderr_path,trace_policy:r.trace_policy,timeout_policy:r.timeout_policy,bootstrap_path:r.artifact_paths.bootstrap_path,output_last_message_path:null,argv:i,env:{...e.config?.env,AGENTPLANE_RUNNER_ADAPTER:e.adapterId,AGENTPLANE_RUNNER_MODE:r.mode,AGENTPLANE_RUNNER_API_VERSION:e.bundle.runner_api_version,AGENTPLANE_RUNNER_TARGET:e.bundle.target.kind,AGENTPLANE_RUNNER_BUNDLE_PATH:r.artifact_paths.bundle_path,AGENTPLANE_RUNNER_RUN_DIR:r.artifact_paths.run_dir,AGENTPLANE_RUNNER_BOOTSTRAP_PATH:r.artifact_paths.bootstrap_path,AGENTPLANE_RUNNER_STATE_PATH:r.artifact_paths.state_path,AGENTPLANE_RUNNER_EVENTS_PATH:r.artifact_paths.events_path,AGENTPLANE_RUNNER_RESULT_PATH:r.artifact_paths.result_path,AGENTPLANE_RUNNER_ENFORCEMENT_MODE:o.mode??"none",AGENTPLANE_RUNNER_ENFORCEMENT_PLATFORM:o.platform??"auto",...n},dry_run:r.mode==="dry_run"}}var Eh,wG=u(()=>{G();v();kl();Eh=["workspace-write"];});function sie(e){xh({adapterId:"custom",label:"Custom",bundle:e});}function cie(e){return bh({invocation:e.invocation,trace_artifact_path:e.processResult?.trace_artifact_path,trace_archive_path:e.processResult?.trace_archive_path,stderr_artifact_path:e.processResult?.stderr_artifact_path,stderr_archive_path:e.processResult?.stderr_archive_path,source_manifest_path:e.source_manifest_path,invalid_manifest_path:e.invalid_manifest_path,include_output_last_message:false})}function die(e,t){let r=[],n=new Set;for(let o of [...e??[],...t??[]]){let i=`${o.path}::${o.label??""}`;n.has(i)||(n.add(i),r.push(o));}return r.length>0?r:void 0}function lie(e){if(!e.manifest)return e.base;let t={...e.base,status:e.base.status==="cancelled"?"cancelled":e.manifest.status??e.base.status,exit_code:e.base.status==="cancelled"?e.base.exit_code:e.manifest.exit_code??e.base.exit_code,artifacts:die(e.base.artifacts,e.manifest.artifacts),capabilities_used:e.manifest.capabilities_used??e.base.capabilities_used,metrics:{...e.base.metrics,...e.manifest.metrics},evidence:e.manifest.evidence??e.base.evidence};return t.artifacts&&t.artifacts.length>0&&(t.output_paths=t.artifacts.map(r=>r.path)),t}var bl,AP=u(()=>{Wi();_h();qi();Ch();wG();SP();bl=class{constructor(t){this.config=t;}id="custom";describeCapabilities(t){return structuredClone(kG(this.config))}prepare(t){return sie(t),Promise.resolve(yG({adapterId:this.id,config:this.config,bundle:t}))}execute(t){return Sh({invocation:t,assertInvocation:r=>Rh({adapterId:"custom",label:"Custom",invocation:r}),readStdinText:async r=>r.bootstrap_path?await readFile(r.bootstrap_path,"utf8"):"",startMessage:"custom runner started",buildArtifacts:cie,preserveSourceManifestOnSuccess:r=>r!==null,capabilitiesUsed:r=>[`custom:${r.argv[0]??"runner"}`],applyManifest:lie,successEventMessage:r=>`custom runner finished with status=${r.status}`,failureSummary:"Custom runner execution failed before producing a valid result manifest.",failureEventType:"runner_execute_finish",failureEventMessage:r=>`custom runner failed with status=${r.status}`,buildBaseResult:({processResult:r,artifacts:n,output_paths:o})=>{let i=r.exit_code===0,a=r.ended_at,s=r.timeout_reason!==null,c={duration_ms:wh(r.started_at,a),stdout_bytes:r.stdout_bytes,stderr_bytes:r.stderr_bytes};return {...s?Hn({err:new Error(`Custom runner execution timed out (${r.timeout_reason}).`),summary:`Custom runner execution timed out (${r.timeout_reason}).`,stderr_summary:"Timeout details were captured in stderr.log and agent-trace.jsonl.",started_at:r.started_at,ended_at:a,exit_code:124,output_paths:o,metrics:c,timeout_reason:r.timeout_reason}):r.cancel_requested_at?Hs({reason:r.cancel_signal?`Custom runner cancelled via ${r.cancel_signal}.`:"Custom runner cancelled.",summary:"Custom runner execution was cancelled.",stderr_summary:"Cancellation details were recorded in stderr.log and agent-trace.jsonl.",started_at:r.started_at,ended_at:a,exit_code:r.exit_code??Ds(r.exit_signal)??null,output_paths:o,metrics:c}):i?gl({summary:"Custom runner execution completed successfully.",started_at:r.started_at,ended_at:a,exit_code:r.exit_code??0,stdout_summary:"Raw execution trace was captured in agent-trace.jsonl.",output_paths:o,metrics:c}):Hn({err:new Error(`Custom runner exited with code ${r.exit_code??"unknown"}`),summary:"Custom runner execution failed.",stderr_summary:"Failure details were captured in stderr.log and agent-trace.jsonl.",started_at:r.started_at,ended_at:a,exit_code:r.exit_code??Ds(r.exit_signal)??1,output_paths:o,metrics:c,timeout_reason:r.timeout_reason}),artifacts:n,capabilities_used:[`custom:${t.argv[0]??"runner"}`]}}})}};});function Fo(e){switch(e.runner.default_adapter){case "codex":return new wl;case "custom":return new bl(e.runner.custom)}}var Ih=u(()=>{EP();AP();EP();AP();Wi();});function mie(e){let t=e.trim();if(!t)throw new Error("Behavior resolution requires a non-empty key.");return t}function uie(e){return e.map((t,r)=>({...t,order:t.order??0,index:r}))}function pie(e,t){return bG[e.layer]-bG[t.layer]||e.order-t.order||e.source.localeCompare(t.source)||e.index-t.index}function _G(e,t){return {layer:e.layer,source:e.source,order:e.order,selected:t,...e.metadata?{metadata:structuredClone(e.metadata)}:{}}}function Un(e){let t=mie(e.key);if(e.candidates.length===0)throw new Error(`Behavior resolution requires at least one candidate: ${t}`);let r=uie(e.candidates).toSorted(pie),n=e.merge_mode??"pick_one";if(n==="pick_one"){let c=r[0];if(!c)throw new Error(`Behavior resolution lost its winner unexpectedly: ${t}`);let d=r.map((g,h)=>_G(g,h===0)),[l,...p]=d;if(!l)throw new Error(`Behavior resolution trace is unexpectedly empty: ${t}`);return {key:t,value:c.value,winner:l,conflicts:p,trace:d}}let o=r.map(c=>_G(c,true)),[i,...a]=o;if(!i)throw new Error(`Behavior resolution trace is unexpectedly empty: ${t}`);let s=n==="union"?[...new Set(new Set(r.flatMap(c=>Array.isArray(c.value)?c.value:[c.value])))]:r.map(c=>c.value);return {key:t,value:s,winner:i,conflicts:a,trace:o}}function OP(e){return {key:e.key,winner:e.winner,conflicts:e.conflicts,trace:e.trace}}var bG,vG=u(()=>{bG={harness:0,extension:1,user:2,builtin:3};});var Ah=u(()=>{vG();});function hie(e){return e.endsWith(`
634
+ `)?e:`${e}
635
+ `}function CG(e){let t=e.trim();if(!t)throw new Error("Runner base prompt collection requires a non-empty owner id.");return t.toUpperCase()}function rn(e){return hie(e.trimEnd())}function DP(e,t){let r;try{r=JSON.parse(t);}catch{throw new Error(`Invalid prompt JSON: ${e} (malformed JSON)`)}if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`Invalid prompt JSON: ${e} (expected object)`);return rn(t)}function Oh(e){return rn(JSON.stringify(e,null,2))}function Dh(e,t){return t.replace(`${e}/`,"").replaceAll("\\","/")}function NP(e){return !!e&&typeof e=="object"&&!Array.isArray(e)}function jP(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function Pr(e){return {layer:e.layer,source:e.source,value:e.value,order:e.order,metadata:{title:e.value.title}}}function zi(e){return {id:e.id,role:e.role,title:e.resolved.value.title,source:e.resolved.value.source,priority:e.priority,content:e.resolved.value.content,resolution:OP(e.resolved)}}async function kie(){let e=Un({key:"runner.framework_prompt",candidates:[Pr({layer:"builtin",source:"bundled:runner-prompt:RUNNER.md",value:{source:"bundled:runner-prompt:RUNNER.md",title:"Framework Runner Prompt",content:rn(await readFile(gie,"utf8"))}})]});return zi({id:"base.framework_runner",role:"system",priority:tn.framework_runner,resolved:e})}async function $P(){return xG??=kie(),xG}var gie,xG,tn,RG,Ki=u(()=>{Ah();ln();gie=QE("RUNNER.md"),xG=null,tn={framework_runner:100,policy_gateway:200,execution_profile:250,owner_profile:300,recipe_execution_context:400,recipe_agent_profile:500,recipe_skill_context:600,recipe_tools_context:700},RG={planning:410,execution:420,coding:430,debugging:440,review:450,verification:460,docs:470,finish:480};});async function bie(e){let t=await stat(e),r=PG.get(e);if(r?.mtimeMs===t.mtimeMs&&r.size===t.size)return r.entries;let n=await readdir(e);return PG.set(e,{mtimeMs:t.mtimeMs,size:t.size,entries:n}),n}async function EG(e){let t=await stat(e),r=TG.get(e);if(r?.mtimeMs===t.mtimeMs&&r.size===t.size)return r.text;let n=await readFile(e,"utf8");return TG.set(e,{mtimeMs:t.mtimeMs,size:t.size,text:n}),n}async function _ie(e){let t=Ye.join(e.git_root,e.agents_dir);if(!await P(t))return null;let r=await bie(t),n=`${e.owner_id}.json`.toLowerCase(),o=r.find(i=>i.endsWith(".json")&&i.toLowerCase()===n);return o?Ye.join(t,o):null}async function IG(e){let t=[],r=await _ie(e);if(r){let a=Dh(e.git_root,r);t.push(Pr({layer:"user",source:a,value:{source:a,title:`Owner Agent Profile (${e.owner_id})`,content:DP(a,await EG(r))}}));}let n=`${e.owner_id}.json`,i=(await kf()).find(a=>a.fileName.toLowerCase()===n.toLowerCase());if(!i)throw new Error(`Bundled agent profile not found: ${n}`);return t.push(Pr({layer:"builtin",source:`bundled:agent-profile:${i.fileName}`,value:{source:`bundled:agent-profile:${i.fileName}`,title:`Owner Agent Profile (${e.owner_id})`,content:DP(`bundled:agent-profile:${i.fileName}`,i.contents)},order:10})),Un({key:`runner.owner_profile:${e.owner_id}`,candidates:t})}async function AG(e){let t=await IG(e);return zi({id:"base.owner_profile",role:"profile",priority:tn.owner_profile,resolved:t})}async function OG(e){let t=e.harness?.repo.policy_gateway??await to({gitRoot:e.git_root,fallbackFlavor:e.fallback_flavor}),r=[];if(await P(t.absPath)){let n=Ye.relative(e.git_root,t.absPath).replaceAll("\\","/");r.push(Pr({layer:"harness",source:n,value:{source:n,title:`Repository Policy Gateway (${t.fileName})`,content:rn(await EG(t.absPath))}}));}return r.push(Pr({layer:"builtin",source:`bundled:policy-gateway:${t.fileName}`,value:{source:`bundled:policy-gateway:${t.fileName}`,title:`Bundled Policy Gateway Fallback (${t.fileName})`,content:await mv(t.flavor)},order:10})),Un({key:`runner.policy_gateway:${t.fileName}`,candidates:r})}async function DG(e){let t=await OG(e);return zi({id:"base.policy_gateway",role:"policy",priority:tn.policy_gateway,resolved:t})}function vie(e){return JSON.stringify({profile:e.profile,reasoning_effort:e.reasoning_effort,budget:e.budget,approvals:e.approvals,stop_conditions:e.stop_conditions,handoff_conditions:e.handoff_conditions,unsafe_actions_requiring_explicit_user_ok:e.unsafe_actions_requiring_explicit_user_ok,runner:e.runner},null,2)}function NG(e){if(!e.execution_profile)return null;let t=`runtime:execution-profile:${e.execution_profile.profile}`,r=Un({key:"runner.execution_profile",candidates:[Pr({layer:"harness",source:t,value:{source:t,title:`Execution Profile Runtime (${e.execution_profile.profile})`,content:rn(vie(e.execution_profile))}})]});return zi({id:"base.execution_profile",role:"policy",priority:tn.execution_profile,resolved:r})}var PG,TG,FP=u(()=>{uv();ee();Ah();dn();Ki();Ki();PG=new Map,TG=new Map;});var jG=u(()=>{ee();oo();Dr();Sd();Ve();In();});var $G=u(()=>{pf();iR();OR();ER();_R();uR();Jx();gR();yR();cR();GR();NR();FR();tR();});var MG=u(()=>{Ci();Wr();In();Ur();ts();vr();Ve();jG();$G();});async function Rie(e){let t=["generic"],r=[["package.json","node"],["pyproject.toml","python"],["go.mod","go"],["Cargo.toml","rust"]];for(let[n,o]of r)await P(Ye.join(e,n))&&t.push(o);return [...new Set(t)].toSorted()}function Cie(e){let t=Array.isArray(e?.data.tags)?e.data.tags.filter(r=>typeof r=="string"):[];if(t.includes("docs"))return "docs";if(t.includes("refactor"))return "refactor";if(t.includes("research"))return "research";if(t.includes("bug")||t.includes("bugfix"))return "bugfix";if(t.length>0)return "feature"}async function BG(e){let t=await Td({agentplaneDir:Ye.join(e.git_root,".agentplane")});if(!t)return [];let r=await Rie(e.git_root),n=Array.isArray(e.task?.data.tags)?e.task.data.tags.filter(a=>typeof a=="string"):[],o=Cie(e.task),i=[];for(let[a,s]of Object.entries(t.surfaces))for(let c of s)matchOverlayWhen(c.when,{task_kind:o,command:e.command,tags:n,repo_types:r})&&i.push({id:`overlay.${c.recipe_id}.${c.id}`,role:c.strength==="required"?"policy":"context",title:`${c.recipe_name}: ${c.id}`,source:c.source,priority:RG[a]+(c.order??0),surface:a,strength:c.strength,content:rn(c.content)});return i}var LG=u(()=>{ee();MG();Ki();});function qG(e,t){let r=e.split(/\r?\n/).find(o=>o.trimStart().startsWith(`${t}:`));if(!r)return null;let n=r.slice(r.indexOf(":")+1).trim();return n&&n.replaceAll(/^['"]|['"]$/g,"").trim()||null}function Iie(e,t){let r=Eie.exec(t);if(!r)return null;let n=r[1]??"",o=qG(n,"name"),i=qG(n,"description");return !o||!i?null:{name:o,description:i,source:e}}async function HG(e){let t=Ye.join(e.git_root,"skills");if(!await P(t))return [];let r=await readdir(t,{withFileTypes:true}),n=[];for(let o of r){if(!o.isDirectory())continue;let i=Ye.join(t,o.name,"SKILL.md");if(!await P(i))continue;let a=Ye.relative(e.git_root,i).replaceAll("\\","/"),s=Iie(a,await readFile(i,"utf8"));s&&n.push(s);}return n.length===0?[]:(n.sort((o,i)=>o.name.localeCompare(i.name)),[{id:"project.skills_index",role:"context",title:"Repository Skill Discovery",source:"skills/*/SKILL.md",priority:Sie,content:rn(JSON.stringify({skills:n},null,2))}])}var Sie,Eie,GG=u(()=>{ee();Ki();Sie=350,Eie=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;});async function VG(e){let t=[],r=e.relative_file?.trim();if(r){let o=Ye.join(e.recipe_dir,r);if(await P(o)){let i=Dh(e.git_root,o);t.push(Pr({layer:"extension",source:i,value:{source:i,title:e.title,content:await readFile(o,"utf8")}}));}}typeof e.fallback_content=="string"&&e.fallback_content.trim().length>0?t.push(Pr({layer:"extension",source:e.fallback_source,value:{source:e.fallback_source,title:e.title,content:e.fallback_content},order:10})):e.fallback_payload&&t.push(Pr({layer:"extension",source:e.fallback_source,value:{source:e.fallback_source,title:e.title,content:Oh(e.fallback_payload)},order:10}));let n=Un({key:e.prompt_id,candidates:t});return zi({id:e.prompt_id,role:e.role,priority:e.priority,resolved:n})}async function UG(e){let t=e.recipe.recipe_dir?.trim();if(!t)return [];let r=[],n=NP(e.recipe.scenario)?e.recipe.scenario:{},o={recipe:{id:e.recipe.recipe_id,name:e.recipe.recipe_name??null,version:e.recipe.recipe_version??null,scenario_id:e.recipe.scenario_id,scenario_file:e.recipe.scenario_file??null},selection_reasons:e.recipe.selection_reasons??[],run_profile:e.recipe.run_profile??{},scenario:{summary:typeof n.summary=="string"?n.summary:null,description:typeof n.description=="string"?n.description:null,goal:typeof n.goal=="string"?n.goal:null,evidence:NP(n.evidence)?n.evidence:null,outputs:jP(n.outputs)}};r.push({id:"recipe.execution_context",role:"context",title:`Recipe Scenario Context (${e.recipe.recipe_id}:${e.recipe.scenario_id})`,source:`recipe:${e.recipe.recipe_id}:${e.recipe.scenario_id}`,priority:tn.recipe_execution_context,content:Oh(o)});let i=await Promise.all((e.recipe.agents??[]).map(async(s,c)=>{let d=typeof s.id=="string"?s.id:`agent_${c+1}`;return VG({git_root:e.git_root,recipe_dir:t,prompt_id:`recipe.agent.${d}`,role:"profile",title:`Recipe Agent Prompt (${d})`,relative_file:typeof s.file=="string"?s.file:void 0,fallback_source:`recipe:${e.recipe.recipe_id}:agent:${d}`,fallback_content:typeof s.content=="string"?s.content:void 0,fallback_payload:s,priority:tn.recipe_agent_profile+c})}));r.push(...i);let a=await Promise.all((e.recipe.skills??[]).map(async(s,c)=>{let d=typeof s.id=="string"?s.id:`skill_${c+1}`;return VG({git_root:e.git_root,recipe_dir:t,prompt_id:`recipe.skill.${d}`,role:"context",title:`Recipe Skill Prompt (${d})`,relative_file:typeof s.file=="string"?s.file:void 0,fallback_source:`recipe:${e.recipe.recipe_id}:skill:${d}`,fallback_content:typeof s.content=="string"?s.content:void 0,fallback_payload:s,priority:tn.recipe_skill_context+c})}));if(r.push(...a),(e.recipe.tools??[]).length>0){let s=(e.recipe.tools??[]).map(c=>({id:typeof c.id=="string"?c.id:null,summary:typeof c.summary=="string"?c.summary:null,runtime:typeof c.runtime=="string"?c.runtime:null,entrypoint:typeof c.entrypoint=="string"?c.entrypoint:null,permissions:jP(c.permissions),timeout_ms:typeof c.timeout_ms=="number"?c.timeout_ms:null,cwd_policy:typeof c.cwd_policy=="string"?c.cwd_policy:null}));r.push({id:"recipe.tools_summary",role:"context",title:"Recipe Tool Context",source:`recipe:${e.recipe.recipe_id}:tools`,priority:tn.recipe_tools_context,content:Oh(s)});}return r}var WG=u(()=>{ee();Ah();Ki();});async function zG(e){let t=CG(e.owner_id),r=e.agents_dir?.trim()??e.harness?.workflow.paths.agents_dir,n=r&&r.length>0?r:".agentplane/agents",o=e.fallback_policy_gateway_flavor??"codex";return [...(await Promise.all([$P(),DG({git_root:e.git_root,fallback_flavor:o,harness:e.harness}),Promise.resolve(NG({execution_profile:e.execution_profile})),AG({git_root:e.git_root,agents_dir:n,owner_id:t})])).filter(c=>c!==null),...await BG({git_root:e.git_root,task:e.task,command:e.command}),...await HG({git_root:e.git_root}),...await UG({git_root:e.git_root,recipe:e.recipe??{recipe_id:"",scenario_id:""}})].toSorted((c,d)=>c.priority-d.priority||c.id.localeCompare(d.id))}var KG=u(()=>{FP();LG();GG();Ki();WG();FP();});function Mie(e){let t=[...e.missing],r=[...e.incomplete],n=e.dependsOn.filter(o=>!t.includes(o)&&!r.includes(o));return {ready:t.length===0&&r.length===0,missing:t,incomplete:r,completed:n}}function mr(e){return Buffer.byteLength(e,"utf8")}function Nh(e,t,r=jie){if(t<=0)return "";if(mr(e)<=t)return e;let n=mr(r);if(n>=t){let i="";for(let a of r){let s=i+a;if(mr(s)>t)break;i=s;}return i}let o="";for(let i of e){let a=o+i;if(mr(a)+n>t)break;o=a;}return `${o}${r}`}function JG(e){let t=e.items.slice(-e.maxCount);for(;t.length>1&&t.reduce((r,n)=>r+e.measure(n),0)>e.maxTotalBytes;)t.shift();return t}function LP(e){return mr(JSON.stringify(e))}function qP(e){return mr(JSON.stringify(e))}function Fie(e){let t=["Summary","Scope","Plan","Verify Steps","Verification","Rollback Plan","Findings"],r=Object.entries(e),n=new Map(r.map(([o],i)=>[o,i]));return r.toSorted(([o],[i])=>{let a=t.indexOf(o),s=t.indexOf(i);return a!==-1&&s!==-1?a-s:a!==-1?-1:s!==-1?1:(n.get(o)??0)-(n.get(i)??0)})}function Bie(e){let t=Fie(e),r=renderTaskDocFromSections(e),n=Wn.sections_total_max_bytes,o=false,i=t.map(([d,l])=>{if(!l)return [d,l];if(n<=0)return o=true,[d,$ie];let p=Math.min(Wn.section_max_bytes,n),g=mr(l)>p?Nh(l,p):l;return g!==l&&(o=true),n=Math.max(0,n-mr(g)),[d,g]}),a=Object.fromEntries(i),s=Nh(renderTaskDocFromSections(a),Wn.doc_max_bytes),c=s!==r;return {sections:a,doc:s,compaction:{original_bytes:mr(JSON.stringify(e)),emitted_bytes:mr(JSON.stringify(a)),original_count:t.length,emitted_count:i.length,truncated:o},docCompaction:{original_bytes:mr(r),emitted_bytes:mr(s),truncated:c}}}function Lie(e){let t=LP(e),r=e.map(o=>({author:o.author,body:Nh(o.body,Wn.comment_body_max_bytes)})),n=JG({items:r,maxCount:Wn.comments_max_count,maxTotalBytes:Wn.comments_total_max_bytes,measure:o=>LP([o])});return {comments:n,compaction:{original_bytes:t,emitted_bytes:LP(n),original_count:e.length,emitted_count:n.length,truncated:n.length!==e.length||n.some((o,i)=>o.body!==r.at(-(n.length-i))?.body)}}}function qie(e){let t=qP(e),r=e.map(o=>o.note?{...o,note:Nh(o.note,Wn.event_note_max_bytes)}:o),n=JG({items:r,maxCount:Wn.events_max_count,maxTotalBytes:Wn.events_total_max_bytes,measure:o=>qP([o])});return {events:n,compaction:{original_bytes:t,emitted_bytes:qP(n),original_count:e.length,emitted_count:n.length,truncated:n.length!==e.length||n.some((o,i)=>{let a=r.at(-(n.length-i));return JSON.stringify(o)!==JSON.stringify(a)})}}}async function Hie(e,t){let r=Ye.join(e.resolvedProject.gitRoot,e.config.paths.workflow_dir,t,"README.md");return await P(r)?r:void 0}async function Gie(e){try{return await gitCurrentBranch(e)}catch{return null}}async function Vie(e){try{return await e.git.headCommit()}catch{return null}}async function YG(e){try{let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await ue({ctx:t,taskId:e.task_id}),n=Mie(await oi(r,t.taskBackend)),o=Ir(r),i=typeof r.doc=="string"?r.doc:r.sections?renderTaskDocFromSections(r.sections):"",a=r.sections??(i?taskDocToSectionMap(i):{}),s=Bie(a),c=Lie(r.comments??[]),d=qie(r.events??[]),l={doc:s.docCompaction,sections:s.compaction,comments:c.compaction,events:d.compaction},[p,g,h]=await Promise.all([Gie(t.resolvedProject.gitRoot),Vie(t),Hie(t,r.id)]);return {repository:{git_root:t.resolvedProject.gitRoot,workflow_dir:t.config.paths.workflow_dir,backend_id:t.backendId,backend_config_path:t.backendConfigPath,branch:p,head_commit:g},task:{task_id:r.id,data:r,frontmatter:o,doc:s.doc,sections:s.sections,comments:c.comments,events:d.events,readme_path:h,dependency_state:n,compaction:l}}}catch(t){throw t instanceof m?t:E(t,{task_id:e.task_id})}}var jie,$ie,Wn,QG=u(()=>{D();ee();N();Ee();le();v();jie=`
636
+
637
+ [TRUNCATED]`,$ie="[TRUNCATED: omitted due to task context budget]",Wn={doc_max_bytes:24576,section_max_bytes:3072,sections_total_max_bytes:20480,comments_max_count:20,comment_body_max_bytes:1024,comments_total_max_bytes:12288,events_max_count:40,event_note_max_bytes:768,events_total_max_bytes:16384};});function Uie(e){if(!e)return {};let t={};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]=n);return t}function GP(e){let t=Vn(e.recipe),r=Uie(t),n={},o={},i=e.capabilities?.fields??{};for(let[a,s]of Object.entries(i)){let c=Object.hasOwn(r,a),d=c?r[a]:void 0,l={requested:d,status:"not_requested",capability_level:s.level,channel:s.channel,...s.supported_values?{supported_values:s.supported_values}:{},...s.note?{note:s.note}:{}};if(!c){o[a]=l;continue}if(s.level==="native"||s.level==="wrapper"){if(Array.isArray(s.supported_values)&&typeof d=="string"&&!s.supported_values.includes(d)){o[a]={...l,status:"unsupported"};continue}n[a]=d,o[a]={...l,effective:d,status:"enforced"};continue}o[a]={...l,status:s.level==="advisory"?"advisory":"unsupported"};}for(let[a,s]of Object.entries(r))Object.hasOwn(o,a)||(o[a]={requested:s,status:"unsupported",capability_level:"unsupported",channel:"none"});return {adapter_id:e.adapter_id,requested:r,effective:n,fields:o,refusal_reason:null}}function XG(e){return {...e.decision,refusal_reason:{code:e.error.code,message:e.error.message,...typeof e.error.context?.policy_field=="string"?{policy_field:e.error.context.policy_field}:{},...Object.hasOwn(e.error.context??{},"declared_value")?{declared_value:e.error.context?.declared_value}:{}}}}var ZG=u(()=>{kl();});function jh(e=new Date){return e.toISOString().replaceAll(":","-").replaceAll(".","-")}var VP=u(()=>{});function Jie(e){return e.flatMap(t=>t.resolution?[{id:t.id,category:"prompt",...t.source?{source:t.source}:{},resolution:t.resolution}]:[])}function Yie(e){return e==="native"||e==="wrapper"}function Qie(e){let t=Vn(e.recipe);if(!t)return;let r=e.execution.adapter_id,n=e.execution.adapter_capabilities;if(t.sandbox){let o=n?.fields.sandbox;if(Yie(o?.level)&&o?.supported_values&&!o.supported_values.includes(t.sandbox))throw new m({exitCode:k("E_RUNTIME"),code:"E_RUNTIME",message:`Runner adapter ${JSON.stringify(r)} does not support recipe sandbox ${JSON.stringify(t.sandbox)}; supported values: ${o.supported_values.join(", ")}.`,context:{adapter_id:r,policy_field:"sandbox",declared_value:t.sandbox,capability:o}})}t.writes_artifacts_to&&t.writes_artifacts_to.length>0&&Vs(t.writes_artifacts_to);}async function Xie(e){let t=st.fromBundle(e.bundle),r=await t.writePrepared({bundle:e.bundle,bootstrap_markdown:Mh(e.bundle)}),n={status:"failed",exit_code:e.error.exitCode??k("E_RUNTIME"),started_at:r.created_at,ended_at:r.created_at,summary:e.error.message,stderr_summary:e.error.message},o=at({state:r,status:"failed",result:n,updated_at:r.created_at});return await t.writeState(o),await t.appendEvent({at:r.created_at,type:"runner_refused",message:`runner refused before adapter prepare: ${e.error.message}`,data:e.error.context?{code:e.error.code,exit_code:e.error.exitCode,...e.error.context}:{code:e.error.code,exit_code:e.error.exitCode}}),o}function UP(e){let t=e.task;if(!t)return;let r=normalizeTaskStatus(t.data.status);if(r!=="DOING")throw new m({exitCode:2,code:"E_USAGE",message:`${t.task_id}: runner execution requires task status DOING (current=${JSON.stringify(r)}; use \`agentplane task start-ready ${t.task_id} --author <ROLE> --body "Start: ..."\` first).`})}function Mh(e,t){return ["# agentplane runner bootstrap","","This invocation is already inside an approved runner execution.","- Do not run repository startup commands such as `agentplane config show`, `agentplane quickstart`, `agentplane task list`, `git status`, or `git rev-parse` unless the bundle explicitly requires them as task work.","- Do not create, approve, start, verify, finish, block, or rerun tasks unless the bundle explicitly requires task metadata edits.","- Do not recursively invoke runner entrypoints such as `agentplane task run` or `agentplane recipes scenario execute` from inside this run.","- Open bundle.json immediately, execute the requested work directly, and stop when the requested outcome is satisfied.","",`- target: ${e.target.kind==="task"?`task ${e.target.task_id}`:`recipe scenario ${e.target.recipe_id}:${e.target.scenario_id}`}`,`- adapter: ${e.execution.adapter_id}`,`- mode: ${e.execution.mode}`,`- run_id: ${e.execution.run_id}`,`- bundle_path: ${e.execution.artifact_paths.bundle_path}`,`- result_path: ${e.execution.artifact_paths.result_path}`,`- bootstrap_path: ${e.execution.artifact_paths.bootstrap_path}`,"","Use bundle.json as the complete runner input. Do not reconstruct prompts from CLI argv.","Execute-mode runs must write a valid JSON result manifest to result_path before exiting.","Minimal manifest example:",'{"schema_version":1,"status":"success","summary":"Completed.","capabilities_used":["runner.exec"]}',"","Prepared invocation:","",t?`- argv: ${t.argv.join(" ")}`:"- argv: <not prepared; preflight refused>"].join(`
638
+ `)}async function WP(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await fr(t),n=e.target??{kind:"task",task_id:e.task_id};r.policy.evaluate({action:n.kind==="recipe_scenario"?"scenario_execute":"task_run",config:r.config,taskId:e.task_id,git:{stagedPaths:[]}});let o=ym({runtime:r.executionProfile,phase:"discovery"}),i=await YG({ctx:r.command,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:e.task_id}),a=n.kind==="recipe_scenario"?"recipes scenario execute":"task run",s=await zG({git_root:r.repo.git_root,owner_id:i.task.data.owner,agents_dir:r.harness.workflow.paths.agents_dir,task:i.task,command:a,recipe:e.recipe,harness:r.harness,execution_profile:o}),c=ky(r.frameworkExplain,Jie(s)),d=mc({explain:c}),l=Fo(r.config),p=l.id==="custom"?"custom":"codex",g=e.run_id??jh(),h=Mo({git_root:i.repository.git_root,workflow_dir:i.repository.workflow_dir,task_id:e.task_id,run_id:g}),f={schema_version:1,runner_api_version:"1",target:n,base_prompts:s,framework_explain:c,framework_protocol:d,repository:i.repository,task:i.task,recipe:e.recipe,execution:{adapter_id:p,mode:e.mode,run_id:g,artifact_paths:h,profile_runtime:o,trace_policy:o.runner.trace_policy,timeout_policy:o.runner.timeout_policy,approvals:{require_plan:r.approvals.require_plan,require_verify:r.approvals.require_verify,require_network:r.approvals.require_network}}};o=ym({runtime:f.execution.profile_runtime??o,phase:"implementation"}),f.execution.profile_runtime=o,f.execution.adapter_capabilities=l.describeCapabilities(f),f.execution.policy_decision=GP({adapter_id:f.execution.adapter_id,capabilities:f.execution.adapter_capabilities,recipe:f.recipe}),f.execution.adapter_capability_registry=uy({adapter_id:f.execution.adapter_id,capabilities:f.execution.adapter_capabilities,requested:f.execution.policy_decision.requested}),UP(f);try{Qie(f);}catch(x){if(x instanceof m){f.execution.policy_decision=XG({decision:f.execution.policy_decision??GP({adapter_id:f.execution.adapter_id,capabilities:f.execution.adapter_capabilities,recipe:f.recipe}),error:x});let C=await Xie({bundle:f,error:x});throw new $h({cause:x,bundle:f,state:C})}throw x}let b=await l.prepare(f),_=await st.fromBundle(f).writePrepared({bundle:f,bootstrap_markdown:Mh(f,b),invocation:b});return {bundle:f,invocation:b,state:_}}async function eV(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r;try{r=await WP({ctx:t,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:e.task_id,mode:"execute",run_id:e.run_id,recipe:e.recipe,target:e.target});}catch(s){throw s instanceof $h&&await qn({ctx:t,task_id:e.task_id,bundle:s.bundle,state:s.state}),s}let o=await Fo(t.config).execute(r.invocation),a=await st.fromInvocation(r.invocation).readState()??at({state:r.state,status:o.status,result:o,updated_at:o.ended_at});return await qn({ctx:t,task_id:e.task_id,bundle:r.bundle,state:a}),{...r,result:o}}var $h,Fh=u(()=>{G();N();v();py();hy();yy();Py();ro();Bn();Ih();kl();KG();QG();ZG();VP();yh();Ns();el();Ph();PP();$h=class extends m{bundle;state;constructor(t){super({exitCode:t.cause.exitCode,code:t.cause.code,message:t.cause.message,context:t.cause.context}),this.bundle=t.bundle,this.state=t.state;}};});function tae(e,t){if(!t)throw new m({exitCode:4,code:"E_IO",message:`Task not found: ${e}`});let r=normalizeTaskStatus(t.status);if(r!=="DOING")throw new m({exitCode:2,code:"E_USAGE",message:`${e}: runner lifecycle commands require task status DOING (current=${JSON.stringify(r)}; use \`agentplane task start-ready ${e} --author <ROLE> --body "Start: ..."\` first).`})}function zP(e,t){if(e.execution.mode!=="execute")throw new m({exitCode:2,code:"E_USAGE",message:`runner ${t} requires an execute-mode run (current=${JSON.stringify(e.execution.mode)}; dry-run artifacts cannot be ${t}d).`})}function tV(e){return typeof e.supervision?.pid=="number"?e.supervision.pid:null}function rae(e){let t=e?.trim().split(/\s+/u)[0]??"";return t?Ye.basename(t):null}function nae(e,t){let r=rae(e);return !r||!t?false:t.includes(r)}function oae(e,t){let r=e?Date.parse(e):Number.NaN,n=t?Date.parse(t):Number.NaN;return Number.isNaN(r)||Number.isNaN(n)?false:Math.abs(r-n)<=5e3}async function rV(e){let t=await jq(e.pid);if(!t){if(!Gt(e.pid))return;throw new m({exitCode:8,code:"E_RUNTIME",message:`runner cancel refused because process identity could not be confirmed for ${e.task_id}:${e.run_id} pid=${e.pid}.`,context:{task_id:e.task_id,run_id:e.run_id,pid:e.pid,expected_command:e.state.supervision?.command??null,expected_started_at:e.state.supervision?.started_at??null}})}let r=nae(e.state.supervision?.command,t.command),n=oae(e.state.supervision?.started_at,t.started_at);if(!(r&&n))throw new m({exitCode:8,code:"E_RUNTIME",message:`runner cancel refused because the live process no longer matches persisted supervision metadata for ${e.task_id}:${e.run_id} pid=${e.pid}.`,context:{task_id:e.task_id,run_id:e.run_id,pid:e.pid,expected_command:e.state.supervision?.command??null,observed_command:t.command,expected_started_at:e.state.supervision?.started_at??null,observed_started_at:t.started_at}})}function KP(e,t){try{return process.kill(e,t),!0}catch(r){if(r?.code==="ESRCH")return false;throw r}}function nV(e){let t=e.state.supervision,r=e.state.result?.started_at??t?.started_at??e.state.updated_at??e.updated_at,n=Hs({reason:`Runner cancellation state synthesized after requested ${e.signal}; observed process exit metadata was unavailable.`,started_at:r,ended_at:e.updated_at,output_paths:[e.state.bundle_path,e.state.bootstrap_path].filter(o=>typeof o=="string"&&o.trim().length>0)});return at({state:e.state,status:"cancelled",result:n,updated_at:e.updated_at,supervision:{...t,heartbeat_at:e.updated_at,cancel_requested_at:t?.cancel_requested_at??e.updated_at,cancel_signal:t?.cancel_signal??e.signal,exit_signal:t?.exit_signal??null}})}async function _l(e){let t=e.ctx??await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),r=await fr(t);e.require_task_doing!==false&&tae(e.task_id,await r.backend.task_backend.getTask(e.task_id));let n=st.forTaskRun({git_root:r.repo.git_root,workflow_dir:r.repo.workflow_dir,task_id:e.task_id,run_id:e.run_id}),o=await n.readRecord();if(!o)throw new m({exitCode:4,code:"E_IO",message:`Runner artifacts not found for ${e.task_id}:${e.run_id}`});RC(o.bundle,e.task_id,e.run_id),UP(o.bundle);let a=await Fo(r.config).prepare(o.bundle);return {ctx:r.command,bundle:o.bundle,invocation:a,state:o.state,repository:n}}var JP=u(()=>{N();v();ro();Ih();Wi();Bn();qi();Ns();Fh();});async function YP(e){let t=await _l({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:e.task_id,run_id:e.run_id,require_task_doing:false});if(t.state.status==="success")throw new m({exitCode:2,code:"E_USAGE",message:`runner cancel requires a non-success run (current=${JSON.stringify(t.state.status)})`});if(t.state.status==="cancelled")return {...t,previous_status:t.state.status,changed:false};if(t.state.status==="running"){let o=tV(t.state);if(!o)throw new m({exitCode:4,code:"E_IO",message:`runner cancel requires supervision metadata for running run ${e.task_id}:${e.run_id}`});try{await rV({task_id:e.task_id,run_id:e.run_id,state:t.state,pid:o});}catch(p){if(p instanceof m){let g=new Date().toISOString();await t.repository.appendEvent({at:g,type:"runner_cancel_refused",message:p.message,data:p.context??{task_id:e.task_id,run_id:e.run_id,pid:o}});}throw p}let i=new Date().toISOString(),a=at({state:t.state,status:"running",updated_at:i,supervision:{...t.state.supervision,cancel_requested_at:i,cancel_signal:"SIGTERM",heartbeat_at:i}});await t.repository.writeState(a),await t.repository.appendEvent({at:i,type:"runner_cancel_requested",message:`runner cancel requested via SIGTERM for pid=${o}`,data:{previous_status:t.state.status,pid:o,signal:"SIGTERM"}});let s=KP(o,"SIGTERM")?await yC({pid:o,timeout_ms:1500}):true,c="SIGTERM";if(!s&&Gt(o)){let p=new Date().toISOString(),g=at({state:a,status:"running",updated_at:p,supervision:{...a.supervision,cancel_requested_at:i,cancel_signal:"SIGKILL",force_killed:true,heartbeat_at:p}});await t.repository.writeState(g),await t.repository.appendEvent({at:p,type:"runner_force_kill_requested",message:`runner cancel escalated to SIGKILL for pid=${o}`,data:{previous_status:t.state.status,pid:o,signal:"SIGKILL"}}),KP(o,"SIGKILL"),await yC({pid:o,timeout_ms:1500}),c="SIGKILL";}let d=await NH({state_path:t.invocation.state_path,timeout_ms:3e3}),l=d??nV({state:await t.repository.readState()??a,signal:c,updated_at:new Date().toISOString()});return d||(await t.repository.writeState(l),await t.repository.appendEvent({at:l.updated_at,type:"runner_cancelled",message:`runner process exited after ${c}; state synthesized as cancelled`,data:{previous_status:t.state.status,pid:o,signal:c}})),await qn({ctx:t.ctx,task_id:e.task_id,bundle:t.bundle,state:l}),{...t,state:l,previous_status:t.state.status,changed:l.status==="cancelled"}}let r=new Date().toISOString(),n=at({state:t.state,status:"cancelled",updated_at:r});return await t.repository.writeState(n),await t.repository.appendEvent({at:r,type:"runner_cancelled",message:`runner marked cancelled from status=${t.state.status}`,data:{previous_status:t.state.status}}),await qn({ctx:t.ctx,task_id:e.task_id,bundle:t.bundle,state:n}),{...t,state:n,previous_status:t.state.status,changed:true}}var oV=u(()=>{v();Bn();qi();fP();yh();JP();});async function QP(e){let t=await _l({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:e.task_id,run_id:e.run_id});if(zP(t.bundle,"resume"),t.state.status==="running"||t.state.status==="success")throw new m({exitCode:2,code:"E_USAGE",message:`runner resume requires a prepared, failed, or cancelled run (current=${JSON.stringify(t.state.status)})`});let r=new Date().toISOString(),n=at({state:t.state,status:"prepared",updated_at:r});await t.repository.writeState(n),await t.repository.appendEvent({at:r,type:"runner_resume_requested",message:`runner resume requested from status=${t.state.status}`,data:{previous_status:t.state.status}});let o=await Fo(t.ctx.config).execute(t.invocation),i=await t.repository.readState()??n;return await qn({ctx:t.ctx,task_id:e.task_id,bundle:t.bundle,state:i}),{...t,state:i,previous_status:t.state.status,result:o}}async function XP(e){let t=await _l({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:e.task_id,run_id:e.run_id});if(zP(t.bundle,"retry"),t.state.status==="prepared"||t.state.status==="running")throw new m({exitCode:2,code:"E_USAGE",message:`runner retry requires a failed or cancelled run (current=${JSON.stringify(t.state.status)}; use \`agentplane task run resume ${e.task_id} ${e.run_id}\` instead).`});let r=e.new_run_id??jh(),n=Mo({git_root:t.ctx.resolvedProject.gitRoot,workflow_dir:t.ctx.config.paths.workflow_dir,task_id:e.task_id,run_id:r}),o={...t.bundle,execution:{...t.bundle.execution,mode:"execute",run_id:r,artifact_paths:n}},i=Fo(t.ctx.config),a=await i.prepare(o),s=st.fromBundle(o),c=await s.writePrepared({bundle:o,bootstrap_markdown:Mh(o,a),invocation:a}),d=new Date().toISOString();await t.repository.appendEvent({at:d,type:"runner_retry_requested",message:`runner retry requested into run_id=${r}`,data:{next_run_id:r}}),await s.appendEvent({at:d,type:"runner_retry_created",message:`runner retry created from run_id=${t.state.run_id}`,data:{source_run_id:t.state.run_id,source_status:t.state.status}});let l=await i.execute(a),p=await s.readState()??c;return await qn({ctx:t.ctx,task_id:e.task_id,bundle:o,state:p}),{ctx:t.ctx,bundle:o,invocation:a,state:p,result:l,source_run_id:t.state.run_id,source_status:t.state.status}}var iV=u(()=>{Ih();Bn();VP();Ns();yh();el();Fh();JP();v();});var Bh=u(()=>{oV();iV();});var aV={};S(aV,{runTaskRunCancel:()=>aae,taskRunCancelSpec:()=>dh});var iae,aae,sV=u(()=>{D();I();N();v();Bh();JC();iae=A(),aae=async(e,t)=>{try{let r=await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=await YP({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId,run_id:t.runId}),o=[{label:"run_id",value:t.runId},{label:"previous_status",value:n.previous_status},{label:"state",value:n.invocation.state_path},{label:"events",value:n.invocation.events_path},{label:"status",value:n.state.status}];return n.changed||o.push({label:"note",value:"run was already cancelled"}),iae.report(o,{header:K(`task run cancelled: ${t.taskId}`)}),0}catch(r){throw r instanceof m?r:E(r,{command:"task run cancel",task_id:t.taskId,run_id:t.runId})}};});var dV={};S(dV,{runTaskRunRetry:()=>sae,taskRunRetrySpec:()=>mh});var cV,sae,lV=u(()=>{G();D();I();N();v();Bh();QC();cV=A(),sae=async(e,t)=>{try{let r=await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=await XP({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId,run_id:t.runId}),o=[{label:"source_run_id",value:n.source_run_id},{label:"previous_status",value:n.source_status},{label:"run_id",value:n.invocation.run_id},{label:"adapter",value:n.invocation.adapter_id},{label:"state",value:n.invocation.state_path},{label:"events",value:n.invocation.events_path},{label:"status",value:n.result.status},{label:"runner_exit_code",value:n.result.exit_code??"null"}];return n.result.stdout_summary&&o.push({label:"stdout",value:n.result.stdout_summary}),cV.report(o,{header:K(`task run retried: ${t.taskId}`)}),n.result.stderr_summary&&cV.report([{label:"stderr",value:n.result.stderr_summary}],{stream:"stderr"}),n.result.status==="success"?0:n.result.exit_code??k("E_RUNTIME")}catch(r){throw r instanceof m?r:E(r,{command:"task run retry",task_id:t.taskId,run_id:t.runId})}};});var uV={};S(uV,{makeRunTaskHostedCloseHandler:()=>yae,taskHostedCloseSpec:()=>ol});function dae(e){let t=e.stderr,r=e instanceof Error?[e.message,typeof t=="string"?t:""].filter(n=>n.trim().length>0).join(`
639
+ `):String(e);return /bad object/i.test(r)||/unknown revision/i.test(r)||/ambiguous argument/i.test(r)}async function lae(e){let t=e.mergedPr.mergeCommit?.oid??"";try{return await vn(e.gitRoot,t)}catch(r){if(!dae(r))throw r;return {hash:t,message:e.mergedPr.title?.trim()??`Hosted PR #${e.mergedPr.number} merged on GitHub ${e.mergedPr.baseRefName??"main"}`}}}async function mae(e){let{stdout:t}=await execFileAsync("git",["status","--short","--",e.taskDirRelative],{cwd:e.gitRoot,env:process.env});return t.trim().length>0}function uae(e){let t=e.mergedPr.mergedAt??new Date().toISOString(),r=e.mergedPr.headRefOid?.trim(),n=r&&r.length>0?r:void 0,o=e.mergedPr.url?.trim(),i=o&&o.length>0?o:void 0;return {schema_version:1,task_id:e.taskId,branch:e.branch,...e.mergedPr.baseRefName?{base:e.mergedPr.baseRefName}:{},pr_number:e.mergedPr.number,...i?{pr_url:i}:{},created_at:t,updated_at:t,status:"OPEN",...n?{head_sha:n}:{},last_verified_sha:null,last_verified_at:null,verify:{status:"skipped"}}}function mV(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}function Lh(e,t){return new RegExp(String.raw`^## ${mV(t)}\n\n([\s\S]*?)(?=\n## [^\n]+\n|$)`,"m").exec(e)?.[1]?.trim()??""}function pae(e,t){let r=t?.trim()??"";if(!r)return `Hosted close recovery for ${e}`;let n=e.split("-").at(-1)?.trim();if(n){let o=r.replace(new RegExp(String.raw`\s*\(${mV(n)}\)\s*$`),"");if(o.trim().length>0)return o.trim()}return r}function fae(e,t){return e instanceof m?e.code==="E_IO"&&e.message.includes(t):false}async function gae(e){let t=Ye.join(e.gitRoot,e.taskDirRelative,"pr","github-body.md"),r="";try{r=await readFile(t,"utf8");}catch(w){if(w?.code==="ENOENT")return null;throw w}let n=Lh(r,"Summary"),o=Lh(r,"Scope"),i=Lh(r,"Verification"),a=Lh(r,"Handoff Notes"),s=n.split(`
640
+ `).map(w=>w.trim()).filter(w=>w.length>0),c=s[0]||pae(e.taskId,e.mergedPr.title),d=s.slice(1).join(`
641
+ `).trim()||`Recovered hosted-close state from tracked PR artifacts for merged PR #${e.mergedPr.number}.`,l=o||`- In scope: record canonical task closure for merged PR #${e.mergedPr.number}.`,p=i||`- State: pending
642
+ - Note: Recovered during hosted-close.`,g=a||"- No handoff notes recorded.",h=`Recovered hosted-close state from tracked PR artifacts for merged PR #${e.mergedPr.number}.`,f=["- Revert the hosted closure commit if the merged PR metadata was recorded incorrectly.","- Re-run the required checks after rollback."].join(`
643
+ `),b=["## Summary","",c,"",d,"","## Scope","",l,"","## Plan","",h,"","## Verification","",p,"","## Rollback Plan","",f,"","## Handoff Notes","",g,"","## Findings",""].join(`
644
+ `);return {id:e.taskId,title:c,description:d,status:"DOING",priority:"med",owner:"INTEGRATOR",revision:1,origin:{system:"manual"},depends_on:[],tags:[],verify:[],plan_approval:{state:"pending",updated_at:null,updated_by:null,note:null},verification:{state:"pending",updated_at:null,updated_by:null,note:null},commit:null,doc:b,doc_version:3,doc_updated_at:e.mergedPr.mergedAt??new Date().toISOString(),doc_updated_by:"INTEGRATOR",id_source:"generated"}}async function hae(e){let t=Ye.join(e.gitRoot,e.taskDirRelative,"pr","meta.json");if(!await P(t))return {metaPath:t,meta:uae({taskId:e.target.taskId,branch:e.target.branch,mergedPr:e.target.mergedPr})};let r=await readFile(t,"utf8");return {metaPath:t,meta:je(r,e.target.taskId)}}async function kae(e){let t=await readFile(e.eventJson,"utf8"),r=JSON.parse(t),n=$b({event:r,branchPrefix:e.ctx.config.branch.task_prefix});if(!n?.mergedPr.mergeCommit?.oid)return {outcome:"noop",detail:"event is not a merged task PR"};let o=e.ctx.resolvedProject.gitRoot,i=Ye.join(e.ctx.config.paths.workflow_dir,n.taskId),a=Ye.join(o,i,"README.md"),s=Ye.join(o,i,"pr","meta.json"),c=null;await P(s)&&(c=je(await readFile(s,"utf8"),n.taskId));let d=c?.merge_commit?.trim()??"",l=c?.status==="MERGED"&&d.length>0&&d===n.mergedPr.mergeCommit.oid,p;try{p=await ue({ctx:e.ctx,taskId:n.taskId,preferBranchSnapshot:!l,branchSnapshotBranch:l?null:n.branch});}catch(M){if(!fae(M,a))throw M;if(l)return {outcome:"noop",detail:`${n.taskId} is already closed for merge ${n.mergedPr.mergeCommit.oid.slice(0,12)}`};let $=await gae({gitRoot:o,taskDirRelative:i,taskId:n.taskId,mergedPr:n.mergedPr});if(!$)throw M;p=$;}await P(a)||await e.ctx.taskBackend.writeTask(p);let{metaPath:g,meta:h}=await hae({gitRoot:o,taskDirRelative:i,target:n}),f=normalizeTaskStatus(p.status),b=p.commit?.hash??"",w=f==="DONE"&&b===n.mergedPr.mergeCommit.oid;if(f==="DONE"&&b!==""&&b!==n.mergedPr.mergeCommit.oid)throw new m({exitCode:3,code:"E_VALIDATION",message:`Hosted task closure found a conflicting DONE commit for ${n.taskId}: ${p.commit?.hash} != ${n.mergedPr.mergeCommit.oid}`});if(w&&l)return {outcome:"noop",detail:`${n.taskId} is already closed for merge ${n.mergedPr.mergeCommit.oid.slice(0,12)}`};let _=ku({meta:h,branch:n.branch,base:n.mergedPr.baseRefName??h.base??"main",mergeStrategy:h.merge_strategy??"squash",mergeHash:n.mergedPr.mergeCommit.oid,branchHeadSha:n.mergedPr.headRefOid??h.head_sha??n.mergedPr.mergeCommit.oid,at:n.mergedPr.mergedAt??new Date().toISOString(),verifyCommands:[],shouldRunVerify:false,alreadyVerifiedSha:null});if(await ge(g,_),w)return await mae({gitRoot:o,taskDirRelative:i})?(await Sn({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:n.taskId,baseBranchOverride:_.base??"main",quiet:e.quiet}),{outcome:"meta-only",taskId:n.taskId,mergeHash:n.mergedPr.mergeCommit.oid}):{outcome:"noop",detail:`${n.taskId} is already closed for merge ${n.mergedPr.mergeCommit.oid.slice(0,12)}`};let x=await lae({gitRoot:o,mergedPr:n.mergedPr}),C=`PR #${n.mergedPr.number}`,j=`Verified: ${C} merged on GitHub ${n.mergedPr.baseRefName??"main"}; hosted closure automation recorded canonical task artifacts.`;await kt({ctx:e.ctx,taskId:n.taskId,task:p,write:false}),await Wa({ctx:e.ctx,loadedTasks:[{taskId:n.taskId,task:p}],metaTaskId:n.taskId,author:"INTEGRATOR",body:j,force:false,resultProvided:true,resultSummary:`Merged via ${C}.`,riskLevel:void 0,breaking:false,taskCommitInfo:x});let T=await kt({ctx:e.ctx,taskId:n.taskId,write:true});return e.quiet||process.stdout.write(`${K(wr(T.plan,{wrote:T.wrote,context:"finish",promotedIds:T.plan.promotable.map(M=>M.entry.id),registryPaths:T.registryPaths}))}
645
+ `),await Sn({ctx:e.ctx,cwd:e.cwd,rootOverride:e.rootOverride,taskId:n.taskId,baseBranchOverride:_.base??"main",quiet:e.quiet,allowPolicy:T.wrote}),{outcome:"closed",taskId:n.taskId,mergeHash:n.mergedPr.mergeCommit.oid}}function yae(e){return async(t,r)=>{try{let n=await e("task hosted-close"),o=await kae({ctx:n,cwd:t.cwd,rootOverride:t.rootOverride??void 0,eventJson:r.eventJson,quiet:r.quiet});if(r.quiet)return 0;if(o.outcome==="noop")return process.stdout.write(`${K(`hosted close skipped: ${o.detail}`)}
646
+ `),0;let i=`merge=${o.mergeHash.slice(0,12)}`;return process.stdout.write(`${z("task hosted close",o.taskId,i)}
647
+ `),o.outcome==="meta-only"&&process.stdout.write(`${K("task was already DONE; committed only the missing hosted PR metadata")}
648
+ `),0}catch(n){throw E(n,{command:"task hosted-close",root:t.rootOverride??null})}}}var pV=u(()=>{I();D();ee();v();_e();nt();N();cd();gp();le();xn();IC();});var fV={};S(fV,{makeRunTaskListHandler:()=>bae});function bae(e){return async(t,r)=>{let n=await e("task list"),o=await fr(n);return o.policy.evaluate({action:"task_list",config:o.config,taskId:"",git:{stagedPaths:[]}}),await Sb({ctx:o.command,cwd:t.cwd,rootOverride:t.rootOverride,filters:r.filters})}}var gV=u(()=>{ro();Eb();});var hV={};S(hV,{makeRunTaskNextHandler:()=>_ae});function _ae(e){return async(t,r)=>await lp({ctx:await e("task next"),cwd:t.cwd,rootOverride:t.rootOverride,filters:r.filters})}var kV=u(()=>{Ib();});var yV={};S(yV,{makeRunTaskSearchHandler:()=>vae});function vae(e){return async(t,r)=>await up({ctx:await e("task search"),cwd:t.cwd,rootOverride:t.rootOverride,query:r.query,regex:r.regex,filters:r.filters})}var wV=u(()=>{Ob();});var bV={};S(bV,{makeRunTaskShowHandler:()=>xae});function xae(e){return async(t,r)=>await Xb({ctx:await e("task show"),cwd:t.cwd,rootOverride:t.rootOverride,taskId:r.taskId})}var _V=u(()=>{Zb();});var vV={};S(vV,{runTaskRunTrace:()=>Rae,taskRunTraceSpec:()=>ul});var Rae,xV=u(()=>{D();v();rl();eP();Rae=async(e,t)=>{try{let r=await CC({cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId,run_id:t.runId});return process.stdout.write(r.trace_text),0}catch(r){throw r instanceof m?r:E(r,{command:"task run trace",task_id:t.taskId,run_id:t.runId??null})}};});var RV={};S(RV,{runTaskRun:()=>Cae,taskRunSpec:()=>ch});var Cae,CV=u(()=>{G();D();I();N();Fh();uP();v();KC();Cae=async(e,t)=>{try{let r=await R({cwd:e.cwd,rootOverride:e.rootOverride??null});if(!t.dryRun){let o=await eV({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId});return process.stdout.write(`${K(`task run executed: ${t.taskId}`)}
649
+ `),process.stdout.write(`adapter: ${o.invocation.adapter_id}
650
+ `),process.stdout.write(`run_id: ${o.invocation.run_id}
651
+ `),process.stdout.write(`result: ${o.invocation.result_path}
652
+ `),process.stdout.write(`state: ${o.bundle.execution.artifact_paths.state_path}
653
+ `),process.stdout.write(`events: ${o.bundle.execution.artifact_paths.events_path}
654
+ `),process.stdout.write(`status: ${o.result.status}
655
+ `),process.stdout.write(`runner_exit_code: ${o.result.exit_code??"null"}
656
+ `),o.result.stdout_summary&&process.stdout.write(`stdout: ${o.result.stdout_summary}
657
+ `),o.result.stderr_summary&&process.stderr.write(`stderr: ${o.result.stderr_summary}
658
+ `),o.result.status==="success"?0:o.result.exit_code??k("E_RUNTIME")}let n=await WP({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId,mode:"dry_run"});process.stdout.write(`${K(`task run dry-run prepared: ${t.taskId}`)}
659
+ `),process.stdout.write(`adapter: ${n.invocation.adapter_id}
660
+ `),process.stdout.write(`run_id: ${n.invocation.run_id}
661
+ `),process.stdout.write(`bundle: ${n.bundle.execution.artifact_paths.bundle_path}
662
+ `),process.stdout.write(`result: ${n.bundle.execution.artifact_paths.result_path}
663
+ `),process.stdout.write(`bootstrap: ${n.bundle.execution.artifact_paths.bootstrap_path}
664
+ `),process.stdout.write(`state: ${n.bundle.execution.artifact_paths.state_path}
665
+ `),process.stdout.write(`events: ${n.bundle.execution.artifact_paths.events_path}
666
+ `),process.stdout.write(`capabilities: ${JSON.stringify(n.bundle.execution.adapter_capabilities??null)}
667
+ `);for(let o of gh(n.bundle.execution.adapter_capabilities))process.stdout.write(`${o}
668
+ `);process.stdout.write(`policy_requested: ${JSON.stringify(n.bundle.execution.policy_decision?.requested??{})}
669
+ `),process.stdout.write(`policy_effective: ${JSON.stringify(n.bundle.execution.policy_decision?.effective??{})}
670
+ `),process.stdout.write(`policy_fields: ${JSON.stringify(n.bundle.execution.policy_decision?.fields??{})}
671
+ `),process.stdout.write(`policy_refusal: ${JSON.stringify(n.bundle.execution.policy_decision?.refusal_reason??null)}
672
+ `);for(let o of hh(n.bundle.execution.policy_decision))process.stdout.write(`${o}
673
+ `);return process.stdout.write(`argv: ${n.invocation.argv.join(" ")}
674
+ `),0}catch(r){throw r instanceof m?r:E(r,{command:"task run",task_id:t.taskId})}};});var TV={};S(TV,{runTaskRunResume:()=>Pae,taskRunResumeSpec:()=>lh});var PV,Pae,SV=u(()=>{G();D();I();N();v();Bh();YC();PV=A(),Pae=async(e,t)=>{try{let r=await R({cwd:e.cwd,rootOverride:e.rootOverride??null}),n=await QP({ctx:r,cwd:e.cwd,rootOverride:e.rootOverride??null,task_id:t.taskId,run_id:t.runId}),o=[{label:"run_id",value:t.runId},{label:"previous_status",value:n.previous_status},{label:"adapter",value:n.invocation.adapter_id},{label:"state",value:n.invocation.state_path},{label:"events",value:n.invocation.events_path},{label:"status",value:n.result.status},{label:"runner_exit_code",value:n.result.exit_code??"null"}];return n.result.stdout_summary&&o.push({label:"stdout",value:n.result.stdout_summary}),PV.report(o,{header:K(`task run resumed: ${t.taskId}`)}),n.result.stderr_summary&&PV.report([{label:"stderr",value:n.result.stderr_summary}],{stream:"stderr"}),n.result.status==="success"?0:n.result.exit_code??k("E_RUNTIME")}catch(r){throw r instanceof m?r:E(r,{command:"task run resume",task_id:t.taskId,run_id:t.runId})}};});var EV={};S(EV,{makeRunTaskNewHandler:()=>Tae,taskNewSpec:()=>ih});function Tae(e){return async(t,r)=>{let n=await e("task new"),o=await zE(n);return o.policy.evaluate({action:"task_new",config:o.config,taskId:"",git:{stagedPaths:[]}}),await _b({ctx:o.command,cwd:t.cwd,rootOverride:t.rootOverride,parsed:r})}}var IV=u(()=>{ro();vb();MC();});var AV,OV,DV,NV,jV,$V,MV,FV,BV,LV,qV,HV,GV,VV,UV,WV,zV,KV,JV,YV,QV,XV,ZV,eU,tU,rU,nU,oU,iU,aU,sU,cU,dU,lU,mU,uU,pU,fU,gU,hU,kU,yU,wU,bU,_U,vU,xU,RU,CU,PU=u(()=>{Nn();AV=L(()=>Promise.resolve().then(()=>(oP(),wH))),OV=L(()=>Promise.resolve().then(()=>(EC(),Qq))),DV=L(()=>Promise.resolve().then(()=>(PC(),Kq))),NV=L(()=>Promise.resolve().then(()=>(EH(),SH))),jV=L(()=>Promise.resolve().then(()=>(AH(),IH))),$V=L(()=>Promise.resolve().then(()=>(sV(),aV))),MV=L(()=>Promise.resolve().then(()=>(lV(),dV))),FV=L(()=>Promise.resolve().then(()=>(uC(),Eq))),BV=L(()=>Promise.resolve().then(()=>(gC(),Oq))),LV=L(()=>Promise.resolve().then(()=>(OC(),Xq))),qV=L(()=>Promise.resolve().then(()=>(NC(),tH))),HV=L(()=>Promise.resolve().then(()=>(mP(),CH))),GV=L(()=>Promise.resolve().then(()=>(zC(),uH))),VV=L(()=>Promise.resolve().then(()=>(SC(),Yq))),UV=e=>Promise.resolve().then(()=>(pV(),uV)).then(t=>t.makeRunTaskHostedCloseHandler(e.getCtx)),WV=e=>Promise.resolve().then(()=>(Rp(),xD)).then(t=>t.makeRunTaskHostedClosePrHandler(e.getCtx)),zV=e=>Promise.resolve().then(()=>(gV(),fV)).then(t=>t.makeRunTaskListHandler(e.getCtx)),KV=e=>Promise.resolve().then(()=>(kV(),hV)).then(t=>t.makeRunTaskNextHandler(e.getCtx)),JV=e=>Promise.resolve().then(()=>(wV(),yV)).then(t=>t.makeRunTaskSearchHandler(e.getCtx)),YV=e=>Promise.resolve().then(()=>(_V(),bV)).then(t=>t.makeRunTaskShowHandler(e.getCtx)),QV=L(()=>Promise.resolve().then(()=>(xV(),vV))),XV=L(()=>Promise.resolve().then(()=>(CV(),RV))),ZV=L(()=>Promise.resolve().then(()=>(SV(),TV))),eU=e=>Promise.resolve().then(()=>(IV(),EV)).then(t=>t.makeRunTaskNewHandler(e.getCtx)),tU=e=>Promise.resolve().then(()=>(lC(),Tq)).then(t=>t.makeRunTaskDeriveHandler(e.getCtx)),rU=e=>Promise.resolve().then(()=>(sC(),Rq)).then(t=>t.makeRunTaskCloseDuplicateHandler(e.getCtx)),nU=e=>Promise.resolve().then(()=>(iP(),bH)).then(t=>t.makeRunTaskStartReadyHandler(e.getCtx)),oU=e=>Promise.resolve().then(()=>(cC(),Cq)).then(t=>t.makeRunTaskCloseNoopHandler(e.getCtx)),iU=e=>Promise.resolve().then(()=>(aC(),xq)).then(t=>t.makeRunTaskAddHandler(e.getCtx)),aU=e=>Promise.resolve().then(()=>(aP(),_H)).then(t=>t.makeRunTaskUpdateHandler(e.getCtx)),sU=e=>Promise.resolve().then(()=>(dC(),Pq)).then(t=>t.makeRunTaskCommentHandler(e.getCtx)),cU=e=>Promise.resolve().then(()=>(nP(),hH)).then(t=>t.makeRunTaskSetStatusHandler(e.getCtx)),dU=e=>Promise.resolve().then(()=>(mC(),Sq)).then(t=>t.makeRunTaskFindingsAddHandler(e.getCtx)),lU=e=>Promise.resolve().then(()=>(fC(),Aq)).then(t=>t.makeRunTaskDocShowHandler(e.getCtx)),mU=e=>Promise.resolve().then(()=>(pC(),Iq)).then(t=>t.makeRunTaskDocSetHandler(e.getCtx)),uU=e=>Promise.resolve().then(()=>(rP(),fH)).then(t=>t.makeRunTaskScrubHandler(e.getCtx)),pU=e=>Promise.resolve().then(()=>(tP(),pH)).then(t=>t.makeRunTaskScaffoldHandler(e.getCtx)),fU=e=>Promise.resolve().then(()=>(FC(),oH)).then(t=>t.makeRunTaskNormalizeHandler(e.getCtx)),gU=e=>Promise.resolve().then(()=>(kC(),Dq)).then(t=>t.makeRunTaskExportHandler(e.getCtx)),hU=e=>Promise.resolve().then(()=>($C(),rH)).then(t=>t.makeRunTaskMigrateHandler(e.getCtx)),kU=L(()=>Promise.resolve().then(()=>(HC(),cH))),yU=e=>Promise.resolve().then(()=>(qC(),sH)).then(t=>t.makeRunTaskPlanSetHandler(e.getCtx)),wU=e=>Promise.resolve().then(()=>(BC(),iH)).then(t=>t.makeRunTaskPlanApproveHandler(e.getCtx)),bU=e=>Promise.resolve().then(()=>(LC(),aH)).then(t=>t.makeRunTaskPlanRejectHandler(e.getCtx)),_U=e=>Promise.resolve().then(()=>(sP(),vH)).then(t=>t.makeRunTaskVerifyOkHandler(e.getCtx)),vU=e=>Promise.resolve().then(()=>(cP(),xH)).then(t=>t.makeRunTaskVerifyReworkHandler(e.getCtx)),xU=e=>Promise.resolve().then(()=>(lP(),RH)).then(t=>t.makeRunTaskVerifyShowHandler(e.getCtx)),RU=e=>Promise.resolve().then(()=>(VC(),dH)).then(t=>t.makeRunTaskRebuildIndexHandler(e.getCtx)),CU=L(()=>Promise.resolve().then(()=>(UC(),mH)));});var TU,SU=u(()=>{aC();sC();cC();dC();lC();mC();uC();pC();fC();gC();kC();PC();SC();EC();IC();Rp();OC();Zq();NC();$C();MC();nH();FC();BC();LC();qC();HC();VC();UC();zC();KC();JC();YC();QC();XC();ZC();eP();tP();rP();gH();nP();yH();oP();iP();aP();sP();cP();lP();mP();Qc();Nn();PU();TU=[AV(ph,"runTask",{needs:"none"}),OV(oh,"runTaskHandoff",{needs:"none"}),DV(nh,"runTaskHandoffRecord",{}),VV(TC,"runTaskHandoffShow"),B(ol,{load:UV}),B(bi,{load:WV}),B(DC,{load:zV,invocation:He(["task","list"])}),B(al,{load:KV}),B($s,{load:JV}),B(kH,{load:YV,invocation:He(["task","show"])}),NV(ml,"runTaskRunShow",{}),QV(ul,"runTaskRunTrace"),jV(js,"runTaskRunTail",{}),XV(ch,"runTaskRun"),$V(dh,"runTaskRunCancel",{}),ZV(lh,"runTaskRunResume"),MV(mh,"runTaskRunRetry",{}),B(ih,{load:eU,invocation:He(["task","new"])}),B(Qg,{load:tU}),B(jo,{load:rU}),B(Ms,{load:nU,invocation:He(["task","start-ready"])}),B(Os,{load:oU}),B(As,{load:iU}),B(Fs,{load:aU}),B(Yg,{load:sU}),B(Ln,{load:cU}),FV(Xg,"runTaskFindings",{needs:"none"}),B(Li,{load:dU}),BV(eh,"runTaskDoc",{needs:"none"}),B(Zg,{load:lU}),B($o,{load:mU}),B(pl,{load:uU}),B(uh,{load:pU}),B(sl,{load:fU}),B(hC,{load:gU}),LV(AC,"runTaskLint",{}),B(jC,{load:hU}),qV(il,"runTaskMigrateDoc",{}),kU(sh,"runTaskPlan",{needs:"none"}),B(dl,{load:yU,invocation:He(["task","plan","set"])}),B(ah,{load:wU,invocation:He(["task","plan","approve"])}),B(cl,{load:bU}),HV(fh,"runTaskVerify",{needs:"none"}),B(Vi,{load:_U}),B(Ui,{load:vU}),B(dP,{load:xU,invocation:He(["task","verify-show"])}),B(GC,{load:RU}),GV(WC,"runTaskResumeContext",{}),CU(ll,"runTaskReclaim")];});function Sae(e){let t=new kc(r=>r.spec.id);for(let r of e)t.add(r);return t}function ZP(e){let t=EU.match(e);return t?{entry:t.value,consumed:t.consumed}:null}function Eae(e=[]){return EU.directChildSegments(e)}var xl,EU,eT=u(()=>{Fy();Oe();tB();KB();vq();SU();xl=[...eB,...TU,..._q,...zB];EU=Sae(xl);lI(e=>Promise.resolve(Eae(e)));});var UU={};S(UU,{buildRegistry:()=>Kae});function Kae(e){let t=new Em,r=()=>kx(t.list().map(o=>o.spec)),n={getCtx:e.getCtx,getResolvedProject:e.getResolvedProject,getLoadedConfig:e.getLoadedConfig,getHelpJsonForDocs:r};for(let o of xl){let i=null;t.register(o.spec,async(a,s)=>(i??=o.load(n),await(await i)(a,s)));}return t.register(Or,Sm(t)),t}var WU=u(()=>{Fy();My();tg();eT();});D();G();nm();v();ro();oo();Be();pc();H();function H1(e){return e.startsWith("-")&&e!=="-"}function G1(e){let t=new Map,r=new Map,n=[];for(let o of e.options??[])t.set(`--${o.name}`,o),n.push(`--${o.name}`),o.short&&(r.set(`-${o.short}`,o),n.push(`-${o.short}`));return {byLong:t,byShort:r,candidates:n}}function Cm(e,t,r){let n=t.name;if(t.kind==="boolean"){e.opts[n]=!!r;return}let o=t.coerce?t.coerce(String(r)):String(r);if(t.repeatable){let i=e.opts[n],a=Array.isArray(i)?[...i]:[];if(Array.isArray(o))for(let s of o)a.push(s);else a.push(o);e.opts[n]=a;return}if(e.opts[n]!==void 0)throw y({message:`Duplicate option: --${n}`});e.opts[n]=o;}function oI(e,t,r){if(t.kind==="string"){if(t.choices&&t.choices.length>0&&!t.choices.includes(r))throw y({spec:e,message:`Invalid value for --${t.name}: ${r} (expected one of: ${t.choices.join(", ")})`});if(t.pattern&&!t.pattern.test(r)){let n=t.patternHint?` (${t.patternHint})`:"";throw y({spec:e,message:`Invalid value for --${t.name}: ${r}${n}`})}}}function iI(e,t){if(e.kind!=="string"||!e.coerce)return t;let r=e.coerce(t);return typeof r=="string"?r:t}function aI(e,t,r){if(t.deprecated)throw nI({spec:e,option:r,deprecated:t.deprecated})}function $y(e,t){let{byLong:r,byShort:n,candidates:o}=G1(e),i={args:{},opts:{},extra:[]},a=[];for(let d=0;d<t.length;d++){let l=t[d];if(!l)continue;if(l==="--"){a.push(...t.slice(d+1).filter(Boolean));break}if(!H1(l)){a.push(l);continue}if(l.startsWith("--")){let f=l.indexOf("="),b=f===-1?l:l.slice(0,f),w=r.get(b);if(!w){let C=mn(b,o),j=C?` Did you mean ${C}?`:"";throw y({spec:e,message:`Unknown option: ${b}.${j}`})}if(aI(e,w,b),w.kind==="boolean"){if(f===-1){Cm(i,w,true);continue}throw y({spec:e,message:`Option ${b} does not take a value`})}let _=f===-1?t[d+1]:l.slice(f+1);if(_==null||_==="")throw y({spec:e,message:`Missing value after ${b}`});let x=String(_);oI(e,w,iI(w,x)),Cm(i,w,x),f===-1&&d++;continue}let p=n.get(l);if(!p){let f=mn(l,o),b=f?` Did you mean ${f}?`:"";throw y({spec:e,message:`Unknown option: ${l}.${b}`})}if(aI(e,p,l),p.kind==="boolean"){Cm(i,p,true);continue}let g=t[d+1];if(!g)throw y({spec:e,message:`Missing value after ${l}`});let h=String(g);oI(e,p,iI(p,h)),Cm(i,p,h),d++;}for(let d of e.options??[]){if(d.kind==="boolean"){i.opts[d.name]===void 0&&d.default!==void 0&&(i.opts[d.name]=d.default);continue}if(i.opts[d.name]===void 0&&d.default!==void 0&&(i.opts[d.name]=d.default),d.required===true&&i.opts[d.name]===void 0)throw y({spec:e,message:`Missing required option: --${d.name}`});if(d.repeatable&&d.minCount&&d.minCount>0){let l=i.opts[d.name];if((Array.isArray(l)?l.length:0)<d.minCount)throw y({spec:e,message:`Option --${d.name} must be provided at least ${d.minCount} time(s)`})}}let s=0;for(let d of e.args??[]){if(d.variadic){let p=a.slice(s);if(d.required&&p.length===0)throw y({spec:e,message:`Missing required argument: ${d.name}`});i.args[d.name]=p,s=a.length;break}let l=a[s];if(l===void 0){if(d.required)throw y({spec:e,message:`Missing required argument: ${d.name}`});i.args[d.name]=void 0;continue}i.args[d.name]=l,s++;}if(i.extra=a.slice(s),i.extra.length>0)throw y({spec:e,message:`Unexpected argument: ${i.extra[0]}`});e.validateRaw&&e.validateRaw(i);let c=e.parse?e.parse(i):i.opts;return e.validate&&e.validate(c),{raw:i,parsed:c}}My();H();pc();eT();v();var Aae=[{key:"help",forms:["--help","-h"],takesValue:false,scoped:false},{key:"version",forms:["--version","-v"],takesValue:false,scoped:false},{key:"noUpdateCheck",forms:["--no-update-check"],takesValue:false,scoped:false},{key:"allowNetwork",forms:["--allow-network"],takesValue:false,scoped:true},{key:"jsonErrors",forms:["--json-errors"],takesValue:false,scoped:true},{key:"outputMode",forms:["--output"],takesValue:true,scoped:false},{key:"root",forms:["--root"],takesValue:true,scoped:false}],Oae=new Map(Aae.flatMap(e=>e.forms.map(t=>[t,e]))),IU="AGENTPLANE_OUTPUT";function tT(e){return new m({exitCode:2,code:"E_USAGE",message:e})}function DU(e){let t=false,r=false,n=false,o=false,i,a=false,s,c=[],d=l=>({globals:{help:t,version:r,noUpdateCheck:n,root:i,jsonErrors:o,allowNetwork:a,outputMode:s},rest:c,jsonErrorMode:o||s==="json",...l?{error:l}:{}});for(let l=0;l<e.length;l++){let p=e[l];if(!p)continue;let g=Oae.get(p);if(!g){c.push(p);continue}if(g.scoped&&c.length>0){c.push(p);continue}switch(g.key){case "help":{t=true;break}case "version":{r=true;break}case "noUpdateCheck":{n=true;break}case "allowNetwork":{a=true;break}case "jsonErrors":{o=true;break}case "root":{let h=e[l+1];if(!h)return d(tT("Missing value after --root (expected repository path)"));i=h,l++;break}case "outputMode":{let h=e[l+1];if(!h)return d(tT("Missing value after --output (expected text|json)"));let f=h.trim().toLowerCase();if(f!=="text"&&f!=="json")return d(tT(`Invalid value for --output: ${h} (expected text|json)`));s=f,l++;break}default:{c.push(p);break}}}return d()}function NU(e){if(e)return e;let t=process.env[IU]?.trim().toLowerCase();if(!t||t==="text")return "text";if(t==="json")return "json";throw new m({exitCode:2,code:"E_USAGE",message:`Invalid ${IU}: ${t} (expected text|json)`})}function Dae(e,t){return typeof e=="string"?e:e instanceof Uint8Array?Buffer.from(e).toString(t):String(e)}var rT=new AsyncLocalStorage,nT=process.stdout.write.bind(process.stdout),jU=process.stderr.write.bind(process.stderr);function $U(e,t,r){let n=rT.getStore();if(!n)return false;let o=typeof r[0]=="string"?r[0]:void 0;return n[e].push(Dae(t,o)),r.find(a=>typeof a=="function")?.(null),true}var AU=((e,...t)=>$U("stdout",e,t)?true:nT(e,...t)),OU=((e,...t)=>$U("stderr",e,t)?true:jU(e,...t));function Nae(){process.stdout.write!==AU&&(nT=process.stdout.write.bind(process.stdout),process.stdout.write=AU),process.stderr.write!==OU&&(jU=process.stderr.write.bind(process.stderr),process.stderr.write=OU);}async function jae(e){return Nae(),await rT.run({stdout:[],stderr:[]},async()=>{let t=await e(),r=rT.getStore();return {exitCode:t,stdout:r?.stdout.join("").trim()??"",stderr:r?.stderr.join("").trim()??""}})}async function Hh(e){if(e.mode==="text")return await e.run();let{exitCode:t,stdout:r,stderr:n}=await jae(e.run),o;if(r.length>0)try{o=JSON.parse(r);}catch{o=void 0;}let i={schema_version:1,mode:"agent_json_v1",command:e.command,ok:t===0,exit_code:t,stdout:r,stderr:n};return o!==void 0&&(i.data=o),nT(`${JSON.stringify(i,null,2)}
675
+ `),t}I();var Gh=1,MU=1440*60*1e3,FU=1500;function BU(e){return Ye.join(e,"cache","update-check.json")}function LU(e,t,r){if(!e)return true;let n=Date.parse(e);return Number.isFinite(n)?t.getTime()-n>=r:true}async function qU(e){try{let t=await readFile(e,"utf8"),r=JSON.parse(t);return qae(r)}catch(t){return t?.code==="ENOENT",null}}async function HU(e,t){let r=Ye.dirname(e);await mkdir(r,{recursive:true});let n=`.update-check.${process.pid}.${randomBytes(6).toString("hex")}.tmp`,o=Ye.join(r,n),i=JSON.stringify(t,null,2);await writeFile(o,i,"utf8"),await rename(o,e);}async function GU(e){let t=new AbortController,r=setTimeout(()=>t.abort(),e.timeoutMs);try{let n={"User-Agent":"agentplane"};e.etag&&(n["If-None-Match"]=e.etag);let o=await fetch(e.url,{headers:n,signal:t.signal}),i=o.headers.get("etag"),a=i&&i.trim().length>0?i:null;if(o.status===304)return {status:"not_modified",etag:a??e.etag??null};if(!o.ok)return {status:"error"};let s=await o.json(),c=typeof s.version=="string"?s.version.trim():"";return c?{status:"ok",latestVersion:c,etag:a}:{status:"error"}}catch{return {status:"error"}}finally{clearTimeout(r);}}function qae(e){if(e.schema_version!==Gh)return null;let t=typeof e.checked_at=="string"?e.checked_at:null;if(!t)return null;let r=e.status;if(r!=="ok"&&r!=="error"&&r!=="not_modified")return null;let n=typeof e.latest_version=="string"?e.latest_version:null,o=typeof e.etag=="string"?e.etag:null;return {schema_version:Gh,checked_at:t,latest_version:n,etag:o,status:r}}Sd();var Rl="agentplane",Vae=`https://registry.npmjs.org/${Rl}/latest`,Uae="AGENTPLANE_HOME";function Wae(){let e=process.env[Uae]?.trim();return e||Ye.join(Q$.homedir(),".agentplane")}function zae(e){if(!e)return false;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}async function VU(e){if(e.skip||e.jsonErrors||zae(process.env.AGENTPLANE_NO_UPDATE_CHECK))return;let t=new Date,r=BU(Wae()),n=await qU(r);if(n&&!LU(n.checked_at,t,MU)){if(n.status==="ok"&&n.latest_version&&An(n.latest_version,e.currentVersion)>0){let c=`Update available: ${Rl} ${e.currentVersion} \u2192 ${n.latest_version}. Run: npm i -g ${Rl}@latest`;process.stderr.write(`${ie(c)}
676
+ `);}return}let o=await GU({url:Vae,timeoutMs:FU,etag:n?.etag??null}),i={schema_version:Gh,checked_at:t.toISOString(),latest_version:n?.latest_version??null,etag:n?.etag??null,status:"error"};o.status==="ok"?(i.status="ok",i.latest_version=o.latestVersion,i.etag=o.etag):o.status==="not_modified"&&(i.status="not_modified",i.etag=o.etag??i.etag);try{await HU(r,i);}catch{}let a=o.status==="ok"?o.latestVersion:i.latest_version;if(!a||o.status==="error"||An(a,e.currentVersion)<=0)return;let s=`Update available: ${Rl} ${e.currentVersion} \u2192 ${a}. Run: npm i -g ${Rl}@latest`;process.stderr.write(`${ie(s)}
677
+ `);}var zU=new Set(["--compact","--json"]);async function Yae(e){try{return await resolveProject({cwd:e.cwd,rootOverride:e.rootOverride??null})}catch(t){if(t instanceof Error&&(t.message.startsWith("Not an agentplane project")||t.message.startsWith("Not a git repository")||t.message.startsWith("Agentplane project root is not a git repository")))return null;throw t}}async function JU(e){let t=false;try{let r=DU(e);if(t=r.jsonErrorMode,r.error)throw r.error;let{globals:n,rest:o}=r,i=NU(n.outputMode);t=n.jsonErrors||i==="json";let a=process.cwd(),s=null,c=null,d=async()=>(c??=s?.entry.dispatch.project===!1?Promise.resolve(null):Yae({cwd:a,rootOverride:n.root}),await c);if(n.version)return await Hh({mode:i,command:"version",run:()=>(process.stdout.write(`${gt()}
678
+ `),Promise.resolve(0))});let l=[{spec:Or},...xl.map(V=>({spec:V.spec}))],p={list:()=>l,match:V=>{if(V[0]==="help")return {spec:Or,consumed:1};let se=ZP(V);return se?{spec:se.entry.spec,consumed:se.consumed}:null}},g=Sm(p),h=null,f=async V=>{h??=(async()=>await d()??await resolveProject({cwd:a,rootOverride:n.root??null}))();try{return await h}catch(se){throw O(se,{command:V,root:n.root??null})}},b=null,w=async V=>{b??=(async()=>{let se=await f(V);return await rm(se.gitRoot),await loadConfig(se.agentplaneDir)})();try{return await b}catch(se){throw O(se,{command:V,root:n.root??null})}},_=null,x=async V=>{_??=(async()=>{let se=await f(V),Xe=await w(V);return await WE({cwd:a,rootOverride:n.root??null,resolvedProject:se,config:Xe.config})})();try{return await _}catch(se){throw O(se,{command:V,root:n.root??null})}},C=async V=>{if(s?.entry.dispatch.taskContext===!1)throw new m({exitCode:k("E_INTERNAL"),code:"E_INTERNAL",message:`Internal error: command does not require task context but attempted to load it: ${V}`});return await x(V)},j=async()=>{let{buildRegistry:V}=await Promise.resolve().then(()=>(WU(),UU));return V({getCtx:C,getResolvedProject:f,getLoadedConfig:w})},T=null,M=async()=>(T??=j(),await T),$=async V=>{if(V[0]!=="help")throw new m({exitCode:k("E_INTERNAL"),code:"E_INTERNAL",message:"Internal error: fast help must be invoked through helpSpec"});let se=$y(Or,V.slice(1)).parsed;return await Hh({mode:i,command:Or.id.join(" "),run:async()=>await g({cwd:a,rootOverride:n.root},se)})};if(n.help){if(o[0]==="help")return await $(o);let V=p.match(o);if(V){let se=o.slice(V.consumed),Xe=new Set;for(let Tr of V.spec.options??[]){let We=Tr,Cl=typeof We.name=="string"?We.name.trim():"";Cl&&Xe.add(`--${Cl}`);let Ji=typeof We.alias=="string"?We.alias.trim():"";Ji&&Xe.add(`-${Ji}`);}let Bo=se.filter(Tr=>Tr.startsWith("-")&&!zU.has(Tr)&&!Xe.has(Tr));if(Bo.length>0)throw y({spec:Or,command:"help",message:`Unsupported flag(s) after --help: ${Bo.join(", ")}.`});let Us=se.filter(Tr=>Tr.startsWith("-")&&zU.has(Tr));return await $(["help",...V.spec.id,...Us])}return await $(["help",...o])}if(o.length===0)return await $(["help"]);if(o[0]==="help")return await $(o);s=ZP(o);let W=await d(),U=(s?.entry.dispatch??null)?.loadedConfig===!0,J=!0;if(W&&U&&!n.noUpdateCheck)try{let V=await w("update-check"),se=eI({config:V.config,action:"network_access"}).required,Xe=n.allowNetwork;J=se&&!Xe;}catch{J=!0;}await VU({currentVersion:gt(),skip:n.noUpdateCheck||J||!U,jsonErrors:t});let pe=await M();if(s){let V=pe.lookup(s.entry.spec.id);if(!V)throw new m({exitCode:k("E_INTERNAL"),code:"E_INTERNAL",message:`Internal error: runtime registry missing command: ${s.entry.spec.id.join(" ")}`});let se=o.slice(s.consumed),Xe=$y(V.spec,se).parsed;return await Hh({mode:i,command:V.spec.id.join(" "),run:async()=>await V.handler({cwd:a,rootOverride:n.root},Xe)})}let ye=o.join(" "),Y=pe.list().map(V=>V.spec.id.join(" ")),Re=mn(ye,Y),Ue=Re?` Did you mean: ${Re}?`:"";throw y({spec:Or,command:"help",message:`Unknown command: ${ye}.${Ue}`})}catch(r){if(r instanceof m)return Jk(r,t),r.exitCode;let n=r instanceof Error?r.message:String(r),o=new m({exitCode:k("E_INTERNAL"),code:"E_INTERNAL",message:n});return Jk(o,t),o.exitCode}}JU(process.argv.slice(2)).then(e=>{process.exit(e);});