@unbrained/pm-cli 2026.6.30 → 2026.7.2

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