unspaghettit 0.2.0 → 0.4.0
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/README.md +56 -18
- package/build/client/_app/immutable/assets/0.DCOD5ne_.css +1 -0
- package/build/client/_app/immutable/assets/0.DCOD5ne_.css.br +0 -0
- package/build/client/_app/immutable/assets/0.DCOD5ne_.css.gz +0 -0
- package/build/client/_app/immutable/assets/12.nv0I59TU.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.B3akUL9A.css.gz +0 -0
- package/build/client/_app/immutable/assets/BehaviorGraph.Bk0xQRZk.css +1 -0
- package/build/client/_app/immutable/assets/BehaviorGraph.Bk0xQRZk.css.br +0 -0
- package/build/client/_app/immutable/assets/BehaviorGraph.Bk0xQRZk.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B3vnQs252.js +1 -0
- package/build/client/_app/immutable/chunks/B3vnQs252.js.br +0 -0
- package/build/client/_app/immutable/chunks/B3vnQs252.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CxyLMlpt2.js → BANF9BhQ2.js} +1 -1
- package/build/client/_app/immutable/chunks/BANF9BhQ2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BANF9BhQ2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BJdTO_n6.js +1 -0
- package/build/client/_app/immutable/chunks/BJdTO_n6.js.br +0 -0
- package/build/client/_app/immutable/chunks/BJdTO_n6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BPl9BITm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BQ9GodWX2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bcyn5YUg.js +4 -0
- package/build/client/_app/immutable/chunks/Bcyn5YUg.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bcyn5YUg.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bfc9rQXP.js +1 -0
- package/build/client/_app/immutable/chunks/Bfc9rQXP.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bfc9rQXP.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BfMYiIUi.js → BjxqhpPG.js} +1 -1
- package/build/client/_app/immutable/chunks/BjxqhpPG.js.br +0 -0
- package/build/client/_app/immutable/chunks/BjxqhpPG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ByaoVvNB.js +1 -0
- package/build/client/_app/immutable/chunks/ByaoVvNB.js.br +0 -0
- package/build/client/_app/immutable/chunks/ByaoVvNB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BzLd0mTH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C8b3IMj8.js +1 -0
- package/build/client/_app/immutable/chunks/C8b3IMj8.js.br +0 -0
- package/build/client/_app/immutable/chunks/C8b3IMj8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CXvvf4uQ.js +1 -0
- package/build/client/_app/immutable/chunks/CXvvf4uQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/CXvvf4uQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cl7Z3e6-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ClC4qR7W2.js +2 -0
- package/build/client/_app/immutable/chunks/ClC4qR7W2.js.br +0 -0
- package/build/client/_app/immutable/chunks/ClC4qR7W2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CuGlh1c2.js +1 -0
- package/build/client/_app/immutable/chunks/CuGlh1c2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CuGlh1c2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CwzIdrQR.js +1 -0
- package/build/client/_app/immutable/chunks/CwzIdrQR.js.br +0 -0
- package/build/client/_app/immutable/chunks/CwzIdrQR.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D5speDV82.js +908 -0
- package/build/client/_app/immutable/chunks/D5speDV82.js.br +0 -0
- package/build/client/_app/immutable/chunks/D5speDV82.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D64sGJRN.js +1 -0
- package/build/client/_app/immutable/chunks/D64sGJRN.js.br +0 -0
- package/build/client/_app/immutable/chunks/D64sGJRN.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DNaA4QRO2.js +1 -0
- package/build/client/_app/immutable/chunks/DNaA4QRO2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DNaA4QRO2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Da59TXPe.js +1 -0
- package/build/client/_app/immutable/chunks/Da59TXPe.js.br +2 -0
- package/build/client/_app/immutable/chunks/Da59TXPe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DhTiE3j02.js +2 -0
- package/build/client/_app/immutable/chunks/DhTiE3j02.js.br +0 -0
- package/build/client/_app/immutable/chunks/DhTiE3j02.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dhqg7r_2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DmyaDy4d2.js +1 -0
- package/build/client/_app/immutable/chunks/DmyaDy4d2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DmyaDy4d2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DryaQyjN2.js +1 -0
- package/build/client/_app/immutable/chunks/DryaQyjN2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DryaQyjN2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DtK8qK5Q2.js +1 -0
- package/build/client/_app/immutable/chunks/DtK8qK5Q2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DtK8qK5Q2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DtblIi6X2.js +1 -0
- package/build/client/_app/immutable/chunks/DtblIi6X2.js.br +1 -0
- package/build/client/_app/immutable/chunks/DtblIi6X2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/UkzDDeO42.js +1 -0
- package/build/client/_app/immutable/chunks/UkzDDeO42.js.br +0 -0
- package/build/client/_app/immutable/chunks/UkzDDeO42.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Vu8LzrwP2.js +1 -0
- package/build/client/_app/immutable/chunks/Vu8LzrwP2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Vu8LzrwP2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/_b612aVb.js +1 -0
- package/build/client/_app/immutable/chunks/_b612aVb.js.br +0 -0
- package/build/client/_app/immutable/chunks/_b612aVb.js.gz +0 -0
- package/build/client/_app/immutable/chunks/aNMRV4sP2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/cMamJTsF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ib21i2T_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/kNaey6uv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/oVMDLirx.js +1 -0
- package/build/client/_app/immutable/chunks/oVMDLirx.js.br +0 -0
- package/build/client/_app/immutable/chunks/oVMDLirx.js.gz +0 -0
- package/build/client/_app/immutable/chunks/olAc024e.js +1 -0
- package/build/client/_app/immutable/chunks/olAc024e.js.br +0 -0
- package/build/client/_app/immutable/chunks/olAc024e.js.gz +0 -0
- package/build/client/_app/immutable/chunks/suTxxv1t.js.gz +0 -0
- package/build/client/_app/immutable/chunks/wXIHzLMQ2.js +1 -0
- package/build/client/_app/immutable/chunks/wXIHzLMQ2.js.br +0 -0
- package/build/client/_app/immutable/chunks/wXIHzLMQ2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/wrqalH0a.js +1 -0
- package/build/client/_app/immutable/chunks/wrqalH0a.js.br +0 -0
- package/build/client/_app/immutable/chunks/wrqalH0a.js.gz +0 -0
- package/build/client/_app/immutable/chunks/x60Tn5kT.js +1 -0
- package/build/client/_app/immutable/chunks/x60Tn5kT.js.br +0 -0
- package/build/client/_app/immutable/chunks/x60Tn5kT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/xihTtKlq.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BOrLmFwJ.js → yShDxCNj.js} +1 -1
- package/build/client/_app/immutable/chunks/yShDxCNj.js.br +2 -0
- package/build/client/_app/immutable/chunks/yShDxCNj.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.Etd-exTb.js +2 -0
- package/build/client/_app/immutable/entry/app.Etd-exTb.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Etd-exTb.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DY2B3u4g.js +1 -0
- package/build/client/_app/immutable/entry/start.DY2B3u4g.js.br +0 -0
- package/build/client/_app/immutable/entry/start.DY2B3u4g.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.tKfYV3__.js +8 -0
- package/build/client/_app/immutable/nodes/0.tKfYV3__.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.tKfYV3__.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.KYdA6ppX.js → 1.CER5ICKt.js} +1 -1
- package/build/client/_app/immutable/nodes/1.CER5ICKt.js.br +1 -0
- package/build/client/_app/immutable/nodes/1.CER5ICKt.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.rT7cD8kX.js +1 -0
- package/build/client/_app/immutable/nodes/10.rT7cD8kX.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.rT7cD8kX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.BAnV_Y5Y.js +2 -0
- package/build/client/_app/immutable/nodes/11.BAnV_Y5Y.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.BAnV_Y5Y.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{9.CMW6a2Lg.js → 12.DCTRFMqo.js} +4 -3
- package/build/client/_app/immutable/nodes/12.DCTRFMqo.js.br +0 -0
- package/build/client/_app/immutable/nodes/12.DCTRFMqo.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{2.DBz20KgG.js → 2.CF488WWF.js} +1 -1
- package/build/client/_app/immutable/nodes/2.CF488WWF.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.CF488WWF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CP7CPPVH.js +1 -0
- package/build/client/_app/immutable/nodes/3.CP7CPPVH.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CP7CPPVH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.D1bxCSiM.js +3 -0
- package/build/client/_app/immutable/nodes/4.D1bxCSiM.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.D1bxCSiM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.D6jZgh9y.js +48 -0
- package/build/client/_app/immutable/nodes/5.D6jZgh9y.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.D6jZgh9y.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BrBFUA0s.js +1 -0
- package/build/client/_app/immutable/nodes/6.BrBFUA0s.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BrBFUA0s.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.pajo8MfM.js +3 -0
- package/build/client/_app/immutable/nodes/7.pajo8MfM.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.pajo8MfM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.Cc80_Igi.js +5 -0
- package/build/client/_app/immutable/nodes/8.Cc80_Igi.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.Cc80_Igi.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{7.CemgNJfw.js → 9.D72NaL3l.js} +1 -1
- package/build/client/_app/immutable/nodes/9.D72NaL3l.js.br +1 -0
- package/build/client/_app/immutable/nodes/9.D72NaL3l.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/client/lyriks_logo.svg +148 -0
- package/build/client/lyriks_logo.svg.br +0 -0
- package/build/client/lyriks_logo.svg.gz +0 -0
- package/build/server/chunks/0-8YZc572z.js +15 -0
- package/build/server/chunks/0-8YZc572z.js.map +1 -0
- package/build/server/chunks/1-DxkfSJLu.js +9 -0
- package/build/server/chunks/{1-DPpKAKXV.js.map → 1-DxkfSJLu.js.map} +1 -1
- package/build/server/chunks/10-DkObdGtU.js +9 -0
- package/build/server/chunks/10-DkObdGtU.js.map +1 -0
- package/build/server/chunks/11-DL94HxpZ.js +9 -0
- package/build/server/chunks/11-DL94HxpZ.js.map +1 -0
- package/build/server/chunks/12-CI74sCkt.js +9 -0
- package/build/server/chunks/12-CI74sCkt.js.map +1 -0
- package/build/server/chunks/2-qhWwQ4eL.js +9 -0
- package/build/server/chunks/2-qhWwQ4eL.js.map +1 -0
- package/build/server/chunks/3-CzoZtSTp.js +16 -0
- package/build/server/chunks/3-CzoZtSTp.js.map +1 -0
- package/build/server/chunks/4-CDa9DBsh.js +16 -0
- package/build/server/chunks/4-CDa9DBsh.js.map +1 -0
- package/build/server/chunks/5-qD2xxOrq.js +9 -0
- package/build/server/chunks/5-qD2xxOrq.js.map +1 -0
- package/build/server/chunks/6-B4mWzvDn.js +9 -0
- package/build/server/chunks/6-B4mWzvDn.js.map +1 -0
- package/build/server/chunks/7-zExv-fTN.js +9 -0
- package/build/server/chunks/7-zExv-fTN.js.map +1 -0
- package/build/server/chunks/8-BVrGdQg4.js +9 -0
- package/build/server/chunks/{6-QQ7r8Rd5.js.map → 8-BVrGdQg4.js.map} +1 -1
- package/build/server/chunks/9-BnZLRMYA.js +9 -0
- package/build/server/chunks/9-BnZLRMYA.js.map +1 -0
- package/build/server/chunks/BehaviorGraph-C-9z37Sm.js +788 -0
- package/build/server/chunks/BehaviorGraph-C-9z37Sm.js.map +1 -0
- package/build/server/chunks/Clock-BfMWQpmJ.js +5 -0
- package/build/server/chunks/Clock-BfMWQpmJ.js.map +1 -0
- package/build/server/chunks/DeleteDomain-BvHEgAyp.js +24 -0
- package/build/server/chunks/DeleteDomain-BvHEgAyp.js.map +1 -0
- package/build/server/chunks/{FeatureValidator-B8qEjAUW.js → DeleteFeature-DnK8sBJI.js} +142 -77
- package/build/server/chunks/DeleteFeature-DnK8sBJI.js.map +1 -0
- package/build/server/chunks/DeleteProject-BXZcehHZ.js +41 -0
- package/build/server/chunks/DeleteProject-BXZcehHZ.js.map +1 -0
- package/build/server/chunks/Effect-BJtLR-6l.js +46 -0
- package/build/server/chunks/Effect-BJtLR-6l.js.map +1 -0
- package/build/server/chunks/{FeatureCard-BQOY6gJQ.js → FeatureCard-Bb50FEfp.js} +4 -4
- package/build/server/chunks/{FeatureCard-BQOY6gJQ.js.map → FeatureCard-Bb50FEfp.js.map} +1 -1
- package/build/server/chunks/{FeatureJson-Bv-qiOSf.js → FeatureJson-DYvMEAub.js} +2 -2
- package/build/server/chunks/{FeatureJson-Bv-qiOSf.js.map → FeatureJson-DYvMEAub.js.map} +1 -1
- package/build/server/chunks/{FeatureTransforms-UWDHmWEg.js → FeatureTransforms-B0aI_CJD.js} +10 -3
- package/build/server/chunks/FeatureTransforms-B0aI_CJD.js.map +1 -0
- package/build/server/chunks/{ManageTagsDialog-DBxA3tM2.js → ManageTagsDialog-D5xbAVNB.js} +5 -5
- package/build/server/chunks/ManageTagsDialog-D5xbAVNB.js.map +1 -0
- package/build/server/chunks/{ProgressBar-CfhccQ83.js → ProgressBar-CUC2EZqG.js} +3 -3
- package/build/server/chunks/ProgressBar-CUC2EZqG.js.map +1 -0
- package/build/server/chunks/{ProjectsIndex-CoDrvRya.js → ProjectsIndex-FgIu9dBp.js} +135 -14
- package/build/server/chunks/ProjectsIndex-FgIu9dBp.js.map +1 -0
- package/build/server/chunks/{RenameTag-BuWLMl1m.js → RenameTag-DWIIR4Bx.js} +3 -6
- package/build/server/chunks/RenameTag-DWIIR4Bx.js.map +1 -0
- package/build/server/chunks/ScenarioApplier-YPKECfZe.js +55 -0
- package/build/server/chunks/ScenarioApplier-YPKECfZe.js.map +1 -0
- package/build/server/chunks/SimulatorEngine-DM1F9nCO.js +1391 -0
- package/build/server/chunks/SimulatorEngine-DM1F9nCO.js.map +1 -0
- package/build/server/chunks/StateValue-BBjWox8f.js +105 -0
- package/build/server/chunks/StateValue-BBjWox8f.js.map +1 -0
- package/build/server/chunks/{TagDotStrip-B1XQ0m0Y.js → TagDotStrip-0rn-IJVE.js} +4 -4
- package/build/server/chunks/TagDotStrip-0rn-IJVE.js.map +1 -0
- package/build/server/chunks/{TagFilterSelect-DbO0Qduh.js → TagFilterSelect-Dbu-7Dg4.js} +5 -5
- package/build/server/chunks/{TagFilterSelect-DbO0Qduh.js.map → TagFilterSelect-Dbu-7Dg4.js.map} +1 -1
- package/build/server/chunks/{TagPalette-CtMNYCmu.js → TagPalette-CpdTiC_7.js} +101 -9
- package/build/server/chunks/TagPalette-CpdTiC_7.js.map +1 -0
- package/build/server/chunks/TransitionCatalog-CYXUANy6.js +271 -0
- package/build/server/chunks/TransitionCatalog-CYXUANy6.js.map +1 -0
- package/build/server/chunks/_layout.svelte-pSSG85WT.js +1342 -0
- package/build/server/chunks/_layout.svelte-pSSG85WT.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BKTveFAj.js → _page.svelte-BNH3szkk.js} +22 -17
- package/build/server/chunks/{_page.svelte-BKTveFAj.js.map → _page.svelte-BNH3szkk.js.map} +1 -1
- package/build/server/chunks/_page.svelte-BcuGvUt1.js +37 -0
- package/build/server/chunks/{_page.svelte-B7hT3P8E.js.map → _page.svelte-BcuGvUt1.js.map} +1 -1
- package/build/server/chunks/_page.svelte-BoOMG5Y0.js +37 -0
- package/build/server/chunks/{_page.svelte-De508ek8.js.map → _page.svelte-BoOMG5Y0.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-BqSC-1vK.js → _page.svelte-C4PRh_wP.js} +104 -54
- package/build/server/chunks/_page.svelte-C4PRh_wP.js.map +1 -0
- package/build/server/chunks/_page.svelte-Cqn34NXy.js +74 -0
- package/build/server/chunks/_page.svelte-Cqn34NXy.js.map +1 -0
- package/build/server/chunks/{_page.svelte-B1s7jxaQ.js → _page.svelte-DSCeOGv7.js} +15 -10
- package/build/server/chunks/_page.svelte-DSCeOGv7.js.map +1 -0
- package/build/server/chunks/_page.svelte-DqWdGt48.js +182 -0
- package/build/server/chunks/_page.svelte-DqWdGt48.js.map +1 -0
- package/build/server/chunks/_page.svelte-DsQHSEl4.js +49 -0
- package/build/server/chunks/_page.svelte-DsQHSEl4.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BKKCa9H5.js → _page.svelte-Uioz8hsG.js} +18 -11
- package/build/server/chunks/{_page.svelte-BKKCa9H5.js.map → _page.svelte-Uioz8hsG.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-Zf9H4KOP.js → _page.svelte-p38jot9e.js} +81 -478
- package/build/server/chunks/_page.svelte-p38jot9e.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BtI2zZ_Z.js → _page.svelte-yN5kzgJ9.js} +251 -447
- package/build/server/chunks/_page.svelte-yN5kzgJ9.js.map +1 -0
- package/build/server/chunks/{_server.ts-DsbbVoOn.js → _server.ts-1CtrHhte.js} +4 -4
- package/build/server/chunks/{_server.ts-DsbbVoOn.js.map → _server.ts-1CtrHhte.js.map} +1 -1
- package/build/server/chunks/{_server.ts-CWvU15tL.js → _server.ts-71Qx1lQb.js} +4 -4
- package/build/server/chunks/{_server.ts-CWvU15tL.js.map → _server.ts-71Qx1lQb.js.map} +1 -1
- package/build/server/chunks/_server.ts-BAyekGHB.js +961 -0
- package/build/server/chunks/_server.ts-BAyekGHB.js.map +1 -0
- package/build/server/chunks/{_server.ts-BihpbxOW.js → _server.ts-BLWhU22T.js} +4 -4
- package/build/server/chunks/{_server.ts-BihpbxOW.js.map → _server.ts-BLWhU22T.js.map} +1 -1
- package/build/server/chunks/{_server.ts-YnfXkeMJ.js → _server.ts-C7EVZVxv.js} +22 -13
- package/build/server/chunks/_server.ts-C7EVZVxv.js.map +1 -0
- package/build/server/chunks/{_server.ts-vcaqdwxS.js → _server.ts-CGjYuLmo.js} +12 -7
- package/build/server/chunks/_server.ts-CGjYuLmo.js.map +1 -0
- package/build/server/chunks/{_server.ts-Dy5zQHe2.js → _server.ts-CX6H8fSE.js} +8 -31
- package/build/server/chunks/_server.ts-CX6H8fSE.js.map +1 -0
- package/build/server/chunks/{_server.ts-BuoQ02BW.js → _server.ts-CyEdTCLr.js} +4 -4
- package/build/server/chunks/{_server.ts-BuoQ02BW.js.map → _server.ts-CyEdTCLr.js.map} +1 -1
- package/build/server/chunks/_server.ts-DKVTM9Pj.js +77 -0
- package/build/server/chunks/_server.ts-DKVTM9Pj.js.map +1 -0
- package/build/server/chunks/{_server.ts-0uNTZKwF.js → _server.ts-Dip65hLJ.js} +15 -9
- package/build/server/chunks/_server.ts-Dip65hLJ.js.map +1 -0
- package/build/server/chunks/{_server.ts-D4EO0VHu.js → _server.ts-Dm0tCs2i.js} +5 -5
- package/build/server/chunks/{_server.ts-D4EO0VHu.js.map → _server.ts-Dm0tCs2i.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BIBWjQI-.js → _server.ts-DsYwK_uW.js} +4 -4
- package/build/server/chunks/{_server.ts-BIBWjQI-.js.map → _server.ts-DsYwK_uW.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DDa0Nk_S.js → _server.ts-RCEgegYU.js} +4 -4
- package/build/server/chunks/{_server.ts-DDa0Nk_S.js.map → _server.ts-RCEgegYU.js.map} +1 -1
- package/build/server/chunks/_server.ts-XOLAT4dd.js +146 -0
- package/build/server/chunks/_server.ts-XOLAT4dd.js.map +1 -0
- package/build/server/chunks/_server.ts-afh_zLVi.js +69 -0
- package/build/server/chunks/_server.ts-afh_zLVi.js.map +1 -0
- package/build/server/chunks/{browserContainer-CNX7ANld.js → browserContainer-BdldtueJ.js} +71 -1378
- package/build/server/chunks/browserContainer-BdldtueJ.js.map +1 -0
- package/build/server/chunks/buildSearchDocs-Cyfrnw9G.js +337 -0
- package/build/server/chunks/buildSearchDocs-Cyfrnw9G.js.map +1 -0
- package/build/server/chunks/{builderModeStore.svelte-ihupr-3p.js → builderModeStore.svelte-BEZMQEqn.js} +223 -11
- package/build/server/chunks/builderModeStore.svelte-BEZMQEqn.js.map +1 -0
- package/build/server/chunks/client-C9Cat4DK.js +51 -0
- package/build/server/chunks/{client-DfpLcAZ9.js.map → client-C9Cat4DK.js.map} +1 -1
- package/build/server/chunks/{error.svelte-C35KOpru.js → error.svelte-CzVR_A6P.js} +5 -5
- package/build/server/chunks/{error.svelte-C35KOpru.js.map → error.svelte-CzVR_A6P.js.map} +1 -1
- package/build/server/chunks/featureQueueContext-DuXpyTdC.js +32 -0
- package/build/server/chunks/featureQueueContext-DuXpyTdC.js.map +1 -0
- package/build/server/chunks/featureStore.svelte-DHZf88gu.js +162 -0
- package/build/server/chunks/featureStore.svelte-DHZf88gu.js.map +1 -0
- package/build/server/chunks/{projectsStore.svelte-QDz5PchX.js → featuresStore.svelte-bUyQBg1-.js} +95 -3
- package/build/server/chunks/featuresStore.svelte-bUyQBg1-.js.map +1 -0
- package/build/server/chunks/{hooks.server-Rv301GTB.js → hooks.server-y3jdg_sB.js} +6 -2
- package/build/server/chunks/hooks.server-y3jdg_sB.js.map +1 -0
- package/build/server/chunks/humanize-CkCPfeWi.js +53 -0
- package/build/server/chunks/humanize-CkCPfeWi.js.map +1 -0
- package/build/server/chunks/{index-server-7H0jzj0M.js → index-server-DvBux_Gf.js} +47 -2
- package/build/server/chunks/{index-server-7H0jzj0M.js.map → index-server-DvBux_Gf.js.map} +1 -1
- package/build/server/chunks/{internal-BPKrFkK1.js → internal-BFt8yDlf.js} +5 -5
- package/build/server/chunks/{internal-BPKrFkK1.js.map → internal-BFt8yDlf.js.map} +1 -1
- package/build/server/chunks/projectBundleClient-BtvWPh87.js +168 -0
- package/build/server/chunks/projectBundleClient-BtvWPh87.js.map +1 -0
- package/build/server/chunks/projectContextStore.svelte-jRJGJZ42.js +141 -0
- package/build/server/chunks/projectContextStore.svelte-jRJGJZ42.js.map +1 -0
- package/build/server/chunks/projectFeaturesStore.svelte-BwNEtDIL.js +87 -0
- package/build/server/chunks/projectFeaturesStore.svelte-BwNEtDIL.js.map +1 -0
- package/build/server/chunks/projectStore.svelte-BNuLNxk_.js +230 -0
- package/build/server/chunks/projectStore.svelte-BNuLNxk_.js.map +1 -0
- package/build/server/chunks/{reconcile-Dv7jS3C8.js → reconcile-CVG2LSlW.js} +54 -267
- package/build/server/chunks/reconcile-CVG2LSlW.js.map +1 -0
- package/build/server/chunks/registry-DqAn_hVE.js +21 -0
- package/build/server/chunks/registry-DqAn_hVE.js.map +1 -0
- package/build/server/chunks/{snapshotRepository-BPXCjX92.js → snapshotRepository-8f-2wTrb.js} +30 -5
- package/build/server/chunks/snapshotRepository-8f-2wTrb.js.map +1 -0
- package/build/server/chunks/{state-CpLVNZq7.js → state-CZZtjXLE.js} +3 -3
- package/build/server/chunks/{state-CpLVNZq7.js.map → state-CZZtjXLE.js.map} +1 -1
- package/build/server/chunks/{sync-DZ3dn761.js → sync-Bn6eSUhC.js} +3 -3
- package/build/server/chunks/{sync-DZ3dn761.js.map → sync-Bn6eSUhC.js.map} +1 -1
- package/build/server/chunks/{syncBridge-BwXzPdjJ.js → syncAwareRepositories-DvUjq5Q6.js} +27 -3
- package/build/server/chunks/syncAwareRepositories-DvUjq5Q6.js.map +1 -0
- package/build/server/chunks/{tagPaletteStore.svelte-DfZOBvgY.js → tagPaletteStore.svelte-C71bdzDl.js} +4 -4
- package/build/server/chunks/{tagPaletteStore.svelte-DfZOBvgY.js.map → tagPaletteStore.svelte-C71bdzDl.js.map} +1 -1
- package/build/server/index.js +2 -2
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +74 -29
- package/build/server/manifest.js.map +1 -1
- package/cli/README.md +70 -2
- package/cli/commands/check.ts +190 -0
- package/cli/commands/ci.ts +71 -0
- package/cli/commands/coverage-ingest.ts +112 -0
- package/cli/commands/dashboard.ts +14 -0
- package/cli/commands/init.ts +26 -0
- package/cli/commands/scenarios-adapter.ts +96 -0
- package/cli/commands/theme.ts +62 -0
- package/cli/scenarios/adapter-scaffold.ts +99 -0
- package/cli/scenarios/codegen.ts +7 -1
- package/cli/scenarios/results.ts +85 -0
- package/cli/skills/unspa-audit/SKILL.md +19 -0
- package/cli/skills/unspa-edit/SKILL.md +20 -3
- package/cli/skills/unspa-implement/SKILL.md +28 -0
- package/cli/unspa.ts +136 -2
- package/cli/util/context-files.ts +18 -2
- package/cli/util/theme.ts +34 -0
- package/mcp-server/bin.ts +104 -104
- package/mcp-server/migrate-defaults.ts +164 -164
- package/mcp-server/repo-link.ts +142 -134
- package/mcp-server/resources/guide.ts +24 -4
- package/mcp-server/resources/operations.ts +3 -0
- package/mcp-server/seed-snapshots.ts +22 -22
- package/mcp-server/server.ts +8 -4
- package/mcp-server/sync-aware-repos.ts +79 -79
- package/mcp-server/sync-notifier.ts +180 -127
- package/mcp-server/tools/_codegen.ts +115 -115
- package/mcp-server/tools/_entity_builders.ts +30 -0
- package/mcp-server/tools/_shared.ts +210 -210
- package/mcp-server/tools/action.ts +210 -210
- package/mcp-server/tools/batch.ts +29 -5
- package/mcp-server/tools/effect.ts +139 -135
- package/mcp-server/tools/entity.ts +132 -132
- package/mcp-server/tools/entityField.ts +132 -132
- package/mcp-server/tools/event.ts +116 -116
- package/mcp-server/tools/feature.ts +264 -264
- package/mcp-server/tools/invariant.ts +275 -275
- package/mcp-server/tools/persona.ts +141 -141
- package/mcp-server/tools/project.ts +500 -391
- package/mcp-server/tools/reachabilityGoal.ts +97 -0
- package/mcp-server/tools/read.ts +526 -483
- package/mcp-server/tools/reorder.ts +114 -114
- package/mcp-server/tools/resource.ts +194 -194
- package/mcp-server/tools/rule.ts +302 -302
- package/mcp-server/tools/scenario.ts +4 -1
- package/mcp-server/tools/specGaps.ts +221 -221
- package/mcp-server/tools/state.ts +10 -2
- package/mcp-server/tools/surface.ts +102 -102
- package/mcp-server/tools/transition.ts +96 -96
- package/mcp-server/tools/verification.ts +131 -0
- package/package.json +15 -2
- package/src/app.css +208 -9
- package/src/app.html +15 -1
- package/src/features/behavior-model/application/ports/FeatureRepository.ts +16 -16
- package/src/features/behavior-model/application/use-cases/CreateFeature.ts +24 -24
- package/src/features/behavior-model/application/use-cases/DeleteFeature.ts +8 -8
- package/src/features/behavior-model/application/use-cases/GetFeature.ts +9 -9
- package/src/features/behavior-model/application/use-cases/ListFeatures.ts +10 -10
- package/src/features/behavior-model/application/use-cases/MutateFeature.ts +90 -90
- package/src/features/behavior-model/application/use-cases/SaveFeature.ts +31 -31
- package/src/features/behavior-model/domain/entities/Entity.ts +45 -45
- package/src/features/behavior-model/domain/entities/EventDefinition.ts +35 -35
- package/src/features/behavior-model/domain/entities/Feature.ts +10 -0
- package/src/features/behavior-model/domain/entities/Persona.ts +33 -33
- package/src/features/behavior-model/domain/entities/ReachabilityGoal.ts +39 -0
- package/src/features/behavior-model/domain/entities/Resource.ts +54 -54
- package/src/features/behavior-model/domain/entities/Scenario.ts +15 -0
- package/src/features/behavior-model/domain/entities/StateDefinition.ts +13 -0
- package/src/features/behavior-model/domain/entities/Surface.ts +75 -75
- package/src/features/behavior-model/domain/entities/index.ts +9 -9
- package/src/features/behavior-model/domain/services/BehaviorGraphModel.ts +556 -0
- package/src/features/behavior-model/domain/services/DerivedState.ts +67 -0
- package/src/features/behavior-model/domain/services/EffectApplier.ts +112 -3
- package/src/features/behavior-model/domain/services/EffectiveEntities.ts +166 -166
- package/src/features/behavior-model/domain/services/EntityDeducer.ts +83 -83
- package/src/features/behavior-model/domain/services/EventCatalog.ts +141 -141
- package/src/features/behavior-model/domain/services/FeatureExpressionNormalizer.ts +43 -5
- package/src/features/behavior-model/domain/services/FeatureSharedStateNormalizer.ts +24 -3
- package/src/features/behavior-model/domain/services/FeatureTransforms.ts +33 -0
- package/src/features/behavior-model/domain/services/FeatureValidator.ts +124 -16
- package/src/features/behavior-model/domain/services/PersonaApplier.ts +39 -39
- package/src/features/behavior-model/domain/services/ResourceDeducer.ts +64 -64
- package/src/features/behavior-model/domain/services/ResourceUsage.ts +79 -79
- package/src/features/behavior-model/domain/services/ScenarioApplier.ts +40 -40
- package/src/features/behavior-model/domain/services/SharedStateDefinitions.ts +32 -32
- package/src/features/behavior-model/domain/services/StatePathReferences.ts +249 -217
- package/src/features/behavior-model/domain/services/TransitionCatalog.ts +173 -173
- package/src/features/behavior-model/domain/value-objects/Effect.ts +100 -3
- package/src/features/behavior-model/domain/value-objects/EntityFieldType.ts +57 -57
- package/src/features/behavior-model/domain/value-objects/Expression.ts +22 -2
- package/src/features/behavior-model/domain/value-objects/ParameterType.ts +57 -57
- package/src/features/behavior-model/domain/value-objects/Resource.ts +210 -210
- package/src/features/behavior-model/domain/value-objects/RuleCategory.ts +57 -57
- package/src/features/behavior-model/domain/value-objects/RuleCondition.ts +52 -1
- package/src/features/behavior-model/domain/value-objects/SimulationClock.ts +35 -0
- package/src/features/behavior-model/domain/value-objects/ids.ts +2 -0
- package/src/features/behavior-model/infrastructure/io/FeatureJson.ts +89 -89
- package/src/features/behavior-model/infrastructure/persistence/HttpFeatureRepository.ts +43 -43
- package/src/features/behavior-model/infrastructure/persistence/JsonFolderFeatureRepository.ts +10 -0
- package/src/features/behavior-model/infrastructure/persistence/snapshot-discovery.ts +76 -76
- package/src/features/behavior-model/infrastructure/seed/seedStorefront.ts +967 -967
- package/src/features/behavior-model/presentation/adapters/VisBehaviorGraphRenderer.ts +501 -0
- package/src/features/behavior-model/presentation/components/ActionEditor.svelte +683 -682
- package/src/features/behavior-model/presentation/components/ActionsEditor.svelte +232 -232
- package/src/features/behavior-model/presentation/components/BehaviorGraph.svelte +568 -0
- package/src/features/behavior-model/presentation/components/EffectEditor.svelte +168 -168
- package/src/features/behavior-model/presentation/components/EntityEditor.svelte +241 -248
- package/src/features/behavior-model/presentation/components/EntityFieldRow.svelte +180 -181
- package/src/features/behavior-model/presentation/components/EntityManager.svelte +252 -251
- package/src/features/behavior-model/presentation/components/EventsManager.svelte +373 -372
- package/src/features/behavior-model/presentation/components/FeatureEditor.svelte +396 -348
- package/src/features/behavior-model/presentation/components/FeatureHeader.svelte +165 -148
- package/src/features/behavior-model/presentation/components/FeatureHealthStrip.svelte +110 -110
- package/src/features/behavior-model/presentation/components/HistoryPanel.svelte +154 -154
- package/src/features/behavior-model/presentation/components/NewFeatureForm.svelte +66 -66
- package/src/features/behavior-model/presentation/components/ParameterNameSelect.svelte +84 -84
- package/src/features/behavior-model/presentation/components/ParametersEditor.svelte +411 -411
- package/src/features/behavior-model/presentation/components/PersonaEditor.svelte +244 -244
- package/src/features/behavior-model/presentation/components/PersonasManager.svelte +130 -130
- package/src/features/behavior-model/presentation/components/ReachabilityGoalEditor.svelte +230 -0
- package/src/features/behavior-model/presentation/components/ReachabilityGoalsEditor.svelte +86 -0
- package/src/features/behavior-model/presentation/components/ResourcesManager.svelte +291 -290
- package/src/features/behavior-model/presentation/components/ScenariosEditor.svelte +496 -496
- package/src/features/behavior-model/presentation/components/StateDefinitionsEditor.svelte +356 -356
- package/src/features/behavior-model/presentation/components/SurfaceEntitiesView.svelte +88 -88
- package/src/features/behavior-model/presentation/components/SurfaceInvariantsEditor.svelte +76 -76
- package/src/features/behavior-model/presentation/components/SurfaceList.svelte +300 -300
- package/src/features/behavior-model/presentation/components/SurfaceMetaEditor.svelte +158 -156
- package/src/features/behavior-model/presentation/components/SurfacePanel.svelte +198 -198
- package/src/features/behavior-model/presentation/components/SurfacePersonasView.svelte +122 -122
- package/src/features/behavior-model/presentation/components/SurfaceResourcesView.svelte +113 -113
- package/src/features/behavior-model/presentation/components/SurfaceRulesEditor.svelte +69 -69
- package/src/features/behavior-model/presentation/components/TransitionsManager.svelte +322 -321
- package/src/features/behavior-model/presentation/context/featureQueueContext.ts +78 -0
- package/src/features/behavior-model/presentation/stores/editorStore.svelte.ts +132 -131
- package/src/features/behavior-model/presentation/stores/featureStore.svelte.ts +177 -177
- package/src/features/behavior-model/presentation/stores/featuresStore.svelte.ts +98 -98
- package/src/features/behavior-model/presentation/view-models/BehaviorGraphTheme.ts +44 -0
- package/src/features/behavior-model/presentation/view-models/factories.ts +181 -132
- package/src/features/builder-mode/domain/BuilderModeDashboard.ts +7 -1
- package/src/features/builder-mode/presentation/components/BuilderModeDashboard.svelte +78 -16
- package/src/features/builder-mode/presentation/components/BuilderTagChips.svelte +25 -0
- package/src/features/builder-mode/presentation/stores/builderModeStore.svelte.ts +247 -3
- package/src/features/domains/infrastructure/persistence/JsonFolderDomainRepository.ts +9 -0
- package/src/features/global-search/application/use-cases/LoadSearchIndex.ts +70 -0
- package/src/features/global-search/domain/SearchDoc.ts +111 -0
- package/src/features/global-search/domain/buildSearchDocs.ts +483 -0
- package/src/features/global-search/domain/searchNav.ts +58 -0
- package/src/features/global-search/domain/searchScoring.ts +81 -0
- package/src/features/global-search/infrastructure/adapters/defaultSearchHost.ts +28 -0
- package/src/features/global-search/presentation/components/GlobalSearch.svelte +262 -0
- package/src/features/global-search/presentation/ports/SearchHostPorts.ts +41 -0
- package/src/features/global-search/presentation/searchKindMeta.ts +108 -0
- package/src/features/global-search/presentation/stores/globalSearchStore.svelte.ts +171 -0
- package/src/features/implementation-queue/presentation/components/FloatingQueueWidget.svelte +264 -0
- package/src/features/implementation-queue/presentation/stores/globalQueueStore.svelte.ts +172 -0
- package/src/features/implementation-status/application/ports/ImplementationStatusRepository.ts +8 -8
- package/src/features/implementation-status/application/use-cases/GetImplementationStatus.ts +8 -8
- package/src/features/implementation-status/domain/ApplyCapturedToSpec.ts +323 -322
- package/src/features/implementation-status/domain/FieldDiff.ts +238 -236
- package/src/features/implementation-status/infrastructure/persistence/InMemoryImplementationStatusRepository.ts +21 -21
- package/src/features/implementation-status/presentation/components/ImplementationStatusPanel.svelte +831 -831
- package/src/features/implementation-status/presentation/stores/implementationStatusStore.svelte.ts +97 -97
- package/src/features/library/application/use-cases/ApplyBlueprintsToFeature.ts +33 -33
- package/src/features/library/domain/services/BlueprintApplier.ts +94 -94
- package/src/features/library/infrastructure/blueprints/auth/ResetPasswordBlueprint.ts +332 -332
- package/src/features/library/infrastructure/blueprints/auth/SignInBlueprint.ts +281 -281
- package/src/features/library/infrastructure/blueprints/auth/SignUpBlueprint.ts +299 -299
- package/src/features/library/infrastructure/blueprints/auth/VerifyEmailBlueprint.ts +288 -288
- package/src/features/library/infrastructure/blueprints/auth/shared.ts +146 -146
- package/src/features/library/infrastructure/blueprints/commerce/CartBlueprint.ts +222 -222
- package/src/features/library/infrastructure/blueprints/commerce/CatalogBlueprint.ts +190 -190
- package/src/features/library/infrastructure/blueprints/commerce/CheckoutBlueprint.ts +322 -322
- package/src/features/library/infrastructure/blueprints/commerce/OrderConfirmationBlueprint.ts +172 -172
- package/src/features/library/infrastructure/blueprints/commerce/ProductDetailsBlueprint.ts +290 -290
- package/src/features/library/infrastructure/blueprints/content/ReviewsBlueprint.ts +392 -392
- package/src/features/library/infrastructure/blueprints/onboarding/OnboardingWizardBlueprint.ts +344 -344
- package/src/features/library/infrastructure/blueprints/utility/CanvasBlueprint.ts +419 -419
- package/src/features/library/infrastructure/blueprints/utility/CookieConsentBlueprint.ts +195 -195
- package/src/features/library/infrastructure/blueprints/utility/NotFoundBlueprint.ts +86 -86
- package/src/features/library/infrastructure/blueprints/utility/SearchPaletteBlueprint.ts +192 -192
- package/src/features/library/infrastructure/blueprints/utility/StoreLocatorBlueprint.ts +221 -221
- package/src/features/library/infrastructure/blueprints/utility/TaskBoardBlueprint.ts +196 -196
- package/src/features/maturity/application/use-cases/ScoreFeature.ts +7 -7
- package/src/features/maturity/domain/MaturityReport.ts +70 -70
- package/src/features/maturity/domain/MaturityScorer.ts +1001 -985
- package/src/features/maturity/presentation/components/MaturityPanel.svelte +376 -372
- package/src/features/mcp-tools/application/tools/dryRunSimulate.ts +24 -24
- package/src/features/mcp-tools/application/tools/findStateReferences.ts +19 -19
- package/src/features/mcp-tools/application/tools/generateTypes.ts +0 -1
- package/src/features/mcp-tools/application/tools/getAction.ts +165 -165
- package/src/features/mcp-tools/application/tools/getFeature.ts +5 -5
- package/src/features/mcp-tools/application/tools/getFeatureIndex.ts +79 -79
- package/src/features/mcp-tools/application/tools/getNeighborhood.ts +319 -319
- package/src/features/mcp-tools/application/tools/getSurface.ts +86 -86
- package/src/features/mcp-tools/application/tools/index.ts +56 -56
- package/src/features/mcp-tools/application/tools/listActions.ts +49 -49
- package/src/features/mcp-tools/application/tools/listFeatures.ts +7 -7
- package/src/features/mcp-tools/application/tools/scoreFeature.ts +153 -153
- package/src/features/projects/application/ports/ProjectRepository.ts +14 -14
- package/src/features/projects/application/use-cases/AddFeatureToProject.ts +23 -23
- package/src/features/projects/application/use-cases/CreateProject.ts +16 -16
- package/src/features/projects/application/use-cases/FindProjectContainingFeature.ts +23 -23
- package/src/features/projects/application/use-cases/GetProjectAggregate.ts +131 -131
- package/src/features/projects/application/use-cases/ImportProjectBundle.ts +45 -0
- package/src/features/projects/application/use-cases/MoveFeatureInProject.ts +36 -36
- package/src/features/projects/application/use-cases/RemoveFeatureFromProject.ts +23 -23
- package/src/features/projects/domain/entities/Project.ts +12 -0
- package/src/features/projects/domain/services/InheritedFromProject.ts +130 -130
- package/src/features/projects/infrastructure/persistence/JsonFolderProjectRepository.ts +9 -0
- package/src/features/projects/presentation/components/ProjectCard.svelte +27 -8
- package/src/features/projects/presentation/components/ProjectEditor.svelte +23 -19
- package/src/features/projects/presentation/components/ProjectFeaturesPanel.svelte +433 -433
- package/src/features/projects/presentation/components/ProjectsIndex.svelte +54 -10
- package/src/features/projects/presentation/stores/projectContextStore.svelte.ts +170 -170
- package/src/features/projects/presentation/stores/projectFeaturesStore.svelte.ts +114 -114
- package/src/features/projects/presentation/stores/projectStore.svelte.ts +265 -266
- package/src/features/projects/presentation/stores/projectsStore.svelte.ts +134 -134
- package/src/features/simulator/application/use-cases/RunScenarios.ts +27 -1
- package/src/features/simulator/application/use-cases/SimulateAction.ts +47 -47
- package/src/features/simulator/domain/SimulationResult.ts +79 -79
- package/src/features/simulator/domain/SimulatorEngine.ts +43 -9
- package/src/features/simulator/domain/StateExplorer.ts +369 -0
- package/src/features/simulator/domain/SurfaceReachability.ts +130 -0
- package/src/features/simulator/presentation/components/ParameterInputs.svelte +277 -277
- package/src/features/simulator/presentation/components/PersonaPicker.svelte +52 -52
- package/src/features/simulator/presentation/components/ScenarioPicker.svelte +42 -45
- package/src/features/simulator/presentation/components/SidePanel.svelte +170 -170
- package/src/features/simulator/presentation/components/SimulationResultView.svelte +394 -394
- package/src/features/simulator/presentation/components/SimulatorPanel.svelte +293 -293
- package/src/features/simulator/presentation/components/StateInspector.svelte +101 -101
- package/src/features/simulator/presentation/stores/simulatorStore.svelte.ts +268 -268
- package/src/features/tutorial/presentation/components/CodeBlock.svelte +5 -1
- package/src/features/verification/application/ports/BehavioralIndexReader.ts +12 -0
- package/src/features/verification/application/use-cases/VerifyFeatures.ts +151 -0
- package/src/features/verification/domain/DriftReport.ts +37 -0
- package/src/features/verification/domain/EventCoherenceReport.ts +27 -0
- package/src/features/verification/domain/IndexedImplementation.ts +27 -0
- package/src/features/verification/domain/VerificationReport.ts +59 -0
- package/src/features/verification/domain/VerificationThresholds.ts +52 -0
- package/src/features/verification/domain/VerificationVerdict.ts +43 -0
- package/src/features/verification/domain/aggregateVerdict.ts +244 -0
- package/src/features/verification/domain/analyzeEventCoherence.ts +43 -0
- package/src/features/verification/domain/detectDrift.ts +166 -0
- package/src/features/verification/domain/verifiedCoverage.ts +37 -0
- package/src/features/verification/infrastructure/persistence/FileBehavioralIndexReader.ts +81 -0
- package/src/features/verification/infrastructure/persistence/StaticBehavioralIndexReader.ts +15 -0
- package/src/features/verification/presentation/components/VerifyPanel.svelte +74 -0
- package/src/features/verification/presentation/stores/verificationStore.svelte.ts +64 -0
- package/src/hooks.server.ts +11 -1
- package/src/lib/server/openLocalDirectory.ts +40 -0
- package/src/lib/server/searchIndex.ts +161 -0
- package/src/lib/server/snapshotRepository.ts +37 -37
- package/src/lib/server/sync/YDocManager.ts +391 -391
- package/src/lib/server/sync/historyStore.ts +276 -276
- package/src/lib/server/sync/wsServer.ts +1 -1
- package/src/lib/sync/protocol.ts +147 -147
- package/src/lib/sync/roomId.ts +33 -33
- package/src/lib/theme/registry.ts +77 -0
- package/src/lib/theme/themeStore.svelte.ts +64 -0
- package/src/routes/+layout.svelte +288 -30
- package/src/routes/api/domains/[id]/+server.ts +7 -3
- package/src/routes/api/projects/[id]/+server.ts +14 -4
- package/src/routes/api/projects/import/+server.ts +16 -38
- package/src/routes/api/search-index/+server.ts +16 -0
- package/src/routes/api/snapshots/[id]/+server.ts +56 -44
- package/src/routes/api/snapshots/[id]/implementation-status/+server.ts +13 -13
- package/src/routes/api/snapshots/[id]/verify/+server.ts +37 -0
- package/src/routes/api/sync/reload/+server.ts +157 -157
- package/src/routes/api/system/hub-directory/+server.ts +24 -0
- package/src/routes/features/+page.svelte +484 -484
- package/src/routes/features/[id]/+page.svelte +55 -49
- package/src/routes/features/[id]/graph/+page.svelte +39 -0
- package/src/routes/features/[id]/verify/+page.svelte +89 -0
- package/src/routes/mcp/+page.svelte +16 -1
- package/src/routes/projects/[id]/+page.svelte +70 -70
- package/src/routes/projects/[id]/graph/+page.svelte +79 -0
- package/src/routes/tutorial/+page.svelte +3 -2
- package/src/shared/infrastructure/browserContainer.ts +61 -61
- package/src/shared/presentation/components/KebabMenu.svelte +95 -0
- package/src/shared/presentation/components/MenuItem.svelte +29 -0
- package/src/shared/presentation/components/ProgressBar.svelte +1 -1
- package/src/shared/presentation/toast/SyncToast.svelte +14 -3
- package/src/shared/presentation/toast/viewLinkResolver.ts +32 -0
- package/static/lyriks_logo.svg +148 -0
- package/vite.config.ts +47 -47
- package/build/client/_app/immutable/assets/0.DFMDYAU9.css +0 -1
- package/build/client/_app/immutable/assets/0.DFMDYAU9.css.br +0 -0
- package/build/client/_app/immutable/assets/0.DFMDYAU9.css.gz +0 -0
- package/build/client/_app/immutable/assets/9.nv0I59TU.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BO66rBOa2.js +0 -1
- package/build/client/_app/immutable/chunks/BO66rBOa2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BO66rBOa2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BOrLmFwJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/BOrLmFwJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BfMYiIUi.js.br +0 -0
- package/build/client/_app/immutable/chunks/BfMYiIUi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bp2_Vghh.js +0 -1
- package/build/client/_app/immutable/chunks/Bp2_Vghh.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bp2_Vghh.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bp8HpEPe2.js +0 -4
- package/build/client/_app/immutable/chunks/Bp8HpEPe2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bp8HpEPe2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C8rRKIXT.js +0 -1
- package/build/client/_app/immutable/chunks/C8rRKIXT.js.br +0 -0
- package/build/client/_app/immutable/chunks/C8rRKIXT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CJjJLwzv2.js +0 -1
- package/build/client/_app/immutable/chunks/CJjJLwzv2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CJjJLwzv2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CxyLMlpt2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CxyLMlpt2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D6jhrpTg.js +0 -1
- package/build/client/_app/immutable/chunks/D6jhrpTg.js.br +0 -0
- package/build/client/_app/immutable/chunks/D6jhrpTg.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D8YEa1po.js +0 -1
- package/build/client/_app/immutable/chunks/D8YEa1po.js.br +0 -0
- package/build/client/_app/immutable/chunks/D8YEa1po.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D9dKmajw.js +0 -1
- package/build/client/_app/immutable/chunks/D9dKmajw.js.br +0 -0
- package/build/client/_app/immutable/chunks/D9dKmajw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DBJWcC6Y.js +0 -1
- package/build/client/_app/immutable/chunks/DBJWcC6Y.js.br +0 -0
- package/build/client/_app/immutable/chunks/DBJWcC6Y.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DHoA038D.js +0 -1
- package/build/client/_app/immutable/chunks/DHoA038D.js.br +0 -2
- package/build/client/_app/immutable/chunks/DHoA038D.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DKgYpi6_.js +0 -1
- package/build/client/_app/immutable/chunks/DKgYpi6_.js.br +0 -0
- package/build/client/_app/immutable/chunks/DKgYpi6_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DatGSObE.js +0 -1
- package/build/client/_app/immutable/chunks/DatGSObE.js.br +0 -0
- package/build/client/_app/immutable/chunks/DatGSObE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dg0acPpT.js +0 -1
- package/build/client/_app/immutable/chunks/Dg0acPpT.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dg0acPpT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DjWKKtqp.js +0 -1
- package/build/client/_app/immutable/chunks/DjWKKtqp.js.br +0 -1
- package/build/client/_app/immutable/chunks/DjWKKtqp.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dq0DUAz1.js +0 -1
- package/build/client/_app/immutable/chunks/Dq0DUAz1.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dq0DUAz1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/HKLi1Yz3.js +0 -1
- package/build/client/_app/immutable/chunks/HKLi1Yz3.js.br +0 -0
- package/build/client/_app/immutable/chunks/HKLi1Yz3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/N7PXjlRH.js +0 -1
- package/build/client/_app/immutable/chunks/N7PXjlRH.js.br +0 -0
- package/build/client/_app/immutable/chunks/N7PXjlRH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/hpWJNn0t2.js +0 -2
- package/build/client/_app/immutable/chunks/hpWJNn0t2.js.br +0 -0
- package/build/client/_app/immutable/chunks/hpWJNn0t2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/iQu0D9Ux.js +0 -1
- package/build/client/_app/immutable/chunks/iQu0D9Ux.js.br +0 -0
- package/build/client/_app/immutable/chunks/iQu0D9Ux.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CLgh6Mx_.js +0 -2
- package/build/client/_app/immutable/entry/app.CLgh6Mx_.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CLgh6Mx_.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.D5GPCQZD.js +0 -1
- package/build/client/_app/immutable/entry/start.D5GPCQZD.js.br +0 -0
- package/build/client/_app/immutable/entry/start.D5GPCQZD.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.BOoI-hsu.js +0 -4
- package/build/client/_app/immutable/nodes/0.BOoI-hsu.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.BOoI-hsu.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.KYdA6ppX.js.br +0 -2
- package/build/client/_app/immutable/nodes/1.KYdA6ppX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.DBz20KgG.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DBz20KgG.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.19DIoFtw.js +0 -1
- package/build/client/_app/immutable/nodes/3.19DIoFtw.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.19DIoFtw.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.BvMzqBJj.js +0 -3
- package/build/client/_app/immutable/nodes/4.BvMzqBJj.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.BvMzqBJj.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.Dq6obSGG.js +0 -42
- package/build/client/_app/immutable/nodes/5.Dq6obSGG.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.Dq6obSGG.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BOHISqs-.js +0 -5
- package/build/client/_app/immutable/nodes/6.BOHISqs-.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BOHISqs-.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.CemgNJfw.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.CemgNJfw.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.DejSfIYh.js +0 -5
- package/build/client/_app/immutable/nodes/8.DejSfIYh.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.DejSfIYh.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.CMW6a2Lg.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.CMW6a2Lg.js.gz +0 -0
- package/build/server/chunks/0-C_o0oz-N.js +0 -15
- package/build/server/chunks/0-C_o0oz-N.js.map +0 -1
- package/build/server/chunks/1-DPpKAKXV.js +0 -9
- package/build/server/chunks/2-AlfFqtL1.js +0 -9
- package/build/server/chunks/2-AlfFqtL1.js.map +0 -1
- package/build/server/chunks/3-vbjUt_51.js +0 -16
- package/build/server/chunks/3-vbjUt_51.js.map +0 -1
- package/build/server/chunks/4-BNow4x6D.js +0 -16
- package/build/server/chunks/4-BNow4x6D.js.map +0 -1
- package/build/server/chunks/5-D7OCJpxD.js +0 -9
- package/build/server/chunks/5-D7OCJpxD.js.map +0 -1
- package/build/server/chunks/6-QQ7r8Rd5.js +0 -9
- package/build/server/chunks/7-CbPLGaIG.js +0 -9
- package/build/server/chunks/7-CbPLGaIG.js.map +0 -1
- package/build/server/chunks/8-CVO-E-sf.js +0 -9
- package/build/server/chunks/8-CVO-E-sf.js.map +0 -1
- package/build/server/chunks/9-DxT1baO5.js +0 -9
- package/build/server/chunks/9-DxT1baO5.js.map +0 -1
- package/build/server/chunks/FeatureTransforms-UWDHmWEg.js.map +0 -1
- package/build/server/chunks/FeatureValidator-B8qEjAUW.js.map +0 -1
- package/build/server/chunks/ManageTagsDialog-DBxA3tM2.js.map +0 -1
- package/build/server/chunks/ProgressBar-CfhccQ83.js.map +0 -1
- package/build/server/chunks/ProjectsIndex-CoDrvRya.js.map +0 -1
- package/build/server/chunks/RenameTag-BuWLMl1m.js.map +0 -1
- package/build/server/chunks/TagDotStrip-B1XQ0m0Y.js.map +0 -1
- package/build/server/chunks/TagPalette-CtMNYCmu.js.map +0 -1
- package/build/server/chunks/_layout.svelte-BREws55o.js +0 -616
- package/build/server/chunks/_layout.svelte-BREws55o.js.map +0 -1
- package/build/server/chunks/_page.svelte-B1s7jxaQ.js.map +0 -1
- package/build/server/chunks/_page.svelte-B7hT3P8E.js +0 -29
- package/build/server/chunks/_page.svelte-BqSC-1vK.js.map +0 -1
- package/build/server/chunks/_page.svelte-BtI2zZ_Z.js.map +0 -1
- package/build/server/chunks/_page.svelte-De508ek8.js +0 -29
- package/build/server/chunks/_page.svelte-Zf9H4KOP.js.map +0 -1
- package/build/server/chunks/_server.ts-0uNTZKwF.js.map +0 -1
- package/build/server/chunks/_server.ts-DcZPhyhK.js +0 -59
- package/build/server/chunks/_server.ts-DcZPhyhK.js.map +0 -1
- package/build/server/chunks/_server.ts-Dy5zQHe2.js.map +0 -1
- package/build/server/chunks/_server.ts-YnfXkeMJ.js.map +0 -1
- package/build/server/chunks/_server.ts-vcaqdwxS.js.map +0 -1
- package/build/server/chunks/browserContainer-CNX7ANld.js.map +0 -1
- package/build/server/chunks/builderModeStore.svelte-ihupr-3p.js.map +0 -1
- package/build/server/chunks/client-DfpLcAZ9.js +0 -24
- package/build/server/chunks/featuresStore.svelte-DR1gYZyu.js +0 -98
- package/build/server/chunks/featuresStore.svelte-DR1gYZyu.js.map +0 -1
- package/build/server/chunks/hooks.server-Rv301GTB.js.map +0 -1
- package/build/server/chunks/identityStore.svelte-IIvW2_3b.js +0 -59
- package/build/server/chunks/identityStore.svelte-IIvW2_3b.js.map +0 -1
- package/build/server/chunks/projectsStore.svelte-QDz5PchX.js.map +0 -1
- package/build/server/chunks/reconcile-Dv7jS3C8.js.map +0 -1
- package/build/server/chunks/snapshotRepository-BPXCjX92.js.map +0 -1
- package/build/server/chunks/syncBridge-BwXzPdjJ.js.map +0 -1
- package/src/features/implementation-queue/presentation/components/QueuePanel.svelte +0 -204
- package/src/features/implementation-queue/presentation/stores/queueStore.svelte.ts +0 -143
- /package/build/client/_app/immutable/assets/{9.nv0I59TU.css → 12.nv0I59TU.css} +0 -0
- /package/build/client/_app/immutable/assets/{9.nv0I59TU.css.br → 12.nv0I59TU.css.br} +0 -0
package/src/app.css
CHANGED
|
@@ -39,6 +39,199 @@ body {
|
|
|
39
39
|
color: #0f172a;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
/*
|
|
43
|
+
* ============================================================================
|
|
44
|
+
* Lyriks theme — opt-in cosmetic skin (gated by data-theme="lyriks" on <html>)
|
|
45
|
+
* ============================================================================
|
|
46
|
+
*
|
|
47
|
+
* Purely a re-colour of the design system: it overrides the `@theme` token
|
|
48
|
+
* *values* (the brand ramp + canvas/hairline), so every token-driven utility
|
|
49
|
+
* (bg-brand-*, text-brand-*, ring-brand-*, the avatar gradient, progress bars,
|
|
50
|
+
* focus rings, chips, ...) adopts the Lyriks violet identity without touching a
|
|
51
|
+
* single component. The header/shell *chrome* (the signature gradient bar) is
|
|
52
|
+
* applied in +layout.svelte via the same theme flag. Inert unless the attribute
|
|
53
|
+
* is present, so the default install is unaffected.
|
|
54
|
+
*
|
|
55
|
+
* `:root[data-theme='lyriks']` (specificity 0,2,0) wins over Tailwind's
|
|
56
|
+
* `@theme`-emitted `:root` (0,1,0), and custom properties inherit, so the
|
|
57
|
+
* overridden values cascade to every element.
|
|
58
|
+
*
|
|
59
|
+
* Tailwind v4 exposes the WHOLE default palette as CSS vars too (every utility
|
|
60
|
+
* compiles to `var(--color-<family>-<shade>)`). So re-skinning the families the
|
|
61
|
+
* app is built on — the neutral ramps (slate + neutral) and the cool accents it
|
|
62
|
+
* uses as the default teal/cyan brand (cyan/sky/teal) — restyles every surface,
|
|
63
|
+
* border, input, chip, table, and accent across the whole dashboard from this
|
|
64
|
+
* one block, with no component edits. The semantic status colours (amber,
|
|
65
|
+
* emerald, rose, red) are deliberately left alone so warnings/success/danger
|
|
66
|
+
* keep their meaning — matching the reference's amber/teal status rings.
|
|
67
|
+
*/
|
|
68
|
+
:root[data-theme='lyriks'] {
|
|
69
|
+
/* Brand ramp → violet. */
|
|
70
|
+
--color-brand-50: #f5f3ff;
|
|
71
|
+
--color-brand-100: #ede9fe;
|
|
72
|
+
--color-brand-200: #ddd6fe;
|
|
73
|
+
--color-brand-300: #c4b5fd;
|
|
74
|
+
--color-brand-400: #a78bfa;
|
|
75
|
+
--color-brand-500: #8b5cf6;
|
|
76
|
+
--color-brand-600: #7c3aed;
|
|
77
|
+
--color-brand-700: #6d28d9;
|
|
78
|
+
--color-brand-800: #5b21b6;
|
|
79
|
+
--color-brand-900: #4c1d95;
|
|
80
|
+
|
|
81
|
+
/* Brand wordmark switches to Space Grotesk (the reference's clean grotesk)
|
|
82
|
+
* instead of the default Dancing Script. `font-brand` resolves through this
|
|
83
|
+
* token, so the header wordmark restyles with no markup change. */
|
|
84
|
+
--font-brand: 'Space Grotesk', ui-sans-serif, system-ui, sans-serif;
|
|
85
|
+
|
|
86
|
+
/* App semantic surfaces. A clearly lavender canvas so the body — not just the
|
|
87
|
+
* header — reads as themed; white cards float on top of it. */
|
|
88
|
+
--color-canvas: #eeeafb;
|
|
89
|
+
--color-surface-soft: #e6dff7;
|
|
90
|
+
--color-surface-strong: #ddd4f1;
|
|
91
|
+
--color-hairline: #e0d8f1;
|
|
92
|
+
|
|
93
|
+
/* Neutral ramps (slate + neutral) → a cool lavender-tinted gray. The light
|
|
94
|
+
* end is pushed visibly violet so panels/rows/borders read as Lyriks; the
|
|
95
|
+
* mid tones keep enough darkness for text contrast; the dark shades become a
|
|
96
|
+
* deep violet-navy (matches the reference's chrome). Lightness tracks the
|
|
97
|
+
* originals so contrast holds. */
|
|
98
|
+
--color-slate-50: #f2eefc;
|
|
99
|
+
--color-slate-100: #e9e3f7;
|
|
100
|
+
--color-slate-200: #ddd4ee;
|
|
101
|
+
--color-slate-300: #c7bce0;
|
|
102
|
+
--color-slate-400: #948ab0;
|
|
103
|
+
--color-slate-500: #645c7e;
|
|
104
|
+
--color-slate-600: #4d4669;
|
|
105
|
+
--color-slate-700: #393353;
|
|
106
|
+
--color-slate-800: #261e3b;
|
|
107
|
+
--color-slate-900: #18122f;
|
|
108
|
+
--color-slate-950: #0d0822;
|
|
109
|
+
--color-neutral-50: #f2eefc;
|
|
110
|
+
--color-neutral-100: #e9e3f7;
|
|
111
|
+
--color-neutral-200: #ddd4ee;
|
|
112
|
+
--color-neutral-300: #c7bce0;
|
|
113
|
+
--color-neutral-400: #948ab0;
|
|
114
|
+
--color-neutral-500: #645c7e;
|
|
115
|
+
--color-neutral-600: #4d4669;
|
|
116
|
+
--color-neutral-700: #393353;
|
|
117
|
+
--color-neutral-800: #261e3b;
|
|
118
|
+
--color-neutral-900: #18122f;
|
|
119
|
+
--color-neutral-950: #0d0822;
|
|
120
|
+
|
|
121
|
+
/* Cool accents the app uses as its default brand (cyan/sky/teal) → violet,
|
|
122
|
+
* so no teal/blue pockets survive next to the new violet primary. */
|
|
123
|
+
--color-cyan-50: #f5f3ff;
|
|
124
|
+
--color-cyan-100: #ede9fe;
|
|
125
|
+
--color-cyan-200: #ddd6fe;
|
|
126
|
+
--color-cyan-300: #c4b5fd;
|
|
127
|
+
--color-cyan-400: #a78bfa;
|
|
128
|
+
--color-cyan-500: #8b5cf6;
|
|
129
|
+
--color-cyan-600: #7c3aed;
|
|
130
|
+
--color-cyan-700: #6d28d9;
|
|
131
|
+
--color-cyan-800: #5b21b6;
|
|
132
|
+
--color-cyan-900: #4c1d95;
|
|
133
|
+
--color-cyan-950: #2e1065;
|
|
134
|
+
--color-sky-50: #f5f3ff;
|
|
135
|
+
--color-sky-100: #ede9fe;
|
|
136
|
+
--color-sky-200: #ddd6fe;
|
|
137
|
+
--color-sky-300: #c4b5fd;
|
|
138
|
+
--color-sky-400: #a78bfa;
|
|
139
|
+
--color-sky-500: #8b5cf6;
|
|
140
|
+
--color-sky-600: #7c3aed;
|
|
141
|
+
--color-sky-700: #6d28d9;
|
|
142
|
+
--color-sky-800: #5b21b6;
|
|
143
|
+
--color-sky-900: #4c1d95;
|
|
144
|
+
--color-sky-950: #2e1065;
|
|
145
|
+
--color-teal-50: #f5f3ff;
|
|
146
|
+
--color-teal-100: #ede9fe;
|
|
147
|
+
--color-teal-200: #ddd6fe;
|
|
148
|
+
--color-teal-300: #c4b5fd;
|
|
149
|
+
--color-teal-400: #a78bfa;
|
|
150
|
+
--color-teal-500: #8b5cf6;
|
|
151
|
+
--color-teal-600: #7c3aed;
|
|
152
|
+
--color-teal-700: #6d28d9;
|
|
153
|
+
--color-teal-800: #5b21b6;
|
|
154
|
+
--color-teal-900: #4c1d95;
|
|
155
|
+
--color-teal-950: #2e1065;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* Cover the bare <html>/<body> backdrop (set outside the theme system above
|
|
159
|
+
* and via the body's `bg-neutral-50` utility) so edges match the cool canvas. */
|
|
160
|
+
:root[data-theme='lyriks'],
|
|
161
|
+
:root[data-theme='lyriks'] body {
|
|
162
|
+
background: var(--color-canvas);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* Re-tint the navigateTo focus pulse to the violet brand so it matches. */
|
|
166
|
+
@keyframes focus-flash-lyriks {
|
|
167
|
+
0% {
|
|
168
|
+
box-shadow: 0 0 0 0 rgba(124, 58, 237, 0.55);
|
|
169
|
+
background-color: rgba(237, 233, 254, 0.65);
|
|
170
|
+
}
|
|
171
|
+
8% {
|
|
172
|
+
box-shadow: 0 0 0 6px rgba(124, 58, 237, 0.3);
|
|
173
|
+
background-color: rgba(237, 233, 254, 0.55);
|
|
174
|
+
}
|
|
175
|
+
/* Hold a visible ring + tint through most of the animation so the target
|
|
176
|
+
stays obvious after the scroll lands, then fade out at the end. */
|
|
177
|
+
75% {
|
|
178
|
+
box-shadow: 0 0 0 4px rgba(124, 58, 237, 0.22);
|
|
179
|
+
background-color: rgba(237, 233, 254, 0.4);
|
|
180
|
+
}
|
|
181
|
+
100% {
|
|
182
|
+
box-shadow: 0 0 0 0 rgba(124, 58, 237, 0);
|
|
183
|
+
background-color: transparent;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
:root[data-theme='lyriks'] .focus-flash {
|
|
187
|
+
animation-name: focus-flash-lyriks;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/*
|
|
191
|
+
* Emphasis colour. Primary buttons and active toggles across the app use a
|
|
192
|
+
* near-black `slate-900` surface (with a `slate-800` hover) as the "emphasis"
|
|
193
|
+
* colour — separate from the brand. Under Lyriks the brand IS the emphasis
|
|
194
|
+
* colour, so remap the SOLID dark button/active/border surfaces (and their
|
|
195
|
+
* hovers) to violet; otherwise primary CTAs read as leftover black buttons.
|
|
196
|
+
*
|
|
197
|
+
* We target the utility CLASSES, not the `--color-slate-*` variables, on
|
|
198
|
+
* purpose: the same slate-900 token is the body-text colour (`text-slate-900`),
|
|
199
|
+
* which must stay dark. Translucent scrims (`bg-slate-900/40`, …) and the
|
|
200
|
+
* builder's dark canvas gradients keep their own class names and are
|
|
201
|
+
* intentionally left as deep violet-navy.
|
|
202
|
+
*/
|
|
203
|
+
:root[data-theme='lyriks'] .bg-slate-900,
|
|
204
|
+
:root[data-theme='lyriks'] .bg-slate-950,
|
|
205
|
+
:root[data-theme='lyriks'] .bg-neutral-900,
|
|
206
|
+
:root[data-theme='lyriks'] .bg-neutral-950 {
|
|
207
|
+
background-color: var(--color-brand-600);
|
|
208
|
+
}
|
|
209
|
+
:root[data-theme='lyriks'] .bg-slate-800 {
|
|
210
|
+
background-color: var(--color-brand-700);
|
|
211
|
+
}
|
|
212
|
+
:root[data-theme='lyriks'] .border-slate-900 {
|
|
213
|
+
border-color: var(--color-brand-600);
|
|
214
|
+
}
|
|
215
|
+
:root[data-theme='lyriks'] .hover\:bg-slate-900:hover,
|
|
216
|
+
:root[data-theme='lyriks'] .hover\:bg-slate-800:hover {
|
|
217
|
+
background-color: var(--color-brand-700);
|
|
218
|
+
}
|
|
219
|
+
:root[data-theme='lyriks'] .hover\:bg-slate-700:hover {
|
|
220
|
+
background-color: var(--color-brand-600);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/*
|
|
224
|
+
* Card top-accent flourish. Project + feature cards paint a thin
|
|
225
|
+
* `from-brand-500 via-brand-mint to-violet-400` bar across the top; the mint
|
|
226
|
+
* (teal) middle stop is a fixed accent token we leave alone elsewhere (tags use
|
|
227
|
+
* that palette), so it survives the remap and clashes with Lyriks. Re-skin just
|
|
228
|
+
* this flourish to echo the header's violet→fuchsia→pink sweep. `.via-brand-mint`
|
|
229
|
+
* is unique to these accent bars, so the override is precise.
|
|
230
|
+
*/
|
|
231
|
+
:root[data-theme='lyriks'] .via-brand-mint {
|
|
232
|
+
background-image: linear-gradient(to right, #6d28d9, #a21caf, #db2777);
|
|
233
|
+
}
|
|
234
|
+
|
|
42
235
|
/*
|
|
43
236
|
* Restore `cursor: pointer` on interactive elements.
|
|
44
237
|
*
|
|
@@ -75,25 +268,31 @@ body {
|
|
|
75
268
|
}
|
|
76
269
|
|
|
77
270
|
/*
|
|
78
|
-
* Pulses a
|
|
79
|
-
* focused via editorStore.navigateTo. Triggered by
|
|
80
|
-
* `.focus-flash` class for ~
|
|
271
|
+
* Pulses a project-accent ring + soft fill on whatever element is being
|
|
272
|
+
* focused via editorStore.navigateTo or a global-search result. Triggered by
|
|
273
|
+
* adding the `.focus-flash` class; holds for ~3s (kept in sync with
|
|
274
|
+
* FOCUS_FLASH_MS in FeatureEditor) so the searched item stays obvious.
|
|
81
275
|
*/
|
|
82
276
|
@keyframes focus-flash {
|
|
83
277
|
0% {
|
|
84
|
-
box-shadow: 0 0 0 0 rgba(8, 145, 178, 0.
|
|
278
|
+
box-shadow: 0 0 0 0 rgba(8, 145, 178, 0.55);
|
|
279
|
+
background-color: rgba(207, 250, 254, 0.6);
|
|
280
|
+
}
|
|
281
|
+
8% {
|
|
282
|
+
box-shadow: 0 0 0 6px rgba(8, 145, 178, 0.3);
|
|
85
283
|
background-color: rgba(207, 250, 254, 0.55);
|
|
86
284
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
285
|
+
/* Hold the ring + tint through most of the animation, then fade at the end. */
|
|
286
|
+
75% {
|
|
287
|
+
box-shadow: 0 0 0 4px rgba(8, 145, 178, 0.22);
|
|
288
|
+
background-color: rgba(207, 250, 254, 0.4);
|
|
90
289
|
}
|
|
91
290
|
100% {
|
|
92
|
-
box-shadow: 0 0 0 0 rgba(
|
|
291
|
+
box-shadow: 0 0 0 0 rgba(8, 145, 178, 0);
|
|
93
292
|
background-color: transparent;
|
|
94
293
|
}
|
|
95
294
|
}
|
|
96
295
|
.focus-flash {
|
|
97
|
-
animation: focus-flash
|
|
296
|
+
animation: focus-flash 3s ease-out;
|
|
98
297
|
border-radius: 0.5rem;
|
|
99
298
|
}
|
package/src/app.html
CHANGED
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
|
-
<html lang="en" class="h-full">
|
|
2
|
+
<html lang="en" class="h-full" data-theme="%unspa.theme%">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<!--
|
|
7
|
+
Theme bootstrap. The server fills the data-theme placeholder above from
|
|
8
|
+
PUBLIC_UNSPA_THEME (the CLI default) in hooks.server.ts. This runs before
|
|
9
|
+
first paint and lets a saved in-app switcher choice (localStorage) win
|
|
10
|
+
over that default, so the page never flashes the wrong colour skin. Kept
|
|
11
|
+
tiny + guarded so a blocked storage API (private browsing) just leaves
|
|
12
|
+
the server default.
|
|
13
|
+
-->
|
|
14
|
+
<script>
|
|
15
|
+
try {
|
|
16
|
+
var t = localStorage.getItem('unspa.theme');
|
|
17
|
+
if (t) document.documentElement.dataset.theme = t;
|
|
18
|
+
} catch (e) {}
|
|
19
|
+
</script>
|
|
6
20
|
<link rel="icon" href="%sveltekit.assets%/unspaghettit_logo.png" type="image/png" />
|
|
7
21
|
<meta name="description" content="Executable specifications for AI-assisted software development. Local-first and MCP-native by Lyriks.io." />
|
|
8
22
|
<meta property="og:title" content="Unspaghettit" />
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import type { Feature } from '$features/behavior-model/domain/entities/Feature';
|
|
2
2
|
import type { Tag } from '$shared/domain/Tags';
|
|
3
|
-
import type { FeatureId } from '$features/behavior-model/domain/value-objects/ids';
|
|
4
|
-
|
|
5
|
-
export type FeatureSummary = {
|
|
6
|
-
readonly id: FeatureId;
|
|
3
|
+
import type { FeatureId } from '$features/behavior-model/domain/value-objects/ids';
|
|
4
|
+
|
|
5
|
+
export type FeatureSummary = {
|
|
6
|
+
readonly id: FeatureId;
|
|
7
7
|
readonly name: string;
|
|
8
8
|
readonly description?: string;
|
|
9
9
|
readonly tags?: readonly Tag[];
|
|
10
|
-
readonly surfaceCount: number;
|
|
11
|
-
readonly actionCount: number;
|
|
12
|
-
readonly createdAt: string;
|
|
13
|
-
readonly updatedAt: string;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export interface FeatureRepository {
|
|
17
|
-
list(): Promise<readonly FeatureSummary[]>;
|
|
18
|
-
get(id: FeatureId): Promise<Feature | null>;
|
|
19
|
-
save(feature: Feature): Promise<void>;
|
|
20
|
-
delete(id: FeatureId): Promise<void>;
|
|
21
|
-
}
|
|
10
|
+
readonly surfaceCount: number;
|
|
11
|
+
readonly actionCount: number;
|
|
12
|
+
readonly createdAt: string;
|
|
13
|
+
readonly updatedAt: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export interface FeatureRepository {
|
|
17
|
+
list(): Promise<readonly FeatureSummary[]>;
|
|
18
|
+
get(id: FeatureId): Promise<Feature | null>;
|
|
19
|
+
save(feature: Feature): Promise<void>;
|
|
20
|
+
delete(id: FeatureId): Promise<void>;
|
|
21
|
+
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import type { Clock } from '$shared/domain/Clock';
|
|
2
|
-
import type { IdGenerator } from '$shared/domain/IdGenerator';
|
|
1
|
+
import type { Clock } from '$shared/domain/Clock';
|
|
2
|
+
import type { IdGenerator } from '$shared/domain/IdGenerator';
|
|
3
3
|
import type { Feature } from '$features/behavior-model/domain/entities/Feature';
|
|
4
4
|
import { asFeatureId } from '$features/behavior-model/domain/value-objects/ids';
|
|
5
5
|
import type { Tag } from '$shared/domain/Tags';
|
|
6
6
|
import { normalizeTags } from '$shared/domain/Tags';
|
|
7
7
|
import type { FeatureRepository } from '../ports/FeatureRepository';
|
|
8
|
-
|
|
9
|
-
export type CreateFeatureInput = {
|
|
8
|
+
|
|
9
|
+
export type CreateFeatureInput = {
|
|
10
10
|
readonly name: string;
|
|
11
11
|
readonly description?: string;
|
|
12
12
|
readonly tags?: readonly Tag[];
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export const createFeatureUseCase = (deps: {
|
|
16
|
-
repository: FeatureRepository;
|
|
17
|
-
ids: IdGenerator;
|
|
18
|
-
clock: Clock;
|
|
19
|
-
}) => {
|
|
20
|
-
return async (input: CreateFeatureInput): Promise<Feature> => {
|
|
21
|
-
const trimmedName = input.name.trim();
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const createFeatureUseCase = (deps: {
|
|
16
|
+
repository: FeatureRepository;
|
|
17
|
+
ids: IdGenerator;
|
|
18
|
+
clock: Clock;
|
|
19
|
+
}) => {
|
|
20
|
+
return async (input: CreateFeatureInput): Promise<Feature> => {
|
|
21
|
+
const trimmedName = input.name.trim();
|
|
22
22
|
if (trimmedName.length === 0) {
|
|
23
23
|
throw new Error('Feature name is required');
|
|
24
24
|
}
|
|
@@ -33,14 +33,14 @@ export const createFeatureUseCase = (deps: {
|
|
|
33
33
|
description: trimmedDescription,
|
|
34
34
|
...(normalizeTags(input.tags) ? { tags: normalizeTags(input.tags) } : {}),
|
|
35
35
|
surfaces: [],
|
|
36
|
-
personas: [],
|
|
37
|
-
resources: [],
|
|
38
|
-
entities: [],
|
|
39
|
-
events: [],
|
|
40
|
-
createdAt: now,
|
|
41
|
-
updatedAt: now
|
|
42
|
-
};
|
|
43
|
-
await deps.repository.save(feature);
|
|
44
|
-
return feature;
|
|
45
|
-
};
|
|
46
|
-
};
|
|
36
|
+
personas: [],
|
|
37
|
+
resources: [],
|
|
38
|
+
entities: [],
|
|
39
|
+
events: [],
|
|
40
|
+
createdAt: now,
|
|
41
|
+
updatedAt: now
|
|
42
|
+
};
|
|
43
|
+
await deps.repository.save(feature);
|
|
44
|
+
return feature;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { FeatureId } from '$features/behavior-model/domain/value-objects/ids';
|
|
2
|
-
import type { FeatureRepository } from '../ports/FeatureRepository';
|
|
3
|
-
|
|
4
|
-
export const deleteFeatureUseCase = (deps: { repository: FeatureRepository }) => {
|
|
5
|
-
return async (id: FeatureId): Promise<void> => {
|
|
6
|
-
await deps.repository.delete(id);
|
|
7
|
-
};
|
|
8
|
-
};
|
|
1
|
+
import type { FeatureId } from '$features/behavior-model/domain/value-objects/ids';
|
|
2
|
+
import type { FeatureRepository } from '../ports/FeatureRepository';
|
|
3
|
+
|
|
4
|
+
export const deleteFeatureUseCase = (deps: { repository: FeatureRepository }) => {
|
|
5
|
+
return async (id: FeatureId): Promise<void> => {
|
|
6
|
+
await deps.repository.delete(id);
|
|
7
|
+
};
|
|
8
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { Feature } from '$features/behavior-model/domain/entities/Feature';
|
|
2
|
-
import type { FeatureId } from '$features/behavior-model/domain/value-objects/ids';
|
|
3
|
-
import type { FeatureRepository } from '../ports/FeatureRepository';
|
|
4
|
-
|
|
5
|
-
export const getFeatureUseCase = (deps: { repository: FeatureRepository }) => {
|
|
6
|
-
return async (id: FeatureId): Promise<Feature | null> => {
|
|
7
|
-
return deps.repository.get(id);
|
|
8
|
-
};
|
|
9
|
-
};
|
|
1
|
+
import type { Feature } from '$features/behavior-model/domain/entities/Feature';
|
|
2
|
+
import type { FeatureId } from '$features/behavior-model/domain/value-objects/ids';
|
|
3
|
+
import type { FeatureRepository } from '../ports/FeatureRepository';
|
|
4
|
+
|
|
5
|
+
export const getFeatureUseCase = (deps: { repository: FeatureRepository }) => {
|
|
6
|
+
return async (id: FeatureId): Promise<Feature | null> => {
|
|
7
|
+
return deps.repository.get(id);
|
|
8
|
+
};
|
|
9
|
+
};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
FeatureRepository,
|
|
3
|
-
FeatureSummary
|
|
4
|
-
} from '../ports/FeatureRepository';
|
|
5
|
-
|
|
6
|
-
export const listFeaturesUseCase = (deps: { repository: FeatureRepository }) => {
|
|
7
|
-
return async (): Promise<readonly FeatureSummary[]> => {
|
|
8
|
-
return deps.repository.list();
|
|
9
|
-
};
|
|
10
|
-
};
|
|
1
|
+
import type {
|
|
2
|
+
FeatureRepository,
|
|
3
|
+
FeatureSummary
|
|
4
|
+
} from '../ports/FeatureRepository';
|
|
5
|
+
|
|
6
|
+
export const listFeaturesUseCase = (deps: { repository: FeatureRepository }) => {
|
|
7
|
+
return async (): Promise<readonly FeatureSummary[]> => {
|
|
8
|
+
return deps.repository.list();
|
|
9
|
+
};
|
|
10
|
+
};
|
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
import type { Clock } from '$shared/domain/Clock';
|
|
2
|
-
import type { Feature } from '$features/behavior-model/domain/entities/Feature';
|
|
3
|
-
import type { FeatureId } from '$features/behavior-model/domain/value-objects/ids';
|
|
4
|
-
import { normalizeFeatureEmittedEvents } from '$features/behavior-model/domain/services/FeatureEmittedEventsNormalizer';
|
|
5
|
-
import { normalizeFeatureExpressions } from '$features/behavior-model/domain/services/FeatureExpressionNormalizer';
|
|
6
|
-
import { normalizeFeatureSharedState } from '$features/behavior-model/domain/services/FeatureSharedStateNormalizer';
|
|
7
|
-
import { introducedValidationErrors } from '$features/behavior-model/domain/services/FeatureValidator';
|
|
8
|
-
import type { FeatureRepository } from '../ports/FeatureRepository';
|
|
9
|
-
|
|
10
|
-
/** The shared normalization pipeline applied before validation + save. */
|
|
11
|
-
const normalizeForSave = (feature: Feature): Feature =>
|
|
12
|
-
normalizeFeatureSharedState(
|
|
13
|
-
normalizeFeatureEmittedEvents(normalizeFeatureExpressions(feature))
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
export type FeatureTransform = (feature: Feature) => Feature;
|
|
17
|
-
|
|
18
|
-
export class FeatureValidationError extends Error {
|
|
19
|
-
constructor(
|
|
20
|
-
message: string,
|
|
21
|
-
public readonly errors: readonly string[]
|
|
22
|
-
) {
|
|
23
|
-
super(message);
|
|
24
|
-
this.name = 'FeatureValidationError';
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export class FeatureNotFoundError extends Error {
|
|
29
|
-
constructor(featureId: string) {
|
|
30
|
-
super(`Feature ${featureId} not found`);
|
|
31
|
-
this.name = 'FeatureNotFoundError';
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Generic mutate-then-save use case. Loads an feature by id, applies a
|
|
37
|
-
* pure transform, validates the result for structural integrity, then
|
|
38
|
-
* persists it. Used by every granular MCP write tool so they share one
|
|
39
|
-
* load/validate/save loop.
|
|
40
|
-
*
|
|
41
|
-
* Throws `FeatureNotFoundError` if no feature matches the id, or
|
|
42
|
-
* `FeatureValidationError` if the transformed feature fails
|
|
43
|
-
* structural validation. Either error must be surfaced to the caller; the
|
|
44
|
-
* snapshot is left untouched in both cases.
|
|
45
|
-
*/
|
|
46
|
-
export const mutateFeatureUseCase = (deps: {
|
|
47
|
-
repository: FeatureRepository;
|
|
48
|
-
clock: Clock;
|
|
49
|
-
}) => {
|
|
50
|
-
return async (input: {
|
|
51
|
-
featureId: FeatureId;
|
|
52
|
-
transform: FeatureTransform;
|
|
53
|
-
}): Promise<Feature> => {
|
|
54
|
-
const current = await deps.repository.get(input.featureId);
|
|
55
|
-
if (!current) throw new FeatureNotFoundError(input.featureId);
|
|
56
|
-
|
|
57
|
-
// Normalize Expression trees before validation so downstream consumers
|
|
58
|
-
// (validators, scorer, evaluator) can assume well-formed children. JSON
|
|
59
|
-
// authoring lets raw scalars land inside Expression bodies where the type
|
|
60
|
-
// demands an Expression node; this rewrites them as {kind:"literal",value}.
|
|
61
|
-
// Then mirror every emit_event effect into action.emittedEvents so the
|
|
62
|
-
// scorer's "event declarations" check passes without forcing an extra
|
|
63
|
-
// update_action op from the caller.
|
|
64
|
-
// Rule-category normalization runs ONLY at import (FeatureJson) and on
|
|
65
|
-
// save_feature, not on writes. That way `category: "permission"` from
|
|
66
|
-
// the LLM hits the strict validator and gets a "did you mean..." error
|
|
67
|
-
// instead of being silently remapped, fresh authoring learns the
|
|
68
|
-
// canonical vocabulary on the next call. Legacy snapshots still load.
|
|
69
|
-
const transformed = normalizeForSave(input.transform(current));
|
|
70
|
-
|
|
71
|
-
// Diff-aware gate (both structural AND reference-integrity): block the
|
|
72
|
-
// write only when it INTRODUCES a new error. Pre-existing problems on a
|
|
73
|
-
// partially-built feature — most commonly descriptions not yet filled in —
|
|
74
|
-
// stay editable, so you can set a description (or any field) without the
|
|
75
|
-
// whole feature already being valid. The baseline is normalized the same
|
|
76
|
-
// way as `transformed` so normalization artifacts on untouched elements
|
|
77
|
-
// don't read as introduced. See introducedValidationErrors for the why.
|
|
78
|
-
const introduced = introducedValidationErrors(normalizeForSave(current), transformed);
|
|
79
|
-
if (introduced.length > 0) {
|
|
80
|
-
throw new FeatureValidationError(
|
|
81
|
-
'The requested change would introduce new validation errors. (Pre-existing issues elsewhere in the feature are not blocking — fix them whenever; they show up in get_spec_gaps / score_feature.)',
|
|
82
|
-
introduced
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const next: Feature = { ...transformed, updatedAt: deps.clock() };
|
|
87
|
-
await deps.repository.save(next);
|
|
88
|
-
return next;
|
|
89
|
-
};
|
|
90
|
-
};
|
|
1
|
+
import type { Clock } from '$shared/domain/Clock';
|
|
2
|
+
import type { Feature } from '$features/behavior-model/domain/entities/Feature';
|
|
3
|
+
import type { FeatureId } from '$features/behavior-model/domain/value-objects/ids';
|
|
4
|
+
import { normalizeFeatureEmittedEvents } from '$features/behavior-model/domain/services/FeatureEmittedEventsNormalizer';
|
|
5
|
+
import { normalizeFeatureExpressions } from '$features/behavior-model/domain/services/FeatureExpressionNormalizer';
|
|
6
|
+
import { normalizeFeatureSharedState } from '$features/behavior-model/domain/services/FeatureSharedStateNormalizer';
|
|
7
|
+
import { introducedValidationErrors } from '$features/behavior-model/domain/services/FeatureValidator';
|
|
8
|
+
import type { FeatureRepository } from '../ports/FeatureRepository';
|
|
9
|
+
|
|
10
|
+
/** The shared normalization pipeline applied before validation + save. */
|
|
11
|
+
const normalizeForSave = (feature: Feature): Feature =>
|
|
12
|
+
normalizeFeatureSharedState(
|
|
13
|
+
normalizeFeatureEmittedEvents(normalizeFeatureExpressions(feature))
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export type FeatureTransform = (feature: Feature) => Feature;
|
|
17
|
+
|
|
18
|
+
export class FeatureValidationError extends Error {
|
|
19
|
+
constructor(
|
|
20
|
+
message: string,
|
|
21
|
+
public readonly errors: readonly string[]
|
|
22
|
+
) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.name = 'FeatureValidationError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export class FeatureNotFoundError extends Error {
|
|
29
|
+
constructor(featureId: string) {
|
|
30
|
+
super(`Feature ${featureId} not found`);
|
|
31
|
+
this.name = 'FeatureNotFoundError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Generic mutate-then-save use case. Loads an feature by id, applies a
|
|
37
|
+
* pure transform, validates the result for structural integrity, then
|
|
38
|
+
* persists it. Used by every granular MCP write tool so they share one
|
|
39
|
+
* load/validate/save loop.
|
|
40
|
+
*
|
|
41
|
+
* Throws `FeatureNotFoundError` if no feature matches the id, or
|
|
42
|
+
* `FeatureValidationError` if the transformed feature fails
|
|
43
|
+
* structural validation. Either error must be surfaced to the caller; the
|
|
44
|
+
* snapshot is left untouched in both cases.
|
|
45
|
+
*/
|
|
46
|
+
export const mutateFeatureUseCase = (deps: {
|
|
47
|
+
repository: FeatureRepository;
|
|
48
|
+
clock: Clock;
|
|
49
|
+
}) => {
|
|
50
|
+
return async (input: {
|
|
51
|
+
featureId: FeatureId;
|
|
52
|
+
transform: FeatureTransform;
|
|
53
|
+
}): Promise<Feature> => {
|
|
54
|
+
const current = await deps.repository.get(input.featureId);
|
|
55
|
+
if (!current) throw new FeatureNotFoundError(input.featureId);
|
|
56
|
+
|
|
57
|
+
// Normalize Expression trees before validation so downstream consumers
|
|
58
|
+
// (validators, scorer, evaluator) can assume well-formed children. JSON
|
|
59
|
+
// authoring lets raw scalars land inside Expression bodies where the type
|
|
60
|
+
// demands an Expression node; this rewrites them as {kind:"literal",value}.
|
|
61
|
+
// Then mirror every emit_event effect into action.emittedEvents so the
|
|
62
|
+
// scorer's "event declarations" check passes without forcing an extra
|
|
63
|
+
// update_action op from the caller.
|
|
64
|
+
// Rule-category normalization runs ONLY at import (FeatureJson) and on
|
|
65
|
+
// save_feature, not on writes. That way `category: "permission"` from
|
|
66
|
+
// the LLM hits the strict validator and gets a "did you mean..." error
|
|
67
|
+
// instead of being silently remapped, fresh authoring learns the
|
|
68
|
+
// canonical vocabulary on the next call. Legacy snapshots still load.
|
|
69
|
+
const transformed = normalizeForSave(input.transform(current));
|
|
70
|
+
|
|
71
|
+
// Diff-aware gate (both structural AND reference-integrity): block the
|
|
72
|
+
// write only when it INTRODUCES a new error. Pre-existing problems on a
|
|
73
|
+
// partially-built feature — most commonly descriptions not yet filled in —
|
|
74
|
+
// stay editable, so you can set a description (or any field) without the
|
|
75
|
+
// whole feature already being valid. The baseline is normalized the same
|
|
76
|
+
// way as `transformed` so normalization artifacts on untouched elements
|
|
77
|
+
// don't read as introduced. See introducedValidationErrors for the why.
|
|
78
|
+
const introduced = introducedValidationErrors(normalizeForSave(current), transformed);
|
|
79
|
+
if (introduced.length > 0) {
|
|
80
|
+
throw new FeatureValidationError(
|
|
81
|
+
'The requested change would introduce new validation errors. (Pre-existing issues elsewhere in the feature are not blocking — fix them whenever; they show up in get_spec_gaps / score_feature.)',
|
|
82
|
+
introduced
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const next: Feature = { ...transformed, updatedAt: deps.clock() };
|
|
87
|
+
await deps.repository.save(next);
|
|
88
|
+
return next;
|
|
89
|
+
};
|
|
90
|
+
};
|