@unbrained/pm-cli 2026.6.30 → 2026.7.1

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 (452) hide show
  1. package/AGENTS.md +2 -0
  2. package/CHANGELOG.md +20 -0
  3. package/dist/cli/bootstrap-args.js +89 -79
  4. package/dist/cli/bootstrap-args.js.map +1 -1
  5. package/dist/cli/commands/calendar.js +63 -62
  6. package/dist/cli/commands/calendar.js.map +1 -1
  7. package/dist/cli/commands/create.js +483 -434
  8. package/dist/cli/commands/create.js.map +1 -1
  9. package/dist/cli/commands/extension/bundled-catalog.js +59 -46
  10. package/dist/cli/commands/extension/bundled-catalog.js.map +1 -1
  11. package/dist/cli/commands/extension/doctor.js +129 -78
  12. package/dist/cli/commands/extension/doctor.js.map +1 -1
  13. package/dist/cli/commands/extension/managed-state.js +101 -57
  14. package/dist/cli/commands/extension/managed-state.js.map +1 -1
  15. package/dist/cli/commands/extension/scaffold.d.ts +7 -0
  16. package/dist/cli/commands/extension/scaffold.js +214 -186
  17. package/dist/cli/commands/extension/scaffold.js.map +1 -1
  18. package/dist/cli/commands/extension.d.ts +6 -1
  19. package/dist/cli/commands/extension.js +1034 -902
  20. package/dist/cli/commands/extension.js.map +1 -1
  21. package/dist/cli/commands/list-filter-shared.js +55 -48
  22. package/dist/cli/commands/list-filter-shared.js.map +1 -1
  23. package/dist/cli/commands/search.js +94 -68
  24. package/dist/cli/commands/search.js.map +1 -1
  25. package/dist/cli/commands/test.js +108 -122
  26. package/dist/cli/commands/test.js.map +1 -1
  27. package/dist/cli/commands/update.js +27 -77
  28. package/dist/cli/commands/update.js.map +1 -1
  29. package/dist/cli/extension-command-options.js +48 -21
  30. package/dist/cli/extension-command-options.js.map +1 -1
  31. package/dist/cli/registration-helpers.js +117 -122
  32. package/dist/cli/registration-helpers.js.map +1 -1
  33. package/dist/cli-bundle/chunks/activity-AW6XVFH6.js +16 -0
  34. package/dist/cli-bundle/chunks/{activity-MVSEND6D.js → activity-DBLQVIP6.js} +9 -9
  35. package/dist/cli-bundle/chunks/{aggregate-MOC4TR2G.js → aggregate-JTEF4BP7.js} +9 -9
  36. package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js → aggregate-SDF7DUOD.js} +9 -9
  37. package/dist/cli-bundle/chunks/{append-LEDBAM3K.js → append-LOVPGVPT.js} +6 -6
  38. package/dist/cli-bundle/chunks/{append-KDHT4GHI.js → append-QCFJSDFL.js} +6 -6
  39. package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js → chunk-22WKIL3H.js} +6 -6
  40. package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js → chunk-2466X6E4.js} +6 -6
  41. package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js → chunk-27BXPBAY.js} +3 -3
  42. package/dist/cli-bundle/chunks/{chunk-WTRUDJ3R.js → chunk-2D4HATP2.js} +5 -5
  43. package/dist/cli-bundle/chunks/{chunk-DORJSBGJ.js → chunk-3J6JRJ3I.js} +127 -125
  44. package/dist/cli-bundle/chunks/chunk-3J6JRJ3I.js.map +7 -0
  45. package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js → chunk-3K2M5OYU.js} +4 -4
  46. package/dist/cli-bundle/chunks/{chunk-KTMMTOIP.js → chunk-3S2KT7NG.js} +7 -7
  47. package/dist/cli-bundle/chunks/{chunk-FDEVKXC4.js → chunk-3VGN2UWE.js} +2 -2
  48. package/dist/cli-bundle/chunks/{chunk-K46GQ265.js → chunk-3XZCOZ5J.js} +107 -117
  49. package/dist/cli-bundle/chunks/chunk-3XZCOZ5J.js.map +1 -0
  50. package/dist/cli-bundle/chunks/chunk-4A3BJ675.js +799 -0
  51. package/dist/cli-bundle/chunks/chunk-4A3BJ675.js.map +1 -0
  52. package/dist/cli-bundle/chunks/chunk-4BU75MF4.js +87 -0
  53. package/dist/cli-bundle/chunks/chunk-4BU75MF4.js.map +7 -0
  54. package/dist/cli-bundle/chunks/{chunk-KYDYQMNW.js → chunk-4DSGXSBL.js} +4 -4
  55. package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js → chunk-4DUVCVLZ.js} +2 -2
  56. package/dist/cli-bundle/chunks/{chunk-UB3V5WUI.js → chunk-4XOIEKSD.js} +351 -330
  57. package/dist/cli-bundle/chunks/chunk-4XOIEKSD.js.map +1 -0
  58. package/dist/cli-bundle/chunks/{chunk-DJDXAU74.js → chunk-55SNVXRQ.js} +68 -69
  59. package/dist/cli-bundle/chunks/chunk-55SNVXRQ.js.map +7 -0
  60. package/dist/cli-bundle/chunks/{chunk-ZIE6WXJ2.js → chunk-5CGRF3L5.js} +7 -7
  61. package/dist/cli-bundle/chunks/{chunk-7WDETKGP.js → chunk-5QFDBI4F.js} +1105 -965
  62. package/dist/cli-bundle/chunks/chunk-5QFDBI4F.js.map +7 -0
  63. package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js → chunk-64HNBBFQ.js} +6 -6
  64. package/dist/cli-bundle/chunks/{chunk-T7ZMQI4J.js → chunk-6AQZPVHQ.js} +198 -189
  65. package/dist/cli-bundle/chunks/chunk-6AQZPVHQ.js.map +1 -0
  66. package/dist/cli-bundle/chunks/{chunk-CY5IJMUM.js → chunk-7R4QEMZZ.js} +361 -322
  67. package/dist/cli-bundle/chunks/chunk-7R4QEMZZ.js.map +1 -0
  68. package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js → chunk-A7FPBAQS.js} +4 -4
  69. package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js → chunk-AVEE5EHK.js} +3 -3
  70. package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js → chunk-AXIDKKAT.js} +2 -2
  71. package/dist/cli-bundle/chunks/{chunk-CHRNYKNI.js → chunk-BDTISOSD.js} +2 -2
  72. package/dist/cli-bundle/chunks/{chunk-ZFIEEDTJ.js → chunk-BHO33VBQ.js} +509 -363
  73. package/dist/cli-bundle/chunks/chunk-BHO33VBQ.js.map +7 -0
  74. package/dist/cli-bundle/chunks/{chunk-RM6MHL6A.js → chunk-BZCEN4JA.js} +98 -74
  75. package/dist/cli-bundle/chunks/chunk-BZCEN4JA.js.map +7 -0
  76. package/dist/cli-bundle/chunks/{chunk-RPRW26NG.js → chunk-CF7RL6FR.js} +7 -7
  77. package/dist/cli-bundle/chunks/{chunk-NIBP3I7A.js → chunk-CWFNTKQJ.js} +128 -126
  78. package/dist/cli-bundle/chunks/chunk-CWFNTKQJ.js.map +1 -0
  79. package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js → chunk-DDPTYJIM.js} +2 -2
  80. package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js → chunk-EJUDVUYZ.js} +3 -3
  81. package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js → chunk-EVMTBV6V.js} +3 -3
  82. package/dist/cli-bundle/chunks/{chunk-6YRAMXRS.js → chunk-FFMQB7WR.js} +99 -75
  83. package/dist/cli-bundle/chunks/chunk-FFMQB7WR.js.map +1 -0
  84. package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js → chunk-G7I7DEZA.js} +4 -4
  85. package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js → chunk-GJ326ZKX.js} +3 -3
  86. package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js → chunk-HPPFYYOV.js} +2 -2
  87. package/dist/cli-bundle/chunks/{chunk-5IRVSKPS.js → chunk-HXTQJXWT.js} +150 -224
  88. package/dist/cli-bundle/chunks/chunk-HXTQJXWT.js.map +1 -0
  89. package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js → chunk-HYTGA6GI.js} +3 -3
  90. package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js → chunk-HZZEHPRG.js} +2 -2
  91. package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js → chunk-IJYK2T43.js} +2 -2
  92. package/dist/cli-bundle/chunks/{chunk-GF7EAR22.js → chunk-IPYBJWTE.js} +7 -7
  93. package/dist/cli-bundle/chunks/{chunk-AWN4PPH5.js → chunk-IZBR4NRW.js} +7 -7
  94. package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js → chunk-JLM7BHI7.js} +6 -6
  95. package/dist/cli-bundle/chunks/{chunk-DU66JUGT.js → chunk-JMP4E6D7.js} +106 -116
  96. package/dist/cli-bundle/chunks/chunk-JMP4E6D7.js.map +7 -0
  97. package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js → chunk-JPECA746.js} +2 -2
  98. package/dist/cli-bundle/chunks/{chunk-KGQ3W65B.js → chunk-JSU5P7VS.js} +4 -4
  99. package/dist/cli-bundle/chunks/{chunk-HIBK6H4S.js → chunk-JWXRETDF.js} +69 -70
  100. package/dist/cli-bundle/chunks/chunk-JWXRETDF.js.map +1 -0
  101. package/dist/cli-bundle/chunks/{chunk-Z5BM2FKQ.js → chunk-KNPEF7QG.js} +4 -4
  102. package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js → chunk-L5OEFZQG.js} +3 -3
  103. package/dist/cli-bundle/chunks/{chunk-DRPF274X.js → chunk-LB6TP6MC.js} +2 -2
  104. package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js → chunk-MAUKX7JC.js} +2 -2
  105. package/dist/cli-bundle/chunks/{chunk-6T5ZIWBS.js → chunk-MDPEOIGN.js} +150 -224
  106. package/dist/cli-bundle/chunks/chunk-MDPEOIGN.js.map +7 -0
  107. package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js → chunk-N74UMG5H.js} +2 -2
  108. package/dist/cli-bundle/chunks/{chunk-ZEATCVAC.js → chunk-NFDPYAIP.js} +2 -2
  109. package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js → chunk-NKZAN7BD.js} +3 -3
  110. package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js → chunk-NOLPZMSV.js} +2 -2
  111. package/dist/cli-bundle/chunks/{chunk-JZG5ADVE.js → chunk-NU2UEROZ.js} +1103 -963
  112. package/dist/cli-bundle/chunks/chunk-NU2UEROZ.js.map +1 -0
  113. package/dist/cli-bundle/chunks/{chunk-A3UNLXNJ.js → chunk-NUHHPVVS.js} +36 -86
  114. package/dist/cli-bundle/chunks/chunk-NUHHPVVS.js.map +7 -0
  115. package/dist/cli-bundle/chunks/{chunk-QE5UFCCO.js → chunk-NWMZWYYB.js} +2 -2
  116. package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js → chunk-OGXLACHC.js} +6 -6
  117. package/dist/cli-bundle/chunks/{chunk-IHXXUIXS.js → chunk-OTUHB4HS.js} +4 -4
  118. package/dist/cli-bundle/chunks/{chunk-V3KLX7U7.js → chunk-QCWF6IYD.js} +510 -364
  119. package/dist/cli-bundle/chunks/chunk-QCWF6IYD.js.map +1 -0
  120. package/dist/cli-bundle/chunks/{chunk-UFKNF23C.js → chunk-RGEMWD6Q.js} +5 -5
  121. package/dist/cli-bundle/chunks/chunk-RH5ZBYFD.js +809 -0
  122. package/dist/cli-bundle/chunks/chunk-RH5ZBYFD.js.map +7 -0
  123. package/dist/cli-bundle/chunks/{chunk-Z55WX4IQ.js → chunk-RLDHZHQS.js} +7 -7
  124. package/dist/cli-bundle/chunks/{chunk-NO6Y6FB2.js → chunk-RMMQ74TG.js} +5 -5
  125. package/dist/cli-bundle/chunks/{chunk-SNUK7H5J.js → chunk-RVUALSJF.js} +361 -322
  126. package/dist/cli-bundle/chunks/chunk-RVUALSJF.js.map +7 -0
  127. package/dist/cli-bundle/chunks/{chunk-IZQOJR2B.js → chunk-SDR5J34Q.js} +198 -189
  128. package/dist/cli-bundle/chunks/chunk-SDR5J34Q.js.map +7 -0
  129. package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js → chunk-SLMUGTK3.js} +4 -4
  130. package/dist/cli-bundle/chunks/{chunk-BOWQWXLI.js → chunk-TP5Q5ZD3.js} +5 -5
  131. package/dist/cli-bundle/chunks/{chunk-D5LYZVGB.js → chunk-UYUYDGIB.js} +4 -4
  132. package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js → chunk-UZIWVBE6.js} +2 -2
  133. package/dist/cli-bundle/chunks/{chunk-JTRKME24.js → chunk-V3NOKJF2.js} +6 -6
  134. package/dist/cli-bundle/chunks/{chunk-5T6WPLRO.js → chunk-VARHOHYV.js} +350 -329
  135. package/dist/cli-bundle/chunks/chunk-VARHOHYV.js.map +7 -0
  136. package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js → chunk-VICZWYGZ.js} +4 -4
  137. package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js +84 -0
  138. package/dist/cli-bundle/chunks/chunk-VY3VQ22F.js.map +1 -0
  139. package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js → chunk-W4ULYO7Z.js} +6 -6
  140. package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js → chunk-WYDHYJPO.js} +2 -2
  141. package/dist/cli-bundle/chunks/{chunk-53ARXF2O.js → chunk-YITK2PJ6.js} +6 -6
  142. package/dist/cli-bundle/chunks/{chunk-VD3LKZFX.js → chunk-ZETXE4SE.js} +37 -87
  143. package/dist/cli-bundle/chunks/chunk-ZETXE4SE.js.map +1 -0
  144. package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js → chunk-ZRP4VG5U.js} +2 -2
  145. package/dist/cli-bundle/chunks/{claim-6NINZYB3.js → claim-EMQLYPRW.js} +8 -8
  146. package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js → claim-T3GCKV7C.js} +8 -8
  147. package/dist/cli-bundle/chunks/close-E6ZZGCJY.js +14 -0
  148. package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js → close-TQYAAFJP.js} +7 -7
  149. package/dist/cli-bundle/chunks/{close-many-BFMP6HHK.js → close-many-BG5QQIDQ.js} +15 -15
  150. package/dist/cli-bundle/chunks/{close-many-CXJBOWWY.js → close-many-LDRVEQY2.js} +15 -15
  151. package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js → comments-QCKR2YY2.js} +8 -8
  152. package/dist/cli-bundle/chunks/{comments-ETHABIY6.js → comments-YUXJRZPQ.js} +8 -8
  153. package/dist/cli-bundle/chunks/{config-FIXJZEQK.js → config-DMSU64QO.js} +7 -7
  154. package/dist/cli-bundle/chunks/{config-X3ZVCUUG.js → config-QH2DICD6.js} +7 -7
  155. package/dist/cli-bundle/chunks/{context-XDI4DKKT.js → context-B6275WPX.js} +12 -12
  156. package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js → context-OCZ3FJ4Z.js} +12 -12
  157. package/dist/cli-bundle/chunks/{contracts-SMOAN5NF.js → contracts-HN7ABKLP.js} +3 -3
  158. package/dist/cli-bundle/chunks/{contracts-KP4QAGVW.js → contracts-W4FZVVD6.js} +3 -3
  159. package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js → copy-BTJOSKKT.js} +5 -5
  160. package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js → copy-DEM4DATS.js} +5 -5
  161. package/dist/cli-bundle/chunks/create-OH3BDGBB.js +28 -0
  162. package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js → create-RLRJMRTM.js} +12 -12
  163. package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js → delete-BHK7VB2Z.js} +5 -5
  164. package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js → delete-LSVHAB4Y.js} +5 -5
  165. package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js → deps-4UDFJRUA.js} +5 -5
  166. package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js → deps-XHYXWEPT.js} +5 -5
  167. package/dist/cli-bundle/chunks/{docs-2TIFR62T.js → docs-26S44RXU.js} +7 -7
  168. package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js → docs-GYZNVS26.js} +7 -7
  169. package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js → eval-PGRVIJQU.js} +10 -10
  170. package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js → eval-UYF3ZPVO.js} +10 -10
  171. package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js → extension-CPSLJQVE.js} +11 -10
  172. package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js → extension-CXJ6RELI.js} +11 -10
  173. package/dist/cli-bundle/chunks/{files-T5ODMETM.js → files-MBNICQFM.js} +7 -7
  174. package/dist/cli-bundle/chunks/{files-DF3HO6XK.js → files-NQHEXUZD.js} +7 -7
  175. package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js → focus-DWYIG7GU.js} +6 -6
  176. package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js → focus-XZW5423D.js} +6 -6
  177. package/dist/cli-bundle/chunks/{gc-FULIVYR4.js → gc-7GQYOS2G.js} +3 -3
  178. package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js → gc-LPVMKJQJ.js} +3 -3
  179. package/dist/cli-bundle/chunks/{get-AWK324RS.js → get-A7MAOHCU.js} +9 -9
  180. package/dist/cli-bundle/chunks/{get-VYPIICPC.js → get-DSDEKJ3L.js} +9 -9
  181. package/dist/cli-bundle/chunks/{health-Q66C43GN.js → health-3IPFLKXB.js} +17 -16
  182. package/dist/cli-bundle/chunks/{health-Q66C43GN.js.map → health-3IPFLKXB.js.map} +1 -1
  183. package/dist/cli-bundle/chunks/{health-FBCVZGSX.js → health-GZXGBZ36.js} +15 -14
  184. package/dist/cli-bundle/chunks/{health-FBCVZGSX.js.map → health-GZXGBZ36.js.map} +1 -1
  185. package/dist/cli-bundle/chunks/{history-X4OSES6K.js → history-NERDJNUB.js} +8 -8
  186. package/dist/cli-bundle/chunks/history-WSZHY3PN.js +18 -0
  187. package/dist/cli-bundle/chunks/{history-compact-WLCQEKXS.js → history-compact-2WRZ2WK4.js} +10 -10
  188. package/dist/cli-bundle/chunks/{history-compact-2GHT32UX.js → history-compact-HR7BB4LR.js} +10 -10
  189. package/dist/cli-bundle/chunks/history-redact-MP6CH7U5.js +19 -0
  190. package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js → history-redact-O3NBCNWC.js} +9 -9
  191. package/dist/cli-bundle/chunks/{history-repair-GABSDSVD.js → history-repair-LCMOS45X.js} +10 -10
  192. package/dist/cli-bundle/chunks/{history-repair-FY75IC26.js → history-repair-XA3LC4GA.js} +10 -10
  193. package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js → init-64XDLQJB.js} +12 -11
  194. package/dist/cli-bundle/chunks/init-PAX32BJA.js +22 -0
  195. package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js → learnings-JR6MA5TI.js} +8 -8
  196. package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js → learnings-LPKCSJX7.js} +8 -8
  197. package/dist/cli-bundle/chunks/{list-ROT7JF62.js → list-DNBJVO3E.js} +8 -8
  198. package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js → list-G5Y65VF6.js} +8 -8
  199. package/dist/cli-bundle/chunks/{next-66BJB4N2.js → next-BCERKDUR.js} +13 -13
  200. package/dist/cli-bundle/chunks/{next-N5MWJTBY.js → next-FYTQF6HG.js} +13 -13
  201. package/dist/cli-bundle/chunks/{notes-FW6YFLND.js → notes-2BMU3VVQ.js} +8 -8
  202. package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js → notes-6KTGO2OJ.js} +8 -8
  203. package/dist/cli-bundle/chunks/{plan-DQ7G4EDC.js → plan-4WXEQCTN.js} +12 -12
  204. package/dist/cli-bundle/chunks/{plan-ZHKZ7JVF.js → plan-RKZHQVXR.js} +12 -12
  205. package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js → profile-4OMM32CD.js} +8 -8
  206. package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js → profile-QLER5ENE.js} +8 -8
  207. package/dist/cli-bundle/chunks/{register-list-query-Y2VRHPCL.js → register-list-query-7LV46VAU.js} +18 -18
  208. package/dist/cli-bundle/chunks/{register-list-query-KY6Z6WV7.js → register-list-query-SNG5PGA4.js} +18 -18
  209. package/dist/cli-bundle/chunks/{register-mutation-PCARIGZS.js → register-mutation-ENNDUAZG.js} +35 -35
  210. package/dist/cli-bundle/chunks/{register-mutation-N6AYSKPM.js → register-mutation-KK7PHYYU.js} +35 -35
  211. package/dist/cli-bundle/chunks/{register-operations-YAT6FUUB.js → register-operations-C6OWLDSH.js} +30 -30
  212. package/dist/cli-bundle/chunks/{register-operations-L6CYTOIH.js → register-operations-HZ6XERQG.js} +30 -30
  213. package/dist/cli-bundle/chunks/{register-setup-N7UGXYJC.js → register-setup-P67EMBDJ.js} +15 -15
  214. package/dist/cli-bundle/chunks/{register-setup-MPANILQF.js → register-setup-ZKJ53RS7.js} +15 -15
  215. package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js → restore-4MHZFJ2E.js} +9 -9
  216. package/dist/cli-bundle/chunks/restore-YALDGTQR.js +17 -0
  217. package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js → scheduling-shortcuts-LB6DOLRL.js} +12 -12
  218. package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js → scheduling-shortcuts-UTOYKLXQ.js} +12 -12
  219. package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js → schema-73HR2OJW.js} +7 -7
  220. package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js → schema-U6LJKSIR.js} +7 -7
  221. package/dist/cli-bundle/chunks/{search-CX5UMV4H.js → search-AXPXKZER.js} +10 -10
  222. package/dist/cli-bundle/chunks/{search-KP6H7COV.js → search-KILGT37L.js} +10 -10
  223. package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js → stats-PSYVVTNZ.js} +6 -6
  224. package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js → stats-W5KNVJWQ.js} +6 -6
  225. package/dist/cli-bundle/chunks/{telemetry-WTYFUPRL.js → telemetry-BZUF6H7G.js} +4 -4
  226. package/dist/cli-bundle/chunks/{telemetry-DIFPXCAT.js → telemetry-GAHHQTOS.js} +4 -4
  227. package/dist/cli-bundle/chunks/{test-QNDXZQCW.js → test-ACD52Z3S.js} +15 -14
  228. package/dist/cli-bundle/chunks/{test-HU2BS7EY.js → test-PWDIZ255.js} +15 -14
  229. package/dist/cli-bundle/chunks/{test-all-XLPI4USF.js → test-all-L2MDDUCA.js} +17 -16
  230. package/dist/cli-bundle/chunks/{test-all-XLPI4USF.js.map → test-all-L2MDDUCA.js.map} +1 -1
  231. package/dist/cli-bundle/chunks/{test-all-PZTBLLQ6.js → test-all-RBZ6DLU2.js} +15 -14
  232. package/dist/cli-bundle/chunks/{test-all-PZTBLLQ6.js.map → test-all-RBZ6DLU2.js.map} +1 -1
  233. package/dist/cli-bundle/chunks/{test-runs-LANLLPVO.js → test-runs-PLRAZEFW.js} +4 -4
  234. package/dist/cli-bundle/chunks/{test-runs-CA6K32RD.js → test-runs-UXIXPDKU.js} +4 -4
  235. package/dist/cli-bundle/chunks/update-AMRSOIWP.js +24 -0
  236. package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js → update-KFX2SIAC.js} +15 -15
  237. package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js → update-many-RNSBX2TA.js} +23 -23
  238. package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js → update-many-Z5GJS5LC.js} +23 -23
  239. package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js → upgrade-BRL6KCOJ.js} +13 -12
  240. package/dist/cli-bundle/chunks/{upgrade-77FRUAXN.js.map → upgrade-BRL6KCOJ.js.map} +1 -1
  241. package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js → upgrade-HAK6JG2O.js} +11 -10
  242. package/dist/cli-bundle/chunks/{upgrade-ICXY244R.js.map → upgrade-HAK6JG2O.js.map} +1 -1
  243. package/dist/cli-bundle/chunks/{validate-2G566PKQ.js → validate-MTUVL5VC.js} +20 -19
  244. package/dist/cli-bundle/chunks/{validate-2G566PKQ.js.map → validate-MTUVL5VC.js.map} +1 -1
  245. package/dist/cli-bundle/chunks/{validate-BDPVXHHH.js → validate-X5W76YJL.js} +22 -21
  246. package/dist/cli-bundle/chunks/{validate-BDPVXHHH.js.map → validate-X5W76YJL.js.map} +1 -1
  247. package/dist/cli-bundle/main.js +55 -702
  248. package/dist/cli-bundle/main.js.map +4 -4
  249. package/dist/core/extensions/activation-summary-markdown.js +23 -12
  250. package/dist/core/extensions/activation-summary-markdown.js.map +1 -1
  251. package/dist/core/extensions/extension-policy.d.ts +18 -3
  252. package/dist/core/extensions/extension-policy.js +116 -106
  253. package/dist/core/extensions/extension-policy.js.map +1 -1
  254. package/dist/core/extensions/loader.js +310 -232
  255. package/dist/core/extensions/loader.js.map +1 -1
  256. package/dist/core/item/item-format.js +523 -410
  257. package/dist/core/item/item-format.js.map +1 -1
  258. package/dist/mcp/server.js +387 -367
  259. package/dist/mcp/server.js.map +1 -1
  260. package/dist/sdk/cli-contracts/flag-contracts.js +111 -180
  261. package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
  262. package/dist/sdk/cli-contracts/tool-schema.js +76 -45
  263. package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
  264. package/dist/sdk/compose.d.ts +4 -1
  265. package/dist/sdk/compose.js +181 -115
  266. package/dist/sdk/compose.js.map +1 -1
  267. package/docs/RELEASING.md +2 -3
  268. package/package.json +1 -1
  269. package/dist/cli-bundle/chunks/activity-EJBMXUBH.js +0 -16
  270. package/dist/cli-bundle/chunks/chunk-5IRVSKPS.js.map +0 -1
  271. package/dist/cli-bundle/chunks/chunk-5T6WPLRO.js.map +0 -7
  272. package/dist/cli-bundle/chunks/chunk-6T5ZIWBS.js.map +0 -7
  273. package/dist/cli-bundle/chunks/chunk-6YRAMXRS.js.map +0 -1
  274. package/dist/cli-bundle/chunks/chunk-7WDETKGP.js.map +0 -7
  275. package/dist/cli-bundle/chunks/chunk-A3UNLXNJ.js.map +0 -7
  276. package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js +0 -115
  277. package/dist/cli-bundle/chunks/chunk-C2KCIZKZ.js.map +0 -1
  278. package/dist/cli-bundle/chunks/chunk-CY5IJMUM.js.map +0 -1
  279. package/dist/cli-bundle/chunks/chunk-DJDXAU74.js.map +0 -7
  280. package/dist/cli-bundle/chunks/chunk-DORJSBGJ.js.map +0 -7
  281. package/dist/cli-bundle/chunks/chunk-DU66JUGT.js.map +0 -7
  282. package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js +0 -118
  283. package/dist/cli-bundle/chunks/chunk-F6VH3LFC.js.map +0 -7
  284. package/dist/cli-bundle/chunks/chunk-HIBK6H4S.js.map +0 -1
  285. package/dist/cli-bundle/chunks/chunk-ISEKN64V.js +0 -35
  286. package/dist/cli-bundle/chunks/chunk-ISEKN64V.js.map +0 -7
  287. package/dist/cli-bundle/chunks/chunk-IZQOJR2B.js.map +0 -7
  288. package/dist/cli-bundle/chunks/chunk-JZG5ADVE.js.map +0 -1
  289. package/dist/cli-bundle/chunks/chunk-K46GQ265.js.map +0 -1
  290. package/dist/cli-bundle/chunks/chunk-NIBP3I7A.js.map +0 -1
  291. package/dist/cli-bundle/chunks/chunk-RM6MHL6A.js.map +0 -7
  292. package/dist/cli-bundle/chunks/chunk-SNUK7H5J.js.map +0 -7
  293. package/dist/cli-bundle/chunks/chunk-T7ZMQI4J.js.map +0 -1
  294. package/dist/cli-bundle/chunks/chunk-UB3V5WUI.js.map +0 -1
  295. package/dist/cli-bundle/chunks/chunk-V3KLX7U7.js.map +0 -1
  296. package/dist/cli-bundle/chunks/chunk-VD3LKZFX.js.map +0 -1
  297. package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js +0 -32
  298. package/dist/cli-bundle/chunks/chunk-W2VMLL5S.js.map +0 -1
  299. package/dist/cli-bundle/chunks/chunk-ZFIEEDTJ.js.map +0 -7
  300. package/dist/cli-bundle/chunks/close-37KEHLYM.js +0 -14
  301. package/dist/cli-bundle/chunks/create-DFMNBKBS.js +0 -28
  302. package/dist/cli-bundle/chunks/history-5XUSLAJA.js +0 -18
  303. package/dist/cli-bundle/chunks/history-redact-BVHWDXPR.js +0 -19
  304. package/dist/cli-bundle/chunks/init-TRYJELH4.js +0 -21
  305. package/dist/cli-bundle/chunks/restore-IRAKSWIW.js +0 -17
  306. package/dist/cli-bundle/chunks/update-UXDLTEOZ.js +0 -24
  307. /package/dist/cli-bundle/chunks/{activity-EJBMXUBH.js.map → activity-AW6XVFH6.js.map} +0 -0
  308. /package/dist/cli-bundle/chunks/{activity-MVSEND6D.js.map → activity-DBLQVIP6.js.map} +0 -0
  309. /package/dist/cli-bundle/chunks/{aggregate-MOC4TR2G.js.map → aggregate-JTEF4BP7.js.map} +0 -0
  310. /package/dist/cli-bundle/chunks/{aggregate-XJHLZQ5X.js.map → aggregate-SDF7DUOD.js.map} +0 -0
  311. /package/dist/cli-bundle/chunks/{append-LEDBAM3K.js.map → append-LOVPGVPT.js.map} +0 -0
  312. /package/dist/cli-bundle/chunks/{append-KDHT4GHI.js.map → append-QCFJSDFL.js.map} +0 -0
  313. /package/dist/cli-bundle/chunks/{chunk-FBZ5XAAF.js.map → chunk-22WKIL3H.js.map} +0 -0
  314. /package/dist/cli-bundle/chunks/{chunk-EVWYAG46.js.map → chunk-2466X6E4.js.map} +0 -0
  315. /package/dist/cli-bundle/chunks/{chunk-3JWQCLR5.js.map → chunk-27BXPBAY.js.map} +0 -0
  316. /package/dist/cli-bundle/chunks/{chunk-WTRUDJ3R.js.map → chunk-2D4HATP2.js.map} +0 -0
  317. /package/dist/cli-bundle/chunks/{chunk-LBH7UYKY.js.map → chunk-3K2M5OYU.js.map} +0 -0
  318. /package/dist/cli-bundle/chunks/{chunk-KTMMTOIP.js.map → chunk-3S2KT7NG.js.map} +0 -0
  319. /package/dist/cli-bundle/chunks/{chunk-FDEVKXC4.js.map → chunk-3VGN2UWE.js.map} +0 -0
  320. /package/dist/cli-bundle/chunks/{chunk-KYDYQMNW.js.map → chunk-4DSGXSBL.js.map} +0 -0
  321. /package/dist/cli-bundle/chunks/{chunk-7L6TXOOC.js.map → chunk-4DUVCVLZ.js.map} +0 -0
  322. /package/dist/cli-bundle/chunks/{chunk-ZIE6WXJ2.js.map → chunk-5CGRF3L5.js.map} +0 -0
  323. /package/dist/cli-bundle/chunks/{chunk-IBU2LLWM.js.map → chunk-64HNBBFQ.js.map} +0 -0
  324. /package/dist/cli-bundle/chunks/{chunk-WFJZDUM7.js.map → chunk-A7FPBAQS.js.map} +0 -0
  325. /package/dist/cli-bundle/chunks/{chunk-74PUWBGN.js.map → chunk-AVEE5EHK.js.map} +0 -0
  326. /package/dist/cli-bundle/chunks/{chunk-KRASIL6M.js.map → chunk-AXIDKKAT.js.map} +0 -0
  327. /package/dist/cli-bundle/chunks/{chunk-CHRNYKNI.js.map → chunk-BDTISOSD.js.map} +0 -0
  328. /package/dist/cli-bundle/chunks/{chunk-RPRW26NG.js.map → chunk-CF7RL6FR.js.map} +0 -0
  329. /package/dist/cli-bundle/chunks/{chunk-BN3CWK6G.js.map → chunk-DDPTYJIM.js.map} +0 -0
  330. /package/dist/cli-bundle/chunks/{chunk-4YIMPANT.js.map → chunk-EJUDVUYZ.js.map} +0 -0
  331. /package/dist/cli-bundle/chunks/{chunk-73PTKMAE.js.map → chunk-EVMTBV6V.js.map} +0 -0
  332. /package/dist/cli-bundle/chunks/{chunk-E2Q2ULMR.js.map → chunk-G7I7DEZA.js.map} +0 -0
  333. /package/dist/cli-bundle/chunks/{chunk-IDYCAK35.js.map → chunk-GJ326ZKX.js.map} +0 -0
  334. /package/dist/cli-bundle/chunks/{chunk-JJ4SG243.js.map → chunk-HPPFYYOV.js.map} +0 -0
  335. /package/dist/cli-bundle/chunks/{chunk-JIP67N2K.js.map → chunk-HYTGA6GI.js.map} +0 -0
  336. /package/dist/cli-bundle/chunks/{chunk-7RIJGN4R.js.map → chunk-HZZEHPRG.js.map} +0 -0
  337. /package/dist/cli-bundle/chunks/{chunk-4TXTVZL3.js.map → chunk-IJYK2T43.js.map} +0 -0
  338. /package/dist/cli-bundle/chunks/{chunk-GF7EAR22.js.map → chunk-IPYBJWTE.js.map} +0 -0
  339. /package/dist/cli-bundle/chunks/{chunk-AWN4PPH5.js.map → chunk-IZBR4NRW.js.map} +0 -0
  340. /package/dist/cli-bundle/chunks/{chunk-IF4ERU6A.js.map → chunk-JLM7BHI7.js.map} +0 -0
  341. /package/dist/cli-bundle/chunks/{chunk-HUYYMTGW.js.map → chunk-JPECA746.js.map} +0 -0
  342. /package/dist/cli-bundle/chunks/{chunk-KGQ3W65B.js.map → chunk-JSU5P7VS.js.map} +0 -0
  343. /package/dist/cli-bundle/chunks/{chunk-Z5BM2FKQ.js.map → chunk-KNPEF7QG.js.map} +0 -0
  344. /package/dist/cli-bundle/chunks/{chunk-DLDCPF5X.js.map → chunk-L5OEFZQG.js.map} +0 -0
  345. /package/dist/cli-bundle/chunks/{chunk-DRPF274X.js.map → chunk-LB6TP6MC.js.map} +0 -0
  346. /package/dist/cli-bundle/chunks/{chunk-YEDFE4DC.js.map → chunk-MAUKX7JC.js.map} +0 -0
  347. /package/dist/cli-bundle/chunks/{chunk-OB3RJV5F.js.map → chunk-N74UMG5H.js.map} +0 -0
  348. /package/dist/cli-bundle/chunks/{chunk-ZEATCVAC.js.map → chunk-NFDPYAIP.js.map} +0 -0
  349. /package/dist/cli-bundle/chunks/{chunk-OUQ5JEFM.js.map → chunk-NKZAN7BD.js.map} +0 -0
  350. /package/dist/cli-bundle/chunks/{chunk-5ABGFWR4.js.map → chunk-NOLPZMSV.js.map} +0 -0
  351. /package/dist/cli-bundle/chunks/{chunk-QE5UFCCO.js.map → chunk-NWMZWYYB.js.map} +0 -0
  352. /package/dist/cli-bundle/chunks/{chunk-VMY7MZEM.js.map → chunk-OGXLACHC.js.map} +0 -0
  353. /package/dist/cli-bundle/chunks/{chunk-IHXXUIXS.js.map → chunk-OTUHB4HS.js.map} +0 -0
  354. /package/dist/cli-bundle/chunks/{chunk-UFKNF23C.js.map → chunk-RGEMWD6Q.js.map} +0 -0
  355. /package/dist/cli-bundle/chunks/{chunk-Z55WX4IQ.js.map → chunk-RLDHZHQS.js.map} +0 -0
  356. /package/dist/cli-bundle/chunks/{chunk-NO6Y6FB2.js.map → chunk-RMMQ74TG.js.map} +0 -0
  357. /package/dist/cli-bundle/chunks/{chunk-SJZTPVFT.js.map → chunk-SLMUGTK3.js.map} +0 -0
  358. /package/dist/cli-bundle/chunks/{chunk-BOWQWXLI.js.map → chunk-TP5Q5ZD3.js.map} +0 -0
  359. /package/dist/cli-bundle/chunks/{chunk-D5LYZVGB.js.map → chunk-UYUYDGIB.js.map} +0 -0
  360. /package/dist/cli-bundle/chunks/{chunk-JVQ7UOYC.js.map → chunk-UZIWVBE6.js.map} +0 -0
  361. /package/dist/cli-bundle/chunks/{chunk-JTRKME24.js.map → chunk-V3NOKJF2.js.map} +0 -0
  362. /package/dist/cli-bundle/chunks/{chunk-F7G53BOA.js.map → chunk-VICZWYGZ.js.map} +0 -0
  363. /package/dist/cli-bundle/chunks/{chunk-TQ6E76BE.js.map → chunk-W4ULYO7Z.js.map} +0 -0
  364. /package/dist/cli-bundle/chunks/{chunk-MLHX6DN5.js.map → chunk-WYDHYJPO.js.map} +0 -0
  365. /package/dist/cli-bundle/chunks/{chunk-53ARXF2O.js.map → chunk-YITK2PJ6.js.map} +0 -0
  366. /package/dist/cli-bundle/chunks/{chunk-D6USKAMA.js.map → chunk-ZRP4VG5U.js.map} +0 -0
  367. /package/dist/cli-bundle/chunks/{claim-6NINZYB3.js.map → claim-EMQLYPRW.js.map} +0 -0
  368. /package/dist/cli-bundle/chunks/{claim-HMCLSLUE.js.map → claim-T3GCKV7C.js.map} +0 -0
  369. /package/dist/cli-bundle/chunks/{close-37KEHLYM.js.map → close-E6ZZGCJY.js.map} +0 -0
  370. /package/dist/cli-bundle/chunks/{close-OP3LK7Z2.js.map → close-TQYAAFJP.js.map} +0 -0
  371. /package/dist/cli-bundle/chunks/{close-many-BFMP6HHK.js.map → close-many-BG5QQIDQ.js.map} +0 -0
  372. /package/dist/cli-bundle/chunks/{close-many-CXJBOWWY.js.map → close-many-LDRVEQY2.js.map} +0 -0
  373. /package/dist/cli-bundle/chunks/{comments-MU2WMBUY.js.map → comments-QCKR2YY2.js.map} +0 -0
  374. /package/dist/cli-bundle/chunks/{comments-ETHABIY6.js.map → comments-YUXJRZPQ.js.map} +0 -0
  375. /package/dist/cli-bundle/chunks/{config-FIXJZEQK.js.map → config-DMSU64QO.js.map} +0 -0
  376. /package/dist/cli-bundle/chunks/{config-X3ZVCUUG.js.map → config-QH2DICD6.js.map} +0 -0
  377. /package/dist/cli-bundle/chunks/{context-XDI4DKKT.js.map → context-B6275WPX.js.map} +0 -0
  378. /package/dist/cli-bundle/chunks/{context-7ZEZV3BV.js.map → context-OCZ3FJ4Z.js.map} +0 -0
  379. /package/dist/cli-bundle/chunks/{contracts-SMOAN5NF.js.map → contracts-HN7ABKLP.js.map} +0 -0
  380. /package/dist/cli-bundle/chunks/{contracts-KP4QAGVW.js.map → contracts-W4FZVVD6.js.map} +0 -0
  381. /package/dist/cli-bundle/chunks/{copy-CWM6SBY6.js.map → copy-BTJOSKKT.js.map} +0 -0
  382. /package/dist/cli-bundle/chunks/{copy-JJ3KOQW2.js.map → copy-DEM4DATS.js.map} +0 -0
  383. /package/dist/cli-bundle/chunks/{create-DFMNBKBS.js.map → create-OH3BDGBB.js.map} +0 -0
  384. /package/dist/cli-bundle/chunks/{create-J5Q2ELZT.js.map → create-RLRJMRTM.js.map} +0 -0
  385. /package/dist/cli-bundle/chunks/{delete-OOQS4KVD.js.map → delete-BHK7VB2Z.js.map} +0 -0
  386. /package/dist/cli-bundle/chunks/{delete-2GZLQEUQ.js.map → delete-LSVHAB4Y.js.map} +0 -0
  387. /package/dist/cli-bundle/chunks/{deps-ZVGGCRR6.js.map → deps-4UDFJRUA.js.map} +0 -0
  388. /package/dist/cli-bundle/chunks/{deps-IF4IGL4R.js.map → deps-XHYXWEPT.js.map} +0 -0
  389. /package/dist/cli-bundle/chunks/{docs-2TIFR62T.js.map → docs-26S44RXU.js.map} +0 -0
  390. /package/dist/cli-bundle/chunks/{docs-NFTBCQQC.js.map → docs-GYZNVS26.js.map} +0 -0
  391. /package/dist/cli-bundle/chunks/{eval-2F6EH4XN.js.map → eval-PGRVIJQU.js.map} +0 -0
  392. /package/dist/cli-bundle/chunks/{eval-PFKXQR3B.js.map → eval-UYF3ZPVO.js.map} +0 -0
  393. /package/dist/cli-bundle/chunks/{extension-GMVOIP4O.js.map → extension-CPSLJQVE.js.map} +0 -0
  394. /package/dist/cli-bundle/chunks/{extension-3LRYX7SW.js.map → extension-CXJ6RELI.js.map} +0 -0
  395. /package/dist/cli-bundle/chunks/{files-T5ODMETM.js.map → files-MBNICQFM.js.map} +0 -0
  396. /package/dist/cli-bundle/chunks/{files-DF3HO6XK.js.map → files-NQHEXUZD.js.map} +0 -0
  397. /package/dist/cli-bundle/chunks/{focus-DLXKK4AH.js.map → focus-DWYIG7GU.js.map} +0 -0
  398. /package/dist/cli-bundle/chunks/{focus-MY5ARIEK.js.map → focus-XZW5423D.js.map} +0 -0
  399. /package/dist/cli-bundle/chunks/{gc-FULIVYR4.js.map → gc-7GQYOS2G.js.map} +0 -0
  400. /package/dist/cli-bundle/chunks/{gc-MDGRR2SU.js.map → gc-LPVMKJQJ.js.map} +0 -0
  401. /package/dist/cli-bundle/chunks/{get-AWK324RS.js.map → get-A7MAOHCU.js.map} +0 -0
  402. /package/dist/cli-bundle/chunks/{get-VYPIICPC.js.map → get-DSDEKJ3L.js.map} +0 -0
  403. /package/dist/cli-bundle/chunks/{history-X4OSES6K.js.map → history-NERDJNUB.js.map} +0 -0
  404. /package/dist/cli-bundle/chunks/{history-5XUSLAJA.js.map → history-WSZHY3PN.js.map} +0 -0
  405. /package/dist/cli-bundle/chunks/{history-compact-WLCQEKXS.js.map → history-compact-2WRZ2WK4.js.map} +0 -0
  406. /package/dist/cli-bundle/chunks/{history-compact-2GHT32UX.js.map → history-compact-HR7BB4LR.js.map} +0 -0
  407. /package/dist/cli-bundle/chunks/{history-redact-BVHWDXPR.js.map → history-redact-MP6CH7U5.js.map} +0 -0
  408. /package/dist/cli-bundle/chunks/{history-redact-45YW65BK.js.map → history-redact-O3NBCNWC.js.map} +0 -0
  409. /package/dist/cli-bundle/chunks/{history-repair-GABSDSVD.js.map → history-repair-LCMOS45X.js.map} +0 -0
  410. /package/dist/cli-bundle/chunks/{history-repair-FY75IC26.js.map → history-repair-XA3LC4GA.js.map} +0 -0
  411. /package/dist/cli-bundle/chunks/{init-KO7CGIRQ.js.map → init-64XDLQJB.js.map} +0 -0
  412. /package/dist/cli-bundle/chunks/{init-TRYJELH4.js.map → init-PAX32BJA.js.map} +0 -0
  413. /package/dist/cli-bundle/chunks/{learnings-3F7YLI45.js.map → learnings-JR6MA5TI.js.map} +0 -0
  414. /package/dist/cli-bundle/chunks/{learnings-LHZT5BHW.js.map → learnings-LPKCSJX7.js.map} +0 -0
  415. /package/dist/cli-bundle/chunks/{list-ROT7JF62.js.map → list-DNBJVO3E.js.map} +0 -0
  416. /package/dist/cli-bundle/chunks/{list-Y6AU5BJS.js.map → list-G5Y65VF6.js.map} +0 -0
  417. /package/dist/cli-bundle/chunks/{next-66BJB4N2.js.map → next-BCERKDUR.js.map} +0 -0
  418. /package/dist/cli-bundle/chunks/{next-N5MWJTBY.js.map → next-FYTQF6HG.js.map} +0 -0
  419. /package/dist/cli-bundle/chunks/{notes-FW6YFLND.js.map → notes-2BMU3VVQ.js.map} +0 -0
  420. /package/dist/cli-bundle/chunks/{notes-EVJZ3VAB.js.map → notes-6KTGO2OJ.js.map} +0 -0
  421. /package/dist/cli-bundle/chunks/{plan-DQ7G4EDC.js.map → plan-4WXEQCTN.js.map} +0 -0
  422. /package/dist/cli-bundle/chunks/{plan-ZHKZ7JVF.js.map → plan-RKZHQVXR.js.map} +0 -0
  423. /package/dist/cli-bundle/chunks/{profile-UPZGCDOG.js.map → profile-4OMM32CD.js.map} +0 -0
  424. /package/dist/cli-bundle/chunks/{profile-CHAW6SEA.js.map → profile-QLER5ENE.js.map} +0 -0
  425. /package/dist/cli-bundle/chunks/{register-list-query-Y2VRHPCL.js.map → register-list-query-7LV46VAU.js.map} +0 -0
  426. /package/dist/cli-bundle/chunks/{register-list-query-KY6Z6WV7.js.map → register-list-query-SNG5PGA4.js.map} +0 -0
  427. /package/dist/cli-bundle/chunks/{register-mutation-PCARIGZS.js.map → register-mutation-ENNDUAZG.js.map} +0 -0
  428. /package/dist/cli-bundle/chunks/{register-mutation-N6AYSKPM.js.map → register-mutation-KK7PHYYU.js.map} +0 -0
  429. /package/dist/cli-bundle/chunks/{register-operations-YAT6FUUB.js.map → register-operations-C6OWLDSH.js.map} +0 -0
  430. /package/dist/cli-bundle/chunks/{register-operations-L6CYTOIH.js.map → register-operations-HZ6XERQG.js.map} +0 -0
  431. /package/dist/cli-bundle/chunks/{register-setup-N7UGXYJC.js.map → register-setup-P67EMBDJ.js.map} +0 -0
  432. /package/dist/cli-bundle/chunks/{register-setup-MPANILQF.js.map → register-setup-ZKJ53RS7.js.map} +0 -0
  433. /package/dist/cli-bundle/chunks/{restore-DKMCLPI5.js.map → restore-4MHZFJ2E.js.map} +0 -0
  434. /package/dist/cli-bundle/chunks/{restore-IRAKSWIW.js.map → restore-YALDGTQR.js.map} +0 -0
  435. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-3F4QUEDH.js.map → scheduling-shortcuts-LB6DOLRL.js.map} +0 -0
  436. /package/dist/cli-bundle/chunks/{scheduling-shortcuts-BNZLQK36.js.map → scheduling-shortcuts-UTOYKLXQ.js.map} +0 -0
  437. /package/dist/cli-bundle/chunks/{schema-OLT6LVKH.js.map → schema-73HR2OJW.js.map} +0 -0
  438. /package/dist/cli-bundle/chunks/{schema-XJXKJQF5.js.map → schema-U6LJKSIR.js.map} +0 -0
  439. /package/dist/cli-bundle/chunks/{search-CX5UMV4H.js.map → search-AXPXKZER.js.map} +0 -0
  440. /package/dist/cli-bundle/chunks/{search-KP6H7COV.js.map → search-KILGT37L.js.map} +0 -0
  441. /package/dist/cli-bundle/chunks/{stats-QZUG6MX5.js.map → stats-PSYVVTNZ.js.map} +0 -0
  442. /package/dist/cli-bundle/chunks/{stats-7XW4OEMK.js.map → stats-W5KNVJWQ.js.map} +0 -0
  443. /package/dist/cli-bundle/chunks/{telemetry-WTYFUPRL.js.map → telemetry-BZUF6H7G.js.map} +0 -0
  444. /package/dist/cli-bundle/chunks/{telemetry-DIFPXCAT.js.map → telemetry-GAHHQTOS.js.map} +0 -0
  445. /package/dist/cli-bundle/chunks/{test-QNDXZQCW.js.map → test-ACD52Z3S.js.map} +0 -0
  446. /package/dist/cli-bundle/chunks/{test-HU2BS7EY.js.map → test-PWDIZ255.js.map} +0 -0
  447. /package/dist/cli-bundle/chunks/{test-runs-LANLLPVO.js.map → test-runs-PLRAZEFW.js.map} +0 -0
  448. /package/dist/cli-bundle/chunks/{test-runs-CA6K32RD.js.map → test-runs-UXIXPDKU.js.map} +0 -0
  449. /package/dist/cli-bundle/chunks/{update-UXDLTEOZ.js.map → update-AMRSOIWP.js.map} +0 -0
  450. /package/dist/cli-bundle/chunks/{update-DJKWLBWJ.js.map → update-KFX2SIAC.js.map} +0 -0
  451. /package/dist/cli-bundle/chunks/{update-many-VW5DGF3S.js.map → update-many-RNSBX2TA.js.map} +0 -0
  452. /package/dist/cli-bundle/chunks/{update-many-LU3SCNK5.js.map → update-many-Z5GJS5LC.js.map} +0 -0
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  compareTimestampStrings,
3
3
  isTimestampLiteral
4
- } from "./chunk-MLHX6DN5.js";
4
+ } from "./chunk-WYDHYJPO.js";
5
5
  import {
6
6
  CONFIDENCE_TEXT_VALUES,
7
7
  EXIT_CODE,
8
8
  FRONT_MATTER_KEY_ORDER,
9
9
  ISSUE_SEVERITY_VALUES,
10
+ PLAN_STEP_STATUS_VALUES,
10
11
  PmCliError,
11
12
  RECURRENCE_FREQUENCY_VALUES,
12
13
  RECURRENCE_WEEKDAY_VALUES,
@@ -17,7 +18,7 @@ import {
17
18
  resolveRuntimeStatusRegistry,
18
19
  runtimeFieldOptionTarget,
19
20
  weekdayOrderIndex
20
- } from "./chunk-SNUK7H5J.js";
21
+ } from "./chunk-RVUALSJF.js";
21
22
 
22
23
  // dist/core/schema/runtime-field-values.js
23
24
  !(function() {
@@ -339,11 +340,13 @@ function decodeToonItemContent(content) {
339
340
  !(function() {
340
341
  try {
341
342
  var e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : {}, n = new e.Error().stack;
342
- n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "777ea2a9-5aa6-5a90-abb5-a0b6052645f2");
343
+ n && (e._sentryDebugIds = e._sentryDebugIds || {}, e._sentryDebugIds[n] = "84d024fa-403c-5a85-8c12-4e823afa4fc9");
343
344
  } catch (e2) {
344
345
  }
345
346
  })();
346
347
  var LINKED_TEST_PM_CONTEXT_MODE_VALUES = /* @__PURE__ */ new Set(["schema", "tracker", "auto"]);
348
+ var ITEM_TEST_RUN_STATUS_VALUES = /* @__PURE__ */ new Set(["passed", "failed", "stopped", "canceled"]);
349
+ var PLAN_STEP_STATUS_SET = new Set(PLAN_STEP_STATUS_VALUES);
347
350
  function normalizePathValue(value) {
348
351
  return value.replaceAll("\\", "/");
349
352
  }
@@ -355,6 +358,13 @@ function firstNonZeroComparison(comparisons) {
355
358
  }
356
359
  return 0;
357
360
  }
361
+ function deleteUndefinedFields(record) {
362
+ for (const [key, value] of Object.entries(record)) {
363
+ if (value === void 0) {
364
+ delete record[key];
365
+ }
366
+ }
367
+ }
358
368
  var REQUIRED_STRING_FIELDS = [
359
369
  "id",
360
370
  "title",
@@ -408,47 +418,65 @@ function assertTimestampField(record, fieldName) {
408
418
  const timestamp = rawValue;
409
419
  assertFrontMatterCondition(isTimestampLiteral(timestamp), `${fieldName} must be a valid ISO timestamp`);
410
420
  }
421
+ function assertPositiveIntegerField(record, fieldName, messagePrefix) {
422
+ const value = record[fieldName];
423
+ if (value === void 0) {
424
+ return;
425
+ }
426
+ assertFrontMatterCondition(typeof value === "number" && Number.isInteger(value) && value >= 1, `${messagePrefix} must be an integer >= 1`);
427
+ }
428
+ function assertOptionalTimestampString(record, fieldName, messagePrefix) {
429
+ const value = record[fieldName];
430
+ if (value === void 0) {
431
+ return;
432
+ }
433
+ assertFrontMatterCondition(typeof value === "string", `${messagePrefix} must be a string`);
434
+ assertFrontMatterCondition(isTimestampLiteral(value), `${messagePrefix} must be a valid ISO timestamp`);
435
+ }
436
+ function assertRecurrenceWeekdays(value) {
437
+ if (value === void 0) {
438
+ return;
439
+ }
440
+ assertFrontMatterCondition(Array.isArray(value), "event.recurrence.by_weekday must be an array");
441
+ for (const weekday of value) {
442
+ assertFrontMatterCondition(typeof weekday === "string", "event.recurrence.by_weekday entries must be strings");
443
+ const normalizedWeekday = weekday.trim().toLowerCase();
444
+ assertFrontMatterCondition(RECURRENCE_WEEKDAY_VALUES.includes(normalizedWeekday), `event.recurrence.by_weekday entries must be one of: ${RECURRENCE_WEEKDAY_VALUES.join(", ")}`);
445
+ }
446
+ }
447
+ function assertRecurrenceMonthDays(value) {
448
+ if (value === void 0) {
449
+ return;
450
+ }
451
+ assertFrontMatterCondition(Array.isArray(value), "event.recurrence.by_month_day must be an array");
452
+ for (const day of value) {
453
+ assertFrontMatterCondition(typeof day === "number" && Number.isInteger(day) && day >= 1 && day <= 31, "event.recurrence.by_month_day entries must be integers 1..31");
454
+ }
455
+ }
456
+ function assertRecurrenceExdates(value) {
457
+ if (value === void 0) {
458
+ return;
459
+ }
460
+ assertFrontMatterCondition(Array.isArray(value), "event.recurrence.exdates must be an array");
461
+ for (const exdate of value) {
462
+ assertFrontMatterCondition(typeof exdate === "string", "event.recurrence.exdates entries must be strings");
463
+ assertFrontMatterCondition(isTimestampLiteral(exdate), "event.recurrence.exdates entries must be valid ISO timestamps");
464
+ }
465
+ }
411
466
  function assertValidRecurrenceRule(recurrence) {
412
467
  assertFrontMatterCondition(typeof recurrence === "object" && recurrence !== null && !Array.isArray(recurrence), "event.recurrence must be an object");
413
468
  const recurrenceRecord = recurrence;
414
469
  assertFrontMatterCondition(typeof recurrenceRecord.freq === "string", "event.recurrence.freq must be a string");
415
470
  const frequency = recurrenceRecord.freq.trim().toLowerCase();
416
471
  assertFrontMatterCondition(RECURRENCE_FREQUENCY_VALUES.includes(frequency), `event.recurrence.freq must be one of: ${RECURRENCE_FREQUENCY_VALUES.join(", ")}`);
417
- if (recurrenceRecord.interval !== void 0) {
418
- assertFrontMatterCondition(typeof recurrenceRecord.interval === "number" && Number.isInteger(recurrenceRecord.interval) && recurrenceRecord.interval >= 1, "event.recurrence.interval must be an integer >= 1");
419
- }
420
- if (recurrenceRecord.count !== void 0) {
421
- assertFrontMatterCondition(typeof recurrenceRecord.count === "number" && Number.isInteger(recurrenceRecord.count) && recurrenceRecord.count >= 1, "event.recurrence.count must be an integer >= 1");
422
- }
423
- if (recurrenceRecord.until !== void 0) {
424
- assertFrontMatterCondition(typeof recurrenceRecord.until === "string", "event.recurrence.until must be a string");
425
- assertFrontMatterCondition(isTimestampLiteral(recurrenceRecord.until), "event.recurrence.until must be a valid ISO timestamp");
426
- }
427
- if (recurrenceRecord.by_weekday !== void 0) {
428
- assertFrontMatterCondition(Array.isArray(recurrenceRecord.by_weekday), "event.recurrence.by_weekday must be an array");
429
- for (const weekday of recurrenceRecord.by_weekday) {
430
- assertFrontMatterCondition(typeof weekday === "string", "event.recurrence.by_weekday entries must be strings");
431
- const normalizedWeekday = weekday.trim().toLowerCase();
432
- assertFrontMatterCondition(RECURRENCE_WEEKDAY_VALUES.includes(normalizedWeekday), `event.recurrence.by_weekday entries must be one of: ${RECURRENCE_WEEKDAY_VALUES.join(", ")}`);
433
- }
434
- }
435
- if (recurrenceRecord.by_month_day !== void 0) {
436
- assertFrontMatterCondition(Array.isArray(recurrenceRecord.by_month_day), "event.recurrence.by_month_day must be an array");
437
- for (const day of recurrenceRecord.by_month_day) {
438
- assertFrontMatterCondition(typeof day === "number" && Number.isInteger(day) && day >= 1 && day <= 31, "event.recurrence.by_month_day entries must be integers 1..31");
439
- }
440
- }
441
- if (recurrenceRecord.exdates !== void 0) {
442
- assertFrontMatterCondition(Array.isArray(recurrenceRecord.exdates), "event.recurrence.exdates must be an array");
443
- for (const exdate of recurrenceRecord.exdates) {
444
- assertFrontMatterCondition(typeof exdate === "string", "event.recurrence.exdates entries must be strings");
445
- assertFrontMatterCondition(isTimestampLiteral(exdate), "event.recurrence.exdates entries must be valid ISO timestamps");
446
- }
447
- }
448
- }
449
- function assertValidFrontMatter(frontMatter, runtimeContext) {
450
- assertFrontMatterCondition(typeof frontMatter === "object" && frontMatter !== null && !Array.isArray(frontMatter), "front matter must be an object");
451
- const record = frontMatter;
472
+ assertPositiveIntegerField(recurrenceRecord, "interval", "event.recurrence.interval");
473
+ assertPositiveIntegerField(recurrenceRecord, "count", "event.recurrence.count");
474
+ assertOptionalTimestampString(recurrenceRecord, "until", "event.recurrence.until");
475
+ assertRecurrenceWeekdays(recurrenceRecord.by_weekday);
476
+ assertRecurrenceMonthDays(recurrenceRecord.by_month_day);
477
+ assertRecurrenceExdates(recurrenceRecord.exdates);
478
+ }
479
+ function assertRequiredFrontMatterFields(record) {
452
480
  for (const fieldName of REQUIRED_STRING_FIELDS) {
453
481
  assertFrontMatterCondition(typeof record[fieldName] === "string", `${fieldName} is required and must be a string`);
454
482
  }
@@ -458,12 +486,17 @@ function assertValidFrontMatter(frontMatter, runtimeContext) {
458
486
  if (formatVersion !== void 0) {
459
487
  assertFrontMatterCondition(typeof formatVersion === "number" && Number.isInteger(formatVersion) && formatVersion >= BASELINE_ITEM_FORMAT_VERSION, `pm_format_version must be an integer >= ${BASELINE_ITEM_FORMAT_VERSION}`);
460
488
  }
489
+ return itemType;
490
+ }
491
+ function assertStatusFrontMatterField(record, runtimeContext) {
461
492
  const status = record.status;
462
493
  assertFrontMatterCondition(typeof status === "string" && status.trim().length > 0, "status must be a non-empty string");
463
494
  const statusRegistry = runtimeContext?.statusRegistry;
464
495
  const normalizedStatus = normalizeStatusInput(status, statusRegistry);
465
496
  const statusDomain = statusRegistry ? statusRegistry.definitions.map((definition) => definition.id) : [...STATUS_VALUES];
466
497
  assertFrontMatterCondition(normalizedStatus !== void 0, `status must be one of: ${statusDomain.join(", ")}`);
498
+ }
499
+ function assertPriorityAndTags(record) {
467
500
  const priority = record.priority;
468
501
  assertFrontMatterCondition(typeof priority === "number" && Number.isInteger(priority) && [0, 1, 2, 3, 4].includes(priority), "priority must be an integer 0..4");
469
502
  const tags = record.tags;
@@ -471,129 +504,176 @@ function assertValidFrontMatter(frontMatter, runtimeContext) {
471
504
  for (const tag of tags) {
472
505
  assertFrontMatterCondition(typeof tag === "string", "tags entries must be strings");
473
506
  }
507
+ }
508
+ function assertConfidenceFrontMatterField(record) {
474
509
  const confidence = record.confidence;
475
- if (confidence !== void 0) {
476
- if (typeof confidence === "number") {
477
- assertFrontMatterCondition(Number.isInteger(confidence) && confidence >= 0 && confidence <= 100, "confidence number value must be an integer 0..100");
478
- } else if (typeof confidence === "string") {
479
- const normalizedConfidence = confidence.trim().toLowerCase();
480
- const isKnownTextConfidence = normalizedConfidence === "med" || CONFIDENCE_TEXT_VALUES.includes(normalizedConfidence);
481
- assertFrontMatterCondition(isKnownTextConfidence, `confidence string value must be one of: ${[...CONFIDENCE_TEXT_VALUES, "med"].join(", ")}`);
482
- } else {
483
- assertFrontMatterCondition(false, "confidence must be a number or string");
484
- }
510
+ if (confidence === void 0) {
511
+ return;
512
+ }
513
+ if (typeof confidence === "number") {
514
+ assertFrontMatterCondition(Number.isInteger(confidence) && confidence >= 0 && confidence <= 100, "confidence number value must be an integer 0..100");
515
+ return;
485
516
  }
517
+ if (typeof confidence === "string") {
518
+ const normalizedConfidence = confidence.trim().toLowerCase();
519
+ const isKnownTextConfidence = normalizedConfidence === "med" || CONFIDENCE_TEXT_VALUES.includes(normalizedConfidence);
520
+ assertFrontMatterCondition(isKnownTextConfidence, `confidence string value must be one of: ${[...CONFIDENCE_TEXT_VALUES, "med"].join(", ")}`);
521
+ return;
522
+ }
523
+ assertFrontMatterCondition(false, "confidence must be a number or string");
524
+ }
525
+ function assertSeverityFrontMatterField(record) {
486
526
  const severity = record.severity;
487
- if (severity !== void 0) {
488
- if (typeof severity !== "string") {
489
- validationError("severity must be a string");
490
- }
491
- const normalizedSeverity = severity.trim().toLowerCase();
492
- const isKnownSeverity = normalizedSeverity === "med" || ISSUE_SEVERITY_VALUES.includes(normalizedSeverity);
493
- assertFrontMatterCondition(isKnownSeverity, `severity value must be one of: ${[...ISSUE_SEVERITY_VALUES, "med"].join(", ")}`);
494
- }
495
- const regression = record.regression;
496
- if (regression !== void 0) {
497
- if (typeof regression !== "boolean") {
498
- validationError("regression must be a boolean");
499
- }
527
+ if (severity === void 0) {
528
+ return;
500
529
  }
501
- assertTimestampField(record, "created_at");
502
- assertTimestampField(record, "updated_at");
503
- if (record.deadline !== void 0) {
504
- assertTimestampField(record, "deadline");
530
+ if (typeof severity !== "string") {
531
+ validationError("severity must be a string");
505
532
  }
506
- if (record.reminders !== void 0) {
507
- const reminders = record.reminders;
508
- assertFrontMatterCondition(Array.isArray(reminders), "reminders must be an array");
509
- for (const reminder of reminders) {
510
- assertFrontMatterCondition(typeof reminder === "object" && reminder !== null && !Array.isArray(reminder), "reminders entries must be objects");
511
- const reminderRecord = reminder;
512
- assertFrontMatterCondition(typeof reminderRecord.at === "string", "reminder.at must be a string");
513
- assertFrontMatterCondition(isTimestampLiteral(reminderRecord.at), "reminder.at must be a valid ISO timestamp");
514
- assertFrontMatterCondition(typeof reminderRecord.text === "string", "reminder.text must be a string");
515
- assertFrontMatterCondition(reminderRecord.text.trim().length > 0, "reminder.text must not be empty");
516
- }
533
+ const normalizedSeverity = severity.trim().toLowerCase();
534
+ const isKnownSeverity = normalizedSeverity === "med" || ISSUE_SEVERITY_VALUES.includes(normalizedSeverity);
535
+ assertFrontMatterCondition(isKnownSeverity, `severity value must be one of: ${[...ISSUE_SEVERITY_VALUES, "med"].join(", ")}`);
536
+ }
537
+ function assertRegressionFrontMatterField(record) {
538
+ if (record.regression !== void 0 && typeof record.regression !== "boolean") {
539
+ validationError("regression must be a boolean");
517
540
  }
518
- if (record.events !== void 0) {
519
- const events = record.events;
520
- assertFrontMatterCondition(Array.isArray(events), "events must be an array");
521
- for (const event of events) {
522
- assertFrontMatterCondition(typeof event === "object" && event !== null && !Array.isArray(event), "events entries must be objects");
523
- const eventRecord = event;
524
- assertFrontMatterCondition(typeof eventRecord.start_at === "string", "event.start_at must be a string");
525
- assertFrontMatterCondition(isTimestampLiteral(eventRecord.start_at), "event.start_at must be a valid ISO timestamp");
526
- if (eventRecord.end_at !== void 0) {
527
- assertFrontMatterCondition(typeof eventRecord.end_at === "string", "event.end_at must be a string");
528
- assertFrontMatterCondition(isTimestampLiteral(eventRecord.end_at), "event.end_at must be a valid ISO timestamp");
529
- assertFrontMatterCondition(compareTimestampStrings(eventRecord.end_at, eventRecord.start_at) > 0, "event.end_at must be after event.start_at");
530
- }
531
- for (const stringField of ["title", "description", "location", "timezone"]) {
532
- if (eventRecord[stringField] !== void 0) {
533
- assertFrontMatterCondition(typeof eventRecord[stringField] === "string", `event.${stringField} must be a string`);
534
- assertFrontMatterCondition(eventRecord[stringField].trim().length > 0, `event.${stringField} must not be empty`);
535
- }
536
- }
537
- if (eventRecord.all_day !== void 0) {
538
- assertFrontMatterCondition(typeof eventRecord.all_day === "boolean", "event.all_day must be a boolean");
539
- }
540
- if (eventRecord.recurrence !== void 0) {
541
- assertValidRecurrenceRule(eventRecord.recurrence);
542
- if (eventRecord.recurrence.until !== void 0) {
543
- assertFrontMatterCondition(compareTimestampStrings(eventRecord.recurrence.until, eventRecord.start_at) >= 0, "event.recurrence.until must be at or after event.start_at");
544
- }
545
- }
541
+ }
542
+ function assertReminderEntries(record) {
543
+ const reminders = record.reminders;
544
+ if (reminders === void 0) {
545
+ return;
546
+ }
547
+ assertFrontMatterCondition(Array.isArray(reminders), "reminders must be an array");
548
+ for (const reminder of reminders) {
549
+ assertFrontMatterCondition(typeof reminder === "object" && reminder !== null && !Array.isArray(reminder), "reminders entries must be objects");
550
+ const reminderRecord = reminder;
551
+ assertFrontMatterCondition(typeof reminderRecord.at === "string", "reminder.at must be a string");
552
+ assertFrontMatterCondition(isTimestampLiteral(reminderRecord.at), "reminder.at must be a valid ISO timestamp");
553
+ assertFrontMatterCondition(typeof reminderRecord.text === "string", "reminder.text must be a string");
554
+ assertFrontMatterCondition(reminderRecord.text.trim().length > 0, "reminder.text must not be empty");
555
+ }
556
+ }
557
+ function assertEventStringFields(eventRecord) {
558
+ for (const stringField of ["title", "description", "location", "timezone"]) {
559
+ if (eventRecord[stringField] !== void 0) {
560
+ assertFrontMatterCondition(typeof eventRecord[stringField] === "string", `event.${stringField} must be a string`);
561
+ assertFrontMatterCondition(eventRecord[stringField].trim().length > 0, `event.${stringField} must not be empty`);
546
562
  }
547
563
  }
548
- if (record.closed_at !== void 0) {
549
- const closedAt = record.closed_at;
550
- assertFrontMatterCondition(typeof closedAt === "string", "closed_at must be a string");
551
- assertFrontMatterCondition(isTimestampLiteral(closedAt), "closed_at must be a valid ISO timestamp");
564
+ }
565
+ function assertEventRecurrence(eventRecord) {
566
+ if (eventRecord.recurrence === void 0) {
567
+ return;
568
+ }
569
+ assertValidRecurrenceRule(eventRecord.recurrence);
570
+ if (eventRecord.recurrence.until !== void 0) {
571
+ assertFrontMatterCondition(compareTimestampStrings(eventRecord.recurrence.until, eventRecord.start_at) >= 0, "event.recurrence.until must be at or after event.start_at");
572
+ }
573
+ }
574
+ function assertCalendarEventEntry(event) {
575
+ assertFrontMatterCondition(typeof event === "object" && event !== null && !Array.isArray(event), "events entries must be objects");
576
+ const eventRecord = event;
577
+ assertFrontMatterCondition(typeof eventRecord.start_at === "string", "event.start_at must be a string");
578
+ assertFrontMatterCondition(isTimestampLiteral(eventRecord.start_at), "event.start_at must be a valid ISO timestamp");
579
+ if (eventRecord.end_at !== void 0) {
580
+ assertFrontMatterCondition(typeof eventRecord.end_at === "string", "event.end_at must be a string");
581
+ assertFrontMatterCondition(isTimestampLiteral(eventRecord.end_at), "event.end_at must be a valid ISO timestamp");
582
+ assertFrontMatterCondition(compareTimestampStrings(eventRecord.end_at, eventRecord.start_at) > 0, "event.end_at must be after event.start_at");
583
+ }
584
+ assertEventStringFields(eventRecord);
585
+ if (eventRecord.all_day !== void 0) {
586
+ assertFrontMatterCondition(typeof eventRecord.all_day === "boolean", "event.all_day must be a boolean");
587
+ }
588
+ assertEventRecurrence(eventRecord);
589
+ }
590
+ function assertCalendarEvents(record) {
591
+ const events = record.events;
592
+ if (events === void 0) {
593
+ return;
552
594
  }
595
+ assertFrontMatterCondition(Array.isArray(events), "events must be an array");
596
+ for (const event of events) {
597
+ assertCalendarEventEntry(event);
598
+ }
599
+ }
600
+ function assertOptionalStringFields(record) {
553
601
  for (const fieldName of ["source_type", "source_owner", "design", "external_ref"]) {
554
602
  const value = record[fieldName];
555
603
  if (value !== void 0) {
556
604
  assertFrontMatterCondition(typeof value === "string", `${fieldName} must be a string`);
557
605
  }
558
606
  }
607
+ }
608
+ function assertTypeOptionsField(record) {
559
609
  const typeOptions = record.type_options;
560
- if (typeOptions !== void 0) {
561
- assertFrontMatterCondition(typeof typeOptions === "object" && typeOptions !== null && !Array.isArray(typeOptions), "type_options must be an object");
562
- for (const [optionKey, optionValue] of Object.entries(typeOptions)) {
563
- assertFrontMatterCondition(optionKey.trim().length > 0, "type_options keys must be non-empty");
564
- assertFrontMatterCondition(typeof optionValue === "string", "type_options values must be strings");
565
- const optionText = optionValue;
566
- assertFrontMatterCondition(optionText.trim().length > 0, "type_options values must be non-empty strings");
567
- }
610
+ if (typeOptions === void 0) {
611
+ return;
568
612
  }
569
- if (runtimeContext?.fieldRegistry) {
570
- for (const definition of runtimeContext.fieldRegistry.definitions) {
571
- const fieldValue = record[definition.metadata_key];
572
- if (fieldValue === void 0) {
573
- if (runtimeFieldRequiredForType(definition, itemType)) {
574
- validationError(`missing required schema field: ${definition.metadata_key}`);
575
- }
576
- continue;
577
- }
578
- try {
579
- record[definition.metadata_key] = coerceRuntimeFieldValue(definition, fieldValue, `metadata field "${definition.metadata_key}"`);
580
- } catch (error) {
581
- validationError(String(error?.message).replace(/^Invalid\s+/u, ""));
582
- }
583
- }
613
+ assertFrontMatterCondition(typeof typeOptions === "object" && typeOptions !== null && !Array.isArray(typeOptions), "type_options must be an object");
614
+ for (const [optionKey, optionValue] of Object.entries(typeOptions)) {
615
+ assertFrontMatterCondition(optionKey.trim().length > 0, "type_options keys must be non-empty");
616
+ assertFrontMatterCondition(typeof optionValue === "string", "type_options values must be strings");
617
+ const optionText = optionValue;
618
+ assertFrontMatterCondition(optionText.trim().length > 0, "type_options values must be non-empty strings");
584
619
  }
585
- if (runtimeContext && runtimeContext.unknownFieldPolicy !== "allow") {
586
- const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
587
- const unknownKeys = Object.keys(record).filter((key) => !knownKeys.has(key)).sort((left, right) => left.localeCompare(right));
588
- if (unknownKeys.length > 0) {
589
- if (runtimeContext.unknownFieldPolicy === "reject") {
590
- validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
591
- } else {
592
- runtimeContext.onWarning?.(`item_unknown_schema_fields:${unknownKeys.join(",")}`);
620
+ }
621
+ function coerceRuntimeFrontMatterFields(record, itemType, runtimeContext) {
622
+ if (!runtimeContext?.fieldRegistry) {
623
+ return;
624
+ }
625
+ for (const definition of runtimeContext.fieldRegistry.definitions) {
626
+ const fieldValue = record[definition.metadata_key];
627
+ if (fieldValue === void 0) {
628
+ if (runtimeFieldRequiredForType(definition, itemType)) {
629
+ validationError(`missing required schema field: ${definition.metadata_key}`);
593
630
  }
631
+ continue;
632
+ }
633
+ try {
634
+ record[definition.metadata_key] = coerceRuntimeFieldValue(definition, fieldValue, `metadata field "${definition.metadata_key}"`);
635
+ } catch (error) {
636
+ validationError(String(error?.message).replace(/^Invalid\s+/u, ""));
594
637
  }
595
638
  }
596
639
  }
640
+ function assertRuntimeUnknownFrontMatterFields(record, runtimeContext) {
641
+ if (!runtimeContext || runtimeContext.unknownFieldPolicy === "allow") {
642
+ return;
643
+ }
644
+ const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
645
+ const unknownKeys = Object.keys(record).filter((key) => !knownKeys.has(key)).sort((left, right) => left.localeCompare(right));
646
+ if (unknownKeys.length === 0) {
647
+ return;
648
+ }
649
+ if (runtimeContext.unknownFieldPolicy === "reject") {
650
+ validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
651
+ } else {
652
+ runtimeContext.onWarning?.(`item_unknown_schema_fields:${unknownKeys.join(",")}`);
653
+ }
654
+ }
655
+ function assertValidFrontMatter(frontMatter, runtimeContext) {
656
+ assertFrontMatterCondition(typeof frontMatter === "object" && frontMatter !== null && !Array.isArray(frontMatter), "front matter must be an object");
657
+ const record = frontMatter;
658
+ const itemType = assertRequiredFrontMatterFields(record);
659
+ assertStatusFrontMatterField(record, runtimeContext);
660
+ assertPriorityAndTags(record);
661
+ assertConfidenceFrontMatterField(record);
662
+ assertSeverityFrontMatterField(record);
663
+ assertRegressionFrontMatterField(record);
664
+ assertTimestampField(record, "created_at");
665
+ assertTimestampField(record, "updated_at");
666
+ if (record.deadline !== void 0) {
667
+ assertTimestampField(record, "deadline");
668
+ }
669
+ assertReminderEntries(record);
670
+ assertCalendarEvents(record);
671
+ assertOptionalTimestampString(record, "closed_at", "closed_at");
672
+ assertOptionalStringFields(record);
673
+ assertTypeOptionsField(record);
674
+ coerceRuntimeFrontMatterFields(record, itemType, runtimeContext);
675
+ assertRuntimeUnknownFrontMatterFields(record, runtimeContext);
676
+ }
597
677
  function sortDependencies(values) {
598
678
  if (!values || values.length === 0)
599
679
  return void 0;
@@ -671,52 +751,38 @@ function normalizeRecurrenceRule(value) {
671
751
  return normalized;
672
752
  }
673
753
  function sortEvents(values) {
674
- if (!values || values.length === 0) {
754
+ if (!Array.isArray(values) || values.length === 0) {
675
755
  return void 0;
676
756
  }
677
- const normalized = [...values].map((value) => {
678
- const event = {
679
- start_at: value.start_at,
680
- end_at: value.end_at || void 0,
681
- title: value.title?.trim() || void 0,
682
- description: value.description?.trim() || void 0,
683
- location: value.location?.trim() || void 0,
684
- all_day: value.all_day,
685
- timezone: value.timezone?.trim() || void 0,
686
- recurrence: normalizeRecurrenceRule(value.recurrence)
687
- };
688
- for (const [key, fieldValue] of Object.entries(event)) {
689
- if (fieldValue === void 0) {
690
- delete event[key];
691
- }
692
- }
693
- return event;
694
- }).sort((a, b) => {
695
- const byStart = compareTimestampStrings(a.start_at, b.start_at);
696
- if (byStart !== 0)
697
- return byStart;
698
- const byEnd = (a.end_at ?? "").localeCompare(b.end_at ?? "");
699
- if (byEnd !== 0)
700
- return byEnd;
701
- const byTitle = (a.title ?? "").localeCompare(b.title ?? "");
702
- if (byTitle !== 0)
703
- return byTitle;
704
- const byAllDay = Number(Boolean(a.all_day)) - Number(Boolean(b.all_day));
705
- if (byAllDay !== 0)
706
- return byAllDay;
707
- const byTimezone = (a.timezone ?? "").localeCompare(b.timezone ?? "");
708
- if (byTimezone !== 0)
709
- return byTimezone;
710
- const byLocation = (a.location ?? "").localeCompare(b.location ?? "");
711
- if (byLocation !== 0)
712
- return byLocation;
713
- const byDescription = (a.description ?? "").localeCompare(b.description ?? "");
714
- if (byDescription !== 0)
715
- return byDescription;
716
- return JSON.stringify(a.recurrence ?? {}).localeCompare(JSON.stringify(b.recurrence ?? {}));
717
- });
757
+ const normalized = [...values].map(normalizeCalendarEvent).sort(compareCalendarEvents);
718
758
  return normalized;
719
759
  }
760
+ function normalizeCalendarEvent(value) {
761
+ const event = {
762
+ start_at: value.start_at,
763
+ end_at: value.end_at || void 0,
764
+ title: value.title?.trim() || void 0,
765
+ description: value.description?.trim() || void 0,
766
+ location: value.location?.trim() || void 0,
767
+ all_day: value.all_day,
768
+ timezone: value.timezone?.trim() || void 0,
769
+ recurrence: normalizeRecurrenceRule(value.recurrence)
770
+ };
771
+ deleteUndefinedFields(event);
772
+ return event;
773
+ }
774
+ function compareCalendarEvents(a, b) {
775
+ return firstNonZeroComparison([
776
+ compareTimestampStrings(a.start_at, b.start_at),
777
+ (a.end_at ?? "").localeCompare(b.end_at ?? ""),
778
+ (a.title ?? "").localeCompare(b.title ?? ""),
779
+ Number(Boolean(a.all_day)) - Number(Boolean(b.all_day)),
780
+ (a.timezone ?? "").localeCompare(b.timezone ?? ""),
781
+ (a.location ?? "").localeCompare(b.location ?? ""),
782
+ (a.description ?? "").localeCompare(b.description ?? ""),
783
+ JSON.stringify(a.recurrence ?? {}).localeCompare(JSON.stringify(b.recurrence ?? {}))
784
+ ]);
785
+ }
720
786
  function normalizeFiles(values) {
721
787
  if (!values || values.length === 0)
722
788
  return void 0;
@@ -729,83 +795,140 @@ function normalizeFiles(values) {
729
795
  function normalizeTestRunSummaries(values) {
730
796
  if (!values || values.length === 0)
731
797
  return void 0;
732
- const normalized = values.map((value) => {
733
- const runId = typeof value.run_id === "string" ? value.run_id.trim() : "";
734
- const kind = value.kind === "test" || value.kind === "test-all" ? value.kind : "test";
735
- const status = value.status === "passed" || value.status === "failed" || value.status === "stopped" || value.status === "canceled" ? value.status : "failed";
736
- const startedAt = typeof value.started_at === "string" ? value.started_at : "";
737
- const finishedAt = typeof value.finished_at === "string" ? value.finished_at : "";
738
- const recordedAt = typeof value.recorded_at === "string" ? value.recorded_at : "";
739
- const passed = typeof value.passed === "number" && Number.isFinite(value.passed) ? Math.max(0, Math.floor(value.passed)) : 0;
740
- const failed = typeof value.failed === "number" && Number.isFinite(value.failed) ? Math.max(0, Math.floor(value.failed)) : 0;
741
- const skipped = typeof value.skipped === "number" && Number.isFinite(value.skipped) ? Math.max(0, Math.floor(value.skipped)) : 0;
742
- return {
743
- run_id: runId,
744
- kind,
745
- status,
746
- started_at: startedAt,
747
- finished_at: finishedAt,
748
- recorded_at: recordedAt,
749
- attempt: typeof value.attempt === "number" && Number.isFinite(value.attempt) && value.attempt >= 1 ? Math.floor(value.attempt) : void 0,
750
- resumed_from: value.resumed_from?.trim() || void 0,
751
- passed,
752
- failed,
753
- skipped,
754
- items: typeof value.items === "number" && Number.isFinite(value.items) && value.items >= 0 ? Math.floor(value.items) : void 0,
755
- linked_tests: typeof value.linked_tests === "number" && Number.isFinite(value.linked_tests) && value.linked_tests >= 0 ? Math.floor(value.linked_tests) : void 0,
756
- fail_on_skipped_triggered: value.fail_on_skipped_triggered === true ? true : void 0
757
- };
758
- }).filter((value) => value.run_id.length > 0 && value.started_at.length > 0 && value.finished_at.length > 0 && value.recorded_at.length > 0).sort((a, b) => firstNonZeroComparison([
798
+ const normalized = values.map(normalizeTestRunSummary).filter((value) => value.run_id.length > 0 && value.started_at.length > 0 && value.finished_at.length > 0 && value.recorded_at.length > 0).sort((a, b) => firstNonZeroComparison([
759
799
  compareTimestampStrings(a.recorded_at, b.recorded_at),
760
800
  a.run_id.localeCompare(b.run_id),
761
801
  a.kind.localeCompare(b.kind)
762
802
  ]));
763
803
  return normalized.length > 0 ? normalized : void 0;
764
804
  }
805
+ function normalizeNonNegativeInteger(value) {
806
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : void 0;
807
+ }
808
+ function normalizePositiveInteger(value) {
809
+ return typeof value === "number" && Number.isFinite(value) && value >= 1 ? Math.floor(value) : void 0;
810
+ }
811
+ function stringOrEmpty(value) {
812
+ return typeof value === "string" ? value : "";
813
+ }
814
+ function normalizeTestRunSummary(value) {
815
+ const runId = typeof value.run_id === "string" ? value.run_id.trim() : "";
816
+ const kind = value.kind === "test" || value.kind === "test-all" ? value.kind : "test";
817
+ const status = ITEM_TEST_RUN_STATUS_VALUES.has(value.status) ? value.status : "failed";
818
+ const summary = {
819
+ run_id: runId,
820
+ kind,
821
+ status,
822
+ started_at: stringOrEmpty(value.started_at),
823
+ finished_at: stringOrEmpty(value.finished_at),
824
+ recorded_at: stringOrEmpty(value.recorded_at),
825
+ attempt: normalizePositiveInteger(value.attempt),
826
+ resumed_from: value.resumed_from?.trim() || void 0,
827
+ passed: normalizeNonNegativeInteger(value.passed) ?? 0,
828
+ failed: normalizeNonNegativeInteger(value.failed) ?? 0,
829
+ skipped: normalizeNonNegativeInteger(value.skipped) ?? 0,
830
+ items: normalizeNonNegativeInteger(value.items),
831
+ linked_tests: normalizeNonNegativeInteger(value.linked_tests),
832
+ fail_on_skipped_triggered: value.fail_on_skipped_triggered === true ? true : void 0
833
+ };
834
+ deleteUndefinedFields(summary);
835
+ return summary;
836
+ }
765
837
  function sortTests(values) {
766
- if (!values || values.length === 0)
838
+ if (!Array.isArray(values) || values.length === 0)
767
839
  return void 0;
768
- return [...values].map((value) => ({
840
+ return [...values].map(normalizeLinkedTest).sort(compareLinkedTests);
841
+ }
842
+ function normalizeTrimmedStringList(value) {
843
+ if (!Array.isArray(value)) {
844
+ return void 0;
845
+ }
846
+ const normalized = [
847
+ ...new Set(value.filter((entry) => typeof entry === "string").map((entry) => entry.trim()).filter((entry) => entry.length > 0))
848
+ ].sort((a, b) => a.localeCompare(b));
849
+ return normalized.length > 0 ? normalized : void 0;
850
+ }
851
+ function isPlainObjectRecord(value) {
852
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
853
+ return false;
854
+ }
855
+ const prototype = Object.getPrototypeOf(value);
856
+ return prototype === Object.prototype || prototype === null;
857
+ }
858
+ function isUnsafeObjectKey(key) {
859
+ return key === "__proto__" || key === "constructor" || key === "prototype";
860
+ }
861
+ function normalizeStringRecord(value) {
862
+ if (!isPlainObjectRecord(value)) {
863
+ return void 0;
864
+ }
865
+ const entries = Object.entries(value).map(([key, recordValue]) => [key.trim(), String(recordValue).trim()]).filter(([key, recordValue]) => key.length > 0 && !isUnsafeObjectKey(key) && recordValue.length > 0).sort(([left], [right]) => left.localeCompare(right));
866
+ return entries.length > 0 ? Object.fromEntries(entries) : void 0;
867
+ }
868
+ function normalizeNumericRecord(value) {
869
+ if (!isPlainObjectRecord(value)) {
870
+ return void 0;
871
+ }
872
+ const entries = Object.entries(value).map(([key, recordValue]) => [key.trim(), Number(recordValue)]).filter(([key, recordValue]) => key.length > 0 && !isUnsafeObjectKey(key) && Number.isFinite(recordValue)).sort(([left], [right]) => left.localeCompare(right));
873
+ return entries.length > 0 ? Object.fromEntries(entries) : void 0;
874
+ }
875
+ function normalizeLinkedTestContextMode(value) {
876
+ const normalized = value?.trim().toLowerCase();
877
+ if (!normalized || !LINKED_TEST_PM_CONTEXT_MODE_VALUES.has(normalized)) {
878
+ return void 0;
879
+ }
880
+ return normalized;
881
+ }
882
+ function normalizeLinkedTest(value) {
883
+ const test = {
769
884
  command: value.command?.trim() || void 0,
770
885
  path: value.path ? normalizePathValue(value.path) : void 0,
771
886
  scope: value.scope,
772
887
  timeout_seconds: typeof value.timeout_seconds === "number" && Number.isFinite(value.timeout_seconds) && value.timeout_seconds > 0 ? value.timeout_seconds : void 0,
773
- pm_context_mode: (() => {
774
- const normalized = value.pm_context_mode?.trim().toLowerCase();
775
- if (!normalized || !LINKED_TEST_PM_CONTEXT_MODE_VALUES.has(normalized)) {
776
- return void 0;
777
- }
778
- return normalized;
779
- })(),
780
- env_set: value.env_set ? Object.fromEntries(Object.entries(value.env_set).map(([key, envValue]) => [key.trim(), String(envValue).trim()]).filter(([key, envValue]) => key.length > 0 && envValue.length > 0).sort(([left], [right]) => left.localeCompare(right))) : void 0,
781
- env_clear: value.env_clear ? [...new Set(value.env_clear.map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) => a.localeCompare(b)) : void 0,
888
+ pm_context_mode: normalizeLinkedTestContextMode(value.pm_context_mode),
889
+ env_set: normalizeStringRecord(value.env_set),
890
+ env_clear: normalizeTrimmedStringList(value.env_clear),
782
891
  shared_host_safe: value.shared_host_safe === true ? true : void 0,
783
- assert_stdout_contains: value.assert_stdout_contains ? [...new Set(value.assert_stdout_contains.map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) => a.localeCompare(b)) : void 0,
784
- assert_stdout_regex: value.assert_stdout_regex ? [...new Set(value.assert_stdout_regex.map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) => a.localeCompare(b)) : void 0,
785
- assert_stderr_contains: value.assert_stderr_contains ? [...new Set(value.assert_stderr_contains.map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) => a.localeCompare(b)) : void 0,
786
- assert_stderr_regex: value.assert_stderr_regex ? [...new Set(value.assert_stderr_regex.map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) => a.localeCompare(b)) : void 0,
787
- assert_stdout_min_lines: typeof value.assert_stdout_min_lines === "number" && Number.isFinite(value.assert_stdout_min_lines) && value.assert_stdout_min_lines >= 0 ? Math.floor(value.assert_stdout_min_lines) : void 0,
788
- assert_json_field_equals: value.assert_json_field_equals ? Object.fromEntries(Object.entries(value.assert_json_field_equals).map(([key, expectedValue]) => [key.trim(), String(expectedValue).trim()]).filter(([key, expectedValue]) => key.length > 0 && expectedValue.length > 0).sort(([left], [right]) => left.localeCompare(right))) : void 0,
789
- assert_json_field_gte: value.assert_json_field_gte ? Object.fromEntries(Object.entries(value.assert_json_field_gte).map(([key, expectedValue]) => [key.trim(), Number(expectedValue)]).filter(([key, expectedValue]) => key.length > 0 && Number.isFinite(expectedValue)).sort(([left], [right]) => left.localeCompare(right))) : void 0,
892
+ assert_stdout_contains: normalizeTrimmedStringList(value.assert_stdout_contains),
893
+ assert_stdout_regex: normalizeTrimmedStringList(value.assert_stdout_regex),
894
+ assert_stderr_contains: normalizeTrimmedStringList(value.assert_stderr_contains),
895
+ assert_stderr_regex: normalizeTrimmedStringList(value.assert_stderr_regex),
896
+ assert_stdout_min_lines: normalizeNonNegativeInteger(value.assert_stdout_min_lines),
897
+ assert_json_field_equals: normalizeStringRecord(value.assert_json_field_equals),
898
+ assert_json_field_gte: normalizeNumericRecord(value.assert_json_field_gte),
790
899
  note: value.note?.trim() || void 0
791
- })).sort((a, b) => firstNonZeroComparison([
900
+ };
901
+ deleteUndefinedFields(test);
902
+ return test;
903
+ }
904
+ function compareLinkedTests(a, b) {
905
+ return firstNonZeroComparison([
792
906
  a.scope.localeCompare(b.scope),
793
- (a.path ?? "").localeCompare(b.path ?? ""),
794
- (a.command ?? "").localeCompare(b.command ?? ""),
795
- (a.timeout_seconds ?? 0) - (b.timeout_seconds ?? 0),
796
- (a.pm_context_mode ?? "").localeCompare(b.pm_context_mode ?? ""),
907
+ compareOptionalStrings(a.path, b.path),
908
+ compareOptionalStrings(a.command, b.command),
909
+ compareOptionalNumbers(a.timeout_seconds, b.timeout_seconds),
910
+ compareOptionalStrings(a.pm_context_mode, b.pm_context_mode),
797
911
  Number(Boolean(a.shared_host_safe)) - Number(Boolean(b.shared_host_safe)),
798
- JSON.stringify(a.env_clear ?? []).localeCompare(JSON.stringify(b.env_clear ?? [])),
799
- JSON.stringify(a.env_set ?? {}).localeCompare(JSON.stringify(b.env_set ?? {})),
800
- JSON.stringify(a.assert_stdout_contains ?? []).localeCompare(JSON.stringify(b.assert_stdout_contains ?? [])),
801
- JSON.stringify(a.assert_stdout_regex ?? []).localeCompare(JSON.stringify(b.assert_stdout_regex ?? [])),
802
- JSON.stringify(a.assert_stderr_contains ?? []).localeCompare(JSON.stringify(b.assert_stderr_contains ?? [])),
803
- JSON.stringify(a.assert_stderr_regex ?? []).localeCompare(JSON.stringify(b.assert_stderr_regex ?? [])),
804
- (a.assert_stdout_min_lines ?? 0) - (b.assert_stdout_min_lines ?? 0),
805
- JSON.stringify(a.assert_json_field_equals ?? {}).localeCompare(JSON.stringify(b.assert_json_field_equals ?? {})),
806
- JSON.stringify(a.assert_json_field_gte ?? {}).localeCompare(JSON.stringify(b.assert_json_field_gte ?? {})),
807
- (a.note ?? "").localeCompare(b.note ?? "")
808
- ]));
912
+ compareJsonValues(a.env_clear, b.env_clear, []),
913
+ compareJsonValues(a.env_set, b.env_set, {}),
914
+ compareJsonValues(a.assert_stdout_contains, b.assert_stdout_contains, []),
915
+ compareJsonValues(a.assert_stdout_regex, b.assert_stdout_regex, []),
916
+ compareJsonValues(a.assert_stderr_contains, b.assert_stderr_contains, []),
917
+ compareJsonValues(a.assert_stderr_regex, b.assert_stderr_regex, []),
918
+ compareOptionalNumbers(a.assert_stdout_min_lines, b.assert_stdout_min_lines),
919
+ compareJsonValues(a.assert_json_field_equals, b.assert_json_field_equals, {}),
920
+ compareJsonValues(a.assert_json_field_gte, b.assert_json_field_gte, {}),
921
+ compareOptionalStrings(a.note, b.note)
922
+ ]);
923
+ }
924
+ function compareOptionalStrings(left, right) {
925
+ return (left ?? "").localeCompare(right ?? "");
926
+ }
927
+ function compareOptionalNumbers(left, right) {
928
+ return (left ?? 0) - (right ?? 0);
929
+ }
930
+ function compareJsonValues(left, right, fallback) {
931
+ return JSON.stringify(left ?? fallback).localeCompare(JSON.stringify(right ?? fallback));
809
932
  }
810
933
  function sortDocs(values) {
811
934
  if (!values || values.length === 0)
@@ -918,65 +1041,71 @@ function normalizePlanStepDocs(value) {
918
1041
  }
919
1042
  return out.length > 0 ? out : void 0;
920
1043
  }
1044
+ function normalizePlanStepEntry(entry) {
1045
+ if (entry === null || typeof entry !== "object") {
1046
+ return void 0;
1047
+ }
1048
+ const record = entry;
1049
+ const id = trimStringOrUndefined(record.id);
1050
+ const title = trimStringOrUndefined(record.title);
1051
+ const statusRaw = trimStringOrUndefined(record.status);
1052
+ const status = statusRaw && PLAN_STEP_STATUS_SET.has(statusRaw) ? statusRaw : void 0;
1053
+ const orderRaw = record.order;
1054
+ const order = typeof orderRaw === "number" && Number.isFinite(orderRaw) ? orderRaw : typeof orderRaw === "string" && orderRaw.trim().length > 0 ? Number(orderRaw) : Number.NaN;
1055
+ const created_at = typeof record.created_at === "string" ? record.created_at : "";
1056
+ const updated_at = typeof record.updated_at === "string" ? record.updated_at : "";
1057
+ if (!id || !title || !status || !Number.isFinite(order) || !created_at || !updated_at) {
1058
+ return void 0;
1059
+ }
1060
+ const step = {
1061
+ id,
1062
+ order,
1063
+ title,
1064
+ status,
1065
+ created_at,
1066
+ updated_at
1067
+ };
1068
+ applyPlanStepOptionalFields(step, record);
1069
+ return step;
1070
+ }
1071
+ function applyPlanStepOptionalFields(step, record) {
1072
+ const stringFields = [
1073
+ ["body", "body"],
1074
+ ["owner", "owner"],
1075
+ ["evidence", "evidence"],
1076
+ ["blocked_reason", "blocked_reason"],
1077
+ ["superseded_by", "superseded_by"]
1078
+ ];
1079
+ for (const [target, source] of stringFields) {
1080
+ const value = trimStringOrUndefined(record[source]);
1081
+ if (value) {
1082
+ step[target] = value;
1083
+ }
1084
+ }
1085
+ const completedAt = typeof record.completed_at === "string" ? record.completed_at : void 0;
1086
+ if (completedAt && completedAt.length > 0) {
1087
+ step.completed_at = completedAt;
1088
+ }
1089
+ const collectionFields = [
1090
+ ["linked_items", "linked_items", normalizePlanStepLinks],
1091
+ ["files", "files", normalizePlanStepFiles],
1092
+ ["tests", "tests", normalizePlanStepTests],
1093
+ ["docs", "docs", normalizePlanStepDocs]
1094
+ ];
1095
+ for (const [target, source, normalize] of collectionFields) {
1096
+ const value = normalize(record[source]);
1097
+ if (value) {
1098
+ step[target] = value;
1099
+ }
1100
+ }
1101
+ }
921
1102
  function normalizePlanSteps(value) {
922
1103
  if (!Array.isArray(value))
923
1104
  return void 0;
924
- const out = [];
925
- for (const entry of value) {
926
- if (entry === null || typeof entry !== "object")
927
- continue;
928
- const record = entry;
929
- const id = trimStringOrUndefined(record.id);
930
- const title = trimStringOrUndefined(record.title);
931
- const status = trimStringOrUndefined(record.status);
932
- const orderRaw = record.order;
933
- const order = typeof orderRaw === "number" && Number.isFinite(orderRaw) ? orderRaw : Number(orderRaw);
934
- if (!id || !title || !status || !Number.isFinite(order))
935
- continue;
936
- const created_at = typeof record.created_at === "string" ? record.created_at : "";
937
- const updated_at = typeof record.updated_at === "string" ? record.updated_at : "";
938
- if (!created_at || !updated_at)
939
- continue;
940
- const step = {
941
- id,
942
- order,
943
- title,
944
- status,
945
- created_at,
946
- updated_at
947
- };
948
- const body = trimStringOrUndefined(record.body);
949
- if (body)
950
- step.body = body;
951
- const owner = trimStringOrUndefined(record.owner);
952
- if (owner)
953
- step.owner = owner;
954
- const evidence = trimStringOrUndefined(record.evidence);
955
- if (evidence)
956
- step.evidence = evidence;
957
- const blockedReason = trimStringOrUndefined(record.blocked_reason);
958
- if (blockedReason)
959
- step.blocked_reason = blockedReason;
960
- const supersededBy = trimStringOrUndefined(record.superseded_by);
961
- if (supersededBy)
962
- step.superseded_by = supersededBy;
963
- const completedAt = typeof record.completed_at === "string" ? record.completed_at : void 0;
964
- if (completedAt && completedAt.length > 0)
965
- step.completed_at = completedAt;
966
- const links = normalizePlanStepLinks(record.linked_items);
967
- if (links)
968
- step.linked_items = links;
969
- const files = normalizePlanStepFiles(record.files);
970
- if (files)
971
- step.files = files;
972
- const tests = normalizePlanStepTests(record.tests);
973
- if (tests)
974
- step.tests = tests;
975
- const docs = normalizePlanStepDocs(record.docs);
976
- if (docs)
977
- step.docs = docs;
978
- out.push(step);
979
- }
1105
+ const out = value.flatMap((entry) => {
1106
+ const step = normalizePlanStepEntry(entry);
1107
+ return step ? [step] : [];
1108
+ });
980
1109
  out.sort((left, right) => left.order - right.order);
981
1110
  return out.length > 0 ? out : void 0;
982
1111
  }
@@ -1096,6 +1225,46 @@ function normalizeSeverityValue(value) {
1096
1225
  }
1097
1226
  return void 0;
1098
1227
  }
1228
+ function emptyStringToUndefined(value) {
1229
+ return value || void 0;
1230
+ }
1231
+ function copyExtensionFrontMatterFields(normalized, source) {
1232
+ const targetRecord = normalized;
1233
+ const sourceRecord = source;
1234
+ for (const [key, value] of Object.entries(sourceRecord)) {
1235
+ if (isUnsafeObjectKey(key) || Object.prototype.hasOwnProperty.call(targetRecord, key) || value === void 0) {
1236
+ continue;
1237
+ }
1238
+ targetRecord[key] = value;
1239
+ }
1240
+ }
1241
+ function coerceNormalizedRuntimeFields(normalized, runtimeContext) {
1242
+ if (!runtimeContext?.fieldRegistry) {
1243
+ return;
1244
+ }
1245
+ const record = normalized;
1246
+ for (const definition of runtimeContext.fieldRegistry.definitions) {
1247
+ const currentValue = record[definition.metadata_key];
1248
+ if (currentValue === void 0) {
1249
+ continue;
1250
+ }
1251
+ record[definition.metadata_key] = coerceRuntimeFieldValue(definition, currentValue, `metadata field "${definition.metadata_key}"`);
1252
+ }
1253
+ }
1254
+ function assertNormalizedUnknownFields(normalized, runtimeContext) {
1255
+ if (!runtimeContext || runtimeContext.unknownFieldPolicy === "allow") {
1256
+ return;
1257
+ }
1258
+ const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
1259
+ const record = normalized;
1260
+ const unknownKeys = Object.keys(record).filter((key) => !knownKeys.has(key)).sort((left, right) => left.localeCompare(right));
1261
+ if (unknownKeys.length > 0 && runtimeContext.unknownFieldPolicy === "reject") {
1262
+ validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
1263
+ }
1264
+ if (unknownKeys.length > 0) {
1265
+ runtimeContext.onWarning?.(`item_unknown_schema_fields:${unknownKeys.join(",")}`);
1266
+ }
1267
+ }
1099
1268
  function normalizeFrontMatter(frontMatter, options = {}) {
1100
1269
  const runtimeContext = resolveRuntimeSchemaValidationContext(options);
1101
1270
  const normalizedStatus = normalizeStatusInput(frontMatter.status, runtimeContext?.statusRegistry) ?? frontMatter.status;
@@ -1106,7 +1275,7 @@ function normalizeFrontMatter(frontMatter, options = {}) {
1106
1275
  description: frontMatter.description,
1107
1276
  type: frontMatter.type,
1108
1277
  pm_format_version: normalizeItemFormatVersion(frontMatter.pm_format_version),
1109
- source_type: frontMatter.source_type?.trim() || void 0,
1278
+ source_type: trimStringOrUndefined(frontMatter.source_type),
1110
1279
  type_options: normalizeTypeOptions(frontMatter.type_options),
1111
1280
  status: normalizedStatus,
1112
1281
  priority: frontMatter.priority,
@@ -1121,47 +1290,47 @@ function normalizeFrontMatter(frontMatter, options = {}) {
1121
1290
  tests: sortTests(frontMatter.tests),
1122
1291
  test_runs: normalizeTestRunSummaries(frontMatter.test_runs),
1123
1292
  docs: sortDocs(frontMatter.docs),
1124
- deadline: frontMatter.deadline || void 0,
1293
+ deadline: emptyStringToUndefined(frontMatter.deadline),
1125
1294
  reminders: sortReminders(frontMatter.reminders),
1126
1295
  events: sortEvents(frontMatter.events),
1127
- closed_at: frontMatter.closed_at || void 0,
1128
- assignee: frontMatter.assignee?.trim() || void 0,
1129
- source_owner: frontMatter.source_owner?.trim() || void 0,
1130
- author: frontMatter.author || void 0,
1296
+ closed_at: emptyStringToUndefined(frontMatter.closed_at),
1297
+ assignee: trimStringOrUndefined(frontMatter.assignee),
1298
+ source_owner: trimStringOrUndefined(frontMatter.source_owner),
1299
+ author: emptyStringToUndefined(frontMatter.author),
1131
1300
  estimated_minutes: frontMatter.estimated_minutes,
1132
1301
  acceptance_criteria: frontMatter.acceptance_criteria ?? void 0,
1133
1302
  design: frontMatter.design ?? void 0,
1134
1303
  external_ref: frontMatter.external_ref ?? void 0,
1135
- definition_of_ready: frontMatter.definition_of_ready?.trim() || void 0,
1304
+ definition_of_ready: trimStringOrUndefined(frontMatter.definition_of_ready),
1136
1305
  order: frontMatter.order,
1137
- goal: frontMatter.goal?.trim() || void 0,
1138
- objective: frontMatter.objective?.trim() || void 0,
1139
- value: frontMatter.value?.trim() || void 0,
1140
- impact: frontMatter.impact?.trim() || void 0,
1141
- outcome: frontMatter.outcome?.trim() || void 0,
1142
- why_now: frontMatter.why_now?.trim() || void 0,
1143
- parent: frontMatter.parent?.trim() || void 0,
1144
- reviewer: frontMatter.reviewer?.trim() || void 0,
1306
+ goal: trimStringOrUndefined(frontMatter.goal),
1307
+ objective: trimStringOrUndefined(frontMatter.objective),
1308
+ value: trimStringOrUndefined(frontMatter.value),
1309
+ impact: trimStringOrUndefined(frontMatter.impact),
1310
+ outcome: trimStringOrUndefined(frontMatter.outcome),
1311
+ why_now: trimStringOrUndefined(frontMatter.why_now),
1312
+ parent: trimStringOrUndefined(frontMatter.parent),
1313
+ reviewer: trimStringOrUndefined(frontMatter.reviewer),
1145
1314
  risk: frontMatter.risk ?? void 0,
1146
1315
  confidence: normalizeConfidenceValue(frontMatter.confidence),
1147
- sprint: frontMatter.sprint?.trim() || void 0,
1148
- release: frontMatter.release?.trim() || void 0,
1149
- blocked_by: frontMatter.blocked_by?.trim() || void 0,
1150
- blocked_reason: frontMatter.blocked_reason?.trim() || void 0,
1151
- unblock_note: frontMatter.unblock_note?.trim() || void 0,
1152
- reporter: frontMatter.reporter?.trim() || void 0,
1316
+ sprint: trimStringOrUndefined(frontMatter.sprint),
1317
+ release: trimStringOrUndefined(frontMatter.release),
1318
+ blocked_by: trimStringOrUndefined(frontMatter.blocked_by),
1319
+ blocked_reason: trimStringOrUndefined(frontMatter.blocked_reason),
1320
+ unblock_note: trimStringOrUndefined(frontMatter.unblock_note),
1321
+ reporter: trimStringOrUndefined(frontMatter.reporter),
1153
1322
  severity: normalizeSeverityValue(frontMatter.severity),
1154
- environment: frontMatter.environment?.trim() || void 0,
1155
- repro_steps: frontMatter.repro_steps?.trim() || void 0,
1156
- resolution: frontMatter.resolution?.trim() || void 0,
1157
- expected_result: frontMatter.expected_result?.trim() || void 0,
1158
- actual_result: frontMatter.actual_result?.trim() || void 0,
1159
- affected_version: frontMatter.affected_version?.trim() || void 0,
1160
- fixed_version: frontMatter.fixed_version?.trim() || void 0,
1161
- component: frontMatter.component?.trim() || void 0,
1323
+ environment: trimStringOrUndefined(frontMatter.environment),
1324
+ repro_steps: trimStringOrUndefined(frontMatter.repro_steps),
1325
+ resolution: trimStringOrUndefined(frontMatter.resolution),
1326
+ expected_result: trimStringOrUndefined(frontMatter.expected_result),
1327
+ actual_result: trimStringOrUndefined(frontMatter.actual_result),
1328
+ affected_version: trimStringOrUndefined(frontMatter.affected_version),
1329
+ fixed_version: trimStringOrUndefined(frontMatter.fixed_version),
1330
+ component: trimStringOrUndefined(frontMatter.component),
1162
1331
  regression: frontMatter.regression,
1163
- customer_impact: frontMatter.customer_impact?.trim() || void 0,
1164
- close_reason: frontMatter.close_reason || void 0,
1332
+ customer_impact: trimStringOrUndefined(frontMatter.customer_impact),
1333
+ close_reason: emptyStringToUndefined(frontMatter.close_reason),
1165
1334
  plan_mode: trimStringOrUndefined(frontMatter.plan_mode),
1166
1335
  plan_scope: trimStringOrUndefined(frontMatter.plan_scope),
1167
1336
  plan_harness: trimStringOrUndefined(frontMatter.plan_harness),
@@ -1171,36 +1340,10 @@ function normalizeFrontMatter(frontMatter, options = {}) {
1171
1340
  plan_discoveries: normalizePlanDiscoveries(frontMatter.plan_discoveries),
1172
1341
  plan_validation: normalizePlanValidation(frontMatter.plan_validation)
1173
1342
  };
1174
- const sourceRecord = frontMatter;
1175
- for (const [key, value] of Object.entries(sourceRecord)) {
1176
- if (Object.prototype.hasOwnProperty.call(normalized, key) || value === void 0) {
1177
- continue;
1178
- }
1179
- normalized[key] = value;
1180
- }
1181
- if (runtimeContext?.fieldRegistry) {
1182
- for (const definition of runtimeContext.fieldRegistry.definitions) {
1183
- const currentValue = normalized[definition.metadata_key];
1184
- if (currentValue === void 0) {
1185
- continue;
1186
- }
1187
- normalized[definition.metadata_key] = coerceRuntimeFieldValue(definition, currentValue, `metadata field "${definition.metadata_key}"`);
1188
- }
1189
- }
1190
- if (runtimeContext && runtimeContext.unknownFieldPolicy !== "allow") {
1191
- const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
1192
- const unknownKeys = Object.keys(normalized).filter((key) => !knownKeys.has(key)).sort((left, right) => left.localeCompare(right));
1193
- if (unknownKeys.length > 0) {
1194
- if (runtimeContext.unknownFieldPolicy === "reject") {
1195
- validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
1196
- }
1197
- }
1198
- }
1199
- for (const [key, value] of Object.entries(normalized)) {
1200
- if (value === void 0) {
1201
- delete normalized[key];
1202
- }
1203
- }
1343
+ copyExtensionFrontMatterFields(normalized, frontMatter);
1344
+ coerceNormalizedRuntimeFields(normalized, runtimeContext);
1345
+ assertNormalizedUnknownFields(normalized, runtimeContext);
1346
+ deleteUndefinedFields(normalized);
1204
1347
  return normalized;
1205
1348
  }
1206
1349
  function orderFrontMatter(frontMatter) {
@@ -1274,6 +1417,9 @@ function stripLeadingYamlDocument(content) {
1274
1417
  }
1275
1418
  return { content: normalizedContent, stripped: false };
1276
1419
  }
1420
+ function normalizeParsedFrontMatter(frontMatter, options) {
1421
+ return normalizeFrontMatter(frontMatter, { ...options, onWarning: void 0 });
1422
+ }
1277
1423
  function parseJsonMarkdownItemDocument(content, runtimeContext, options = {}) {
1278
1424
  const normalized = stripLeadingYamlDocument(content);
1279
1425
  if (normalized.stripped) {
@@ -1295,7 +1441,7 @@ function parseJsonMarkdownItemDocument(content, runtimeContext, options = {}) {
1295
1441
  }
1296
1442
  assertValidFrontMatter(parsed, runtimeContext);
1297
1443
  return {
1298
- metadata: normalizeFrontMatter(parsed, options),
1444
+ metadata: normalizeParsedFrontMatter(parsed, options),
1299
1445
  body: normalizeBody(body)
1300
1446
  };
1301
1447
  }
@@ -1312,7 +1458,7 @@ function parseToonItemDocument(content, runtimeContext, options = {}) {
1312
1458
  assertValidFrontMatter(record.front_matter, runtimeContext);
1313
1459
  assertFrontMatterCondition(record.body === void 0 || typeof record.body === "string", "TOON item document body must be a string");
1314
1460
  return {
1315
- metadata: normalizeFrontMatter(record.front_matter, options),
1461
+ metadata: normalizeParsedFrontMatter(record.front_matter, options),
1316
1462
  body: normalizeBody(typeof record.body === "string" ? record.body : "")
1317
1463
  };
1318
1464
  }
@@ -1320,7 +1466,7 @@ function parseToonItemDocument(content, runtimeContext, options = {}) {
1320
1466
  assertFrontMatterCondition(body === void 0 || typeof body === "string", "TOON item document body must be a string");
1321
1467
  assertValidFrontMatter(frontMatterRecord, runtimeContext);
1322
1468
  return {
1323
- metadata: normalizeFrontMatter(frontMatterRecord, options),
1469
+ metadata: normalizeParsedFrontMatter(frontMatterRecord, options),
1324
1470
  body: normalizeBody(typeof body === "string" ? body : "")
1325
1471
  };
1326
1472
  }
@@ -1388,4 +1534,4 @@ export {
1388
1534
  serializeItemDocument,
1389
1535
  canonicalDocument
1390
1536
  };
1391
- //# sourceMappingURL=chunk-ZFIEEDTJ.js.map
1537
+ //# sourceMappingURL=chunk-BHO33VBQ.js.map