@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,14 +1,15 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="da8f95fe-2b22-59c6-af82-e0bd090502e4")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="89ae7463-1314-574c-9158-0967e6d9c589")}catch(e){}}();
3
3
  import {
4
4
  compareTimestampStrings,
5
5
  isTimestampLiteral
6
- } from "./chunk-KRASIL6M.js";
6
+ } from "./chunk-K2VYLVX4.js";
7
7
  import {
8
8
  CONFIDENCE_TEXT_VALUES,
9
9
  EXIT_CODE,
10
10
  FRONT_MATTER_KEY_ORDER,
11
11
  ISSUE_SEVERITY_VALUES,
12
+ PLAN_STEP_STATUS_VALUES,
12
13
  PmCliError,
13
14
  RECURRENCE_FREQUENCY_VALUES,
14
15
  RECURRENCE_WEEKDAY_VALUES,
@@ -19,7 +20,7 @@ import {
19
20
  resolveRuntimeStatusRegistry,
20
21
  runtimeFieldOptionTarget,
21
22
  weekdayOrderIndex
22
- } from "./chunk-CY5IJMUM.js";
23
+ } from "./chunk-I66WE2HE.js";
23
24
 
24
25
  // dist/core/schema/runtime-field-values.js
25
26
  function toCamelToken(value) {
@@ -304,6 +305,8 @@ function decodeToonItemContent(content) {
304
305
 
305
306
  // dist/core/item/item-format.js
306
307
  var LINKED_TEST_PM_CONTEXT_MODE_VALUES = /* @__PURE__ */ new Set(["schema", "tracker", "auto"]);
308
+ var ITEM_TEST_RUN_STATUS_VALUES = /* @__PURE__ */ new Set(["passed", "failed", "stopped", "canceled"]);
309
+ var PLAN_STEP_STATUS_SET = new Set(PLAN_STEP_STATUS_VALUES);
307
310
  function normalizePathValue(value) {
308
311
  return value.replaceAll("\\", "/");
309
312
  }
@@ -315,6 +318,13 @@ function firstNonZeroComparison(comparisons) {
315
318
  }
316
319
  return 0;
317
320
  }
321
+ function deleteUndefinedFields(record) {
322
+ for (const [key, value] of Object.entries(record)) {
323
+ if (value === void 0) {
324
+ delete record[key];
325
+ }
326
+ }
327
+ }
318
328
  var REQUIRED_STRING_FIELDS = [
319
329
  "id",
320
330
  "title",
@@ -368,47 +378,65 @@ function assertTimestampField(record, fieldName) {
368
378
  const timestamp = rawValue;
369
379
  assertFrontMatterCondition(isTimestampLiteral(timestamp), `${fieldName} must be a valid ISO timestamp`);
370
380
  }
381
+ function assertPositiveIntegerField(record, fieldName, messagePrefix) {
382
+ const value = record[fieldName];
383
+ if (value === void 0) {
384
+ return;
385
+ }
386
+ assertFrontMatterCondition(typeof value === "number" && Number.isInteger(value) && value >= 1, `${messagePrefix} must be an integer >= 1`);
387
+ }
388
+ function assertOptionalTimestampString(record, fieldName, messagePrefix) {
389
+ const value = record[fieldName];
390
+ if (value === void 0) {
391
+ return;
392
+ }
393
+ assertFrontMatterCondition(typeof value === "string", `${messagePrefix} must be a string`);
394
+ assertFrontMatterCondition(isTimestampLiteral(value), `${messagePrefix} must be a valid ISO timestamp`);
395
+ }
396
+ function assertRecurrenceWeekdays(value) {
397
+ if (value === void 0) {
398
+ return;
399
+ }
400
+ assertFrontMatterCondition(Array.isArray(value), "event.recurrence.by_weekday must be an array");
401
+ for (const weekday of value) {
402
+ assertFrontMatterCondition(typeof weekday === "string", "event.recurrence.by_weekday entries must be strings");
403
+ const normalizedWeekday = weekday.trim().toLowerCase();
404
+ assertFrontMatterCondition(RECURRENCE_WEEKDAY_VALUES.includes(normalizedWeekday), `event.recurrence.by_weekday entries must be one of: ${RECURRENCE_WEEKDAY_VALUES.join(", ")}`);
405
+ }
406
+ }
407
+ function assertRecurrenceMonthDays(value) {
408
+ if (value === void 0) {
409
+ return;
410
+ }
411
+ assertFrontMatterCondition(Array.isArray(value), "event.recurrence.by_month_day must be an array");
412
+ for (const day of value) {
413
+ assertFrontMatterCondition(typeof day === "number" && Number.isInteger(day) && day >= 1 && day <= 31, "event.recurrence.by_month_day entries must be integers 1..31");
414
+ }
415
+ }
416
+ function assertRecurrenceExdates(value) {
417
+ if (value === void 0) {
418
+ return;
419
+ }
420
+ assertFrontMatterCondition(Array.isArray(value), "event.recurrence.exdates must be an array");
421
+ for (const exdate of value) {
422
+ assertFrontMatterCondition(typeof exdate === "string", "event.recurrence.exdates entries must be strings");
423
+ assertFrontMatterCondition(isTimestampLiteral(exdate), "event.recurrence.exdates entries must be valid ISO timestamps");
424
+ }
425
+ }
371
426
  function assertValidRecurrenceRule(recurrence) {
372
427
  assertFrontMatterCondition(typeof recurrence === "object" && recurrence !== null && !Array.isArray(recurrence), "event.recurrence must be an object");
373
428
  const recurrenceRecord = recurrence;
374
429
  assertFrontMatterCondition(typeof recurrenceRecord.freq === "string", "event.recurrence.freq must be a string");
375
430
  const frequency = recurrenceRecord.freq.trim().toLowerCase();
376
431
  assertFrontMatterCondition(RECURRENCE_FREQUENCY_VALUES.includes(frequency), `event.recurrence.freq must be one of: ${RECURRENCE_FREQUENCY_VALUES.join(", ")}`);
377
- if (recurrenceRecord.interval !== void 0) {
378
- assertFrontMatterCondition(typeof recurrenceRecord.interval === "number" && Number.isInteger(recurrenceRecord.interval) && recurrenceRecord.interval >= 1, "event.recurrence.interval must be an integer >= 1");
379
- }
380
- if (recurrenceRecord.count !== void 0) {
381
- assertFrontMatterCondition(typeof recurrenceRecord.count === "number" && Number.isInteger(recurrenceRecord.count) && recurrenceRecord.count >= 1, "event.recurrence.count must be an integer >= 1");
382
- }
383
- if (recurrenceRecord.until !== void 0) {
384
- assertFrontMatterCondition(typeof recurrenceRecord.until === "string", "event.recurrence.until must be a string");
385
- assertFrontMatterCondition(isTimestampLiteral(recurrenceRecord.until), "event.recurrence.until must be a valid ISO timestamp");
386
- }
387
- if (recurrenceRecord.by_weekday !== void 0) {
388
- assertFrontMatterCondition(Array.isArray(recurrenceRecord.by_weekday), "event.recurrence.by_weekday must be an array");
389
- for (const weekday of recurrenceRecord.by_weekday) {
390
- assertFrontMatterCondition(typeof weekday === "string", "event.recurrence.by_weekday entries must be strings");
391
- const normalizedWeekday = weekday.trim().toLowerCase();
392
- assertFrontMatterCondition(RECURRENCE_WEEKDAY_VALUES.includes(normalizedWeekday), `event.recurrence.by_weekday entries must be one of: ${RECURRENCE_WEEKDAY_VALUES.join(", ")}`);
393
- }
394
- }
395
- if (recurrenceRecord.by_month_day !== void 0) {
396
- assertFrontMatterCondition(Array.isArray(recurrenceRecord.by_month_day), "event.recurrence.by_month_day must be an array");
397
- for (const day of recurrenceRecord.by_month_day) {
398
- assertFrontMatterCondition(typeof day === "number" && Number.isInteger(day) && day >= 1 && day <= 31, "event.recurrence.by_month_day entries must be integers 1..31");
399
- }
400
- }
401
- if (recurrenceRecord.exdates !== void 0) {
402
- assertFrontMatterCondition(Array.isArray(recurrenceRecord.exdates), "event.recurrence.exdates must be an array");
403
- for (const exdate of recurrenceRecord.exdates) {
404
- assertFrontMatterCondition(typeof exdate === "string", "event.recurrence.exdates entries must be strings");
405
- assertFrontMatterCondition(isTimestampLiteral(exdate), "event.recurrence.exdates entries must be valid ISO timestamps");
406
- }
407
- }
408
- }
409
- function assertValidFrontMatter(frontMatter, runtimeContext) {
410
- assertFrontMatterCondition(typeof frontMatter === "object" && frontMatter !== null && !Array.isArray(frontMatter), "front matter must be an object");
411
- const record = frontMatter;
432
+ assertPositiveIntegerField(recurrenceRecord, "interval", "event.recurrence.interval");
433
+ assertPositiveIntegerField(recurrenceRecord, "count", "event.recurrence.count");
434
+ assertOptionalTimestampString(recurrenceRecord, "until", "event.recurrence.until");
435
+ assertRecurrenceWeekdays(recurrenceRecord.by_weekday);
436
+ assertRecurrenceMonthDays(recurrenceRecord.by_month_day);
437
+ assertRecurrenceExdates(recurrenceRecord.exdates);
438
+ }
439
+ function assertRequiredFrontMatterFields(record) {
412
440
  for (const fieldName of REQUIRED_STRING_FIELDS) {
413
441
  assertFrontMatterCondition(typeof record[fieldName] === "string", `${fieldName} is required and must be a string`);
414
442
  }
@@ -418,12 +446,17 @@ function assertValidFrontMatter(frontMatter, runtimeContext) {
418
446
  if (formatVersion !== void 0) {
419
447
  assertFrontMatterCondition(typeof formatVersion === "number" && Number.isInteger(formatVersion) && formatVersion >= BASELINE_ITEM_FORMAT_VERSION, `pm_format_version must be an integer >= ${BASELINE_ITEM_FORMAT_VERSION}`);
420
448
  }
449
+ return itemType;
450
+ }
451
+ function assertStatusFrontMatterField(record, runtimeContext) {
421
452
  const status = record.status;
422
453
  assertFrontMatterCondition(typeof status === "string" && status.trim().length > 0, "status must be a non-empty string");
423
454
  const statusRegistry = runtimeContext?.statusRegistry;
424
455
  const normalizedStatus = normalizeStatusInput(status, statusRegistry);
425
456
  const statusDomain = statusRegistry ? statusRegistry.definitions.map((definition) => definition.id) : [...STATUS_VALUES];
426
457
  assertFrontMatterCondition(normalizedStatus !== void 0, `status must be one of: ${statusDomain.join(", ")}`);
458
+ }
459
+ function assertPriorityAndTags(record) {
427
460
  const priority = record.priority;
428
461
  assertFrontMatterCondition(typeof priority === "number" && Number.isInteger(priority) && [0, 1, 2, 3, 4].includes(priority), "priority must be an integer 0..4");
429
462
  const tags = record.tags;
@@ -431,129 +464,176 @@ function assertValidFrontMatter(frontMatter, runtimeContext) {
431
464
  for (const tag of tags) {
432
465
  assertFrontMatterCondition(typeof tag === "string", "tags entries must be strings");
433
466
  }
467
+ }
468
+ function assertConfidenceFrontMatterField(record) {
434
469
  const confidence = record.confidence;
435
- if (confidence !== void 0) {
436
- if (typeof confidence === "number") {
437
- assertFrontMatterCondition(Number.isInteger(confidence) && confidence >= 0 && confidence <= 100, "confidence number value must be an integer 0..100");
438
- } else if (typeof confidence === "string") {
439
- const normalizedConfidence = confidence.trim().toLowerCase();
440
- const isKnownTextConfidence = normalizedConfidence === "med" || CONFIDENCE_TEXT_VALUES.includes(normalizedConfidence);
441
- assertFrontMatterCondition(isKnownTextConfidence, `confidence string value must be one of: ${[...CONFIDENCE_TEXT_VALUES, "med"].join(", ")}`);
442
- } else {
443
- assertFrontMatterCondition(false, "confidence must be a number or string");
444
- }
470
+ if (confidence === void 0) {
471
+ return;
472
+ }
473
+ if (typeof confidence === "number") {
474
+ assertFrontMatterCondition(Number.isInteger(confidence) && confidence >= 0 && confidence <= 100, "confidence number value must be an integer 0..100");
475
+ return;
445
476
  }
477
+ if (typeof confidence === "string") {
478
+ const normalizedConfidence = confidence.trim().toLowerCase();
479
+ const isKnownTextConfidence = normalizedConfidence === "med" || CONFIDENCE_TEXT_VALUES.includes(normalizedConfidence);
480
+ assertFrontMatterCondition(isKnownTextConfidence, `confidence string value must be one of: ${[...CONFIDENCE_TEXT_VALUES, "med"].join(", ")}`);
481
+ return;
482
+ }
483
+ assertFrontMatterCondition(false, "confidence must be a number or string");
484
+ }
485
+ function assertSeverityFrontMatterField(record) {
446
486
  const severity = record.severity;
447
- if (severity !== void 0) {
448
- if (typeof severity !== "string") {
449
- validationError("severity must be a string");
450
- }
451
- const normalizedSeverity = severity.trim().toLowerCase();
452
- const isKnownSeverity = normalizedSeverity === "med" || ISSUE_SEVERITY_VALUES.includes(normalizedSeverity);
453
- assertFrontMatterCondition(isKnownSeverity, `severity value must be one of: ${[...ISSUE_SEVERITY_VALUES, "med"].join(", ")}`);
454
- }
455
- const regression = record.regression;
456
- if (regression !== void 0) {
457
- if (typeof regression !== "boolean") {
458
- validationError("regression must be a boolean");
459
- }
487
+ if (severity === void 0) {
488
+ return;
460
489
  }
461
- assertTimestampField(record, "created_at");
462
- assertTimestampField(record, "updated_at");
463
- if (record.deadline !== void 0) {
464
- assertTimestampField(record, "deadline");
490
+ if (typeof severity !== "string") {
491
+ validationError("severity must be a string");
465
492
  }
466
- if (record.reminders !== void 0) {
467
- const reminders = record.reminders;
468
- assertFrontMatterCondition(Array.isArray(reminders), "reminders must be an array");
469
- for (const reminder of reminders) {
470
- assertFrontMatterCondition(typeof reminder === "object" && reminder !== null && !Array.isArray(reminder), "reminders entries must be objects");
471
- const reminderRecord = reminder;
472
- assertFrontMatterCondition(typeof reminderRecord.at === "string", "reminder.at must be a string");
473
- assertFrontMatterCondition(isTimestampLiteral(reminderRecord.at), "reminder.at must be a valid ISO timestamp");
474
- assertFrontMatterCondition(typeof reminderRecord.text === "string", "reminder.text must be a string");
475
- assertFrontMatterCondition(reminderRecord.text.trim().length > 0, "reminder.text must not be empty");
476
- }
493
+ const normalizedSeverity = severity.trim().toLowerCase();
494
+ const isKnownSeverity = normalizedSeverity === "med" || ISSUE_SEVERITY_VALUES.includes(normalizedSeverity);
495
+ assertFrontMatterCondition(isKnownSeverity, `severity value must be one of: ${[...ISSUE_SEVERITY_VALUES, "med"].join(", ")}`);
496
+ }
497
+ function assertRegressionFrontMatterField(record) {
498
+ if (record.regression !== void 0 && typeof record.regression !== "boolean") {
499
+ validationError("regression must be a boolean");
477
500
  }
478
- if (record.events !== void 0) {
479
- const events = record.events;
480
- assertFrontMatterCondition(Array.isArray(events), "events must be an array");
481
- for (const event of events) {
482
- assertFrontMatterCondition(typeof event === "object" && event !== null && !Array.isArray(event), "events entries must be objects");
483
- const eventRecord = event;
484
- assertFrontMatterCondition(typeof eventRecord.start_at === "string", "event.start_at must be a string");
485
- assertFrontMatterCondition(isTimestampLiteral(eventRecord.start_at), "event.start_at must be a valid ISO timestamp");
486
- if (eventRecord.end_at !== void 0) {
487
- assertFrontMatterCondition(typeof eventRecord.end_at === "string", "event.end_at must be a string");
488
- assertFrontMatterCondition(isTimestampLiteral(eventRecord.end_at), "event.end_at must be a valid ISO timestamp");
489
- assertFrontMatterCondition(compareTimestampStrings(eventRecord.end_at, eventRecord.start_at) > 0, "event.end_at must be after event.start_at");
490
- }
491
- for (const stringField of ["title", "description", "location", "timezone"]) {
492
- if (eventRecord[stringField] !== void 0) {
493
- assertFrontMatterCondition(typeof eventRecord[stringField] === "string", `event.${stringField} must be a string`);
494
- assertFrontMatterCondition(eventRecord[stringField].trim().length > 0, `event.${stringField} must not be empty`);
495
- }
496
- }
497
- if (eventRecord.all_day !== void 0) {
498
- assertFrontMatterCondition(typeof eventRecord.all_day === "boolean", "event.all_day must be a boolean");
499
- }
500
- if (eventRecord.recurrence !== void 0) {
501
- assertValidRecurrenceRule(eventRecord.recurrence);
502
- if (eventRecord.recurrence.until !== void 0) {
503
- assertFrontMatterCondition(compareTimestampStrings(eventRecord.recurrence.until, eventRecord.start_at) >= 0, "event.recurrence.until must be at or after event.start_at");
504
- }
505
- }
501
+ }
502
+ function assertReminderEntries(record) {
503
+ const reminders = record.reminders;
504
+ if (reminders === void 0) {
505
+ return;
506
+ }
507
+ assertFrontMatterCondition(Array.isArray(reminders), "reminders must be an array");
508
+ for (const reminder of reminders) {
509
+ assertFrontMatterCondition(typeof reminder === "object" && reminder !== null && !Array.isArray(reminder), "reminders entries must be objects");
510
+ const reminderRecord = reminder;
511
+ assertFrontMatterCondition(typeof reminderRecord.at === "string", "reminder.at must be a string");
512
+ assertFrontMatterCondition(isTimestampLiteral(reminderRecord.at), "reminder.at must be a valid ISO timestamp");
513
+ assertFrontMatterCondition(typeof reminderRecord.text === "string", "reminder.text must be a string");
514
+ assertFrontMatterCondition(reminderRecord.text.trim().length > 0, "reminder.text must not be empty");
515
+ }
516
+ }
517
+ function assertEventStringFields(eventRecord) {
518
+ for (const stringField of ["title", "description", "location", "timezone"]) {
519
+ if (eventRecord[stringField] !== void 0) {
520
+ assertFrontMatterCondition(typeof eventRecord[stringField] === "string", `event.${stringField} must be a string`);
521
+ assertFrontMatterCondition(eventRecord[stringField].trim().length > 0, `event.${stringField} must not be empty`);
506
522
  }
507
523
  }
508
- if (record.closed_at !== void 0) {
509
- const closedAt = record.closed_at;
510
- assertFrontMatterCondition(typeof closedAt === "string", "closed_at must be a string");
511
- assertFrontMatterCondition(isTimestampLiteral(closedAt), "closed_at must be a valid ISO timestamp");
524
+ }
525
+ function assertEventRecurrence(eventRecord) {
526
+ if (eventRecord.recurrence === void 0) {
527
+ return;
528
+ }
529
+ assertValidRecurrenceRule(eventRecord.recurrence);
530
+ if (eventRecord.recurrence.until !== void 0) {
531
+ assertFrontMatterCondition(compareTimestampStrings(eventRecord.recurrence.until, eventRecord.start_at) >= 0, "event.recurrence.until must be at or after event.start_at");
532
+ }
533
+ }
534
+ function assertCalendarEventEntry(event) {
535
+ assertFrontMatterCondition(typeof event === "object" && event !== null && !Array.isArray(event), "events entries must be objects");
536
+ const eventRecord = event;
537
+ assertFrontMatterCondition(typeof eventRecord.start_at === "string", "event.start_at must be a string");
538
+ assertFrontMatterCondition(isTimestampLiteral(eventRecord.start_at), "event.start_at must be a valid ISO timestamp");
539
+ if (eventRecord.end_at !== void 0) {
540
+ assertFrontMatterCondition(typeof eventRecord.end_at === "string", "event.end_at must be a string");
541
+ assertFrontMatterCondition(isTimestampLiteral(eventRecord.end_at), "event.end_at must be a valid ISO timestamp");
542
+ assertFrontMatterCondition(compareTimestampStrings(eventRecord.end_at, eventRecord.start_at) > 0, "event.end_at must be after event.start_at");
543
+ }
544
+ assertEventStringFields(eventRecord);
545
+ if (eventRecord.all_day !== void 0) {
546
+ assertFrontMatterCondition(typeof eventRecord.all_day === "boolean", "event.all_day must be a boolean");
547
+ }
548
+ assertEventRecurrence(eventRecord);
549
+ }
550
+ function assertCalendarEvents(record) {
551
+ const events = record.events;
552
+ if (events === void 0) {
553
+ return;
512
554
  }
555
+ assertFrontMatterCondition(Array.isArray(events), "events must be an array");
556
+ for (const event of events) {
557
+ assertCalendarEventEntry(event);
558
+ }
559
+ }
560
+ function assertOptionalStringFields(record) {
513
561
  for (const fieldName of ["source_type", "source_owner", "design", "external_ref"]) {
514
562
  const value = record[fieldName];
515
563
  if (value !== void 0) {
516
564
  assertFrontMatterCondition(typeof value === "string", `${fieldName} must be a string`);
517
565
  }
518
566
  }
567
+ }
568
+ function assertTypeOptionsField(record) {
519
569
  const typeOptions = record.type_options;
520
- if (typeOptions !== void 0) {
521
- assertFrontMatterCondition(typeof typeOptions === "object" && typeOptions !== null && !Array.isArray(typeOptions), "type_options must be an object");
522
- for (const [optionKey, optionValue] of Object.entries(typeOptions)) {
523
- assertFrontMatterCondition(optionKey.trim().length > 0, "type_options keys must be non-empty");
524
- assertFrontMatterCondition(typeof optionValue === "string", "type_options values must be strings");
525
- const optionText = optionValue;
526
- assertFrontMatterCondition(optionText.trim().length > 0, "type_options values must be non-empty strings");
527
- }
570
+ if (typeOptions === void 0) {
571
+ return;
528
572
  }
529
- if (runtimeContext?.fieldRegistry) {
530
- for (const definition of runtimeContext.fieldRegistry.definitions) {
531
- const fieldValue = record[definition.metadata_key];
532
- if (fieldValue === void 0) {
533
- if (runtimeFieldRequiredForType(definition, itemType)) {
534
- validationError(`missing required schema field: ${definition.metadata_key}`);
535
- }
536
- continue;
537
- }
538
- try {
539
- record[definition.metadata_key] = coerceRuntimeFieldValue(definition, fieldValue, `metadata field "${definition.metadata_key}"`);
540
- } catch (error) {
541
- validationError(String(error?.message).replace(/^Invalid\s+/u, ""));
542
- }
543
- }
573
+ assertFrontMatterCondition(typeof typeOptions === "object" && typeOptions !== null && !Array.isArray(typeOptions), "type_options must be an object");
574
+ for (const [optionKey, optionValue] of Object.entries(typeOptions)) {
575
+ assertFrontMatterCondition(optionKey.trim().length > 0, "type_options keys must be non-empty");
576
+ assertFrontMatterCondition(typeof optionValue === "string", "type_options values must be strings");
577
+ const optionText = optionValue;
578
+ assertFrontMatterCondition(optionText.trim().length > 0, "type_options values must be non-empty strings");
544
579
  }
545
- if (runtimeContext && runtimeContext.unknownFieldPolicy !== "allow") {
546
- const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
547
- const unknownKeys = Object.keys(record).filter((key) => !knownKeys.has(key)).sort((left, right) => left.localeCompare(right));
548
- if (unknownKeys.length > 0) {
549
- if (runtimeContext.unknownFieldPolicy === "reject") {
550
- validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
551
- } else {
552
- runtimeContext.onWarning?.(`item_unknown_schema_fields:${unknownKeys.join(",")}`);
580
+ }
581
+ function coerceRuntimeFrontMatterFields(record, itemType, runtimeContext) {
582
+ if (!runtimeContext?.fieldRegistry) {
583
+ return;
584
+ }
585
+ for (const definition of runtimeContext.fieldRegistry.definitions) {
586
+ const fieldValue = record[definition.metadata_key];
587
+ if (fieldValue === void 0) {
588
+ if (runtimeFieldRequiredForType(definition, itemType)) {
589
+ validationError(`missing required schema field: ${definition.metadata_key}`);
553
590
  }
591
+ continue;
592
+ }
593
+ try {
594
+ record[definition.metadata_key] = coerceRuntimeFieldValue(definition, fieldValue, `metadata field "${definition.metadata_key}"`);
595
+ } catch (error) {
596
+ validationError(String(error?.message).replace(/^Invalid\s+/u, ""));
554
597
  }
555
598
  }
556
599
  }
600
+ function assertRuntimeUnknownFrontMatterFields(record, runtimeContext) {
601
+ if (!runtimeContext || runtimeContext.unknownFieldPolicy === "allow") {
602
+ return;
603
+ }
604
+ const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
605
+ const unknownKeys = Object.keys(record).filter((key) => !knownKeys.has(key)).sort((left, right) => left.localeCompare(right));
606
+ if (unknownKeys.length === 0) {
607
+ return;
608
+ }
609
+ if (runtimeContext.unknownFieldPolicy === "reject") {
610
+ validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
611
+ } else {
612
+ runtimeContext.onWarning?.(`item_unknown_schema_fields:${unknownKeys.join(",")}`);
613
+ }
614
+ }
615
+ function assertValidFrontMatter(frontMatter, runtimeContext) {
616
+ assertFrontMatterCondition(typeof frontMatter === "object" && frontMatter !== null && !Array.isArray(frontMatter), "front matter must be an object");
617
+ const record = frontMatter;
618
+ const itemType = assertRequiredFrontMatterFields(record);
619
+ assertStatusFrontMatterField(record, runtimeContext);
620
+ assertPriorityAndTags(record);
621
+ assertConfidenceFrontMatterField(record);
622
+ assertSeverityFrontMatterField(record);
623
+ assertRegressionFrontMatterField(record);
624
+ assertTimestampField(record, "created_at");
625
+ assertTimestampField(record, "updated_at");
626
+ if (record.deadline !== void 0) {
627
+ assertTimestampField(record, "deadline");
628
+ }
629
+ assertReminderEntries(record);
630
+ assertCalendarEvents(record);
631
+ assertOptionalTimestampString(record, "closed_at", "closed_at");
632
+ assertOptionalStringFields(record);
633
+ assertTypeOptionsField(record);
634
+ coerceRuntimeFrontMatterFields(record, itemType, runtimeContext);
635
+ assertRuntimeUnknownFrontMatterFields(record, runtimeContext);
636
+ }
557
637
  function sortDependencies(values) {
558
638
  if (!values || values.length === 0)
559
639
  return void 0;
@@ -631,52 +711,38 @@ function normalizeRecurrenceRule(value) {
631
711
  return normalized;
632
712
  }
633
713
  function sortEvents(values) {
634
- if (!values || values.length === 0) {
714
+ if (!Array.isArray(values) || values.length === 0) {
635
715
  return void 0;
636
716
  }
637
- const normalized = [...values].map((value) => {
638
- const event = {
639
- start_at: value.start_at,
640
- end_at: value.end_at || void 0,
641
- title: value.title?.trim() || void 0,
642
- description: value.description?.trim() || void 0,
643
- location: value.location?.trim() || void 0,
644
- all_day: value.all_day,
645
- timezone: value.timezone?.trim() || void 0,
646
- recurrence: normalizeRecurrenceRule(value.recurrence)
647
- };
648
- for (const [key, fieldValue] of Object.entries(event)) {
649
- if (fieldValue === void 0) {
650
- delete event[key];
651
- }
652
- }
653
- return event;
654
- }).sort((a, b) => {
655
- const byStart = compareTimestampStrings(a.start_at, b.start_at);
656
- if (byStart !== 0)
657
- return byStart;
658
- const byEnd = (a.end_at ?? "").localeCompare(b.end_at ?? "");
659
- if (byEnd !== 0)
660
- return byEnd;
661
- const byTitle = (a.title ?? "").localeCompare(b.title ?? "");
662
- if (byTitle !== 0)
663
- return byTitle;
664
- const byAllDay = Number(Boolean(a.all_day)) - Number(Boolean(b.all_day));
665
- if (byAllDay !== 0)
666
- return byAllDay;
667
- const byTimezone = (a.timezone ?? "").localeCompare(b.timezone ?? "");
668
- if (byTimezone !== 0)
669
- return byTimezone;
670
- const byLocation = (a.location ?? "").localeCompare(b.location ?? "");
671
- if (byLocation !== 0)
672
- return byLocation;
673
- const byDescription = (a.description ?? "").localeCompare(b.description ?? "");
674
- if (byDescription !== 0)
675
- return byDescription;
676
- return JSON.stringify(a.recurrence ?? {}).localeCompare(JSON.stringify(b.recurrence ?? {}));
677
- });
717
+ const normalized = [...values].map(normalizeCalendarEvent).sort(compareCalendarEvents);
678
718
  return normalized;
679
719
  }
720
+ function normalizeCalendarEvent(value) {
721
+ const event = {
722
+ start_at: value.start_at,
723
+ end_at: value.end_at || void 0,
724
+ title: value.title?.trim() || void 0,
725
+ description: value.description?.trim() || void 0,
726
+ location: value.location?.trim() || void 0,
727
+ all_day: value.all_day,
728
+ timezone: value.timezone?.trim() || void 0,
729
+ recurrence: normalizeRecurrenceRule(value.recurrence)
730
+ };
731
+ deleteUndefinedFields(event);
732
+ return event;
733
+ }
734
+ function compareCalendarEvents(a, b) {
735
+ return firstNonZeroComparison([
736
+ compareTimestampStrings(a.start_at, b.start_at),
737
+ (a.end_at ?? "").localeCompare(b.end_at ?? ""),
738
+ (a.title ?? "").localeCompare(b.title ?? ""),
739
+ Number(Boolean(a.all_day)) - Number(Boolean(b.all_day)),
740
+ (a.timezone ?? "").localeCompare(b.timezone ?? ""),
741
+ (a.location ?? "").localeCompare(b.location ?? ""),
742
+ (a.description ?? "").localeCompare(b.description ?? ""),
743
+ JSON.stringify(a.recurrence ?? {}).localeCompare(JSON.stringify(b.recurrence ?? {}))
744
+ ]);
745
+ }
680
746
  function normalizeFiles(values) {
681
747
  if (!values || values.length === 0)
682
748
  return void 0;
@@ -689,83 +755,140 @@ function normalizeFiles(values) {
689
755
  function normalizeTestRunSummaries(values) {
690
756
  if (!values || values.length === 0)
691
757
  return void 0;
692
- const normalized = values.map((value) => {
693
- const runId = typeof value.run_id === "string" ? value.run_id.trim() : "";
694
- const kind = value.kind === "test" || value.kind === "test-all" ? value.kind : "test";
695
- const status = value.status === "passed" || value.status === "failed" || value.status === "stopped" || value.status === "canceled" ? value.status : "failed";
696
- const startedAt = typeof value.started_at === "string" ? value.started_at : "";
697
- const finishedAt = typeof value.finished_at === "string" ? value.finished_at : "";
698
- const recordedAt = typeof value.recorded_at === "string" ? value.recorded_at : "";
699
- const passed = typeof value.passed === "number" && Number.isFinite(value.passed) ? Math.max(0, Math.floor(value.passed)) : 0;
700
- const failed = typeof value.failed === "number" && Number.isFinite(value.failed) ? Math.max(0, Math.floor(value.failed)) : 0;
701
- const skipped = typeof value.skipped === "number" && Number.isFinite(value.skipped) ? Math.max(0, Math.floor(value.skipped)) : 0;
702
- return {
703
- run_id: runId,
704
- kind,
705
- status,
706
- started_at: startedAt,
707
- finished_at: finishedAt,
708
- recorded_at: recordedAt,
709
- attempt: typeof value.attempt === "number" && Number.isFinite(value.attempt) && value.attempt >= 1 ? Math.floor(value.attempt) : void 0,
710
- resumed_from: value.resumed_from?.trim() || void 0,
711
- passed,
712
- failed,
713
- skipped,
714
- items: typeof value.items === "number" && Number.isFinite(value.items) && value.items >= 0 ? Math.floor(value.items) : void 0,
715
- linked_tests: typeof value.linked_tests === "number" && Number.isFinite(value.linked_tests) && value.linked_tests >= 0 ? Math.floor(value.linked_tests) : void 0,
716
- fail_on_skipped_triggered: value.fail_on_skipped_triggered === true ? true : void 0
717
- };
718
- }).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([
758
+ 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([
719
759
  compareTimestampStrings(a.recorded_at, b.recorded_at),
720
760
  a.run_id.localeCompare(b.run_id),
721
761
  a.kind.localeCompare(b.kind)
722
762
  ]));
723
763
  return normalized.length > 0 ? normalized : void 0;
724
764
  }
765
+ function normalizeNonNegativeInteger(value) {
766
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : void 0;
767
+ }
768
+ function normalizePositiveInteger(value) {
769
+ return typeof value === "number" && Number.isFinite(value) && value >= 1 ? Math.floor(value) : void 0;
770
+ }
771
+ function stringOrEmpty(value) {
772
+ return typeof value === "string" ? value : "";
773
+ }
774
+ function normalizeTestRunSummary(value) {
775
+ const runId = typeof value.run_id === "string" ? value.run_id.trim() : "";
776
+ const kind = value.kind === "test" || value.kind === "test-all" ? value.kind : "test";
777
+ const status = ITEM_TEST_RUN_STATUS_VALUES.has(value.status) ? value.status : "failed";
778
+ const summary = {
779
+ run_id: runId,
780
+ kind,
781
+ status,
782
+ started_at: stringOrEmpty(value.started_at),
783
+ finished_at: stringOrEmpty(value.finished_at),
784
+ recorded_at: stringOrEmpty(value.recorded_at),
785
+ attempt: normalizePositiveInteger(value.attempt),
786
+ resumed_from: value.resumed_from?.trim() || void 0,
787
+ passed: normalizeNonNegativeInteger(value.passed) ?? 0,
788
+ failed: normalizeNonNegativeInteger(value.failed) ?? 0,
789
+ skipped: normalizeNonNegativeInteger(value.skipped) ?? 0,
790
+ items: normalizeNonNegativeInteger(value.items),
791
+ linked_tests: normalizeNonNegativeInteger(value.linked_tests),
792
+ fail_on_skipped_triggered: value.fail_on_skipped_triggered === true ? true : void 0
793
+ };
794
+ deleteUndefinedFields(summary);
795
+ return summary;
796
+ }
725
797
  function sortTests(values) {
726
- if (!values || values.length === 0)
798
+ if (!Array.isArray(values) || values.length === 0)
727
799
  return void 0;
728
- return [...values].map((value) => ({
800
+ return [...values].map(normalizeLinkedTest).sort(compareLinkedTests);
801
+ }
802
+ function normalizeTrimmedStringList(value) {
803
+ if (!Array.isArray(value)) {
804
+ return void 0;
805
+ }
806
+ const normalized = [
807
+ ...new Set(value.filter((entry) => typeof entry === "string").map((entry) => entry.trim()).filter((entry) => entry.length > 0))
808
+ ].sort((a, b) => a.localeCompare(b));
809
+ return normalized.length > 0 ? normalized : void 0;
810
+ }
811
+ function isPlainObjectRecord(value) {
812
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
813
+ return false;
814
+ }
815
+ const prototype = Object.getPrototypeOf(value);
816
+ return prototype === Object.prototype || prototype === null;
817
+ }
818
+ function isUnsafeObjectKey(key) {
819
+ return key === "__proto__" || key === "constructor" || key === "prototype";
820
+ }
821
+ function normalizeStringRecord(value) {
822
+ if (!isPlainObjectRecord(value)) {
823
+ return void 0;
824
+ }
825
+ 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));
826
+ return entries.length > 0 ? Object.fromEntries(entries) : void 0;
827
+ }
828
+ function normalizeNumericRecord(value) {
829
+ if (!isPlainObjectRecord(value)) {
830
+ return void 0;
831
+ }
832
+ 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));
833
+ return entries.length > 0 ? Object.fromEntries(entries) : void 0;
834
+ }
835
+ function normalizeLinkedTestContextMode(value) {
836
+ const normalized = value?.trim().toLowerCase();
837
+ if (!normalized || !LINKED_TEST_PM_CONTEXT_MODE_VALUES.has(normalized)) {
838
+ return void 0;
839
+ }
840
+ return normalized;
841
+ }
842
+ function normalizeLinkedTest(value) {
843
+ const test = {
729
844
  command: value.command?.trim() || void 0,
730
845
  path: value.path ? normalizePathValue(value.path) : void 0,
731
846
  scope: value.scope,
732
847
  timeout_seconds: typeof value.timeout_seconds === "number" && Number.isFinite(value.timeout_seconds) && value.timeout_seconds > 0 ? value.timeout_seconds : void 0,
733
- pm_context_mode: (() => {
734
- const normalized = value.pm_context_mode?.trim().toLowerCase();
735
- if (!normalized || !LINKED_TEST_PM_CONTEXT_MODE_VALUES.has(normalized)) {
736
- return void 0;
737
- }
738
- return normalized;
739
- })(),
740
- 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,
741
- 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,
848
+ pm_context_mode: normalizeLinkedTestContextMode(value.pm_context_mode),
849
+ env_set: normalizeStringRecord(value.env_set),
850
+ env_clear: normalizeTrimmedStringList(value.env_clear),
742
851
  shared_host_safe: value.shared_host_safe === true ? true : void 0,
743
- 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,
744
- 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,
745
- 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,
746
- 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,
747
- 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,
748
- 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,
749
- 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,
852
+ assert_stdout_contains: normalizeTrimmedStringList(value.assert_stdout_contains),
853
+ assert_stdout_regex: normalizeTrimmedStringList(value.assert_stdout_regex),
854
+ assert_stderr_contains: normalizeTrimmedStringList(value.assert_stderr_contains),
855
+ assert_stderr_regex: normalizeTrimmedStringList(value.assert_stderr_regex),
856
+ assert_stdout_min_lines: normalizeNonNegativeInteger(value.assert_stdout_min_lines),
857
+ assert_json_field_equals: normalizeStringRecord(value.assert_json_field_equals),
858
+ assert_json_field_gte: normalizeNumericRecord(value.assert_json_field_gte),
750
859
  note: value.note?.trim() || void 0
751
- })).sort((a, b) => firstNonZeroComparison([
860
+ };
861
+ deleteUndefinedFields(test);
862
+ return test;
863
+ }
864
+ function compareLinkedTests(a, b) {
865
+ return firstNonZeroComparison([
752
866
  a.scope.localeCompare(b.scope),
753
- (a.path ?? "").localeCompare(b.path ?? ""),
754
- (a.command ?? "").localeCompare(b.command ?? ""),
755
- (a.timeout_seconds ?? 0) - (b.timeout_seconds ?? 0),
756
- (a.pm_context_mode ?? "").localeCompare(b.pm_context_mode ?? ""),
867
+ compareOptionalStrings(a.path, b.path),
868
+ compareOptionalStrings(a.command, b.command),
869
+ compareOptionalNumbers(a.timeout_seconds, b.timeout_seconds),
870
+ compareOptionalStrings(a.pm_context_mode, b.pm_context_mode),
757
871
  Number(Boolean(a.shared_host_safe)) - Number(Boolean(b.shared_host_safe)),
758
- JSON.stringify(a.env_clear ?? []).localeCompare(JSON.stringify(b.env_clear ?? [])),
759
- JSON.stringify(a.env_set ?? {}).localeCompare(JSON.stringify(b.env_set ?? {})),
760
- JSON.stringify(a.assert_stdout_contains ?? []).localeCompare(JSON.stringify(b.assert_stdout_contains ?? [])),
761
- JSON.stringify(a.assert_stdout_regex ?? []).localeCompare(JSON.stringify(b.assert_stdout_regex ?? [])),
762
- JSON.stringify(a.assert_stderr_contains ?? []).localeCompare(JSON.stringify(b.assert_stderr_contains ?? [])),
763
- JSON.stringify(a.assert_stderr_regex ?? []).localeCompare(JSON.stringify(b.assert_stderr_regex ?? [])),
764
- (a.assert_stdout_min_lines ?? 0) - (b.assert_stdout_min_lines ?? 0),
765
- JSON.stringify(a.assert_json_field_equals ?? {}).localeCompare(JSON.stringify(b.assert_json_field_equals ?? {})),
766
- JSON.stringify(a.assert_json_field_gte ?? {}).localeCompare(JSON.stringify(b.assert_json_field_gte ?? {})),
767
- (a.note ?? "").localeCompare(b.note ?? "")
768
- ]));
872
+ compareJsonValues(a.env_clear, b.env_clear, []),
873
+ compareJsonValues(a.env_set, b.env_set, {}),
874
+ compareJsonValues(a.assert_stdout_contains, b.assert_stdout_contains, []),
875
+ compareJsonValues(a.assert_stdout_regex, b.assert_stdout_regex, []),
876
+ compareJsonValues(a.assert_stderr_contains, b.assert_stderr_contains, []),
877
+ compareJsonValues(a.assert_stderr_regex, b.assert_stderr_regex, []),
878
+ compareOptionalNumbers(a.assert_stdout_min_lines, b.assert_stdout_min_lines),
879
+ compareJsonValues(a.assert_json_field_equals, b.assert_json_field_equals, {}),
880
+ compareJsonValues(a.assert_json_field_gte, b.assert_json_field_gte, {}),
881
+ compareOptionalStrings(a.note, b.note)
882
+ ]);
883
+ }
884
+ function compareOptionalStrings(left, right) {
885
+ return (left ?? "").localeCompare(right ?? "");
886
+ }
887
+ function compareOptionalNumbers(left, right) {
888
+ return (left ?? 0) - (right ?? 0);
889
+ }
890
+ function compareJsonValues(left, right, fallback) {
891
+ return JSON.stringify(left ?? fallback).localeCompare(JSON.stringify(right ?? fallback));
769
892
  }
770
893
  function sortDocs(values) {
771
894
  if (!values || values.length === 0)
@@ -878,65 +1001,71 @@ function normalizePlanStepDocs(value) {
878
1001
  }
879
1002
  return out.length > 0 ? out : void 0;
880
1003
  }
1004
+ function normalizePlanStepEntry(entry) {
1005
+ if (entry === null || typeof entry !== "object") {
1006
+ return void 0;
1007
+ }
1008
+ const record = entry;
1009
+ const id = trimStringOrUndefined(record.id);
1010
+ const title = trimStringOrUndefined(record.title);
1011
+ const statusRaw = trimStringOrUndefined(record.status);
1012
+ const status = statusRaw && PLAN_STEP_STATUS_SET.has(statusRaw) ? statusRaw : void 0;
1013
+ const orderRaw = record.order;
1014
+ const order = typeof orderRaw === "number" && Number.isFinite(orderRaw) ? orderRaw : typeof orderRaw === "string" && orderRaw.trim().length > 0 ? Number(orderRaw) : Number.NaN;
1015
+ const created_at = typeof record.created_at === "string" ? record.created_at : "";
1016
+ const updated_at = typeof record.updated_at === "string" ? record.updated_at : "";
1017
+ if (!id || !title || !status || !Number.isFinite(order) || !created_at || !updated_at) {
1018
+ return void 0;
1019
+ }
1020
+ const step = {
1021
+ id,
1022
+ order,
1023
+ title,
1024
+ status,
1025
+ created_at,
1026
+ updated_at
1027
+ };
1028
+ applyPlanStepOptionalFields(step, record);
1029
+ return step;
1030
+ }
1031
+ function applyPlanStepOptionalFields(step, record) {
1032
+ const stringFields = [
1033
+ ["body", "body"],
1034
+ ["owner", "owner"],
1035
+ ["evidence", "evidence"],
1036
+ ["blocked_reason", "blocked_reason"],
1037
+ ["superseded_by", "superseded_by"]
1038
+ ];
1039
+ for (const [target, source] of stringFields) {
1040
+ const value = trimStringOrUndefined(record[source]);
1041
+ if (value) {
1042
+ step[target] = value;
1043
+ }
1044
+ }
1045
+ const completedAt = typeof record.completed_at === "string" ? record.completed_at : void 0;
1046
+ if (completedAt && completedAt.length > 0) {
1047
+ step.completed_at = completedAt;
1048
+ }
1049
+ const collectionFields = [
1050
+ ["linked_items", "linked_items", normalizePlanStepLinks],
1051
+ ["files", "files", normalizePlanStepFiles],
1052
+ ["tests", "tests", normalizePlanStepTests],
1053
+ ["docs", "docs", normalizePlanStepDocs]
1054
+ ];
1055
+ for (const [target, source, normalize] of collectionFields) {
1056
+ const value = normalize(record[source]);
1057
+ if (value) {
1058
+ step[target] = value;
1059
+ }
1060
+ }
1061
+ }
881
1062
  function normalizePlanSteps(value) {
882
1063
  if (!Array.isArray(value))
883
1064
  return void 0;
884
- const out = [];
885
- for (const entry of value) {
886
- if (entry === null || typeof entry !== "object")
887
- continue;
888
- const record = entry;
889
- const id = trimStringOrUndefined(record.id);
890
- const title = trimStringOrUndefined(record.title);
891
- const status = trimStringOrUndefined(record.status);
892
- const orderRaw = record.order;
893
- const order = typeof orderRaw === "number" && Number.isFinite(orderRaw) ? orderRaw : Number(orderRaw);
894
- if (!id || !title || !status || !Number.isFinite(order))
895
- continue;
896
- const created_at = typeof record.created_at === "string" ? record.created_at : "";
897
- const updated_at = typeof record.updated_at === "string" ? record.updated_at : "";
898
- if (!created_at || !updated_at)
899
- continue;
900
- const step = {
901
- id,
902
- order,
903
- title,
904
- status,
905
- created_at,
906
- updated_at
907
- };
908
- const body = trimStringOrUndefined(record.body);
909
- if (body)
910
- step.body = body;
911
- const owner = trimStringOrUndefined(record.owner);
912
- if (owner)
913
- step.owner = owner;
914
- const evidence = trimStringOrUndefined(record.evidence);
915
- if (evidence)
916
- step.evidence = evidence;
917
- const blockedReason = trimStringOrUndefined(record.blocked_reason);
918
- if (blockedReason)
919
- step.blocked_reason = blockedReason;
920
- const supersededBy = trimStringOrUndefined(record.superseded_by);
921
- if (supersededBy)
922
- step.superseded_by = supersededBy;
923
- const completedAt = typeof record.completed_at === "string" ? record.completed_at : void 0;
924
- if (completedAt && completedAt.length > 0)
925
- step.completed_at = completedAt;
926
- const links = normalizePlanStepLinks(record.linked_items);
927
- if (links)
928
- step.linked_items = links;
929
- const files = normalizePlanStepFiles(record.files);
930
- if (files)
931
- step.files = files;
932
- const tests = normalizePlanStepTests(record.tests);
933
- if (tests)
934
- step.tests = tests;
935
- const docs = normalizePlanStepDocs(record.docs);
936
- if (docs)
937
- step.docs = docs;
938
- out.push(step);
939
- }
1065
+ const out = value.flatMap((entry) => {
1066
+ const step = normalizePlanStepEntry(entry);
1067
+ return step ? [step] : [];
1068
+ });
940
1069
  out.sort((left, right) => left.order - right.order);
941
1070
  return out.length > 0 ? out : void 0;
942
1071
  }
@@ -1056,6 +1185,46 @@ function normalizeSeverityValue(value) {
1056
1185
  }
1057
1186
  return void 0;
1058
1187
  }
1188
+ function emptyStringToUndefined(value) {
1189
+ return value || void 0;
1190
+ }
1191
+ function copyExtensionFrontMatterFields(normalized, source) {
1192
+ const targetRecord = normalized;
1193
+ const sourceRecord = source;
1194
+ for (const [key, value] of Object.entries(sourceRecord)) {
1195
+ if (isUnsafeObjectKey(key) || Object.prototype.hasOwnProperty.call(targetRecord, key) || value === void 0) {
1196
+ continue;
1197
+ }
1198
+ targetRecord[key] = value;
1199
+ }
1200
+ }
1201
+ function coerceNormalizedRuntimeFields(normalized, runtimeContext) {
1202
+ if (!runtimeContext?.fieldRegistry) {
1203
+ return;
1204
+ }
1205
+ const record = normalized;
1206
+ for (const definition of runtimeContext.fieldRegistry.definitions) {
1207
+ const currentValue = record[definition.metadata_key];
1208
+ if (currentValue === void 0) {
1209
+ continue;
1210
+ }
1211
+ record[definition.metadata_key] = coerceRuntimeFieldValue(definition, currentValue, `metadata field "${definition.metadata_key}"`);
1212
+ }
1213
+ }
1214
+ function assertNormalizedUnknownFields(normalized, runtimeContext) {
1215
+ if (!runtimeContext || runtimeContext.unknownFieldPolicy === "allow") {
1216
+ return;
1217
+ }
1218
+ const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
1219
+ const record = normalized;
1220
+ const unknownKeys = Object.keys(record).filter((key) => !knownKeys.has(key)).sort((left, right) => left.localeCompare(right));
1221
+ if (unknownKeys.length > 0 && runtimeContext.unknownFieldPolicy === "reject") {
1222
+ validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
1223
+ }
1224
+ if (unknownKeys.length > 0) {
1225
+ runtimeContext.onWarning?.(`item_unknown_schema_fields:${unknownKeys.join(",")}`);
1226
+ }
1227
+ }
1059
1228
  function normalizeFrontMatter(frontMatter, options = {}) {
1060
1229
  const runtimeContext = resolveRuntimeSchemaValidationContext(options);
1061
1230
  const normalizedStatus = normalizeStatusInput(frontMatter.status, runtimeContext?.statusRegistry) ?? frontMatter.status;
@@ -1066,7 +1235,7 @@ function normalizeFrontMatter(frontMatter, options = {}) {
1066
1235
  description: frontMatter.description,
1067
1236
  type: frontMatter.type,
1068
1237
  pm_format_version: normalizeItemFormatVersion(frontMatter.pm_format_version),
1069
- source_type: frontMatter.source_type?.trim() || void 0,
1238
+ source_type: trimStringOrUndefined(frontMatter.source_type),
1070
1239
  type_options: normalizeTypeOptions(frontMatter.type_options),
1071
1240
  status: normalizedStatus,
1072
1241
  priority: frontMatter.priority,
@@ -1081,47 +1250,47 @@ function normalizeFrontMatter(frontMatter, options = {}) {
1081
1250
  tests: sortTests(frontMatter.tests),
1082
1251
  test_runs: normalizeTestRunSummaries(frontMatter.test_runs),
1083
1252
  docs: sortDocs(frontMatter.docs),
1084
- deadline: frontMatter.deadline || void 0,
1253
+ deadline: emptyStringToUndefined(frontMatter.deadline),
1085
1254
  reminders: sortReminders(frontMatter.reminders),
1086
1255
  events: sortEvents(frontMatter.events),
1087
- closed_at: frontMatter.closed_at || void 0,
1088
- assignee: frontMatter.assignee?.trim() || void 0,
1089
- source_owner: frontMatter.source_owner?.trim() || void 0,
1090
- author: frontMatter.author || void 0,
1256
+ closed_at: emptyStringToUndefined(frontMatter.closed_at),
1257
+ assignee: trimStringOrUndefined(frontMatter.assignee),
1258
+ source_owner: trimStringOrUndefined(frontMatter.source_owner),
1259
+ author: emptyStringToUndefined(frontMatter.author),
1091
1260
  estimated_minutes: frontMatter.estimated_minutes,
1092
1261
  acceptance_criteria: frontMatter.acceptance_criteria ?? void 0,
1093
1262
  design: frontMatter.design ?? void 0,
1094
1263
  external_ref: frontMatter.external_ref ?? void 0,
1095
- definition_of_ready: frontMatter.definition_of_ready?.trim() || void 0,
1264
+ definition_of_ready: trimStringOrUndefined(frontMatter.definition_of_ready),
1096
1265
  order: frontMatter.order,
1097
- goal: frontMatter.goal?.trim() || void 0,
1098
- objective: frontMatter.objective?.trim() || void 0,
1099
- value: frontMatter.value?.trim() || void 0,
1100
- impact: frontMatter.impact?.trim() || void 0,
1101
- outcome: frontMatter.outcome?.trim() || void 0,
1102
- why_now: frontMatter.why_now?.trim() || void 0,
1103
- parent: frontMatter.parent?.trim() || void 0,
1104
- reviewer: frontMatter.reviewer?.trim() || void 0,
1266
+ goal: trimStringOrUndefined(frontMatter.goal),
1267
+ objective: trimStringOrUndefined(frontMatter.objective),
1268
+ value: trimStringOrUndefined(frontMatter.value),
1269
+ impact: trimStringOrUndefined(frontMatter.impact),
1270
+ outcome: trimStringOrUndefined(frontMatter.outcome),
1271
+ why_now: trimStringOrUndefined(frontMatter.why_now),
1272
+ parent: trimStringOrUndefined(frontMatter.parent),
1273
+ reviewer: trimStringOrUndefined(frontMatter.reviewer),
1105
1274
  risk: frontMatter.risk ?? void 0,
1106
1275
  confidence: normalizeConfidenceValue(frontMatter.confidence),
1107
- sprint: frontMatter.sprint?.trim() || void 0,
1108
- release: frontMatter.release?.trim() || void 0,
1109
- blocked_by: frontMatter.blocked_by?.trim() || void 0,
1110
- blocked_reason: frontMatter.blocked_reason?.trim() || void 0,
1111
- unblock_note: frontMatter.unblock_note?.trim() || void 0,
1112
- reporter: frontMatter.reporter?.trim() || void 0,
1276
+ sprint: trimStringOrUndefined(frontMatter.sprint),
1277
+ release: trimStringOrUndefined(frontMatter.release),
1278
+ blocked_by: trimStringOrUndefined(frontMatter.blocked_by),
1279
+ blocked_reason: trimStringOrUndefined(frontMatter.blocked_reason),
1280
+ unblock_note: trimStringOrUndefined(frontMatter.unblock_note),
1281
+ reporter: trimStringOrUndefined(frontMatter.reporter),
1113
1282
  severity: normalizeSeverityValue(frontMatter.severity),
1114
- environment: frontMatter.environment?.trim() || void 0,
1115
- repro_steps: frontMatter.repro_steps?.trim() || void 0,
1116
- resolution: frontMatter.resolution?.trim() || void 0,
1117
- expected_result: frontMatter.expected_result?.trim() || void 0,
1118
- actual_result: frontMatter.actual_result?.trim() || void 0,
1119
- affected_version: frontMatter.affected_version?.trim() || void 0,
1120
- fixed_version: frontMatter.fixed_version?.trim() || void 0,
1121
- component: frontMatter.component?.trim() || void 0,
1283
+ environment: trimStringOrUndefined(frontMatter.environment),
1284
+ repro_steps: trimStringOrUndefined(frontMatter.repro_steps),
1285
+ resolution: trimStringOrUndefined(frontMatter.resolution),
1286
+ expected_result: trimStringOrUndefined(frontMatter.expected_result),
1287
+ actual_result: trimStringOrUndefined(frontMatter.actual_result),
1288
+ affected_version: trimStringOrUndefined(frontMatter.affected_version),
1289
+ fixed_version: trimStringOrUndefined(frontMatter.fixed_version),
1290
+ component: trimStringOrUndefined(frontMatter.component),
1122
1291
  regression: frontMatter.regression,
1123
- customer_impact: frontMatter.customer_impact?.trim() || void 0,
1124
- close_reason: frontMatter.close_reason || void 0,
1292
+ customer_impact: trimStringOrUndefined(frontMatter.customer_impact),
1293
+ close_reason: emptyStringToUndefined(frontMatter.close_reason),
1125
1294
  plan_mode: trimStringOrUndefined(frontMatter.plan_mode),
1126
1295
  plan_scope: trimStringOrUndefined(frontMatter.plan_scope),
1127
1296
  plan_harness: trimStringOrUndefined(frontMatter.plan_harness),
@@ -1131,36 +1300,10 @@ function normalizeFrontMatter(frontMatter, options = {}) {
1131
1300
  plan_discoveries: normalizePlanDiscoveries(frontMatter.plan_discoveries),
1132
1301
  plan_validation: normalizePlanValidation(frontMatter.plan_validation)
1133
1302
  };
1134
- const sourceRecord = frontMatter;
1135
- for (const [key, value] of Object.entries(sourceRecord)) {
1136
- if (Object.prototype.hasOwnProperty.call(normalized, key) || value === void 0) {
1137
- continue;
1138
- }
1139
- normalized[key] = value;
1140
- }
1141
- if (runtimeContext?.fieldRegistry) {
1142
- for (const definition of runtimeContext.fieldRegistry.definitions) {
1143
- const currentValue = normalized[definition.metadata_key];
1144
- if (currentValue === void 0) {
1145
- continue;
1146
- }
1147
- normalized[definition.metadata_key] = coerceRuntimeFieldValue(definition, currentValue, `metadata field "${definition.metadata_key}"`);
1148
- }
1149
- }
1150
- if (runtimeContext && runtimeContext.unknownFieldPolicy !== "allow") {
1151
- const knownKeys = buildKnownFrontMatterKeys(runtimeContext);
1152
- const unknownKeys = Object.keys(normalized).filter((key) => !knownKeys.has(key)).sort((left, right) => left.localeCompare(right));
1153
- if (unknownKeys.length > 0) {
1154
- if (runtimeContext.unknownFieldPolicy === "reject") {
1155
- validationError(`unknown schema fields are not allowed: ${unknownKeys.join(", ")}`);
1156
- }
1157
- }
1158
- }
1159
- for (const [key, value] of Object.entries(normalized)) {
1160
- if (value === void 0) {
1161
- delete normalized[key];
1162
- }
1163
- }
1303
+ copyExtensionFrontMatterFields(normalized, frontMatter);
1304
+ coerceNormalizedRuntimeFields(normalized, runtimeContext);
1305
+ assertNormalizedUnknownFields(normalized, runtimeContext);
1306
+ deleteUndefinedFields(normalized);
1164
1307
  return normalized;
1165
1308
  }
1166
1309
  function orderFrontMatter(frontMatter) {
@@ -1234,6 +1377,9 @@ function stripLeadingYamlDocument(content) {
1234
1377
  }
1235
1378
  return { content: normalizedContent, stripped: false };
1236
1379
  }
1380
+ function normalizeParsedFrontMatter(frontMatter, options) {
1381
+ return normalizeFrontMatter(frontMatter, { ...options, onWarning: void 0 });
1382
+ }
1237
1383
  function parseJsonMarkdownItemDocument(content, runtimeContext, options = {}) {
1238
1384
  const normalized = stripLeadingYamlDocument(content);
1239
1385
  if (normalized.stripped) {
@@ -1255,7 +1401,7 @@ function parseJsonMarkdownItemDocument(content, runtimeContext, options = {}) {
1255
1401
  }
1256
1402
  assertValidFrontMatter(parsed, runtimeContext);
1257
1403
  return {
1258
- metadata: normalizeFrontMatter(parsed, options),
1404
+ metadata: normalizeParsedFrontMatter(parsed, options),
1259
1405
  body: normalizeBody(body)
1260
1406
  };
1261
1407
  }
@@ -1272,7 +1418,7 @@ function parseToonItemDocument(content, runtimeContext, options = {}) {
1272
1418
  assertValidFrontMatter(record.front_matter, runtimeContext);
1273
1419
  assertFrontMatterCondition(record.body === void 0 || typeof record.body === "string", "TOON item document body must be a string");
1274
1420
  return {
1275
- metadata: normalizeFrontMatter(record.front_matter, options),
1421
+ metadata: normalizeParsedFrontMatter(record.front_matter, options),
1276
1422
  body: normalizeBody(typeof record.body === "string" ? record.body : "")
1277
1423
  };
1278
1424
  }
@@ -1280,7 +1426,7 @@ function parseToonItemDocument(content, runtimeContext, options = {}) {
1280
1426
  assertFrontMatterCondition(body === void 0 || typeof body === "string", "TOON item document body must be a string");
1281
1427
  assertValidFrontMatter(frontMatterRecord, runtimeContext);
1282
1428
  return {
1283
- metadata: normalizeFrontMatter(frontMatterRecord, options),
1429
+ metadata: normalizeParsedFrontMatter(frontMatterRecord, options),
1284
1430
  body: normalizeBody(typeof body === "string" ? body : "")
1285
1431
  };
1286
1432
  }
@@ -1348,6 +1494,6 @@ export {
1348
1494
  serializeItemDocument,
1349
1495
  canonicalDocument
1350
1496
  };
1351
- //# sourceMappingURL=chunk-V3KLX7U7.js.map
1497
+ //# sourceMappingURL=chunk-KN3URLKS.js.map
1352
1498
 
1353
- //# debugId=da8f95fe-2b22-59c6-af82-e0bd090502e4
1499
+ //# debugId=89ae7463-1314-574c-9158-0967e6d9c589