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