@unbrained/pm-cli 2026.6.30 → 2026.7.2

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 (628) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +26 -0
  3. package/dist/cli/bootstrap-args.js +89 -79
  4. package/dist/cli/bootstrap-args.js.map +1 -1
  5. package/dist/cli/commander-usage.d.ts +2 -0
  6. package/dist/cli/commander-usage.js +58 -47
  7. package/dist/cli/commander-usage.js.map +1 -1
  8. package/dist/cli/commands/aggregate.js +102 -79
  9. package/dist/cli/commands/aggregate.js.map +1 -1
  10. package/dist/cli/commands/calendar.js +339 -303
  11. package/dist/cli/commands/calendar.js.map +1 -1
  12. package/dist/cli/commands/close-many.js +89 -68
  13. package/dist/cli/commands/close-many.js.map +1 -1
  14. package/dist/cli/commands/close.js +157 -129
  15. package/dist/cli/commands/close.js.map +1 -1
  16. package/dist/cli/commands/comments-audit.js +50 -42
  17. package/dist/cli/commands/comments-audit.js.map +1 -1
  18. package/dist/cli/commands/config.d.ts +2 -0
  19. package/dist/cli/commands/config.js +443 -879
  20. package/dist/cli/commands/config.js.map +1 -1
  21. package/dist/cli/commands/context.js +365 -287
  22. package/dist/cli/commands/context.js.map +1 -1
  23. package/dist/cli/commands/contracts.js +352 -238
  24. package/dist/cli/commands/contracts.js.map +1 -1
  25. package/dist/cli/commands/create.js +483 -434
  26. package/dist/cli/commands/create.js.map +1 -1
  27. package/dist/cli/commands/dedupe-audit.js +46 -39
  28. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  29. package/dist/cli/commands/dedupe-merge.js +88 -69
  30. package/dist/cli/commands/dedupe-merge.js.map +1 -1
  31. package/dist/cli/commands/extension/bundled-catalog.js +59 -46
  32. package/dist/cli/commands/extension/bundled-catalog.js.map +1 -1
  33. package/dist/cli/commands/extension/doctor.js +129 -78
  34. package/dist/cli/commands/extension/doctor.js.map +1 -1
  35. package/dist/cli/commands/extension/managed-state.js +101 -57
  36. package/dist/cli/commands/extension/managed-state.js.map +1 -1
  37. package/dist/cli/commands/extension/scaffold.d.ts +7 -0
  38. package/dist/cli/commands/extension/scaffold.js +214 -186
  39. package/dist/cli/commands/extension/scaffold.js.map +1 -1
  40. package/dist/cli/commands/extension.d.ts +6 -1
  41. package/dist/cli/commands/extension.js +1034 -902
  42. package/dist/cli/commands/extension.js.map +1 -1
  43. package/dist/cli/commands/get.js +114 -81
  44. package/dist/cli/commands/get.js.map +1 -1
  45. package/dist/cli/commands/health.d.ts +17 -0
  46. package/dist/cli/commands/health.js +446 -307
  47. package/dist/cli/commands/health.js.map +1 -1
  48. package/dist/cli/commands/history-compact.js +209 -140
  49. package/dist/cli/commands/history-compact.js.map +1 -1
  50. package/dist/cli/commands/history-redact.js +162 -119
  51. package/dist/cli/commands/history-redact.js.map +1 -1
  52. package/dist/cli/commands/history-repair.js +120 -85
  53. package/dist/cli/commands/history-repair.js.map +1 -1
  54. package/dist/cli/commands/init.d.ts +8 -2
  55. package/dist/cli/commands/init.js +263 -162
  56. package/dist/cli/commands/init.js.map +1 -1
  57. package/dist/cli/commands/list-filter-shared.js +55 -48
  58. package/dist/cli/commands/list-filter-shared.js.map +1 -1
  59. package/dist/cli/commands/list.js +152 -102
  60. package/dist/cli/commands/list.js.map +1 -1
  61. package/dist/cli/commands/next.js +49 -32
  62. package/dist/cli/commands/next.js.map +1 -1
  63. package/dist/cli/commands/plan.js +373 -298
  64. package/dist/cli/commands/plan.js.map +1 -1
  65. package/dist/cli/commands/recurrence-parsers.js +43 -25
  66. package/dist/cli/commands/recurrence-parsers.js.map +1 -1
  67. package/dist/cli/commands/reindex.d.ts +21 -5
  68. package/dist/cli/commands/reindex.js +345 -205
  69. package/dist/cli/commands/reindex.js.map +1 -1
  70. package/dist/cli/commands/restore.d.ts +8 -7
  71. package/dist/cli/commands/restore.js +105 -69
  72. package/dist/cli/commands/restore.js.map +1 -1
  73. package/dist/cli/commands/schema.js +33 -30
  74. package/dist/cli/commands/schema.js.map +1 -1
  75. package/dist/cli/commands/search.d.ts +10 -2
  76. package/dist/cli/commands/search.js +595 -536
  77. package/dist/cli/commands/search.js.map +1 -1
  78. package/dist/cli/commands/telemetry.js +98 -87
  79. package/dist/cli/commands/telemetry.js.map +1 -1
  80. package/dist/cli/commands/test-all.js +237 -168
  81. package/dist/cli/commands/test-all.js.map +1 -1
  82. package/dist/cli/commands/test.d.ts +6 -5
  83. package/dist/cli/commands/test.js +530 -464
  84. package/dist/cli/commands/test.js.map +1 -1
  85. package/dist/cli/commands/update-many.js +57 -42
  86. package/dist/cli/commands/update-many.js.map +1 -1
  87. package/dist/cli/commands/update.d.ts +1 -1
  88. package/dist/cli/commands/update.js +764 -747
  89. package/dist/cli/commands/update.js.map +1 -1
  90. package/dist/cli/commands/validate.d.ts +18 -1
  91. package/dist/cli/commands/validate.js +466 -343
  92. package/dist/cli/commands/validate.js.map +1 -1
  93. package/dist/cli/error-guidance.js +399 -357
  94. package/dist/cli/error-guidance.js.map +1 -1
  95. package/dist/cli/extension-command-options.js +48 -21
  96. package/dist/cli/extension-command-options.js.map +1 -1
  97. package/dist/cli/main.d.ts +47 -0
  98. package/dist/cli/main.js +428 -341
  99. package/dist/cli/main.js.map +1 -1
  100. package/dist/cli/migration-gates.js +22 -45
  101. package/dist/cli/migration-gates.js.map +1 -1
  102. package/dist/cli/register-list-query.js +94 -105
  103. package/dist/cli/register-list-query.js.map +1 -1
  104. package/dist/cli/register-mutation.js +400 -416
  105. package/dist/cli/register-mutation.js.map +1 -1
  106. package/dist/cli/register-operations.js +86 -66
  107. package/dist/cli/register-operations.js.map +1 -1
  108. package/dist/cli/register-setup.js +120 -101
  109. package/dist/cli/register-setup.js.map +1 -1
  110. package/dist/cli/registration-helpers.js +117 -122
  111. package/dist/cli/registration-helpers.js.map +1 -1
  112. package/dist/cli-bundle/chunks/{activity-MVSEND6D.js → activity-CUC4JY3U.js} +9 -9
  113. package/dist/cli-bundle/chunks/activity-WEIEMM73.js +16 -0
  114. package/dist/cli-bundle/chunks/{aggregate-MOC4TR2G.js → aggregate-DKUTRY6R.js} +109 -85
  115. package/dist/cli-bundle/chunks/aggregate-DKUTRY6R.js.map +1 -0
  116. package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js → aggregate-SW5PNGCS.js} +108 -84
  117. package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js.map → aggregate-SW5PNGCS.js.map} +2 -2
  118. package/dist/cli-bundle/chunks/{append-KDHT4GHI.js → append-H32VOR2Y.js} +6 -6
  119. package/dist/cli-bundle/chunks/{append-LEDBAM3K.js → append-UBM632FK.js} +6 -6
  120. package/dist/cli-bundle/chunks/{chunk-Z55WX4IQ.js → chunk-2227673O.js} +158 -114
  121. package/dist/cli-bundle/chunks/chunk-2227673O.js.map +1 -0
  122. package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js → chunk-2ASNV4DH.js} +4 -4
  123. package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js → chunk-2CHRYUXL.js} +2 -2
  124. package/dist/cli-bundle/chunks/{chunk-QE5UFCCO.js → chunk-2KWL5NPW.js} +42 -27
  125. package/dist/cli-bundle/chunks/chunk-2KWL5NPW.js.map +1 -0
  126. package/dist/cli-bundle/chunks/{chunk-ZEATCVAC.js → chunk-36UGKF4O.js} +21 -29
  127. package/dist/cli-bundle/chunks/chunk-36UGKF4O.js.map +7 -0
  128. package/dist/cli-bundle/chunks/{chunk-JZG5ADVE.js → chunk-3AZUFQK6.js} +1103 -963
  129. package/dist/cli-bundle/chunks/chunk-3AZUFQK6.js.map +1 -0
  130. package/dist/cli-bundle/chunks/{chunk-DRPF274X.js → chunk-3LCUASYG.js} +2 -2
  131. package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js → chunk-3Q2HBMTI.js} +2 -2
  132. package/dist/cli-bundle/chunks/chunk-4BU75MF4.js +87 -0
  133. package/dist/cli-bundle/chunks/chunk-4BU75MF4.js.map +7 -0
  134. package/dist/cli-bundle/chunks/{chunk-GF7EAR22.js → chunk-4NUOWFBT.js} +109 -72
  135. package/dist/cli-bundle/chunks/chunk-4NUOWFBT.js.map +7 -0
  136. package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js → chunk-55XRYWEG.js} +6 -6
  137. package/dist/cli-bundle/chunks/{chunk-5IRVSKPS.js → chunk-5GVTFFTC.js} +150 -224
  138. package/dist/cli-bundle/chunks/chunk-5GVTFFTC.js.map +1 -0
  139. package/dist/cli-bundle/chunks/{chunk-CHRNYKNI.js → chunk-5PGBHRY3.js} +41 -26
  140. package/dist/cli-bundle/chunks/chunk-5PGBHRY3.js.map +7 -0
  141. package/dist/cli-bundle/chunks/{chunk-53ARXF2O.js → chunk-66Z3X7ZG.js} +261 -161
  142. package/dist/cli-bundle/chunks/chunk-66Z3X7ZG.js.map +7 -0
  143. package/dist/cli-bundle/chunks/{chunk-A3UNLXNJ.js → chunk-6ITZLD4T.js} +738 -688
  144. package/dist/cli-bundle/chunks/chunk-6ITZLD4T.js.map +7 -0
  145. package/dist/cli-bundle/chunks/{chunk-JTRKME24.js → chunk-6YCYF2AI.js} +262 -162
  146. package/dist/cli-bundle/chunks/chunk-6YCYF2AI.js.map +1 -0
  147. package/dist/cli-bundle/chunks/{chunk-RM6MHL6A.js → chunk-6ZMBJRDJ.js} +580 -467
  148. package/dist/cli-bundle/chunks/chunk-6ZMBJRDJ.js.map +7 -0
  149. package/dist/cli-bundle/chunks/{chunk-RPRW26NG.js → chunk-7MYWF4ZX.js} +110 -73
  150. package/dist/cli-bundle/chunks/chunk-7MYWF4ZX.js.map +1 -0
  151. package/dist/cli-bundle/chunks/{chunk-SNUK7H5J.js → chunk-7NSPKJUS.js} +716 -606
  152. package/dist/cli-bundle/chunks/chunk-7NSPKJUS.js.map +7 -0
  153. package/dist/cli-bundle/chunks/{chunk-KYDYQMNW.js → chunk-7TH5NMVB.js} +95 -53
  154. package/dist/cli-bundle/chunks/chunk-7TH5NMVB.js.map +7 -0
  155. package/dist/cli-bundle/chunks/{chunk-VD3LKZFX.js → chunk-7W4H4K26.js} +739 -689
  156. package/dist/cli-bundle/chunks/chunk-7W4H4K26.js.map +1 -0
  157. package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js → chunk-A6VOGKBA.js} +6 -6
  158. package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js → chunk-AIAIXG7I.js} +2 -2
  159. package/dist/cli-bundle/chunks/{chunk-NIBP3I7A.js → chunk-AJEBCRIY.js} +128 -126
  160. package/dist/cli-bundle/chunks/chunk-AJEBCRIY.js.map +1 -0
  161. package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js → chunk-B4O5S7I3.js} +79 -57
  162. package/dist/cli-bundle/chunks/{chunk-VZDBVEZR.js.map → chunk-B4O5S7I3.js.map} +2 -2
  163. package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js → chunk-BTX5MIQF.js} +2 -2
  164. package/dist/cli-bundle/chunks/chunk-BVZZN2LH.js +809 -0
  165. package/dist/cli-bundle/chunks/chunk-BVZZN2LH.js.map +7 -0
  166. package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js → chunk-CYBDUHNO.js} +3 -3
  167. package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js → chunk-CZPVDLD2.js} +4 -4
  168. package/dist/cli-bundle/chunks/{chunk-FDEVKXC4.js → chunk-EMPGXBUF.js} +22 -30
  169. package/dist/cli-bundle/chunks/chunk-EMPGXBUF.js.map +1 -0
  170. package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js → chunk-EUKTMRN3.js} +2 -2
  171. package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js → chunk-FFOQHGNH.js} +6 -6
  172. package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js → chunk-GFMSLORL.js} +6 -6
  173. package/dist/cli-bundle/chunks/{chunk-IZQOJR2B.js → chunk-GRRG3MCT.js} +198 -189
  174. package/dist/cli-bundle/chunks/chunk-GRRG3MCT.js.map +7 -0
  175. package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js → chunk-H4GRLYJS.js} +3 -3
  176. package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js → chunk-HQTPRV4D.js} +6 -6
  177. package/dist/cli-bundle/chunks/{chunk-CY5IJMUM.js → chunk-I66WE2HE.js} +712 -602
  178. package/dist/cli-bundle/chunks/chunk-I66WE2HE.js.map +1 -0
  179. package/dist/cli-bundle/chunks/{chunk-ZFIEEDTJ.js → chunk-IEEJQCZ4.js} +509 -363
  180. package/dist/cli-bundle/chunks/chunk-IEEJQCZ4.js.map +7 -0
  181. package/dist/cli-bundle/chunks/{chunk-DU66JUGT.js → chunk-IG5JYZGU.js} +488 -420
  182. package/dist/cli-bundle/chunks/chunk-IG5JYZGU.js.map +7 -0
  183. package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js → chunk-JMK5GCK2.js} +2 -2
  184. package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js → chunk-JXAUVO6X.js} +258 -169
  185. package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js.map → chunk-JXAUVO6X.js.map} +2 -2
  186. package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js → chunk-K2VYLVX4.js} +2 -2
  187. package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js → chunk-KCO2EAN5.js} +3 -3
  188. package/dist/cli-bundle/chunks/{chunk-T7ZMQI4J.js → chunk-KIYCOJ63.js} +198 -189
  189. package/dist/cli-bundle/chunks/chunk-KIYCOJ63.js.map +1 -0
  190. package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js → chunk-KLXF7NCC.js} +2 -2
  191. package/dist/cli-bundle/chunks/{chunk-V3KLX7U7.js → chunk-KN3URLKS.js} +510 -364
  192. package/dist/cli-bundle/chunks/chunk-KN3URLKS.js.map +1 -0
  193. package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js → chunk-LRKMWUUV.js} +2 -2
  194. package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js → chunk-LTRAF2D7.js} +3 -3
  195. package/dist/cli-bundle/chunks/{chunk-5T6WPLRO.js → chunk-MNBPX5JS.js} +394 -354
  196. package/dist/cli-bundle/chunks/chunk-MNBPX5JS.js.map +7 -0
  197. package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js → chunk-MRD4T5LF.js} +2 -2
  198. package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js → chunk-N2JSWVWG.js} +4 -4
  199. package/dist/cli-bundle/chunks/{chunk-7WDETKGP.js → chunk-N3QCJS4M.js} +1105 -965
  200. package/dist/cli-bundle/chunks/chunk-N3QCJS4M.js.map +7 -0
  201. package/dist/cli-bundle/chunks/{chunk-KGQ3W65B.js → chunk-NRZS637N.js} +258 -169
  202. package/dist/cli-bundle/chunks/chunk-NRZS637N.js.map +1 -0
  203. package/dist/cli-bundle/chunks/chunk-OTUJZKGI.js +799 -0
  204. package/dist/cli-bundle/chunks/chunk-OTUJZKGI.js.map +1 -0
  205. package/dist/cli-bundle/chunks/{chunk-ZIE6WXJ2.js → chunk-Q6K2OACU.js} +153 -90
  206. package/dist/cli-bundle/chunks/chunk-Q6K2OACU.js.map +1 -0
  207. package/dist/cli-bundle/chunks/{chunk-K46GQ265.js → chunk-Q6NXOHS6.js} +489 -421
  208. package/dist/cli-bundle/chunks/chunk-Q6NXOHS6.js.map +1 -0
  209. package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js → chunk-QH3FSKRJ.js} +2 -2
  210. package/dist/cli-bundle/chunks/{chunk-UB3V5WUI.js → chunk-RM37OPYK.js} +394 -354
  211. package/dist/cli-bundle/chunks/chunk-RM37OPYK.js.map +1 -0
  212. package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js → chunk-S62UANU7.js} +3 -3
  213. package/dist/cli-bundle/chunks/{chunk-NO6Y6FB2.js → chunk-SPM2XLWI.js} +37 -28
  214. package/dist/cli-bundle/chunks/chunk-SPM2XLWI.js.map +7 -0
  215. package/dist/cli-bundle/chunks/{chunk-DORJSBGJ.js → chunk-SYNKD3ZG.js} +127 -125
  216. package/dist/cli-bundle/chunks/chunk-SYNKD3ZG.js.map +7 -0
  217. package/dist/cli-bundle/chunks/{chunk-6YRAMXRS.js → chunk-SYVUU7EK.js} +581 -468
  218. package/dist/cli-bundle/chunks/chunk-SYVUU7EK.js.map +1 -0
  219. package/dist/cli-bundle/chunks/{chunk-D5LYZVGB.js → chunk-TPOFWBMY.js} +95 -53
  220. package/dist/cli-bundle/chunks/chunk-TPOFWBMY.js.map +1 -0
  221. package/dist/cli-bundle/chunks/{chunk-IHXXUIXS.js → chunk-TTHCEV5Q.js} +92 -77
  222. package/dist/cli-bundle/chunks/chunk-TTHCEV5Q.js.map +1 -0
  223. package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js → chunk-U2BEEM2X.js} +3 -3
  224. package/dist/cli-bundle/chunks/{chunk-Z5BM2FKQ.js → chunk-UGLU6Q2I.js} +91 -76
  225. package/dist/cli-bundle/chunks/chunk-UGLU6Q2I.js.map +7 -0
  226. package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js → chunk-UT73HUPC.js} +3 -3
  227. package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js → chunk-UTSH5GWX.js} +4 -4
  228. package/dist/cli-bundle/chunks/{chunk-AWN4PPH5.js → chunk-UWKEJMZU.js} +157 -113
  229. package/dist/cli-bundle/chunks/chunk-UWKEJMZU.js.map +7 -0
  230. package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js +84 -0
  231. package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js.map +1 -0
  232. package/dist/cli-bundle/chunks/{chunk-KTMMTOIP.js → chunk-W47SML5B.js} +152 -89
  233. package/dist/cli-bundle/chunks/chunk-W47SML5B.js.map +7 -0
  234. package/dist/cli-bundle/chunks/{chunk-UFKNF23C.js → chunk-WJAMWAHZ.js} +157 -118
  235. package/dist/cli-bundle/chunks/chunk-WJAMWAHZ.js.map +7 -0
  236. package/dist/cli-bundle/chunks/{chunk-HIBK6H4S.js → chunk-XCHUVHKU.js} +685 -544
  237. package/dist/cli-bundle/chunks/chunk-XCHUVHKU.js.map +1 -0
  238. package/dist/cli-bundle/chunks/{chunk-DJDXAU74.js → chunk-XEWQKDYZ.js} +685 -544
  239. package/dist/cli-bundle/chunks/chunk-XEWQKDYZ.js.map +7 -0
  240. package/dist/cli-bundle/chunks/{chunk-BOWQWXLI.js → chunk-XTHQWXVC.js} +158 -119
  241. package/dist/cli-bundle/chunks/chunk-XTHQWXVC.js.map +1 -0
  242. package/dist/cli-bundle/chunks/{chunk-6T5ZIWBS.js → chunk-XWGEMNBR.js} +150 -224
  243. package/dist/cli-bundle/chunks/chunk-XWGEMNBR.js.map +7 -0
  244. package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js → chunk-Y4NRKBFW.js} +3 -3
  245. package/dist/cli-bundle/chunks/{chunk-WTRUDJ3R.js → chunk-YLZZ6T54.js} +38 -29
  246. package/dist/cli-bundle/chunks/chunk-YLZZ6T54.js.map +1 -0
  247. package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js → chunk-YPKFV2JR.js} +6 -6
  248. package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js → chunk-Z4DGFQDH.js} +80 -58
  249. package/dist/cli-bundle/chunks/{chunk-OKQ22KTH.js.map → chunk-Z4DGFQDH.js.map} +1 -1
  250. package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js → chunk-ZNHEYCDD.js} +2 -2
  251. package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js → chunk-ZNT7KEWE.js} +2 -2
  252. package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js → claim-SENTPZBN.js} +8 -8
  253. package/dist/cli-bundle/chunks/{claim-6NINZYB3.js → claim-Z7MEQCBT.js} +8 -8
  254. package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js → close-424MX4CU.js} +7 -7
  255. package/dist/cli-bundle/chunks/close-YCWQQPDS.js +14 -0
  256. package/dist/cli-bundle/chunks/{close-many-CXJBOWWY.js → close-many-2IV4J2TR.js} +103 -82
  257. package/dist/cli-bundle/chunks/close-many-2IV4J2TR.js.map +1 -0
  258. package/dist/cli-bundle/chunks/{close-many-BFMP6HHK.js → close-many-SWY34BII.js} +102 -81
  259. package/dist/cli-bundle/chunks/close-many-SWY34BII.js.map +7 -0
  260. package/dist/cli-bundle/chunks/{comments-ETHABIY6.js → comments-4FGNTSNV.js} +8 -8
  261. package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js → comments-7YS5MY5X.js} +8 -8
  262. package/dist/cli-bundle/chunks/config-BZJKK7FZ.js +1062 -0
  263. package/dist/cli-bundle/chunks/config-BZJKK7FZ.js.map +1 -0
  264. package/dist/cli-bundle/chunks/config-G74GISC4.js +1072 -0
  265. package/dist/cli-bundle/chunks/config-G74GISC4.js.map +7 -0
  266. package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js → context-LHVKJSPJ.js} +12 -12
  267. package/dist/cli-bundle/chunks/{context-XDI4DKKT.js → context-ZQY54JNS.js} +12 -12
  268. package/dist/cli-bundle/chunks/{contracts-SMOAN5NF.js → contracts-CP2EZJC7.js} +320 -199
  269. package/dist/cli-bundle/chunks/contracts-CP2EZJC7.js.map +7 -0
  270. package/dist/cli-bundle/chunks/{contracts-KP4QAGVW.js → contracts-FIZLMP7O.js} +321 -200
  271. package/dist/cli-bundle/chunks/contracts-FIZLMP7O.js.map +1 -0
  272. package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js → copy-GYNQQPW2.js} +5 -5
  273. package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js → copy-TLW7JTQT.js} +5 -5
  274. package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js → create-VSKYSOCD.js} +12 -12
  275. package/dist/cli-bundle/chunks/create-XTMAPS7I.js +28 -0
  276. package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js → delete-4W5JYCEG.js} +5 -5
  277. package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js → delete-ANTOTI2I.js} +5 -5
  278. package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js → deps-HPPE6MJN.js} +5 -5
  279. package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js → deps-ZQZN54EZ.js} +5 -5
  280. package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js → docs-RPOVFMP3.js} +7 -7
  281. package/dist/cli-bundle/chunks/{docs-2TIFR62T.js → docs-XJNYBJGE.js} +7 -7
  282. package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js → eval-DM6JBZTS.js} +10 -10
  283. package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js → eval-RFBI5FGS.js} +10 -10
  284. package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js → extension-B3YY4WY5.js} +11 -10
  285. package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js → extension-TTSEFQTS.js} +11 -10
  286. package/dist/cli-bundle/chunks/{files-DF3HO6XK.js → files-5D65CHGE.js} +7 -7
  287. package/dist/cli-bundle/chunks/{files-T5ODMETM.js → files-GPIG77EN.js} +7 -7
  288. package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js → focus-C3PEJV2C.js} +6 -6
  289. package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js → focus-ZHN7WIGX.js} +6 -6
  290. package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js → gc-D4JQ6OWN.js} +3 -3
  291. package/dist/cli-bundle/chunks/{gc-FULIVYR4.js → gc-VZIXDL32.js} +3 -3
  292. package/dist/cli-bundle/chunks/{get-VYPIICPC.js → get-GIBRUUOP.js} +121 -81
  293. package/dist/cli-bundle/chunks/get-GIBRUUOP.js.map +1 -0
  294. package/dist/cli-bundle/chunks/{get-AWK324RS.js → get-IOVAN6RU.js} +120 -80
  295. package/dist/cli-bundle/chunks/get-IOVAN6RU.js.map +7 -0
  296. package/dist/cli-bundle/chunks/{health-Q66C43GN.js → health-L2U3AFKV.js} +437 -264
  297. package/dist/cli-bundle/chunks/health-L2U3AFKV.js.map +1 -0
  298. package/dist/cli-bundle/chunks/{health-FBCVZGSX.js → health-MM7AWXYF.js} +436 -263
  299. package/dist/cli-bundle/chunks/health-MM7AWXYF.js.map +7 -0
  300. package/dist/cli-bundle/chunks/history-DD7L7BNL.js +18 -0
  301. package/dist/cli-bundle/chunks/{history-X4OSES6K.js → history-IL7XCEX2.js} +8 -8
  302. package/dist/cli-bundle/chunks/{history-compact-2GHT32UX.js → history-compact-HALOTOU7.js} +214 -135
  303. package/dist/cli-bundle/chunks/history-compact-HALOTOU7.js.map +1 -0
  304. package/dist/cli-bundle/chunks/{history-compact-WLCQEKXS.js → history-compact-MV25P7DM.js} +213 -134
  305. package/dist/cli-bundle/chunks/history-compact-MV25P7DM.js.map +7 -0
  306. package/dist/cli-bundle/chunks/history-redact-IX4YEWMY.js +19 -0
  307. package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js → history-redact-VYCWQFK7.js} +9 -9
  308. package/dist/cli-bundle/chunks/{history-repair-FY75IC26.js → history-repair-44MODPQF.js} +124 -84
  309. package/dist/cli-bundle/chunks/history-repair-44MODPQF.js.map +1 -0
  310. package/dist/cli-bundle/chunks/{history-repair-GABSDSVD.js → history-repair-CPNAOCNF.js} +123 -83
  311. package/dist/cli-bundle/chunks/history-repair-CPNAOCNF.js.map +7 -0
  312. package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js → init-F27NHENZ.js} +12 -11
  313. package/dist/cli-bundle/chunks/init-HHVQQP6C.js +22 -0
  314. package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js → learnings-HJVDQIGY.js} +8 -8
  315. package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js → learnings-XSFSUUWK.js} +8 -8
  316. package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js → list-HPMEKCAA.js} +8 -8
  317. package/dist/cli-bundle/chunks/{list-ROT7JF62.js → list-VMPWTURB.js} +8 -8
  318. package/dist/cli-bundle/chunks/{next-66BJB4N2.js → next-ETXF2ZCN.js} +59 -37
  319. package/dist/cli-bundle/chunks/next-ETXF2ZCN.js.map +7 -0
  320. package/dist/cli-bundle/chunks/{next-N5MWJTBY.js → next-QM6YJIIS.js} +60 -38
  321. package/dist/cli-bundle/chunks/next-QM6YJIIS.js.map +1 -0
  322. package/dist/cli-bundle/chunks/{notes-FW6YFLND.js → notes-GDZIKGR6.js} +8 -8
  323. package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js → notes-WDDBPC4D.js} +8 -8
  324. package/dist/cli-bundle/chunks/{plan-ZHKZ7JVF.js → plan-BGDR73Z6.js} +373 -279
  325. package/dist/cli-bundle/chunks/plan-BGDR73Z6.js.map +1 -0
  326. package/dist/cli-bundle/chunks/{plan-DQ7G4EDC.js → plan-C5IMM335.js} +372 -278
  327. package/dist/cli-bundle/chunks/plan-C5IMM335.js.map +7 -0
  328. package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js → profile-CCOKZ2IQ.js} +9 -9
  329. package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js → profile-HUCENIEQ.js} +9 -9
  330. package/dist/cli-bundle/chunks/{register-list-query-Y2VRHPCL.js → register-list-query-ROSNIL52.js} +80 -83
  331. package/dist/cli-bundle/chunks/register-list-query-ROSNIL52.js.map +1 -0
  332. package/dist/cli-bundle/chunks/{register-list-query-KY6Z6WV7.js → register-list-query-XN4ZRHSV.js} +79 -82
  333. package/dist/cli-bundle/chunks/register-list-query-XN4ZRHSV.js.map +7 -0
  334. package/dist/cli-bundle/chunks/{register-mutation-PCARIGZS.js → register-mutation-CFSB2MS3.js} +406 -385
  335. package/dist/cli-bundle/chunks/register-mutation-CFSB2MS3.js.map +1 -0
  336. package/dist/cli-bundle/chunks/{register-mutation-N6AYSKPM.js → register-mutation-KRLAHEL2.js} +405 -384
  337. package/dist/cli-bundle/chunks/register-mutation-KRLAHEL2.js.map +7 -0
  338. package/dist/cli-bundle/chunks/{register-operations-L6CYTOIH.js → register-operations-4PASGJDB.js} +112 -93
  339. package/dist/cli-bundle/chunks/register-operations-4PASGJDB.js.map +7 -0
  340. package/dist/cli-bundle/chunks/{register-operations-YAT6FUUB.js → register-operations-MBN4KGUM.js} +113 -94
  341. package/dist/cli-bundle/chunks/register-operations-MBN4KGUM.js.map +1 -0
  342. package/dist/cli-bundle/chunks/{register-setup-N7UGXYJC.js → register-setup-VIAWYFP5.js} +129 -104
  343. package/dist/cli-bundle/chunks/register-setup-VIAWYFP5.js.map +1 -0
  344. package/dist/cli-bundle/chunks/{register-setup-MPANILQF.js → register-setup-ZCGKHDKL.js} +128 -103
  345. package/dist/cli-bundle/chunks/register-setup-ZCGKHDKL.js.map +7 -0
  346. package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js → restore-4CBWUMCX.js} +9 -9
  347. package/dist/cli-bundle/chunks/restore-5UEAGG3W.js +17 -0
  348. package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js → scheduling-shortcuts-6VFKNKCM.js} +12 -12
  349. package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js → scheduling-shortcuts-ERHCVTEM.js} +12 -12
  350. package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js → schema-TDGK6N3I.js} +7 -7
  351. package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js → schema-UE5KKAUX.js} +7 -7
  352. package/dist/cli-bundle/chunks/{search-KP6H7COV.js → search-FP7MEU4S.js} +10 -10
  353. package/dist/cli-bundle/chunks/{search-CX5UMV4H.js → search-K4CFLQ5S.js} +10 -10
  354. package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js → stats-NJJCALEZ.js} +6 -6
  355. package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js → stats-XT6QRKQY.js} +6 -6
  356. package/dist/cli-bundle/chunks/{telemetry-DIFPXCAT.js → telemetry-5SQ5UDXC.js} +84 -70
  357. package/dist/cli-bundle/chunks/telemetry-5SQ5UDXC.js.map +7 -0
  358. package/dist/cli-bundle/chunks/{telemetry-WTYFUPRL.js → telemetry-HVXFZA2U.js} +85 -71
  359. package/dist/cli-bundle/chunks/telemetry-HVXFZA2U.js.map +1 -0
  360. package/dist/cli-bundle/chunks/{test-QNDXZQCW.js → test-UFSJ5YIO.js} +15 -14
  361. package/dist/cli-bundle/chunks/{test-HU2BS7EY.js → test-YCDAUBWF.js} +15 -14
  362. package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js +427 -0
  363. package/dist/cli-bundle/chunks/test-all-2BWKY3GQ.js.map +1 -0
  364. package/dist/cli-bundle/chunks/test-all-PM7UYN42.js +430 -0
  365. package/dist/cli-bundle/chunks/test-all-PM7UYN42.js.map +7 -0
  366. package/dist/cli-bundle/chunks/{test-runs-CA6K32RD.js → test-runs-FK5E75AA.js} +185 -147
  367. package/dist/cli-bundle/chunks/test-runs-FK5E75AA.js.map +1 -0
  368. package/dist/cli-bundle/chunks/{test-runs-LANLLPVO.js → test-runs-H4TGWGRN.js} +184 -146
  369. package/dist/cli-bundle/chunks/test-runs-H4TGWGRN.js.map +7 -0
  370. package/dist/cli-bundle/chunks/update-MTCFES6X.js +24 -0
  371. package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js → update-Y5WQVT5O.js} +15 -15
  372. package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js → update-many-6YAYYRLE.js} +83 -68
  373. package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js.map → update-many-6YAYYRLE.js.map} +2 -2
  374. package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js → update-many-JTKKSA7Y.js} +84 -69
  375. package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js.map → update-many-JTKKSA7Y.js.map} +1 -1
  376. package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js → upgrade-DTAHZ236.js} +11 -10
  377. package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js.map → upgrade-DTAHZ236.js.map} +1 -1
  378. package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js → upgrade-JUDU7YL4.js} +13 -12
  379. package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js.map → upgrade-JUDU7YL4.js.map} +1 -1
  380. package/dist/cli-bundle/chunks/{validate-2G566PKQ.js → validate-732RWS5W.js} +440 -319
  381. package/dist/cli-bundle/chunks/validate-732RWS5W.js.map +7 -0
  382. package/dist/cli-bundle/chunks/{validate-BDPVXHHH.js → validate-W7H5TEDC.js} +441 -320
  383. package/dist/cli-bundle/chunks/validate-W7H5TEDC.js.map +1 -0
  384. package/dist/cli-bundle/main.js +986 -1500
  385. package/dist/cli-bundle/main.js.map +4 -4
  386. package/dist/core/config/nested-settings.js +89 -67
  387. package/dist/core/config/nested-settings.js.map +1 -1
  388. package/dist/core/extensions/activation-summary-markdown.js +23 -12
  389. package/dist/core/extensions/activation-summary-markdown.js.map +1 -1
  390. package/dist/core/extensions/extension-policy.d.ts +18 -3
  391. package/dist/core/extensions/extension-policy.js +116 -106
  392. package/dist/core/extensions/extension-policy.js.map +1 -1
  393. package/dist/core/extensions/loader.js +310 -232
  394. package/dist/core/extensions/loader.js.map +1 -1
  395. package/dist/core/governance/metadata-coverage.js +20 -28
  396. package/dist/core/governance/metadata-coverage.js.map +1 -1
  397. package/dist/core/history/drift-scan.js +93 -81
  398. package/dist/core/history/drift-scan.js.map +1 -1
  399. package/dist/core/item/item-format.js +523 -410
  400. package/dist/core/item/item-format.js.map +1 -1
  401. package/dist/core/item/item-type-definition.js +14 -14
  402. package/dist/core/item/item-type-definition.js.map +1 -1
  403. package/dist/core/item/type-registry.js +87 -82
  404. package/dist/core/item/type-registry.js.map +1 -1
  405. package/dist/core/output/mutation-projection.js +42 -26
  406. package/dist/core/output/mutation-projection.js.map +1 -1
  407. package/dist/core/schema/runtime-schema.js +34 -28
  408. package/dist/core/schema/runtime-schema.js.map +1 -1
  409. package/dist/core/search/semantic-defaults.js +64 -37
  410. package/dist/core/search/semantic-defaults.js.map +1 -1
  411. package/dist/core/search/vector-stores.js +32 -17
  412. package/dist/core/search/vector-stores.js.map +1 -1
  413. package/dist/core/sentry/helpers.js +31 -28
  414. package/dist/core/sentry/helpers.js.map +1 -1
  415. package/dist/core/sentry/instrument.js +54 -43
  416. package/dist/core/sentry/instrument.js.map +1 -1
  417. package/dist/core/store/front-matter-cache.js +239 -153
  418. package/dist/core/store/front-matter-cache.js.map +1 -1
  419. package/dist/core/store/item-store.js +33 -26
  420. package/dist/core/store/item-store.js.map +1 -1
  421. package/dist/core/store/settings.js +247 -203
  422. package/dist/core/store/settings.js.map +1 -1
  423. package/dist/core/test/background-runs.js +189 -160
  424. package/dist/core/test/background-runs.js.map +1 -1
  425. package/dist/mcp/server.js +387 -367
  426. package/dist/mcp/server.js.map +1 -1
  427. package/dist/sdk/cli-contracts/flag-contracts.js +111 -180
  428. package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
  429. package/dist/sdk/cli-contracts/tool-schema.js +76 -45
  430. package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
  431. package/dist/sdk/compose.d.ts +4 -1
  432. package/dist/sdk/compose.js +181 -115
  433. package/dist/sdk/compose.js.map +1 -1
  434. package/docs/RELEASING.md +2 -3
  435. package/package.json +2 -2
  436. package/packages/pm-beads/extensions/beads/runtime.ts +240 -167
  437. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +65 -58
  438. package/packages/pm-todos/extensions/todos/runtime.ts +65 -42
  439. package/dist/cli-bundle/chunks/activity-EJBMXUBH.js +0 -16
  440. package/dist/cli-bundle/chunks/aggregate-MOC4TR2G.js.map +0 -1
  441. package/dist/cli-bundle/chunks/chunk-53ARXF2O.js.map +0 -7
  442. package/dist/cli-bundle/chunks/chunk-5IRVSKPS.js.map +0 -1
  443. package/dist/cli-bundle/chunks/chunk-5T6WPLRO.js.map +0 -7
  444. package/dist/cli-bundle/chunks/chunk-6T5ZIWBS.js.map +0 -7
  445. package/dist/cli-bundle/chunks/chunk-6YRAMXRS.js.map +0 -1
  446. package/dist/cli-bundle/chunks/chunk-7WDETKGP.js.map +0 -7
  447. package/dist/cli-bundle/chunks/chunk-A3UNLXNJ.js.map +0 -7
  448. package/dist/cli-bundle/chunks/chunk-AWN4PPH5.js.map +0 -7
  449. package/dist/cli-bundle/chunks/chunk-BOWQWXLI.js.map +0 -1
  450. package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js +0 -115
  451. package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js.map +0 -1
  452. package/dist/cli-bundle/chunks/chunk-CHRNYKNI.js.map +0 -7
  453. package/dist/cli-bundle/chunks/chunk-CY5IJMUM.js.map +0 -1
  454. package/dist/cli-bundle/chunks/chunk-D5LYZVGB.js.map +0 -1
  455. package/dist/cli-bundle/chunks/chunk-DJDXAU74.js.map +0 -7
  456. package/dist/cli-bundle/chunks/chunk-DORJSBGJ.js.map +0 -7
  457. package/dist/cli-bundle/chunks/chunk-DU66JUGT.js.map +0 -7
  458. package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js +0 -118
  459. package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js.map +0 -7
  460. package/dist/cli-bundle/chunks/chunk-FDEVKXC4.js.map +0 -1
  461. package/dist/cli-bundle/chunks/chunk-GF7EAR22.js.map +0 -7
  462. package/dist/cli-bundle/chunks/chunk-HIBK6H4S.js.map +0 -1
  463. package/dist/cli-bundle/chunks/chunk-IHXXUIXS.js.map +0 -1
  464. package/dist/cli-bundle/chunks/chunk-ISEKN64V.js +0 -35
  465. package/dist/cli-bundle/chunks/chunk-ISEKN64V.js.map +0 -7
  466. package/dist/cli-bundle/chunks/chunk-IZQOJR2B.js.map +0 -7
  467. package/dist/cli-bundle/chunks/chunk-JTRKME24.js.map +0 -1
  468. package/dist/cli-bundle/chunks/chunk-JZG5ADVE.js.map +0 -1
  469. package/dist/cli-bundle/chunks/chunk-K46GQ265.js.map +0 -1
  470. package/dist/cli-bundle/chunks/chunk-KGQ3W65B.js.map +0 -1
  471. package/dist/cli-bundle/chunks/chunk-KTMMTOIP.js.map +0 -7
  472. package/dist/cli-bundle/chunks/chunk-KYDYQMNW.js.map +0 -7
  473. package/dist/cli-bundle/chunks/chunk-NIBP3I7A.js.map +0 -1
  474. package/dist/cli-bundle/chunks/chunk-NO6Y6FB2.js.map +0 -7
  475. package/dist/cli-bundle/chunks/chunk-QE5UFCCO.js.map +0 -1
  476. package/dist/cli-bundle/chunks/chunk-RM6MHL6A.js.map +0 -7
  477. package/dist/cli-bundle/chunks/chunk-RPRW26NG.js.map +0 -1
  478. package/dist/cli-bundle/chunks/chunk-SNUK7H5J.js.map +0 -7
  479. package/dist/cli-bundle/chunks/chunk-T7ZMQI4J.js.map +0 -1
  480. package/dist/cli-bundle/chunks/chunk-UB3V5WUI.js.map +0 -1
  481. package/dist/cli-bundle/chunks/chunk-UFKNF23C.js.map +0 -7
  482. package/dist/cli-bundle/chunks/chunk-V3KLX7U7.js.map +0 -1
  483. package/dist/cli-bundle/chunks/chunk-VD3LKZFX.js.map +0 -1
  484. package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js +0 -32
  485. package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js.map +0 -1
  486. package/dist/cli-bundle/chunks/chunk-WTRUDJ3R.js.map +0 -1
  487. package/dist/cli-bundle/chunks/chunk-Z55WX4IQ.js.map +0 -1
  488. package/dist/cli-bundle/chunks/chunk-Z5BM2FKQ.js.map +0 -7
  489. package/dist/cli-bundle/chunks/chunk-ZEATCVAC.js.map +0 -7
  490. package/dist/cli-bundle/chunks/chunk-ZFIEEDTJ.js.map +0 -7
  491. package/dist/cli-bundle/chunks/chunk-ZIE6WXJ2.js.map +0 -1
  492. package/dist/cli-bundle/chunks/close-37KEHLYM.js +0 -14
  493. package/dist/cli-bundle/chunks/close-many-BFMP6HHK.js.map +0 -7
  494. package/dist/cli-bundle/chunks/close-many-CXJBOWWY.js.map +0 -1
  495. package/dist/cli-bundle/chunks/config-FIXJZEQK.js +0 -1541
  496. package/dist/cli-bundle/chunks/config-FIXJZEQK.js.map +0 -7
  497. package/dist/cli-bundle/chunks/config-X3ZVCUUG.js +0 -1531
  498. package/dist/cli-bundle/chunks/config-X3ZVCUUG.js.map +0 -1
  499. package/dist/cli-bundle/chunks/contracts-KP4QAGVW.js.map +0 -1
  500. package/dist/cli-bundle/chunks/contracts-SMOAN5NF.js.map +0 -7
  501. package/dist/cli-bundle/chunks/create-DFMNBKBS.js +0 -28
  502. package/dist/cli-bundle/chunks/get-AWK324RS.js.map +0 -7
  503. package/dist/cli-bundle/chunks/get-VYPIICPC.js.map +0 -1
  504. package/dist/cli-bundle/chunks/health-FBCVZGSX.js.map +0 -7
  505. package/dist/cli-bundle/chunks/health-Q66C43GN.js.map +0 -1
  506. package/dist/cli-bundle/chunks/history-5XUSLAJA.js +0 -18
  507. package/dist/cli-bundle/chunks/history-compact-2GHT32UX.js.map +0 -1
  508. package/dist/cli-bundle/chunks/history-compact-WLCQEKXS.js.map +0 -7
  509. package/dist/cli-bundle/chunks/history-redact-BVHWDXPR.js +0 -19
  510. package/dist/cli-bundle/chunks/history-repair-FY75IC26.js.map +0 -1
  511. package/dist/cli-bundle/chunks/history-repair-GABSDSVD.js.map +0 -7
  512. package/dist/cli-bundle/chunks/init-TRYJELH4.js +0 -21
  513. package/dist/cli-bundle/chunks/next-66BJB4N2.js.map +0 -7
  514. package/dist/cli-bundle/chunks/next-N5MWJTBY.js.map +0 -1
  515. package/dist/cli-bundle/chunks/plan-DQ7G4EDC.js.map +0 -7
  516. package/dist/cli-bundle/chunks/plan-ZHKZ7JVF.js.map +0 -1
  517. package/dist/cli-bundle/chunks/register-list-query-KY6Z6WV7.js.map +0 -7
  518. package/dist/cli-bundle/chunks/register-list-query-Y2VRHPCL.js.map +0 -1
  519. package/dist/cli-bundle/chunks/register-mutation-N6AYSKPM.js.map +0 -7
  520. package/dist/cli-bundle/chunks/register-mutation-PCARIGZS.js.map +0 -1
  521. package/dist/cli-bundle/chunks/register-operations-L6CYTOIH.js.map +0 -7
  522. package/dist/cli-bundle/chunks/register-operations-YAT6FUUB.js.map +0 -1
  523. package/dist/cli-bundle/chunks/register-setup-MPANILQF.js.map +0 -7
  524. package/dist/cli-bundle/chunks/register-setup-N7UGXYJC.js.map +0 -1
  525. package/dist/cli-bundle/chunks/restore-IRAKSWIW.js +0 -17
  526. package/dist/cli-bundle/chunks/telemetry-DIFPXCAT.js.map +0 -7
  527. package/dist/cli-bundle/chunks/telemetry-WTYFUPRL.js.map +0 -1
  528. package/dist/cli-bundle/chunks/test-all-PZTBLLQ6.js +0 -360
  529. package/dist/cli-bundle/chunks/test-all-PZTBLLQ6.js.map +0 -7
  530. package/dist/cli-bundle/chunks/test-all-XLPI4USF.js +0 -357
  531. package/dist/cli-bundle/chunks/test-all-XLPI4USF.js.map +0 -1
  532. package/dist/cli-bundle/chunks/test-runs-CA6K32RD.js.map +0 -1
  533. package/dist/cli-bundle/chunks/test-runs-LANLLPVO.js.map +0 -7
  534. package/dist/cli-bundle/chunks/update-UXDLTEOZ.js +0 -24
  535. package/dist/cli-bundle/chunks/validate-2G566PKQ.js.map +0 -7
  536. package/dist/cli-bundle/chunks/validate-BDPVXHHH.js.map +0 -1
  537. /package/dist/cli-bundle/chunks/{activity-MVSEND6D.js.map → activity-CUC4JY3U.js.map} +0 -0
  538. /package/dist/cli-bundle/chunks/{activity-EJBMXUBH.js.map → activity-WEIEMM73.js.map} +0 -0
  539. /package/dist/cli-bundle/chunks/{append-KDHT4GHI.js.map → append-H32VOR2Y.js.map} +0 -0
  540. /package/dist/cli-bundle/chunks/{append-LEDBAM3K.js.map → append-UBM632FK.js.map} +0 -0
  541. /package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js.map → chunk-2ASNV4DH.js.map} +0 -0
  542. /package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js.map → chunk-2CHRYUXL.js.map} +0 -0
  543. /package/dist/cli-bundle/chunks/{chunk-DRPF274X.js.map → chunk-3LCUASYG.js.map} +0 -0
  544. /package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js.map → chunk-3Q2HBMTI.js.map} +0 -0
  545. /package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js.map → chunk-55XRYWEG.js.map} +0 -0
  546. /package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js.map → chunk-A6VOGKBA.js.map} +0 -0
  547. /package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js.map → chunk-AIAIXG7I.js.map} +0 -0
  548. /package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js.map → chunk-BTX5MIQF.js.map} +0 -0
  549. /package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js.map → chunk-CYBDUHNO.js.map} +0 -0
  550. /package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js.map → chunk-CZPVDLD2.js.map} +0 -0
  551. /package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js.map → chunk-EUKTMRN3.js.map} +0 -0
  552. /package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js.map → chunk-FFOQHGNH.js.map} +0 -0
  553. /package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js.map → chunk-GFMSLORL.js.map} +0 -0
  554. /package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js.map → chunk-H4GRLYJS.js.map} +0 -0
  555. /package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js.map → chunk-HQTPRV4D.js.map} +0 -0
  556. /package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js.map → chunk-JMK5GCK2.js.map} +0 -0
  557. /package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js.map → chunk-K2VYLVX4.js.map} +0 -0
  558. /package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js.map → chunk-KCO2EAN5.js.map} +0 -0
  559. /package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js.map → chunk-KLXF7NCC.js.map} +0 -0
  560. /package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js.map → chunk-LRKMWUUV.js.map} +0 -0
  561. /package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js.map → chunk-LTRAF2D7.js.map} +0 -0
  562. /package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js.map → chunk-MRD4T5LF.js.map} +0 -0
  563. /package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js.map → chunk-N2JSWVWG.js.map} +0 -0
  564. /package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js.map → chunk-QH3FSKRJ.js.map} +0 -0
  565. /package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js.map → chunk-S62UANU7.js.map} +0 -0
  566. /package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js.map → chunk-U2BEEM2X.js.map} +0 -0
  567. /package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js.map → chunk-UT73HUPC.js.map} +0 -0
  568. /package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js.map → chunk-UTSH5GWX.js.map} +0 -0
  569. /package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js.map → chunk-Y4NRKBFW.js.map} +0 -0
  570. /package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js.map → chunk-YPKFV2JR.js.map} +0 -0
  571. /package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js.map → chunk-ZNHEYCDD.js.map} +0 -0
  572. /package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js.map → chunk-ZNT7KEWE.js.map} +0 -0
  573. /package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js.map → claim-SENTPZBN.js.map} +0 -0
  574. /package/dist/cli-bundle/chunks/{claim-6NINZYB3.js.map → claim-Z7MEQCBT.js.map} +0 -0
  575. /package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js.map → close-424MX4CU.js.map} +0 -0
  576. /package/dist/cli-bundle/chunks/{close-37KEHLYM.js.map → close-YCWQQPDS.js.map} +0 -0
  577. /package/dist/cli-bundle/chunks/{comments-ETHABIY6.js.map → comments-4FGNTSNV.js.map} +0 -0
  578. /package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js.map → comments-7YS5MY5X.js.map} +0 -0
  579. /package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js.map → context-LHVKJSPJ.js.map} +0 -0
  580. /package/dist/cli-bundle/chunks/{context-XDI4DKKT.js.map → context-ZQY54JNS.js.map} +0 -0
  581. /package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js.map → copy-GYNQQPW2.js.map} +0 -0
  582. /package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js.map → copy-TLW7JTQT.js.map} +0 -0
  583. /package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js.map → create-VSKYSOCD.js.map} +0 -0
  584. /package/dist/cli-bundle/chunks/{create-DFMNBKBS.js.map → create-XTMAPS7I.js.map} +0 -0
  585. /package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js.map → delete-4W5JYCEG.js.map} +0 -0
  586. /package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js.map → delete-ANTOTI2I.js.map} +0 -0
  587. /package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js.map → deps-HPPE6MJN.js.map} +0 -0
  588. /package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js.map → deps-ZQZN54EZ.js.map} +0 -0
  589. /package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js.map → docs-RPOVFMP3.js.map} +0 -0
  590. /package/dist/cli-bundle/chunks/{docs-2TIFR62T.js.map → docs-XJNYBJGE.js.map} +0 -0
  591. /package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js.map → eval-DM6JBZTS.js.map} +0 -0
  592. /package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js.map → eval-RFBI5FGS.js.map} +0 -0
  593. /package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js.map → extension-B3YY4WY5.js.map} +0 -0
  594. /package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js.map → extension-TTSEFQTS.js.map} +0 -0
  595. /package/dist/cli-bundle/chunks/{files-DF3HO6XK.js.map → files-5D65CHGE.js.map} +0 -0
  596. /package/dist/cli-bundle/chunks/{files-T5ODMETM.js.map → files-GPIG77EN.js.map} +0 -0
  597. /package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js.map → focus-C3PEJV2C.js.map} +0 -0
  598. /package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js.map → focus-ZHN7WIGX.js.map} +0 -0
  599. /package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js.map → gc-D4JQ6OWN.js.map} +0 -0
  600. /package/dist/cli-bundle/chunks/{gc-FULIVYR4.js.map → gc-VZIXDL32.js.map} +0 -0
  601. /package/dist/cli-bundle/chunks/{history-5XUSLAJA.js.map → history-DD7L7BNL.js.map} +0 -0
  602. /package/dist/cli-bundle/chunks/{history-X4OSES6K.js.map → history-IL7XCEX2.js.map} +0 -0
  603. /package/dist/cli-bundle/chunks/{history-redact-BVHWDXPR.js.map → history-redact-IX4YEWMY.js.map} +0 -0
  604. /package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js.map → history-redact-VYCWQFK7.js.map} +0 -0
  605. /package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js.map → init-F27NHENZ.js.map} +0 -0
  606. /package/dist/cli-bundle/chunks/{init-TRYJELH4.js.map → init-HHVQQP6C.js.map} +0 -0
  607. /package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js.map → learnings-HJVDQIGY.js.map} +0 -0
  608. /package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js.map → learnings-XSFSUUWK.js.map} +0 -0
  609. /package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js.map → list-HPMEKCAA.js.map} +0 -0
  610. /package/dist/cli-bundle/chunks/{list-ROT7JF62.js.map → list-VMPWTURB.js.map} +0 -0
  611. /package/dist/cli-bundle/chunks/{notes-FW6YFLND.js.map → notes-GDZIKGR6.js.map} +0 -0
  612. /package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js.map → notes-WDDBPC4D.js.map} +0 -0
  613. /package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js.map → profile-CCOKZ2IQ.js.map} +0 -0
  614. /package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js.map → profile-HUCENIEQ.js.map} +0 -0
  615. /package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js.map → restore-4CBWUMCX.js.map} +0 -0
  616. /package/dist/cli-bundle/chunks/{restore-IRAKSWIW.js.map → restore-5UEAGG3W.js.map} +0 -0
  617. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js.map → scheduling-shortcuts-6VFKNKCM.js.map} +0 -0
  618. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js.map → scheduling-shortcuts-ERHCVTEM.js.map} +0 -0
  619. /package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js.map → schema-TDGK6N3I.js.map} +0 -0
  620. /package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js.map → schema-UE5KKAUX.js.map} +0 -0
  621. /package/dist/cli-bundle/chunks/{search-KP6H7COV.js.map → search-FP7MEU4S.js.map} +0 -0
  622. /package/dist/cli-bundle/chunks/{search-CX5UMV4H.js.map → search-K4CFLQ5S.js.map} +0 -0
  623. /package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js.map → stats-NJJCALEZ.js.map} +0 -0
  624. /package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js.map → stats-XT6QRKQY.js.map} +0 -0
  625. /package/dist/cli-bundle/chunks/{test-QNDXZQCW.js.map → test-UFSJ5YIO.js.map} +0 -0
  626. /package/dist/cli-bundle/chunks/{test-HU2BS7EY.js.map → test-YCDAUBWF.js.map} +0 -0
  627. /package/dist/cli-bundle/chunks/{update-UXDLTEOZ.js.map → update-MTCFES6X.js.map} +0 -0
  628. /package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js.map → update-Y5WQVT5O.js.map} +0 -0
@@ -4,7 +4,7 @@
4
4
  * Implements the pm plan command surface and its agent-facing runtime behavior.
5
5
  */
6
6
 
7
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="441230c4-0ce6-5c75-8fcb-3af1fc95a584")}catch(e){}}();
7
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="1e64f96b-b7e3-5228-839a-65a187cb7020")}catch(e){}}();
8
8
  import { pathExists } from "../../core/fs/fs-utils.js";
9
9
  import { getActiveExtensionRegistrations } from "../../core/extensions/index.js";
10
10
  import { resolveItemTypeRegistry, resolveTypeName } from "../../core/item/type-registry.js";
@@ -483,6 +483,129 @@ async function readPlanItem(ctx, id) {
483
483
  ensurePlanItem(loaded.document.metadata);
484
484
  return { document: loaded.document, itemId: located.id };
485
485
  }
486
+ function buildPlanCreateDependencies(options) {
487
+ const deps = [];
488
+ if (options.parent) {
489
+ deps.push(`id=${options.parent.trim()},kind=parent`);
490
+ }
491
+ for (const ref of toArray(options.related))
492
+ deps.push(`id=${ref},kind=related`);
493
+ for (const ref of toArray(options.blocks))
494
+ deps.push(`id=${ref},kind=blocks`);
495
+ for (const ref of toArray(options.blockedBy))
496
+ deps.push(`id=${ref},kind=blocked_by`);
497
+ return deps.length > 0 ? deps : undefined;
498
+ }
499
+ function buildInitialValidation(options) {
500
+ const text = options.validationText?.trim();
501
+ const command = options.validationCommand?.trim();
502
+ const expected = options.validationExpected?.trim();
503
+ if (!text && !command && !expected) {
504
+ return undefined;
505
+ }
506
+ return {
507
+ text: text || command || "Validation check",
508
+ command: command || undefined,
509
+ expected: expected || undefined,
510
+ };
511
+ }
512
+ function hasPlanStepDetailOptions(options) {
513
+ return Boolean(options.stepBody?.trim()) ||
514
+ Boolean(options.stepOwner?.trim()) ||
515
+ Boolean(options.stepStatus?.trim()) ||
516
+ Boolean(options.stepEvidence?.trim()) ||
517
+ Boolean(options.stepBlockedReason?.trim()) ||
518
+ Boolean(options.stepReplacement?.trim()) ||
519
+ toArray(options.dependsOn).length > 0 ||
520
+ toArray(options.link).length > 0 ||
521
+ toSpecArray(options.file).length > 0 ||
522
+ toSpecArray(options.test).length > 0 ||
523
+ toSpecArray(options.doc).length > 0;
524
+ }
525
+ function resolveInitialStepSeed(options) {
526
+ const stepTitleFlag = options.stepTitle?.trim() || undefined;
527
+ const repeatedStepTitles = toOrderedStepTitles(options.step);
528
+ const templateSteps = options.template?.trim() ? resolvePlanTemplateSteps(options.template) : [];
529
+ return {
530
+ repeatedStepTitles,
531
+ stepTitleFlag,
532
+ stepTitles: [
533
+ ...(stepTitleFlag ? [stepTitleFlag] : []),
534
+ ...repeatedStepTitles,
535
+ ...templateSteps.map((step) => step.title),
536
+ ],
537
+ templateSteps,
538
+ };
539
+ }
540
+ function assertInitialStepSeedAllowed(seed, hasPerStepDetailOptions) {
541
+ if ((seed.stepTitleFlag || seed.repeatedStepTitles.length > 0) && seed.templateSteps.length > 0) {
542
+ throw new PmCliError("pm plan create --template cannot be combined with --step-title or --step; choose one step seeding source", EXIT_CODE.USAGE, {
543
+ code: "ambiguous_option_combination",
544
+ examples: [
545
+ `pm plan create --title "Fix login crash" --template ${PLAN_TEMPLATE_NAMES[0]}`,
546
+ 'pm plan create --title "Custom plan" --step "Read the code" --step "Write the fix"',
547
+ ],
548
+ });
549
+ }
550
+ if (seed.stepTitles.length > 1 && hasPerStepDetailOptions) {
551
+ throw new PmCliError("pm plan create per-step options apply to a single initial step; with multiple --step values create the plan first, then refine steps individually", EXIT_CODE.USAGE, {
552
+ code: "ambiguous_option_combination",
553
+ examples: [
554
+ 'pm plan create --title "Execution plan" --step "Read the code" --step "Write the fix"',
555
+ 'pm plan update-step <plan-id> plan-step-001 --step-body "Inspect retry path"',
556
+ ],
557
+ });
558
+ }
559
+ }
560
+ function buildSingleInitialStep(options, title) {
561
+ const status = asStepStatus(options.stepStatus, "pending");
562
+ const linkedItems = buildLinkInputs(options, "depends_on");
563
+ const files = toSpecArray(options.file).map(parseStepFile);
564
+ const tests = toSpecArray(options.test).map(parseStepTest);
565
+ const docs = toSpecArray(options.doc).map(parseStepDoc);
566
+ const now = nowIso();
567
+ return {
568
+ id: "plan-step-001",
569
+ order: 1,
570
+ title,
571
+ body: options.stepBody?.trim() || undefined,
572
+ status,
573
+ owner: options.stepOwner?.trim() || undefined,
574
+ evidence: options.stepEvidence?.trim() || undefined,
575
+ blocked_reason: status === "blocked" ? options.stepBlockedReason?.trim() || "" : undefined,
576
+ linked_items: linkedItems.length > 0 ? linkedItems : undefined,
577
+ files: files.length > 0 ? files : undefined,
578
+ tests: tests.length > 0 ? tests : undefined,
579
+ docs: docs.length > 0 ? docs : undefined,
580
+ created_at: now,
581
+ updated_at: now,
582
+ completed_at: status === "completed" ? now : undefined,
583
+ };
584
+ }
585
+ function buildInitialSteps(options) {
586
+ const seed = resolveInitialStepSeed(options);
587
+ const hasDetailOptions = hasPlanStepDetailOptions(options);
588
+ assertInitialStepSeedAllowed(seed, hasDetailOptions);
589
+ if (seed.stepTitles.length === 0) {
590
+ return { steps: [], hasPerStepDetailOptions: hasDetailOptions };
591
+ }
592
+ if (seed.stepTitles.length === 1) {
593
+ return { steps: [buildSingleInitialStep(options, seed.stepTitles[0])], hasPerStepDetailOptions: hasDetailOptions };
594
+ }
595
+ const now = nowIso();
596
+ return {
597
+ steps: seed.stepTitles.map((stepTitle, index) => ({
598
+ id: `${STEP_ID_PREFIX}${String(index + 1).padStart(3, "0")}`,
599
+ order: index + 1,
600
+ title: stepTitle,
601
+ body: seed.templateSteps[index]?.body,
602
+ status: "pending",
603
+ created_at: now,
604
+ updated_at: now,
605
+ })),
606
+ hasPerStepDetailOptions: hasDetailOptions,
607
+ };
608
+ }
486
609
  async function planCreate(options, global, ctx) {
487
610
  const title = options.title?.trim();
488
611
  if (!title) {
@@ -494,19 +617,6 @@ async function planCreate(options, global, ctx) {
494
617
  const mode = asPlanMode(options.mode, DEFAULT_PLAN_MODE);
495
618
  const harness = asHarness(options.harness);
496
619
  const fromSearch = options.fromSearch?.trim();
497
- const related = toArray(options.related);
498
- const blocks = toArray(options.blocks);
499
- const blockedBy = toArray(options.blockedBy);
500
- const deps = [];
501
- if (options.parent) {
502
- deps.push(`id=${options.parent.trim()},kind=parent`);
503
- }
504
- for (const ref of related)
505
- deps.push(`id=${ref},kind=related`);
506
- for (const ref of blocks)
507
- deps.push(`id=${ref},kind=blocks`);
508
- for (const ref of blockedBy)
509
- deps.push(`id=${ref},kind=blocked_by`);
510
620
  const description = options.description?.trim() ?? options.scope?.trim() ?? title;
511
621
  const createOptions = {
512
622
  title,
@@ -516,7 +626,7 @@ async function planCreate(options, global, ctx) {
516
626
  tags: options.tags,
517
627
  priority: options.priority,
518
628
  parent: options.parent,
519
- dep: deps.length > 0 ? deps : undefined,
629
+ dep: buildPlanCreateDependencies(options),
520
630
  author: options.author,
521
631
  message: options.message ?? (fromSearch ? `plan create (search: ${fromSearch})` : `plan create`),
522
632
  };
@@ -551,96 +661,8 @@ async function planCreate(options, global, ctx) {
551
661
  });
552
662
  let finalMetadata = seedResult.item;
553
663
  let initialStep;
554
- const initialValidationText = options.validationText?.trim();
555
- const initialValidationCommand = options.validationCommand?.trim();
556
- const initialValidationExpected = options.validationExpected?.trim();
557
- const initialValidation = initialValidationText || initialValidationCommand || initialValidationExpected
558
- ? {
559
- text: initialValidationText || initialValidationCommand || "Validation check",
560
- command: initialValidationCommand || undefined,
561
- expected: initialValidationExpected || undefined,
562
- }
563
- : undefined;
564
- // pm-6mit: collect ordered initial-step titles. Mixed-usage semantics
565
- // (documented on pm-6mit): --step-title (when present) is the FIRST step,
566
- // followed by each repeated --step value in argv order.
567
- const stepTitleFlag = options.stepTitle?.trim();
568
- const repeatedStepTitles = toOrderedStepTitles(options.step);
569
- const templateSteps = options.template?.trim() ? resolvePlanTemplateSteps(options.template) : [];
570
- const stepTitles = [
571
- ...(stepTitleFlag ? [stepTitleFlag] : []),
572
- ...repeatedStepTitles,
573
- ...templateSteps.map((step) => step.title),
574
- ];
575
- const hasPerStepDetailOptions = Boolean(options.stepBody?.trim()) ||
576
- Boolean(options.stepOwner?.trim()) ||
577
- Boolean(options.stepStatus?.trim()) ||
578
- Boolean(options.stepEvidence?.trim()) ||
579
- Boolean(options.stepBlockedReason?.trim()) ||
580
- Boolean(options.stepReplacement?.trim()) ||
581
- toArray(options.dependsOn).length > 0 ||
582
- toArray(options.link).length > 0 ||
583
- toSpecArray(options.file).length > 0 ||
584
- toSpecArray(options.test).length > 0 ||
585
- toSpecArray(options.doc).length > 0;
586
- if ((stepTitleFlag || repeatedStepTitles.length > 0) && templateSteps.length > 0) {
587
- throw new PmCliError("pm plan create --template cannot be combined with --step-title or --step; choose one step seeding source", EXIT_CODE.USAGE, {
588
- code: "ambiguous_option_combination",
589
- examples: [
590
- `pm plan create --title "Fix login crash" --template ${PLAN_TEMPLATE_NAMES[0]}`,
591
- 'pm plan create --title "Custom plan" --step "Read the code" --step "Write the fix"',
592
- ],
593
- });
594
- }
595
- if (stepTitles.length > 1 && hasPerStepDetailOptions) {
596
- // Per-step detail flags target exactly one step; silently attaching them to
597
- // the first (or all) of several seeded steps would be unpredictable.
598
- throw new PmCliError("pm plan create per-step options apply to a single initial step; with multiple --step values create the plan first, then refine steps individually", EXIT_CODE.USAGE, {
599
- code: "ambiguous_option_combination",
600
- examples: [
601
- 'pm plan create --title "Execution plan" --step "Read the code" --step "Write the fix"',
602
- 'pm plan update-step <plan-id> plan-step-001 --step-body "Inspect retry path"',
603
- ],
604
- });
605
- }
606
- let initialSteps = [];
607
- if (stepTitles.length === 1) {
608
- const status = asStepStatus(options.stepStatus, "pending");
609
- const linkedItems = buildLinkInputs(options, "depends_on");
610
- const files = toSpecArray(options.file).map(parseStepFile);
611
- const tests = toSpecArray(options.test).map(parseStepTest);
612
- const docs = toSpecArray(options.doc).map(parseStepDoc);
613
- const now = nowIso();
614
- initialSteps = [{
615
- id: "plan-step-001",
616
- order: 1,
617
- title: stepTitles[0],
618
- body: options.stepBody?.trim() || undefined,
619
- status,
620
- owner: options.stepOwner?.trim() || undefined,
621
- evidence: options.stepEvidence?.trim() || undefined,
622
- blocked_reason: status === "blocked" ? options.stepBlockedReason?.trim() || "" : undefined,
623
- linked_items: linkedItems.length > 0 ? linkedItems : undefined,
624
- files: files.length > 0 ? files : undefined,
625
- tests: tests.length > 0 ? tests : undefined,
626
- docs: docs.length > 0 ? docs : undefined,
627
- created_at: now,
628
- updated_at: now,
629
- completed_at: status === "completed" ? now : undefined,
630
- }];
631
- }
632
- else if (stepTitles.length > 1) {
633
- const now = nowIso();
634
- initialSteps = stepTitles.map((stepTitle, index) => ({
635
- id: `${STEP_ID_PREFIX}${String(index + 1).padStart(3, "0")}`,
636
- order: index + 1,
637
- title: stepTitle,
638
- body: templateSteps[index]?.body,
639
- status: "pending",
640
- created_at: now,
641
- updated_at: now,
642
- }));
643
- }
664
+ const initialValidation = buildInitialValidation(options);
665
+ const { steps: initialSteps, hasPerStepDetailOptions } = buildInitialSteps(options);
644
666
  if (initialSteps.length > 0) {
645
667
  initialStep = initialSteps[0];
646
668
  const stepped = await mutateItem({
@@ -767,10 +789,6 @@ async function planAddStep(id, options, ctx) {
767
789
  }
768
790
  const status = asStepStatus(options.stepStatus, "pending");
769
791
  const allowMultipleActive = options.allowMultipleActive === true;
770
- const linkedItems = buildLinkInputs(options, "depends_on");
771
- const files = toSpecArray(options.file).map(parseStepFile);
772
- const tests = toSpecArray(options.test).map(parseStepTest);
773
- const docs = toSpecArray(options.doc).map(parseStepDoc);
774
792
  const { document, resultStep, itemId } = await mutatePlanSteps({
775
793
  id,
776
794
  options,
@@ -779,31 +797,8 @@ async function planAddStep(id, options, ctx) {
779
797
  message: `plan add-step "${title}"`,
780
798
  mutator(steps) {
781
799
  const order = steps.length + 1;
782
- if (status === "in_progress" && !allowMultipleActive) {
783
- for (const step of steps) {
784
- if (step.status === "in_progress") {
785
- throw new PmCliError(`Plan already has step ${step.id} in_progress. Pass --allow-multiple-active or update that step first.`, EXIT_CODE.CONFLICT);
786
- }
787
- }
788
- }
789
- const now = nowIso();
790
- const step = {
791
- id: newStepId(steps),
792
- order,
793
- title,
794
- body: options.stepBody?.trim() || undefined,
795
- status,
796
- owner: options.stepOwner?.trim() || undefined,
797
- evidence: options.stepEvidence?.trim() || undefined,
798
- blocked_reason: status === "blocked" ? options.stepBlockedReason?.trim() || "" : undefined,
799
- linked_items: linkedItems.length > 0 ? linkedItems : undefined,
800
- files: files.length > 0 ? files : undefined,
801
- tests: tests.length > 0 ? tests : undefined,
802
- docs: docs.length > 0 ? docs : undefined,
803
- created_at: now,
804
- updated_at: now,
805
- completed_at: status === "completed" ? now : undefined,
806
- };
800
+ assertInProgressStepAllowed(steps, undefined, status, allowMultipleActive);
801
+ const step = buildAddedPlanStep(steps, options, { order, title, status });
807
802
  steps.push(step);
808
803
  return { changedSteps: [step.id], resultStep: step };
809
804
  },
@@ -818,6 +813,40 @@ async function planAddStep(id, options, ctx) {
818
813
  generated_at: nowIso(),
819
814
  };
820
815
  }
816
+ function assertInProgressStepAllowed(steps, currentStepId, desiredStatus, allowMultipleActive) {
817
+ if (desiredStatus !== "in_progress" || allowMultipleActive) {
818
+ return;
819
+ }
820
+ const activeStep = steps.find((step) => step.id !== currentStepId && step.status === "in_progress");
821
+ if (!activeStep) {
822
+ return;
823
+ }
824
+ throw new PmCliError(`Plan already has step ${activeStep.id} in_progress. Pass --allow-multiple-active or update that step first.`, EXIT_CODE.CONFLICT);
825
+ }
826
+ function buildAddedPlanStep(existingSteps, options, seed) {
827
+ const linkedItems = buildLinkInputs(options, "depends_on");
828
+ const files = toSpecArray(options.file).map(parseStepFile);
829
+ const tests = toSpecArray(options.test).map(parseStepTest);
830
+ const docs = toSpecArray(options.doc).map(parseStepDoc);
831
+ const now = nowIso();
832
+ return {
833
+ id: newStepId(existingSteps),
834
+ order: seed.order,
835
+ title: seed.title,
836
+ body: options.stepBody?.trim() || undefined,
837
+ status: seed.status,
838
+ owner: options.stepOwner?.trim() || undefined,
839
+ evidence: options.stepEvidence?.trim() || undefined,
840
+ blocked_reason: seed.status === "blocked" ? options.stepBlockedReason?.trim() || "" : undefined,
841
+ linked_items: linkedItems.length > 0 ? linkedItems : undefined,
842
+ files: files.length > 0 ? files : undefined,
843
+ tests: tests.length > 0 ? tests : undefined,
844
+ docs: docs.length > 0 ? docs : undefined,
845
+ created_at: now,
846
+ updated_at: now,
847
+ completed_at: seed.status === "completed" ? now : undefined,
848
+ };
849
+ }
821
850
  function buildLinkInputs(options, fallbackKind) {
822
851
  const dependsOn = toArray(options.dependsOn).map((id) => ({ id, kind: fallbackKind }));
823
852
  const related = toArray(options.related).map((id) => ({ id, kind: "related" }));
@@ -845,36 +874,9 @@ async function planUpdateStep(id, options, ctx, args) {
845
874
  const step = resolveStepRef(steps, args.stepRef);
846
875
  const now = nowIso();
847
876
  const desiredStatus = args.finalStatus ?? asStepStatus(options.stepStatus, step.status);
848
- if (desiredStatus === "in_progress" && step.status !== "in_progress" && !options.allowMultipleActive && !args.allowMultipleActive) {
849
- for (const other of steps) {
850
- if (other.id !== step.id && other.status === "in_progress") {
851
- throw new PmCliError(`Plan already has step ${other.id} in_progress. Pass --allow-multiple-active or update that step first.`, EXIT_CODE.CONFLICT);
852
- }
853
- }
854
- }
855
- if (desiredStatus === "blocked" && !options.stepBlockedReason?.trim() && !step.blocked_reason) {
856
- throw new PmCliError("Blocking a step requires --step-blocked-reason or an already-recorded blocked_reason.", EXIT_CODE.USAGE);
857
- }
858
- if (options.stepTitle?.trim())
859
- step.title = options.stepTitle.trim();
860
- if (options.stepBody !== undefined)
861
- step.body = options.stepBody.trim() || undefined;
862
- if (options.stepOwner !== undefined)
863
- step.owner = options.stepOwner.trim() || undefined;
864
- if (options.stepEvidence !== undefined)
865
- step.evidence = options.stepEvidence.trim() || undefined;
866
- if (options.stepBlockedReason !== undefined)
867
- step.blocked_reason = options.stepBlockedReason.trim() || undefined;
868
- if (options.stepReplacement !== undefined)
869
- step.superseded_by = options.stepReplacement.trim() || undefined;
870
- step.status = desiredStatus;
871
- step.updated_at = now;
872
- if (desiredStatus === "completed" && !step.completed_at) {
873
- step.completed_at = now;
874
- }
875
- else if (desiredStatus !== "completed") {
876
- step.completed_at = undefined;
877
- }
877
+ const allowMultipleActive = options.allowMultipleActive === true || args.allowMultipleActive === true;
878
+ assertInProgressStepAllowed(steps, step.status === "in_progress" ? step.id : undefined, desiredStatus, allowMultipleActive);
879
+ applyStepUpdates(step, options, desiredStatus, now);
878
880
  doc.metadata.updated_at = now;
879
881
  return { changedSteps: [step.id], resultStep: step };
880
882
  },
@@ -889,6 +891,49 @@ async function planUpdateStep(id, options, ctx, args) {
889
891
  generated_at: nowIso(),
890
892
  };
891
893
  }
894
+ function applyStepUpdates(step, options, desiredStatus, now) {
895
+ assertBlockedStepReason(step, options, desiredStatus);
896
+ applyStepFieldUpdates(step, options);
897
+ step.status = desiredStatus;
898
+ step.updated_at = now;
899
+ applyStepCompletionTimestamp(step, desiredStatus, now);
900
+ }
901
+ function assertBlockedStepReason(step, options, desiredStatus) {
902
+ if (desiredStatus !== "blocked" || options.stepBlockedReason?.trim() || step.blocked_reason) {
903
+ return;
904
+ }
905
+ throw new PmCliError("Blocking a step requires --step-blocked-reason or an already-recorded blocked_reason.", EXIT_CODE.USAGE);
906
+ }
907
+ function applyStepFieldUpdates(step, options) {
908
+ const title = options.stepTitle?.trim();
909
+ if (title) {
910
+ step.title = title;
911
+ }
912
+ if (options.stepBody !== undefined) {
913
+ step.body = options.stepBody.trim() || undefined;
914
+ }
915
+ if (options.stepOwner !== undefined) {
916
+ step.owner = options.stepOwner.trim() || undefined;
917
+ }
918
+ if (options.stepEvidence !== undefined) {
919
+ step.evidence = options.stepEvidence.trim() || undefined;
920
+ }
921
+ if (options.stepBlockedReason !== undefined) {
922
+ step.blocked_reason = options.stepBlockedReason.trim() || undefined;
923
+ }
924
+ if (options.stepReplacement !== undefined) {
925
+ step.superseded_by = options.stepReplacement.trim() || undefined;
926
+ }
927
+ }
928
+ function applyStepCompletionTimestamp(step, desiredStatus, now) {
929
+ if (desiredStatus === "completed" && !step.completed_at) {
930
+ step.completed_at = now;
931
+ return;
932
+ }
933
+ if (desiredStatus !== "completed") {
934
+ step.completed_at = undefined;
935
+ }
936
+ }
892
937
  async function planReorderStep(id, options, ctx, stepRef, newOrder) {
893
938
  const { document, itemId } = await mutatePlanSteps({
894
939
  id,
@@ -1141,6 +1186,67 @@ async function planApprove(id, options, ctx) {
1141
1186
  generated_at: nowIso(),
1142
1187
  };
1143
1188
  }
1189
+ function buildMaterializeSkippedWarnings(materializeSkipped) {
1190
+ return materializeSkipped.map((entry) => `plan_materialize_skipped:${entry.from_step}:${entry.reason}${entry.existing_id ? `:${entry.existing_id}` : ""}`);
1191
+ }
1192
+ function buildMaterializeNoopResult(planRead, materializeSkipped) {
1193
+ const plan = projectPlan(planRead.document.metadata, "standard");
1194
+ return {
1195
+ action: "materialize",
1196
+ plan,
1197
+ materialized: [],
1198
+ materialize_skipped: materializeSkipped,
1199
+ next_actions: nextActionsFor(planRead.itemId, plan),
1200
+ warnings: buildMaterializeSkippedWarnings(materializeSkipped),
1201
+ generated_at: nowIso(),
1202
+ };
1203
+ }
1204
+ function buildMaterializeDependencies(parent, planItemId, step) {
1205
+ const deps = [
1206
+ `id=${parent},kind=parent`,
1207
+ `id=${planItemId},kind=discovered_from`,
1208
+ ];
1209
+ for (const link of step.linked_items ?? []) {
1210
+ const realKind = link.kind === "blocked_by" || link.kind === "blocks" || link.kind === "related" || link.kind === "discovered_from"
1211
+ ? link.kind
1212
+ : "related";
1213
+ deps.push(`id=${link.id},kind=${realKind}`);
1214
+ }
1215
+ return deps;
1216
+ }
1217
+ async function createMaterializedStepItems(params) {
1218
+ const materialized = [];
1219
+ for (const step of params.targets) {
1220
+ const created = await runCreate({
1221
+ title: step.title,
1222
+ description: step.body?.trim() || step.title,
1223
+ type: params.resolvedTypeName,
1224
+ parent: params.parent,
1225
+ tags: params.tags,
1226
+ author: params.options.author,
1227
+ message: params.options.message ?? `materialized from plan ${params.planItemId} step ${step.id}`,
1228
+ dep: buildMaterializeDependencies(params.parent, params.planItemId, step),
1229
+ }, { ...{}, path: params.pmRoot });
1230
+ materialized.push({ id: created.item.id, type: params.resolvedTypeName, from_step: step.id });
1231
+ }
1232
+ return materialized;
1233
+ }
1234
+ function linkMaterializedStepItems(currentSteps, targets, materialized) {
1235
+ for (const target of targets) {
1236
+ const matched = materialized.find((entry) => entry.from_step === target.id);
1237
+ if (!matched) {
1238
+ continue;
1239
+ }
1240
+ const step = currentSteps.find((entry) => entry.id === target.id);
1241
+ if (!step) {
1242
+ continue;
1243
+ }
1244
+ const links = step.linked_items ?? [];
1245
+ links.push({ id: matched.id, kind: "implements", note: `materialized as ${matched.type}` });
1246
+ step.linked_items = links;
1247
+ step.updated_at = nowIso();
1248
+ }
1249
+ }
1144
1250
  async function planMaterialize(id, options, ctx) {
1145
1251
  const stepRefs = toArray(options.steps);
1146
1252
  if (stepRefs.length === 0) {
@@ -1159,68 +1265,27 @@ async function planMaterialize(id, options, ctx) {
1159
1265
  const { targets, skipped: materializeSkipped } = resolveMaterializeTargets(steps, stepRefs);
1160
1266
  if (targets.length === 0) {
1161
1267
  if (materializeSkipped.length > 0) {
1162
- // PR #78 / Gemini medium follow-up: when every selected step was
1163
- // already materialized or completed, return a successful no-op
1164
- // result (exit 0) instead of throwing NOT_FOUND. This makes
1165
- // `pm plan materialize --steps all` truly idempotent for CI/agent
1166
- // workflows; the skip reasons + warnings still surface what was
1167
- // intentionally not redone.
1168
- const plan = projectPlan(planRead.document.metadata, "standard");
1169
- return {
1170
- action: "materialize",
1171
- plan,
1172
- materialized: [],
1173
- materialize_skipped: materializeSkipped,
1174
- next_actions: nextActionsFor(planRead.itemId, plan),
1175
- warnings: materializeSkipped.map((entry) => `plan_materialize_skipped:${entry.from_step}:${entry.reason}${entry.existing_id ? `:${entry.existing_id}` : ""}`),
1176
- generated_at: nowIso(),
1177
- };
1268
+ return buildMaterializeNoopResult(planRead, materializeSkipped);
1178
1269
  }
1179
1270
  throw new PmCliError("No matching plan steps found for --steps", EXIT_CODE.NOT_FOUND);
1180
1271
  }
1181
- const materialized = [];
1182
- for (const step of targets) {
1183
- const deps = [
1184
- `id=${parent},kind=parent`,
1185
- `id=${planRead.itemId},kind=discovered_from`,
1186
- ];
1187
- for (const link of step.linked_items ?? []) {
1188
- const realKind = link.kind === "blocked_by" || link.kind === "blocks" || link.kind === "related" || link.kind === "discovered_from"
1189
- ? link.kind
1190
- : "related";
1191
- deps.push(`id=${link.id},kind=${realKind}`);
1192
- }
1193
- const created = await runCreate({
1194
- title: step.title,
1195
- description: step.body?.trim() || step.title,
1196
- type: resolvedTypeName,
1197
- parent,
1198
- tags,
1199
- author: options.author,
1200
- message: options.message ?? `materialized from plan ${planRead.itemId} step ${step.id}`,
1201
- dep: deps,
1202
- }, ctx.settings ? { ...{}, path: ctx.pmRoot } : {});
1203
- materialized.push({ id: created.item.id, type: resolvedTypeName, from_step: step.id });
1204
- }
1272
+ const materialized = await createMaterializedStepItems({
1273
+ targets,
1274
+ parent,
1275
+ planItemId: planRead.itemId,
1276
+ resolvedTypeName,
1277
+ tags,
1278
+ options,
1279
+ pmRoot: ctx.pmRoot,
1280
+ });
1205
1281
  const { document, itemId } = await mutatePlanSteps({
1206
1282
  id,
1207
1283
  options,
1208
1284
  ctx,
1209
1285
  op: "plan_materialize",
1210
1286
  message: options.message ?? `plan materialize ${stepRefs.join(",")}`,
1211
- mutator(currentSteps, doc) {
1212
- for (const target of targets) {
1213
- const matched = materialized.find((entry) => entry.from_step === target.id);
1214
- if (!matched)
1215
- continue;
1216
- const step = currentSteps.find((entry) => entry.id === target.id);
1217
- if (!step)
1218
- continue;
1219
- const links = step.linked_items ?? [];
1220
- links.push({ id: matched.id, kind: "implements", note: `materialized as ${matched.type}` });
1221
- step.linked_items = links;
1222
- step.updated_at = nowIso();
1223
- }
1287
+ mutator(currentSteps) {
1288
+ linkMaterializedStepItems(currentSteps, targets, materialized);
1224
1289
  return { changedSteps: targets.map((entry) => entry.id) };
1225
1290
  },
1226
1291
  });
@@ -1231,94 +1296,104 @@ async function planMaterialize(id, options, ctx) {
1231
1296
  materialized,
1232
1297
  ...(materializeSkipped.length > 0 ? { materialize_skipped: materializeSkipped } : {}),
1233
1298
  next_actions: nextActionsFor(itemId, plan),
1234
- warnings: materializeSkipped.map((entry) => `plan_materialize_skipped:${entry.from_step}:${entry.reason}${entry.existing_id ? `:${entry.existing_id}` : ""}`),
1299
+ warnings: buildMaterializeSkippedWarnings(materializeSkipped),
1235
1300
  generated_at: nowIso(),
1236
1301
  };
1237
1302
  }
1303
+ function normalizePlanStepAliasInput(input) {
1304
+ if (input.subcommand === "create") {
1305
+ return input;
1306
+ }
1307
+ const stepValues = toOrderedStepTitles(input.options.step);
1308
+ if (stepValues.length > 1) {
1309
+ throw new PmCliError(`pm plan ${input.subcommand} accepts a single --step/--step-title value (repeated --step seeds ordered steps only on pm plan create)`, EXIT_CODE.USAGE);
1310
+ }
1311
+ if (stepValues.length === 1 && !input.options.stepTitle?.trim()) {
1312
+ return { ...input, options: { ...input.options, stepTitle: stepValues[0] } };
1313
+ }
1314
+ return input;
1315
+ }
1316
+ function requirePlanId(input, label) {
1317
+ if (!input.id) {
1318
+ throw new PmCliError(`pm plan ${label} requires a plan id`, EXIT_CODE.USAGE);
1319
+ }
1320
+ return input.id;
1321
+ }
1322
+ function requirePlanStepRef(input, label) {
1323
+ const id = requirePlanId(input, label);
1324
+ if (!input.stepRef) {
1325
+ throw new PmCliError(`pm plan ${label} requires <plan-id> <step>`, EXIT_CODE.USAGE);
1326
+ }
1327
+ return { id, stepRef: input.stepRef };
1328
+ }
1329
+ function requireReorderTarget(input) {
1330
+ const target = requirePlanStepRef(input, "reorder-step");
1331
+ if (input.reorderTo === undefined) {
1332
+ throw new PmCliError("pm plan reorder-step requires <plan-id> <step> <new-order>", EXIT_CODE.USAGE);
1333
+ }
1334
+ return { ...target, reorderTo: input.reorderTo };
1335
+ }
1336
+ const PLAN_DISPATCHERS = {
1337
+ create: (input, ctx) => planCreate(input.options, input.global, ctx),
1338
+ show: (input, ctx) => planShow(requirePlanId(input, "show"), input.options, ctx),
1339
+ "add-step": (input, ctx) => planAddStep(requirePlanId(input, "add-step"), input.options, ctx),
1340
+ "update-step": (input, ctx) => {
1341
+ const target = requirePlanStepRef(input, "update-step");
1342
+ return planUpdateStep(target.id, input.options, ctx, { stepRef: target.stepRef, op: "plan_update_step" });
1343
+ },
1344
+ "complete-step": (input, ctx) => {
1345
+ const target = requirePlanStepRef(input, "complete-step");
1346
+ return planUpdateStep(target.id, input.options, ctx, {
1347
+ stepRef: target.stepRef,
1348
+ finalStatus: "completed",
1349
+ op: "plan_complete_step",
1350
+ });
1351
+ },
1352
+ "block-step": (input, ctx) => {
1353
+ const target = requirePlanStepRef(input, "block-step");
1354
+ return planUpdateStep(target.id, input.options, ctx, {
1355
+ stepRef: target.stepRef,
1356
+ finalStatus: "blocked",
1357
+ op: "plan_block_step",
1358
+ });
1359
+ },
1360
+ "reorder-step": (input, ctx) => {
1361
+ const target = requireReorderTarget(input);
1362
+ return planReorderStep(target.id, input.options, ctx, target.stepRef, target.reorderTo);
1363
+ },
1364
+ "remove-step": (input, ctx) => {
1365
+ const target = requirePlanStepRef(input, "remove-step");
1366
+ return planRemoveStep(target.id, input.options, ctx, target.stepRef);
1367
+ },
1368
+ link: (input, ctx) => {
1369
+ const target = requirePlanStepRef(input, "link");
1370
+ return planLink(target.id, input.options, ctx, target.stepRef);
1371
+ },
1372
+ unlink: (input, ctx) => {
1373
+ const target = requirePlanStepRef(input, "unlink");
1374
+ return planUnlink(target.id, input.options, ctx, target.stepRef);
1375
+ },
1376
+ decision: (input, ctx) => planAppendLog(requirePlanId(input, "decision"), input.options, ctx, "decision"),
1377
+ discovery: (input, ctx) => planAppendLog(requirePlanId(input, "discovery"), input.options, ctx, "discovery"),
1378
+ validation: (input, ctx) => planAppendLog(requirePlanId(input, "validation"), input.options, ctx, "validation"),
1379
+ resume: (input, ctx) => planResume(requirePlanId(input, "resume"), input.options, ctx),
1380
+ approve: (input, ctx) => planApprove(requirePlanId(input, "approve"), input.options, ctx),
1381
+ materialize: (input, ctx) => planMaterialize(requirePlanId(input, "materialize"), input.options, ctx),
1382
+ };
1383
+ function resolvePlanDispatcher(subcommand) {
1384
+ const dispatcher = PLAN_DISPATCHERS[subcommand];
1385
+ if (!dispatcher) {
1386
+ throw new PmCliError(`Unknown pm plan subcommand "${subcommand}"`, EXIT_CODE.USAGE);
1387
+ }
1388
+ return dispatcher;
1389
+ }
1238
1390
  /**
1239
1391
  * Implements run plan for the public runtime surface of this module.
1240
1392
  */
1241
1393
  export async function runPlan(input) {
1242
1394
  const ctx = await loadContext(input.global);
1243
- // pm-6mit: --step accumulates ordered step titles on create. For every other
1244
- // subcommand a single --step value keeps its historical alias-of---step-title
1245
- // behavior; multiple values would be ambiguous there (one step is targeted),
1246
- // so they are rejected instead of silently dropping all but the last.
1247
- if (input.subcommand !== "create") {
1248
- const stepValues = toOrderedStepTitles(input.options.step);
1249
- if (stepValues.length > 1) {
1250
- throw new PmCliError(`pm plan ${input.subcommand} accepts a single --step/--step-title value (repeated --step seeds ordered steps only on pm plan create)`, EXIT_CODE.USAGE);
1251
- }
1252
- if (stepValues.length === 1 && !input.options.stepTitle?.trim()) {
1253
- input = { ...input, options: { ...input.options, stepTitle: stepValues[0] } };
1254
- }
1255
- }
1256
- switch (input.subcommand) {
1257
- case "create":
1258
- return planCreate(input.options, input.global, ctx);
1259
- case "show":
1260
- if (!input.id)
1261
- throw new PmCliError("pm plan show requires a plan id", EXIT_CODE.USAGE);
1262
- return planShow(input.id, input.options, ctx);
1263
- case "add-step":
1264
- if (!input.id)
1265
- throw new PmCliError("pm plan add-step requires a plan id", EXIT_CODE.USAGE);
1266
- return planAddStep(input.id, input.options, ctx);
1267
- case "update-step":
1268
- if (!input.id || !input.stepRef)
1269
- throw new PmCliError("pm plan update-step requires <plan-id> <step>", EXIT_CODE.USAGE);
1270
- return planUpdateStep(input.id, input.options, ctx, { stepRef: input.stepRef, op: "plan_update_step" });
1271
- case "complete-step":
1272
- if (!input.id || !input.stepRef)
1273
- throw new PmCliError("pm plan complete-step requires <plan-id> <step>", EXIT_CODE.USAGE);
1274
- return planUpdateStep(input.id, input.options, ctx, { stepRef: input.stepRef, finalStatus: "completed", op: "plan_complete_step" });
1275
- case "block-step":
1276
- if (!input.id || !input.stepRef)
1277
- throw new PmCliError("pm plan block-step requires <plan-id> <step>", EXIT_CODE.USAGE);
1278
- return planUpdateStep(input.id, input.options, ctx, { stepRef: input.stepRef, finalStatus: "blocked", op: "plan_block_step" });
1279
- case "reorder-step":
1280
- if (!input.id || !input.stepRef || input.reorderTo === undefined)
1281
- throw new PmCliError("pm plan reorder-step requires <plan-id> <step> <new-order>", EXIT_CODE.USAGE);
1282
- return planReorderStep(input.id, input.options, ctx, input.stepRef, input.reorderTo);
1283
- case "remove-step":
1284
- if (!input.id || !input.stepRef)
1285
- throw new PmCliError("pm plan remove-step requires <plan-id> <step>", EXIT_CODE.USAGE);
1286
- return planRemoveStep(input.id, input.options, ctx, input.stepRef);
1287
- case "link":
1288
- if (!input.id || !input.stepRef)
1289
- throw new PmCliError("pm plan link requires <plan-id> <step>", EXIT_CODE.USAGE);
1290
- return planLink(input.id, input.options, ctx, input.stepRef);
1291
- case "unlink":
1292
- if (!input.id || !input.stepRef)
1293
- throw new PmCliError("pm plan unlink requires <plan-id> <step>", EXIT_CODE.USAGE);
1294
- return planUnlink(input.id, input.options, ctx, input.stepRef);
1295
- case "decision":
1296
- if (!input.id)
1297
- throw new PmCliError("pm plan decision requires a plan id", EXIT_CODE.USAGE);
1298
- return planAppendLog(input.id, input.options, ctx, "decision");
1299
- case "discovery":
1300
- if (!input.id)
1301
- throw new PmCliError("pm plan discovery requires a plan id", EXIT_CODE.USAGE);
1302
- return planAppendLog(input.id, input.options, ctx, "discovery");
1303
- case "validation":
1304
- if (!input.id)
1305
- throw new PmCliError("pm plan validation requires a plan id", EXIT_CODE.USAGE);
1306
- return planAppendLog(input.id, input.options, ctx, "validation");
1307
- case "resume":
1308
- if (!input.id)
1309
- throw new PmCliError("pm plan resume requires a plan id", EXIT_CODE.USAGE);
1310
- return planResume(input.id, input.options, ctx);
1311
- case "approve":
1312
- if (!input.id)
1313
- throw new PmCliError("pm plan approve requires a plan id", EXIT_CODE.USAGE);
1314
- return planApprove(input.id, input.options, ctx);
1315
- case "materialize":
1316
- if (!input.id)
1317
- throw new PmCliError("pm plan materialize requires a plan id", EXIT_CODE.USAGE);
1318
- return planMaterialize(input.id, input.options, ctx);
1319
- default:
1320
- throw new PmCliError(`Unknown pm plan subcommand "${input.subcommand}"`, EXIT_CODE.USAGE);
1321
- }
1395
+ const normalizedInput = normalizePlanStepAliasInput(input);
1396
+ return resolvePlanDispatcher(normalizedInput.subcommand)(normalizedInput, ctx);
1322
1397
  }
1323
1398
  //# sourceMappingURL=plan.js.map
1324
- //# debugId=441230c4-0ce6-5c75-8fcb-3af1fc95a584
1399
+ //# debugId=1e64f96b-b7e3-5228-839a-65a187cb7020