@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
@@ -4,9 +4,9 @@
4
4
  * Defines item parsing, formatting, and lifecycle helpers for Item Format.
5
5
  */
6
6
 
7
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="777ea2a9-5aa6-5a90-abb5-a0b6052645f2")}catch(e){}}();
7
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="84d024fa-403c-5a85-8c12-4e823afa4fc9")}catch(e){}}();
8
8
  import { encode as encodeToon } from "@toon-format/toon";
9
- import { CONFIDENCE_TEXT_VALUES, ISSUE_SEVERITY_VALUES, RECURRENCE_FREQUENCY_VALUES, RECURRENCE_WEEKDAY_VALUES, STATUS_VALUES, weekdayOrderIndex, } from "../../types/index.js";
9
+ import { CONFIDENCE_TEXT_VALUES, ISSUE_SEVERITY_VALUES, PLAN_STEP_STATUS_VALUES, RECURRENCE_FREQUENCY_VALUES, RECURRENCE_WEEKDAY_VALUES, STATUS_VALUES, weekdayOrderIndex, } from "../../types/index.js";
10
10
  import { coerceRuntimeFieldValue } from "../schema/runtime-field-values.js";
11
11
  import { resolveRuntimeFieldRegistry, resolveRuntimeStatusRegistry, } from "../schema/runtime-schema.js";
12
12
  import { BASELINE_ITEM_FORMAT_VERSION, normalizeItemFormatVersion } from "./item-format-version.js";
@@ -18,6 +18,8 @@ import { PmCliError } from "../shared/errors.js";
18
18
  import { orderObject } from "../shared/serialization.js";
19
19
  import { compareTimestampStrings, isTimestampLiteral } from "../shared/time.js";
20
20
  const LINKED_TEST_PM_CONTEXT_MODE_VALUES = new Set(["schema", "tracker", "auto"]);
21
+ const ITEM_TEST_RUN_STATUS_VALUES = new Set(["passed", "failed", "stopped", "canceled"]);
22
+ const PLAN_STEP_STATUS_SET = new Set(PLAN_STEP_STATUS_VALUES);
21
23
  function normalizePathValue(value) {
22
24
  return value.replaceAll("\\", "/");
23
25
  }
@@ -29,6 +31,13 @@ function firstNonZeroComparison(comparisons) {
29
31
  }
30
32
  return 0;
31
33
  }
34
+ function deleteUndefinedFields(record) {
35
+ for (const [key, value] of Object.entries(record)) {
36
+ if (value === undefined) {
37
+ delete record[key];
38
+ }
39
+ }
40
+ }
32
41
  const REQUIRED_STRING_FIELDS = [
33
42
  "id",
34
43
  "title",
@@ -82,49 +91,65 @@ function assertTimestampField(record, fieldName) {
82
91
  const timestamp = rawValue;
83
92
  assertFrontMatterCondition(isTimestampLiteral(timestamp), `${fieldName} must be a valid ISO timestamp`);
84
93
  }
94
+ function assertPositiveIntegerField(record, fieldName, messagePrefix) {
95
+ const value = record[fieldName];
96
+ if (value === undefined) {
97
+ return;
98
+ }
99
+ assertFrontMatterCondition(typeof value === "number" && Number.isInteger(value) && value >= 1, `${messagePrefix} must be an integer >= 1`);
100
+ }
101
+ function assertOptionalTimestampString(record, fieldName, messagePrefix) {
102
+ const value = record[fieldName];
103
+ if (value === undefined) {
104
+ return;
105
+ }
106
+ assertFrontMatterCondition(typeof value === "string", `${messagePrefix} must be a string`);
107
+ assertFrontMatterCondition(isTimestampLiteral(value), `${messagePrefix} must be a valid ISO timestamp`);
108
+ }
109
+ function assertRecurrenceWeekdays(value) {
110
+ if (value === undefined) {
111
+ return;
112
+ }
113
+ assertFrontMatterCondition(Array.isArray(value), "event.recurrence.by_weekday must be an array");
114
+ for (const weekday of value) {
115
+ assertFrontMatterCondition(typeof weekday === "string", "event.recurrence.by_weekday entries must be strings");
116
+ const normalizedWeekday = weekday.trim().toLowerCase();
117
+ assertFrontMatterCondition(RECURRENCE_WEEKDAY_VALUES.includes(normalizedWeekday), `event.recurrence.by_weekday entries must be one of: ${RECURRENCE_WEEKDAY_VALUES.join(", ")}`);
118
+ }
119
+ }
120
+ function assertRecurrenceMonthDays(value) {
121
+ if (value === undefined) {
122
+ return;
123
+ }
124
+ assertFrontMatterCondition(Array.isArray(value), "event.recurrence.by_month_day must be an array");
125
+ for (const day of value) {
126
+ assertFrontMatterCondition(typeof day === "number" && Number.isInteger(day) && day >= 1 && day <= 31, "event.recurrence.by_month_day entries must be integers 1..31");
127
+ }
128
+ }
129
+ function assertRecurrenceExdates(value) {
130
+ if (value === undefined) {
131
+ return;
132
+ }
133
+ assertFrontMatterCondition(Array.isArray(value), "event.recurrence.exdates must be an array");
134
+ for (const exdate of value) {
135
+ assertFrontMatterCondition(typeof exdate === "string", "event.recurrence.exdates entries must be strings");
136
+ assertFrontMatterCondition(isTimestampLiteral(exdate), "event.recurrence.exdates entries must be valid ISO timestamps");
137
+ }
138
+ }
85
139
  function assertValidRecurrenceRule(recurrence) {
86
140
  assertFrontMatterCondition(typeof recurrence === "object" && recurrence !== null && !Array.isArray(recurrence), "event.recurrence must be an object");
87
141
  const recurrenceRecord = recurrence;
88
142
  assertFrontMatterCondition(typeof recurrenceRecord.freq === "string", "event.recurrence.freq must be a string");
89
143
  const frequency = recurrenceRecord.freq.trim().toLowerCase();
90
144
  assertFrontMatterCondition(RECURRENCE_FREQUENCY_VALUES.includes(frequency), `event.recurrence.freq must be one of: ${RECURRENCE_FREQUENCY_VALUES.join(", ")}`);
91
- if (recurrenceRecord.interval !== undefined) {
92
- assertFrontMatterCondition(typeof recurrenceRecord.interval === "number" &&
93
- Number.isInteger(recurrenceRecord.interval) &&
94
- recurrenceRecord.interval >= 1, "event.recurrence.interval must be an integer >= 1");
95
- }
96
- if (recurrenceRecord.count !== undefined) {
97
- assertFrontMatterCondition(typeof recurrenceRecord.count === "number" && Number.isInteger(recurrenceRecord.count) && recurrenceRecord.count >= 1, "event.recurrence.count must be an integer >= 1");
98
- }
99
- if (recurrenceRecord.until !== undefined) {
100
- assertFrontMatterCondition(typeof recurrenceRecord.until === "string", "event.recurrence.until must be a string");
101
- assertFrontMatterCondition(isTimestampLiteral(recurrenceRecord.until), "event.recurrence.until must be a valid ISO timestamp");
102
- }
103
- if (recurrenceRecord.by_weekday !== undefined) {
104
- assertFrontMatterCondition(Array.isArray(recurrenceRecord.by_weekday), "event.recurrence.by_weekday must be an array");
105
- for (const weekday of recurrenceRecord.by_weekday) {
106
- assertFrontMatterCondition(typeof weekday === "string", "event.recurrence.by_weekday entries must be strings");
107
- const normalizedWeekday = weekday.trim().toLowerCase();
108
- assertFrontMatterCondition(RECURRENCE_WEEKDAY_VALUES.includes(normalizedWeekday), `event.recurrence.by_weekday entries must be one of: ${RECURRENCE_WEEKDAY_VALUES.join(", ")}`);
109
- }
110
- }
111
- if (recurrenceRecord.by_month_day !== undefined) {
112
- assertFrontMatterCondition(Array.isArray(recurrenceRecord.by_month_day), "event.recurrence.by_month_day must be an array");
113
- for (const day of recurrenceRecord.by_month_day) {
114
- assertFrontMatterCondition(typeof day === "number" && Number.isInteger(day) && day >= 1 && day <= 31, "event.recurrence.by_month_day entries must be integers 1..31");
115
- }
116
- }
117
- if (recurrenceRecord.exdates !== undefined) {
118
- assertFrontMatterCondition(Array.isArray(recurrenceRecord.exdates), "event.recurrence.exdates must be an array");
119
- for (const exdate of recurrenceRecord.exdates) {
120
- assertFrontMatterCondition(typeof exdate === "string", "event.recurrence.exdates entries must be strings");
121
- assertFrontMatterCondition(isTimestampLiteral(exdate), "event.recurrence.exdates entries must be valid ISO timestamps");
122
- }
123
- }
145
+ assertPositiveIntegerField(recurrenceRecord, "interval", "event.recurrence.interval");
146
+ assertPositiveIntegerField(recurrenceRecord, "count", "event.recurrence.count");
147
+ assertOptionalTimestampString(recurrenceRecord, "until", "event.recurrence.until");
148
+ assertRecurrenceWeekdays(recurrenceRecord.by_weekday);
149
+ assertRecurrenceMonthDays(recurrenceRecord.by_month_day);
150
+ assertRecurrenceExdates(recurrenceRecord.exdates);
124
151
  }
125
- function assertValidFrontMatter(frontMatter, runtimeContext) {
126
- assertFrontMatterCondition(typeof frontMatter === "object" && frontMatter !== null && !Array.isArray(frontMatter), "front matter must be an object");
127
- const record = frontMatter;
152
+ function assertRequiredFrontMatterFields(record) {
128
153
  for (const fieldName of REQUIRED_STRING_FIELDS) {
129
154
  assertFrontMatterCondition(typeof record[fieldName] === "string", `${fieldName} is required and must be a string`);
130
155
  }
@@ -134,6 +159,9 @@ function assertValidFrontMatter(frontMatter, runtimeContext) {
134
159
  if (formatVersion !== undefined) {
135
160
  assertFrontMatterCondition(typeof formatVersion === "number" && Number.isInteger(formatVersion) && formatVersion >= BASELINE_ITEM_FORMAT_VERSION, `pm_format_version must be an integer >= ${BASELINE_ITEM_FORMAT_VERSION}`);
136
161
  }
162
+ return itemType;
163
+ }
164
+ function assertStatusFrontMatterField(record, runtimeContext) {
137
165
  const status = record.status;
138
166
  assertFrontMatterCondition(typeof status === "string" && status.trim().length > 0, "status must be a non-empty string");
139
167
  const statusRegistry = runtimeContext?.statusRegistry;
@@ -142,6 +170,8 @@ function assertValidFrontMatter(frontMatter, runtimeContext) {
142
170
  ? statusRegistry.definitions.map((definition) => definition.id)
143
171
  : [...STATUS_VALUES];
144
172
  assertFrontMatterCondition(normalizedStatus !== undefined, `status must be one of: ${statusDomain.join(", ")}`);
173
+ }
174
+ function assertPriorityAndTags(record) {
145
175
  const priority = record.priority;
146
176
  assertFrontMatterCondition(typeof priority === "number" && Number.isInteger(priority) && [0, 1, 2, 3, 4].includes(priority), "priority must be an integer 0..4");
147
177
  const tags = record.tags;
@@ -149,133 +179,178 @@ function assertValidFrontMatter(frontMatter, runtimeContext) {
149
179
  for (const tag of tags) {
150
180
  assertFrontMatterCondition(typeof tag === "string", "tags entries must be strings");
151
181
  }
182
+ }
183
+ function assertConfidenceFrontMatterField(record) {
152
184
  const confidence = record.confidence;
153
- if (confidence !== undefined) {
154
- if (typeof confidence === "number") {
155
- assertFrontMatterCondition(Number.isInteger(confidence) && confidence >= 0 && confidence <= 100, "confidence number value must be an integer 0..100");
156
- }
157
- else if (typeof confidence === "string") {
158
- const normalizedConfidence = confidence.trim().toLowerCase();
159
- const isKnownTextConfidence = normalizedConfidence === "med" || CONFIDENCE_TEXT_VALUES.includes(normalizedConfidence);
160
- assertFrontMatterCondition(isKnownTextConfidence, `confidence string value must be one of: ${[...CONFIDENCE_TEXT_VALUES, "med"].join(", ")}`);
161
- }
162
- else {
163
- assertFrontMatterCondition(false, "confidence must be a number or string");
164
- }
185
+ if (confidence === undefined) {
186
+ return;
187
+ }
188
+ if (typeof confidence === "number") {
189
+ assertFrontMatterCondition(Number.isInteger(confidence) && confidence >= 0 && confidence <= 100, "confidence number value must be an integer 0..100");
190
+ return;
165
191
  }
192
+ if (typeof confidence === "string") {
193
+ const normalizedConfidence = confidence.trim().toLowerCase();
194
+ const isKnownTextConfidence = normalizedConfidence === "med" || CONFIDENCE_TEXT_VALUES.includes(normalizedConfidence);
195
+ assertFrontMatterCondition(isKnownTextConfidence, `confidence string value must be one of: ${[...CONFIDENCE_TEXT_VALUES, "med"].join(", ")}`);
196
+ return;
197
+ }
198
+ assertFrontMatterCondition(false, "confidence must be a number or string");
199
+ }
200
+ function assertSeverityFrontMatterField(record) {
166
201
  const severity = record.severity;
167
- if (severity !== undefined) {
168
- if (typeof severity !== "string") {
169
- validationError("severity must be a string");
170
- }
171
- const normalizedSeverity = severity.trim().toLowerCase();
172
- const isKnownSeverity = normalizedSeverity === "med" || ISSUE_SEVERITY_VALUES.includes(normalizedSeverity);
173
- assertFrontMatterCondition(isKnownSeverity, `severity value must be one of: ${[...ISSUE_SEVERITY_VALUES, "med"].join(", ")}`);
174
- }
175
- const regression = record.regression;
176
- if (regression !== undefined) {
177
- if (typeof regression !== "boolean") {
178
- validationError("regression must be a boolean");
179
- }
202
+ if (severity === undefined) {
203
+ return;
180
204
  }
181
- assertTimestampField(record, "created_at");
182
- assertTimestampField(record, "updated_at");
183
- if (record.deadline !== undefined) {
184
- assertTimestampField(record, "deadline");
205
+ if (typeof severity !== "string") {
206
+ validationError("severity must be a string");
185
207
  }
186
- if (record.reminders !== undefined) {
187
- const reminders = record.reminders;
188
- assertFrontMatterCondition(Array.isArray(reminders), "reminders must be an array");
189
- for (const reminder of reminders) {
190
- assertFrontMatterCondition(typeof reminder === "object" && reminder !== null && !Array.isArray(reminder), "reminders entries must be objects");
191
- const reminderRecord = reminder;
192
- assertFrontMatterCondition(typeof reminderRecord.at === "string", "reminder.at must be a string");
193
- assertFrontMatterCondition(isTimestampLiteral(reminderRecord.at), "reminder.at must be a valid ISO timestamp");
194
- assertFrontMatterCondition(typeof reminderRecord.text === "string", "reminder.text must be a string");
195
- assertFrontMatterCondition(reminderRecord.text.trim().length > 0, "reminder.text must not be empty");
196
- }
208
+ const normalizedSeverity = severity.trim().toLowerCase();
209
+ const isKnownSeverity = normalizedSeverity === "med" || ISSUE_SEVERITY_VALUES.includes(normalizedSeverity);
210
+ assertFrontMatterCondition(isKnownSeverity, `severity value must be one of: ${[...ISSUE_SEVERITY_VALUES, "med"].join(", ")}`);
211
+ }
212
+ function assertRegressionFrontMatterField(record) {
213
+ if (record.regression !== undefined && typeof record.regression !== "boolean") {
214
+ validationError("regression must be a boolean");
197
215
  }
198
- if (record.events !== undefined) {
199
- const events = record.events;
200
- assertFrontMatterCondition(Array.isArray(events), "events must be an array");
201
- for (const event of events) {
202
- assertFrontMatterCondition(typeof event === "object" && event !== null && !Array.isArray(event), "events entries must be objects");
203
- const eventRecord = event;
204
- assertFrontMatterCondition(typeof eventRecord.start_at === "string", "event.start_at must be a string");
205
- assertFrontMatterCondition(isTimestampLiteral(eventRecord.start_at), "event.start_at must be a valid ISO timestamp");
206
- if (eventRecord.end_at !== undefined) {
207
- assertFrontMatterCondition(typeof eventRecord.end_at === "string", "event.end_at must be a string");
208
- assertFrontMatterCondition(isTimestampLiteral(eventRecord.end_at), "event.end_at must be a valid ISO timestamp");
209
- assertFrontMatterCondition(compareTimestampStrings(eventRecord.end_at, eventRecord.start_at) > 0, "event.end_at must be after event.start_at");
210
- }
211
- for (const stringField of ["title", "description", "location", "timezone"]) {
212
- if (eventRecord[stringField] !== undefined) {
213
- assertFrontMatterCondition(typeof eventRecord[stringField] === "string", `event.${stringField} must be a string`);
214
- assertFrontMatterCondition(eventRecord[stringField].trim().length > 0, `event.${stringField} must not be empty`);
215
- }
216
- }
217
- if (eventRecord.all_day !== undefined) {
218
- assertFrontMatterCondition(typeof eventRecord.all_day === "boolean", "event.all_day must be a boolean");
219
- }
220
- if (eventRecord.recurrence !== undefined) {
221
- assertValidRecurrenceRule(eventRecord.recurrence);
222
- if (eventRecord.recurrence.until !== undefined) {
223
- assertFrontMatterCondition(compareTimestampStrings(eventRecord.recurrence.until, eventRecord.start_at) >= 0, "event.recurrence.until must be at or after event.start_at");
224
- }
225
- }
216
+ }
217
+ function assertReminderEntries(record) {
218
+ const reminders = record.reminders;
219
+ if (reminders === undefined) {
220
+ return;
221
+ }
222
+ assertFrontMatterCondition(Array.isArray(reminders), "reminders must be an array");
223
+ for (const reminder of reminders) {
224
+ assertFrontMatterCondition(typeof reminder === "object" && reminder !== null && !Array.isArray(reminder), "reminders entries must be objects");
225
+ const reminderRecord = reminder;
226
+ assertFrontMatterCondition(typeof reminderRecord.at === "string", "reminder.at must be a string");
227
+ assertFrontMatterCondition(isTimestampLiteral(reminderRecord.at), "reminder.at must be a valid ISO timestamp");
228
+ assertFrontMatterCondition(typeof reminderRecord.text === "string", "reminder.text must be a string");
229
+ assertFrontMatterCondition(reminderRecord.text.trim().length > 0, "reminder.text must not be empty");
230
+ }
231
+ }
232
+ function assertEventStringFields(eventRecord) {
233
+ for (const stringField of ["title", "description", "location", "timezone"]) {
234
+ if (eventRecord[stringField] !== undefined) {
235
+ assertFrontMatterCondition(typeof eventRecord[stringField] === "string", `event.${stringField} must be a string`);
236
+ assertFrontMatterCondition(eventRecord[stringField].trim().length > 0, `event.${stringField} must not be empty`);
226
237
  }
227
238
  }
228
- if (record.closed_at !== undefined) {
229
- const closedAt = record.closed_at;
230
- assertFrontMatterCondition(typeof closedAt === "string", "closed_at must be a string");
231
- assertFrontMatterCondition(isTimestampLiteral(closedAt), "closed_at must be a valid ISO timestamp");
239
+ }
240
+ function assertEventRecurrence(eventRecord) {
241
+ if (eventRecord.recurrence === undefined) {
242
+ return;
243
+ }
244
+ assertValidRecurrenceRule(eventRecord.recurrence);
245
+ if (eventRecord.recurrence.until !== undefined) {
246
+ assertFrontMatterCondition(compareTimestampStrings(eventRecord.recurrence.until, eventRecord.start_at) >= 0, "event.recurrence.until must be at or after event.start_at");
232
247
  }
248
+ }
249
+ function assertCalendarEventEntry(event) {
250
+ assertFrontMatterCondition(typeof event === "object" && event !== null && !Array.isArray(event), "events entries must be objects");
251
+ const eventRecord = event;
252
+ assertFrontMatterCondition(typeof eventRecord.start_at === "string", "event.start_at must be a string");
253
+ assertFrontMatterCondition(isTimestampLiteral(eventRecord.start_at), "event.start_at must be a valid ISO timestamp");
254
+ if (eventRecord.end_at !== undefined) {
255
+ assertFrontMatterCondition(typeof eventRecord.end_at === "string", "event.end_at must be a string");
256
+ assertFrontMatterCondition(isTimestampLiteral(eventRecord.end_at), "event.end_at must be a valid ISO timestamp");
257
+ assertFrontMatterCondition(compareTimestampStrings(eventRecord.end_at, eventRecord.start_at) > 0, "event.end_at must be after event.start_at");
258
+ }
259
+ assertEventStringFields(eventRecord);
260
+ if (eventRecord.all_day !== undefined) {
261
+ assertFrontMatterCondition(typeof eventRecord.all_day === "boolean", "event.all_day must be a boolean");
262
+ }
263
+ assertEventRecurrence(eventRecord);
264
+ }
265
+ function assertCalendarEvents(record) {
266
+ const events = record.events;
267
+ if (events === undefined) {
268
+ return;
269
+ }
270
+ assertFrontMatterCondition(Array.isArray(events), "events must be an array");
271
+ for (const event of events) {
272
+ assertCalendarEventEntry(event);
273
+ }
274
+ }
275
+ function assertOptionalStringFields(record) {
233
276
  for (const fieldName of ["source_type", "source_owner", "design", "external_ref"]) {
234
277
  const value = record[fieldName];
235
278
  if (value !== undefined) {
236
279
  assertFrontMatterCondition(typeof value === "string", `${fieldName} must be a string`);
237
280
  }
238
281
  }
282
+ }
283
+ function assertTypeOptionsField(record) {
239
284
  const typeOptions = record.type_options;
240
- if (typeOptions !== undefined) {
241
- assertFrontMatterCondition(typeof typeOptions === "object" && typeOptions !== null && !Array.isArray(typeOptions), "type_options must be an object");
242
- for (const [optionKey, optionValue] of Object.entries(typeOptions)) {
243
- assertFrontMatterCondition(optionKey.trim().length > 0, "type_options keys must be non-empty");
244
- assertFrontMatterCondition(typeof optionValue === "string", "type_options values must be strings");
245
- const optionText = optionValue;
246
- assertFrontMatterCondition(optionText.trim().length > 0, "type_options values must be non-empty strings");
247
- }
285
+ if (typeOptions === undefined) {
286
+ return;
248
287
  }
249
- if (runtimeContext?.fieldRegistry) {
250
- for (const definition of runtimeContext.fieldRegistry.definitions) {
251
- const fieldValue = record[definition.metadata_key];
252
- if (fieldValue === undefined) {
253
- if (runtimeFieldRequiredForType(definition, itemType)) {
254
- validationError(`missing required schema field: ${definition.metadata_key}`);
255
- }
256
- continue;
257
- }
258
- try {
259
- record[definition.metadata_key] = coerceRuntimeFieldValue(definition, fieldValue, `metadata field "${definition.metadata_key}"`);
260
- }
261
- catch (error) {
262
- validationError(String(error?.message).replace(/^Invalid\s+/u, ""));
263
- }
264
- }
288
+ assertFrontMatterCondition(typeof typeOptions === "object" && typeOptions !== null && !Array.isArray(typeOptions), "type_options must be an object");
289
+ for (const [optionKey, optionValue] of Object.entries(typeOptions)) {
290
+ assertFrontMatterCondition(optionKey.trim().length > 0, "type_options keys must be non-empty");
291
+ assertFrontMatterCondition(typeof optionValue === "string", "type_options values must be strings");
292
+ const optionText = optionValue;
293
+ assertFrontMatterCondition(optionText.trim().length > 0, "type_options values must be non-empty strings");
265
294
  }
266
- if (runtimeContext && runtimeContext.unknownFieldPolicy !== "allow") {
267
- const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
268
- const unknownKeys = Object.keys(record).filter((key) => !knownKeys.has(key)).sort((left, right) => left.localeCompare(right));
269
- if (unknownKeys.length > 0) {
270
- if (runtimeContext.unknownFieldPolicy === "reject") {
271
- validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
272
- }
273
- else {
274
- runtimeContext.onWarning?.(`item_unknown_schema_fields:${unknownKeys.join(",")}`);
295
+ }
296
+ function coerceRuntimeFrontMatterFields(record, itemType, runtimeContext) {
297
+ if (!runtimeContext?.fieldRegistry) {
298
+ return;
299
+ }
300
+ for (const definition of runtimeContext.fieldRegistry.definitions) {
301
+ const fieldValue = record[definition.metadata_key];
302
+ if (fieldValue === undefined) {
303
+ if (runtimeFieldRequiredForType(definition, itemType)) {
304
+ validationError(`missing required schema field: ${definition.metadata_key}`);
275
305
  }
306
+ continue;
307
+ }
308
+ try {
309
+ record[definition.metadata_key] = coerceRuntimeFieldValue(definition, fieldValue, `metadata field "${definition.metadata_key}"`);
310
+ }
311
+ catch (error) {
312
+ validationError(String(error?.message).replace(/^Invalid\s+/u, ""));
276
313
  }
277
314
  }
278
315
  }
316
+ function assertRuntimeUnknownFrontMatterFields(record, runtimeContext) {
317
+ if (!runtimeContext || runtimeContext.unknownFieldPolicy === "allow") {
318
+ return;
319
+ }
320
+ const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
321
+ const unknownKeys = Object.keys(record).filter((key) => !knownKeys.has(key)).sort((left, right) => left.localeCompare(right));
322
+ if (unknownKeys.length === 0) {
323
+ return;
324
+ }
325
+ if (runtimeContext.unknownFieldPolicy === "reject") {
326
+ validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
327
+ }
328
+ else {
329
+ runtimeContext.onWarning?.(`item_unknown_schema_fields:${unknownKeys.join(",")}`);
330
+ }
331
+ }
332
+ function assertValidFrontMatter(frontMatter, runtimeContext) {
333
+ assertFrontMatterCondition(typeof frontMatter === "object" && frontMatter !== null && !Array.isArray(frontMatter), "front matter must be an object");
334
+ const record = frontMatter;
335
+ const itemType = assertRequiredFrontMatterFields(record);
336
+ assertStatusFrontMatterField(record, runtimeContext);
337
+ assertPriorityAndTags(record);
338
+ assertConfidenceFrontMatterField(record);
339
+ assertSeverityFrontMatterField(record);
340
+ assertRegressionFrontMatterField(record);
341
+ assertTimestampField(record, "created_at");
342
+ assertTimestampField(record, "updated_at");
343
+ if (record.deadline !== undefined) {
344
+ assertTimestampField(record, "deadline");
345
+ }
346
+ assertReminderEntries(record);
347
+ assertCalendarEvents(record);
348
+ assertOptionalTimestampString(record, "closed_at", "closed_at");
349
+ assertOptionalStringFields(record);
350
+ assertTypeOptionsField(record);
351
+ coerceRuntimeFrontMatterFields(record, itemType, runtimeContext);
352
+ assertRuntimeUnknownFrontMatterFields(record, runtimeContext);
353
+ }
279
354
  function sortDependencies(values) {
280
355
  if (!values || values.length === 0)
281
356
  return undefined;
@@ -365,54 +440,38 @@ function normalizeRecurrenceRule(value) {
365
440
  return normalized;
366
441
  }
367
442
  function sortEvents(values) {
368
- if (!values || values.length === 0) {
443
+ if (!Array.isArray(values) || values.length === 0) {
369
444
  return undefined;
370
445
  }
371
- const normalized = [...values]
372
- .map((value) => {
373
- const event = {
374
- start_at: value.start_at,
375
- end_at: value.end_at || undefined,
376
- title: value.title?.trim() || undefined,
377
- description: value.description?.trim() || undefined,
378
- location: value.location?.trim() || undefined,
379
- all_day: value.all_day,
380
- timezone: value.timezone?.trim() || undefined,
381
- recurrence: normalizeRecurrenceRule(value.recurrence),
382
- };
383
- for (const [key, fieldValue] of Object.entries(event)) {
384
- if (fieldValue === undefined) {
385
- delete event[key];
386
- }
387
- }
388
- return event;
389
- })
390
- .sort((a, b) => {
391
- const byStart = compareTimestampStrings(a.start_at, b.start_at);
392
- if (byStart !== 0)
393
- return byStart;
394
- const byEnd = (a.end_at ?? "").localeCompare(b.end_at ?? "");
395
- if (byEnd !== 0)
396
- return byEnd;
397
- const byTitle = (a.title ?? "").localeCompare(b.title ?? "");
398
- if (byTitle !== 0)
399
- return byTitle;
400
- const byAllDay = Number(Boolean(a.all_day)) - Number(Boolean(b.all_day));
401
- if (byAllDay !== 0)
402
- return byAllDay;
403
- const byTimezone = (a.timezone ?? "").localeCompare(b.timezone ?? "");
404
- if (byTimezone !== 0)
405
- return byTimezone;
406
- const byLocation = (a.location ?? "").localeCompare(b.location ?? "");
407
- if (byLocation !== 0)
408
- return byLocation;
409
- const byDescription = (a.description ?? "").localeCompare(b.description ?? "");
410
- if (byDescription !== 0)
411
- return byDescription;
412
- return JSON.stringify(a.recurrence ?? {}).localeCompare(JSON.stringify(b.recurrence ?? {}));
413
- });
446
+ const normalized = [...values].map(normalizeCalendarEvent).sort(compareCalendarEvents);
414
447
  return normalized;
415
448
  }
449
+ function normalizeCalendarEvent(value) {
450
+ const event = {
451
+ start_at: value.start_at,
452
+ end_at: value.end_at || undefined,
453
+ title: value.title?.trim() || undefined,
454
+ description: value.description?.trim() || undefined,
455
+ location: value.location?.trim() || undefined,
456
+ all_day: value.all_day,
457
+ timezone: value.timezone?.trim() || undefined,
458
+ recurrence: normalizeRecurrenceRule(value.recurrence),
459
+ };
460
+ deleteUndefinedFields(event);
461
+ return event;
462
+ }
463
+ function compareCalendarEvents(a, b) {
464
+ return firstNonZeroComparison([
465
+ compareTimestampStrings(a.start_at, b.start_at),
466
+ (a.end_at ?? "").localeCompare(b.end_at ?? ""),
467
+ (a.title ?? "").localeCompare(b.title ?? ""),
468
+ Number(Boolean(a.all_day)) - Number(Boolean(b.all_day)),
469
+ (a.timezone ?? "").localeCompare(b.timezone ?? ""),
470
+ (a.location ?? "").localeCompare(b.location ?? ""),
471
+ (a.description ?? "").localeCompare(b.description ?? ""),
472
+ JSON.stringify(a.recurrence ?? {}).localeCompare(JSON.stringify(b.recurrence ?? {})),
473
+ ]);
474
+ }
416
475
  function normalizeFiles(values) {
417
476
  if (!values || values.length === 0)
418
477
  return undefined;
@@ -427,41 +486,7 @@ function normalizeTestRunSummaries(values) {
427
486
  if (!values || values.length === 0)
428
487
  return undefined;
429
488
  const normalized = values
430
- .map((value) => {
431
- const runId = typeof value.run_id === "string" ? value.run_id.trim() : "";
432
- const kind = value.kind === "test" || value.kind === "test-all" ? value.kind : "test";
433
- const status = value.status === "passed" || value.status === "failed" || value.status === "stopped" || value.status === "canceled"
434
- ? value.status
435
- : "failed";
436
- const startedAt = typeof value.started_at === "string" ? value.started_at : "";
437
- const finishedAt = typeof value.finished_at === "string" ? value.finished_at : "";
438
- const recordedAt = typeof value.recorded_at === "string" ? value.recorded_at : "";
439
- const passed = typeof value.passed === "number" && Number.isFinite(value.passed) ? Math.max(0, Math.floor(value.passed)) : 0;
440
- const failed = typeof value.failed === "number" && Number.isFinite(value.failed) ? Math.max(0, Math.floor(value.failed)) : 0;
441
- const skipped = typeof value.skipped === "number" && Number.isFinite(value.skipped) ? Math.max(0, Math.floor(value.skipped)) : 0;
442
- return {
443
- run_id: runId,
444
- kind,
445
- status,
446
- started_at: startedAt,
447
- finished_at: finishedAt,
448
- recorded_at: recordedAt,
449
- attempt: typeof value.attempt === "number" && Number.isFinite(value.attempt) && value.attempt >= 1
450
- ? Math.floor(value.attempt)
451
- : undefined,
452
- resumed_from: value.resumed_from?.trim() || undefined,
453
- passed,
454
- failed,
455
- skipped,
456
- items: typeof value.items === "number" && Number.isFinite(value.items) && value.items >= 0
457
- ? Math.floor(value.items)
458
- : undefined,
459
- linked_tests: typeof value.linked_tests === "number" && Number.isFinite(value.linked_tests) && value.linked_tests >= 0
460
- ? Math.floor(value.linked_tests)
461
- : undefined,
462
- fail_on_skipped_triggered: value.fail_on_skipped_triggered === true ? true : undefined,
463
- };
464
- })
489
+ .map(normalizeTestRunSummary)
465
490
  .filter((value) => value.run_id.length > 0 && value.started_at.length > 0 && value.finished_at.length > 0 && value.recorded_at.length > 0)
466
491
  .sort((a, b) => firstNonZeroComparison([
467
492
  compareTimestampStrings(a.recorded_at, b.recorded_at),
@@ -470,83 +495,144 @@ function normalizeTestRunSummaries(values) {
470
495
  ]));
471
496
  return normalized.length > 0 ? normalized : undefined;
472
497
  }
498
+ function normalizeNonNegativeInteger(value) {
499
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : undefined;
500
+ }
501
+ function normalizePositiveInteger(value) {
502
+ return typeof value === "number" && Number.isFinite(value) && value >= 1 ? Math.floor(value) : undefined;
503
+ }
504
+ function stringOrEmpty(value) {
505
+ return typeof value === "string" ? value : "";
506
+ }
507
+ function normalizeTestRunSummary(value) {
508
+ const runId = typeof value.run_id === "string" ? value.run_id.trim() : "";
509
+ const kind = value.kind === "test" || value.kind === "test-all" ? value.kind : "test";
510
+ const status = ITEM_TEST_RUN_STATUS_VALUES.has(value.status) ? value.status : "failed";
511
+ const summary = {
512
+ run_id: runId,
513
+ kind,
514
+ status,
515
+ started_at: stringOrEmpty(value.started_at),
516
+ finished_at: stringOrEmpty(value.finished_at),
517
+ recorded_at: stringOrEmpty(value.recorded_at),
518
+ attempt: normalizePositiveInteger(value.attempt),
519
+ resumed_from: value.resumed_from?.trim() || undefined,
520
+ passed: normalizeNonNegativeInteger(value.passed) ?? 0,
521
+ failed: normalizeNonNegativeInteger(value.failed) ?? 0,
522
+ skipped: normalizeNonNegativeInteger(value.skipped) ?? 0,
523
+ items: normalizeNonNegativeInteger(value.items),
524
+ linked_tests: normalizeNonNegativeInteger(value.linked_tests),
525
+ fail_on_skipped_triggered: value.fail_on_skipped_triggered === true ? true : undefined,
526
+ };
527
+ deleteUndefinedFields(summary);
528
+ return summary;
529
+ }
473
530
  function sortTests(values) {
474
- if (!values || values.length === 0)
531
+ if (!Array.isArray(values) || values.length === 0)
475
532
  return undefined;
476
- return [...values]
477
- .map((value) => ({
533
+ return [...values].map(normalizeLinkedTest).sort(compareLinkedTests);
534
+ }
535
+ function normalizeTrimmedStringList(value) {
536
+ if (!Array.isArray(value)) {
537
+ return undefined;
538
+ }
539
+ const normalized = [
540
+ ...new Set(value
541
+ .filter((entry) => typeof entry === "string")
542
+ .map((entry) => entry.trim())
543
+ .filter((entry) => entry.length > 0)),
544
+ ].sort((a, b) => a.localeCompare(b));
545
+ return normalized.length > 0 ? normalized : undefined;
546
+ }
547
+ function isPlainObjectRecord(value) {
548
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
549
+ return false;
550
+ }
551
+ const prototype = Object.getPrototypeOf(value);
552
+ return prototype === Object.prototype || prototype === null;
553
+ }
554
+ function isUnsafeObjectKey(key) {
555
+ return key === "__proto__" || key === "constructor" || key === "prototype";
556
+ }
557
+ function normalizeStringRecord(value) {
558
+ if (!isPlainObjectRecord(value)) {
559
+ return undefined;
560
+ }
561
+ const entries = Object.entries(value)
562
+ .map(([key, recordValue]) => [key.trim(), String(recordValue).trim()])
563
+ .filter(([key, recordValue]) => key.length > 0 && !isUnsafeObjectKey(key) && recordValue.length > 0)
564
+ .sort(([left], [right]) => left.localeCompare(right));
565
+ return entries.length > 0 ? Object.fromEntries(entries) : undefined;
566
+ }
567
+ function normalizeNumericRecord(value) {
568
+ if (!isPlainObjectRecord(value)) {
569
+ return undefined;
570
+ }
571
+ const entries = Object.entries(value)
572
+ .map(([key, recordValue]) => [key.trim(), Number(recordValue)])
573
+ .filter(([key, recordValue]) => key.length > 0 && !isUnsafeObjectKey(key) && Number.isFinite(recordValue))
574
+ .sort(([left], [right]) => left.localeCompare(right));
575
+ return entries.length > 0 ? Object.fromEntries(entries) : undefined;
576
+ }
577
+ function normalizeLinkedTestContextMode(value) {
578
+ const normalized = value?.trim().toLowerCase();
579
+ if (!normalized || !LINKED_TEST_PM_CONTEXT_MODE_VALUES.has(normalized)) {
580
+ return undefined;
581
+ }
582
+ return normalized;
583
+ }
584
+ function normalizeLinkedTest(value) {
585
+ const test = {
478
586
  command: value.command?.trim() || undefined,
479
587
  path: value.path ? normalizePathValue(value.path) : undefined,
480
588
  scope: value.scope,
481
589
  timeout_seconds: typeof value.timeout_seconds === "number" && Number.isFinite(value.timeout_seconds) && value.timeout_seconds > 0
482
590
  ? value.timeout_seconds
483
591
  : undefined,
484
- pm_context_mode: (() => {
485
- const normalized = value.pm_context_mode?.trim().toLowerCase();
486
- if (!normalized || !LINKED_TEST_PM_CONTEXT_MODE_VALUES.has(normalized)) {
487
- return undefined;
488
- }
489
- return normalized;
490
- })(),
491
- env_set: value.env_set
492
- ? Object.fromEntries(Object.entries(value.env_set)
493
- .map(([key, envValue]) => [key.trim(), String(envValue).trim()])
494
- .filter(([key, envValue]) => key.length > 0 && envValue.length > 0)
495
- .sort(([left], [right]) => left.localeCompare(right)))
496
- : undefined,
497
- env_clear: value.env_clear
498
- ? [...new Set(value.env_clear.map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) => a.localeCompare(b))
499
- : undefined,
592
+ pm_context_mode: normalizeLinkedTestContextMode(value.pm_context_mode),
593
+ env_set: normalizeStringRecord(value.env_set),
594
+ env_clear: normalizeTrimmedStringList(value.env_clear),
500
595
  shared_host_safe: value.shared_host_safe === true ? true : undefined,
501
- assert_stdout_contains: value.assert_stdout_contains
502
- ? [...new Set(value.assert_stdout_contains.map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) => a.localeCompare(b))
503
- : undefined,
504
- assert_stdout_regex: value.assert_stdout_regex
505
- ? [...new Set(value.assert_stdout_regex.map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) => a.localeCompare(b))
506
- : undefined,
507
- assert_stderr_contains: value.assert_stderr_contains
508
- ? [...new Set(value.assert_stderr_contains.map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) => a.localeCompare(b))
509
- : undefined,
510
- assert_stderr_regex: value.assert_stderr_regex
511
- ? [...new Set(value.assert_stderr_regex.map((entry) => entry.trim()).filter((entry) => entry.length > 0))].sort((a, b) => a.localeCompare(b))
512
- : undefined,
513
- assert_stdout_min_lines: typeof value.assert_stdout_min_lines === "number" &&
514
- Number.isFinite(value.assert_stdout_min_lines) &&
515
- value.assert_stdout_min_lines >= 0
516
- ? Math.floor(value.assert_stdout_min_lines)
517
- : undefined,
518
- assert_json_field_equals: value.assert_json_field_equals
519
- ? Object.fromEntries(Object.entries(value.assert_json_field_equals)
520
- .map(([key, expectedValue]) => [key.trim(), String(expectedValue).trim()])
521
- .filter(([key, expectedValue]) => key.length > 0 && expectedValue.length > 0)
522
- .sort(([left], [right]) => left.localeCompare(right)))
523
- : undefined,
524
- assert_json_field_gte: value.assert_json_field_gte
525
- ? Object.fromEntries(Object.entries(value.assert_json_field_gte)
526
- .map(([key, expectedValue]) => [key.trim(), Number(expectedValue)])
527
- .filter(([key, expectedValue]) => key.length > 0 && Number.isFinite(expectedValue))
528
- .sort(([left], [right]) => left.localeCompare(right)))
529
- : undefined,
596
+ assert_stdout_contains: normalizeTrimmedStringList(value.assert_stdout_contains),
597
+ assert_stdout_regex: normalizeTrimmedStringList(value.assert_stdout_regex),
598
+ assert_stderr_contains: normalizeTrimmedStringList(value.assert_stderr_contains),
599
+ assert_stderr_regex: normalizeTrimmedStringList(value.assert_stderr_regex),
600
+ assert_stdout_min_lines: normalizeNonNegativeInteger(value.assert_stdout_min_lines),
601
+ assert_json_field_equals: normalizeStringRecord(value.assert_json_field_equals),
602
+ assert_json_field_gte: normalizeNumericRecord(value.assert_json_field_gte),
530
603
  note: value.note?.trim() || undefined,
531
- }))
532
- .sort((a, b) => firstNonZeroComparison([
604
+ };
605
+ deleteUndefinedFields(test);
606
+ return test;
607
+ }
608
+ function compareLinkedTests(a, b) {
609
+ return firstNonZeroComparison([
533
610
  a.scope.localeCompare(b.scope),
534
- (a.path ?? "").localeCompare(b.path ?? ""),
535
- (a.command ?? "").localeCompare(b.command ?? ""),
536
- (a.timeout_seconds ?? 0) - (b.timeout_seconds ?? 0),
537
- (a.pm_context_mode ?? "").localeCompare(b.pm_context_mode ?? ""),
611
+ compareOptionalStrings(a.path, b.path),
612
+ compareOptionalStrings(a.command, b.command),
613
+ compareOptionalNumbers(a.timeout_seconds, b.timeout_seconds),
614
+ compareOptionalStrings(a.pm_context_mode, b.pm_context_mode),
538
615
  Number(Boolean(a.shared_host_safe)) - Number(Boolean(b.shared_host_safe)),
539
- JSON.stringify(a.env_clear ?? []).localeCompare(JSON.stringify(b.env_clear ?? [])),
540
- JSON.stringify(a.env_set ?? {}).localeCompare(JSON.stringify(b.env_set ?? {})),
541
- JSON.stringify(a.assert_stdout_contains ?? []).localeCompare(JSON.stringify(b.assert_stdout_contains ?? [])),
542
- JSON.stringify(a.assert_stdout_regex ?? []).localeCompare(JSON.stringify(b.assert_stdout_regex ?? [])),
543
- JSON.stringify(a.assert_stderr_contains ?? []).localeCompare(JSON.stringify(b.assert_stderr_contains ?? [])),
544
- JSON.stringify(a.assert_stderr_regex ?? []).localeCompare(JSON.stringify(b.assert_stderr_regex ?? [])),
545
- (a.assert_stdout_min_lines ?? 0) - (b.assert_stdout_min_lines ?? 0),
546
- JSON.stringify(a.assert_json_field_equals ?? {}).localeCompare(JSON.stringify(b.assert_json_field_equals ?? {})),
547
- JSON.stringify(a.assert_json_field_gte ?? {}).localeCompare(JSON.stringify(b.assert_json_field_gte ?? {})),
548
- (a.note ?? "").localeCompare(b.note ?? ""),
549
- ]));
616
+ compareJsonValues(a.env_clear, b.env_clear, []),
617
+ compareJsonValues(a.env_set, b.env_set, {}),
618
+ compareJsonValues(a.assert_stdout_contains, b.assert_stdout_contains, []),
619
+ compareJsonValues(a.assert_stdout_regex, b.assert_stdout_regex, []),
620
+ compareJsonValues(a.assert_stderr_contains, b.assert_stderr_contains, []),
621
+ compareJsonValues(a.assert_stderr_regex, b.assert_stderr_regex, []),
622
+ compareOptionalNumbers(a.assert_stdout_min_lines, b.assert_stdout_min_lines),
623
+ compareJsonValues(a.assert_json_field_equals, b.assert_json_field_equals, {}),
624
+ compareJsonValues(a.assert_json_field_gte, b.assert_json_field_gte, {}),
625
+ compareOptionalStrings(a.note, b.note),
626
+ ]);
627
+ }
628
+ function compareOptionalStrings(left, right) {
629
+ return (left ?? "").localeCompare(right ?? "");
630
+ }
631
+ function compareOptionalNumbers(left, right) {
632
+ return (left ?? 0) - (right ?? 0);
633
+ }
634
+ function compareJsonValues(left, right, fallback) {
635
+ return JSON.stringify(left ?? fallback).localeCompare(JSON.stringify(right ?? fallback));
550
636
  }
551
637
  function sortDocs(values) {
552
638
  if (!values || values.length === 0)
@@ -661,65 +747,75 @@ function normalizePlanStepDocs(value) {
661
747
  }
662
748
  return out.length > 0 ? out : undefined;
663
749
  }
750
+ function normalizePlanStepEntry(entry) {
751
+ if (entry === null || typeof entry !== "object") {
752
+ return undefined;
753
+ }
754
+ const record = entry;
755
+ const id = trimStringOrUndefined(record.id);
756
+ const title = trimStringOrUndefined(record.title);
757
+ const statusRaw = trimStringOrUndefined(record.status);
758
+ const status = statusRaw && PLAN_STEP_STATUS_SET.has(statusRaw) ? statusRaw : undefined;
759
+ const orderRaw = record.order;
760
+ const order = typeof orderRaw === "number" && Number.isFinite(orderRaw)
761
+ ? orderRaw
762
+ : typeof orderRaw === "string" && orderRaw.trim().length > 0
763
+ ? Number(orderRaw)
764
+ : Number.NaN;
765
+ const created_at = typeof record.created_at === "string" ? record.created_at : "";
766
+ const updated_at = typeof record.updated_at === "string" ? record.updated_at : "";
767
+ if (!id || !title || !status || !Number.isFinite(order) || !created_at || !updated_at) {
768
+ return undefined;
769
+ }
770
+ const step = {
771
+ id,
772
+ order,
773
+ title,
774
+ status,
775
+ created_at,
776
+ updated_at,
777
+ };
778
+ applyPlanStepOptionalFields(step, record);
779
+ return step;
780
+ }
781
+ function applyPlanStepOptionalFields(step, record) {
782
+ const stringFields = [
783
+ ["body", "body"],
784
+ ["owner", "owner"],
785
+ ["evidence", "evidence"],
786
+ ["blocked_reason", "blocked_reason"],
787
+ ["superseded_by", "superseded_by"],
788
+ ];
789
+ for (const [target, source] of stringFields) {
790
+ const value = trimStringOrUndefined(record[source]);
791
+ if (value) {
792
+ step[target] = value;
793
+ }
794
+ }
795
+ const completedAt = typeof record.completed_at === "string" ? record.completed_at : undefined;
796
+ if (completedAt && completedAt.length > 0) {
797
+ step.completed_at = completedAt;
798
+ }
799
+ const collectionFields = [
800
+ ["linked_items", "linked_items", normalizePlanStepLinks],
801
+ ["files", "files", normalizePlanStepFiles],
802
+ ["tests", "tests", normalizePlanStepTests],
803
+ ["docs", "docs", normalizePlanStepDocs],
804
+ ];
805
+ for (const [target, source, normalize] of collectionFields) {
806
+ const value = normalize(record[source]);
807
+ if (value) {
808
+ step[target] = value;
809
+ }
810
+ }
811
+ }
664
812
  function normalizePlanSteps(value) {
665
813
  if (!Array.isArray(value))
666
814
  return undefined;
667
- const out = [];
668
- for (const entry of value) {
669
- if (entry === null || typeof entry !== "object")
670
- continue;
671
- const record = entry;
672
- const id = trimStringOrUndefined(record.id);
673
- const title = trimStringOrUndefined(record.title);
674
- const status = trimStringOrUndefined(record.status);
675
- const orderRaw = record.order;
676
- const order = typeof orderRaw === "number" && Number.isFinite(orderRaw) ? orderRaw : Number(orderRaw);
677
- if (!id || !title || !status || !Number.isFinite(order))
678
- continue;
679
- const created_at = typeof record.created_at === "string" ? record.created_at : "";
680
- const updated_at = typeof record.updated_at === "string" ? record.updated_at : "";
681
- if (!created_at || !updated_at)
682
- continue;
683
- const step = {
684
- id,
685
- order,
686
- title,
687
- status: status,
688
- created_at,
689
- updated_at,
690
- };
691
- const body = trimStringOrUndefined(record.body);
692
- if (body)
693
- step.body = body;
694
- const owner = trimStringOrUndefined(record.owner);
695
- if (owner)
696
- step.owner = owner;
697
- const evidence = trimStringOrUndefined(record.evidence);
698
- if (evidence)
699
- step.evidence = evidence;
700
- const blockedReason = trimStringOrUndefined(record.blocked_reason);
701
- if (blockedReason)
702
- step.blocked_reason = blockedReason;
703
- const supersededBy = trimStringOrUndefined(record.superseded_by);
704
- if (supersededBy)
705
- step.superseded_by = supersededBy;
706
- const completedAt = typeof record.completed_at === "string" ? record.completed_at : undefined;
707
- if (completedAt && completedAt.length > 0)
708
- step.completed_at = completedAt;
709
- const links = normalizePlanStepLinks(record.linked_items);
710
- if (links)
711
- step.linked_items = links;
712
- const files = normalizePlanStepFiles(record.files);
713
- if (files)
714
- step.files = files;
715
- const tests = normalizePlanStepTests(record.tests);
716
- if (tests)
717
- step.tests = tests;
718
- const docs = normalizePlanStepDocs(record.docs);
719
- if (docs)
720
- step.docs = docs;
721
- out.push(step);
722
- }
815
+ const out = value.flatMap((entry) => {
816
+ const step = normalizePlanStepEntry(entry);
817
+ return step ? [step] : [];
818
+ });
723
819
  out.sort((left, right) => left.order - right.order);
724
820
  return out.length > 0 ? out : undefined;
725
821
  }
@@ -842,6 +938,48 @@ function normalizeSeverityValue(value) {
842
938
  }
843
939
  return undefined;
844
940
  }
941
+ function emptyStringToUndefined(value) {
942
+ return value || undefined;
943
+ }
944
+ function copyExtensionFrontMatterFields(normalized, source) {
945
+ const targetRecord = normalized;
946
+ const sourceRecord = source;
947
+ for (const [key, value] of Object.entries(sourceRecord)) {
948
+ if (isUnsafeObjectKey(key) || Object.prototype.hasOwnProperty.call(targetRecord, key) || value === undefined) {
949
+ continue;
950
+ }
951
+ targetRecord[key] = value;
952
+ }
953
+ }
954
+ function coerceNormalizedRuntimeFields(normalized, runtimeContext) {
955
+ if (!runtimeContext?.fieldRegistry) {
956
+ return;
957
+ }
958
+ const record = normalized;
959
+ for (const definition of runtimeContext.fieldRegistry.definitions) {
960
+ const currentValue = record[definition.metadata_key];
961
+ if (currentValue === undefined) {
962
+ continue;
963
+ }
964
+ record[definition.metadata_key] = coerceRuntimeFieldValue(definition, currentValue, `metadata field "${definition.metadata_key}"`);
965
+ }
966
+ }
967
+ function assertNormalizedUnknownFields(normalized, runtimeContext) {
968
+ if (!runtimeContext || runtimeContext.unknownFieldPolicy === "allow") {
969
+ return;
970
+ }
971
+ const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
972
+ const record = normalized;
973
+ const unknownKeys = Object.keys(record)
974
+ .filter((key) => !knownKeys.has(key))
975
+ .sort((left, right) => left.localeCompare(right));
976
+ if (unknownKeys.length > 0 && runtimeContext.unknownFieldPolicy === "reject") {
977
+ validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
978
+ }
979
+ if (unknownKeys.length > 0) {
980
+ runtimeContext.onWarning?.(`item_unknown_schema_fields:${unknownKeys.join(",")}`);
981
+ }
982
+ }
845
983
  /**
846
984
  * Implements normalize front matter for the public runtime surface of this module.
847
985
  */
@@ -855,7 +993,7 @@ export function normalizeFrontMatter(frontMatter, options = {}) {
855
993
  description: frontMatter.description,
856
994
  type: frontMatter.type,
857
995
  pm_format_version: normalizeItemFormatVersion(frontMatter.pm_format_version),
858
- source_type: frontMatter.source_type?.trim() || undefined,
996
+ source_type: trimStringOrUndefined(frontMatter.source_type),
859
997
  type_options: normalizeTypeOptions(frontMatter.type_options),
860
998
  status: normalizedStatus,
861
999
  priority: frontMatter.priority,
@@ -870,47 +1008,47 @@ export function normalizeFrontMatter(frontMatter, options = {}) {
870
1008
  tests: sortTests(frontMatter.tests),
871
1009
  test_runs: normalizeTestRunSummaries(frontMatter.test_runs),
872
1010
  docs: sortDocs(frontMatter.docs),
873
- deadline: frontMatter.deadline || undefined,
1011
+ deadline: emptyStringToUndefined(frontMatter.deadline),
874
1012
  reminders: sortReminders(frontMatter.reminders),
875
1013
  events: sortEvents(frontMatter.events),
876
- closed_at: frontMatter.closed_at || undefined,
877
- assignee: frontMatter.assignee?.trim() || undefined,
878
- source_owner: frontMatter.source_owner?.trim() || undefined,
879
- author: frontMatter.author || undefined,
1014
+ closed_at: emptyStringToUndefined(frontMatter.closed_at),
1015
+ assignee: trimStringOrUndefined(frontMatter.assignee),
1016
+ source_owner: trimStringOrUndefined(frontMatter.source_owner),
1017
+ author: emptyStringToUndefined(frontMatter.author),
880
1018
  estimated_minutes: frontMatter.estimated_minutes,
881
1019
  acceptance_criteria: frontMatter.acceptance_criteria ?? undefined,
882
1020
  design: frontMatter.design ?? undefined,
883
1021
  external_ref: frontMatter.external_ref ?? undefined,
884
- definition_of_ready: frontMatter.definition_of_ready?.trim() || undefined,
1022
+ definition_of_ready: trimStringOrUndefined(frontMatter.definition_of_ready),
885
1023
  order: frontMatter.order,
886
- goal: frontMatter.goal?.trim() || undefined,
887
- objective: frontMatter.objective?.trim() || undefined,
888
- value: frontMatter.value?.trim() || undefined,
889
- impact: frontMatter.impact?.trim() || undefined,
890
- outcome: frontMatter.outcome?.trim() || undefined,
891
- why_now: frontMatter.why_now?.trim() || undefined,
892
- parent: frontMatter.parent?.trim() || undefined,
893
- reviewer: frontMatter.reviewer?.trim() || undefined,
1024
+ goal: trimStringOrUndefined(frontMatter.goal),
1025
+ objective: trimStringOrUndefined(frontMatter.objective),
1026
+ value: trimStringOrUndefined(frontMatter.value),
1027
+ impact: trimStringOrUndefined(frontMatter.impact),
1028
+ outcome: trimStringOrUndefined(frontMatter.outcome),
1029
+ why_now: trimStringOrUndefined(frontMatter.why_now),
1030
+ parent: trimStringOrUndefined(frontMatter.parent),
1031
+ reviewer: trimStringOrUndefined(frontMatter.reviewer),
894
1032
  risk: frontMatter.risk ?? undefined,
895
1033
  confidence: normalizeConfidenceValue(frontMatter.confidence),
896
- sprint: frontMatter.sprint?.trim() || undefined,
897
- release: frontMatter.release?.trim() || undefined,
898
- blocked_by: frontMatter.blocked_by?.trim() || undefined,
899
- blocked_reason: frontMatter.blocked_reason?.trim() || undefined,
900
- unblock_note: frontMatter.unblock_note?.trim() || undefined,
901
- reporter: frontMatter.reporter?.trim() || undefined,
1034
+ sprint: trimStringOrUndefined(frontMatter.sprint),
1035
+ release: trimStringOrUndefined(frontMatter.release),
1036
+ blocked_by: trimStringOrUndefined(frontMatter.blocked_by),
1037
+ blocked_reason: trimStringOrUndefined(frontMatter.blocked_reason),
1038
+ unblock_note: trimStringOrUndefined(frontMatter.unblock_note),
1039
+ reporter: trimStringOrUndefined(frontMatter.reporter),
902
1040
  severity: normalizeSeverityValue(frontMatter.severity),
903
- environment: frontMatter.environment?.trim() || undefined,
904
- repro_steps: frontMatter.repro_steps?.trim() || undefined,
905
- resolution: frontMatter.resolution?.trim() || undefined,
906
- expected_result: frontMatter.expected_result?.trim() || undefined,
907
- actual_result: frontMatter.actual_result?.trim() || undefined,
908
- affected_version: frontMatter.affected_version?.trim() || undefined,
909
- fixed_version: frontMatter.fixed_version?.trim() || undefined,
910
- component: frontMatter.component?.trim() || undefined,
1041
+ environment: trimStringOrUndefined(frontMatter.environment),
1042
+ repro_steps: trimStringOrUndefined(frontMatter.repro_steps),
1043
+ resolution: trimStringOrUndefined(frontMatter.resolution),
1044
+ expected_result: trimStringOrUndefined(frontMatter.expected_result),
1045
+ actual_result: trimStringOrUndefined(frontMatter.actual_result),
1046
+ affected_version: trimStringOrUndefined(frontMatter.affected_version),
1047
+ fixed_version: trimStringOrUndefined(frontMatter.fixed_version),
1048
+ component: trimStringOrUndefined(frontMatter.component),
911
1049
  regression: frontMatter.regression,
912
- customer_impact: frontMatter.customer_impact?.trim() || undefined,
913
- close_reason: frontMatter.close_reason || undefined,
1050
+ customer_impact: trimStringOrUndefined(frontMatter.customer_impact),
1051
+ close_reason: emptyStringToUndefined(frontMatter.close_reason),
914
1052
  plan_mode: trimStringOrUndefined(frontMatter.plan_mode),
915
1053
  plan_scope: trimStringOrUndefined(frontMatter.plan_scope),
916
1054
  plan_harness: trimStringOrUndefined(frontMatter.plan_harness),
@@ -920,38 +1058,10 @@ export function normalizeFrontMatter(frontMatter, options = {}) {
920
1058
  plan_discoveries: normalizePlanDiscoveries(frontMatter.plan_discoveries),
921
1059
  plan_validation: normalizePlanValidation(frontMatter.plan_validation),
922
1060
  };
923
- const sourceRecord = frontMatter;
924
- for (const [key, value] of Object.entries(sourceRecord)) {
925
- if (Object.prototype.hasOwnProperty.call(normalized, key) || value === undefined) {
926
- continue;
927
- }
928
- normalized[key] = value;
929
- }
930
- if (runtimeContext?.fieldRegistry) {
931
- for (const definition of runtimeContext.fieldRegistry.definitions) {
932
- const currentValue = normalized[definition.metadata_key];
933
- if (currentValue === undefined) {
934
- continue;
935
- }
936
- normalized[definition.metadata_key] = coerceRuntimeFieldValue(definition, currentValue, `metadata field "${definition.metadata_key}"`);
937
- }
938
- }
939
- if (runtimeContext && runtimeContext.unknownFieldPolicy !== "allow") {
940
- const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
941
- const unknownKeys = Object.keys(normalized)
942
- .filter((key) => !knownKeys.has(key))
943
- .sort((left, right) => left.localeCompare(right));
944
- if (unknownKeys.length > 0) {
945
- if (runtimeContext.unknownFieldPolicy === "reject") {
946
- validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
947
- }
948
- }
949
- }
950
- for (const [key, value] of Object.entries(normalized)) {
951
- if (value === undefined) {
952
- delete normalized[key];
953
- }
954
- }
1061
+ copyExtensionFrontMatterFields(normalized, frontMatter);
1062
+ coerceNormalizedRuntimeFields(normalized, runtimeContext);
1063
+ assertNormalizedUnknownFields(normalized, runtimeContext);
1064
+ deleteUndefinedFields(normalized);
955
1065
  return normalized;
956
1066
  }
957
1067
  function orderFrontMatter(frontMatter) {
@@ -1028,6 +1138,9 @@ function stripLeadingYamlDocument(content) {
1028
1138
  }
1029
1139
  return { content: normalizedContent, stripped: false };
1030
1140
  }
1141
+ function normalizeParsedFrontMatter(frontMatter, options) {
1142
+ return normalizeFrontMatter(frontMatter, { ...options, onWarning: undefined });
1143
+ }
1031
1144
  function parseJsonMarkdownItemDocument(content, runtimeContext, options = {}) {
1032
1145
  const normalized = stripLeadingYamlDocument(content);
1033
1146
  if (normalized.stripped) {
@@ -1050,7 +1163,7 @@ function parseJsonMarkdownItemDocument(content, runtimeContext, options = {}) {
1050
1163
  }
1051
1164
  assertValidFrontMatter(parsed, runtimeContext);
1052
1165
  return {
1053
- metadata: normalizeFrontMatter(parsed, options),
1166
+ metadata: normalizeParsedFrontMatter(parsed, options),
1054
1167
  body: normalizeBody(body),
1055
1168
  };
1056
1169
  }
@@ -1073,7 +1186,7 @@ function parseToonItemDocument(content, runtimeContext, options = {}) {
1073
1186
  assertValidFrontMatter(record.front_matter, runtimeContext);
1074
1187
  assertFrontMatterCondition(record.body === undefined || typeof record.body === "string", "TOON item document body must be a string");
1075
1188
  return {
1076
- metadata: normalizeFrontMatter(record.front_matter, options),
1189
+ metadata: normalizeParsedFrontMatter(record.front_matter, options),
1077
1190
  body: normalizeBody(typeof record.body === "string" ? record.body : ""),
1078
1191
  };
1079
1192
  }
@@ -1081,7 +1194,7 @@ function parseToonItemDocument(content, runtimeContext, options = {}) {
1081
1194
  assertFrontMatterCondition(body === undefined || typeof body === "string", "TOON item document body must be a string");
1082
1195
  assertValidFrontMatter(frontMatterRecord, runtimeContext);
1083
1196
  return {
1084
- metadata: normalizeFrontMatter(frontMatterRecord, options),
1197
+ metadata: normalizeParsedFrontMatter(frontMatterRecord, options),
1085
1198
  body: normalizeBody(typeof body === "string" ? body : ""),
1086
1199
  };
1087
1200
  }
@@ -1155,4 +1268,4 @@ export const _testOnlyItemFormat = {
1155
1268
  sortTests,
1156
1269
  };
1157
1270
  //# sourceMappingURL=item-format.js.map
1158
- //# debugId=777ea2a9-5aa6-5a90-abb5-a0b6052645f2
1271
+ //# debugId=84d024fa-403c-5a85-8c12-4e823afa4fc9